Grammalecte  Check-in [6d63ab4c87]

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:[build][misc][fr] antipatterns for token rules, +syntax for SublimeText, +ajustements
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk | fr | build | new_feature | misc
Files: files | file ages | folders
SHA3-256:6d63ab4c8731d1b30ca23df347de2ad65c75e2ecfbb0bd904fdcc5a2f452d229
User & Date: olr 2019-07-19 16:47:11
Context
2019-07-22
06:55
[core] listRules() check-in: 00c946ab84 user: olr tags: core, trunk
2019-07-19
16:47
[build][misc][fr] antipatterns for token rules, +syntax for SublimeText, +ajustements check-in: 6d63ab4c87 user: olr tags: build, fr, misc, new_feature, trunk
13:47
[build] remove print() check-in: 284ea35ba0 user: olr tags: build, trunk
Changes

Changes to compile_rules_graph.py.

9
10
11
12
13
14
15

16
17
18
19
20
21
22
...
152
153
154
155
156
157
158





159







160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
import compile_rules_js_convert as jsconv


dACTIONS = {}
dFUNCTIONS = {}
dFUNCNAME = {}
dDECLENSIONS = {}



def createFunction (sType, sCode, bStartWithEqual=False):
    "create a function (stored in <dFUNCTIONS>) and return function name"
    sCode = prepareFunction(sCode)
    if sType not in dFUNCNAME:
        dFUNCNAME[sType] = {}
................................................................................
            lToken.append(sToken)
    return lToken


def createRule (iLine, sRuleName, sTokenLine, iActionBlock, sActions, nPriority, dOptPriority, dDef, dDecl):
    "generator: create rule as list"
    # print(iLine, "//", sRuleName, "//", sTokenLine, "//", sActions, "//", nPriority)





    for lToken in genTokenLines(sTokenLine, dDef, dDecl):







        # Calculate positions
        dPos = {}   # key: iGroup, value: iToken
        iGroup = 0
        #if iLine == 15818: # debug
        #    print(" ".join(lToken))
        for i, sToken in enumerate(lToken):
            if sToken.startswith("(") and sToken.endswith(")"):
                lToken[i] = sToken[1:-1]
                iGroup += 1
                dPos[iGroup] = i + 1    # we add 1, for we count tokens from 1 to n (not from 0)

        # Parse actions
        for iAction, sAction in enumerate(sActions.split(" <<- ")):
            sAction = sAction.strip()
            if sAction:
                sActionId = sRuleName + "__b" + str(iActionBlock) + "_a" + str(iAction)
                aAction = createAction(sActionId, sAction, nPriority, dOptPriority, len(lToken), dPos)
                if aAction:
                    sActionName = storeAction(sActionId, aAction)
                    lResult = list(lToken)
                    lResult.extend(["##"+str(iLine), sActionName])
                    #if iLine == 13341:
                    #    print("  ".join(lToken))
                    #    print(sActionId, aAction)
                    yield lResult
                else:
                    print(" # Error on action at line:", iLine)
                    print(sTokenLine, "\n", sActions)


def changeReferenceToken (sText, dPos):
    "change group reference in <sText> with values in <dPos>"
    if "\\" not in sText:
        return sText
    for i in range(len(dPos), 0, -1):







>







 







>
>
>
>
>
|
>
>
>
>
>
>
>
|
|
|
|
|
|
|
|
|
|

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|







9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
import compile_rules_js_convert as jsconv


dACTIONS = {}
dFUNCTIONS = {}
dFUNCNAME = {}
dDECLENSIONS = {}
dANTIPATTERNS = {}


def createFunction (sType, sCode, bStartWithEqual=False):
    "create a function (stored in <dFUNCTIONS>) and return function name"
    sCode = prepareFunction(sCode)
    if sType not in dFUNCNAME:
        dFUNCNAME[sType] = {}
................................................................................
            lToken.append(sToken)
    return lToken


def createRule (iLine, sRuleName, sTokenLine, iActionBlock, sActions, nPriority, dOptPriority, dDef, dDecl):
    "generator: create rule as list"
    # print(iLine, "//", sRuleName, "//", sTokenLine, "//", sActions, "//", nPriority)
    if sTokenLine.startswith("!!") and sTokenLine.endswith("¡¡"):
        # antipattern
        sTokenLine = sTokenLine[2:-2].strip()
        if sRuleName not in dANTIPATTERNS:
            dANTIPATTERNS[sRuleName]= []
        for lToken in genTokenLines(sTokenLine, dDef, dDecl):
            dANTIPATTERNS[sRuleName].append(lToken)
    else:
        # pattern
        for lToken in genTokenLines(sTokenLine, dDef, dDecl):
            if sRuleName in dANTIPATTERNS and lToken in dANTIPATTERNS[sRuleName]:
                # <lToken> matches an antipattern -> discard
                continue
            # Calculate positions
            dPos = {}   # key: iGroup, value: iToken
            iGroup = 0
            #if iLine == 15818: # debug
            #    print(" ".join(lToken))
            for i, sToken in enumerate(lToken):
                if sToken.startswith("(") and sToken.endswith(")"):
                    lToken[i] = sToken[1:-1]
                    iGroup += 1
                    dPos[iGroup] = i + 1    # we add 1, for we count tokens from 1 to n (not from 0)

            # Parse actions
            for iAction, sAction in enumerate(sActions.split(" <<- ")):
                sAction = sAction.strip()
                if sAction:
                    sActionId = sRuleName + "__b" + str(iActionBlock) + "_a" + str(iAction)
                    aAction = createAction(sActionId, sAction, nPriority, dOptPriority, len(lToken), dPos)
                    if aAction:
                        sActionName = storeAction(sActionId, aAction)
                        lResult = list(lToken)
                        lResult.extend(["##"+str(iLine), sActionName])
                        #if iLine == 13341:
                        #    print("  ".join(lToken))
                        #    print(sActionId, aAction)
                        yield lResult
                    else:
                        print(" # Error on action at line:", iLine)
                        print(sTokenLine, "\n", sActions)


