Grammalecte  Check-in [11e28f20e0]

Overview
Comment:[fr] conversion: regex rules -> graph rules
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | fr | rg
Files: files | file ages | folders
SHA3-256: 11e28f20e021e126fc5664f90e7a0a16a0a969cd05b688c684b31a2aa863df27
User & Date: olr on 2018-07-25 15:06:08
Other Links: branch diff | manifest | tags
Context
2018-07-26
08:13
[core] gc engine: define_from() update check-in: 86ac7fe88a user: olr tags: core, rg
2018-07-25
15:06
[fr] conversion: regex rules -> graph rules check-in: 11e28f20e0 user: olr tags: fr, rg
15:05
[core] get token outside secure scope check-in: bc13d3f8bb user: olr tags: core, rg
Changes

Modified gc_lang/fr/rules.grx from [d42fea4f5c] to [95ebaaa4fc].

7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
....
8486
8487
8488
8489
8490
8491
8492
8493
8494
8495
8496
8497
8498
8499
8500
....
8525
8526
8527
8528
8529
8530
8531
8532
8533
8534
8535
8536


8537
8538
8539
8540
8541
8542
8543
....
8546
8547
8548
8549
8550
8551
8552
8553
8554
8555
8556
8557
8558
8559
8560
8561
8562
8563
8564
8565
8566
8567
8568
8569
8570
8571
8572
8573
8574
8575
8576
8577
8578
8579
8580
8581
8582
8583
8584
8585
8586
8587
8588
8589
8590
8591
8592
8593
8594
8595
8596
8597
8598
8599
8600
8601
8602
8603
8604
8605
8606
8607
8608
8609
8610
8611
8612
8613
8614
8615
8616
8617
8618
8619
8620
8621
8622
8623
8624
8625
8626
8627
8628
8629
8630
8631
8632
8633
8634
8635
8636
8637
8638
8639
8640
8641
8642
8643
8644
8645
8646
8647
8648
8649
8650
8651
8652
8653
8654
8655
8656
8657
8658
8659
8660
8661
8662
8663
8664
8665
8666
8667
8668
8669
8670
8671
8672
8673
8674
8675
8676
8677
8678
8679
8680
8681
8682
8683
8684
8685
8686
8687
8688

































8689
8690
8691
8692
8693
8694
8695
....
8781
8782
8783
8784
8785
8786
8787





8788
8789
8790
8791
8792
8793
8794
....
8801
8802
8803
8804
8805
8806
8807









8808
8809
8810
8811
8812
8813
8814
8815
8816


8817
8818
8819

8820
8821
8822
8823
8824
8825
8826
8827

8828
8829
8830
8831
8832

8833
8834
8835
8836
8837
8838
8839
8840
8841
8842
8843

8844
8845
8846
8847
8848
8849
8850
8851
8852
8853
8854
8855
8856
8857
8858
8859
8860

8861
8862
8863

8864
8865
8866
8867
8868

8869
8870

8871
8872

8873
8874

8875
8876
8877

8878
8879

8880
8881
8882
8883

8884
8885

8886
8887
8888
8889

8890
8891

8892
8893
8894
8895

8896
8897

8898
8899
8900
8901
8902
8903
8904
8905
8906
8907
8908
....
8910
8911
8912
8913
8914
8915
8916
8917
8918
8919
8920
8921
8922
8923
8924
8925
8926
8927
8928
8929
8930
8931
8932
8933
8934
8935
8936
8937
8938



8939
8940
8941
8942
8943
8944
8945
8946
8947
8948
8949
8950
8951
8952
8953
8954
8955
8956
8957
8958
8959
8960
8961
8962
8963
8964
8965

8966
8967

8968
8969
8970
8971
8972
8973
8974
8975
8976
8977
8978
8979
8980
8981
8982
8983
8984
8985
8986
8987
8988
8989
8990
8991
8992
8993
8994
8995
8996
8997
8998
8999
9000
9001
9002
9003
9004
9005
9006
9007
9008
9009
9010
9011
9012
9013
9014
9015
9016
9017
9018
9019
9020
9021
9022
9023
9024
9025
9026
9027
9028
9029
9030
9031
9032
9033
9034
9035
9036
9037
9038
9039
9040
9041
9042
9043
9044
9045
9046
9047
9048
9049
9050
9051
9052
9053
9054
9055
9056
9057
9058
9059
9060
9061
9062
9063


















9064
9065
9066
9067
9068
9069
9070
.....
12151
12152
12153
12154
12155
12156
12157
12158
12159
12160
12161
12162
12163
12164
12165
.....
12169
12170
12171
12172
12173
12174
12175
12176
12177
12178
12179
12180
12181
12182
12183
12184
12185
12186
    ~-[lL][àÀ]$
        <<- morph(\1, ":[NAQ]", ":G", 0, -3) ~>> =\1[:-3]

TEST: cette femme-là {{étaient}} partout.


__simplification_des_nombres__
    [vingt|trente|quarante|cinquante|soixante|soixante-dix|septante|quatre-vingt|octante|huitante|quatre-vingt-dix|nonante] et [un|une|onze]
        <<- ~>> \1-et-\3||
        <<- ~2:3>> *

    [deux|trois|quatre|cinq|six|sept|huit|neuf|onze|douze|treize|quatorze|quinze|seize|dix-sept|dix-huit|dix-neuf]  cents  @:[NAQ].*:[pi]¬:(?:G|3p)
        <<- ~1:2>> ␣

    [deux|trois|quatre|cinq|six|sept|huit|neuf] ?cent¿ mille
................................................................................
    quelque peu                 @:[AW]
    pas très                    @:[AW]
        <<- ~1:2>> *

    un ?petit¿  peu ?[plus|moins]¿
        <<- morph(>1, ":[AW]") ~>> *

    [bien|mal|fort|plus|moins] @:[AW]
        <<- ~1>> *

    si  @:[AW]
        <<- not (\2 == "bien" and value(>1, "|que|")) ~1>> *

    un [brin|chouia|chouïa|rien|minimum|soupçon|tantinet]  ?trop¿
        <<- morph(>1, ":A", ":G") ~>> *
................................................................................
        <<- ~1>> *


@@@@
@@@@
@@@@
@@@@
@@@@GRAPH: purge_avant_gn                                                                                  _
@@@@
@@@@
@@@@
@@@@



__purge_ponctuations__
    ,   ,
    (   )
    [   ]
    <   >
    [-|–|—]  [-|–|—]
................................................................................
    <start>  ,
        <<- ~2>> *

    ,  <end>
        <<- ~1>> *



@@@@
@@@@END_GRAPH                                                                                      _
@@@@





## Seconde passe (il faut réorganiser tout le cycle de simplification)

__[i](p_à_nos_yeux)__
    (à (?:[mts]es|[nv]os|leurs) yeux) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[pi]", False) ~1>> *
__[i](p_à_la_dernière)__
    (à la dernière (?:minute|seconde)) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[fe]:[si]", False) ~1>> *
__[i](p_à_l_époque)__
    (à l’époque) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[fe]:[si]", False) ~1>> *
__[i](p_au_pire)__
    (au pire) +({w_1}) @@0,$ <<- morph(\2, ":A", ":N:[me]:[si]") ~1>> *
__[i](p_ben_voyons)__
    ben voyons <<- isStart() ~>> *
__[i](p_chaque_année_semaine_journée_décennie)__
    (chaque (?:année|semaine|journée|décennie)) +({w_1}) @@0,$ <<- not morph(\2, ":(?:A.*:[fe]:[si]|Oo|[123][sp])", False) ~1>> *
__[i](p_chaque_an_jour_mois)__
    (chaque (?:an|jour|mois)) +({w_1}) @@0,$ <<- not morph(\2, ":(?:A.*:[me]:[si]|Oo|[123][sp])", False) ~1>> *
__[i](p_d_évidence)__
    (d’évidence) +({w_1})  @@0,$ <<- not morph(\2, ":A.*:[fe]:[si]", False) ~1>> *
__[i](p_dans_l_ensemble)__
    (dans l’ensemble) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[si]", False) ~1>> *
__[i](p_de_ce_seul_fait)__
    (de ce (?:seul |)fait) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[si]", False) ~1>> *
__[i](p_dès_le_départ)__
    (dès le départ) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[si]") ~1>> *
__[i](p_dès_les_premiers_jours_mois_ans)__
    (dès les premiers (?:jours|mois|ans|siècles|trimestres|semestres)) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[pi]", False) ~1>> *
__[i](p_dès_les_premières_années_heures_minutes)__
    (dès les premières (?:années|semaines|minutes|secondes|heures|décennies)) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[fe]:[pi]", False) ~1>> *
__[i](p_en_certaines_plusieurs_occasions)__
    (en (?:certaines|quelques|plusieurs|de multiples) occasions) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[fe]:[pi]", False) ~1>> *
__[i](p_entre_autres_choses)__
    (entre autres choses) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[fe]:[pi]", False) ~1>> *
