Grammalecte  Check-in [b08008a010]

Overview
Comment:[core][build][fr] merge token tags and sentence tags, immunity rework
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | fr | core | build | rg
Files: files | file ages | folders
SHA3-256: b08008a0107b43d56e804d7fc34cd4106cbcab2437461f059a0d3e56fe287a30
User & Date: olr on 2018-08-10 11:25:29
Other Links: branch diff | manifest | tags
Context
2018-08-10
16:55
[fr] conversion: regex rules -> graph rules check-in: d00a2d1b87 user: olr tags: fr, rg
11:25
[core][build][fr] merge token tags and sentence tags, immunity rework check-in: b08008a010 user: olr tags: build, core, fr, rg
2018-08-08
20:20
[fr] conversion: regex rules -> graph rules check-in: 79f51ff0f6 user: olr tags: fr, rg
Changes

Modified compile_rules_graph.py from [47c53113f4] to [065d3a908a].

244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
    # checking consistancy
    checkTokenNumbers(sAction, sActionId, nToken)

    if cAction == ">":
        ## no action, break loop if condition is False
        return [sOption, sCondition, cAction, ""]

    if not sAction:
        print("# Error in action at line " + sActionId + ":  This action is empty.")

    if sAction[0:1] != "=" and cAction != "=":
        checkIfThereIsCode(sAction, sActionId)

    if cAction == "-":
        ## error detected --> suggestion







|







244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
    # checking consistancy
    checkTokenNumbers(sAction, sActionId, nToken)

    if cAction == ">":
        ## no action, break loop if condition is False
        return [sOption, sCondition, cAction, ""]

    if not sAction and cAction != "%":
        print("# Error in action at line " + sActionId + ":  This action is empty.")

    if sAction[0:1] != "=" and cAction != "=":
        checkIfThereIsCode(sAction, sActionId)

    if cAction == "-":
        ## error detected --> suggestion

Modified gc_core/py/lang_core/gc_engine.py from [493b1ff4c9] to [2cdea3f901].

807
808
809
810
811
812
813
814
815
816

817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832


833



834











835
836
837
838
839
840
841
...
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
...
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
                                # disambiguation
                                if bDebug:
                                    print("  DISAMBIGUATOR:\n  ", dRule[sRuleId])
                                globals()[sWhat](self.lToken, nTokenOffset)
                            elif cActionType == ">":
                                # we do nothing, this test is just a condition to apply all following actions
                                if bDebug:
                                    print("  COND_OK")
                                pass
                            elif cActionType == "/":

                                if bDebug:
                                    print("  SEMANTIC_TAG:\n  ", dRule[sRuleId])
                                nTokenStart = nTokenOffset + eAct[0]
                                nTokenEnd = nTokenOffset + (eAct[1]  if eAct[1]  else eAct[0])
                                for i in range(nTokenStart, nTokenEnd+1):
                                    if "tags" in self.lToken[i]:
                                        self.lToken[i]["tags"].update(sWhat.split("|"))
                                    else:
                                        self.lToken[i]["tags"] = set(sWhat.split("|"))
                            elif cActionType == "%":
                                # sentence tags
                                if bDebug:
                                    print("  SENTENCE_TAG:\n  ", dRule[sRuleId])
                                nTokenTag = nTokenOffset + eAct[0]
                                if sWhat not in self.dTags:
                                    self.dTags[sWhat] = (nTokenTag, nTokenTag)


                                elif nTokenTag > self.dTags[sWhat][1]:



                                    self.dTags[sWhat] = (self.dTags[sWhat][0], nTokenTag)











                            else:
                                print("# error: unknown action at " + sLineId)
                        elif cActionType == ">":
                            if bDebug:
                                print("  COND_BREAK")
                            break
                except Exception as e:
................................................................................
                self.lToken[nTokenRewriteStart]["bToRemove"] = True
            else:
                for i in range(nTokenRewriteStart, nTokenRewriteEnd+1):
                    self.lToken[i]["bToRemove"] = True
        elif sWhat == "␣":
            # merge tokens
            self.lToken[nTokenRewriteStart]["nMergeUntil"] = nTokenRewriteEnd
        elif sWhat == "!":
            # immunity
            if nTokenRewriteEnd - nTokenRewriteStart == 0:
                self.lToken[nTokenRewriteStart]["bImmune"] = True
            else:
                for i in range(nTokenRewriteStart, nTokenRewriteEnd+1):
                    self.lToken[i]["bImmune"] = True
        elif sWhat == "_":
            # neutralized token
            if nTokenRewriteEnd - nTokenRewriteStart == 0:
                self.lToken[nTokenRewriteStart]["sNewValue"] = "_"
            else:
                for i in range(nTokenRewriteStart, nTokenRewriteEnd+1):
                    self.lToken[i]["sNewValue"] = "_"