def changeReferenceToken (sText, dPos):
    "change group reference in <sText> with values in <dPos>"
    if "\\" not in sText:
        return sText
    for i in range(len(dPos), 0, -1):

Changes to gc_lang/fr/rules.grx.

6103
6104
6105
6106
6107
6108
6109
6110
6111
6112
6113
6114

6115
6116
6117
6118
6119
6120
6121
....
6158
6159
6160
6161
6162
6163
6164
6165

6166
6167


6168

6169
6170
6171
6172

6173
6174
6175
6176
6177
6178
6179
6180
6181
6182
6183
6184
6185
6186
6187
6188
6189

6190
6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201
6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
....
6230
6231
6232
6233
6234
6235
6236

6237
6238
6239
6240
6241
6242
6243
6244
6245
6246
....
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742
6743
....
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
7045
7046
7047
7048
....
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
7090
7091
7092
7093
....
7198
7199
7200
7201
7202
7203
7204
7205
7206
7207
7208
7209
7210
7211
7212
7213
7214
7215
7216
7217
7218
7219
7220
7221
7222
7223
7224
7225
....
9484
9485
9486
9487
9488
9489
9490


9491
9492
9493
9494
9495
9496
9497
.....
12742
12743
12744
12745
12746
12747
12748

12749
12750
12751
12752
12753
12754
12755
.....
22212
22213
22214
22215
22216
22217
22218
22219
22220
22221
22222
22223
22224
22225
22226
22227
        <<- /conf/ not tag_before(\1, "ce_que") -1>> à              # Confusion probable : “a” est une forme conjugée de “avoir”. Pour la préposition, écrivez “à”.

TEST: travailler {{a}} bonne distance des fourneaux.
TEST: Il l’a fait {{a}} cause de toi.


__conf_à_cor_et_à_cri__
    a [corps|>cor] [et|est] [à|a] [>cri|crie|cries|crit]
    à [corps|cors] [et|est] [à|a] [>cri|crie|cries|crit]
    à cor est [à|a] [>cri|crie|cries|crit]
    à cor et a [>cri|crie|cries|crit]
    à cor et à [cris|crie|cries|crit]

        <<- /conf/ ->> à cor et à cri                   # Locution adverbiale invariable. (Le cor est un instrument à vent utilisé pour la chasse.)|https://fr.wiktionary.org/wiki/%C3%A0_cor_et_%C3%A0_cri

TEST: Elles hurlèrent {{à corps et à cris}}.
TEST: manifester sa colère à cor et à cri.


DEF: humain [administrateur|baron|chevalier|comte|contrôleur|dieu|duc|émir|époux|frère|grand-père|homme|maître|maitre|mari|ministre|monsieur|neveu|oncle|patron|père|président|prince|prophète|roi|sultan|tsar|vice-président]
................................................................................
TEST: nous avons l’{{intention}} de la reine
TEST: Ils ont l’intention de nous nuire
TEST: Elles avaient bien l’intention d’en parler.
TEST: J’ai mis ces trésors de côté spécialement à votre intention


__conf_à_moindre_cout__
    [a|à] >moindre [>cou|>coup]

        <<- /conf/ ->> à moindre coût                                       # Confusion. Pour évoquer des dépenses, écrivez “coût”.





__conf_à_moindres_frais__
    a >moindre [>frai|>frêt]
    à moindre [>frai|>frêt]
    à moindres [frai|>frêt]

        <<- /conf/ ->> à moindres frais                                     # Pour évoquer des dépenses, écrivez “frais” (pluriel).

TEST: {{a moindre frais}}
TEST: S’en sortir à moindres frais, pas si simple.


__conf_à_parts_égales__
    a [part|parts|par|pare|pares] >égale
    à [part|par|pare|pares] >égale
    à parts [égal|égals|égale]
        <<- /conf/ ->> à parts égales                                       # Locution “à parts égales” (toujours au pluriel).

TEST: {{à part égale}}
TEST: un partage à parts égales


__conf_à_peu_près__

    a [peu|peux|peut] [près|>pré|>prête]
    à [peux|peut] [près|>pré|>prête]
    à peu [>pré|>prête]
        <<- /conf/ ->> à peu près                                           # Confusion.|https://fr.wiktionary.org/wiki/%C3%A0_peu_pr%C3%A8s
        <<- ~>> *

TEST: C’est {{à peu prêt}} la même chose.
TEST: elle est {{a peut près}} au point.
TEST: C’est à peu près ça.


__conf_à_pleines_dents__
    a [>plaine|>pleine] [>dent|>dan]
    à [>plaine|pleine] [>dent|>dan]
    à pleines [dent|>dan]
        <<- /conf/ ->> à pleines dents                                      # Locution “à pleines dents” (toujours au pluriel).

TEST: Elle mord la vie {{à plaine dent}}.


__conf_à_tire_d_aile__
    à tire d’ >aile
        <<- /tu/ ->> à tire-d’aile                                          # Trait d’union manquant. Locution “à tire-d’aile”.|https://fr.wiktionary.org/wiki/%C3%A0_tire-d%E2%80%99aile

    [a|à] >tir  d’ [>aile|elle|elles|ail]
    a     >tire d’ [>aile|elle|elles|ail]
    [a|à] [tir-d’aile|tirs-d’aile|tir-d’ailes|tirs-d’ailes]
        <<- /conf/ ->> à tire-d’aile                                        # Confusion. Locution “à tire-d’aile”.|https://fr.wiktionary.org/wiki/%C3%A0_tire-d%E2%80%99aile

TEST: venir {{à tir d’ail}} jusqu’ici
TEST: Elle arrivait à tire-d’aile.


................................................................................

TEST: il gueulait {{à tir larigot}}
TEST: Au nom du progrès, les Victoriens en mal de modernisation rasèrent à tire-larigot les églises et les bâtiments jugés trop anciens.



