Grammalecte  Check-in [ebc7b7f342]

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: ebc7b7f3427b045162205c28851dc3105dde0d16de2fa0a50424860660bb0098
User & Date: olr on 2018-07-27 18:11:45
Other Links: branch diff | manifest | tags
Context
2018-07-28
00:14
[build] DARG: shorten building result display check-in: ffd3e274fa user: olr tags: build, rg
2018-07-27
18:11
[fr] conversion: regex rules -> graph rules check-in: ebc7b7f342 user: olr tags: fr, rg
09:37
[fr] conversion: regex rules -> graph rules check-in: 99d73d5fde user: olr tags: fr, rg
Changes

Modified gc_lang/fr/rules.grx from [7c180bd845] to [049bff94f6].

2869
2870
2871
2872
2873
2874
2875
2876

2877
2878
2879
2880
2881
2882
2883
2869
2870
2871
2872
2873
2874
2875

2876
2877
2878
2879
2880
2881
2882
2883







-
+







        <<- /tu/ ->> Rhône-Alpes                                                                    # Il manque les traits d’union.

    Saône et Loire
        <<- /tu/ ->> Saône-et-Loire                                                                 # Il manque un trait d’union.

    [St|Ste]  ~^[A-ZÉÈÎ]
        <<- /tu/ ->> \1-\2
        # Il manque un trait d’union s’il s’agit d’une église, d’une cité, d’une communauté… S’il s’agit d’une personne, écrivez « saint(e) » sans majuscule, sans trait d’union.
        # Il manque un trait d’union s’il s’agit d’une église, d’une cité, d’une communauté… S’il s’agit d’une personne, écrivez saint” ou “sainte sans majuscule, sans trait d’union.

TEST: Émigrer au {{Royaume Uni}}
TEST: Étudier en {{Grande Bretagne}}
TEST: Vivre aux {{Pays Bas}}
TEST: Il passe par {{Aix en Provence}}
TEST: Qui se souvient de la {{Bosnie Herzégovine}} ?
TEST: en {{Charente Maritime}}
4815
4816
4817
4818
4819
4820
4821
4822

4823
4824
4825
4826
4827
4828
4829
4815
4816
4817
4818
4819
4820
4821

4822
4823
4824
4825
4826
4827
4828
4829







-
+







        <<- /conf/ not \1.isupper() -1>> c’est                  # Confusion probable. Écrivez « c’est » pour dire « ceci est… ».

    c’ est  @:N.*:p¬:(?:G|W|M|A.*:[si])
        <<- /conf/ -1:2>> ces|ses                               # Confusion. Exemples : c’est facile ; ces chats (désignation) ; ses chats (possession)…

TEST: {{ses}} au-dessus de ses forces.
TEST: {{ces}} comme la peste
TEST: car {{ses}} d’avance perdu
TEST: car {{ses}} d’autre part
TEST: {{ces}} qu’il y a tant de pertes
TEST: {{ces}} jamais une bonne idée.
TEST: {{c’est}} {{délires}} nous ennuient
TEST: En 2015, c’est Paris et son agglomération qui…
TEST: Ses pas de danse.


5707
5708
5709
5710
5711
5712
5713
5714

5715
5716
5717
5718
5719
5720
5721
5707
5708
5709
5710
5711
5712
5713

5714
5715
5716
5717
5718
5719
5720
5721







-
+









# statue / statut / statu
__conf_statu_statue_statut__
    [statut|statue|status] quo
        <<- /conf/ ->> statu quo                # Confusion. Écrivez “statu quo”.|https://fr.wiktionary.org/wiki/statu_quo

    statu ~¬[qQ][uU][oO]
    statu ~¬^[qQ][uU][oO]$
        <<- /conf/ -1>> statut|statue           # Confusion : “statu” ne s’emploie que dans l’expression “statu quo”.

TEST: Ça n’en finit pas, c’est le {{statut quo}}.
TEST: Quelle splendide {{statu}}.


# sur / sûr
8573
8574
8575
8576
8577
8578
8579
8580

8581
8582
8583
8584
8585
8586
8587
8573
8574
8575
8576
8577
8578
8579

8580
8581
8582
8583
8584
8585
8586
8587







-
+








    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]
    d’ [avance|évidence]  @¬:A.*:[fe]:[si]
        <<- ~1:2>> *

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

    de ce fait  @¬:A.*:[me]:[si]
        <<- ~1:3>> *
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
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