................................................................................
            print("REWRITE")
        lNewToken = []
        nMergeUntil = 0
        dTokenMerger = None
        for iToken, dToken in enumerate(self.lToken):
            bKeepToken = True
            if dToken["sType"] != "INFO":
                if "bImmune" in dToken:
                    nErrorStart = self.nOffsetWithinParagraph + dToken["nStart"]
                    if nErrorStart in self.dError:
                        if bDebug:
                            print("immunity -> error removed:", self.dError[nErrorStart])
                        del self.dError[nErrorStart]
                if nMergeUntil and iToken <= nMergeUntil:
                    dTokenMerger["sValue"] += " " * (dToken["nStart"] - dTokenMerger["nEnd"]) + dToken["sValue"]
                    dTokenMerger["nEnd"] = dToken["nEnd"]
                    if bDebug:
                        print("  MERGED TOKEN:", dTokenMerger["sValue"])
                    bKeepToken = False
                if "nMergeUntil" in dToken:







|


>

|
|
|





<
<
<
<
<

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







 







<
<
<
<
<
<
<







 







<
<
<
<
<
<







807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826





827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
...
925
926
927
928
929
930
931







932
933
934
935
936
937
938
...
968
969
970
971
972
973
974






975
976
977
978
979
980
981
                                # disambiguation
                                if bDebug:
                                    print("  DISAMBIGUATOR:\n  ", dRule[sRuleId])
                                globals()[sWhat](self.lToken, nTokenOffset)
                            elif cActionType == ">":
                                # we do nothing, this test is just a condition to apply all following actions
                                if bDebug:
                                    print("  COND_OK: ", sRuleId)
                                pass
                            elif cActionType == "/":
                                # Tag
                                if bDebug:
                                    print("  TAG:\n  ", dRule[sRuleId])
                                nTokenStart = nTokenOffset + eAct[0]  if eAct[0] > 0  else nLastToken + eAct[0]
                                nTokenEnd = nTokenOffset + eAct[1]  if eAct[1] > 0  else nLastToken + eAct[1]
                                for i in range(nTokenStart, nTokenEnd+1):
                                    if "tags" in self.lToken[i]:
                                        self.lToken[i]["tags"].update(sWhat.split("|"))
                                    else:
                                        self.lToken[i]["tags"] = set(sWhat.split("|"))





                                if sWhat not in self.dTags:
                                    self.dTags[sWhat] = [nTokenStart, nTokenStart]
                                else:
                                    self.dTags[sWhat][0] = min(nTokenStart, self.dTags[sWhat][0])
                                    self.dTags[sWhat][1] = max(nTokenEnd, self.dTags[sWhat][1])
                            elif cActionType == "%":
                                # immunity
                                nTokenStart = nTokenOffset + eAct[0]  if eAct[0] > 0  else nLastToken + eAct[0]
                                nTokenEnd = nTokenOffset + eAct[1]  if eAct[1] > 0  else nLastToken + eAct[1]
                                if nTokenEnd - nTokenStart == 0:
                                    self.lToken[nTokenStart]["bImmune"] = True
                                    nErrorStart = self.nOffsetWithinParagraph + self.lToken[nTokenStart]["nStart"]
                                    if nErrorStart in self.dError:
                                        del self.dError[nErrorStart]
                                else:
                                    for i in range(nTokenStart, nTokenEnd+1):
                                        self.lToken[i]["bImmune"] = True
                                        nErrorStart = self.nOffsetWithinParagraph + self.lToken[i]["nStart"]
                                        if nErrorStart in self.dError:
                                            del self.dError[nErrorStart]
                            else:
                                print("# error: unknown action at " + sLineId)
                        elif cActionType == ">":
                            if bDebug:
                                print("  COND_BREAK")
                            break
                except Exception as e:
................................................................................
                self.lToken[nTokenRewriteStart]["bToRemove"] = True
            else:
                for i in range(nTokenRewriteStart, nTokenRewriteEnd+1):
                    self.lToken[i]["bToRemove"] = True
        elif sWhat == "␣":
            # merge tokens
            self.lToken[nTokenRewriteStart]["nMergeUntil"] = nTokenRewriteEnd







        elif sWhat == "_":
            # neutralized token
            if nTokenRewriteEnd - nTokenRewriteStart == 0:
                self.lToken[nTokenRewriteStart]["sNewValue"] = "_"
            else:
                for i in range(nTokenRewriteStart, nTokenRewriteEnd+1):
                    self.lToken[i]["sNewValue"] = "_"
................................................................................
            print("REWRITE")
        lNewToken = []
        nMergeUntil = 0
        dTokenMerger = None
        for iToken, dToken in enumerate(self.lToken):
            bKeepToken = True
            if dToken["sType"] != "INFO":






                if nMergeUntil and iToken <= nMergeUntil:
                    dTokenMerger["sValue"] += " " * (dToken["nStart"] - dTokenMerger["nEnd"]) + dToken["sValue"]
                    dTokenMerger["nEnd"] = dToken["nEnd"]
                    if bDebug:
                        print("  MERGED TOKEN:", dTokenMerger["sValue"])
                    bKeepToken = False
                if "nMergeUntil" in dToken:

Modified gc_lang/fr/rules.grx from [52284b2f0c] to [7ba5ff9a6a].

2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
....
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
....
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
....
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
....
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
....
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
....
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
....
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
....
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
.....
11712
11713
11714
11715
11716
11717
11718
11719
11720
11721
11722
11723
11724
11725
11726
        <<- />> -là


!!!! Immunity                                                                                     !!

__n_importe_qui_quoi__
    n’ importe [qui|quoi]
        <<- ~2>> !



@@@@
@@@@
@@@@
@@@@
................................................................................
TEST: Je propse que, par {{voix}} de conséquence, nous partions immédiatement.
TEST: C’est une {{voix}} interdite.


# voir / voire
__conf_voir_voire__
    voir [grand|petit|rouge]
        <<- ~2>> !

    voir  @:A¬:[NGM]
        <<- /conf/ not \2.istitle() and not morph(<1, ":O[os]|>(?:[ndmts]e|falloir|pouvoir|savoir|de)/")
            and not before(r"(?i)\b[ndmts](?:e |’(?:en |y ))(?:pas |jamais |) *$")
        -1>> voir                       # Confusion probable : “voir” est un verbe concernant la perception visuelle. Pour signifier “et même possiblement”, écrivez :|https://fr.wiktionary.org/wiki/voire

    [comme|lorque|puisque|quand|que|quoique|si]     (voire)
................................................................................
TEST: Nous vous donnons rendez-vous {{Mercredi}} le 18.


# Les mois
__maj_mois__
    monarchie de Juillet
    révolution d’ Octobre
        <<- ~3>> !

    *WORD [Janvier|Février|Avril|Mai|Juin|Juillet|Août|Aout|Septembre|Octobre|Novembre|Décembre|Vendémiaire|Brumaire|Frimaire|Nivôse|Pluviôse|Ventôse|Germinal|Floréal|Prairial|Messidor|Thermidor|Fructidor]
        <<- /maj/ not morph(\1, ":M1") -2:>> =\2.lower()
        # 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

    [*NUM|*WORD_ELIDED] [Janvier|Février|Avril|Mai|Juin|Juillet|Août|Aout|Septembre|Octobre|Novembre|Décembre|Vendémiaire|Brumaire|Frimaire|Nivôse|Pluviôse|Ventôse|Germinal|Floréal|Prairial|Messidor|Thermidor|Fructidor]
    ,    [Janvier|Février|Avril|Mai|Juin|Juillet|Août|Aout|Septembre|Octobre|Novembre|Décembre|Vendémiaire|Brumaire|Frimaire|Nivôse|Pluviôse|Ventôse|Germinal|Floréal|Prairial|Messidor|Thermidor|Fructidor]
................................................................................
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