__conf_à_vau_l_eau__

    [a|à] [volo|vo-lo]
    [à|a] [>veau|>vau|vo|vos] l’ [o|os|au|aux|>eau]
    a [vau-l’eau|vaux-l’eau]
        <<- /conf/ ->> à vau-l’eau                          # Confusion. Locution “à vau-l’eau”, qui signifie “au fil de l’eau, sans contrôle”.|https://fr.wiktionary.org/wiki/%C3%A0_vau-l%E2%80%99eau

TEST: tout part {{à veau l’eau}}
TEST: On décida de tout laisser partir {{à vau l’o}}
TEST: une dérive à vau-l’eau.


................................................................................
        <<- /conf/ -2>> au temps                        # Pour reconnaître son erreur, « au temps pour moi » est l’expression recommandée par l’Académie française.

TEST: Je me suis trompé. {{Autant}} pour moi.
TEST: Je me suis trompé. {{Au tan}} pour moi.


__conf_autant_que_faire_se_peut!7__
    [au|aux] [temps|tant|>tan] [que|qu’] [faire|ferre|>fer] [se|ce] [peu|peut|peux]
    >autan [que|qu’] [faire|ferre|>fer] [se|ce] [peu|peut|peux]
    autant [que|qu’] [ferre|>fer] [se|ce] [peu|peut|peux]
    autant [que|qu’] [faire|ferre|>fer] ce [peu|peut|peux]
    autant [que|qu’] [faire|ferre|>fer] [se|ce] [peu|peux]
        <<- /conf/ ->> autant que faire se peut         # Locution adverbiale : « autant que faire se peut ».|https://fr.wiktionary.org/wiki/autant_que_faire_se_peut

TEST: on va y arriver, {{au temps que faire se peu}}…
TEST: autant que faire se peut, il faut éviter la confusion entre ces deux discours.


# ça / çà / sa
................................................................................
TEST: Elle a l’impression d’être laissée pour {{comte}}.
TEST: C’est un règlement de {{comte}} entre voyous.
TEST: on va lui régler son {{conte}}, à cet enculé.
TEST: tout {{conte}} fait, ça reste un salopard.


__conf_conte_de_fée__
    [comte|comtes|>compte] de bonnes femmes
    [comte|comtes|>compte] de >fée
    [comte|comtes|>compte] [>allégorique|>fantastique|>littéraire|merveilleux|moral|moraux|oral|oraux|>populaire|>satirique|>traditionnelle]
    [comte|comtes|>compte] et >légende
        <<- /conf/ -1>> conte|contes                                                # Confusion probable. Si vous parlez d’un récit, écrivez :|https://fr.wiktionary.org/wiki/conte

TEST: Encore un {{comte}} de fée, assez de ces fadaises !
TEST: c’est un {{compte}} allégorique.
TEST: {{Comptes}} et légendes des Terres du Milieu.
TEST: ce sont des {{comptes}} de bonnes femmes
TEST: Elle parla au comte d’amour, mais il fit mine de n’y rien entendre.
................................................................................
TEST: L’hostie n’est pas le {{cor}} du Christ.
TEST: elle détestait son nouveau garde du {{cor}}
TEST: Elle souffla puissamment dans le {{corps}} de chasse.


# cour / cours / court
__conf_cour_cours_court_courre__
    au [cour|court|courre|courres|courts] [de|d’|des|du]
        <<- /conf/ -2>> cours                               # Confusion. Locution “au cours de”. Une cour… Un cours… Adjectif : court(e).

    en cour martiale
    en cour [de|d’] [cassation|justice]
    en cour d’ [>assise]
        <<- !1:2>>

................................................................................
TEST: tout ce qu’il apporte d’avantages pécuniaires.
TEST: un certain nombre d’avantages sociaux.
TEST: ils ont tant d’avantages.


# de part en part
__conf_de_part_en_part__
    [de|d’] [par|parts|pare|pares|part] [en|an] [par|parts|pare|pares]
    [de|d’] [par|parts|pare|pares] [en|an] [par|parts|pare|pares|part]
    [de|d’] part an part
        <<- /conf/ ->> de part en part                                              # Confusion. Locution “de part en part”.|https://fr.wiktionary.org/wiki/de_part_en_part

TEST: {{de par en par}}                                             ->> de part en part
TEST: ils essayèrent tout, de part en part.


# de temps à autre
__conf_de_temps_à_autre__
    [de|d’] [>tan|tant] [à|a] >autre
    [de|d’] [>tan|tant|temps] a >autre
    [de|d’] [>tan|tant|temps] [à|a] autres
        <<- /conf/ ->> de temps à autre                                             # Confusion. Locution “de temps à autre”.|https://fr.wiktionary.org/wiki/de_temps_%C3%A0_autre

TEST: Il continuait son travail, mâchonnant de temps à autre une grosse chique qui tour à tour lui gonflait chaque joue.
TEST: Il venait {{de temps à autres}}.
TEST: {{de tan à autre}}, c’était correct de venir par ici.


................................................................................
        # Pas de majuscule sur les mois.|http://www.academie-francaise.fr/la-langue-francaise/questions-de-langue#42_strong-em-jours-de-la-semaine-pluriel-et-majuscules-em-strong

TEST: 15 {{Septembre}}                                                  ->> septembre
TEST: 23 {{Messidor}}                                                   ->> messidor
TEST: ils viendront en {{Mars}}.                                        ->> mars
TEST: le comité d’éthique qui statuera dans les meilleurs délais sur la situation de Véronique Avril
TEST: VENDREDI 23 NOVEMBRE 2018 À 18:09




# Assemblée
__maj_Assemblée_nationale__
    assemblée nationale
        <<- \1 == "assemblée" -1>> Assemblée                        # Majuscule manquante.