-
+

-
-
-
+

-
+




+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+








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

#### 1 mot
## l’

## Singulier masculin

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

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


__gn_l_2m__
    l’  @:[NA]¬*  @:[NA]¬*
        <<- /gn/ not value(<1, "|et|ou|de|") and not value(\2, "|air|") and not morph(\3, ">seule/") >>>
        <<- /gn/ ( (morph(\2, ":m", "*") and morph(\3, ":f", "*")) or (morph(\2, ":f", "*") and morph(\3, ":m", "*")) ) and not apposition(\2, \3)
        -3>> =switchGender(\3, False)                                                               # Accord de genre erroné entre “\2” et “\3”.
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2)                                 # Accord de genre erroné avec “\3”.
        <<- /gn/ morph(\2, ":[si]", "*") and morph(\3, ":p", "*") and not apposition(\2, \3)
        -3>> =suggSing(\3)                                                                          # Accord de nombre erroné avec “\2” : “\3” devrait être au singulier.

    [et|ou|de]  l’  @:[NA]¬*  @:[NA]¬*
        <<- /gn/ not value(\3, "|air|") and not morph(\4, ">seule/") >>>
        <<- /gn/ ( (morph(\3, ":m", "*") and morph(\4, ":f", "*")) or (morph(\3, ":f", "*") and morph(\4, ":m", "*")) ) and not apposition(\3, \4) and not morph(<1, ":[NA]")
        -4>> =switchGender(\4, False)                                                               # Accord de genre erroné entre “\3” et “\4”.
        <<- /gn/ __also__ and hasFemForm(\3) -3>> =switchGender(\3)                                 # Accord de genre erroné avec “\4”.
        <<- /gn/ morph(\3, ":[si]", "*") and morph(\4, ":p", "*") and not apposition(\3, \4) and not morph(<1, ":[NA]")
        -4>> =suggSing(\4)                                                                          # Accord de nombre erroné avec “\3” : “\4” devrait être au singulier.

TEST: L’{{amande}} {{amer}}
TEST: l’{{amicale}} {{animal}}
TEST: l’amour {{immortels}}
TEST: du chien et de l’{{excellente}} {{collier}} qu’il avait autour du cou.
TEST: du chien et de l’{{étonnante}} {{collier}} qu’il avait autour du cou.


__gn_le_accord__
__gn_le_1m__
    ,  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
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
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







-
+





-
+





-
+




-
+





-
+






-
+






-
+






-
+







TEST: {{Le}} démoralisation.                                  ->> La
TEST: {{Le}} Guyane française.                                ->> La
TEST: avec {{le}} {{pile}}
TEST: {{le}} {{publique}}
TEST: {{Le}} {{pendue}}


__gn_ledit_accord__
__gn_ledit_1m__
    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__
__gn_un_1m__
    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__
__gn_un_des_1m__
    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__
__gn_du_1m__
    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__
__gn_cet_1m__
    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__
__gn_ce_1m__
    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__