# Les États
__maj_État__
    en fonction de l’ état
        <<- ~5>> !

    état [français|belge|suisse|canadien|palestinien|souverain|américain|russe|anglais|allemand|espagnol|italien|mexicain|japonais|chinois|australien|polonais|membre|africain|européen|asiatique|voyou|démocratique|totalitaire|fédéral|fédéré|capitaliste|communiste|providence|nation]
        <<- /maj/ \1 == "état" -1>> État                            # Majuscule manquante : si vous parlez de l’institution dirigeante d’une nation, écrivez “État”.

    états [français|>belge|>suisse|canadien|canadiens|palestinien|palestiniens|souverain|souverains|>membre|américain|américains|africain|africains|européen|européens|>asiatique|>voyou|>démocratique|>totalitaire|>fédérale|>fédérée|>capitaliste|>communiste|>providence|>nation]
        <<- /maj/ \1 == "états" -1>> États                          # Majuscule manquante : si vous parlez de l’institution dirigeante d’une nation, écrivez “État”.

................................................................................
TEST: C’est une prérogative de l’{{état-nation}}                        ->> État-nation


# gentilés / ethnonymes
__maj_gentilés__
    océan Indien
    [îles|iles] Britanniques
        <<- ~2>> !

    *WORD [>afghane|>albanaise|>algérienne|>allemande|>américaine|>andorrane|>anglais|>angolaise|>arabe|>argentine|>arménienne|>australienne|>autrichienne|>asiatique|>azerbaïdjanaise|>bahamienne|>bangladaise|>bengladeshie|>barbadienne|>basque|>belge|>bélizienne|>béninoise|>bretonne|>bhoutanaise|>biélorusse|>birmane|>bolivienne|>bosnienne|>botswanaiso|>brésilienne|>britannique|>brunéiene|>bulgare|>burkinabé|>burundaise|>cambodgienne|>camerounaise|>canadienne|>capverdienne|>centrafricaine|>chilienne|>chinoise|>chypriote|>colombienne|>comorienne|>congolaise|>nord-coréenne|>corse|>costaricienne|>croate|>cubaine|>danoise|>djiboutienne|>dominicaine|>égyptienne|>émiratie|>équatorienne|>érythréenne|>estonienne|>espagnole|>étatsunienne|>états-unienne|>étasunienne|>éthiopienne|>fidjienne|>finlandaise|>formosane|>française|>gabonaise|>gambienne|>géorgienne|>ghanéenne|>grecque|>grenadienne|>guadeloupéenne|>guatémaltèque|>guinéenne|>équato-guinéenne|>guyanienne|>haïtienne|>honduriene|>hollandaise|>hongroise|>indienne|>indochinoise|>indonésienne|>irakienne|>italienne|>iranienne|>irlandaise|>islandaise|>israélienne|>ivoirienne|>jamaïcaine|>japonaise|>jordanienne|>kazakhe|>kényane|>kosovare|>koweïtienne|>laotienne|>lapone|>lettone|>libanaise|>libérienne|>libyenne|>liechtensteinoise|>lituanienne|>luxembourgeois|>macédonienne|>maghrébine|>malgache|>malaisienne|>malawite|>maldivienne|>malienne|>maltaise|>maorie|>marocaine|>martienne|>mauricienne|>mauritanienne|>mexicaine|>micronésienne|>moldave|>monégasque|>monténégrine|>mongole|>mozambicaine|>namibiene|>népalaise|>nicaraguayenne|>nigérienne|>nigériane|>néerlandaise|>norvégienne|>néo-zélandaise|>ougandaise|>ouzbèke|>pakistanaise|>palestinienne|>panaméenne|>paraguayenne|>perse|>péruvienne|>philippine|>polonaise|>polynésienne|>portugaise|>québécoise|>qatarie|>roumaine|>russe|>rwandaise|>saoudienne|>scandinave|>salvadorienne|>sénégalaise|>serbe|>singapourienne|>slovaque|>slovène|>somalienne|>soudanaise|>soviétique|>srilankaise|>suédoise|>suisse|>surinamaise|>syrienne|>sud-africaine|>sud-coréenne|>américaine|>tadjike|>tanzanienne|>tchadienne|>tchèque|>thaïlandaise|>togolaise|>tahitienne|>tunisiene|>turkmène|>turque|>taïwanaise|>ukrainienne|>uruguayenne|>vénézuélienne|>vietnamienne|>yéménite|>yougoslave|>zaïroise|>zambienne|>zimbabwéenne]
        <<- /maj/ \2.istitle() and morph(\1, ":N", ":(?:A|V0e|D|R|B)") -2:>> =\2.lower()            # S’il s’agit d’un adjectif, ne mettez pas de majuscule.
        <<- /maj/ \2.islower() and not \2.startswith("canadienne") and
            ( value(\1, "|certains|certaines|ce|cet|cette|ces|des|les|nos|vos|leurs|quelques|plusieurs|chaque|une|aux|") or
            ( value(\1, "|un|") and not value(<1, "|dans|numéro|") and not after("(?:approximatif|correct|courant|parfait|facile|aisé|impeccable|incompréhensible)") ) )
        -2>> =\2.capitalize()                                                                       # S’il s’agit d’un gentilé, mettez une majuscule.