................................................................................
    >compter à rebours
    >condamner à mort
    >couler à ?grands¿ flots
    >demander [assistance|audience|conseil|pardon]
    [>donner|>redonner] [naissance|sens|suite|vie]
    [>donner|>redonner] quartier libre
    >élire domicile

    >faire [allusion|assaut|attention|chaud|confiance|connaissance|compliqué|copain-copain|date|débat|défaut|demi-tour|écran|envie|erreur|état|exception|figure|froid|front|grève|halte|honte|illusion|mouche|office|part|peur|polémique|plaisir|preuve|rage|scandale|sens|signe|usage|volte-face]
    >faire amende honorable
    >faire bande à part
    >faire bon accueil
    >faire bonne figure
    >faire chou blanc
    >faire copain copain
................................................................................
TODO: Ils sont âgés de 4 et 1 ans.
TODO: Mille neuf cent quatre-vingt. (dépend du contexte)
TODO: La Mustang est une voiture.
TODO: Il faut se bien connaître soi-même.
TODO: C’est lui ou moi qui a gagné.
TODO: Des copains plus vieux que moi qui fumaient.
TODO: Des copains plus vieux que toi qui fumaient.
TODO: André Juin était un sculpteur français.
TODO: La bataille de Monte Cassino révèle le génie militaire du général Juin.
TODO: Les côtes sont dans leur ensemble extrêmement découpées.

!!! Indécidable                                                                                   !!
TEST: Du sable fin grippe les rouages (accord avec ce qui précède).
TEST: Du monde noir sortent les envahisseurs (accord avec ce qui suit).

!!! Autres tests                                                                                  !!







<
<
<
<
|
>







 







|
>


>
>

>

<
<
|
>







|
|
<







>
|
<
<









|
|
<









|
|







 







>


|







 







|
|
|
<
<







 







|
|
|
|







 







|







 







|
|
<








|
<
|







 







>
>







 







>







 







<
<







6103
6104
6105
6106
6107
6108
6109




6110
6111
6112
6113
6114
6115
6116
6117
6118
....
6155
6156
6157
6158
6159
6160
6161
6162
6163
6164
6165
6166
6167
6168
6169
6170


6171
6172
6173
6174
6175
6176
6177
6178
6179
6180
6181

6182
6183
6184
6185
6186
6187
6188
6189
6190


6191
6192
6193
6194
6195
6196
6197
6198
6199
6200
6201

6202
6203
6204
6205
6206
6207
6208
6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
....
6227
6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238
6239
6240
6241
6242
6243
6244
....
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732


6733
6734
6735
6736
6737
6738
6739
....
7027
7028
7029
7030
7031
7032
7033
7034
7035
7036
7037
7038
7039
7040
7041
7042
7043
7044
....
7075
7076
7077
7078
7079
7080
7081
7082
7083
7084
7085
7086
7087
7088
7089
....
7194
7195
7196
7197
7198
7199
7200
7201
7202

7203
7204
7205
7206
7207
7208
7209
7210
7211

7212
7213
7214
7215
7216
7217
7218
7219
....
9478
9479
9480
9481
9482
9483
9484
9485
9486
9487
9488
9489
9490
9491
9492
9493
.....
12738
12739
12740
12741
12742
12743
12744
12745
12746
12747
12748
12749
12750
12751
12752
.....
22209
22210
22211
22212
22213
22214
22215


22216
22217
22218
22219
22220
22221
22222
        <<- /conf/ not tag_before(\1, "ce_que") -1>> à              # Confusion probable : “a” est une forme conjugée de “avoir”. Pour la préposition, écrivez “à”.

TEST: travailler {{a}} bonne distance des fourneaux.
TEST: Il l’a fait {{a}} cause de toi.


__conf_à_cor_et_à_cri__




    !! à cor et à cri ¡¡
    [a|à] [corps|cor+s] [et|est|es|ait|ais|aies|é|è|ei|ai|aient] [à|a] [cri+s|crie+s|crit]
        <<- /conf/ ->> à cor et à cri                   # Locution adverbiale invariable. (Le cor est un instrument à vent utilisé pour la chasse.)|https://fr.wiktionary.org/wiki/%C3%A0_cor_et_%C3%A0_cri

TEST: Elles hurlèrent {{à corps et à cris}}.
TEST: manifester sa colère à cor et à cri.


DEF: humain [administrateur|baron|chevalier|comte|contrôleur|dieu|duc|émir|époux|frère|grand-père|homme|maître|maitre|mari|ministre|monsieur|neveu|oncle|patron|père|président|prince|prophète|roi|sultan|tsar|vice-président]
................................................................................
TEST: nous avons l’{{intention}} de la reine
TEST: Ils ont l’intention de nous nuire
TEST: Elles avaient bien l’intention d’en parler.
TEST: J’ai mis ces trésors de côté spécialement à votre intention


__conf_à_moindre_cout__
    !! à moindre [cout|coût] ¡¡
    [a|à] [moindre+s] [>cou|>coup|cout+s|coût+s]
        <<- /conf/ ->> à moindre coût                                       # Confusion. Pour évoquer des dépenses, écrivez “coût”.

TEST: {{à moindres coups}}
TEST: tout acheter à moindre coût


__conf_à_moindres_frais__


    !! à moindres frais ¡¡
    [a|à] [moindre+s] [frai+s|>frêt]
        <<- /conf/ ->> à moindres frais                                     # Pour évoquer des dépenses, écrivez “frais” (pluriel).

TEST: {{a moindre frais}}
TEST: S’en sortir à moindres frais, pas si simple.


__conf_à_parts_égales__
    !! à parts égales ¡¡
    [a|à] [part|parts|par|pare|pares] [égale+s]

        <<- /conf/ ->> à parts égales                                       # Locution “à parts égales” (toujours au pluriel).

TEST: {{à part égale}}
TEST: un partage à parts égales


__conf_à_peu_près__
    !! à peu près ¡¡
    [a|à] [peu|peux|peut] [près|>pré|>prête]


        <<- /conf/ ->> à peu près                                           # Confusion.|https://fr.wiktionary.org/wiki/%C3%A0_peu_pr%C3%A8s
        <<- ~>> *

TEST: C’est {{à peu prêt}} la même chose.
TEST: elle est {{a peut près}} au point.
TEST: C’est à peu près ça.