__gn_mon_ton_son_1m__
    [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__
__gn_au_1m__
    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.
8973
8974
8975
8976
8977
8978
8979
8980

8981
8982
8983
8984
8985
8986
8987
8995
8996
8997
8998
8999
9000
9001

9002
9003
9004
9005
9006
9007
9008
9009







-
+







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__
__gn_la_1m__
    ,  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") >>>
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
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







-
+








-
+






-
+












-
+





-
+















-
+




















-
+






-
+









-
+







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__
__gn_ladite_1m__
    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__
__gn_une_1m__
    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__
__gn_une_des_1m__
    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__
__gn_cette_1m__
    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__
__gn_ma_ta_sa_1m__
    [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__
__gn_leur_1m__
    ,  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__
__gn_notre_votre_chaque_1m__
    [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__
__gn_quelque_1m__
    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

__gn_les_accord__
__gn_les_1m__
    ,  les  *WORD
        <<- /gn/ ( morph(\3, ":[NAQ].*:s", "*") and not (value(>1, "|et|ou|") and morph(>2, ":[NAQ]")) )
            or \3 in aREGULARPLURAL
        -3>> =suggPlur(\3)                                                                  # Accord de nombre erroné : « \3 » devrait être au pluriel.

    *WORD  les  *WORD
        <<- /gn/ morph(\2, ":D")
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
9148
9149

9150
9151
9152
9153
9154
9155
9156
9157
9158
9159
9160
9161
9162
9163
9164

9165
9166
9167
9168
9169
9170
9171
9172
9173
9174
9175
9176

9177
9178
9179
9180
9181
9182
9183
9184

9185
9186
9187
9188
9189

9190
9191
9192
9193
9194
9195
9196
9197

9198
9199
9200
9201
9202
9203
9204
9205
9206
9207
9208
9209
9210

9211
9212
9213
9214
9215
9216
9217
9218
9219

9220
9221
9222
9223
9224
9225
9226
9227
9228

9229
9230
9231
9232
9233
9234
9235
9236
9237

9238
9239
9240
9241
9242
9243
9244
9141
9142
9143
9144
9145
9146
9147

9148
9149
9150
9151
9152
9153
9154
9155
9156
9157
9158

9159
9160
9161
9162
9163
9164
9165
9166
9167
9168
9169
9170

9171
9172
9173
9174
9175
9176
9177
9178
9179
9180
9181
9182
9183
9184
9185

9186
9187
9188
9189
9190
9191
9192
9193
9194
9195
9196
9197

9198
9199
9200
9201
9202
9203
9204
9205

9206
9207
9208
9209
9210

9211
9212
9213
9214
9215
9216
9217
9218

9219
9220
9221
9222
9223
9224
9225
9226
9227
9228
9229
9230
9231

9232
9233
9234
9235
9236
9237
9238
9239
9240

9241
9242
9243
9244
9245
9246
9247
9248
9249

9250
9251
9252
9253
9254
9255
9256
9257
9258

9259
9260
9261
9262
9263
9264
9265
9266







-
+










-
+











-
+














-
+











-
+







-
+




-
+







-
+












-
+








-
+








-
+








-
+







TEST: Les {{tiret}}                                           ->> tirets
TEST: Les plus {{grand}} hommes.                              ->> grands
TEST: les {{véhicule}}                                        ->> véhicules
TEST: Les {{démoralisation}}.                                 ->> démoralisations
TEST: dans les {{usine}}                                      ->> usines


__gn_leurs_accord__
__gn_leurs_1m__
    leurs  *WORD
        <<- /gn/ (morph(\2, ":[NAQ].*:s", ":(?:[ipGW]|[123][sp])") and not (value(>1, "|et|ou|") and morph(>2, ":[NAQ]")))
            or \2 in aREGULARPLURAL
        -2>> =suggPlur(\2)                                                                  # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.
        <<- /gn/ __also__ -1>> leur                                                         # Accord de nombre erroné avec « \2 ».

TEST: {{leurs}} {{action}}
TEST: {{leur}} {{données}}


__gn_det_pluriel_accord__
__gn_det_pluriel_1m__
    [des|mes|tes|ses|nos|vos|quelques|lesdits|moult]  *WORD
        <<- (morph(\2, ":[NAQ].*:s", ":[ipGW]") 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.

TEST: des {{pain}}                                            ->> pains
TEST: Quelques {{homme}}.                                     ->> hommes
TEST: plusieurs {{femme}} sont venues.
TEST: une personne ou plusieurs ayant décidé de façon déterminée et coordonnée de faire cuire la grenouille


__gn_ces_aux_pluriel_accord__
__gn_ces_aux_pluriel_1m__
    [ces|aux]  *WORD
        <<- (morph(\2, ":[NAQ].*:s", ":[ipGW]") 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.
        <<- __also__ and morph(\2, ">[bcdfglklmnpqrstvwxz].*:m", ":f") >>>
        <<- \1.endswith("x") or \1.endswith("X") -1>> au                                    # Accord de nombre erroné : « \2 » est au pluriel.
        <<- __else__ -1>> ce                                                                # Accord de nombre erroné : « \2 » est au pluriel.

TEST: {{ces}} {{détournement}} de fonds et ces vols
TEST: ces {{étudiant}} sont légion.
TEST: je vais {{aux}} {{cinéma}}
TEST: il l’a donné aux {{étudiant}}


__gn_plusieurs_accord__
__gn_plusieurs_1m__
    plusieurs  *WORD
        <<- (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.

TEST: plusieurs {{foi}} par jour.


## Autres pluriels

## certains / certaines
__gn_certains_accord__
__gn_certains_1m__
    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__
__gn_certains_des_1m__
    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__
__gn_certaines_1m__
    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__
__gn_certaines_des_1m__
    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


## quel / quels / quelle / quelles
__gn_quel_accord__
__gn_quel_1m__
    quel  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:f:p", ":(?:V0|Oo|[NAQ].*:[me]:[si])")      -1>> quelles                    # Accord de genre et de nombre erroné : « \2 » est féminin et au pluriel.
        <<- /gn/ __also__ and hasFemForm(\2)                                    -2>> =suggMasSing(\2, True)     # Accord de genre et de nombre erroné : « \1 » est masculin et au singulier.
        <<- /gn/ morph(\2, ":[NAQ].*:m:p", ":(?:V0|Oo|[NAQ].*:[me]:[si])")      -1>> quels                      # Accord de nombre erroné : « \2 » est au pluriel.
        <<- /gn/ __also__                                                       -2>> =suggSing(\2)              # Accord de nombre erroné : « \1 » est au singulier.
        <<- /gn/ morph(\2, ":[NAQ].*:f:[si]", ":(?:V0|Oo|[NAQ].*:[me]:[si])")   -1>> quelle                     # Accord de genre erroné : « \2 » est féminin.
        <<- /gn/ __also__ and hasFemForm(\2)                                    -2>> =suggMasSing(\2, True)     # Accord de genre erroné : « \1 » est masculin.

__gn_quels_accord__
__gn_quels_1m__
    quels  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:f:s", ":(?:V0|Oo|[NAQ].*:[me]:[pi])")      -1>> quelle                     # Accord de genre et de nombre erroné : « \2 » est féminin et au singulier.
        <<- /gn/ __also__ and hasFemForm(\2)                                    -2>> =suggMasPlur(\2, True)     # Accord de genre et de nombre erroné : « \1 » est masculin et au pluriel.
        <<- /gn/ morph(\2, ":[NAQ].*:m:s", ":(?:V0|Oo|[NAQ].*:[me]:[pi])")      -1>> quel                       # Accord de nombre erroné : « \2 » est au singulier.
        <<- /gn/ __also__                                                       -2>> =suggPlur(\2)              # Accord de nombre erroné : « \1 » est au pluriel.
        <<- /gn/ morph(\2, ":[NAQ].*:f:[pi]", ":(?:V0|Oo|[NAQ].*:[me]:[pi])")   -1>> quelles                    # Accord de genre erroné : « \2 » est féminin.
        <<- /gn/ __also__ and hasFemForm(\2)                                    -2>> =suggMasPlur(\2, True)     # Accord de genre erroné : « \1 » est masculin.

__gn_quelle_accord__
__gn_quelle_1m__
    quelle  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:m:p", ":(?:V0|Oo|[NAQ].*:[fe]:[si])")      -1>> quels                      # Accord de genre et de nombre erroné : « \2 » est masculin et au pluriel.
        <<- /gn/ __also__ and hasFemForm(\2)                                    -2>> =suggFemSing(\2, True)     # Accord de genre et de nombre erroné : « \1 » est féminin et au singulier.
        <<- /gn/ morph(\2, ":[NAQ].*:f:p", ":(?:V0|Oo|[NAQ].*:[fe]:[si])")      -1>> quelles                    # Accord de nombre erroné : « \2 » est au pluriel.
        <<- /gn/ __also__                                                       -2>> =suggSing(\2)              # Accord de nombre erroné : « \1 » est au singulier.
        <<- /gn/ morph(\2, ":[NAQ].*:m:[si]", ":(?:V0|Oo|[NAQ].*:[fe]:[si])")   -1>> quel                       # Accord de genre erroné : « \2 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\2)                                    -2>> =suggFemSing(\2, True)     # Accord de genre erroné : « \1 » est féminin.

__gn_quelles_accord__
__gn_quelles_1m__
    quelles  *WORD
        <<- /gn/ morph(\2, ":[NAQ].*:m:s", ":(?:V0|Oo|[NAQ].*:[fe]:[pi])")      -1>> quel                       # Accord de genre et de nombre erroné. « \2 » est masculin et au singulier.
        <<- /gn/ __also__ and hasFemForm(\2)                                    -2>> =suggFemPlur(\2, True)     # Accord de genre et de nombre erroné : « \1 » est féminin et au pluriel.
        <<- /gn/ morph(\2, ":[NAQ].*:f:s", ":(?:V0|Oo|[NAQ].*:[fe]:[pi])")      -1>> quelle                     # Accord de nombre erroné : « \2 » est au singulier.
        <<- /gn/ __also__                                                       -2>> =suggPlur(\2)              # Accord de nombre erroné : « \1 » est au pluriel.
        <<- /gn/ morph(\2, ":[NAQ].*:m:[pi]", ":(?:V0|Oo|[NAQ].*:[fe]:[pi])")   -1>> quels                      # Accord de genre erroné : « \2 » est masculin.
        <<- /gn/ __also__ and hasFemForm(\2)                                    -2>> =suggFemPlur(\2, True)     # Accord de genre erroné : « \1 » est féminin.
9340
9341
9342
9343
9344
9345
9346
9347

9348
9349
9350
9351
9352
9353
9354
9355
9356

9357
9358
9359
9360
9361
9362
9363
9362
9363
9364
9365
9366
9367
9368

9369
9370
9371
9372
9373
9374
9375
9376
9377

9378
9379
9380
9381
9382
9383
9384
9385







-
+








-
+







        <<- /gn/ -2>> \1s                                                                   # Accord de nombre erroné : mettez au pluriel.

TEST: des {{son}} que nous entendons jour et nuit.
TEST: j’entends ces {{même}} âneries tous les jours


## Pluriel des groupes
__gn_nombre_de_accord__
__gn_nombre_de_1m__
    nombre  [de|d’]  *WORD
        <<- /gn/ (morph(\3, ":[NAQ].*:s", ":[ip]|>o(?:nde|xydation|r)/") and morph(<1, ":(?:G|[123][sp])|<start>", ":[AD]"))
            or \3 in aREGULARPLURAL
        -3>> =suggPlur(\3)                                                                  # Ici, « nombre de » devrait probablement être suivi d’un pluriel.

TEST: Je connais nombre d’{{emmerdeur}} et aucun n’est pire que lui.


__gn_det_groupe_de_accord__
__gn_det_groupe_de_1m__
    [un|une|le|la|ce|cette|mon|ton|son|ma|ta|sa|les|ces|des|mes|tes|ses|nos|vos|leurs|quelques]  [>centaine|>millier|>million|>milliard|>dixaine|>douzaine|>multitude|>horde]  [de|d’]  *WORD
        <<- /gn/ morph(\4, ":[NAQ].*:s", ":[ip]") or \4 in aREGULARPLURAL
        -4>> =suggPlur(\4)                                                                  # Avec des « \2 \3 \4 », mettre au pluriel.

TEST: des centaines de {{bête}} à cornes passèrent devant nous.     ->> bêtes
TEST: une multitude d’{{homme}}                                     ->> hommes

9375
9376
9377
9378
9379
9380
9381
9382

9383
9384
9385
9386
9387
9388
9389
9397
9398
9399
9400
9401
9402
9403

9404
9405
9406
9407
9408
9409
9410
9411







-
+







TEST: {{Quelques}} 120 hommes                                 ->> Quelque
TEST: {{Quelques}} deux cents hommes.                         ->> Quelque
TEST: les quelque 2,5 millions d’habitants
TEST: les quelque 12 000 stations-service


## Nombres
__gn_nombre_lettres_accord__
__gn_nombre_lettres_1m__
    @:B:e:p  *WORD
        <<- /gn/ not value(\1, "|neuf|mille|") and ( (morph(\2, ":[NAQ].*:s", "*") and not value(\2, "|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|") )
            or \2 in aREGULARPLURAL)
        -2>> =suggPlur(\2)                                                                  # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

    neuf  *WORD
        <<- /gn/ ( morph(\2, ":[NAQ].*:s", "*") and not morph(<1, ":N.*:m:[is]") and not value(\2, "|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|") )
9397
9398
9399
9400
9401
9402
9403
9404

9405
9406
9407
9408
9409
9410
9411
9419
9420
9421
9422
9423
9424
9425

9426
9427
9428
9429
9430
9431
9432
9433







-
+







TEST: ce sont trois {{idiot}} pas foutus de trouver leur chemin avec un GPS.
TEST: Il a abandonné neuf {{enfant}}.
TEST: On peut trouver mille {{travailleur}} d’un claquement de doigts.
TEST: un logement neuf bâti par des professionnels.
TEST: un mille marin.


__gn_nombre_chiffres_accord__
__gn_nombre_chiffres_1m__
    [0|1|01]  @:[NAQ].*:p¬*
        <<- /gn/ not value(\2, "|Rois|Corinthiens|Thessaloniciens|") -2>> =suggSing(\2)     # Accord de nombre erroné : « \1 » devrait être au singulier.

    ~^\d+$  *WORD
        <<- not value(<1, "|/|") and not re.search("^0*[01]$", \1)
            and ( (morph(\2, ":[NAQ].*:s", "*") and not value(\2, "|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|"))
            or \1 in aREGULARPLURAL )
9428
9429
9430
9431
9432
9433
9434
9435

9436
9437
9438
9439
9440
9441
9442
9443
9444
9445
9446
9447
9448
9449

9450
9451
9452
9453
9454
9455
9456
9457
9458
9459
9460

9461
9462


9463
9464
9465
9466
9467
9468
9469
9470
9471
9472
9473
9474
9475
9476
9477
9478
9479
9480



9481
9482
9483
9484
9485
9486



9487
9488
9489
9490




9491
9492
9493
9494
9495
9496
9497
9498
9499















9500
9501
9502

9503
9504
9505



9506
9507
9508
9509
9510
9511
9512

9513
9514
9515
9516
9517
9518
9519
9520
9521
9522
9523

9524
9525
9526
9527
9528
9529
9530
9531
9532
9533
9534
9535

9536
9537
9538
9539
9540
9541
9542
9543
9544
9545
9546
9450
9451
9452
9453
9454
9455
9456

9457
9458
9459
9460
9461
9462
9463
9464
9465
9466
9467
9468
9469
9470

9471
9472
9473
9474
9475
9476
9477
9478
9479
9480
9481
9482
9483


9484
9485
9486
9487
9488
9489
9490
9491
9492
9493
9494
9495
9496
9497






9498
9499
9500






9501
9502
9503




9504
9505
9506
9507
9508
9509
9510
9511
9512
9513
9514
9515
9516
9517
9518
9519
9520
9521
9522
9523
9524
9525
9526
9527
9528
9529
9530
9531
9532
9533
9534
9535



9536
9537
9538
9539
9540
9541
9542
9543


9544











9545












9546




9547
9548
9549
9550
9551
9552
9553







-
+













-
+











+
-
-
+
+












-
-
-
-
-
-
+
+
+
-
-
-
-
-
-
+
+
+
-
-
-
-
+
+
+
+









+
+
+
+
+
+
+
+
+
+
+
+
+
+
+



+
-
-
-
+
+
+





-
-
+
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-







!!
!!
!!!! Groupe nominal (2)                                                                           !!
!!
!!

## Sans article
__gn_2m_accord__
__gn_start_2m__
    <start>  @:[NA]¬*  @:[NA]¬*
        <<- /gn/ ((morph(\2, ":m", "*") and morph(\3, ":f", "*")) or (morph(\2, ":f", "*") and morph(\3, ":m", "*"))) and not apposition(\2, \3)
        -3>> =switchGender(\3)                                                                      # Accord de genre erroné avec « \2 ».
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2)                                 # Accord de genre erroné avec « \3 ».
        <<- /gn/ ((morph(\2, ":s", "*") and morph(\3, ":p", "*")) or (morph(\2, ":p", "*") and morph(\3, ":s", "*"))) and not apposition(\2, \3)
        -3>> =switchPlural(\3)                                                                      # Accord de nombre erroné avec « \2 ».
        <<- /gn/ __also__ -2>> =switchPlural(\2)                                                    # Accord de nombre erroné avec « \3 ».

TEST: {{Femmes}} {{intelligente}}.
TEST: {{Homme}} {{impatients}}.


## Prépositions
__gn_2m_pfx_en__
__gn_pfx_en_2m__
    en  @:[NA]¬*  @:[NA]¬*
        <<- /gn/ ( (morph(\2, ":m", "*") and morph(\3, ":f", "*")) or (morph(\2, ":f", "*") and morph(\3, ":m", "*")) ) and not apposition(\2, \3)
        -3>> =switchGender(\3)                                                                      # Accord de genre erroné avec « \2 ».
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2)                                 # Accord de genre erroné avec « \3 ».
        <<- /gn/ ( (morph(\2, ":p", "*") and morph(\3, ":s", "*")) or (morph(\2, ":s", "*") and morph(\3, ":p", "*")) ) and not apposition(\2, \3)
        -3>> =switchPlural(\3)                                                                      # Accord de nombre erroné avec « \2 ».
        <<- /gn/ __also__ -2>> =switchPlural(\2)                                                    # Accord de nombre erroné avec « \3 ».

TEST: en homme {{courtoise}}
TEST: en {{femme}} {{cultivées}}


__gn_2m_pfx_à_par_pour_sans__
    [à|par|pour|sans]  @:[NA]¬:Y  @:[NA]
__gn_pfx_à_par_pour_sans_2m__
    [à|par|pour|sans]  @:[NA]¬:Y  @:[NA]¬:G
        <<- /gn/ ( (morph(\2, ":m", ":[fe]") and morph(\3, ":f", "*")) or (morph(\2, ":f", ":[me]") and morph(\3, ":m", "*")) ) and not apposition(\2, \3)
        -3>> =switchGender(\3)                                                                      # Accord de genre erroné avec « \2 ».
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2)                                 # Accord de genre erroné avec « \3 ».
        <<- /gn/ ( (morph(\2, ":p", ":[si]") and morph(\3, ":s", "*")) or (morph(\2, ":s", ":[pi]") and morph(\3, ":p", "*")) ) and not apposition(\2, \3)
        -3>> =switchPlural(\3)                                                                      # Accord de nombre erroné avec « \2 ».
        <<- /gn/ __also__ -2>> =switchPlural(\2)                                                    # Accord de nombre erroné avec « \3 ».

TEST: à {{grande}} {{enjambées}}
TEST: pour {{belle}} {{appartement}}
TEST: une femme sans a priori


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



__gn_pfx_de_2m__
    [de|d’]  @:[NA]¬Y  @:[NA]¬*
        <<- /gn/ ( (morph(\2, ":m", ":[fe]") and morph(\3, ":f", "*")) or (morph(\2, ":f", ":[me]") and morph(\3, ":m", "*")) )
__[i]/gn(gn_2m_pfx_de_sur_avec_après)__
    (?:de|sur|avec|après) +({w_2}) +({w_2})  @@w,$
    <<- ( (morphex(\1, ":[NAQ].*:m", ":(?:[Gfe]|V0e|Y)") and morph(\2, ":[NAQ].*:f")) or (morphex(\1, ":[NAQ].*:f", ":(?:[Gme]|V0e|Y)") and morph(\2, ":[NAQ].*:m")) )
        and not apposition(\1, \2) and morph(word(-1), ":[VRX]", True, True)
    -2>> =switchGender(@)                                                                           # Accord de genre erroné avec « \1 ».
    <<- __also__ and hasFemForm(\1) -1>> =switchGender(@)                                           # Accord de genre erroné avec « \2 ».
            and not apposition(\2, \3) and not morph(<1, ":[NA]|>(?:et|ou)/")
        -3>> =switchGender(\3)                                                                      # Accord de genre erroné avec « \2 ».
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2)                                 # Accord de genre erroné avec « \3 ».
    <<- ( (morphex(\1, ":[NAQ].*:p", ":(?:[Gsi]|V0e|Y)") and morph(\2, ":[NAQ].*:s")) or (morphex(\1, ":[NAQ].*:s", ":(?:[Gpi]|V0e|Y)") and morph(\2, ":[NAQ].*:p")) )
        and not apposition(\1, \2) and morph(word(-1), ":[VRX]", True, True)
    -2>> =switchPlural(@)                                                                           # Accord de nombre erroné avec « \1 ».
    <<- __also__ -1>> =switchPlural(@)                                                              # Accord de nombre erroné avec « \2 ».
        <<- /gn/ ( (morph(\2, ":p", ":[si]") and morph(\3, ":s", "*")) or (morph(\2, ":s", ":[pi]") and morph(\3, ":p", "*")) )
            and not apposition(\2, \3) and not morph(<1, ":[NA]|>(?:et|ou)/")
        -3>> =switchPlural(\3)                                                                      # Accord de nombre erroné avec « \2 ».
        <<- /gn/ __also__ -2>> =switchPlural(\2)                                                    # Accord de nombre erroné avec « \3 ».

TEST: Ils ont de {{grandes}} {{oreille}}
TEST: de {{grands}} {{homme}}
TEST: de {{manière}} {{légal}}
TEST: de {{petite}} {{homme}}
TEST: de {{pousse}} {{actif}}
TEST: De {{bon}} {{conseils}}
TEST: De {{mauvaises}} {{hommes}}
TEST: Ces produits sont de {{belle}} {{qualités}}.


__gn_pfx_de_sur_avec_après_2m__
    [sur|avec|après]  @:[NA]¬V0  @:[NA]¬*
        <<- /gn/ ( (morph(\2, ":m", ":[fe]") and morph(\3, ":f", "*")) or (morph(\2, ":f", ":[me]") and morph(\3, ":m", "*")) )
            and not apposition(\2, \3) and morph(<1, ":[VRX]|<start>")
        -3>> =switchGender(\3)                                                                      # Accord de genre erroné avec « \2 ».
        <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2)                                 # Accord de genre erroné avec « \3 ».
        <<- /gn/ ( (morph(\2, ":p", ":[si]") and morph(\3, ":s", "*")) or (morph(\2, ":s", ":[pi]") and morph(\3, ":p", "*")) )
            and not apposition(\2, \3) and morph(<1, ":[VRX]|<start>")
        -3>> =switchPlural(\3)                                                                      # Accord de nombre erroné avec « \2 ».
        <<- /gn/ __also__ -2>> =switchPlural(\2)                                                    # Accord de nombre erroné avec « \3 ».

TEST: avec {{grand}} {{industrie}}
TEST: sur {{petite}} {{pied}}
TEST: Après être demeurée assise pendant quelque temps, elle se leva
TEST: ils choisissent de devenir indépendants


__[i]/gn(gn_de_manière_façon)__
    de +(manière|façon) +({w_3})  @@w,$
    <<- morphex(\2, ":A.*:(m|f:p)", ":[GM]") -2>> =suggFemSing(@)                                   # Accord erroné avec “\1” : l’adjectif devrait être au féminin singulier.
__gn_de_manière_façon_1m__
    de  [manière|façon]  @:A.*:(m|f:p)¬:[GM]
        <<- /gn/ -3>> =suggFemSing(\3)                                                              # Accord erroné avec “\2” : l’adjectif devrait être au féminin singulier.

TEST: il fit cela tans de fois et avec brio de manière {{élégant}}.
TEST: elle s’y prit avec cet individu de façon {{charmant}}.


## l’

@@@@
__[i]/gn(gn_2m_l)__
    (?<!et |ou |de )l’({w_2}) +({w_2})  @@2,$
    <<- not re.search("(?i)^air$", \1) and not \2.startswith("seul")
        and ( (morph(\1, ":m") and morph(\2, ":[NAQ].*:f")) or (morph(\1, ":f") and morph(\2, ":[NAQ].*:m")) )
        and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
    -2>> =switchGender(@, False)                                                                    # Accord de genre erroné entre « \1 » et « \2 ».
    <<- __also__ and hasFemForm(\1) -1>> =switchGender(@)                                           # Accord de genre erroné avec « \2 ».
    <<- not re.search("(?i)^air$", \1) and not \2.startswith("seul")
        and morph(\1, ":[si]") and morph(\2, ":[NAQ].*:p")
        and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
    -2>> =suggSing(@)                                                                               # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.
@@@@END_GRAPH                                                                                      _
__[i]/gn(gn_2m_l_après_et_ou_de)__
    (?:et|ou|de) +l’({w_2}) +({w_2})  @@w,$
    <<- not \2.startswith("seul")
        and ( (morph(\1, ":m") and morph(\2, ":[NAQ].*:f")) or (morph(\1, ":f") and morph(\2, ":[NAQ].*:m")) )
        and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]", False, False)
    -2>> =switchGender(@, False)                                                                    # Accord de genre erroné entre « \1 » et « \2 ».
    <<- __also__ and hasFemForm(\1) -1>> =switchGender(@)                                           # Accord de genre erroné avec « \2 ».
    <<- not re.search("(?i)^air$", \1) and not \2.startswith("seul")
        and morph(\1, ":[si]") and morph(\2, ":[NAQ].*:p")
        and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]", False, False)
    -2>> =suggSing(@)                                                                               # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.

@@@@
TEST: L’{{amande}} {{amer}}
TEST: l’{{amicale}} {{animal}}
TEST: du chien et de l’{{excellente}} {{collier}} qu’il avait autour du cou.
TEST: du chien et de l’{{étonnante}} {{collier}} qu’il avait autour du cou.


## un / une

__[i]/gn(gn_2m_un)__
    (?<!et |ou | d’)un +({w_2}) +({w_2})  @@w,$
    <<- not \2.startswith("seul")