................................................................................
__rendez_vous__
    ne [le|la|les] [lui|leur]   (rendez-vous)
    ne me [le|la|les]           (rendez-vous)
    ne [lui|leur] en            (rendez-vous)
    ne [le|la|les|lui|leur]     (rendez-vous)
    [me|ne|nous|vous|lui]       (rendez-vous)
        <<- =>> define(\1, [":VCi1:2p"])
        <<- ~1>> !

#   [un|mon|ton|son|ce|mes|tes|ses|leurs] rendez-vous
#   rendez-vous seulement défini comme :N:m:i




................................................................................
!!
!!!! Pronoms + incohérences                                                                       !!
!!
!!

__m_enfin__
    m’ enfin
        <<- ~2>> !
        <<- ~>> *


__non_verbe_après_préverbes__
    [ne|n’]     [le|la|l’|les]      [lui|leur|en|y]         @:[NAQ]¬:(?:[123][sp]|Y|P|Oo|X)
    [ne|n’]     [lui|leur]          en                      @:[NAQ]¬:(?:[123][sp]|Y|P|Oo|X)
        <<- /conf/ -4>> =suggSimil(\4, ":(?:[123][sp]|Y)", False)                                   # Incohérence avec « \1 \2 \3 » : « \4 » devrait être un verbe.
................................................................................
TEST: t’en voilà débarrassée.
TEST: N’oublient-ils pas ce qu’ils étaient autrefois…
TEST: Ne presque jamais réussir un plat aussi simple, c’est de l’incompétence pure et simple.


__loc_notre_père_qui_es_au_cieux__
    notre père qui [es|est] aux cieux
        <<- ~4>> !
        <<- ~3:0>> *


!!
!!
!!!! Formes verbales sans sujet                                                                   !!
!!
!!

__tag_sujets__
    [je|j’]
    [moi|moi-même] qui
    [moi|moi-même] [seul|seule]
        <<- %>> 1s

    tu
    t’  @:2s
    t’  [en|y]  @:2s
    [toi|toi-même] ?,¿ qui
    [toi|toi-même] [seul|seule]
        <<- %>> 2s

    nous
    nous ?,¿ qui
    nous-même
    nous-mêmes
    nous [seul|seuls|seules]
    [et|ou] [moi|moi-même]
    ni [moi|moi-même]
    [moi|moi-même] et
        <<- %>> 1p

    vous
    vous ?,¿ qui
    vous-même
    vous-mêmes
    vous [seul|seule|seuls|seules]
    [et|ou] [toi|toi-même]
    ni [toi|toi-même]
    [toi|toi-même] et
        <<- %>> 2p


__tag_prop_sub__
    ce [que|qu’|qu]
        <<- %>> ce_que


## Incohérences avec formes verbales 1sg et 2sg sans sujet

__conj_xxxai__sans_sujet!3__
    [se|s’]  ?[en|y|le|la|l’|les]¿  (~ai$)
        <<- /conj/ morph(\1, ":1s", ":(?:G|W|M|J|3[sp])")
................................................................................

TODO: comme


__purge_locutions_latines__
    [a|à]       [priori|postériori|posteriori|contrario|cappella|minima]
        <<- ~>> *
        <<- ~1>> !

    ab          [absurdo|initio]
    ad          [hoc|hominem|infinitum|nauseam|valorem|patres]
    ad          vitam æternam
    ex          [nihilo|cathedra|absurdo|abrupto]
    id          est
    in          [abstracto|extenso|extremis|fine|petto|situ|utero|vitro|vivo]