__conf_à_pleines_dents__
    !! à pleines dents ¡¡
    [a|à] [>plaine|pleine+s] [dent+s|>dan]

        <<- /conf/ ->> à pleines dents                                      # Locution “à pleines dents” (toujours au pluriel).

TEST: Elle mord la vie {{à plaine dent}}.


__conf_à_tire_d_aile__
    à tire d’ >aile
        <<- /tu/ ->> à tire-d’aile                                          # Trait d’union manquant. Locution “à tire-d’aile”.|https://fr.wiktionary.org/wiki/%C3%A0_tire-d%E2%80%99aile

    !! à tire-d’aile ¡¡
    [a|à] [>tir|>tire]  d’ [>aile|elle|elles|ail]
    [a|à] [tir-d’aile|tirs-d’aile|tir-d’ailes|tirs-d’ailes]
        <<- /conf/ ->> à tire-d’aile                                        # Confusion. Locution “à tire-d’aile”.|https://fr.wiktionary.org/wiki/%C3%A0_tire-d%E2%80%99aile

TEST: venir {{à tir d’ail}} jusqu’ici
TEST: Elle arrivait à tire-d’aile.


................................................................................

TEST: il gueulait {{à tir larigot}}
TEST: Au nom du progrès, les Victoriens en mal de modernisation rasèrent à tire-larigot les églises et les bâtiments jugés trop anciens.



__conf_à_vau_l_eau__
    !! à vau-l’eau ¡¡
    [a|à] [volo|vo-lo]
    [à|a] [>veau|>vau|vo|vos] l’ [o|os|au|aux|>eau]
    [a|à] [vau-l’eau|vaux-l’eau]
        <<- /conf/ ->> à vau-l’eau                          # Confusion. Locution “à vau-l’eau”, qui signifie “au fil de l’eau, sans contrôle”.|https://fr.wiktionary.org/wiki/%C3%A0_vau-l%E2%80%99eau

TEST: tout part {{à veau l’eau}}
TEST: On décida de tout laisser partir {{à vau l’o}}
TEST: une dérive à vau-l’eau.


................................................................................
        <<- /conf/ -2>> au temps                        # Pour reconnaître son erreur, « au temps pour moi » est l’expression recommandée par l’Académie française.

TEST: Je me suis trompé. {{Autant}} pour moi.
TEST: Je me suis trompé. {{Au tan}} pour moi.


__conf_autant_que_faire_se_peut!7__
    !! autant que faire se peut ¡¡
    [au|aux] [temps|tant|>tan]  [que|qu’] [faire|ferre|ferres|>fer] [se|ce] [peu|peut|peux]
    [>autan|autant]             [que|qu’] [faire|ferre|ferres|>fer] [se|ce] [peu|peut|peux]


        <<- /conf/ ->> autant que faire se peut         # Locution adverbiale : « autant que faire se peut ».|https://fr.wiktionary.org/wiki/autant_que_faire_se_peut

TEST: on va y arriver, {{au temps que faire se peu}}…
TEST: autant que faire se peut, il faut éviter la confusion entre ces deux discours.


# ça / çà / sa
................................................................................
TEST: Elle a l’impression d’être laissée pour {{comte}}.
TEST: C’est un règlement de {{comte}} entre voyous.
TEST: on va lui régler son {{conte}}, à cet enculé.
TEST: tout {{conte}} fait, ça reste un salopard.


__conf_conte_de_fée__
    [comte+s|>compte] de bonne+s >femme
    [comte+s|>compte] de >fée
    [comte+s|>compte] [>allégorique|>fantastique|>littéraire|merveilleux|moral|moraux|oral|oraux|>populaire|>satirique|>traditionnelle]
    [comte+s|>compte] et >légende
        <<- /conf/ -1>> conte|contes                                                # Confusion probable. Si vous parlez d’un récit, écrivez :|https://fr.wiktionary.org/wiki/conte

TEST: Encore un {{comte}} de fée, assez de ces fadaises !
TEST: c’est un {{compte}} allégorique.
TEST: {{Comptes}} et légendes des Terres du Milieu.
TEST: ce sont des {{comptes}} de bonnes femmes
TEST: Elle parla au comte d’amour, mais il fit mine de n’y rien entendre.
................................................................................
TEST: L’hostie n’est pas le {{cor}} du Christ.
TEST: elle détestait son nouveau garde du {{cor}}
TEST: Elle souffla puissamment dans le {{corps}} de chasse.


# cour / cours / court
__conf_cour_cours_court_courre__
    au [cour|court+s|courre+s] [de|d’|des|du]
        <<- /conf/ -2>> cours                               # Confusion. Locution “au cours de”. Une cour… Un cours… Adjectif : court(e).

    en cour martiale
    en cour [de|d’] [cassation|justice]
    en cour d’ [>assise]
        <<- !1:2>>

................................................................................
TEST: tout ce qu’il apporte d’avantages pécuniaires.
TEST: un certain nombre d’avantages sociaux.
TEST: ils ont tant d’avantages.


# de part en part
__conf_de_part_en_part__
    !! de part en part ¡¡
    [de|d’] [par|part|parts|pare|pares] [en|an] [par|part|parts|pare|pares]

        <<- /conf/ ->> de part en part                                              # Confusion. Locution “de part en part”.|https://fr.wiktionary.org/wiki/de_part_en_part

TEST: {{de par en par}}                                             ->> de part en part
TEST: ils essayèrent tout, de part en part.


# de temps à autre
__conf_de_temps_à_autre__
    !! [de|d’] temps à autre ¡¡

    [de|d’] [>tan|tant|temps] [à|a] [autre+s]
        <<- /conf/ ->> de temps à autre                                             # Confusion. Locution “de temps à autre”.|https://fr.wiktionary.org/wiki/de_temps_%C3%A0_autre