__[i](p_quelques_minutes_heures_années_plus_tard)__
    ((?:quelques|plusieurs|de +nombreuses) (?:secondes|minutes|heures|journées|semaines|années|décennies)) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[fe]:[pi]", False) ~1>> *
__[i](p_quelques_instants_jours_siècles)__
    ((?:quelques|plusieurs|de +nombreux) (?:instants|moments|jours|mois|ans|siècles)) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[pi]", False) ~1>> *
__[i](p_un_moment_instant)__
    (un (?:instant|moment|jour)) +({w_1}) @@0,$ <<- not morph(\2, ":A.*:[me]:[si]", False) ~1>> *


## Simplication des locutions verbales
__[i](loc_arriver)__
	(arriv\w+) (([aà]) (?:échéance|point nommé)) @@0,$,w
	<<- morph(\1, ">arriver/", False) >>>
	<<- \3 == "a" -3>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
	<<- ~2>> *
__[i](p_donner_sens)__
    ((?:re|)donn\w+) +(sens) @@0,$
    <<- morph(\1, ">(?:re|)donner/", False) ~2>> *
__[i](p_faire_qqch)__
    (f[aiîeo]\w*) +(tous(?: deux| trois|) +|)(allusion|amende honorable|assaut|bande à part|bonne figure|chaud|confiance|compliqué|copain[- ]copain|de (?:[mts]on|leur|[nv]otre) mieux|dé(?:bat|faut)|demi-tour|envie|fausse route|figure|froid|front commun|gr(?:ise mine|and (?:bruit|cas))|h(?:alte|onte)|illusion|long feu|ma(?:chine|rche) arrière|main basse|mouche|office|p(?:art(?:ie(?: intégrante|)|)|eur|laisir|rofil bas)|rage|salle comble|scandale|sens|signe|table rase|volte-face|ce que bon (?:me|te|lui|leur|nous|vous) semble) @@0,*,$
    <<- morph(\1, ">faire/", False) ~2>> *
    <<- __also__ ~3>> *
__[i](loc_laisser_pour_compte)__
    (laiss\w+) +(pour (co[mn]p?tes?))  @@0,$,$
    <<- morph(\1, ">laisser/", False) >>>
    <<- \3 != "compte" -3>> compte              # Confusion. Locution “laisser pour compte”.|https://fr.wiktionary.org/wiki/laisser_pour_compte
    <<- ~2>> *
__[i](loc_mettre_à_qqch)__
    (m(?:et|[iî][mst])\w*) +(([àa]) (?:bas|jour|niveau|plat|l’(?:écart|épreuve)|terre)) @@0,$,w
    <<- morph(\1, ">mettre/", False) >>>
    <<- \3 == "a" -3>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~2>> *
__[i](p_mettre_qqch)__
    (m(?:et|[iî][mst])\w*) +(au p(?:oint|as)|en (?:avant|bouche|demeure|garde|jeu|lumière|œuvre|place|scène|terre)) @@0,$
    <<- morph(\1, ">mettre/", False) ~2>> *
__[i](loc_mourir_qqch)__
    (m[oe]\w+) +(jeûne)  @@0,$
    <<- morph(\1, ">mourir/", False) -2>> =\2.replace("û", "u")                 # Confusion. Le jeûne est une privation de nourriture.|https://fr.wiktionary.org/wiki/jeune
__[i](p_paraitre_qqch)__
    (par\w+) +(jeûnes?)  @@0,$
    <<- morph(\1, ">para[îi]tre/", False) -2>> =\2.replace("û", "u")            # Confusion. Le jeûne est une privation de nourriture.|https://fr.wiktionary.org/wiki/jeune
__[i](p_porter_qqch)__
    (port\w+) +(atteinte|bonheur|caution|chance|malheur|plainte|préjudice|secours)  @@0,$
    <<- morph(\1, ">porter/", False) ~2>> *
__[i](loc_prendre_à_la_légère)__
    (pr[eiî]\w+) +(([àa]) la légère) @@0,$,w
    <<- morph(\1, ">prendre/", False) >>>
    <<- \3 == "a" -3>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~2>> *
__[i](p_prendre)__
    (pr[eiî]\w+) +(au (?:dépourvu|sérieux)|congé|conscience|contact|de court|en charge|ombrage|pour argent comptant|par surprise|racine|soin|vie) @@0,$
    <<- morph(\1, ">prendre/", False) ~2>> *
__[i](loc_rendre_compte)__
    (rend\w+) +(co[mn]tes?)  @@0,$
    <<- morph(\1, ">rendre/", False) -2>> compte                                # Confusion probable. Locution “rendre compte”.|https://fr.wiktionary.org/wiki/rendre_compte
    <<- ~1>> *
__[i](loc_rester_qqch)__
    (rest\w+) +(lettre morte|jeûnes?) @@0,$
    <<- morph(\1, ">rester/", False) >>>
    <<- morph(\2, ">jeûne/", False) -2>> =\2.replace("û", "u")                  # Confusion. Le jeûne est une privation de nourriture.|https://fr.wiktionary.org/wiki/jeune
    <<- __else__ ~2>> *
__[i](loc_semble_qqch)__
    (sembl\w+) +(jeûnes?)  @@0,$
    <<- morph(\1, ">sembler/", False) -2>> =\2.replace("û", "u")                # Confusion. Le jeûne est une privation de nourriture.|https://fr.wiktionary.org/wiki/jeune
__[i](p_sembler_paraitre_être)__
    (sembl\w+|par[au]\w+) +(être|avoir été) +({w_2}) @@0,w,$
    <<- morph(\1, ">(?:sembler|para[îi]tre)/") and morphex(\3, ":A", ":G") ~2>> *
__[i](loc_suivre_de_près)__
    (suiv\w+) +((?:ça +|ce(?:ci|la) +|)de (pr[èé]s?|prêts?)) @@0,$,$
    <<- morph(\1, ">suivre/", False) >>>
    <<- \3 != "près" -3>> près                  # Confusion : écrivez “près” pour dire “proche de quelque chose”.|https://fr.wiktionary.org/wiki/pr%C3%A8s
    <<- ~2>> *
__[i](loc_tenir_à_distance)__
    (t[eiî]\w+) +(([àa]) distance +(?:respectable +|))d(?:es?|u) @@0,*,w
    <<- morph(\1, ">tenir/", False) >>>
    <<- \3 == "a" -3>> à                        # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.
    <<- ~2>> *
__[i](loc_tenir_compte)__
    (t[eiî]\w+) +(co(?:mp?|n)tes?|au courant) @@0,$
    <<- morph(\1, ">tenir/", False) >>>
    <<- morph(\2, ">co[mn]te(?:sse|)/", False) -2>> compte        # Confusion. Dans la locution “tenir compte”, écrivez “compte” au singulier.|https://fr.wiktionary.org/wiki/tenir_compte
    <<- ~2>> *
__[i](p_tirer_profit)__
    (tir\w+) +(avantage|profit) d(?:es?|u) @@0,w
    <<- morph(\1, ">tirer/", False) ~2>> *
__[i](loc_tourner_court)__
    (tourn\w+) +(cour(?:re|t|s|))  @@0,$
    <<- morph(\1, ">tourner/", False) >>>
    <<- \2 != "court" -2>> court                # Locution : tourner court.|https://fr.wiktionary.org/wiki/tourner_court
    <<- ~2>> *
__[i](p_trier_sur_le_volet)__
    (tri\w+) (sur le volet) @@0,$
    <<- morph(\1, ">trier/", False) ~2>> *
__[i](p_venir)__
    (v[eiî]\w+) ((?:on ne sait|je ne sais) (?:pas |)(?:trop |)d’où) @@0,$
    <<- morph(\1, ">venir/", False) ~2>> *


































TEST: ce contrat arrive {{a}} échéance.
TEST: il faut tenir {{contes}} des faits au lieu de nos impressions.
TEST: prendre {{a}} la légère ce test serait une erreur.
TEST: on va suivre ça de {{prêt}}.
TEST: il faut se tenir {{a}} distance de ces gens-là.
TEST: cette expérience ne va pas tarder à tourner {{cours}}.
................................................................................
TEST: c’est une vache à lait
TEST: Ses talons aiguille étaient à la denière mode.
TEST: elles seules peuvent s’en sortir.
TEST: elle seule peut y arriver
TEST: elle seules les femmes la font craquer








#
# //////////////////////////////////////// RÈGLES DE CONTRÔLE ////////////////////////////////////////
#


!!!! Redondances dans la phrase                                                                   !!
................................................................................
TEST: __redon2__ Quelle {{imposture}}, c’est d’un ennui, c’est une {{imposture}}.
TEST: __redon2__ ils sont là côte à côte.
TEST: __redon2__ Tu avances petit à petit, et tu réussis.
TEST: __redon2__ De loin en loin, elle passe.
TEST: __redon2__ Les mêmes causes produisent/produisant les mêmes effets. (répétition)












!!
!!
!!!! Groupe nominal (1)                                                                           !!
!!
!!

#### 1 mot