................................................................................
__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>> !

    en cour
        <<- /conf/ ->> en cours                             # Confusion probable. Une cour… Un cours… Adjectif : court(e).

    >couper [cour|cours|courre|courres|courts]
        <<- /conf/ -2>> court                               # “Couper court” qui signifie écourter. Une cour… Un cours… Adjectif : court(e).








|







 







|







 







|







 







|







 







|







 







|







 







|







 







|













|






|









|









|




|







 







|







 







|







2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
....
6345
6346
6347
6348
6349
6350
6351
6352
6353
6354
6355
6356
6357
6358
6359
....
6412
6413
6414
6415
6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
....
6437
6438
6439
6440
6441
6442
6443
6444
6445
6446
6447
6448
6449
6450
6451
....
6471
6472
6473
6474
6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
....
6596
6597
6598
6599
6600
6601
6602
6603
6604
6605
6606
6607
6608
6609
6610
....
6612
6613
6614
6615
6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
....
6680
6681
6682
6683
6684
6685
6686
6687
6688
6689
6690
6691
6692
6693
6694
6695
6696
6697
6698
6699
6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714
6715
6716
6717
6718
6719
6720
6721
6722
6723
6724
6725
6726
6727
6728
6729
6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740
....
7372
7373
7374
7375
7376
7377
7378
7379
7380
7381
7382
7383
7384
7385
7386
.....
11712
11713
11714
11715
11716
11717
11718
11719
11720
11721
11722
11723
11724
11725
11726
        <<- />> -là


!!!! Immunity                                                                                     !!

__n_importe_qui_quoi__
    n’ importe [qui|quoi]
        <<- %2>>



@@@@
@@@@
@@@@
@@@@
................................................................................
TEST: Je propse que, par {{voix}} de conséquence, nous partions immédiatement.
TEST: C’est une {{voix}} interdite.


# voir / voire
__conf_voir_voire__
    voir [grand|petit|rouge]
        <<- %2>>

    voir  @:A¬:[NGM]
        <<- /conf/ not \2.istitle() and not morph(<1, ":O[os]|>(?:[ndmts]e|falloir|pouvoir|savoir|de)/")
            and not before(r"(?i)\b[ndmts](?:e |’(?:en |y ))(?:pas |jamais |) *$")
        -1>> voir                       # Confusion probable : “voir” est un verbe concernant la perception visuelle. Pour signifier “et même possiblement”, écrivez :|https://fr.wiktionary.org/wiki/voire

    [comme|lorque|puisque|quand|que|quoique|si]     (voire)
................................................................................
TEST: Nous vous donnons rendez-vous {{Mercredi}} le 18.


# Les mois
__maj_mois__
    monarchie de Juillet
    révolution d’ Octobre
        <<- %3>>

    *WORD [Janvier|Février|Avril|Mai|Juin|Juillet|Août|Aout|Septembre|Octobre|Novembre|Décembre|Vendémiaire|Brumaire|Frimaire|Nivôse|Pluviôse|Ventôse|Germinal|Floréal|Prairial|Messidor|Thermidor|Fructidor]
        <<- /maj/ not morph(\1, ":M1") -2:>> =\2.lower()
        # 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

    [*NUM|*WORD_ELIDED] [Janvier|Février|Avril|Mai|Juin|Juillet|Août|Aout|Septembre|Octobre|Novembre|Décembre|Vendémiaire|Brumaire|Frimaire|Nivôse|Pluviôse|Ventôse|Germinal|Floréal|Prairial|Messidor|Thermidor|Fructidor]
    ,    [Janvier|Février|Avril|Mai|Juin|Juillet|Août|Aout|Septembre|Octobre|Novembre|Décembre|Vendémiaire|Brumaire|Frimaire|Nivôse|Pluviôse|Ventôse|Germinal|Floréal|Prairial|Messidor|Thermidor|Fructidor]
................................................................................
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