TEST: Il continuait son travail, mâchonnant de temps à autre une grosse chique qui tour à tour lui gonflait chaque joue.
TEST: Il venait {{de temps à autres}}.
TEST: {{de tan à autre}}, c’était correct de venir par ici.


................................................................................
        # Pas de majuscule sur les mois.|http://www.academie-francaise.fr/la-langue-francaise/questions-de-langue#42_strong-em-jours-de-la-semaine-pluriel-et-majuscules-em-strong

TEST: 15 {{Septembre}}                                                  ->> septembre
TEST: 23 {{Messidor}}                                                   ->> messidor
TEST: ils viendront en {{Mars}}.                                        ->> mars
TEST: le comité d’éthique qui statuera dans les meilleurs délais sur la situation de Véronique Avril
TEST: VENDREDI 23 NOVEMBRE 2018 À 18:09
TEST: André Juin était un sculpteur français.
TODO: La bataille de Monte Cassino révèle le génie militaire du général Juin.


# Assemblée
__maj_Assemblée_nationale__
    assemblée nationale
        <<- \1 == "assemblée" -1>> Assemblée                        # Majuscule manquante.

................................................................................
    >compter à rebours
    >condamner à mort
    >couler à ?grands¿ flots
    >demander [assistance|audience|conseil|pardon]
    [>donner|>redonner] [naissance|sens|suite|vie]
    [>donner|>redonner] quartier libre
    >élire domicile
    >étouffer dans l’ œuf
    >faire [allusion|assaut|attention|chaud|confiance|connaissance|compliqué|copain-copain|date|débat|défaut|demi-tour|écran|envie|erreur|état|exception|figure|froid|front|grève|halte|honte|illusion|mouche|office|part|peur|polémique|plaisir|preuve|rage|scandale|sens|signe|usage|volte-face]
    >faire amende honorable
    >faire bande à part
    >faire bon accueil
    >faire bonne figure
    >faire chou blanc
    >faire copain copain
................................................................................
TODO: Ils sont âgés de 4 et 1 ans.
TODO: Mille neuf cent quatre-vingt. (dépend du contexte)
TODO: La Mustang est une voiture.
TODO: Il faut se bien connaître soi-même.
TODO: C’est lui ou moi qui a gagné.
TODO: Des copains plus vieux que moi qui fumaient.
TODO: Des copains plus vieux que toi qui fumaient.


TODO: Les côtes sont dans leur ensemble extrêmement découpées.

!!! Indécidable                                                                                   !!
TEST: Du sable fin grippe les rouages (accord avec ce qui précède).
TEST: Du monde noir sortent les envahisseurs (accord avec ce qui suit).

!!! Autres tests                                                                                  !!

Changes to misc/grammalecte.sublime-color-scheme.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
..
25
26
27
28
29
30
31
32

33
34
35
36
37
38
39
..
51
52
53
54
55
56
57