__[i]/gn(gn_l_accord)__
    l’({w_2})  @@$
    <<- morphex(\1, ":[NAQ].*:p", ":[123][sp]|:[si]")

    -1>> =suggSing(@)                                                                               # Accord de nombre erroné :  « \1 » devrait être au singulier.

TEST: toute l’importance de l’{{accords}} musical.


## Accords

__<i]/gn(gn_le_accord1)__

    , +(le) +({w_2})  @@w,$
    <<- morphex(\2, ":[NAQ].*:f", ":(?:e|m|P|G|W|[123][sp]|Y)") -1>> =suggLesLa(\2)                 # Accord de genre erroné : « \2 » est féminin.
    <<- __also__ and hasMasForm(\2) -2>> =suggMasSing(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant masculin.
    <<- __else__ and morph(\2, ":[NAQ].*:p") -2>> =suggMasSing(@)                                   # Accord de nombre erroné : « \2 » devrait être au singulier.
    <<- __also__ -1>> les                                                                           # Accord de nombre erroné : « \2 » est au pluriel.

__[i]/gn(gn_le_accord2)__
    ({w_1}) +(le) +({w_2})  @@0,w,$
    <<- morph(\2, ":D", False) >>>
    <<- morphex(\3, ":[NAQ].*:f", ":(?:e|m|P|G|W|[123][sp]|Y)")
        or ( morphex(\3, ":[NAQ].*:f", ":[me]") and morphex(\1, ":R", ">(?:e[tn]|ou)/") and not (morph(\1, ":Rv", False) and morph(\3, ":Y", False)) )
    -2>> =suggLesLa(\3)                                                                             # Accord de genre erroné : « \3 » est féminin.
    <<- __also__ and hasMasForm(\3) -3>> =suggMasSing(@, True)                                      # Accord de genre erroné : « \2 » est un déterminant masculin.
    <<- __else__ and morph(\3, ":[NAQ].*:p")
        or ( morphex(\3, ":[NAQ].*:p", ":[si]") and morphex(\1, ":[RC]", ">(?:e[tn]|ou)/") and not (morph(\1, ":Rv", False) and morph(\3, ":Y", False)) )
    -3>> =suggMasSing(@)                                                                            # Accord de nombre erroné : « \3 » devrait être au singulier.
    <<- __also__ -2>> les                                                                           # Accord de nombre erroné : « \3 » est au pluriel.

__[i]/gn(gn_le_accord3)__
    ^ *(le) +({w_2}) @@*,$
    <<- morphex(\2, ":[NAQ].*:f", ":(?:e|m|P|G|W|Y)") -1>> =suggLesLa(\2)                           # Accord de genre erroné : « \2 » est féminin.
    <<- __also__ and hasMasForm(\2) -2>> =suggMasSing(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant masculin.
    <<- __else__ and morphex(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(@)                      # Accord de nombre erroné : « \2 » devrait être au singulier.
    <<- __also__ -1>> les                                                                           # Accord de nombre erroné : « \2 » est au pluriel.

TEST: c’est une catastrophe, {{le}} {{profits}} a baissé ces deux derniers trimestres
TEST: {{Le}} démoralisation.                                  ->> La
TEST: {{Le}} Guyane française.                                ->> La
TEST: avec {{le}} {{pile}}
TEST: {{le}} {{publique}}
TEST: {{Le}} {{pendue}}


__[i]/gn(gn_ledit_accord)__
    (ledit) +({w_2})  @@0,$

    <<- morphex(\2, ":[NAQ].*:f", ":[GWme]") -1>> ladite                                            # Accord de genre erroné : « \2 » est féminin.
    <<- __also__ and hasMasForm(\2) -2>> =suggMasSing(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant masculin.
    <<- morphex(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(@)                                   # Accord de nombre erroné : « \2 » devrait être au singulier.

__[i]/gn(gn_un_accord)__
    (un) +({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ].*:f", ":(?:e|m|G|W|V0|3s|Y)") -1>> une                                    # Accord de genre erroné : « \2 » est féminin.
    <<- __also__ and hasMasForm(\2) -2>> =suggMasSing(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant masculin.
    <<- morphex(\2, ":[NAQ].*:p", ":[siGW]") and not morph(word(-2), ":B", False) -2>> =suggMasSing(@) # Accord de nombre erroné : « \2 » devrait être au singulier.

__[i]/gn(gn_un_des_accord)__
    (un) +des +({w_2})  @@0,$

    <<- morphex(\2, ":[NAQ].*:f", ":(?:e|m|G|W|V0|3s)") -1>> une                                    # Accord de genre erroné : « \2 » est féminin.
    <<- __also__ and hasMasForm(\2) -2>> =suggMasPlur(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant masculin.

__[i]/gn(gn_du_accord)__
    (du) +({w_2})  @@0,$

    <<- morphex(\2, ":[NAQ].*:f", ":[GWme]") -1>> de la                                             # Accord de genre erroné : « \2 » est féminin.
    <<- __also__ and hasMasForm(\2) -2>> =suggMasSing(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant masculin.
    <<- morphex(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(@)                                   # Accord de nombre erroné : « \2 » devrait être au singulier.

__[i]/gn(gn_cet_accord)__
    (cet) +({w_2})  @@0,$

    <<- morphex(\2, ":[NAQ].*:f", ":[GWme]") -1>> cette                                             # Accord de genre erroné : « \2 » est féminin.
    <<- __also__ and hasMasForm(\2) -2>> =suggMasSing(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant masculin.
    <<- morphex(\2, ">[bcçdfgjklmnpqrstvwxz].+:[NAQ].*:m", ":[efGW]") -1>> ce                       # Accord de genre correct, mais euphonie non respectée.|http://fr.wikipedia.org/wiki/Euphonie
    <<- morphex(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(@)                                   # Accord de nombre erroné : « \2 » devrait être au singulier.

__[i]/gn(gn_ce_accord)__
    (ce) +({w_2})  @@0,$

    <<- morphex(\2, ":[NAQ].*:f", ":(?:3s|[GWme])") -1>> cette                                      # Accord de genre erroné : « \2 » est féminin.
    <<- __also__ and hasMasForm(\2) -2>> =suggMasSing(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant masculin.
    <<- morphex(\2, ":[NAQ].*:f", ":[GWme]") and morph(\2, ":3s", False) -1>> cette|se              # Accord de genre erroné : « \2 » est féminin. Ou bien vous confondez le déterminant “ce” avec le pronom “se”.
    <<- morphex(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(@)                                   # Accord de nombre erroné : « \2 » devrait être au singulier.

__[i]/gn(gn_mon_ton_son_accord)__
    ([mts]on) +({w_2})  @@0,$

    <<- morph(\1, ":D", False) >>>
    <<- morphex(\2, ">[bcdfgjklmnpqrstvwxz].*:[NAQ].*:f", ":[GWme]") -1>> =\1.replace("on", "a")    # Accord de genre erroné : « \2 » est féminin.
    <<- __also__ and hasMasForm(\2) -2>> =suggMasSing(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant masculin.
    <<- morphex(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(@)                                   # Accord de nombre erroné : « \2 » devrait être au singulier.

__[i]/gn(gn_au_accord)__
    (au) +({w_2})  @@0,$

    <<- morphex(\2, ":[NAQ].*:f:s", ":[GWme]") -1>> à la                                            # Accord de genre erroné : « \2 » est féminin.
    <<- __also__ and hasMasForm(\2) -2>> =suggMasSing(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant masculin.
    <<- morphex(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(@)                                   # Accord de nombre erroné : « \2 » devrait être au singulier.
    <<- __also__ -1>> aux                                                                           # Accord de nombre erroné : « \2 » est au pluriel.

TEST: ledit {{accords}} ne vaut rien.
TEST: {{au}} {{États-Unis}}
TEST: {{Un}} {{amie}}
TEST: {{Cet}} {{idiote}}.
TEST: {{cet}} ballon.                                         ->> ce
TEST: {{Ce}} animal.                                          ->> Cet
................................................................................
TEST: {{une}} des {{chats}}
TEST: {{mon}} {{chienne}}
TEST: cet {{oliviers}}
TEST: ce {{claviers}}
TEST: cette bouffe, c’est du {{chiens}}
TEST: le ton monte.
TEST: Ces enfants n’ont jamais vu quelqu’un lire.


__<i]/gn(gn_la_accord1)__
    , +(la) +({w_2})  @@w,$
    <<- morphex(\2, ":[NAQ].*:m", ":(?:e|f|P|G|W|[1-3][sp]|Y)") -1>> le                             # Accord de genre erroné : « \2 » est masculin.
    <<- __also__ and hasFemForm(\2) -2>> =suggFemSing(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant féminin.
    <<- __else__ and morph(\2, ":[NAQ].*:p") -2>> =suggFemSing(@)                                   # Accord de nombre erroné : « \2 » devrait être au singulier.
__[i]/gn(gn_la_accord2)__
    ({w_1}) +(la) +({w_2})  @@0,w,$
    <<- morph(\2, ":D", False) >>>
    <<- morphex(\3, ":[NAQ].*:m", ":(?:e|f|P|G|W|[1-3][sp]|Y)")
        or ( morphex(\3, ":[NAQ].*:m", ":[fe]") and morphex(\1, ":[RC]", ">(?:e[tn]|ou)/") and not (morph(\1, ":(?:Rv|C)", False) and morph(\3, ":Y", False)) )
    -2>> le                                                                                         # Accord de genre erroné : « \3 » est masculin.
    <<- __also__ and hasFemForm(\3) -3>> =suggFemSing(@, True)                                      # Accord de genre erroné : « \2 » est un déterminant féminin.
    <<- __else__ and morph(\3, ":[NAQ].*:p")
        or ( morphex(\3, ":[NAQ].*:p", ":[si]") and morphex(\1, ":[RC]", ">(?:e[tn]|ou)/") and not (morph(\1, ":Rv", False) and morph(\3, ":Y", False)) )
    -3>> =suggFemSing(@)                                                                            # Accord de nombre erroné : « \3 » devrait être au singulier.
__[i]/gn(gn_la_accord3)__
    ^ *(la) +({w_2})  @@*,$
    <<- morphex(\2, ":[NAQ].*:m", ":[efPGWY]") -1>> le                                              # Accord de genre erroné : « \2 » est masculin.
    <<- __also__ and hasFemForm(\2) -2>> =suggFemSing(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant féminin.
    <<- __else__ and morphex(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggFemSing(@)                      # Accord de nombre erroné : « \2 » devrait être au singulier.




TEST: c’est ennuyeux, la {{parties}} deux est ratée.
TEST: {{La}} Cameroun                                         ->> Le
TEST: {{La}} mustang est un cheval sauvage.                   ->> Le
TEST: {{La}} tableau.                                         ->> Le
TEST: dans la {{parties}}                                     ->> partie
TEST: de {{la}} vin                                           ->> le
TEST: {{la}} {{véhicule}}
TEST: {{La}} {{pris}}
TEST: la force de la {{formes}} parfaite


__[i]/gn(gn_ladite_accord)__
    (ladite) +({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ].*:m", ":[efGW]") -1>> ledit                                             # Accord de genre erroné : « \2 » est masculin.
    <<- __also__ and hasFemForm(\2) -2>> =suggFemSing(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant féminin.
    <<- morphex(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggFemSing(@)                                   # Accord de nombre erroné : « \2 » devrait être au singulier.

TEST: ladite {{passions}} l’avait conduit à sa perte.


__[i]/gn(gn_une_accord)__
    (une) +({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ].*:m", ":(?:e|f|G|W|V0|3s|P)") and not ( \2 == "demi" and morph(word(1), ":N.*:f") )
    -1>> un                                                                                         # Accord de genre erroné : « \2 » est masculin.
    <<- __also__ and hasFemForm(\2) -2>> =suggFemSing(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant féminin.
    <<- morphex(\2, ":[NAQ].*:p", ":[siGW]") and not morph(word(-2), ":B", False) -2>> =suggFemSing(@) # Accord de nombre erroné : « \2 » devrait être au singulier.

__[i]/gn(gn_une_des_accord)__
    (une) +des +({w_2})  @@0,$

    <<- morphex(\2, ":[NAQ].*:m", ":(?:e|f|G|W|V0|3s)") -1>> un                                     # Accord de genre erroné : « \2 » est masculin.
    <<- __also__ and hasFemForm(\2) -2>> =suggFemPlur(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant féminin.

TEST: un {{slashs}}                                           ->> slash
TEST: un {{fromages}}.                                        ->> fromage
TEST: Un {{ballons}}                                          ->> ballon
TEST: Une {{cinglées}}                                        ->> cinglée


__[i]/gn(gn_cette_accord)__
    (cette) +({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ].*:m", ":[efGW]") -1>> =suggCeOrCet(\2)                                  # Accord de genre erroné : « \2 » est masculin.
    <<- __also__ and hasFemForm(\2) -2>> =suggFemSing(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant féminin.
    <<- morphex(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggFemSing(@)                                   # Accord de nombre erroné : « \2 » devrait être au singulier.
__[i]/gn(gn_ma_ta_sa_accord)__
    ([mts]a) +({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ].*:m", ":[efGW]") -1>> =\1.replace("a", "on")                            # Accord de genre erroné : « \2 » est masculin.
    <<- __also__ and not re.search("(?i)^[aâeéèêiîoôuûyœæ]", \2) and hasFemForm(\2)
    -2>> =suggFemSing(@, True)                                                                      # Accord de genre erroné : « \1 » est un déterminant féminin.
    <<- morphex(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggFemSing(@)                                   # Accord de nombre erroné : « \2 » devrait être au singulier.

TEST: {{une}} des {{chats}}
TEST: {{ma}} {{parti}}
TEST: {{ma}} amour                                            ->> mon
TEST: {{une}} kyste                                           ->> un
TEST: {{Cette}} {{animal}} mort.


__[i]/gn(gn_certains_accord)__
    (certains) +({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ].*:f", ":[emGWP]") -1>> certaines                                        # Accord de genre erroné : « \2 » est féminin.
    <<- __also__ and hasMasForm(\2) -2>> =suggMasPlur(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant masculin.
    <<- (morphex(\2, ":[NAQ].*:s", ":(?:[ipGWP]|V0)")
        and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False)))
        or \1 in aREGULARPLURAL
    -2>> =suggPlur(@)                                                                               # Accord de nombre erroné : « \2 » devrait être au pluriel.
__[i]/gn(gn_certains_des_accord)__
    (certains) +des +({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ].*:f", ":[emGW]") -1>> certaines                                         # Accord de genre erroné : « \2 » est féminin.
    <<- __also__ and hasMasForm(\2) -2>> =suggMasPlur(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant masculin.

__[i]/gn(gn_certaines_accord)__
    (certaines) +({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ].*:m", ":[efGWP]") -1>> certains                                         # Accord de genre erroné : « \2 » est masculin.
    <<- __also__ and hasFemForm(\2) -2>> =suggFemPlur(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant féminin.
    <<- (morphex(\2, ":[NAQ].*:s", ":[ipGWP]")
        and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False)))
        or \2 in aREGULARPLURAL
    -2>> =suggPlur(@)                                                                               # Accord de nombre erroné : « \2 » devrait être au pluriel.
__[i]/gn(gn_certaines_des_accord)__
    (certaines) +des ({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ].*:m", ":[efGW]") -1>> certains                                          # Accord de genre erroné : « \2 » est masculin.
    <<- __also__ and hasFemForm(\2) -2>> =suggFemPlur(@, True)                                      # Accord de genre erroné : « \1 » est un déterminant féminin.

TEST: Certaines {{danse}}
TEST: Certains {{chien}}
TEST: {{certains}} des {{nouvelles}} sont à côté de la plaque.
TEST: {{certaines}} des hommes
TEST: Un problème rapporté par certains est l’incapacité à trouver un partenaire


## Singuliers épicènes

__<i]/gn(gn_leur_accord1)__
    , +(leur) +({w_2})  @@w,$
    <<- morph(\2, ":[NAQ].*:p") -1>> leurs                                                          # Accord de nombre erroné avec « \2 ».
    <<- __also__ -2>> =suggSing(@)                                                                  # Accord de nombre erroné : « \2 » devrait être au singulier.
__[i]/gn(gn_leur_accord2)__
    ({w_1}) +(leur) +({w_2})  @@0,w,$
    <<- morph(\3, ":[NAQ].*:p")
        or ( morphex(\3, ":[NAQ].*:p", ":[si]") and morphex(\1, ":[RC]|>de/", ">(?:e[tn]|ou)/") and not (morph(\1, ":Rv", False) and morph(\3, ":Y", False)) )
    -2>> leurs                                                                                      # Accord de nombre erroné avec « \3 ».
    <<- __also__ -3>> =suggSing(@)                                                                  # Accord de nombre erroné : « \3 » devrait être au singulier.
__<i]/gn(gn_leur_accord3)__
    ^ *(leur) +({w_2})  @@*,$
    <<- morphex(\2, ":[NAQ].*:p", ":[siGW]") -1>> leurs                                             # Accord de nombre erroné avec « \1 ».
    <<- __also__ -2>> =suggSing(@)                                                                  # Accord de nombre erroné : « \2 » devrait être au singulier.

TEST: Tu sais, {{leur}} {{impatiences}} est notoire.
TEST: J’en ai assez de {{leur}} {{délires}}
TEST: {{Leur}} {{perceptions}} des choses m’exaspère.
TEST: dans {{leur}} {{usines}}


__[i]/gn(gn_notre_votre_chaque_accord)__
    (?:[nv]otre|chaque) +({w_2})  @@$
    <<- morphex(\1, ":[NAQ].*:p", ":[siGW]") -1>> =suggSing(@)                                      # Accord de nombre erroné : « \1 » devrait être au singulier.

TEST: Chaque {{chiens}}.                                      ->> chien


__[i]/gn(gn_quelque_accord)__
    (quelque) +({w_2})(?! que?)  @@0,$
    <<- morphex(\2, ":[NAQ].*:p", ":[siG]") -1>> quelques                                           # Il manque un “s” à « quelque » ou « \2 » doit être au singulier.

TEST: {{Quelque}} amis




















## Pluriels épicènes

__<i]/gn(gn_les_accord1)__
    , (les) +({w_2})  @@w,$
    <<- ( morph(\2, ":[NAQ].*:s") and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False)) )
................................................................................
!!!
!!!
!!! Processeur: simplification des substantifs                                                    !!
!!!
!!!

### @ : we remove @ we introduced after le/la/les in some cases
__<s>(p_arobase)__      @ <<- ~>> *

### Avant les verbes (ôter seulement les COI!)
__[i](p_ne_leur_lui)__  ne (leur|lui)(?! en) @@3 <<- ~1>> *

### Après les verbes
__[i](p_jamais2)__      jamais <<- ~>> *
#__[i](p_guère)__        guère <<- ~>> *
................................................................................
    \w+-(?:je|tu|ils?|elles?|on|[nv]ous) (pas|point|rien|bien|ensemble) @@$ <<- ~1>> *

# sembler le croire/penser/présumer/supposer/envisager/imaginer
__[i](p_que_semble_le_penser)__
    que +(sembl\w+) +(l(?:e (?:penser|croire|présumer|supposer)|’(?:envisager|imaginer))) @@w,$
    <<- morph(\1, ">sembler/", False) ~2>> *

### tous / tout / toute / toutes
__[i](p_tout_det_mas)__     (tout) (?:le|ce|[mts]on|leur) @@0 <<- ~1>> *
__[i](p_toute_det_fem)__    (toute) (?:la|cette|[mts](?:a|on)|leur) @@0 <<- ~1>> *
__[i](p_tous_det_plur)__    (tou(?:te|)s) (?:[csmlt]es|[vn]os|leurs) @@0 <<- ~1>> *

### Simplification des groupes nominaux

# désambiguïsation - pour contrer le faux positif qui veut accorder fois avec le participe passé de la proposition suivante
__[s](p_fois_que)__         (fois )que? @@0 <<- ~1>> fois=
__[i](p_que_l_on)__         que (l’)on  @@4 <<- ~1>> *








|







 







|







 







|




>
>







 







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







 







>
>
>
>
>







 







>
>
>
>
>
>
>
>
>









>
>
|
<
<
>
|




<
<
|
>
|
|
|
<
|
>
|
<
|
|
|
|
|
|
|
|
|
>
|
|
|
|
<
|









|
<
>
|
|
|
>
|
|
|
|
|
>
|
<
>
|
|
>
|
<
>
|
|
|
>
|
<
>
|
|
|
|
>
|
<
>
|
|
|
|
>
|
<
>
|
|
|
|
>
|
<
>
|
|
|
|







 







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












|
|
|
|
|




|
|
|
|
|
|
>
|
<
>
|
|





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







 







|







 







<
<
<
<







7894
7895
7896
7897
7898
7899
7900
7901
7902
7903
7904
7905
7906
7907
7908
....
8486
8487
8488
8489
8490
8491
8492
8493
8494
8495
8496
8497
8498
8499
8500
....
8525
8526
8527
8528
8529
8530
8531
8532
8533
8534
8535
8536
8537
8538
8539
8540
8541
8542
8543
8544
8545
....
8548
8549
8550
8551
8552
8553
8554
8555
8556
8557
8558
8559
8560
8561
8562
8563
8564
8565
8566
8567
8568
8569
8570
8571
8572
8573
8574
8575
8576
8577
8578
8579
8580
8581
8582
8583
8584
8585
8586
8587
8588
8589
8590
8591
8592
8593
8594
8595
8596
8597
8598
8599
8600
8601
8602
8603
8604
8605
8606
8607
8608
8609
8610
8611
8612
8613
8614
8615
8616
8617
8618
8619
8620
8621
8622
8623
8624
8625
8626
8627
8628
8629
8630
8631
8632
8633
8634
8635
8636
8637
8638
8639
8640
8641
8642
8643
8644
8645
8646
8647
8648
8649
8650
8651
8652
8653
8654
8655
8656
8657
8658
8659
8660
8661
8662
8663
8664
8665
8666
8667
8668
8669
8670
8671
8672
8673
8674
8675
8676
8677
8678
8679
8680
8681
8682
8683
8684
8685
8686
8687
8688
8689
8690
8691
8692
8693
8694
8695
8696
8697
8698
8699
8700
8701
8702
8703
8704
8705
8706
8707
8708
8709
8710
8711
8712
8713
8714
8715
8716
8717
8718
8719
8720
8721
8722
8723
8724
8725
8726
8727
8728
8729
8730
....
8816
8817
8818
8819
8820
8821
8822
8823
8824
8825
8826
8827
8828
8829
8830
8831
8832
8833
8834
....
8841
8842
8843
8844
8845
8846
8847
8848
8849
8850
8851
8852
8853
8854
8855
8856
8857
8858
8859
8860
8861
8862
8863
8864
8865
8866
8867
8868


8869
8870
8871
8872
8873
8874


8875
8876
8877
8878
8879

8880
8881
8882

8883
8884
8885
8886
8887
8888
8889
8890
8891
8892
8893
8894
8895
8896

8897
8898
8899
8900
8901
8902
8903
8904
8905
8906
8907

8908
8909
8910
8911
8912
8913
8914
8915
8916
8917
8918
8919

8920
8921
8922
8923
8924

8925
8926
8927
8928
8929
8930

8931
8932
8933
8934
8935
8936
8937

8938
8939
8940
8941
8942
8943
8944

8945
8946
8947
8948
8949
8950
8951

8952
8953
8954
8955
8956
8957
8958
8959
8960
8961
8962
8963
....
8965
8966
8967
8968
8969
8970
8971
8972
8973
8974
8975
8976
8977
8978
8979
8980
8981
8982
8983
8984
8985
8986
8987
8988
8989
8990
8991
8992
8993
8994
8995
8996
8997
8998
8999
9000
9001
9002
9003
9004
9005
9006
9007
9008
9009
9010
9011
9012
9013
9014
9015
9016
9017
9018
9019
9020
9021
9022
9023
9024
9025

9026
9027
9028
9029
9030
9031
9032
9033
9034
9035
9036
9037
9038
9039
9040
9041
9042
9043
9044
9045
9046
9047
9048
9049
9050
9051
9052
9053
9054
9055
9056
9057
9058
9059
9060
9061
9062
9063
9064
9065
9066
9067
9068
9069
9070
9071
9072
9073
9074
9075
9076
9077
9078
9079
9080
9081
9082
9083
9084
9085
9086
9087
9088
9089
9090
9091
9092
9093
9094
9095
9096
9097
9098
9099
9100
9101
9102
9103
9104
9105
9106
9107
9108
9109
9110
9111
9112
9113
9114
9115
9116
9117
9118
9119
9120
9121
9122
9123
9124
9125
9126
9127
9128
9129
9130
9131
9132
9133
9134
9135
9136
9137
9138
9139
9140
9141
9142
9143
9144
9145
9146
9147
.....
12228
12229
12230
12231
12232
12233
12234
12235
12236
12237
12238
12239
12240
12241
12242
.....
12246
12247
12248
12249
12250
12251
12252




12253
12254
12255
12256
12257
12258
12259
    ~-[lL][àÀ]$
        <<- morph(\1, ":[NAQ]", ":G", 0, -3) ~>> =\1[:-3]

TEST: cette femme-là {{étaient}} partout.


__simplification_des_nombres__
    [vingt|trente|quarante|cinquante|soixante|soixante-dix|septante|quatre-vingt|octante|huitante|quatre-vingt-dix|nonante|mille] et [un|une|onze]
        <<- ~>> \1-et-\3||
        <<- ~2:3>> *

    [deux|trois|quatre|cinq|six|sept|huit|neuf|onze|douze|treize|quatorze|quinze|seize|dix-sept|dix-huit|dix-neuf]  cents  @:[NAQ].*:[pi]¬:(?:G|3p)
        <<- ~1:2>> ␣

    [deux|trois|quatre|cinq|six|sept|huit|neuf] ?cent¿ mille
................................................................................
    quelque peu                 @:[AW]
    pas très                    @:[AW]
        <<- ~1:2>> *

    un ?petit¿  peu ?[plus|moins]¿
        <<- morph(>1, ":[AW]") ~>> *

    [bien|mal|fort|plus|moins|peu] @:[AW]
        <<- ~1>> *

    si  @:[AW]
        <<- not (\2 == "bien" and value(>1, "|que|")) ~1>> *

    un [brin|chouia|chouïa|rien|minimum|soupçon|tantinet]  ?trop¿
        <<- morph(>1, ":A", ":G") ~>> *
................................................................................
        <<- ~1>> *


@@@@
@@@@
@@@@
@@@@
@@@@GRAPH: purge_passe2                                                                            _
@@@@
@@@@
@@@@
@@@@

## Seconde passe (il faut réorganiser tout le cycle de simplification)

__purge_ponctuations__
    ,   ,
    (   )
    [   ]
    <   >
    [-|–|—]  [-|–|—]
................................................................................
    <start>  ,
        <<- ~2>> *

    ,  <end>
        <<- ~1>> *


__purge_locutions_potentielles__
    à [mes|tes|ses|nos|vos|leurs] yeux  @¬:A.*:[me]:[pi]
        <<- ~1:3>> *

    à la dernière [minute|seconde]  @¬:A.*:[fe]:[si]
        <<- ~1:4>> *

    à l’ époque  @¬:A.*:[fe]:[si]
        <<- ~1:3>> *

    au pire  @:A¬:N:[me]:[si]
        <<- ~1:2>> *

    [<start>|,] ben voyons
        <<- ~2:3>> *

    chaque [année|semaine|journée|décennie]  @¬:(?:A.*:[fe]:[si]|Oo|[123][sp])
        <<- ~1:2>> *

    chaque [an|jour|mois]  @¬:(?:A.*:[me]:[si]|Oo|[123][sp])
        <<- ~1:2>> *

    d’ évidence  @¬:A.*:[fe]:[si]
        <<- ~1:2>> *

    dans l’ ensemble  @¬:A.*:[me]:[si]
        <<- ~1:3>> *

    de ce fait  @¬:A.*:[me]:[si]
        <<- ~1:3>> *

    de ce seul fait  @¬:A.*:[me]:[si]
        <<- ~1:4>> *

    dès le départ  @¬:A.*:[me]:[si]
        <<- ~1:3>> *

    dès les premiers [jours|mois|ans|siècles|trimestres|semestres]  @¬:A.*:[me]:[pi]
        <<- ~1:4>> *

    dès les premières [années|semaines|minutes|secondes|heures|décennies]  @¬:A.*:[fe]:[pi]
        <<- ~1:4>> *

    en [certaines|quelques|plusieurs] occasions  @¬:A.*:[fe]:[pi]
        <<- ~1:3>> *

    en de multiples occasions  @¬:A.*:[fe]:[pi]
        <<- ~1:4>> *

    entre autres choses  @¬:A.*:[fe]:[pi]
        <<- ~1:3>> *

    [quelques|plusieurs] [secondes|minutes|heures|journées|semaines|années|décennies]  @¬:A.*:[fe]:[pi]
        <<- ~1:2>> *

    de nombreuses [secondes|minutes|heures|journées|semaines|années|décennies]  @¬:A.*:[fe]:[pi]
        <<- ~1:3>> *

    [quelques|plusieurs] [instants|moments|jours|mois|ans|siècles]  @¬:A.*:[me]:[pi]
        <<- ~1:2>> *

    de nombreux [instants|moments|jours|mois|ans|siècles]  @¬:A.*:[me]:[pi]
        <<- ~1:3>> *

    un [instant|moment|jour]  @¬:A.*:[me]:[si]
        <<- ~1:2>> *


__purge_tous_deux_trois__
    >faire tous [deux|trois]
        <<- ~2:0>> *

    >faire tous
        <<- morph(\1, ":[123]p") or (\1 == "fait" and before(r"(?i)\bon ")) ~2>> *

@@@@
@@@@
@@@@
@@@@
@@@@GRAPH: purge_passe3                                                                            _
@@@@
@@@@
@@@@
@@@@

__purge_locutions_verbales__
    >arriver à échéance
    >arriver à point nommé
    [>donner|>redonner] sens
    >faire [allusion|assaut|chaud|confiance|compliqué|copain-copain|débat|défaut|demi-tour|envie|figure|froid|halte|honte|illusion|mouche|office|part|peur|plaisir|rage|scandale|sens|signe|volte-face]
    >faire amende honorable
    >faire bande à part
    >faire bonne figure
    >faire copain copain
    >faire de [mon|ton|son|notre|votre|leur] mieux
    >faire long feu
    >faire [machine|marche] arrière
    >faire main basse
    >faire partie ?intégrante¿
    >faire fausse route
    >faire front commun
    >faire grise mine
    >faire grand [bruit|cas]
    >faire profil bas
    >faire salle comble
    >faire table rase
    >faire ce que bon [me|te|lui|nous|vous|leur] semble
    >laisser pour compte
    >mettre à [bas|jour|niveau|plat|terre]
    >mettre l’ [écart|épreuve]
    >mettre au [point|pas]
    >mettre en [avant|bouche|demeure|garde|jeu|lumière|œuvre|place|scène|terre]
    >mourir jeune
    [>paraître|>paraitre] jeune
    >porte [atteinte|bonheur|caution|chance|malheur|plainte|préjudice|secours]
    >prendre ?[ça|cela|ceci]¿ à la légère
    >prendre [congé|conscience|contact|ombrage|racine|soin|vie]
    >prendre ?[ça|cela|ceci]¿ au [dépourvu|sérieux]
    >prendre de court
    >prendre ?[ça|cela|ceci]¿ en charge
    >prendre ?[ça|cela|ceci]¿ pour argent comptant
    >prendre par surprise
    >prêter main-forte
    >rester lettre morte
    >rester lettres mortes
    >suivre ?[ça|cela|ceci]¿ de près
    >tenir ?[ça|cela|ceci]¿ à distance ?respectable¿
    >tenir compte
    >tenir au courant
    >trier sur le volet
    >tirer [avantage|profit]
    >tourner court
    >venir je ne sais ?pas¿ ?trop¿ d’ où
    >venir on ne sait ?pas¿ ?trop¿ d’ où
        <<- ~2:0>> *

    [>sembler|>paraître|>paraitre] être @:A¬:G
        <<- ~2>> *

    [>sembler|>paraître|>paraitre] avoir été @:A¬:G
        <<- ~2:3>> *


__conf_locutions_verbales__
    >arriver a échéance
    >arriver a point nommé
    >mettre a [bas|jour|niveau|plat|terre]
    >mettre a l’ [écart|épreuve]
    >prendre a la légère
    >tenir a distance
        <<- /conf/ -2>> à               # Confusion : “a” est une conjugaison du verbe “avoir”. Pour la préposition, écrivez “à”.

    >laisser pour [comte|comtes|>conte]
        <<- /conf/ -3>> compte          # Confusion. Locution “laisser pour compte”.|https://fr.wiktionary.org/wiki/laisser_pour_compte

    [>mourir|>paraître|>paraitre|>rester|>sembler] >jeûne
        <<- /conf/ -2>> jeune           # Confusion. Le jeûne est une privation de nourriture.|https://fr.wiktionary.org/wiki/jeune

    >rendre ?bon¿ ([comte|comtes|>conte|comptes])
        <<- /conf/ -1>> compte          # Confusion. Locution “rendre compte”.|https://fr.wiktionary.org/wiki/rendre_compte

    >suivre ?[ça|cela|ceci]¿ de ([>prêt|>pré])
        <<- /conf/ -1>> près            # Confusion : écrivez “près” pour dire “proche de quelque chose”.|https://fr.wiktionary.org/wiki/pr%C3%A8s

    >tenir [comte|comtes|>conte|comptes]
        <<- /conf/ -2>> compte          # Confusion. Locution “tenir compte”.|https://fr.wiktionary.org/wiki/tenir_compte

    >tourner [coure|courre|cour|cours]
        <<- /conf/ -2>> court           # Confusion. Locution “tourner court”.|https://fr.wiktionary.org/wiki/tourner_court

TEST: ce contrat arrive {{a}} échéance.
TEST: il faut tenir {{contes}} des faits au lieu de nos impressions.
TEST: prendre {{a}} la légère ce test serait une erreur.
TEST: on va suivre ça de {{prêt}}.
TEST: il faut se tenir {{a}} distance de ces gens-là.
TEST: cette expérience ne va pas tarder à tourner {{cours}}.
................................................................................
TEST: c’est une vache à lait
TEST: Ses talons aiguille étaient à la denière mode.
TEST: elles seules peuvent s’en sortir.
TEST: elle seule peut y arriver
TEST: elle seules les femmes la font craquer


@@@@
@@@@END_GRAPH                                                                                      _
@@@@



#
# //////////////////////////////////////// RÈGLES DE CONTRÔLE ////////////////////////////////////////
#


!!!! Redondances dans la phrase                                                                   !!
................................................................................
TEST: __redon2__ Quelle {{imposture}}, c’est d’un ennui, c’est une {{imposture}}.
TEST: __redon2__ ils sont là côte à côte.
TEST: __redon2__ Tu avances petit à petit, et tu réussis.
TEST: __redon2__ De loin en loin, elle passe.
TEST: __redon2__ Les mêmes causes produisent/produisant les mêmes effets. (répétition)


@@@@
@@@@
@@@@
@@@@
@@@@GRAPH: après_purge_locutions                                                                   _
@@@@
@@@@
@@@@
@@@@

!!
!!
!!!! Groupe nominal (1)                                                                           !!
!!
!!

#### 1 mot

## Singulier masculin

__gn_l_accord__


    l’  @:[NAQ].*:p¬:[123][sp]|:[si]
        <<- /gn/ -2>> =suggSing(\2)                                                                 # Accord de nombre erroné :  « \1 » devrait être au singulier.

TEST: toute l’importance de l’{{accords}} musical.




__gn_le_accord__
    ,  le  *WORD
        <<- /gn/ morph(\3, "@:[NAQ].*:f", ":(?:e|m|P|G|W|[123][sp]|Y)") -2>> =suggLesLa(\2)         # Accord de genre erroné : « \3 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\3) -3>> =suggMasSing(\3, True)                            # Accord de genre erroné : « \2 » est un déterminant masculin.
        <<- /gn/ __else__ and morph(\3, ":[NAQ].*:p") -3>> =suggMasSing(\3)                         # Accord de nombre erroné : « \3 » devrait être au singulier.

        <<- /gn/ __also__ -2>> les                                                                  # Accord de nombre erroné : « \3 » est au pluriel.

    *WORD  le  *WORD

        <<- /gn/ morph(\2, ":D") >>>
        <<- morph(\3, ":[NAQ].*:f", ":(?:e|m|P|G|W|[123][sp]|Y)")
            or ( morph(\3, ":[NAQ].*:f", ":[me]") and morph(\1, ":R", ">(?:e[tn]|ou)/") and not (morph(\1, ":Rv") and morph(\3, ":Y")) )
        -2>> =suggLesLa(\2)                                                                         # Accord de genre erroné : « \3 » est féminin.
        <<- __also__ and hasMasForm(\3) -3>> =suggMasSing(\3, True)                                 # Accord de genre erroné : « \2 » est un déterminant masculin.
        <<- __else__ and morph(\3, ":[NAQ].*:p", "*")
            or ( morph(\3, ":[NAQ].*:p", ":[si]") and morph(\1, ":[RC]", ">(?:e[tn]|ou)/") and not (morph(\1, ":Rv") and morph(\3, ":Y")) )
        -3>> =suggMasSing(\3)                                                                       # Accord de nombre erroné : « \3 » devrait être au singulier.
        <<- __also__ -2>> les                                                                       # Accord de nombre erroné : « \3 » est au pluriel.

    <start>  le  *WORD
        <<- /gn/ morph(\3, ":[NAQ].*:f", ":(?:e|m|P|G|W|Y)") -2>> =suggLesLa(\2)                    # Accord de genre erroné : « \3 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\3) -3>> =suggMasSing(\3, True)                            # Accord de genre erroné : « \2 » est un déterminant masculin.
        <<- /gn/ __else__ and morph(\3, ":[NAQ].*:p", ":[siGW]") -3>> =suggMasSing(\3)              # Accord de nombre erroné : « \3 » devrait être au singulier.

        <<- /gn/ __also__ -2>> les                                                                  # Accord de nombre erroné : « \3 » est au pluriel.

TEST: c’est une catastrophe, {{le}} {{profits}} a baissé ces deux derniers trimestres
TEST: {{Le}} démoralisation.                                  ->> La
TEST: {{Le}} Guyane française.                                ->> La
TEST: avec {{le}} {{pile}}
TEST: {{le}} {{publique}}
TEST: {{Le}} {{pendue}}


__gn_ledit_accord__

    ledit  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:f", ":[GWme]") -1>> ladite                             # Accord de genre erroné : « \2 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant masculin.
        <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(\2)                   # Accord de nombre erroné : « \2 » devrait être au singulier.

__gn_un_accord__
    un  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:f", ":(?:e|m|G|W|V0|3s|Y)") -1>> une                   # Accord de genre erroné : « \2 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant masculin.
        <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(\2)                   # Accord de nombre erroné : « \2 » devrait être au singulier.

__gn_un_des_accord__

    un  des  *WORD
        <<- /gn/ morph(\3, ":[NAQ].*:f", ":(?:e|m|G|W|V0|3s)") -1>> une                     # Accord de genre erroné : « \2 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\3) -3>> =suggMasPlur(\3, True)                    # Accord de genre erroné : « \1 » est un déterminant masculin.

__gn_du_accord__

    du  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:f", ":[GWme]") -1>> de la                              # Accord de genre erroné : « \2 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant masculin.
        <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(\2)                   # Accord de nombre erroné : « \2 » devrait être au singulier.

__gn_cet_accord__

    cet  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:f", ":[GWme]") -1>> cette                              # Accord de genre erroné : « \2 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant masculin.
        <<- /gn/ morph(\2, ">[bcçdfgjklmnpqrstvwxz].+:[NAQ].*:m", ":[efGW]") -1>> ce        # Accord de genre correct, mais euphonie non respectée.|http://fr.wikipedia.org/wiki/Euphonie
        <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(\2)                   # Accord de nombre erroné : « \2 » devrait être au singulier.

__gn_ce_accord__

    ce  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:f", ":(?:3s|[GWme])") -1>> cette                       # Accord de genre erroné : « \2 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant masculin.
        <<- /gn/ morph(\2, ":[NAQ].*:f", ":[GWme]") and morph(\2, ":3s") -1>> cette|se      # Accord de genre erroné : « \2 » est féminin. Ou bien vous confondez le déterminant “ce” avec le pronom “se”.
        <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(\2)                   # Accord de nombre erroné : « \2 » devrait être au singulier.

__gn_mon_ton_son_accord__

    [mon|ton|son]  *WORD
        <<- /gn/ morph(\1, ":D") >>>
        <<- /gn/ morph(\2, ">[bcdfgjklmnpqrstvwxz].*:[NAQ].*:f", ":[GWme]") -1>> =\1.replace("on", "a")     # Accord de genre erroné : « \2 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant masculin.
        <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(\2)                   # Accord de nombre erroné : « \2 » devrait être au singulier.

__gn_au_accord__

    au  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:f:s", ":[GWme]") -1>> à la                             # Accord de genre erroné : « \2 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant masculin.
        <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(\2)                   # Accord de nombre erroné : « \2 » devrait être au singulier.
        <<- /gn/ __also__ -1>> aux                                                          # Accord de nombre erroné : « \2 » est au pluriel.

TEST: ledit {{accords}} ne vaut rien.
TEST: {{au}} {{États-Unis}}
TEST: {{Un}} {{amie}}
TEST: {{Cet}} {{idiote}}.
TEST: {{cet}} ballon.                                         ->> ce
TEST: {{Ce}} animal.                                          ->> Cet
................................................................................
TEST: {{une}} des {{chats}}
TEST: {{mon}} {{chienne}}
TEST: cet {{oliviers}}
TEST: ce {{claviers}}
TEST: cette bouffe, c’est du {{chiens}}
TEST: le ton monte.
TEST: Ces enfants n’ont jamais vu quelqu’un lire.
TEST: Trente et un hommes sur le pont.


## Singulier féminin

__gn_la_accord__
    ,  la  *WORD
        <<- /gn/ morph(\3, ":[NAQ].*:m", ":(?:e|f|P|G|W|[1-3][sp]|Y)") -2>> le              # Accord de genre erroné : « \3 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\3) -3>> =suggFemSing(\3, True)                    # Accord de genre erroné : « \2 » est un déterminant féminin.
        <<- /gn/ __else__ and morph(\3, ":[NAQ].*:p") -3>> =suggFemSing(\3)                 # Accord de nombre erroné : « \3 » devrait être au singulier.

    *WORD  la  *WORD
        <<- /gn/ morph(\2, ":D") >>>
        <<- morph(\3, ":[NAQ].*:m", ":(?:e|f|P|G|W|[1-3][sp]|Y)")
            or ( morph(\3, ":[NAQ].*:m", ":[fe]") and morph(\1, ":[RC]", ">(?:e[tn]|ou)/") and not (morph(\1, ":(?:Rv|C)") and morph(\3, ":Y")) )
        -2>> le                                                                             # Accord de genre erroné : « \3 » est masculin.
        <<- __also__ and hasFemForm(\3) -3>> =suggFemSing(\3, True)                         # Accord de genre erroné : « \2 » est un déterminant féminin.
        <<- __else__ and morph(\3, ":[NAQ].*:p")
            or ( morph(\3, ":[NAQ].*:p", ":[si]") and morph(\1, ":[RC]", ">(?:e[tn]|ou)/") and not (morph(\1, ":Rv") and morph(\3, ":Y")) )
        -3>> =suggFemSing(\3)                                                               # Accord de nombre erroné : « \3 » devrait être au singulier.

    <start>  la  *WORD
        <<- /gn/ morph(\3, ":[NAQ].*:m", ":[efPGWY]") -2>> le                               # Accord de genre erroné : « \3 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\3) -3>> =suggFemSing(\3, True)                    # Accord de genre erroné : « \2 » est un déterminant féminin.
        <<- /gn/ __else__ and morph(\3, ":[NAQ].*:p", ":[siGW]") -3>> =suggFemSing(\3)      # Accord de nombre erroné : « \3 » devrait être au singulier.

TEST: c’est ennuyeux, la {{parties}} deux est ratée.
TEST: {{La}} Cameroun                                         ->> Le
TEST: {{La}} mustang est un cheval sauvage.                   ->> Le
TEST: {{La}} tableau.                                         ->> Le
TEST: dans la {{parties}}                                     ->> partie
TEST: de {{la}} vin                                           ->> le
TEST: {{la}} {{véhicule}}
TEST: {{La}} {{pris}}
TEST: la force de la {{formes}} parfaite


__gn_ladite_accord__
    ladite  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:m", ":[efGW]") -1>> ledit                              # Accord de genre erroné : « \2 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggFemSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant féminin.
        <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggFemSing(\2)                   # Accord de nombre erroné : « \2 » devrait être au singulier.

TEST: ladite {{passions}} l’avait conduit à sa perte.


__gn_une_accord__
    une  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:m", ":(?:e|f|G|W|V0|3s|P)") and not ( \2 == "demi" and morph(>1, ":N.*:f", "*") )
        -1>> un                                                                             # Accord de genre erroné : « \2 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggFemSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant féminin.
        <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggFemSing(\2)                   # Accord de nombre erroné : « \2 » devrait être au singulier.

__gn_une_des_accord__

    une  des  *WORD
        <<- /gn/ morph(\3, ":[NAQ].*:m", ":(?:e|f|G|W|V0|3s)") -1>> un                      # Accord de genre erroné : « \3 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\3) -3>> =suggFemPlur(\3, True)                    # Accord de genre erroné : « \1 » est un déterminant féminin.

TEST: un {{slashs}}                                           ->> slash
TEST: un {{fromages}}.                                        ->> fromage
TEST: Un {{ballons}}                                          ->> ballon
TEST: Une {{cinglées}}                                        ->> cinglée
TEST: {{une}} des {{joueurs}}
TEST: mille et une merveilles


__gn_cette_accord__
    cette  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:m", ":[efGW]") -1>> =suggCeOrCet(\2)                   # Accord de genre erroné : « \2 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggFemSing(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant féminin.
        <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggFemSing(\2)                   # Accord de nombre erroné : « \2 » devrait être au singulier.

__gn_ma_ta_sa_accord__
    [ma|ta|sa]  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:m", ":[efGW]") -1>> =\1[:-1]+"on"                      # Accord de genre erroné : « \2 » est masculin.
        <<- /gn/ __also__ and not re.search("(?i)^[aâeéèêiîoôuûyœæ]", \2) and hasFemForm(\2)
        -2>> =suggFemSing(\2, True)                                                         # Accord de genre erroné : « \1 » est un déterminant féminin.
        <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggFemSing(\2)                   # Accord de nombre erroné : « \2 » devrait être au singulier.

TEST: {{une}} des {{chats}}
TEST: {{ma}} {{parti}}
TEST: {{ma}} amour                                            ->> mon
TEST: {{une}} kyste                                           ->> un
TEST: {{Cette}} {{animal}} mort.


## Singuliers épicènes

__gn_leur_accord__
    ,  leur  *WORD
        <<- /gn/ morph(\3, ":[NAQ].*:p", "*") -2>> leurs                                    # Accord de nombre erroné avec « \3 ».
        <<- /gn/ __also__ -3>> =suggSing(\3)                                                # Accord de nombre erroné : « \3 » devrait être au singulier.

    *WORD  leur  *WORD
        <<- /gn/ morph(\3, ":[NAQ].*:p", "*")
            or ( morph(\3, ":[NAQ].*:p", ":[si]") and morph(\1, ":[RC]|>de/", ">(?:e[tn]|ou)/") and not (morph(\1, ":Rv") and morph(\3, ":Y")) )
        -2>> leurs                                                                          # Accord de nombre erroné avec « \3 ».
        <<- /gn/ __also__ -3>> =suggSing(\3)                                                # Accord de nombre erroné : « \3 » devrait être au singulier.

    <start>  leur  *WORD
        <<- /gn/ morph(\3, ":[NAQ].*:p", ":[siGW]") -2>> leurs                              # Accord de nombre erroné avec « \3 ».
        <<- /gn/ __also__ -3>> =suggSing(\3)                                                # Accord de nombre erroné : « \3 » devrait être au singulier.

TEST: Tu sais, {{leur}} {{impatiences}} est notoire.
TEST: J’en ai assez de {{leur}} {{délires}}
TEST: {{Leur}} {{perceptions}} des choses m’exaspère.
TEST: dans {{leur}} {{usines}}


__gn_notre_votre_chaque_accord__
    [notre|votre|chaque]  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggSing(\2)                      # Accord de nombre erroné : « \2 » devrait être au singulier.

TEST: Chaque {{chiens}}.                                      ->> chien


__gn_quelque_accord__
    quelque  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siG]") and not value(>1, "|que|qu’|qu|")
        -1>> quelques                                                                       # Il manque un “s” à « quelque » ou « \2 » doit être au singulier.

TEST: {{Quelque}} amis


## Pluriels épicènes


## Autres pluriels

__gn_certains_accord__
    certains  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:f", ":[emGWP]") -1>> certaines                         # Accord de genre erroné : « \2 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasPlur(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant masculin.
        <<- /gn/ ( morph(\2, ":[NAQ].*:s", ":(?:[ipGWP]|V0)") and not (value(>1, "|et|ou|") and morph(>2, ":[NAQ]")) )
            or \1 in aREGULARPLURAL
        -2>> =suggPlur(\2)                                                                  # Accord de nombre erroné : « \2 » devrait être au pluriel.

__gn_certains_des_accord__
    certains  des  *WORD
        <<- /gn/ morph(\3, ":[NAQ].*:f", ":[emGW]") -1>> certaines                          # Accord de genre erroné : « \3 » est féminin.
        <<- /gn/ __also__ and hasMasForm(\3) -3>> =suggMasPlur(\3, True)                    # Accord de genre erroné : « \1 » est un déterminant masculin.

__gn_certaines_accord__
    certaines  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:m", ":[efGWP]") -1>> certains                          # Accord de genre erroné : « \2 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggFemPlur(\2, True)                    # Accord de genre erroné : « \1 » est un déterminant féminin.
        <<- /gn/ ( morph(\2, ":[NAQ].*:s", ":[ipGWP]") and not (value(>1, "|et|ou|") and morph(>2, ":[NAQ]")) )
            or \2 in aREGULARPLURAL
        -2>> =suggPlur(\2)                                                                  # Accord de nombre erroné : « \2 » devrait être au pluriel.

__gn_certaines_des_accord__
    certaines  des  *WORD
        <<- /gn/ morph(\3, ":[NAQ].*:m", ":[efGW]") -1>> certains                           # Accord de genre erroné : « \3 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\3) -3>> =suggFemPlur(\3, True)                    # Accord de genre erroné : « \1 » est un déterminant féminin.

TEST: Certaines {{danse}}
TEST: Certains {{chien}}
TEST: {{certains}} des {{nouvelles}} sont à côté de la plaque.
TEST: {{certaines}} des hommes
TEST: Un problème rapporté par certains est l’incapacité à trouver un partenaire


@@@@
@@@@END_GRAPH                                                                                      _
@@@@






## Pluriels épicènes

__<i]/gn(gn_les_accord1)__
    , (les) +({w_2})  @@w,$
    <<- ( morph(\2, ":[NAQ].*:s") and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False)) )
................................................................................
!!!
!!!
!!! Processeur: simplification des substantifs                                                    !!
!!!
!!!

### @ : we remove @ we introduced after le/la/les in some cases
#__<s>(p_arobase)__      @ <<- ~>> *

### Avant les verbes (ôter seulement les COI!)
__[i](p_ne_leur_lui)__  ne (leur|lui)(?! en) @@3 <<- ~1>> *

### Après les verbes
__[i](p_jamais2)__      jamais <<- ~>> *
#__[i](p_guère)__        guère <<- ~>> *
................................................................................
    \w+-(?:je|tu|ils?|elles?|on|[nv]ous) (pas|point|rien|bien|ensemble) @@$ <<- ~1>> *

# sembler le croire/penser/présumer/supposer/envisager/imaginer
__[i](p_que_semble_le_penser)__
    que +(sembl\w+) +(l(?:e (?:penser|croire|présumer|supposer)|’(?:envisager|imaginer))) @@w,$
    <<- morph(\1, ">sembler/", False) ~2>> *






### Simplification des groupes nominaux

# désambiguïsation - pour contrer le faux positif qui veut accorder fois avec le participe passé de la proposition suivante
__[s](p_fois_que)__         (fois )que? @@0 <<- ~1>> fois=
__[i](p_que_l_on)__         que (l’)on  @@4 <<- ~1>> *