# Les États
__maj_État__
    en fonction de l’ état
        <<- %5>>

    état [français|belge|suisse|canadien|palestinien|souverain|américain|russe|anglais|allemand|espagnol|italien|mexicain|japonais|chinois|australien|polonais|membre|africain|européen|asiatique|voyou|démocratique|totalitaire|fédéral|fédéré|capitaliste|communiste|providence|nation]
        <<- /maj/ \1 == "état" -1>> État                            # Majuscule manquante : si vous parlez de l’institution dirigeante d’une nation, écrivez “État”.

    états [français|>belge|>suisse|canadien|canadiens|palestinien|palestiniens|souverain|souverains|>membre|américain|américains|africain|africains|européen|européens|>asiatique|>voyou|>démocratique|>totalitaire|>fédérale|>fédérée|>capitaliste|>communiste|>providence|>nation]
        <<- /maj/ \1 == "états" -1>> États                          # Majuscule manquante : si vous parlez de l’institution dirigeante d’une nation, écrivez “État”.

................................................................................
TEST: C’est une prérogative de l’{{état-nation}}                        ->> État-nation


# gentilés / ethnonymes
__maj_gentilés__
    océan Indien
    [îles|iles] Britanniques
        <<- %2>>

    *WORD [>afghane|>albanaise|>algérienne|>allemande|>américaine|>andorrane|>anglais|>angolaise|>arabe|>argentine|>arménienne|>australienne|>autrichienne|>asiatique|>azerbaïdjanaise|>bahamienne|>bangladaise|>bengladeshie|>barbadienne|>basque|>belge|>bélizienne|>béninoise|>bretonne|>bhoutanaise|>biélorusse|>birmane|>bolivienne|>bosnienne|>botswanaiso|>brésilienne|>britannique|>brunéiene|>bulgare|>burkinabé|>burundaise|>cambodgienne|>camerounaise|>canadienne|>capverdienne|>centrafricaine|>chilienne|>chinoise|>chypriote|>colombienne|>comorienne|>congolaise|>nord-coréenne|>corse|>costaricienne|>croate|>cubaine|>danoise|>djiboutienne|>dominicaine|>égyptienne|>émiratie|>équatorienne|>érythréenne|>estonienne|>espagnole|>étatsunienne|>états-unienne|>étasunienne|>éthiopienne|>fidjienne|>finlandaise|>formosane|>française|>gabonaise|>gambienne|>géorgienne|>ghanéenne|>grecque|>grenadienne|>guadeloupéenne|>guatémaltèque|>guinéenne|>équato-guinéenne|>guyanienne|>haïtienne|>honduriene|>hollandaise|>hongroise|>indienne|>indochinoise|>indonésienne|>irakienne|>italienne|>iranienne|>irlandaise|>islandaise|>israélienne|>ivoirienne|>jamaïcaine|>japonaise|>jordanienne|>kazakhe|>kényane|>kosovare|>koweïtienne|>laotienne|>lapone|>lettone|>libanaise|>libérienne|>libyenne|>liechtensteinoise|>lituanienne|>luxembourgeois|>macédonienne|>maghrébine|>malgache|>malaisienne|>malawite|>maldivienne|>malienne|>maltaise|>maorie|>marocaine|>martienne|>mauricienne|>mauritanienne|>mexicaine|>micronésienne|>moldave|>monégasque|>monténégrine|>mongole|>mozambicaine|>namibiene|>népalaise|>nicaraguayenne|>nigérienne|>nigériane|>néerlandaise|>norvégienne|>néo-zélandaise|>ougandaise|>ouzbèke|>pakistanaise|>palestinienne|>panaméenne|>paraguayenne|>perse|>péruvienne|>philippine|>polonaise|>polynésienne|>portugaise|>québécoise|>qatarie|>roumaine|>russe|>rwandaise|>saoudienne|>scandinave|>salvadorienne|>sénégalaise|>serbe|>singapourienne|>slovaque|>slovène|>somalienne|>soudanaise|>soviétique|>srilankaise|>suédoise|>suisse|>surinamaise|>syrienne|>sud-africaine|>sud-coréenne|>américaine|>tadjike|>tanzanienne|>tchadienne|>tchèque|>thaïlandaise|>togolaise|>tahitienne|>tunisiene|>turkmène|>turque|>taïwanaise|>ukrainienne|>uruguayenne|>vénézuélienne|>vietnamienne|>yéménite|>yougoslave|>zaïroise|>zambienne|>zimbabwéenne]
        <<- /maj/ \2.istitle() and morph(\1, ":N", ":(?:A|V0e|D|R|B)") -2:>> =\2.lower()            # S’il s’agit d’un adjectif, ne mettez pas de majuscule.
        <<- /maj/ \2.islower() and not \2.startswith("canadienne") and
            ( value(\1, "|certains|certaines|ce|cet|cette|ces|des|les|nos|vos|leurs|quelques|plusieurs|chaque|une|aux|") or
            ( value(\1, "|un|") and not value(<1, "|dans|numéro|") and not after("(?:approximatif|correct|courant|parfait|facile|aisé|impeccable|incompréhensible)") ) )
        -2>> =\2.capitalize()                                                                       # S’il s’agit d’un gentilé, mettez une majuscule.