58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
{
    "name": "Grammalecte Color Scheme",
    "globals":
    {
        "background":               "hsl(210, 20%, 14%)",
        "foreground":               "hsl(210, 20%, 95%)",

        "caret":                    "hsl(210, 20%, 80%)",
        "block_caret":              "red",
        "line_highlight":           "hsl(210, 60%, 30%)",
        "bracket_options":          "underline bold",

        "selection":                "hsl(210, 50%, 20%)",
        "selection_border":         "hsl(210, 80%, 40%)",
        "selection_border_width":   "1",
        "selection_corner_style":   "cut",
        "selection_corner_radius":  "4",
................................................................................
        {   "name": "Options command",      "scope": "options.command",     "foreground": "#50F0A0",                                                        "font_style": "bold",     },
        {   "name": "Options parameter",    "scope": "options.parameter",   "foreground": "#70B0F0",                                                        "font_style": "bold",     },

        {   "name": "Comment",              "scope": "comment",             "foreground": "hsl(210, 10%, 50%)"  },
        {   "name": "Bookmark",             "scope": "bookmark",            "foreground": "#A0F0FF",                "background": "#0050A0", },
        {   "name": "Graphline",            "scope": "graphline",           "foreground": "hsl(0, 100%, 80%)",      "background": "hsl(0, 100%, 20%)",      "font_style": "bold", },
        {   "name": "Error message",        "scope": "string.message",      "foreground": "hsl(0, 50%, 65%)",  },
        {   "name": "Error message",        "scope": "string.escape",       "foreground": "hsl(0, 50%, 85%)",  },

        {   "name": "Test header",          "scope": "test.header",         "foreground": "hsl(150, 100%, 60%)",                                            "font_style": "bold" },
        {   "name": "Test option",          "scope": "test.error",          "foreground": "hsl(0, 90%, 67%)",  },
        {   "name": "Todo",                 "scope": "todo",                "foreground": "hsl(20, 90%, 60%)",                                              "font_style": "bold", },

        {   "name": "Entity brackets",      "scope": "entity.brackets",     "foreground": "#90A0A0",                "background": "#203030",  },
        {   "name": "Entity parenthesis",   "scope": "entity.parenthesis",  "foreground": "#A0A0C0",                "background": "#303035",  },

................................................................................
        {   "name": "Rule options",         "scope": "rule.options",        "foreground": "#F0A020",                                                        "font_style": "bold",  },
        {   "name": "Rule casing",          "scope": "rule.casing",         "foreground": "#30C0F0",                                                        "font_style": "bold",  },
        {   "name": "Rule action option",   "scope": "rule.actionoption",   "foreground": "hsl(0, 50%, 50%)",       "background": "hsl(330, 50%, 20%)",     "font_style": "bold",   },
        {   "name": "Rule option name",     "scope": "rule.optionname",     "foreground": "hsl(330, 80%, 80%)",     "background": "hsl(330, 60%, 20%)",     "font_style": "bold",   },
        {   "name": "Rule name (regex)",    "scope": "rule.rulename_regex", "foreground": "#A0A0A0",                                                        "font_style": "italic",  },
        {   "name": "Rule name (graph)",    "scope": "rule.rulename_graph", "foreground": "#F0D080",  },
        {   "name": "Rule priority",        "scope": "rule.priority",       "foreground": "#F06060",  },



        {   "name": "Entity Valid",         "scope": "entity.valid",        "foreground": "hsl(150, 100%, 80%)",    "background": "hsl(150, 100%, 20%)",    "font_style": "bold",   },
        {   "name": "Entity Invalid",       "scope": "entity.invalid",      "foreground": "hsl(0, 100%, 80%)",      "background": "hsl(0, 100%, 20%)",      "font_style": "bold",   },
        {   "name": "String meta",          "scope": "string.meta",         "foreground": "hsl(270, 100%, 90%)",    "background": "hsl(270, 100%, 40%)",  },
        {   "name": "String token",         "scope": "string.token",        "foreground": "hsl(240, 50%, 90%)",     "background": "hsl(240, 50%, 40%)",  },
        {   "name": "String Jumptoken",     "scope": "string.jumptoken",    "foreground": "hsl(0, 50%, 90%)",       "background": "hsl(10, 50%, 40%)",  },
        {   "name": "String lemma",         "scope": "string.lemma",        "foreground": "hsl(210, 100%, 80%)",    "background": "hsl(210, 100%, 15%)",  },
        {   "name": "String tag",           "scope": "string.tag",          "foreground": "hsl(30, 100%, 90%)",     "background": "hsl(30, 100%, 20%)",  },
        {   "name": "String regex",         "scope": "string.regex",        "foreground": "hsl(60, 100%, 80%)",     "background": "hsl(60, 100%, 10%)",  },
        {   "name": "String morph regex",   "scope": "string.morph.regex",  "foreground": "hsl(150, 80%, 90%)",     "background": "hsl(150, 80%, 10%)",  },
        {   "name": "String morph negregex","scope": "string.morph.negregex","foreground": "hsl(0, 80%, 90%)",      "background": "hsl(0, 80%, 10%)",  },


        {   "name": "Keyword Python",       "scope": "keyword.python",      "foreground": "#A0A0A0",  },

        {   "name": "Keyword",              "scope": "keyword - (source.c keyword.operator | source.c++ keyword.operator | source.objc keyword.operator | source.objc++ keyword.operator), keyword.operator.word",  "foreground": "#F06070", },
        {   "name": "String",               "scope": "string",              "foreground": "hsl(60, 80%, 75%)",  },
        {   "name": "Number",               "scope": "constant.numeric",    "foreground": "hsl(270, 100%, 70%)",                                            "font_style": "bold",  },


        {   "name": "Built-in constant",            "scope": "constant.language",                   "foreground": "#AE81FF",                                    "font_style": "italic",  },
        {   "name": "User-defined constant",        "scope": "constant.character, constant.other",  "foreground": "#AE81FF",  },

        {   "name": "Storage",                      "scope": "storage",                             "foreground": "#F92672",                                    "font_style": "bold",  },




|




|







 







|
>







 







>
>



|
|
|
|
|
|
|
|





|







1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
..
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
..
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
{
    "name": "Grammalecte Color Scheme",
    "globals":
    {
        "background":               "hsl(210, 20%, 15%)",
        "foreground":               "hsl(210, 20%, 95%)",

        "caret":                    "hsl(210, 20%, 80%)",
        "block_caret":              "red",
        "line_highlight":           "hsl(210, 60%, 25%)",
        "bracket_options":          "underline bold",

        "selection":                "hsl(210, 50%, 20%)",
        "selection_border":         "hsl(210, 80%, 40%)",
        "selection_border_width":   "1",
        "selection_corner_style":   "cut",
        "selection_corner_radius":  "4",
................................................................................
        {   "name": "Options command",      "scope": "options.command",     "foreground": "#50F0A0",                                                        "font_style": "bold",     },
        {   "name": "Options parameter",    "scope": "options.parameter",   "foreground": "#70B0F0",                                                        "font_style": "bold",     },

        {   "name": "Comment",              "scope": "comment",             "foreground": "hsl(210, 10%, 50%)"  },
        {   "name": "Bookmark",             "scope": "bookmark",            "foreground": "#A0F0FF",                "background": "#0050A0", },
        {   "name": "Graphline",            "scope": "graphline",           "foreground": "hsl(0, 100%, 80%)",      "background": "hsl(0, 100%, 20%)",      "font_style": "bold", },
        {   "name": "Error message",        "scope": "string.message",      "foreground": "hsl(0, 50%, 65%)",  },
        {   "name": "Error message esc",    "scope": "string.message.esc",  "foreground": "hsl(30, 100%, 65%)",     "background": "hsl(60, 100%, 12%)",     "font_style": "bold" },
        {   "name": "Error message URL",    "scope": "string.message.url",  "foreground": "hsl(180, 100%, 35%)",    "background": "hsl(180, 100%, 12%)",     },
        {   "name": "Test header",          "scope": "test.header",         "foreground": "hsl(150, 100%, 60%)",                                            "font_style": "bold" },
        {   "name": "Test option",          "scope": "test.error",          "foreground": "hsl(0, 90%, 67%)",  },
        {   "name": "Todo",                 "scope": "todo",                "foreground": "hsl(20, 90%, 60%)",                                              "font_style": "bold", },

        {   "name": "Entity brackets",      "scope": "entity.brackets",     "foreground": "#90A0A0",                "background": "#203030",  },
        {   "name": "Entity parenthesis",   "scope": "entity.parenthesis",  "foreground": "#A0A0C0",                "background": "#303035",  },

................................................................................
        {   "name": "Rule options",         "scope": "rule.options",        "foreground": "#F0A020",                                                        "font_style": "bold",  },
        {   "name": "Rule casing",          "scope": "rule.casing",         "foreground": "#30C0F0",                                                        "font_style": "bold",  },
        {   "name": "Rule action option",   "scope": "rule.actionoption",   "foreground": "hsl(0, 50%, 50%)",       "background": "hsl(330, 50%, 20%)",     "font_style": "bold",   },
        {   "name": "Rule option name",     "scope": "rule.optionname",     "foreground": "hsl(330, 80%, 80%)",     "background": "hsl(330, 60%, 20%)",     "font_style": "bold",   },
        {   "name": "Rule name (regex)",    "scope": "rule.rulename_regex", "foreground": "#A0A0A0",                                                        "font_style": "italic",  },
        {   "name": "Rule name (graph)",    "scope": "rule.rulename_graph", "foreground": "#F0D080",  },
        {   "name": "Rule priority",        "scope": "rule.priority",       "foreground": "#F06060",  },
        {   "name": "Rule antipattern",     "scope": "rule.antipattern",    "foreground": "hsl(0, 80%, 60%)",       "background": "hsl(0, 50%, 20%)" },
        {   "name": "Rule antipattern token", "scope": "rule.antipattern.token", "foreground": "hsl(0, 60%, 90%)", },

        {   "name": "Entity Valid",         "scope": "entity.valid",        "foreground": "hsl(150, 100%, 80%)",    "background": "hsl(150, 100%, 20%)",    "font_style": "bold",   },
        {   "name": "Entity Invalid",       "scope": "entity.invalid",      "foreground": "hsl(0, 100%, 80%)",      "background": "hsl(0, 100%, 20%)",      "font_style": "bold",   },
        {   "name": "Token meta",           "scope": "string.meta",         "foreground": "hsl(270, 100%, 90%)",    "background": "hsl(270, 100%, 40%)",  },
        {   "name": "Token token",          "scope": "string.token",        "foreground": "hsl(240, 50%, 90%)",     "background": "hsl(240, 50%, 40%)",  },
        {   "name": "Token Jumptoken",      "scope": "string.jumptoken",    "foreground": "hsl(0, 50%, 90%)",       "background": "hsl(10, 50%, 40%)",  },
        {   "name": "Token lemma",          "scope": "string.lemma",        "foreground": "hsl(210, 100%, 80%)",    "background": "hsl(210, 100%, 15%)",  },
        {   "name": "Token tag",            "scope": "string.tag",          "foreground": "hsl(30, 100%, 90%)",     "background": "hsl(30, 100%, 20%)",  },
        {   "name": "Token regex",          "scope": "string.regex",        "foreground": "hsl(60, 100%, 80%)",     "background": "hsl(60, 100%, 10%)",  },
        {   "name": "Token morph regex",    "scope": "string.morph.regex",  "foreground": "hsl(150, 80%, 90%)",     "background": "hsl(150, 80%, 10%)",  },
        {   "name": "Token morph negregex", "scope": "string.morph.negregex","foreground": "hsl(0, 80%, 90%)",      "background": "hsl(0, 80%, 10%)",  },


        {   "name": "Keyword Python",       "scope": "keyword.python",      "foreground": "#A0A0A0",  },

        {   "name": "Keyword",              "scope": "keyword - (source.c keyword.operator | source.c++ keyword.operator | source.objc keyword.operator | source.objc++ keyword.operator), keyword.operator.word",  "foreground": "#F06070", },
        {   "name": "String",               "scope": "string",              "foreground": "hsl(40, 100%, 80%)",  },
        {   "name": "Number",               "scope": "constant.numeric",    "foreground": "hsl(270, 100%, 70%)",                                            "font_style": "bold",  },


        {   "name": "Built-in constant",            "scope": "constant.language",                   "foreground": "#AE81FF",                                    "font_style": "italic",  },
        {   "name": "User-defined constant",        "scope": "constant.character, constant.other",  "foreground": "#AE81FF",  },

        {   "name": "Storage",                      "scope": "storage",                             "foreground": "#F92672",                                    "font_style": "bold",  },

Changes to misc/grammalecte.sublime-syntax.

14
15
16
17
18
19
20
21
22
23

24
25
26
27
28
29
30
31
32
33
34
..
85
86
87
88
89
90
91





92
93
94
95
96
97
98
      #push: double_quoted_string

    # Comments begin with a '#' and finish at the end of the line
    - match: '^#.*'
      scope: comment

    # Error message
    - match: '(?<= )#[^|]+'
      scope: string.message
      push:

        - match: '\\-?[0-9]+'
          scope: string.message.escape
        - match: '\| ?https?://[\w./%?&=#+-]+'
          scope: string.other
        - match: $
          pop: true

    # Numbers
    - match: '\b(-)?[0-9.]+\b'
      scope: constant.numeric

................................................................................
        2: rule.priority

    - match: '/(\w+)/'
      scope: rule.actionoption
      captures:
        1: rule.optionname






    # Definitions and options
    - match: '^OPT(?:GROUP|LANG|PRIORITY)/|^OPT(?:SOFTWARE|COLORTHEME):|^COLOR/'
      scope: options.command

    - match: '^OPT(?:LABEL|COLOR|)/'
      scope: options.parameter








|


>

|

|







 







>
>
>
>
>







14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
..
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
      #push: double_quoted_string

    # Comments begin with a '#' and finish at the end of the line
    - match: '^#.*'
      scope: comment

    # Error message
    - match: '(?<= )# '
      scope: string.message
      push:
        - meta_scope: string.message
        - match: '\\-?[0-9]+'
          scope: string.message.esc
        - match: '\| ?https?://[\w./%?&=#+-]+'
          scope: string.message.url
        - match: $
          pop: true

    # Numbers
    - match: '\b(-)?[0-9.]+\b'
      scope: constant.numeric

................................................................................
        2: rule.priority

    - match: '/(\w+)/'
      scope: rule.actionoption
      captures:
        1: rule.optionname

    - match: '!!(.+)¡¡'
      scope: rule.antipattern
      captures:
        1: rule.antipattern.token

    # Definitions and options
    - match: '^OPT(?:GROUP|LANG|PRIORITY)/|^OPT(?:SOFTWARE|COLORTHEME):|^COLOR/'
      scope: options.command

    - match: '^OPT(?:LABEL|COLOR|)/'
      scope: options.parameter