................................................................................
__rendez_vous__
    ne [le|la|les] [lui|leur]   (rendez-vous)
    ne me [le|la|les]           (rendez-vous)
    ne [lui|leur] en            (rendez-vous)
    ne [le|la|les|lui|leur]     (rendez-vous)
    [me|ne|nous|vous|lui]       (rendez-vous)
        <<- =>> define(\1, [":VCi1:2p"])
        <<- %1>>

#   [un|mon|ton|son|ce|mes|tes|ses|leurs] rendez-vous
#   rendez-vous seulement défini comme :N:m:i




................................................................................
!!
!!!! Pronoms + incohérences                                                                       !!
!!
!!

__m_enfin__
    m’ enfin
        <<- %2>>
        <<- ~>> *


__non_verbe_après_préverbes__
    [ne|n’]     [le|la|l’|les]      [lui|leur|en|y]         @:[NAQ]¬:(?:[123][sp]|Y|P|Oo|X)
    [ne|n’]     [lui|leur]          en                      @:[NAQ]¬:(?:[123][sp]|Y|P|Oo|X)
        <<- /conf/ -4>> =suggSimil(\4, ":(?:[123][sp]|Y)", False)                                   # Incohérence avec « \1 \2 \3 » : « \4 » devrait être un verbe.
................................................................................
TEST: t’en voilà débarrassée.
TEST: N’oublient-ils pas ce qu’ils étaient autrefois…
TEST: Ne presque jamais réussir un plat aussi simple, c’est de l’incompétence pure et simple.


__loc_notre_père_qui_es_au_cieux__
    notre père qui [es|est] aux cieux
        <<- %4>>
        <<- ~3:0>> *


!!
!!
!!!! Formes verbales sans sujet                                                                   !!
!!
!!

__tag_sujets__
    [je|j’]
    [moi|moi-même] qui
    [moi|moi-même] [seul|seule]
        <<- />> 1s

    tu
    t’  @:2s
    t’  [en|y]  @:2s
    [toi|toi-même] ?,¿ qui
    [toi|toi-même] [seul|seule]
        <<- />> 2s

    nous
    nous ?,¿ qui
    nous-même
    nous-mêmes
    nous [seul|seuls|seules]
    [et|ou] [moi|moi-même]
    ni [moi|moi-même]
    [moi|moi-même] et
        <<- />> 1p

    vous
    vous ?,¿ qui
    vous-même
    vous-mêmes
    vous [seul|seule|seuls|seules]
    [et|ou] [toi|toi-même]
    ni [toi|toi-même]
    [toi|toi-même] et
        <<- />> 2p


__tag_prop_sub__
    ce [que|qu’|qu]
        <<- />> ce_que


## Incohérences avec formes verbales 1sg et 2sg sans sujet

__conj_xxxai__sans_sujet!3__
    [se|s’]  ?[en|y|le|la|l’|les]¿  (~ai$)
        <<- /conj/ morph(\1, ":1s", ":(?:G|W|M|J|3[sp])")
................................................................................

TODO: comme


__purge_locutions_latines__
    [a|à]       [priori|postériori|posteriori|contrario|cappella|minima]
        <<- ~>> *
        <<- %1>>

    ab          [absurdo|initio]
    ad          [hoc|hominem|infinitum|nauseam|valorem|patres]
    ad          vitam æternam
    ex          [nihilo|cathedra|absurdo|abrupto]
    id          est
    in          [abstracto|extenso|extremis|fine|petto|situ|utero|vitro|vivo]
................................................................................
__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>>

    en cour
        <<- /conf/ ->> en cours                             # Confusion probable. Une cour… Un cours… Adjectif : court(e).

    >couper [cour|cours|courre|courres|courts]
        <<- /conf/ -2>> court                               # “Couper court” qui signifie écourter. Une cour… Un cours… Adjectif : court(e).