Grammalecte  Check-in [6dd9efcb39]

Overview
Comment:[fr] lisibilité du fichier des règles de grammaire: tabulations + [js] dawg: comment + [fx] lexicon editor: display entries
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk | fr
Files: files | file ages | folders
SHA3-256: 6dd9efcb39b02d4112465bd4e3c0d37dfaae95eec84e721d99bd1876e305834b
User & Date: olr on 2018-02-08 08:56:55
Original Comment: [fr] lisibilité du fichier des règles de grammaire: tabulations
Other Links: manifest | tags
Context
2018-02-09
09:08
[fr] faux positif: accord conjugaison avec <d’une des <nom>> check-in: 69484bcae0 user: olr tags: trunk, fr
2018-02-08
08:56
[fr] lisibilité du fichier des règles de grammaire: tabulations + [js] dawg: comment + [fx] lexicon editor: display entries check-in: 6dd9efcb39 user: olr tags: trunk, fr
2018-02-07
22:53
[fr] faux positif: COD que <suj> avoir oublié de… check-in: f7cdd20fe9 user: olr tags: trunk, fr
Changes

Modified gc_lang/fr/rules.grx from [2e9b1d2eae] to [396db0698d].

650
651
652
653
654
655
656
657

658
659
660
661
662
663
664
650
651
652
653
654
655
656

657
658
659
660
661
662
663
664







-
+







!!
!!

# Majuscules après un point
__[s]/maj(majuscule_après_point)__
    ({w_2})[.] ([a-zéàèîçô]\w*)  @@0,$
    <<- not re.search("(?i)^(?:etc|[A-Z]|chap|cf|fig|hab|litt|circ|coll|r[eé]f|étym|suppl|bibl|bibliogr|cit|op|vol|déc|nov|oct|janv|juil|avr|sept)$", \1)
    and morph(\1, ":", False) and morph(\2, ":", False)
        and morph(\1, ":", False) and morph(\2, ":", False)
    -2>> =\2.capitalize()                                                                           # Après un point, une majuscule est généralement requise.

TEST: Je suis là. {{viens}}.                                              ->> Viens
TEST: Ils sont devenus idiots. {{c}}’est peine perdue.

__[s]/maj(majuscule_en_début_phrase)__
    ^ *([a-zéèâàô][\w-]+)  @@$
1293
1294
1295
1296
1297
1298
1299
1300
1301


1302
1303
1304
1305
1306
1307
1308
1293
1294
1295
1296
1297
1298
1299


1300
1301
1302
1303
1304
1305
1306
1307
1308







-
-
+
+









!!!! Doublons (casse identique)                                                                     

__[s](doublon)__
    ({w1}) {1,3}\1  @@0
    <<- not re.search("(?i)^([nv]ous|faire|en|la|lui|donnant|œuvre|h[éoa]|hou|olé|joli|Bora|couvent|dément|sapiens|très|vroum|[0-9]+)$", \1)
    and not (re.search("^(?:est|une?)$", \1) and before("[’']$"))
    and not (\1 == "mieux" and before("(?i)qui +$"))
        and not (re.search("^(?:est|une?)$", \1) and before("[’']$"))
        and not (\1 == "mieux" and before("(?i)qui +$"))
    ->> \1   # Doublon.

TEST: Il y a un {{doublon doublon}}.


!!!! Nombres: typographie                                                                           

1608
1609
1610
1611
1612
1613
1614
1615

1616
1617
1618
1619
1620
1621
1622
1608
1609
1610
1611
1612
1613
1614

1615
1616
1617
1618
1619
1620
1621
1622







-
+







TEST: il a pris une balle dans l’{{arrière train}}.
TEST: Ce {{sans gêne}} mérite une bonne leçon


__[i]/tu(tu_mots_composés)__
    (attrape|garde|porte|brise|cache|casse|chauffe|contre|coupe|cure|croque|entre|essuie|lance|lave|lève|marque|pare|passe|perce|pèse|porte|poste|pousse|presse|protège|ramasse|serre|taille|tire|tourne|traîne|vice|vide) ({w1})  @@0,$
    <<- spell(\1+"-"+\2) and analyse(\1+"-"+\2, ":N", False) and morph(word(-1), ":(?:D|V0e)", False, True)
    and not (morph(\1, ":G", False) and morph(\2, ":[GYB]", False))
        and not (morph(\1, ":G", False) and morph(\2, ":[GYB]", False))
    ->> \1-\2                                                                                       # Il manque probablement un trait d’union.

TEST: ce sont des {{lève tard}}.


### Tri 1
__[i]/tu(tu_à_tout_va)__                    [àa] tout vas? <<- ->> à tout-va                        # Il manque un trait d’union.
3606
3607
3608
3609
3610
3611
3612
3613

3614
3615
3616
3617
3618
3619
3620
3606
3607
3608
3609
3610
3611
3612

3613
3614
3615
3616
3617
3618
3619
3620







-
+







TEST: sa toute nouvelle application de synchronisation de fichiers


# ce / se / ceux
__[s]/conf(conf_se_verbe)__
    ([cC]e) ({w_2})  @@0,3
    <<- \2[0].islower() and \2 != "faire"
    and ( morphex(\2, ":V[123].*:(?:Y|[123][sp])", ":[NAGM]|>(?:devoir|pouvoir|sembler) ") or re.search("-(?:ils?|elles?|on)$", \2) )
        and ( morphex(\2, ":V[123].*:(?:Y|[123][sp])", ":[NAGM]|>(?:devoir|pouvoir|sembler) ") or re.search("-(?:ils?|elles?|on)$", \2) )
    -1>> se                                                                 # Confusion : « \2 » est un verbe. Exemples : ce bâtiment, se perdre.
__[i]/conf(conf_pour_ce_faire)__
    pour (se) faire,? ({w_2})  @@5,$
    <<- (\0.find(",") >= 0 or morphex(\2, ":G", ":[AYD]"))
    -1>> ce                                                                 # Confusion probable. Dans cette locution, il faut employer “ce”.|http://fr.wiktionary.org/wiki/pour_ce_faire
__[i]/conf(conf_ne_se1)!6__
    ne (ce) @@3 <<- -1>> se                                                 # Confusion. Ce chien, ce chat… Se demander, se croire…
3758
3759
3760
3761
3762
3763
3764
3765

3766
3767
3768
3769
3770
3771
3772
3758
3759
3760
3761
3762
3763
3764

3765
3766
3767
3768
3769
3770
3771
3772







-
+







TEST: Elle parla au comte d’amour, mais il fit mine de n’y rien entendre.


# date / datte
__[i]/conf(conf_date1)__
    dates
    <<- after("(?i)^ +(?:fra[iî]ches|dénoyautées|fourrées|sèches|séchées|cultivées|produites|muscade|medjool|Hamraya|deglet[ -]nour|kenta|allig|khouat)")
    or before(r"(?i)\b(?:confiture|crème|gâteau|mélasse|noyau|pâte|recette|sirop)[sx]? de +$|\b(?:moelleux|gateau|fondant|cake)[sx]? aux +$")
        or before(r"(?i)\b(?:confiture|crème|gâteau|mélasse|noyau|pâte|recette|sirop)[sx]? de +$|\b(?:moelleux|gateau|fondant|cake)[sx]? aux +$")
    ->> dattes                                                                              # Confusion probable : le fruit s’écrit avec deux “t”.

TEST: il va faire un cake aux {{dates}}.
TEST: elle a fait de la confiture de {{dates}}
TEST: Elles étaient à cette date cultivées à l’air libre.
TEST: De fraîche date…

4184
4185
4186
4187
4188
4189
4190
4191

4192
4193
4194
4195
4196
4197
4198
4184
4185
4186
4187
4188
4189
4190

4191
4192
4193
4194
4195
4196
4197
4198







-
+







TEST: Elle va regarder ça de plus {{prêt}}.


# quand / quant / qu’en
__[i]/conf(conf_quant_à)__
    (?<![dD]e )(quand) (?:à|aux?)  @@0
    <<- not morph(word(-1), ">(?:arriver|venir|à|revenir|partir|aller) ")
    and not(\0.endswith("à") and after("^ +[mts]on tour[, ]")) -1>> quant                           # Confusion probable. Quand = à quel moment. Quant à = à propos de.
        and not(\0.endswith("à") and after("^ +[mts]on tour[, ]")) -1>> quant                           # Confusion probable. Quand = à quel moment. Quant à = à propos de.
__[i]/conf(conf_quand1)__   quant(?! à| aux?| est[ -]il d(?:es?|u) ) <<- ->> quand                  # Confusion. Quand = à quel moment. Quant à = à propos de.
__[i]/conf(conf_qu_en1)__   (quan[dt]) est[ -]il d(?:es?|u) @@0 <<- -1>> qu’en                      # Confusion. Ce qu’il en est de… → Qu’en est-il de… ?
__[i]/conf(conf_qu_en2)__   (quan[dt]) ({w_2}ant) @@0,$ <<- morph(\2, ":P", False) -1>> qu’en       # Confusion probable.
__[i]/conf(conf_quand2)__
    (qu en) (?:je|tu|ils?) @@0
    <<- not after("^ +ne s(?:ai[st]|u[st]|urent|avai(?:[ts]|ent)) ") -1>> quand                     # Confusion probable. Pour évoquer un moment, écrivez :

4255
4256
4257
4258
4259
4260
4261
4262
4263


4264
4265
4266
4267
4268
4269
4270
4255
4256
4257
4258
4259
4260
4261


4262
4263
4264
4265
4266
4267
4268
4269
4270







-
-
+
+







    <<- -1>> sont                   # Confusion : “son” est un déterminant ou un nom masculin. Le verbe “être” à la 3ᵉ personne du pluriel s’écrit “sont”.
__[i]/conf(conf_me_te_se_son)!6__
    [mts]e (son)  @@3
    <<- -1>> sont                   # Confusion : “son” est un déterminant ou un nom masculin. Le verbe “être” à la 3ᵉ personne du pluriel s’écrit “sont”.
__[i]/conf(conf_son_qqch)__
    (sont) ({w_2})  @@0,$
    <<- morphex(\2, ":[NA].*:[me]:s|>[aeéiîou].* :[NA].*:f:s", ":[GW]")
    and morphex(word(-1), ":V|>(?:à|avec|chez|dès|contre|devant|derrière|en|par|pour|sans|sur) ", ":[NA].*:[pi]|>(?:ils|elles|vous|nous|leur|lui|[nmts]e) ", True)
    and not before(r"(?i)\bce que? |[mts]’en +$")
        and morphex(word(-1), ":V|>(?:à|avec|chez|dès|contre|devant|derrière|en|par|pour|sans|sur) ", ":[NA].*:[pi]|>(?:ils|elles|vous|nous|leur|lui|[nmts]e) ", True)
        and not before(r"(?i)\bce que? |[mts]’en +$")
    -1>> son                        # Confusion : “sont” est le verbe “être” à la 3ᵉ personne du pluriel. Pour le déterminant, écrivez “son”.
__[i]/conf(conf_qui_sont_les)__
    (?:qu[ie]|comment|pourquoi) +(son) @@$
    <<- morph(word(1), ":[DR]", False, True) -1>> sont      # Confusion probable : “son” est un déterminant ou un nom masculin. Le verbe “être” à la 3ᵉ personne du pluriel s’écrit “sont”.

TEST: ne leur {{son}} pas odieux.
TEST: Ces chiens me {{son}} odieux.
4352
4353
4354
4355
4356
4357
4358
4359

4360
4361
4362
4363
4364
4365
4366
4352
4353
4354
4355
4356
4357
4358

4359
4360
4361
4362
4363
4364
4365
4366







-
+







TEST: C’est une {{voix}} interdite.


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

__[i]/conf(conf_voire_voir)__
    voire
    <<- morph(word(-1), ":Cs|>(?:ni|et|sans|pour|falloir|[pv]ouvoir|aller) ", True, False) ->> voir
    # Confusion probable : “voire” signifie “et même possiblement”. Pour le verbe, écrivez “voir”.|https://fr.wiktionary.org/wiki/voire
4407
4408
4409
4410
4411
4412
4413
4414

4415
4416
4417
4418
4419
4420
4421
4407
4408
4409
4410
4411
4412
4413

4414
4415
4416
4417
4418
4419
4420
4421







-
+







__[i]/conf(conf_ne_pronom_qqch)__
    (ne (?:l(?:es? +|eur +|a +|’)|[nv]ous))({w_1})  @@0,$
    <<- morphex(\2, ":", ":(?:[123][sp]|Y|P|O[onw]|X)") and not re.search("(?i)-(?:ils?|elles?|[nv]ous|je|tu|on|ce)$", \2)
    -2>> =suggSimil(\2, ":(?:[123][sp]|Y)", False)                                                  # Incohérence avec « \1 » : « \2 » devrait être un verbe.
__[i]/conf(conf_me_te_se_qqch)__
    ([mts]e +(?:les? |la |l’|))(?!voi(?:là|ci))({w_1})  @@0,$
    <<- not re.search("(?i)^se que?", \0)
    and morphex(\2, ":", ":(?:[123][sp]|Y|P|Oo)|>[lmts] ") and not re.search("(?i)-(?:ils?|elles?|[nv]ous|je|tu|on|ce)$", \2)
        and morphex(\2, ":", ":(?:[123][sp]|Y|P|Oo)|>[lmts] ") and not re.search("(?i)-(?:ils?|elles?|[nv]ous|je|tu|on|ce)$", \2)
    -2>> =suggSimil(\2, ":(?:[123][sp]|Oo|Y)", False)                                               # Incohérence avec « \1 » : « \2 » devrait être un verbe ou un pronom personnel objet.
__[i]/conf(conf_m_t_s_y_en_qqch)__
    ([mts]’(?:en|y)) (?!voilà)({w_1})  @@0,$
    <<- morphex(\2, ":", ":(?:[123][sp]|Y|P|X|Oo)|rien ") and not re.search("(?i)-(?:ils?|elles?|[nv]ous|je|tu|on|ce)$", \2)
    -2>> =suggSimil(\2, ":(?:[123][sp]|Y)", False)                                                  # Incohérence avec « \1 » : « \2 » devrait être un verbe.
__[i]/conf(conf_m_s_qqch)__
    ([ms]’)({w_1})  @@0,2
4465
4466
4467
4468
4469
4470
4471
4472

4473
4474
4475
4476
4477
4478


4479
4480
4481
4482
4483
4484


4485
4486
4487
4488
4489
4490


4491
4492
4493
4494
4495
4496
4497
4498
4499
4500


4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517
4518

4519
4520
4521
4522
4523

4524
4525
4526
4527
4528
4529
4530
4465
4466
4467
4468
4469
4470
4471

4472
4473
4474
4475
4476


4477
4478
4479
4480
4481
4482


4483
4484
4485
4486
4487
4488


4489
4490
4491
4492
4493
4494
4495
4496
4497
4498


4499
4500
4501
4502
4503
4504
4505
4506
4507
4508
4509
4510
4511
4512
4513
4514
4515
4516
4517

4518
4519
4520
4521
4522

4523
4524
4525
4526
4527
4528
4529
4530







-
+




-
-
+
+




-
-
+
+




-
-
+
+








-
-
+
+

















-
+




-
+








## Incohérences avec formes verbales 1sg et 2sg sans sujet
__[i](p_notre_père_qui_es_au_cieux)__   notre père (qui est? aux cieux) @@11 <<- ~1>> *

__[i]/conj(conj_xxxai_sans_sujet)!3__
    \w*ai(?! je)
    <<- ( morph(\0, ":1s") or ( before("> +$") and morph(\0, ":1s", False) ) ) and not (\0[0:1].isupper() and before0(r"\w"))
    and not before(r"(?i)\b(?:j(?:e |[’'])|moi(?:,? qui| seul) )")
        and not before(r"(?i)\b(?:j(?:e |[’'])|moi(?:,? qui| seul) )")
    ->> =suggVerb(@, ":3s")                                     # Incohérence. Ceci est un verbe à la 1ʳᵉ personne du singulier. Sujet (“je” ou “moi qui”) introuvable.
__[i]/conj(conj_xxxes_sans_sujet)!3__
    \w*es(?! tu)
    <<- morphex(\0, ":2s", ":(?:E|G|W|M|J|[13][sp]|2p)") and not \0[0:1].isupper() and not isRealStart()
    and ( not morph(\0, ":[NAQ]", False) or before("> +$") )
    and not before(r"(?i)\bt(?:u |[’']|oi,? qui |oi seul )")
        and ( not morph(\0, ":[NAQ]", False) or before("> +$") )
        and not before(r"(?i)\bt(?:u |[’']|oi,? qui |oi seul )")
    ->> =suggVerb(@, ":3s")                                     # Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.
__[i]/conj(conj_xxxas_sans_sujet)!3__
    \w+as(?! tu)
    <<- morphex(\0, ":2s", ":(?:G|W|M|J|[13][sp]|2p)") and not (\0[0:1].isupper() and before0(r"\w"))
    and ( not morph(\0, ":[NAQ]", False) or before("> +$") )
    and not before(r"(?i)\bt(?:u |[’']|oi,? qui |oi seul )")
        and ( not morph(\0, ":[NAQ]", False) or before("> +$") )
        and not before(r"(?i)\bt(?:u |[’']|oi,? qui |oi seul )")
    ->> =suggVerb(@, ":3s")                                     # Incohérence. Ceci est un verbe à la 2ᵉ personne du singulier. Sujet (“tu” ou “toi qui”) introuvable.
__[i]/conj(conj_xxxxs_sans_sujet)!3__
    \w+[iudnrtpcï]s(?! (?:tu|je))
    <<- morphex(\0, ":[12]s", ":(?:E|G|W|M|J|3[sp]|2p|1p)") and not (\0[0:1].isupper() and before0(r"\w"))
    and ( not morph(\0, ":[NAQ]", False) or before("> +$") or ( re.search("(?i)^étais$", \0) and not morph(word(-1), ":[DA].*:p", False, True) ) )
    and not before(r"(?i)\b(?:j(?:e |[’'])|moi(?:,? qui| seul) |t(?:u |[’']|oi,? qui |oi seul ))")
        and ( not morph(\0, ":[NAQ]", False) or before("> +$") or ( re.search("(?i)^étais$", \0) and not morph(word(-1), ":[DA].*:p", False, True) ) )
        and not before(r"(?i)\b(?:j(?:e |[’'])|moi(?:,? qui| seul) |t(?:u |[’']|oi,? qui |oi seul ))")
    ->> =suggVerb(@, ":3s")                                                  # Incohérence. Le sujet de cette forme verbale est introuvable.
__[i]/conj(conj_peux_veux_sans_sujet)!3__
    [pv]eux(?! (?:tu|je))
    <<- not (\0[0:1].isupper() and before0(r"\w")) and not before(r"(?i)\b(?:j(?:e |[’'])|moi(?:,? qui| seul) |t(?:u |[’']|oi,? qui |oi seul ))")
    ->> =suggVerb(@, ":3s")                                                  # Incohérence. Le sujet de cette forme verbale est introuvable.
__[i]/conj(conj_équivaux_prévaux_sans_sujet)!3__
    (?:équi|pré|)vaux(?! (?:tu|je))
    <<- not (\0[0:1].isupper() and before0(r"\w"))
    and not (\0 == "vaux" and morph(word(-1), ":(?:R|D.*:p)", False, False))
    and not before(r"(?i)\b(?:j(?:e |[’'])|moi(?:,? qui| seul) |t(?:u |[’']|oi,? qui |oi seul ))")
        and not (\0 == "vaux" and morph(word(-1), ":(?:R|D.*:p)", False, False))
        and not before(r"(?i)\b(?:j(?:e |[’'])|moi(?:,? qui| seul) |t(?:u |[’']|oi,? qui |oi seul ))")
    ->> =suggVerb(@, ":3s")                                                  # Incohérence. Le sujet de cette forme verbale est introuvable.

TEST: Caroline, quand l’heure viendra, {{décideras}} de la conduite à tenir.
TEST: ceux-là, dans tous les cas de figure et dans tous les coups ratés, {{comprenais}} mal pourquoi on leur en voulait.
TEST: Lui, quand il y pensait, en {{arrivai}} à chaque fois à la même conclusion.
TEST: Elle, ici et dans tous les cas de figure, {{veux}} toujours en faire plus.
TEST: Le total de cette opération, contrairement à ce qu’on pense, {{équivaux}} à au moins trois d’entre eux.
TEST: {{j'}}ai signalé que {{j'}}essayais de regrouper les paragraphes. (Tests avec apostrophe droite.)
TEST: je me questionne, {{exiges}} des réponses mais n’en obtiens pas…
TEST: dans tous les cas de figure imaginés par cette bande de nuls, il n’y en a pas un qui les sauvera.
TEST: ces gens qui vont par monts et par vaux.


## Incohérences avec formes verbales 1pl et 2pl sans sujet
__[i]/conj(conj_xxxons_sans_sujet)!3__
    \w+(?:ons|[âîûn]mes)(?! nous)
    <<- morphex(\0, ":V.*:1p", ":[EGMNAJ]") and not (\0[0:1].isupper() and before(r"\w"))
    and not before0(r"\b(?:[nN]ous(?:-mêmes?|)|[eE]t moi(?:-même|)|[nN]i (?:moi|nous)),? ")
        and not before0(r"\b(?:[nN]ous(?:-mêmes?|)|[eE]t moi(?:-même|)|[nN]i (?:moi|nous)),? ")
    ->> =suggVerb(@, ":3p")                                 # Incohérence. Ceci est un verbe à la 1ʳᵉ personne du pluriel. Sujet (“nous” ou équivalent) introuvable.
__[i]/conj(conj_xxxez_sans_sujet)!3__
    \w+(?:ez|[âîûn]tes)(?! vous)
    <<- morphex(\0, ":V.*:2p", ":[EGMNAJ]") and not (\0[0:1].isupper() and before(r"\w"))
    and not before0(r"\b(?:[vV]ous(?:-mêmes?|)|[eE]t toi(?:-même|)|[tT]oi(?:-même|) et|[nN]i (?:vous|toi)),? ")
        and not before0(r"\b(?:[vV]ous(?:-mêmes?|)|[eE]t toi(?:-même|)|[tT]oi(?:-même|) et|[nN]i (?:vous|toi)),? ")
    ->> _                                                   # Incohérence. Ceci est un verbe à la 2ᵉ personne du pluriel. Sujet (“vous” ou équivalent) introuvable.

TEST: les hommes et les femmes, qui sans un bruit, sans une parole amère, {{continuerons}} leur tâche n’en seront pas plus récompensés.
TEST: il était dit que cette femme et son frère {{promènerez}} leur chien à cette heure de la journée.
TEST: cet homme et cette femme {{pouvez}} y parvenir avec de la persévérance
TEST: Comme on lui disait que vous-même aviez déjà consulté le notaire
TEST: ce sont des terroristes et ça ne nous arrivera pas à nous, qui n’avons rien à nous reprocher
5828
5829
5830
5831
5832
5833
5834
5835

5836
5837
5838
5839

5840
5841
5842
5843
5844
5845
5846
5828
5829
5830
5831
5832
5833
5834

5835
5836
5837
5838

5839
5840
5841
5842
5843
5844
5845
5846







-
+



-
+







    <<- __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)) )
        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)) )
        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.
5918
5919
5920
5921
5922
5923
5924
5925

5926
5927
5928
5929

5930
5931
5932
5933
5934
5935
5936
5918
5919
5920
5921
5922
5923
5924

5925
5926
5927
5928

5929
5930
5931
5932
5933
5934
5935
5936







-
+



-
+







    <<- 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)) )
        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)) )
        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.

5992
5993
5994
5995
5996
5997
5998
5999
6000


6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011
6012
6013


6014
6015
6016
6017
6018
6019
6020
5992
5993
5994
5995
5996
5997
5998


5999
6000
6001
6002
6003
6004
6005
6006
6007
6008
6009
6010
6011


6012
6013
6014
6015
6016
6017
6018
6019
6020







-
-
+
+











-
-
+
+









__[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
        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
        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}}
6029
6030
6031
6032
6033
6034
6035
6036

6037
6038
6039
6040
6041
6042
6043
6029
6030
6031
6032
6033
6034
6035

6036
6037
6038
6039
6040
6041
6042
6043







-
+







__<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)) )
        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.

6062
6063
6064
6065
6066
6067
6068
6069

6070
6071
6072
6073
6074
6075
6076


6077
6078
6079
6080
6081
6082


6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095
6096
6097


6098
6099
6100
6101
6102
6103
6104
6105
6106
6107
6108

6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119
6120

6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134
6135
6136


6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155
6156

6157
6158
6159
6160
6161
6162
6163
6062
6063
6064
6065
6066
6067
6068

6069
6070
6071
6072
6073
6074


6075
6076
6077
6078
6079
6080


6081
6082
6083
6084
6085
6086
6087
6088
6089
6090
6091
6092
6093
6094
6095


6096
6097
6098
6099
6100
6101
6102
6103
6104
6105
6106
6107

6108
6109
6110
6111
6112
6113
6114
6115
6116
6117
6118
6119

6120
6121
6122
6123
6124
6125
6126
6127
6128
6129
6130
6131
6132
6133
6134


6135
6136
6137
6138
6139
6140
6141
6142
6143
6144
6145
6146
6147
6148
6149
6150
6151
6152
6153
6154
6155

6156
6157
6158
6159
6160
6161
6162
6163







-
+





-
-
+
+




-
-
+
+













-
-
+
+










-
+











-
+














-
-
+
+



















-
+









## 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)) )
    or \2 in aREGULARPLURAL
        or \2 in aREGULARPLURAL
    -2>> =suggPlur(@)                                                                               # Accord de nombre erroné : « \2 » devrait être au pluriel.
__[i]/gn(gn_les_accord2)__
    ({w_1}) +(les) +({w_2})  @@0,w,$
    <<- morph(\2, ":D", False) >>>
    <<- ( morph(\3, ":[NAQ].*:s")
    or (morphex(\3, ":[NAQ].*:s", ":[pi]|>avoir") and morphex(\1, ":[RC]", ">(?:e[tn]|ou) ") and not (morph(\1, ":Rv", False) and morph(\3, ":Y", False))) )
    and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False))
        or (morphex(\3, ":[NAQ].*:s", ":[pi]|>avoir") and morphex(\1, ":[RC]", ">(?:e[tn]|ou) ") and not (morph(\1, ":Rv", False) and morph(\3, ":Y", False))) )
        and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False))
    -3>> =suggPlur(@)                                                                               # Accord de nombre erroné : « \3 » devrait être au pluriel.
__[i]/gn(gn_les_accord3)__
    ^ *(les) +({w_2})  @@w,$
    <<- (morphex(\2, ":[NAQ].*:s", ":[ipYPGW]")
    and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False)))
    or \2 in aREGULARPLURAL
        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.

TEST: ils viennent, les {{petit}}
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


__[i]/gn(gn_leurs_accord)__
    (leurs) +({w_2})  @@0,$
    <<- (morphex(\2, ":[NAQ].*:s", ":(?:[ipGW]|[123][sp])")
    and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False)))
    or \2 in aREGULARPLURAL
        and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False)))
        or \2 in aREGULARPLURAL
    -2>> =suggPlur(@)                                                                               # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.
    <<- __also__ -1>> leur                                                                          # Accord de nombre erroné avec « \2 ».

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


__[i]/gn(gn_det_pluriel_accord)__
    (?:[dmts]es|[nv]os|quelques|lesdits|moult) +({w_2})  @@$
    <<- (morphex(\1, ":[NAQ].*:s", ":[ipGW]")
    and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False))) or \1 in aREGULARPLURAL
        and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False))) or \1 in aREGULARPLURAL
    -1>> =suggPlur(@)                                                                               # Accord de nombre erroné : « \1 » 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


__[i]/gn(gn_ces_aux_pluriel_accord)__
    (ces|aux) +({w_2})  @@0,$
    <<- (morphex(\2, ":[NAQ].*:s", ":[ipGW]")
    and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False))) or \2 in aREGULARPLURAL
        and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False))) or \2 in aREGULARPLURAL
    -2>> =suggPlur(@)                                                                               # Accord de nombre erroné : « \1 » devrait être au pluriel.
    <<- __also__ and morphex(\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}}


__[i]/gn(gn_plusieurs_accord)__
    plusieurs +({w_2})  @@$
    <<- (morphex(\1, ":[NAQ].*:s", ":[ipGWP]")
    and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False)))
    or \1 in aREGULARPLURAL
        and not (after("^ +(?:et|ou) ") and morph(word(2), ":[NAQ]", True, False)))
        or \1 in aREGULARPLURAL
    -1>> =suggPlur(@)                                                                               # Accord de nombre erroné : « \1 » devrait être au pluriel.

TEST: plusieurs {{foi}} par jour.


## Cas particuliers

__[i]/gn(gn_det_plur_cas_particuliers)__
    (?:[cdmts]es|[nv]os|leurs) (même|point|son|ton) @@$ <<- -1>> \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

__[i]/gn(gn_nombre_de_accord)__
    nombre d(?:e +|’)({w_2})  @@$
    <<- (morphex(\1, ":[NAQ].*:s", ":[ip]|>o(?:nde|xydation|or)\\b") and morphex(word(-1), ":(?:G|[123][sp])", ":[AD]", True))
    or \1 in aREGULARPLURAL
        or \1 in aREGULARPLURAL
    -1>> =suggPlur(@)                                                                               # Ici, « nombre de » devrait probablement être suivi d’un pluriel.

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


__[i]/gn(gn_det_plur_groupe_de_accord)__
    (?:[ldcsmt]es|leurs|nos|vos|quelques) (?:centaine|milli(?:er|ion|iard)|d(?:ix|ouz)aine|multitude|horde)s? +d(?:e +|’)({w_2})  @@$
6192
6193
6194
6195
6196
6197
6198
6199
6200


6201
6202
6203
6204
6205
6206
6207
6208
6209
6210


6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226
6227

6228
6229
6230
6231
6232
6233
6234
6235
6236
6237
6238


6239
6240
6241
6242
6243
6244
6245
6192
6193
6194
6195
6196
6197
6198


6199
6200
6201
6202
6203
6204
6205
6206
6207
6208


6209
6210
6211
6212
6213
6214
6215
6216
6217
6218
6219
6220
6221
6222
6223
6224
6225
6226

6227
6228
6229
6230
6231
6232
6233
6234
6235
6236


6237
6238
6239
6240
6241
6242
6243
6244
6245







-
-
+
+








-
-
+
+
















-
+









-
-
+
+









## Nombres

__[i]/gn(gn_nombre_lettres_accord)__
    (d(?:eux|ix|ouze)|tr(?:ois|eize)|qua(?:tre(?:-vingt(?:s|-dix)|)|torze|rante)|cinq(?:uante|)|six|sept(?:ante|)|huit(?:ante|)|onze|quinze|seize|vingt|trente|soixante(?:-dix|)|cents?|octante|nonante) +({w_2})  @@0,$
    <<- (morph(\2, ":[NAQ].*:s")
    and not re.search("(?i)^(janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|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)$", \2))
    or \2 in aREGULARPLURAL
        and not re.search("(?i)^(janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|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)$", \2))
        or \2 in aREGULARPLURAL
    -2>> =suggPlur(@)                                                                               # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

TEST: ce sont trois {{idiot}} pas foutus de trouver leur chemin avec un GPS.


__[i]/gn(gn_neuf_accord)__
    (neuf) +({w_2})  @@0,$
    <<- (morph(\2, ":[NAQ].*:s") and not morph(word(-1), ":N", False)
    and not re.search("(?i)^(janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|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)$", \2))
    or \2 in aREGULARPLURAL
        and not re.search("(?i)^(janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|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)$", \2))
        or \2 in aREGULARPLURAL
    -2>> =suggPlur(@)                                                                               # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

TEST: Il a abandonné neuf {{enfant}}.


__[i]/gn(gn_mille_accord)__
    mille +({w_2})  @@$
    <<- (morph(\1, ":[NAQ].*:s") or \1 in aREGULARPLURAL) and not before(r"(?i)\b(?:le|un|ce|du) +$")
    -1>> =suggPlur(@)                                                                               # Accord de nombre erroné avec « mille » : « \1 » devrait être au pluriel.

TEST: On peut trouver mille {{travailleur}} d’un claquement de doigts.


__[i]/gn(gn_01_accord)__
    [01] ({w_2})  @@$
    <<- morph(\1, ":[NAQ].*:p")
    and not re.search("(?i)^(janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|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|Rois|Corinthiens|Thessaloniciens)$", \1)
        and not re.search("(?i)^(janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|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|Rois|Corinthiens|Thessaloniciens)$", \1)
    -1>> =suggSing(@)                                                                               # Accord de nombre erroné : « \1 » devrait être au singulier.

TEST: 00 heure, 01 heure
TEST: il a adopté 1 {{chiens}}.


__[i]/gn(gn_nombre_chiffres_accord)__
    (?<!/)(\d+) ({w_2})  @@0,$
    <<- not re.search("^0*[01]$", \1)
    and ((morph(\2, ":[NAQ].*:s") and not re.search("(?i)^(janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|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)$", \2))
    or \1 in aREGULARPLURAL)
        and ((morph(\2, ":[NAQ].*:s") and not re.search("(?i)^(janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|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)$", \2))
        or \1 in aREGULARPLURAL)
    -2>> =suggPlur(@)                                                                               # Accord de nombre erroné : « \2 » devrait être au pluriel.

TEST: 22 {{heure}}
TEST: 3 {{heure}}


## quel / quels / quelle / quelles
6390
6391
6392
6393
6394
6395
6396
6397

6398
6399
6400
6401

6402
6403
6404
6405
6406
6407
6408
6409
6410
6411
6412

6413
6414
6415
6416

6417
6418
6419
6420
6421
6422
6423
6424
6425
6426
6427

6428
6429
6430
6431

6432
6433
6434
6435
6436
6437
6438
6390
6391
6392
6393
6394
6395
6396

6397
6398
6399
6400

6401
6402
6403
6404
6405
6406
6407
6408
6409
6410
6411

6412
6413
6414
6415

6416
6417
6418
6419
6420
6421
6422
6423
6424
6425
6426

6427
6428
6429
6430

6431
6432
6433
6434
6435
6436
6437
6438







-
+



-
+










-
+



-
+










-
+



-
+









## Prépositions

__[i]/gn(gn_2m_pfx_en)__
    en +({w_2}) +({w_2})  @@w,$
    <<- ( (morph(\1, ":[NAQ].*:m") and morph(\2, ":[NAQ].*:f")) or (morph(\1, ":[NAQ].*:f") and morph(\2, ":[NAQ].*:m")) )
    and not apposition(\1, \2) and morph(word(-1), ":[VRX]", True, True)
        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 ».
    <<- ( (morph(\1, ":[NAQ].*:p") and morph(\2, ":[NAQ].*:s")) or (morph(\1, ":[NAQ].*:s") and morph(\2, ":[NAQ].*:p")) )
    and not apposition(\1, \2) and morph(word(-1), ":[VRX]", True, True)
        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 ».

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


__[i]/gn(gn_2m_pfx_à_par_pour_sans)__
    (?:à|par|pour|sans) +({w_2}) +({w_2})  @@w,$
    <<- ( (morphex(\1, ":[NAQ].*:m", ":[GYfe]") and morph(\2, ":[NAQ].*:f")) or (morphex(\1, ":[NAQ].*:f", ":[GYme]") and morph(\2, ":[NAQ].*:m")) )
    and not apposition(\1, \2) and morph(word(-1), ":[VRX]", True, True)
        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 ».
    <<- ( (morphex(\1, ":[NAQ].*:p", ":[GYsi]") and morph(\2, ":[NAQ].*:s")) or (morphex(\1, ":[NAQ].*:s", ":[GYpi]") and morph(\2, ":[NAQ].*:p")) )
    and not apposition(\1, \2) and morph(word(-1), ":[VRX]", True, True)
        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 ».

TEST: à {{grande}} {{enjambées}}
TEST: pour {{belle}} {{appartement}}


__[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)
        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 ».
    <<- ( (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)
        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 ».

TEST: Ils ont de {{grandes}} {{oreille}}
TEST: de {{grands}} {{homme}}
TEST: de {{manière}} {{légal}}
TEST: de {{petite}} {{homme}}
6452
6453
6454
6455
6456
6457
6458
6459
6460


6461
6462
6463
6464
6465


6466
6467
6468
6469
6470
6471


6472
6473
6474
6475
6476


6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489
6490
6491


6492
6493
6494

6495
6496
6497
6498
6499
6500
6501



6502
6503
6504
6505


6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518
6519
6520


6521
6522
6523

6524
6525
6526
6527
6528
6529
6530



6531
6532
6533
6534


6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549
6550
6551


6552
6553
6554
6555


6556
6557
6558
6559
6560
6561
6562


6563
6564
6565
6566


6567
6568
6569
6570
6571
6572
6573
6574
6575
6576
6577
6578


6579
6580
6581
6582


6583
6584
6585
6586
6587
6588


6589
6590
6591
6592


6593
6594
6595
6596
6597
6598
6599
6600
6601
6602
6603


6604
6605
6606
6607


6608
6609
6610
6611
6612
6613


6614
6615
6616
6617
6618



6619
6620
6621
6622
6623
6624
6625
6626
6627
6628
6629
6630


6631
6632
6633
6634


6635
6636
6637
6638
6639
6640
6641


6642
6643
6644
6645


6646
6647
6648
6649
6650
6651
6652
6653
6654
6655
6656


6657
6658
6659
6660


6661
6662
6663
6664
6665
6666


6667
6668
6669
6670


6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681
6682
6683


6684
6685
6686
6687
6688


6689
6690
6691
6692
6693
6694
6695
6696



6697
6698
6699
6700
6701


6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712
6713
6714


6715
6716
6717
6718
6719


6720
6721
6722
6723
6724
6725
6726



6727
6728
6729
6730
6731


6732
6733
6734
6735
6736
6737
6738
6739
6740
6741
6742


6743
6744
6745
6746
6747



6748
6749
6750
6751
6752
6753
6754



6755
6756
6757
6758
6759



6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770
6771
6772


6773
6774
6775
6776
6777



6778
6779
6780
6781
6782
6783
6784



6785
6786
6787
6788
6789



6790
6791
6792
6793
6794
6795
6796
6797
6798
6799
6800


6801
6802
6803
6804
6805
6806



6807
6808
6809
6810
6811
6812
6813
6814



6815
6816
6817
6818
6819
6820



6821
6822
6823
6824
6825
6826
6827
6828
6829
6830
6831


6832
6833
6834
6835
6836
6837



6838
6839
6840
6841
6842
6843
6844



6845
6846
6847
6848
6849
6850



6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862
6863
6864
6865



6866
6867
6868
6869
6870


6871
6872
6873
6874
6875
6876
6877
6452
6453
6454
6455
6456
6457
6458


6459
6460
6461
6462
6463


6464
6465
6466
6467
6468
6469


6470
6471
6472
6473
6474


6475
6476
6477
6478
6479
6480
6481
6482
6483
6484
6485
6486
6487
6488
6489


6490
6491
6492
6493

6494
6495
6496
6497
6498



6499
6500
6501
6502
6503


6504
6505
6506
6507
6508
6509
6510
6511
6512
6513
6514
6515
6516
6517
6518


6519
6520
6521
6522

6523
6524
6525
6526
6527



6528
6529
6530
6531
6532


6533
6534
6535
6536
6537
6538
6539
6540
6541
6542
6543
6544
6545
6546
6547
6548
6549


6550
6551
6552
6553


6554
6555
6556
6557
6558
6559
6560


6561
6562
6563
6564


6565
6566
6567
6568
6569
6570
6571
6572
6573
6574
6575
6576


6577
6578
6579
6580


6581
6582
6583
6584
6585
6586


6587
6588
6589
6590


6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601


6602
6603
6604
6605


6606
6607
6608
6609
6610
6611


6612
6613
6614
6615



6616
6617
6618
6619
6620
6621
6622
6623
6624
6625
6626
6627
6628


6629
6630
6631
6632


6633
6634
6635
6636
6637
6638
6639


6640
6641
6642
6643


6644
6645
6646
6647
6648
6649
6650
6651
6652
6653
6654


6655
6656
6657
6658


6659
6660
6661
6662
6663
6664


6665
6666
6667
6668


6669
6670
6671
6672
6673
6674
6675
6676
6677
6678
6679
6680
6681


6682
6683
6684
6685
6686


6687
6688
6689
6690
6691
6692
6693



6694
6695
6696
6697
6698
6699


6700
6701
6702
6703
6704
6705
6706
6707
6708
6709
6710
6711
6712


6713
6714
6715
6716
6717


6718
6719
6720
6721
6722
6723



6724
6725
6726
6727
6728
6729


6730
6731
6732
6733
6734
6735
6736
6737
6738
6739
6740


6741
6742
6743
6744



6745
6746
6747
6748
6749
6750
6751



6752
6753
6754
6755
6756



6757
6758
6759
6760
6761
6762
6763
6764
6765
6766
6767
6768
6769
6770


6771
6772
6773
6774



6775
6776
6777
6778
6779
6780
6781



6782
6783
6784
6785
6786



6787
6788
6789
6790
6791
6792
6793
6794
6795
6796
6797
6798


6799
6800
6801
6802
6803



6804
6805
6806
6807
6808
6809
6810
6811



6812
6813
6814
6815
6816
6817



6818
6819
6820
6821
6822
6823
6824
6825
6826
6827
6828
6829


6830
6831
6832
6833
6834



6835
6836
6837
6838
6839
6840
6841



6842
6843
6844
6845
6846
6847



6848
6849
6850
6851
6852
6853
6854
6855
6856
6857
6858
6859
6860
6861
6862



6863
6864
6865
6866
6867
6868


6869
6870
6871
6872
6873
6874
6875
6876
6877







-
-
+
+



-
-
+
+




-
-
+
+



-
-
+
+













-
-
+
+


-
+




-
-
-
+
+
+


-
-
+
+













-
-
+
+


-
+




-
-
-
+
+
+


-
-
+
+















-
-
+
+


-
-
+
+





-
-
+
+


-
-
+
+










-
-
+
+


-
-
+
+




-
-
+
+


-
-
+
+









-
-
+
+


-
-
+
+




-
-
+
+


-
-
-
+
+
+










-
-
+
+


-
-
+
+





-
-
+
+


-
-
+
+









-
-
+
+


-
-
+
+




-
-
+
+


-
-
+
+











-
-
+
+



-
-
+
+





-
-
-
+
+
+



-
-
+
+











-
-
+
+



-
-
+
+




-
-
-
+
+
+



-
-
+
+









-
-
+
+


-
-
-
+
+
+




-
-
-
+
+
+


-
-
-
+
+
+











-
-
+
+


-
-
-
+
+
+




-
-
-
+
+
+


-
-
-
+
+
+









-
-
+
+



-
-
-
+
+
+





-
-
-
+
+
+



-
-
-
+
+
+









-
-
+
+



-
-
-
+
+
+




-
-
-
+
+
+



-
-
-
+
+
+












-
-
-
+
+
+



-
-
+
+









## 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) +$")
        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) +$")
        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.
__[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)
        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)
        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")
    and morphex(\1, ":[NAQ].*:[me]", ":(?:B|G|V0|f)") and morph(\2, ":[NAQ].*:f")
    and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
        and morphex(\1, ":[NAQ].*:[me]", ":(?:B|G|V0|f)") and morph(\2, ":[NAQ].*:f")
        and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
    -2>> =suggMasSing(@, True)                                                                      # Accord de genre erroné : « \1 » est masculin, « \2 » est féminin.
    <<- morphex(\1, ":[NAQ].*:[si]", ":G") and morph(\2, ":[NAQ].*:p") and not \2.startswith("seul")
    and not apposition(\1, \2) and not before(r"\b(?:et|ou|d’) *$")
        and not apposition(\1, \2) and not before(r"\b(?:et|ou|d’) *$")
    -2>> =suggMasSing(@)                                                                            # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.
__[i]/gn(gn_2m_un_après_et_ou_de)__
    (?:et +|ou +|d’)un +({w_2}) +({w_2})  @@w,$
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[me]", ":(?:B|G|V0|f)") and morph(\2, ":[NAQ].*:f")
    and not apposition(\1, \2)
    and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and morphex(\1, ":[NAQ].*:[me]", ":(?:B|G|V0|f)") and morph(\2, ":[NAQ].*:f")
        and not apposition(\1, \2)
        and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -2>> =suggMasSing(@, True)                                                                      # Accord de genre erroné : « \1 » est masculin, « \2 » est féminin.
    <<- morphex(\1, ":[NAQ].*:[si]", ":G") and morph(\2, ":[NAQ].*:p") and not \2.startswith("seul")
    and not apposition(\1, \2)
    and not morph(word(-1), ":[NAQB]|>(?:et|ou) ", False, False)
        and not apposition(\1, \2)
        and not morph(word(-1), ":[NAQB]|>(?:et|ou) ", False, False)
    -2>> =suggMasSing(@)                                                                            # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.

TEST: un exercice pas très {{utiles}}.                        ->> utile
TEST: un homme {{grands}}                                     ->> grand
TEST: un homme {{futiles}}                                    ->> futile
TEST: Une femme {{laconiques}}.                               ->> laconique
TEST: je me souviens d’un homme {{arrogants}}
TEST: C’est pas les quelques vues sur Linux qui vont rattraper un scénario {{bancale}}.


__[i]/gn(gn_2m_une)__
    (?<!et |ou | d’)une +({w_2}) +({w_2})  @@w,$
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[fe]", ":(?:B|G|V0|m)") and morph(\2, ":[NAQ].*:m")
    and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
        and morphex(\1, ":[NAQ].*:[fe]", ":(?:B|G|V0|m)") and morph(\2, ":[NAQ].*:m")
        and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
    -2>> =suggFemSing(@, True)                                                                      # Accord de genre erroné : « \1 » est féminin, « \2 » est masculin.
    <<- \1 != "fois" and morph(\1, ":[NAQ].*:[si]", False) and morph(\2, ":[NAQ].*:p") and not \2.startswith("seul")
    and not apposition(\1, \2) and not before(r"\b(?:et|ou|d’) *$")
        and not apposition(\1, \2) and not before(r"\b(?:et|ou|d’) *$")
    -2>> =suggFemSing(@)                                                                            # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.
__[i]/gn(gn_2m_une_après_et_ou_de)__
    (?:et +|ou +|d’)une +({w_2}) +({w_2})  @@w,$
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[fe]", ":(?:B|G|V0|m)") and morph(\2, ":[NAQ].*:m")
    and not apposition(\1, \2)
    and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and morphex(\1, ":[NAQ].*:[fe]", ":(?:B|G|V0|m)") and morph(\2, ":[NAQ].*:m")
        and not apposition(\1, \2)
        and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -2>> =suggFemSing(@, True)                                                                      # Accord de genre erroné : « \1 » est féminin, « \2 » est masculin.
    <<- \1 != "fois" and morph(\1, ":[NAQ].*:[si]", False) and morph(\2, ":[NAQ].*:p") and not \2.startswith("seul")
    and not apposition(\1, \2)
    and not morph(word(-1), ":[NAQB]|>(?:et|ou) ", False, False)
        and not apposition(\1, \2)
        and not morph(word(-1), ":[NAQB]|>(?:et|ou) ", False, False)
    -2>> =suggFemSing(@)                                                                            # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.

TEST: Une grande {{homme}}.
TEST: une géologue {{intelligents}}
TEST: Et une femme {{déterminées}}
TEST: on parle là d’une femme {{inconnu}}
TEST: L’or allume le feu d’une cupidité d’une couleur et d’une sorte différentes.


## articles divers

__[i]/gn(gn_2m_le)__
    (?<!et |ou )(le) +({w_2}) +({w_2})  @@0,w,$
    <<- morph(\1, ":D", False) >>>
    <<- not \3.startswith("seul")
    and morphex(\2, ":[NAQ].*:[me]", ":(?:B|G|V0|f)") and morph(\3, ":[NAQ].*:f")
    and not apposition(\2, \3) and not before(r"\b(?:et|ou|de) +$")
        and morphex(\2, ":[NAQ].*:[me]", ":(?:B|G|V0|f)") and morph(\3, ":[NAQ].*:f")
        and not apposition(\2, \3) and not before(r"\b(?:et|ou|de) +$")
    -3>> =suggMasSing(@, True)                                                                      # Accord de genre erroné : « \2 » est masculin, « \3 » est féminin.
    <<- not \3.startswith("seul") 
    and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":[NAQ].*:p", ":[GWsi]")
    and not apposition(\2, \3) and not before(r"\b(?:et|ou|de) +$")
        and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":[NAQ].*:p", ":[GWsi]")
        and not apposition(\2, \3) and not before(r"\b(?:et|ou|de) +$")
    -3>> =suggMasSing(@)                                                                            # Accord de nombre erroné avec « \2 » : « \3 » devrait être au singulier.
__[i]/gn(gn_2m_le_après_et_ou_de)__
    (?:et|ou) +(le) +({w_2}) +({w_2})  @@w,w,$
    <<- morph(\1, ":D", False) >>>
    <<- not \3.startswith("seul")
    and morphex(\2, ":[NAQ].*:[me]", ":(?:B|G|V0|f)") and morph(\3, ":[NAQ].*:f")
    and not apposition(\2, \3) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and morphex(\2, ":[NAQ].*:[me]", ":(?:B|G|V0|f)") and morph(\3, ":[NAQ].*:f")
        and not apposition(\2, \3) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -3>> =suggMasSing(@, True)                                                                      # Accord de genre erroné : « \2 » est masculin, « \3 » est féminin.
    <<- not \3.startswith("seul")
    and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":[NAQ].*:p", ":[GWsi]")
    and not apposition(\2, \3) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":[NAQ].*:p", ":[GWsi]")
        and not apposition(\2, \3) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -3>> =suggMasSing(@)                                                                            # Accord de nombre erroné avec « \2 » : « \3 » devrait être au singulier.    

TEST: le test très {{cons}} qu’on a passé hier.
TEST: c’était le chien {{perdue}} des voisins.
TEST: viens vite ou le pari {{imperdables}} sera moins facile…


__[i]/gn(gn_2m_det_mas_sing)__
    (?<!et |ou |de )(?:cet?|quel|au|ledit) +({w_2}) +({w_2})  @@w,$
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[me]", ":(?:B|G|V0|f)") and morph(\2, ":[NAQ].*:f")
    and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
        and morphex(\1, ":[NAQ].*:[me]", ":(?:B|G|V0|f)") and morph(\2, ":[NAQ].*:f")
        and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
    -2>> =suggMasSing(@, True)                                                                      # Accord de genre erroné : « \1 » est masculin, « \2 » est féminin.
    <<- not \2.startswith("seul") 
    and morphex(\1, ":[NAQ].*:[si]", ":G") and morphex(\2, ":[NAQ].*:p", ":[GWsi]")
    and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
        and morphex(\1, ":[NAQ].*:[si]", ":G") and morphex(\2, ":[NAQ].*:p", ":[GWsi]")
        and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
    -2>> =suggMasSing(@)                                                                            # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.
__[i]/gn(gn_2m_det_mas_sing_après_et_ou_de)__
    (?:et|ou|de) +(?:cet?|quel|au|ledit) +({w_2}) +({w_2})  @@w,$
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[me]", ":(?:B|G|V0|f)") and morph(\2, ":[NAQ].*:f")
    and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and morphex(\1, ":[NAQ].*:[me]", ":(?:B|G|V0|f)") and morph(\2, ":[NAQ].*:f")
        and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -2>> =suggMasSing(@, True)                                                                      # Accord de genre erroné : « \1 » est masculin, « \2 » est féminin.
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[si]", ":G") and morphex(\2, ":[NAQ].*:p", ":[GWsi]")
    and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and morphex(\1, ":[NAQ].*:[si]", ":G") and morphex(\2, ":[NAQ].*:p", ":[GWsi]")
        and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -2>> =suggMasSing(@)                                                                            # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.    

TEST: cet outil {{terribles}} qu’il a dans les mains
TEST: J’aimerais connaître de quel parti {{gauchistes}} on parle.


__[i]/gn(gn_2m_mon_ton_son)__
    (?<!et |ou |de )[mts]on +({w_2}) +({w_2})  @@w,$
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:m", ":(?:B|G|e|V0|f)") and morph(\2, ":[NAQ].*:f")
    and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
        and morphex(\1, ":[NAQ].*:m", ":(?:B|G|e|V0|f)") and morph(\2, ":[NAQ].*:f")
        and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
    -2>> =suggMasSing(@, True)                                                                      # Accord de genre erroné : « \1 » est masculin, « \2 » est féminin.
    <<- not \2.startswith("seul") 
    and morphex(\1, ":[NAQ].*:[si]", ":G") and morphex(\2, ":[NAQ].*:p", ":[GWsi]")
    and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
        and morphex(\1, ":[NAQ].*:[si]", ":G") and morphex(\2, ":[NAQ].*:p", ":[GWsi]")
        and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
    -2>> =suggMasSing(@)                                                                            # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.
__[i]/gn(gn_2m_mon_ton_son_après_et_ou_de)__
    (?:et|ou|de) +[mts]on +({w_2}) +({w_2})  @@w,$
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:m", ":(?:B|G|e|V0|f)") and morph(\2, ":[NAQ].*:f")
    and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and morphex(\1, ":[NAQ].*:m", ":(?:B|G|e|V0|f)") and morph(\2, ":[NAQ].*:f")
        and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -2>> =suggMasSing(@, True)                                                                      # Accord de genre erroné : « \1 » est masculin, « \2 » est féminin.
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[si]", ":G") and morphex(\2, ":[NAQ].*:p", ":[GWsi]")
    and not apposition(\1, \2)
    and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and morphex(\1, ":[NAQ].*:[si]", ":G") and morphex(\2, ":[NAQ].*:p", ":[GWsi]")
        and not apposition(\1, \2)
        and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -2>> =suggMasSing(@)                                                                            # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.    

TEST: il brandissait avec fougue son drapeau {{déchirés}}
TEST: comment osez-vous médire de mon héritage {{glorieuse}}


__[i]/gn(gn_2m_la)__
    (?<!et |ou |de )(la) +({w_2}) +({w_2})  @@0,w,$
    <<- morph(\1, ":D", False) >>>
    <<- \2 != "fois" and not \3.startswith("seul")
    and morphex(\2, ":[NAQ].*:[fe]", ":(?:B|G|V0|m)") and morph(\3, ":[NAQ].*:m")
    and not apposition(\2, \3) and not before(r"\b(?:et|ou|de) +$")
        and morphex(\2, ":[NAQ].*:[fe]", ":(?:B|G|V0|m)") and morph(\3, ":[NAQ].*:m")
        and not apposition(\2, \3) and not before(r"\b(?:et|ou|de) +$")
    -3>> =suggFemSing(@, True)                                                                      # Accord de genre erroné : « \2 » est féminin, « \3 » est masculin.
    <<- not \3.startswith("seul") 
    and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":[NAQ].*:p", ":[GWsi]")
    and not apposition(\2, \3) and not before(r"\b(?:et|ou|de) +$")
        and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":[NAQ].*:p", ":[GWsi]")
        and not apposition(\2, \3) and not before(r"\b(?:et|ou|de) +$")
    -3>> =suggFemSing(@)                                                                            # Accord de nombre erroné avec « \2 » : « \3 » devrait être au singulier.
__[i]/gn(gn_2m_la_après_et_ou_de)__
    (?:et|ou|de) +(la) +({w_2}) +({w_2})  @@w,w,$
    <<- morph(\1, ":D", False) >>>
    <<- \2 != "fois" and not \3.startswith("seul")
    and morphex(\2, ":[NAQ].*:[fe]", ":(?:B|G|V0|m)") and morph(\3, ":[NAQ].*:m")
    and not apposition(\2, \3) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and morphex(\2, ":[NAQ].*:[fe]", ":(?:B|G|V0|m)") and morph(\3, ":[NAQ].*:m")
        and not apposition(\2, \3) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -3>> =suggFemSing(@, True)                                                                      # Accord de genre erroné : « \2 » est féminin, « \3 » est masculin.
    <<- not \3.startswith("seul")
    and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":[NAQ].*:p", ":[GWsi]")
    and not apposition(\2, \3) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":[NAQ].*:p", ":[GWsi]")
        and not apposition(\2, \3) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -3>> =suggFemSing(@)                                                                            # Accord de nombre erroné avec « \2 » : « \3 » devrait être au singulier.

TEST: La plus grande {{cinglé}}.
TEST: il imaginait de la pluie {{noir}} tombant sur une terre dévastée.


__[i]/gn(gn_2m_det_fem_sing)__
    (?<!et |ou |de )(?:[mts]a|cette|quelle|ladite) +({w_2}) +({w_2})  @@w,$
    <<- \1 != "fois" and not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[fe]", ":(?:B|G|V0|m)") and morph(\2, ":[NAQ].*:m")
    and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
        and morphex(\1, ":[NAQ].*:[fe]", ":(?:B|G|V0|m)") and morph(\2, ":[NAQ].*:m")
        and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
    -2>> =suggFemSing(@, True)                                                                      # Accord de genre erroné : « \1 » est féminin, « \2 » est masculin.
    <<- not \2.startswith("seul") 
    and morphex(\1, ":[NAQ].*:[si]", ":G") and morphex(\2, ":[NAQ].*:p", ":[GWsi]")
    and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
        and morphex(\1, ":[NAQ].*:[si]", ":G") and morphex(\2, ":[NAQ].*:p", ":[GWsi]")
        and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
    -2>> =suggFemSing(@)                                                                            # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.
__[i]/gn(gn_2m_det_fem_sing_après_et_ou_de)__
    (?:et|ou|de) +(?:[mts]a|cette|quelle|ladite) +({w_2}) +({w_2})  @@w,$
    <<- \1 != "fois" and not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[fe]", ":(?:B|G|V0|m)") and morph(\2, ":[NAQ].*:m")
    and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and morphex(\1, ":[NAQ].*:[fe]", ":(?:B|G|V0|m)") and morph(\2, ":[NAQ].*:m")
        and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -2>> =suggFemSing(@, True)                                                                      # Accord de genre erroné : « \1 » est féminin, « \2 » est masculin.
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[si]", ":G") and morphex(\2, ":[NAQ].*:p", ":[GWsi]")
    and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and morphex(\1, ":[NAQ].*:[si]", ":G") and morphex(\2, ":[NAQ].*:p", ":[GWsi]")
        and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -2>> =suggFemSing(@)                                                                            # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.

TEST: quelle belle {{étourdi}}, cette gamine
TEST: j’en ai assez de cette ville {{stressées}} en permanence.
TEST: Peut-on imaginer de plus {{beaux}} {{enfant}} ?


__[i]/gn(gn_2m_leur)__
    (?<!et |ou |de )(leur) +({w_2}) +({w_2})  @@0,w,$
    <<- morph(\1, ":D", False) >>>
    <<- \2 != "fois" and not \3.startswith("seul")
    and ((morphex(\2, ":[NAQ].*:m", ":(?:B|e|G|V0|f)") and morph(\3, ":[NAQ].*:f")) or (morphex(\2, ":[NAQ].*:f", ":(?:B|e|G|V0|m)") and morph(\3, ":[NAQ].*:m")))
    and not apposition(\2, \3) and not before(r"\b(?:et|ou|de) +$")
        and ((morphex(\2, ":[NAQ].*:m", ":(?:B|e|G|V0|f)") and morph(\3, ":[NAQ].*:f")) or (morphex(\2, ":[NAQ].*:f", ":(?:B|e|G|V0|m)") and morph(\3, ":[NAQ].*:m")))
        and not apposition(\2, \3) and not before(r"\b(?:et|ou|de) +$")
    -3>> =switchGender(@, False)                                                                    # Accord de genre erroné entre « \2 » et « \3 ».
    <<- __also__ and hasFemForm(\2) -1>> =switchGender(@, False)                                    # Accord de genre erroné avec « \3 ».
    <<- not \3.startswith("seul")
    and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":[NAQ].*:p", ":[GWsi]")
    and not apposition(\2, \3) and not before(r"\b(?:et|ou|de) +$")
        and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":[NAQ].*:p", ":[GWsi]")
        and not apposition(\2, \3) and not before(r"\b(?:et|ou|de) +$")
    -3>> =suggSing(@)                                                                               # Accord de nombre erroné avec « \2 » : « \3 » devrait être au singulier.
__[i]/gn(gn_2m_leur_après_et_ou_de)__
    (?:et|ou|de) +(leur) +({w_2}) +({w_2})  @@w,w,$
    <<- morph(\1, ":D", False) >>>
    <<- \2 != "fois" and not \3.startswith("seul")
    and ((morphex(\2, ":[NAQ].*:m", ":(?:B|e|G|V0|f)") and morph(\3, ":[NAQ].*:f")) or (morphex(\2, ":[NAQ].*:f", ":(?:B|e|G|V0|m)") and morph(\3, ":[NAQ].*:m")))
    and not apposition(\2, \3)
    and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and ((morphex(\2, ":[NAQ].*:m", ":(?:B|e|G|V0|f)") and morph(\3, ":[NAQ].*:f")) or (morphex(\2, ":[NAQ].*:f", ":(?:B|e|G|V0|m)") and morph(\3, ":[NAQ].*:m")))
        and not apposition(\2, \3)
        and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -3>> =switchGender(@, False)                                                                    # Accord de genre erroné entre « \2 » et « \3 ».
    <<- __also__ and hasFemForm(\2) -1>> =switchGender(@, False)                                    # Accord de genre erroné avec « \3 ».
    <<- not \3.startswith("seul")
    and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":[NAQ].*:p", ":[GWsi]")
    and not apposition(\2, \3) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":[NAQ].*:p", ":[GWsi]")
        and not apposition(\2, \3) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -3>> =suggSing(@)                                                                               # Accord de nombre erroné avec « \2 » : « \3 » devrait être au singulier.

TEST: leur puissance {{perdues}}
TEST: leur arbre {{élaguée}}
TEST: je me souviens de leur verve {{décalé}}
TEST: ils arrivent et leur arrogance {{insupportables}} nous fatigue tous.


__[i]/gn(gn_2m_det_epi_sing)__
    (?<!et |ou |de )(?:chaque|quelque|[nv]otre) +({w_2}) +({w_2})  @@w,$
    <<- \1 != "fois" and not \2.startswith("seul") and not re.search("(?i)^quelque chose", \0)
    and ((morphex(\1, ":[NAQ].*:m", ":(?:B|e|G|V0|f)") and morph(\2, ":[NAQ].*:f")) or (morphex(\1, ":[NAQ].*:f", ":(?:B|e|G|V0|m)") and morph(\2, ":[NAQ].*:m")))
    and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
        and ((morphex(\1, ":[NAQ].*:m", ":(?:B|e|G|V0|f)") and morph(\2, ":[NAQ].*:f")) or (morphex(\1, ":[NAQ].*:f", ":(?:B|e|G|V0|m)") 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(@, False)                                    # Accord de genre erroné avec « \2 ».
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[si]", ":G") and morphex(\2, ":[NAQ].*:p", ":[GWsi]")
    and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
        and morphex(\1, ":[NAQ].*:[si]", ":G") and morphex(\2, ":[NAQ].*:p", ":[GWsi]")
        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.
__[i]/gn(gn_2m_det_epi_sing_après_et_ou_de)__
    (?:et|ou|de) +(?:chaque|quelque|[nv]otre) +({w_2}) +({w_2})  @@w,$
    <<- \1 != "fois" and not \2.startswith("seul") and not re.search("(?i)quelque chose", \0)
    and ((morphex(\1, ":[NAQ].*:m", ":(?:B|e|G|V0|f)") and morph(\2, ":[NAQ].*:f")) or (morphex(\1, ":[NAQ].*:f", ":(?:B|e|G|V0|m)") and morph(\2, ":[NAQ].*:m")))
    and not apposition(\1, \2)
    and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and ((morphex(\1, ":[NAQ].*:m", ":(?:B|e|G|V0|f)") and morph(\2, ":[NAQ].*:f")) or (morphex(\1, ":[NAQ].*:f", ":(?:B|e|G|V0|m)") and morph(\2, ":[NAQ].*:m")))
        and not apposition(\1, \2)
        and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -2>> =switchGender(@, False)                                                                    # Accord de genre erroné entre « \1 » et « \2 ».
    <<- __also__ and hasFemForm(\1) -1>> =switchGender(@, False)                                    # Accord de genre erroné avec « \2 ».
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[si]", ":G") and morphex(\2, ":[NAQ].*:p", ":[GWsi]")
    and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and morphex(\1, ":[NAQ].*:[si]", ":G") and morphex(\2, ":[NAQ].*:p", ":[GWsi]")
        and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -2>> =suggSing(@)                                                                               # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier.

TEST: chaque élément {{terrestres}}
TEST: ils viennent de chaque coin {{ignorée}} du pays.


__[i]/gn(gn_2m_det_mas_plur)__
    (?<!et |ou |de )(?:certains|quels|lesdits) +({w_2}) +({w_2})  @@w,$
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[me]", ":(?:B|G|V0|f)") and morph(\2, ":[NAQ].*:f")
    and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
        and morphex(\1, ":[NAQ].*:[me]", ":(?:B|G|V0|f)") and morph(\2, ":[NAQ].*:f")
        and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
    -2>> =suggMasPlur(@, True)                                                                      # Accord de genre erroné : « \1 » est masculin, « \2 » est féminin.
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[pi]", ":G") and morph(\2, ":[NAQ].*:s")
    and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
    and not before(r"(?i)\bune de ")
        and morphex(\1, ":[NAQ].*:[pi]", ":G") and morph(\2, ":[NAQ].*:s")
        and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
        and not before(r"(?i)\bune de ")
    -2>> =suggMasPlur(@)                                                                            # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.
__[i]/gn(gn_2m_det_mas_plur_après_et_ou_de)__
    (?:et|ou|de) +(?:certains|quels|lesdits) +({w_2}) +({w_2})  @@w,$
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[me]", ":(?:B|G|V0|f)") and morph(\2, ":[NAQ].*:f")
    and not apposition(\1, \2)
    and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and morphex(\1, ":[NAQ].*:[me]", ":(?:B|G|V0|f)") and morph(\2, ":[NAQ].*:f")
        and not apposition(\1, \2)
        and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -2>> =suggMasPlur(@, True)                                                                      # Accord de genre erroné : « \1 » est masculin, « \2 » est féminin.
    <<- not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[pi]", ":G") and morph(\2, ":[NAQ].*:s")
    and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
    and not ( before(r"(?i)\bune? de ") or (\0.startswith("de") and before(r"(?i)\bune? +$")) )
        and morphex(\1, ":[NAQ].*:[pi]", ":G") and morph(\2, ":[NAQ].*:s")
        and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
        and not ( before(r"(?i)\bune? de ") or (\0.startswith("de") and before(r"(?i)\bune? +$")) )
    -2>> =suggMasPlur(@)                                                                            # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

TEST: certains claviers {{dégueulasse}}
TEST: certains hommes {{petite}}
TEST: elle se rappelle de quels rapports {{désastreuses}} il s’agit.
TEST: chez certains la revue Limite provoque des crises d’hystérie.


__[i]/gn(gn_2m_det_fem_plur)__
    (?<!et |ou |de )(?:certaines|quelles|lesdites) +({w_2}) +({w_2})  @@w,$
    <<- \1 != "fois" and not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[fe]", ":(?:B|G|V0|m)") and morph(\2, ":[NAQ].*:m")
    and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
        and morphex(\1, ":[NAQ].*:[fe]", ":(?:B|G|V0|m)") and morph(\2, ":[NAQ].*:m")
        and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
    -2>> =suggFemPlur(@, True)                                                                      # Accord de genre erroné : « \1 » est féminin, « \2 » est masculin.
    <<- not \2.startswith("seul")
    and morph(\1, ":[NAQ].*:[pi]", False) and morph(\2, ":[NAQ].*:s")
    and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
    and not before(r"(?i)\bune de ")
        and morph(\1, ":[NAQ].*:[pi]", False) and morph(\2, ":[NAQ].*:s")
        and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
        and not before(r"(?i)\bune de ")
    -2>> =suggFemPlur(@)                                                                            # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.
__[i]/gn(gn_2m_det_fem_plur_après_et_ou_de)__
    (?:et|ou|de) +(?:certaines|quelles|lesdites) +({w_2}) +({w_2})  @@w,$
    <<- \1 != "fois" and not \2.startswith("seul")
    and morphex(\1, ":[NAQ].*:[fe]", ":(?:B|G|V0|m)") and morph(\2, ":[NAQ].*:m")
    and not apposition(\1, \2)
    and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and morphex(\1, ":[NAQ].*:[fe]", ":(?:B|G|V0|m)") and morph(\2, ":[NAQ].*:m")
        and not apposition(\1, \2)
        and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -2>> =suggFemPlur(@, True)                                                                      # Accord de genre erroné : « \1 » est féminin, « \2 » est masculin.
    <<- not \2.startswith("seul")
    and morph(\1, ":[NAQ].*:[pi]", False) and morph(\2, ":[NAQ].*:s")
    and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
    and not ( before(r"(?i)\bune? de ") or (\0.startswith("de") and before(r"(?i)\bune? +$")) )
        and morph(\1, ":[NAQ].*:[pi]", False) and morph(\2, ":[NAQ].*:s")
        and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
        and not ( before(r"(?i)\bune? de ") or (\0.startswith("de") and before(r"(?i)\bune? +$")) )
    -2>> =suggFemPlur(@)                                                                            # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

TEST: certaines idioties {{stupide}}
TEST: je ne sais guère de quelles âneries {{proférés}} on parle.

__[i]/gn(gn_2m_les)__
    (?<!et |ou )(les) +({w_2}) +({w_2})  @@0,w,$
    <<- morph(\1, ":D", False) >>>
    <<- \2 != "fois" and not \3.startswith("seul")
    and ((morphex(\2, ":[NAQ].*:m", ":(?:B|e|G|V0|f)") and morph(\3, ":[NAQ].*:f")) or (morphex(\2, ":[NAQ].*:f", ":(?:B|e|G|V0|m)") and morph(\3, ":[NAQ].*:m")))
    and not apposition(\2, \3) and not before(r"\b(?:et|ou|de) +$")
        and ((morphex(\2, ":[NAQ].*:m", ":(?:B|e|G|V0|f)") and morph(\3, ":[NAQ].*:f")) or (morphex(\2, ":[NAQ].*:f", ":(?:B|e|G|V0|m)") and morph(\3, ":[NAQ].*:m")))
        and not apposition(\2, \3) and not before(r"\b(?:et|ou|de) +$")
    -3>> =switchGender(@, True)                                                                     # Accord de genre erroné entre « \2 » et « \3 ».
    <<- __also__ and hasFemForm(\2) -1>> =switchGender(@, True)                                     # Accord de genre erroné avec « \3 ».
    <<- \2 != "fois" and not \3.startswith("seul")
    and morph(\2, ":[NAQ].*:[pi]", False) and morph(\3, ":[NAQ].*:s")
    and not apposition(\2, \3) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
    and not before(r"(?i)\bune? de ")
        and morph(\2, ":[NAQ].*:[pi]", False) and morph(\3, ":[NAQ].*:s")
        and not apposition(\2, \3) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
        and not before(r"(?i)\bune? de ")
    -3>> =suggPlur(@)                                                                               # Accord de nombre erroné avec « \2 » : « \3 » devrait être au pluriel.
__[i]/gn(gn_2m_les_après_et_ou_de)__
    (?:et|ou) +(les) +({w_2}) +({w_2})  @@w,w,$
    <<- morph(\1, ":D", False) >>>
    <<- \2 != "fois" and not \3.startswith("seul")
    and ((morphex(\2, ":[NAQ].*:m", ":(?:B|e|G|V0|f)") and morph(\3, ":[NAQ].*:f")) or (morphex(\2, ":[NAQ].*:f", ":(?:B|e|G|V0|m)") and morph(\3, ":[NAQ].*:m")))
    and not apposition(\2, \3)
    and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and ((morphex(\2, ":[NAQ].*:m", ":(?:B|e|G|V0|f)") and morph(\3, ":[NAQ].*:f")) or (morphex(\2, ":[NAQ].*:f", ":(?:B|e|G|V0|m)") and morph(\3, ":[NAQ].*:m")))
        and not apposition(\2, \3)
        and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -3>> =switchGender(@, True)                                                                     # Accord de genre erroné entre « \2 » et « \3 ».
    <<- __also__ and hasFemForm(\2) -1>> =switchGender(@, True)                                     # Accord de genre erroné avec « \3 ».
    <<- \2 != "fois" and not \3.startswith("seul")
    and morph(\2, ":[NAQ].*:[pi]", False) and morph(\3, ":[NAQ].*:s")
    and not apposition(\2, \3) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
    and not ( before(r"(?i)\bune? de ") or (\0.startswith("de") and before(r"(?i)\bune? +$")) )
        and morph(\2, ":[NAQ].*:[pi]", False) and morph(\3, ":[NAQ].*:s")
        and not apposition(\2, \3) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
        and not ( before(r"(?i)\bune? de ") or (\0.startswith("de") and before(r"(?i)\bune? +$")) )
    -3>> =suggPlur(@)                                                                               # Accord de nombre erroné avec « \2 » : « \3 » devrait être au pluriel.

TEST: les pitres {{imbécile}}
TEST: il faut en convenir et les femmes {{oubliés}}


__[i]/gn(gn_2m_det_epi_plur)__
    (?<!et |ou |de )(?:[cmts]es|[nv]os|leurs|quelques|plusieurs|aux|moult) +({w_2}) +({w_2})  @@w,$
    <<- \1 != "fois" and not \2.startswith("seul")
    and ((morphex(\1, ":[NAQ].*:m", ":(?:B|e|G|V0|f)") and morph(\2, ":[NAQ].*:f")) or (morphex(\1, ":[NAQ].*:f", ":(?:B|e|G|V0|m)") and morph(\2, ":[NAQ].*:m")))
    and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
        and ((morphex(\1, ":[NAQ].*:m", ":(?:B|e|G|V0|f)") and morph(\2, ":[NAQ].*:f")) or (morphex(\1, ":[NAQ].*:f", ":(?:B|e|G|V0|m)") and morph(\2, ":[NAQ].*:m")))
        and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$")
    -2>> =switchGender(@, True)                                                                     # Accord de genre erroné entre « \1 » et « \2 ».
    <<- __also__ and hasFemForm(\1) -1>> =switchGender(@, True)                                     # Accord de genre erroné avec « \2 ».
    <<- \1 != "fois" and not \2.startswith("seul")
    and morph(\1, ":[NAQ].*:[pi]", False) and morph(\2, ":[NAQ].*:s")
    and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
    and not before(r"(?i)\bune? de ")
        and morph(\1, ":[NAQ].*:[pi]", False) and morph(\2, ":[NAQ].*:s")
        and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
        and not before(r"(?i)\bune? de ")
    -2>> =suggPlur(@)                                                                               # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.
__[i]/gn(gn_2m_det_epi_plur_après_et_ou_de)__
    (?:et|ou|de) +(?:[cmts]es|[nv]os|leurs|quelques|plusieurs|aux|moult) +({w_2}) +({w_2})  @@w,$
    <<- \1 != "fois" and not \2.startswith("seul")
    and ((morphex(\1, ":[NAQ].*:m", ":(?:B|e|G|V0|f)") and morph(\2, ":[NAQ].*:f")) or (morphex(\1, ":[NAQ].*:f", ":(?:B|e|G|V0|m)") and morph(\2, ":[NAQ].*:m")))
    and not apposition(\1, \2)
    and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
        and ((morphex(\1, ":[NAQ].*:m", ":(?:B|e|G|V0|f)") and morph(\2, ":[NAQ].*:f")) or (morphex(\1, ":[NAQ].*:f", ":(?:B|e|G|V0|m)") and morph(\2, ":[NAQ].*:m")))
        and not apposition(\1, \2)
        and not morph(word(-1), ":[NAQ]|>(?:et|ou) ", False, False)
    -2>> =switchGender(@, True)                                                                     # Accord de genre erroné entre « \1 » et « \2 ».
    <<- __also__ and hasFemForm(\1) -1>> =switchGender(@, True)                                     # Accord de genre erroné avec « \2 ».
    <<- \1 != "fois" and not \2.startswith("seul")
    and morph(\1, ":[NAQ].*:[pi]", False) and morph(\2, ":[NAQ].*:s")
    and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
    and not ( before(r"(?i)\bune? de ") or (\0.startswith("de") and before(r"(?i)\bune? +$")) )
        and morph(\1, ":[NAQ].*:[pi]", False) and morph(\2, ":[NAQ].*:s")
        and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
        and not ( before(r"(?i)\bune? de ") or (\0.startswith("de") and before(r"(?i)\bune? +$")) )
    -2>> =suggPlur(@)                                                                               # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.

TEST: ces {{beaux}} {{institutions}}
TEST: de vos défauts {{terrible}}, je connais presque tout.
TEST: Les éléments caractéristiques liés à ses valeurs historique et architecturale


## des

__[i]/gn(gn_2m_des)__
    des +({w_2}) +({w_2})  @@w,$
    <<- \1 != "fois" and not \2.startswith("seul")
    and ( (morphex(\1, ":[NAQ].*:m", ":[fe]") and morph(\2, ":[NAQ].*:f")) or (morphex(\1, ":[NAQ].*:f", ":[me]") and morph(\2, ":[NAQ].*:m")) )
    and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
    and morph(word(-1), ":[VRBX]|>comme ", True, True)
        and ( (morphex(\1, ":[NAQ].*:m", ":[fe]") and morph(\2, ":[NAQ].*:f")) or (morphex(\1, ":[NAQ].*:f", ":[me]") and morph(\2, ":[NAQ].*:m")) )
        and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
        and morph(word(-1), ":[VRBX]|>comme ", True, True)
    -2>> =switchGender(@, True)                                                                     # Accord de genre erroné avec « \1 ».
    <<- __also__ and hasFemForm(\1) -1>> =switchGender(@)                                           # Accord de genre erroné avec « \2 ».
    <<- morph(\1, ":[NAQ].*:[pi]", False) and morph(\2, ":[NAQ].*:s")
    and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
    and (morphex(\2, ":N", ":[AQ]") or morph(word(-1), ":[VRBX]|>comme ", True, True))
        and not apposition(\1, \2) and not (after_chk1(r"^ +et +(\w[\w-]+)", ":A") or after_chk1(r"^ *, +(\w[\w-]+)", ":A.*:[si]"))
        and (morphex(\2, ":N", ":[AQ]") or morph(word(-1), ":[VRBX]|>comme ", True, True))
    -2>> =suggPlur(@)                                                                               # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.
    <<- checkAgreement(\1, \2) =>> =exclude(\2, ":V")

TEST: faire table rase des passions {{inutile}}               ->> inutiles
TEST: à bonne distance des {{chiens}} {{méchante}}
TEST: des hommes {{attaquée}}
TEST: des femmes {{agressé}}
6892
6893
6894
6895
6896
6897
6898
6899

6900
6901
6902
6903
6904
6905
6906
6907
6908

6909
6910
6911
6912
6913
6914
6915
6916
6917

6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934
6935

6936
6937
6938
6939
6940
6941
6942
6892
6893
6894
6895
6896
6897
6898

6899
6900
6901
6902
6903
6904
6905
6906
6907

6908
6909
6910
6911
6912
6913
6914
6915
6916

6917
6918
6919
6920
6921
6922
6923
6924
6925
6926
6927
6928
6929
6930
6931
6932
6933
6934

6935
6936
6937
6938
6939
6940
6941
6942







-
+








-
+








-
+

















-
+







!!

## nombre

__[i]/gn(gn_3m)__
    ^ *({w_2}) +({w_2}) +({w_3})  @@*,w,$
    <<- (morph(\1, ":[NAQ].*:p") and morph(\2, ":[NAQ].*:[pi]") and morph(\3, ":[NAQ].*:s"))
    or (morph(\1, ":[NAQ].*:s") and morph(\2, ":[NAQ].*:[si]") and morph(\3, ":[NAQ].*:p"))
        or (morph(\1, ":[NAQ].*:s") and morph(\2, ":[NAQ].*:[si]") and morph(\3, ":[NAQ].*:p"))
    -3>> =switchPlural(@)                                                   # Accord de nombre erroné avec « \1 \2 » : « \3 » devrait être au pluriel.

TEST: Grande manifestation {{réprimées}} dans le sang.


__[i]/gn(gn_3m_les)__
    (les) +({w_2}) +({w_2}) +({w_3})  @@0,w,w,$
    <<- morph(\1, ":D", False)
    and morph(\2, ":[NAQ].*:[pi]") and morph(\3, ":[NAQ].*:[pi]") and morph(\4, ":[NAQ].*:s")
        and morph(\2, ":[NAQ].*:[pi]") and morph(\3, ":[NAQ].*:[pi]") and morph(\4, ":[NAQ].*:s")
    -4>> =suggPlur(@)                                                       # Accord de nombre erroné avec « \2 \3 » : « \4 » devrait être au pluriel.

TEST: les heureux imbéciles {{payé}} au lance-pierre.


__[i]/gn(gn_3m_le_la)__
    ^ *(l(?:e(?:ur|)|a)) +({w_2}) +({w_2}) +({w_3})  @@*,w,w,$
    <<- morph(\1, ":D", False)
    and morph(\2, ":[NAQ].*:[si]", False) and morphex(\3, ":[NAQ].*:[si]", ":G") and morph(\4, ":[NAQ].*:p")
        and morph(\2, ":[NAQ].*:[si]", False) and morphex(\3, ":[NAQ].*:[si]", ":G") and morph(\4, ":[NAQ].*:p")
    -4>> =suggSing(@)                                                       # Accord de nombre erroné avec « \1 \2 \3 » : « \4 » devrait être au singulier.

TEST: leur grande passion {{délirantes}} pour le cosplay.


__[i]/gn(gn_3m_det_sing)__
    ^ *(l(?:edit|adite)|une?|ce(?:t|tte|)|[mts](?:on|a)|[nv]otre|au|quel(?:le|)) +({w_2}) +({w_2}) +({w_3})  @@*,w,w,$
    <<- morph(\2, ":[NAQ].*:[si]", False) and morphex(\3, ":[NAQ].*:[si]", ":G") and morph(\4, ":[NAQ].*:p")
    -4>> =suggSing(@)                                                       # Accord de nombre erroné avec « \1 \2 \3 » : « \4 » devrait être au singulier.

TEST: un gros connard {{pathétiques}}
TEST: le jour venu prises par surprise elles durent s’enfuir.


__[i]/gn(gn_3m_det_plur)__
    ([cmts]es|[nv]os|leurs|quel(?:que|le|)s|plusieurs|certaine?s|lesdite?s|aux|moult) +({w_2}) +({w_2}) +({w_3})  @@0,w,w,$
    <<- morph(\2, ":[NAQ].*:[pi]", False) and morphex(\3, ":[NAQ].*:[pi]", ":G") and morph(\4, ":[NAQ].*:s")
    and not before(r"(?i)\bune? de ")
        and not before(r"(?i)\bune? de ")
    -4>> =suggPlur(@)                                                       # Accord de nombre erroné avec « \1 \2 \3 » : « \4 » devrait être au pluriel.

TEST: ces petites sottes {{déjantée}}



!!
6959
6960
6961
6962
6963
6964
6965
6966

6967
6968
6969
6970
6971
6972

6973
6974
6975
6976
6977
6978
6979
6959
6960
6961
6962
6963
6964
6965

6966
6967
6968
6969
6970
6971

6972
6973
6974
6975
6976
6977
6978
6979







-
+





-
+







    (?:le|un|cet?) +{w_2} +de [mts]on +({w_2}) +({w_2})  @@w,$
    <<- not morph(\1, ":[NAQ].*:f|>[aéeiou].*:e", False) and morphex(\2, ":[NAQ].*:(?:f|m:p)", ":(?:G|P|m:[is]|V0|3[sp])") and not apposition(\1, \2)
    -2>> =suggMasSing(@, True)                                                              # Accord erroné : « \2 » devrait être au masculin singulier.

__[i]/gn(gn_devinette4)__
    [mts]on +({w_2}) +d(?:e cet?|u|’un) +(?!des )({w_2}) +({w_2})  @@w,w,$
    <<- morphex(\1, ":[NAQ].*:m", ":G|>[aéeiou].*:[ef]")
    and morphex(\3, ":[NAQ].*:(?:f|m:p)", ":(?:G|P|[me]:[is]|V0|3[sp])") and not apposition(\2, \3)
        and morphex(\3, ":[NAQ].*:(?:f|m:p)", ":(?:G|P|[me]:[is]|V0|3[sp])") and not apposition(\2, \3)
    -3>> =suggMasSing(@, True)                                                              # Accord erroné : « \3 » devrait être au masculin singulier.

__[i]/gn(gn_devinette5)__
    [mts]on +({w_2}) +de [mts]on +({w_2}) +({w_2})  @@w,w,$
    <<- morphex(\1, ":[NAQ].*:m", ":G|>[aéeiou].*:[ef]")
    and not morph(\2, ":[NAQ].*:f|>[aéeiou].*:e", False) and morphex(\3, ":[NAQ].*:(?:f|m:p)", ":(?:G|P|[me]:[is]|V0|3[sp])") and not apposition(\2, \3)
        and not morph(\2, ":[NAQ].*:f|>[aéeiou].*:e", False) and morphex(\3, ":[NAQ].*:(?:f|m:p)", ":(?:G|P|[me]:[is]|V0|3[sp])") and not apposition(\2, \3)
    -3>> =suggMasSing(@, True)                                                              # Accord erroné : « \3 » devrait être au masculin singulier.

__[i]/gn(gn_devinette6)__
    (?:[lmtsc]es|[nv]os|leurs|quelques) +{w_2} +de(?: (?:[mtsc]es|[nv]os|leurs)|s) +({w_2}) +({w_2})  @@w,$
    <<- morphex(\2, ":[NAQ].*:s", ":(?:G|P|[me]:[ip]|V0|3[sp])") and not apposition(\1, \2)
    -2>> =suggPlur(@)                                                                       # Accord erroné : « \2 » devrait être au pluriel.

8308
8309
8310
8311
8312
8313
8314
8315
8316


8317
8318
8319
8320
8321
8322
8323
8324
8325
8326
8327
8328
8329

8330
8331
8332
8333
8334
8335
8336
8308
8309
8310
8311
8312
8313
8314


8315
8316
8317
8318
8319
8320
8321
8322
8323
8324
8325
8326
8327
8328

8329
8330
8331
8332
8333
8334
8335
8336







-
-
+
+












-
+







TEST: {{ont}} m’assure qu’il n’y en a pas.
TEST: {{Ont}} n’arrive pas à s’en sortir.


__[i]/conf(conf_on2)__
    (?<![nmts]’)(ont) ({w_1})  @@0,$
    <<- ( re.search("^[nmts]e$", \2) or
    (not re.search("(?i)^(?:confiance|envie|peine|prise|crainte|affaire|hâte|force|recours|somme)$", \2) and morphex(\2, ":[0123][sp]", ":[QG]")) )
    and morph(word(-1), ":Cs", False, True)
        (not re.search("(?i)^(?:confiance|envie|peine|prise|crainte|affaire|hâte|force|recours|somme)$", \2) and morphex(\2, ":[0123][sp]", ":[QG]")) )
        and morph(word(-1), ":Cs", False, True)
    -1>> on                                                                                         # Confusion probable : “ont” est une conjugaison du verbe avoir.

TEST: {{Ont}} ne sait jamais quoi faire
TEST: si {{ont}} donne à ces gens, ça n’en finit plus.
TEST: {{Ont}} viens !
TEST: {{Ont}} ne sait pas comment faire.
TEST: qui n’ont somme toute que le désir de vivre paisiblement


__[i]/conf(conf_on3)__
    (ont) (?:l(?:ui|eur)|[nv]ous) ({w_2})  @@0,$
    <<- morphex(\2, ":V.*:(?:[1-3][sp])", ":(?:G|1p)")
    and not ( \0.find(" leur ") and morph(\2, ":[NA].*:[si]", False) ) and isStart()
        and not ( \0.find(" leur ") and morph(\2, ":[NA].*:[si]", False) ) and isStart()
    -1>> on                                                                                         # Confusion probable : “ont” est une conjugaison du verbe avoir.

TEST: {{Ont}} lui avait donné du temps
TEST: {{Ont}} leur prendra tout
TEST: Qu’importe, {{ont}} leur prend tout


8485
8486
8487
8488
8489
8490
8491
8492

8493
8494
8495
8496
8497
8498
8499
8485
8486
8487
8488
8489
8490
8491

8492
8493
8494
8495
8496
8497
8498
8499







-
+







TEST: elle fait de la pole dance.


# diagnostic / diagnotique // pronostic / pronostique
__[i]/conf(conf_diagnostic_pronostique)__
    (?:diagnostique|pronostique)s?
    <<- ( \0.endswith("s") and before(r"(?i)\b(?:[mtscd]es|[nv]os|leurs|quels) $") )
    or ( \0.endswith("e") and before(r"(?i)\b(?:mon|ce|quel|un|du|[nv]otre) $") )
        or ( \0.endswith("e") and before(r"(?i)\b(?:mon|ce|quel|un|du|[nv]otre) $") )
    ->> =\0.replace("que", "c")                                                           # Confusion. Le nom s’écrit avec un “c”.

TEST: Ce {{diagnostique}} est absurde.
TEST: C’est la valse des {{pronostiques}} contradictoires aujourd’hui.


# pu / pus
8842
8843
8844
8845
8846
8847
8848

8849
8850


8851
8852
8853
8854



8855
8856
8857
8858
8859
8860
8861
8842
8843
8844
8845
8846
8847
8848
8849


8850
8851
8852



8853
8854
8855
8856
8857
8858
8859
8860
8861
8862







+
-
-
+
+

-
-
-
+
+
+










!!!! Mots composés                                                                                  

__[i]/mc(mc_mot_composé)__
    ({w2})-({w2})  @@0,$
    <<- not \1.isdigit() and not \2.isdigit()
    <<- not \1.isdigit() and not \2.isdigit() and not morph(\0, ":", False) and not morph(\2, ":G", False) and spell(\1+\2) ->> \1\2
    # Vous pouvez ôter le trait d’union.
        and not morph(\0, ":", False) and not morph(\2, ":G", False) and spell(\1+\2)
    ->> \1\2                                                                                        # Vous pouvez ôter le trait d’union.
    <<- \2 != "là" and not re.search("(?i)^(?:ex|mi|quasi|semi|non|demi|pro|anti|multi|pseudo|proto|extra)$", \1)
    and not \1.isdigit() and not \2.isdigit() and not morph(\2, ":G", False)
    and not morph(\0, ":", False) and not spell(\1+\2) ->> _
    # Mot inconnu du dictionnaire.|http://www.dicollecte.org/dictionary.php?prj=fr&unknownword=on
        and not \1.isdigit() and not \2.isdigit() and not morph(\2, ":G", False)
        and not morph(\0, ":", False) and not spell(\1+\2)
    ->> _                                                                                           # Mot inconnu du dictionnaire.|http://www.dicollecte.org/dictionary.php?prj=fr&unknownword=on

TEST: __mc__ des {{portes-avions}}.



!!
!!
9054
9055
9056
9057
9058
9059
9060
9061

9062
9063
9064
9065
9066
9067
9068
9055
9056
9057
9058
9059
9060
9061

9062
9063
9064
9065
9066
9067
9068
9069







-
+








TEST: à en {{parlé}} sans cesse


__[i]/infi(infi_de)__
    de ({w_2}(?:é|ez))  @@3
    <<- morph(\1, ":V1") and not \1[0:1].isupper()
    and (\1.endswith("z") or not before(r"(?i)\b(?:quelqu(?:e chose|’une?)|(?:l(es?|a)|nous|vous|me|te|se)[ @]trait|personne|point +$|rien(?: +[a-zéèêâîûù]+|) +$)"))
        and (\1.endswith("z") or not before(r"(?i)\b(?:quelqu(?:e chose|’une?)|(?:l(es?|a)|nous|vous|me|te|se)[ @]trait|personne|point +$|rien(?: +[a-zéèêâîûù]+|) +$)"))
    -1>> =suggVerbInfi(@)                                                                           # Le verbe devrait être à l’infinitif.

TEST: Il tentait de {{raisonné}} en homme libre
TEST: sa façon de {{nettoyez}} était inefficace.


__[i]/infi(infi_de_nous_vous_lui)__
9426
9427
9428
9429
9430
9431
9432
9433

9434
9435
9436
9437
9438
9439
9440
9427
9428
9429
9430
9431
9432
9433

9434
9435
9436
9437
9438
9439
9440
9441







-
+








!!!! Adverbes après verbe                                                                           

# fort
__[i]/sgpl(sgpl_verbe_fort)__
    ({w_2}) +(forts)  @@0,$
    <<- morphex(\1, ":V", ":[AN].*:[me]:[pi]|>(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre|appara[îi]tre) .*:(?:[123]p|P|Q)|>(?:affirmer|trouver|croire|désirer|estime|préférer|penser|imaginer|voir|vouloir|aimer|adorer|souhaiter) ")
    and not morph(word(1), ":A.*:[me]:[pi]", False)
        and not morph(word(1), ":A.*:[me]:[pi]", False)
    -2>> fort                                               # Confusion probable. S’il s’agit ici de l’adverbe “fort” (équivalent de “fortement”), écrivez-le au singulier.

TEST: ces emmerdeurs crient bien trop {{forts}}
TEST: ces animaux paraissent forts, mais ils sont faibles.
TEST: ils sont forts, ces gars-là.
TEST: ils se croient forts.
TEST: je les imagine forts et intelligents.
9492
9493
9494
9495
9496
9497
9498
9499
9500


9501
9502
9503
9504
9505
9506
9507
9493
9494
9495
9496
9497
9498
9499


9500
9501
9502
9503
9504
9505
9506
9507
9508







-
-
+
+








TEST: de me le {{facturez}}


__[i]/infi(infi_faire_vouloir)__
    ((?:fai|f[iî]|fer|fon|v[oe]u)\w+) +({w_2}(?:ée?s?|ez))  @@0,$
    <<- morph(\1, ">(?:faire|vouloir) ", False) and not before(r"(?i)\b(?:en|[mtsld]es?|[nv]ous|un) +$") and morphex(\2, ":V", ":M")
    and not (re.search("(?i)^(?:fait|vouloir)$", \1) and \2.endswith("é"))
    and not (re.search("(?i)^(?:fait|vouloir)s$", \1) and \2.endswith("és"))
        and not (re.search("(?i)^(?:fait|vouloir)$", \1) and \2.endswith("é"))
        and not (re.search("(?i)^(?:fait|vouloir)s$", \1) and \2.endswith("és"))
    -2>> =suggVerbInfi(@)                                                                           # Le verbe devrait être à l’infinitif.

TEST: Tu fais {{décoloré}} tes cheveux ?
TEST: je veux {{changé}}
TEST: je ne veux pas {{mangé}}
TEST: je sais {{mangé}}
TEST: je ne voulais pas {{marché}}
9671
9672
9673
9674
9675
9676
9677
9678

9679
9680
9681
9682
9683
9684
9685
9672
9673
9674
9675
9676
9677
9678

9679
9680
9681
9682
9683
9684
9685
9686







-
+








__[i]/ppas(ppas_se_être)__
    [mts](?:e +|’(?:y +|en +|))({etre}) +({w_2})  @@w,$
    <<- morph(\1, ">être ", False) >>>
    <<- morphex(\2, ":(?:Y|[123][sp])", ":Q") and not re.search(r"(?i)^t’(?:es|étais)", \0)
    -2>> =suggVerbPpas(@)                                                                           # Incohérence. Après « s’être », le verbe doit être un participe passé.
    <<- __else__ and morph(\1, ":[123]s", False) and morph(\2, ":Q.*:p", False) and not before(r"(?i)\bque?[, ]|\bon (?:ne |)$")
    and not re.search(r"(?i)^t’(?:es|étais)", \0)
        and not re.search(r"(?i)^t’(?:es|étais)", \0)
    -2>> =suggSing(@)                                                                               # Le participe passé devrait être au singulier.

TEST: s’être {{donner}} le mot.
TEST: je me suis {{donnés}} à fond
TEST: c’est de ce qui s’est {{passe}}.
TEST: Ça s’était toujours {{passe}} comme ça avec elle
TEST: elle s’est {{approche}} de la penderie
9711
9712
9713
9714
9715
9716
9717
9718


9719
9720
9721
9722
9723
9724
9725
9712
9713
9714
9715
9716
9717
9718

9719
9720
9721
9722
9723
9724
9725
9726
9727







-
+
+







TEST: Je me laisse de quoi finir.
TEST: Il te laisse trois jours de délai.


__[i]/ppas(ppas_nous_les_laisser_adj)__
    (nous|les) +(laiss\w*) +({w_3})  @@0,w,$
    <<- morph(\2, ">laisser ", False) and morphex(\3, ":[AQ].*:s", ":(?:[YG]|[AQ].*:[ip])")
    and (\1.endswith("es") or ( \1.endswith("us") and not \2.endswith("ons") )) -3>> =suggPlur(@)   # Accord avec « \1 » : « \3 » devrait être au pluriel.
        and (\1.endswith("es") or ( \1.endswith("us") and not \2.endswith("ons") ))
    -3>> =suggPlur(@)                                                                               # Accord avec « \1 » : « \3 » devrait être au pluriel.

TEST: je les laisse {{indifférent}}.
TEST: elle nous laissera {{perdu}} dans nos délires.
TEST: je les laisse indifférents.
TEST: tu nous laisses indifférentes.
TEST: ils nous laisseront étourdis.
TEST: nous laisserons étourdi cet homme.
9759
9760
9761
9762
9763
9764
9765
9766

9767
9768
9769
9770
9771
9772
9773
9774
9775
9776
9777
9778
9779
9780

9781
9782
9783
9784
9785
9786
9787
9788
9789
9790
9791
9792
9793
9794
9795
9796
9797
9798
9799
9800


9801
9802
9803
9804
9805
9806
9807
9808
9809
9810
9811
9812
9813


9814
9815
9816
9817
9818
9819
9820
9821
9822
9823


9824
9825
9826
9827
9828
9829
9830
9831
9832
9833
9834
9835
9836

9837
9838
9839
9840
9841
9842
9843
9844
9845
9846


9847
9848
9849
9850
9851
9852
9853
9854
9855
9856
9857


9858
9859
9860
9861
9862
9863
9864
9865
9866
9867
9868
9869
9870
9871
9872
9873
9874
9875
9876


9877
9878
9879
9880
9881
9882
9883
9761
9762
9763
9764
9765
9766
9767

9768
9769
9770
9771
9772
9773
9774
9775
9776
9777
9778
9779
9780
9781

9782
9783
9784
9785
9786
9787
9788
9789
9790
9791
9792
9793
9794
9795
9796
9797
9798
9799
9800


9801
9802
9803
9804
9805
9806
9807
9808
9809
9810
9811
9812
9813


9814
9815
9816
9817
9818
9819
9820
9821
9822
9823


9824
9825
9826
9827
9828
9829
9830
9831
9832
9833
9834
9835
9836
9837

9838
9839
9840
9841
9842
9843
9844
9845
9846


9847
9848
9849
9850
9851
9852
9853
9854
9855
9856
9857


9858
9859
9860
9861
9862
9863
9864
9865
9866
9867
9868
9869
9870
9871
9872
9873
9874
9875
9876


9877
9878
9879
9880
9881
9882
9883
9884
9885







-
+













-
+


















-
-
+
+











-
-
+
+








-
-
+
+












-
+








-
-
+
+









-
-
+
+

















-
-
+
+







TEST: tu es {{insignifiants}}
TEST: tu deviens vraiment très {{forts}} à ce jeu.


__[i]/ppas(ppas_il_verbe)__
    (il|ce|ce qui|celui +qui|ça +qui|lui +qui|celui-(?:ci|là) +(?:qui +|)|quiconque) +(?:ne +|n’|)((?:es|étai|f[uû]|se[mr]|soi|dev|re(?:dev|st)|par)\w*|a(?:it|vait|ura(?:it|)|) +été|e[uû]t +été) +({w_2})  @@0,w,$
    <<- (morph(\2, ">(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre) ", False) or \2.endswith(" été"))
    and (morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or morphex(\3, ":[AQ].*:f", ":[GWYme]"))
        and (morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or morphex(\3, ":[AQ].*:f", ":[GWYme]"))
    -3>> =suggMasSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au masculin singulier.

TEST: Il semble être {{partis}} pour toujours.                                    ->> parti
TEST: Il est {{demander}} à chacun de participer.
TEST: Il est {{contents}}.                                                        ->> content
TEST: Il est {{laisser}} à lui-même
TEST: celui qui ne semble pas {{étonnés}}
TEST: c’est ça qui paraît {{stupides}}
TEST: celui-là semble {{perdus}} dans ses pensées.

__[i]/ppas(ppas_c_être)__
    c’(?:est|était|e[uû]t +été) +({w_2})  @@$
    <<- not (morph(\1, ">seule ", False) and after("^ +que? "))
    and ( morphex(\1, ":[NAQ].*:p", ":[GWYsi]") or ( morphex(\1, ":[AQ].*:f", ":[GWYme]") and not morph(word(1), ":N.*:f", False, False) ) )
        and ( morphex(\1, ":[NAQ].*:p", ":[GWYsi]") or ( morphex(\1, ":[AQ].*:f", ":[GWYme]") and not morph(word(1), ":N.*:f", False, False) ) )
    -1>> =suggMasSing(@)                                                     # Accord avec le sujet « c’ » : « \1 » devrait être au masculin singulier.

TEST: c’est {{condescendants}}.                                                   ->> condescendant
TEST: C’est {{finis}}.
TEST: C’est donc seules que les deux femmes sont amenées à comparaître


__[i]/ppas(ppas_ç_être)__
    ç’(?:a(?:it|vait|ura(?:it|)|) +été) +({w_2})  @@$
    <<- morphex(\1, ":[NAQ].*:p", ":[GWYsi]") or ( morphex(\1, ":[AQ].*:f", ":[GWYme]") and not morph(word(1), ":N.*:f", False, False) )
    -1>> =suggMasSing(@)                                                     # Accord avec le sujet « ç’ » : « \1 » devrait être au masculin singulier.

TEST: Ç’avait été {{horribles}}


__[i]/ppas(ppas_ça_verbe)__
    (ça|ce(?:la|ci)|celui-(?:ci|là)) +(?:ne +|n’|)((?:es|étai|f[uû]|se[mr]|soi|par|dev|re(?:dev|st))\w+|a(?:it|vait|ura(?:it|)|) +été|e[uû]t +été) +({w_2})  @@0,w,$
    <<- (morph(\2, ">(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre) ", False) or \2.endswith(" été"))
    and ( morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or ( morphex(\3, ":[AQ].*:f", ":[GWYme]") and not morph(word(1), ":N.*:f", False, False) ) )
    and not morph(word(-1), ":(?:R|V...t)", False, False)
        and ( morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or ( morphex(\3, ":[AQ].*:f", ":[GWYme]") and not morph(word(1), ":N.*:f", False, False) ) )
        and not morph(word(-1), ":(?:R|V...t)", False, False)
    -3>> =suggMasSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au masculin singulier.

TEST: ça semble {{perdus}}
TEST: cela paraît {{incroyables}}
TEST: Je n’arrêtais pas de me répéter que tout cela était peut-être pure imagination
TEST: La femme qui faisait ça est partie.


__[i]/ppas(ppas_lequel_verbe)__
    (lequel) +(?:ne +|n’|)((?:es|étai|f[uû]|se[mr]|soi|par|dev|re(?:dev|st))\w+|a(?:it|vait|ura(?:it|)|) +été|e[uû]t +été) +({w_2})  @@0,w,$
    <<- (morph(\2, ">(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre) ", False) or \2.endswith(" été"))
    and ( morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or ( morphex(\3, ":[AQ].*:f", ":[GWYme]") and not morph(word(1), ":N.*:f", False, False) ) )
    and not morph(word(-1), ":R", False, False)
        and ( morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or ( morphex(\3, ":[AQ].*:f", ":[GWYme]") and not morph(word(1), ":N.*:f", False, False) ) )
        and not morph(word(-1), ":R", False, False)
    -3>> =suggMasSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au masculin singulier.

TEST: elle avait accompagné cet homme, lequel était {{revenue}} de l’enfer.


__[i]/ppas(ppas_elle_verbe)__
    (elle|celle-(?:ci|là)|laquelle) +(?:ne +|n’|)((?:es|étai|f[uû]|se[rm]|soi|dev|re(?:dev|st)|par)\w*|a(?:it|vait|ura(?:it|)|) +été|e[uû]t +été) +({w_2})  @@0,w,$
    <<- (morph(\2, ">(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre) ", False) or \2.endswith(" été"))
    and (morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
    and not morph(word(-1), ":R|>de ", False, False)
        and (morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
        and not morph(word(-1), ":R|>de ", False, False)
    -3>> =suggFemSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au féminin singulier.

TEST: elle a été {{perdu}} sans toi                                               ->> perdue
TEST: Elle semble être totalement {{ruiné}}.                                      ->> ruinée
TEST: Elle est complètement {{fol}}.                                              ->> folle
TEST: elle n’est pas {{petits}}
TEST: Elle est de plus en plus {{belles}}.                                        ->> belle


__[i]/ppas(ppas_elle_qui_verbe)__
    (c?elle +qui) +(?:ne +|n’|)((?:es|étai|f[uû]|se[rm]|soi|dev|re(?:dev|st)|par)\w*|a(?:it|vait|ura(?:it|)|) +été|e[uû]t +été) +({w_2})  @@0,w,$
    <<- (morph(\2, ">(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre) ", False) or \2.endswith(" été"))
    and (morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
        and (morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
    -3>> =suggFemSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au féminin singulier.

TEST: celle qui paraît {{dingues}} de toi


__[i]/ppas(ppas_nous_verbe)__
    nous +(?:ne +|n’|)((?:sommes|étions|fûmes|fussions|seri?ons|soyons|sembl|dev|re(?:dev|st)|par)\w*|a(?:vi?ons|uri?ons|yions) +été|e(?:ûme|ussion)s +été) +({w_2})  @@w,$
    <<- not re.search("(?i)^légion$", \2) and not before(r"(?i)\b(?:nous|ne) +$")
    and ((morph(\1, ">(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre) ", False) and morph(\1, ":1p", False)) or \1.endswith(" été"))
    and morphex(\2, ":[NAQ].*:s", ":[GWYpi]")
        and ((morph(\1, ">(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre) ", False) and morph(\1, ":1p", False)) or \1.endswith(" été"))
        and morphex(\2, ":[NAQ].*:s", ":[GWYpi]")
    -2>> =suggPlur(@)                                                        # Accord avec le sujet « nous » : « \2 » devrait être au pluriel.

TEST: nous paraissons {{faible}}
TEST: Nous paraissons avoir été complètement {{prise}} de panique.                ->> prises


__[i]/ppas(ppas_ils_verbe)__
    (ils|c?eux +qui|ceux-ci|ceux-là|lesquels) +(?:ne +|n’|)((?:sont|étaient|fu[rs]|se[rm]|soient|dev|re(?:dev|st)|par)\w*|ont +été|a(?:ient|vaient|ur(?:ont|aient)) +été|eu(?:r|ss)ent +été) +({w_2})  @@0,w,$
    <<- not re.search("(?i)^légion$", \3) and (morph(\2, ">(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre) ", False) or \2.endswith(" été"))
    and (morphex(\3, ":[NAQ].*:s", ":[GWYpi]") or morphex(\3, ":[AQ].*:f", ":[GWYme]")) and not before("(?i)ce que? +$")
    and (not re.search("^(?:ceux-(?:ci|là)|lesquels)$", \1) or not morph(word(-1), ":R", False, False))
        and (morphex(\3, ":[NAQ].*:s", ":[GWYpi]") or morphex(\3, ":[AQ].*:f", ":[GWYme]")) and not before("(?i)ce que? +$")
        and (not re.search("^(?:ceux-(?:ci|là)|lesquels)$", \1) or not morph(word(-1), ":R", False, False))
    -3>> =suggMasPlur(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au masculin pluriel.

TEST: ils sont {{parti}}.                                                         ->> partis
TEST: ils sont {{parties}}.                                                       ->> partis
TEST: ils restaient {{méfiantes}}                                                 ->> méfiants
TEST: Ils semblent avoir été {{attaqué}} par des soldats.                         ->> attaqués
TEST: Ils sont, semble-t-il, {{parti}} à la chasse.
TEST: Ils sont bel et bien {{mort}}.
TEST: Ils sont tout à fait {{désœuvré}}.
TEST: ils sont, qu’on le veuille ou non, déjà {{parti}}.
TEST: ils sont jour après jour plus {{perdu}}
TEST: ils sont très loin d’être {{idiot}}.


__[i]/ppas(ppas_elles_verbe)__
    (elles|c?elles +qui|celles-(?:ci|là)|lesquelles) +(?:ne +|n’|)((?:sont|étai|fu[rs]|se[rm]|soi|dev|re(?:dev|st)|par)\w*|ont +été|a(?:ient|vaient|ur(?:ont|aient)) +été|eu(?:r|ss)ent +été) +({w_2})  @@0,w,$
    <<- not re.search("(?i)^légion$", \3) and (morph(\2, ">(?:être|sembler|devenir|re(?:ster|devenir)|para[îi]tre) ", False) or \2.endswith(" été"))
    and (morphex(\3, ":[NAQ].*:s", ":[GWYpi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
    and (not re.search("(?i)^(?:elles|celles-(?:ci|là)|lesquelles)$", \1) or not morph(word(-1), ":R", False, False))
        and (morphex(\3, ":[NAQ].*:s", ":[GWYpi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
        and (not re.search("(?i)^(?:elles|celles-(?:ci|là)|lesquelles)$", \1) or not morph(word(-1), ":R", False, False))
    -3>> =suggFemPlur(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au féminin pluriel.

TEST: elles n’ont tout de même pas été {{attaqué}}                                ->> attaquées
TEST: Elles sont {{affamé}}.                                                      ->> affamées
TEST: Celles-là sont {{folle}}.
TEST: celles qui redeviennent {{méchante}}

9912
9913
9914
9915
9916
9917
9918
9919

9920
9921
9922
9923
9924
9925
9926
9927
9928
9929
9930
9931
9932

9933
9934
9935
9936
9937
9938
9939
9940
9941
9942
9943

9944
9945
9946
9947
9948
9949
9950
9951
9952
9953
9954
9955
9956
9957


9958
9959
9960
9961
9962
9963
9964
9965
9966
9967
9968


9969
9970
9971
9972
9973
9974
9975
9976
9977
9978

9979
9980
9981
9982
9983
9984
9985
9986
9987

9988
9989
9990
9991
9992
9993
9994
9995
9996
9997
9998


9999
10000
10001
10002
10003
10004
10005
10006
10007
10008


10009
10010
10011
10012
10013
10014
10015
9914
9915
9916
9917
9918
9919
9920

9921
9922
9923
9924
9925
9926
9927
9928
9929
9930
9931
9932
9933

9934
9935
9936
9937
9938
9939
9940
9941
9942
9943
9944

9945
9946
9947
9948
9949
9950
9951
9952
9953
9954
9955
9956
9957


9958
9959
9960
9961
9962
9963
9964
9965
9966
9967
9968


9969
9970
9971
9972
9973
9974
9975
9976
9977
9978
9979

9980
9981
9982
9983
9984
9985
9986
9987
9988

9989
9990
9991
9992
9993
9994
9995
9996
9997
9998


9999
10000
10001
10002
10003
10004
10005
10006
10007
10008


10009
10010
10011
10012
10013
10014
10015
10016
10017







-
+












-
+










-
+












-
-
+
+









-
-
+
+









-
+








-
+









-
-
+
+








-
-
+
+








__[i](p_risque_d_être)__
    risqu\w+ +(d’)être @@* <<- ~1>> *

__[i]/ppas(ppas_je_verbe_être)__
    j(?:e|’(?:y|en)) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2}) @@w,$
    <<- morph(\1, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and morphex(\2, ":[NAQ].*:p", ":[GWYsi]")
        and morphex(\2, ":[NAQ].*:p", ":[GWYsi]")
    -2>> =suggSing(@)                                                        # Accord avec le sujet « je » : « \2 » devrait être au singulier.

TEST: Je ne peux pas être {{méchants}}.
TEST: j’aurais vraiment été {{tentés}}
TEST: je ne pense pas être {{démasqués}}
TEST: Je veux être {{méconnaissables}}
TEST: je voudrais bien être dans ses souliers


__[i]/ppas(ppas_tu_verbe_être)__
    tu +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2})  @@w,$
    <<- morph(\1, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and morphex(\2, ":[NAQ].*:p", ":[GWYsi]")
        and morphex(\2, ":[NAQ].*:p", ":[GWYsi]")
    -2>> =suggSing(@)                                                        # Accord avec le sujet « tu » : « \2 » devrait être au singulier.

TEST: tu ne crois pas être {{meilleurs}}.
TEST: tu ne crois pas avoir été {{découvertes}}
TEST: tu vas être {{payées}}


__[i]/ppas(ppas_il_verbe_être)__
    (il|ce|ce qui|celui +qui|ça +qui|lui +qui|celui-(?:ci|là) +qui|quiconque) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2})  @@0,w,$
    <<- morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and (morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or morphex(\3, ":[AQ].*:f", ":[GWYme]"))
        and (morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or morphex(\3, ":[AQ].*:f", ":[GWYme]"))
    -3>> =suggMasSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au masculin singulier.

TEST: Il peut être {{observée}}.
TEST: celui-là pensait être {{perdue}}
TEST: celui-là peut être {{perdue}}
TEST: il pense avoir été {{volés}}
TEST: lui qui ne pensait jamais être {{reconnus}}.


__[i]/ppas(ppas_ça_verbe_être)__
    (ça|ce(?:la|ci)|celui-(?:ci|là)|lequel) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2})  @@0,w,$
    <<- morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and (morphex(\3, ":[NAQ].*:p", ":[MWYsi]") or morphex(\3, ":[AQ].*:f", ":[GWYme]"))
    and not morph(word(-1), ":R", False, False)
        and (morphex(\3, ":[NAQ].*:p", ":[MWYsi]") or morphex(\3, ":[AQ].*:f", ":[GWYme]"))
        and not morph(word(-1), ":R", False, False)
    -3>> =suggMasSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au masculin singulier.

TEST: ça ne semble pas avoir été {{conçus}} pour ça.
TEST: lequel allait être {{renvoyée}} de l’établissement.


__[i]/ppas(ppas_elle_verbe_être)__
    (elle|celle-(?:ci|là)|laquelle) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2})  @@0,w,$
    <<- morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and (morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
    and not morph(word(-1), ":R", False, False)
        and (morphex(\3, ":[NAQ].*:p", ":[GWYsi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
        and not morph(word(-1), ":R", False, False)
    -3>> =suggFemSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au féminin singulier.

TEST: elle ne croit pas être {{trompé}}
TEST: ici, elle ne risque pas d’être {{attaquées}}


__[i]/ppas(ppas_elle_qui_verbe_être)__
    (c?elle +qui) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2}) @@0,w,$
    <<- morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and (morphex(\3, ":[NAQ].*:p", ":[MWYsi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
        and (morphex(\3, ":[NAQ].*:p", ":[MWYsi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
    -3>> =suggFemSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au féminin singulier.

TEST: celle qui pense être {{découvert}}


__[i]/ppas(ppas_nous_verbe_être)__
    (?<![nN][oO][uU][sS] )nous +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2})  @@w,$
    <<- not re.search("(?i)^légion$", \2) and morph(\1, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and morph(\1, ":1p", False) and morphex(\2, ":[NAQ].*:s", ":[GWYpi]")
        and morph(\1, ":1p", False) and morphex(\2, ":[NAQ].*:s", ":[GWYpi]")
    -2>> =suggPlur(@)                                                        # Accord avec le sujet « nous » : « \2 » devrait être au pluriel.

TEST: nous pensons être {{désiré}}
TEST: nous ne devons pas être {{instruit}}


__[i]/ppas(ppas_ils_verbe_être)__
    (ils|c?eux +qui|ceux-(?:ci|là)|lesquels) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2})  @@0,w,$
    <<- not re.search("(?i)^légion$", \3) and morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and (morphex(\3, ":[NAQ].*:s", ":[GWYpi]") or morphex(\3, ":[AQ].*:f", ":[GWYme]"))
    and (not re.search("^(?:ceux-(?:ci|là)|lesquels)$", \1) or not morph(word(-1), ":R", False, False))
        and (morphex(\3, ":[NAQ].*:s", ":[GWYpi]") or morphex(\3, ":[AQ].*:f", ":[GWYme]"))
        and (not re.search("^(?:ceux-(?:ci|là)|lesquels)$", \1) or not morph(word(-1), ":R", False, False))
    -3>> =suggMasPlur(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au masculin pluriel.

TEST: ils croient être {{perdu}}


__[i]/ppas(ppas_elles_verbe_être)__
    (elles|c?elles +qui|celles-(?:ci|là)|lesquelles) +(?:ne +|n’|)((?:p[aeouûr]|s(?:embl|ouhait)|cr[ouû]|d[eouûéiî]|estim|i(?:magin|r)|v(?:[eo]u|a)|a(?:ffirm|im|dor|ll)|risqu)\w*) +(?:être|avoir été) +({w_2})  @@0,w,$
    <<- not re.search("(?i)^légion$", \3) and morph(\2, ">(?:sembler|para[îi]tre|pouvoir|penser|préférer|croire|d(?:evoir|éclarer|ésirer|étester|ire)|vouloir|affirmer|aimer|adorer|souhaiter|estimer|imaginer|risquer|aller) ", False)
    and (morphex(\3, ":[NAQ].*:s", ":[GWYpi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
    and (not re.search("^(?:elles|celles-(?:ci|là)|lesquelles)$", \1) or not morph(word(-1), ":R", False, False))
        and (morphex(\3, ":[NAQ].*:s", ":[GWYpi]") or morphex(\3, ":[AQ].*:m", ":[GWYfe]"))
        and (not re.search("^(?:elles|celles-(?:ci|là)|lesquelles)$", \1) or not morph(word(-1), ":R", False, False))
    -3>> =suggFemPlur(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au féminin pluriel.

TEST: elles veulent être {{différente}}
TEST: Elle peut être {{observées}}.
TEST: Elles ne peuvent pas être {{observée}}.
TEST: elles doivent être {{fâché}}
TEST: elles doivent avoir été {{attaqué}}
10033
10034
10035
10036
10037
10038
10039
10040
10041
10042



10043
10044
10045
10046
10047
10048
10049
10050
10051
10052
10053
10054
10055
10056
10057
10058
10059
10060
10061


10062
10063
10064
10065
10066
10067
10068
10035
10036
10037
10038
10039
10040
10041



10042
10043
10044
10045
10046
10047
10048
10049
10050
10051
10052
10053
10054
10055
10056
10057
10058
10059
10060
10061


10062
10063
10064
10065
10066
10067
10068
10069
10070







-
-
-
+
+
+

















-
-
+
+









!!!! Participes passés: accord en genre avec le substantif précédent                                

__[i]/ppas(ppas_sujet_être_accord_genre)__
    (?<![dD]’)(une? |les? |la |l’|ce(?:s|t|tte|) |[mts](?:on|a|es) |[nv]os |leurs? ) *({w_2}) +(?:qui +|)(?:ne +|n’|)(?:est|étai(?:en|)t|f[uû]t|sera(?:i(?:en|)t|)|soi(?:en|)t|s(?:er|)ont|fu(?:r|ss)ent) +({w_2})  @@0,w,$
    <<- not re.search("(?i)^légion$", \3)
    and ((morphex(\3, ":[AQ].*:f", ":[GWme]") and morphex(\2, ":m", ":[Gfe]")) or (morphex(\3, ":[AQ].*:m", ":[GWfe]") and morphex(\2, ":f", ":[Gme]")))
    and not ( morph(\3, ":p", False) and morph(\2, ":s", False) )
    and not morph(word(-1), ":(?:R|P|Q|Y|[123][sp])", False, False) and not before(r"\b(?:et|ou|de) +$")
        and ((morphex(\3, ":[AQ].*:f", ":[GWme]") and morphex(\2, ":m", ":[Gfe]")) or (morphex(\3, ":[AQ].*:m", ":[GWfe]") and morphex(\2, ":f", ":[Gme]")))
        and not ( morph(\3, ":p", False) and morph(\2, ":s", False) )
        and not morph(word(-1), ":(?:R|P|Q|Y|[123][sp])", False, False) and not before(r"\b(?:et|ou|de) +$")
    -3>> =switchGender(@)                                                   # Accord erroné : « \2 » et « \3 » ne sont pas accordés en genre.

TEST: la danse est {{fini}}…
TEST: Un orage est {{annoncée}}.
TEST: Une averse est {{annoncé}}.
TEST: Le chien ne sera pas {{oubliés}}
TEST: les femmes sont vraiment {{partis}}                                         ->> parties
TEST: les hommes ne sont pas tout à fait {{fâché}}                                ->> fâchés
TEST: les enfants ne sont pas {{content}}
TEST: les réunions sans cesse reportées sont {{annulés}}
TEST: l’avenir de la région était {{suspendue}}
TEST: il prétendait que les banques universelles « à la française » s’{{était}} très honorablement comportées


__[s]/ppas(ppas_nom_propre_être_accord_genre)__
    (?<![dD]’)([A-ZÉÈ]{w_2}) +(?:qui +|)(?:ne +|n’|)(?:est|étai(?:en|)t|f[uû]t|sera(?:i(?:en|)t|)|soi(?:en|)t|s(?:er|)ont|fu(?:r|ss)ent|a(?:vait|ura|urait|it|) +été|e[uû]t +été) +({w_2})  @@0,$
    <<- not re.search("(?i)^légion$", \2)
    and ((morphex(\1, ":M[1P].*:f", ":[GWme]") and morphex(\2, ":m", ":[GWfe]")) or (morphex(\1, ":M[1P].*:m", ":[GWfe]") and morphex(\2, ":f", ":[GWme]")))
    and not morph(word(-1), ":(?:R|P|Q|Y|[123][sp])", False, False) and not before(r"\b(?:et|ou|de) +$")
        and ((morphex(\1, ":M[1P].*:f", ":[GWme]") and morphex(\2, ":m", ":[GWfe]")) or (morphex(\1, ":M[1P].*:m", ":[GWfe]") and morphex(\2, ":f", ":[GWme]")))
        and not morph(word(-1), ":(?:R|P|Q|Y|[123][sp])", False, False) and not before(r"\b(?:et|ou|de) +$")
    -2>> =switchGender(@)                                                   # Accord erroné : « \1 » et « \2 » ne sont pas accordés en genre.

TEST: Antoine est {{mariée}}.
TEST: Antoine n’est pas {{mariés}}.
TEST: Antoine est peut-être {{fatiguée}}.
TEST: Éric n’est pas très {{fatiguée}}.
TEST: Martine est {{marié}}.
10221
10222
10223
10224
10225
10226
10227
10228
10229


10230
10231
10232
10233
10234
10235
10236
10237
10238
10239


10240
10241
10242
10243
10244
10245
10246
10247
10248
10249

10250
10251
10252
10253
10254
10255
10256
10257
10258
10259
10260
10261
10262
10263
10264
10265
10266
10267


10268
10269
10270
10271
10272
10273
10274
10275
10276
10277


10278
10279
10280
10281
10282
10283
10284
10223
10224
10225
10226
10227
10228
10229


10230
10231
10232
10233
10234
10235
10236
10237
10238
10239


10240
10241
10242
10243
10244
10245
10246
10247
10248
10249
10250

10251
10252
10253
10254
10255
10256
10257
10258
10259
10260
10261
10262
10263
10264
10265
10266
10267


10268
10269
10270
10271
10272
10273
10274
10275
10276
10277


10278
10279
10280
10281
10282
10283
10284
10285
10286







-
-
+
+








-
-
+
+









-
+
















-
-
+
+








-
-
+
+








TEST: quand tu te montres {{infaillibles}}


__[i]/ppas(ppas_il_se_verbe)__
    (il|ce|ce qui|celui +qui|ça +qui|lui +qui|celui-(?:ci|là)|quiconque|lequel) +(?:ne +|)se +((?:s[eauû]|montr|pens|rév|v[oiîe])\w+) +({w_2})  @@0,w,$
    <<- morph(\2, ">(?:montrer|penser|révéler|savoir|sentir|voir|vouloir) ", False)
    and (morphex(\3, ":[NAQ].*:p", ":[GWsi]") or morphex(\3, ":[NAQ].*:f", ":[GWYme]"))
    and (not re.search("^(?:celui-(?:ci|là)|lequel)$", \1) or not morph(word(-1), ":R", False, False))
        and (morphex(\3, ":[NAQ].*:p", ":[GWsi]") or morphex(\3, ":[NAQ].*:f", ":[GWYme]"))
        and (not re.search("^(?:celui-(?:ci|là)|lequel)$", \1) or not morph(word(-1), ":R", False, False))
    -3>> =suggMasSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au masculin singulier.

TEST: lequel se veut {{imbattables}} ?


__[i]/ppas(ppas_elle_se_verbe)__
    (elle|celle-(?:ci|là)|laquelle) +(?:ne +|)se +((?:s[eauû]|montr|pens|rév|v[oiîe])\w+) +({w_2})  @@0,w,$
    <<- morph(\2, ">(?:montrer|penser|révéler|savoir|sentir|voir|vouloir) ", False)
    and (morphex(\3, ":[NAQ].*:p", ":[GWsi]") or morphex(\3, ":[NAQ].*:m", ":[GWYfe]"))
    and not morph(word(-1), ":R", False, False)
        and (morphex(\3, ":[NAQ].*:p", ":[GWsi]") or morphex(\3, ":[NAQ].*:m", ":[GWYfe]"))
        and not morph(word(-1), ":R", False, False)
    -3>> =suggFemSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au féminin singulier.

TEST: Elle se sait plus {{fortes}} qu’eux tous.
TEST: elle se vit {{abandonné}}


__[i]/ppas(ppas_elle_qui_se_verbe)__
    (c?elle +qui) +(?:ne +|)se +((?:s[eauû]|montr|pens|rév|v[oiîe])\w+) +({w_2})  @@0,w,$
    <<- morph(\2, ">(?:montrer|penser|révéler|savoir|sentir|voir|vouloir) ", False)
    and (morphex(\3, ":[NAQ].*:p", ":[GWsi]") or morphex(\3, ":[NAQ].*:m", ":[GWYfe]"))
        and (morphex(\3, ":[NAQ].*:p", ":[GWsi]") or morphex(\3, ":[NAQ].*:m", ":[GWYfe]"))
    -3>> =suggFemSing(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au féminin singulier.

TEST: à celle qui se révélera {{attentif}} à tous ces problèmes.


__[i]/ppas(ppas_nous_nous_verbe)__
    nous +(?:ne +|)nous +((?:s[eauû]|montr|pens|rév|v[oiîe])\w*ons) +({w_2})  @@w,$
    <<- morph(\1, ">(?:montrer|penser|révéler|savoir|sentir|voir|vouloir) ", False) and morphex(\2, ":[NAQ].*:s", ":[GWpi]")
    -2>> =suggPlur(@)                                                        # Accord avec le sujet « nous » : « \2 » devrait être au pluriel.

TEST: nous nous pensions {{invincible}} jusqu’au jour où tout a basculé.


__[i]/ppas(ppas_ils_se_verbe)__
    (ils|c?eux +qui|ceux-ci|ceux-là|lesquels) +(?:ne +|)se +((?:s[eauû]|montr|pens|rév|v[oiîe])\w+) +({w_2})  @@0,w,$
    <<- morph(\2, ">(?:montrer|penser|révéler|savoir|sentir|voir|vouloir) ", False)
    and (morphex(\3, ":[NAQ].*:s", ":[GWpi]") or morphex(\3, ":[NAQ].*:f", ":[GWYme]"))
    and (not re.search("^(?:ceux-(?:ci|là)|lesquels)$", \1) or not morph(word(-1), ":R", False, False))
        and (morphex(\3, ":[NAQ].*:s", ":[GWpi]") or morphex(\3, ":[NAQ].*:f", ":[GWYme]"))
        and (not re.search("^(?:ceux-(?:ci|là)|lesquels)$", \1) or not morph(word(-1), ":R", False, False))
    -3>> =suggMasPlur(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au masculin pluriel.

TEST: ils se montrent {{exigeantes}}


__[i]/ppas(ppas_elles_se_verbe)__
    (elles|c?elles +qui|celles-(?:ci|là)|lesquelles) +(?:ne +|)se +((?:s[eauû]|montr|pens|rév|v[oiîe])\w+) +({w_2})  @@0,w,$
    <<- morph(\2, ">(?:montrer|penser|révéler|savoir|sentir|voir|vouloir) ", False)
    and (morphex(\3, ":[NAQ].*:s", ":[GWpi]") or morphex(\3, ":[NAQ].*:m", ":[GWYfe]"))
    and (not re.search("^(?:elles|celles-(?:ci|là)|lesquelles)$", \1) or not morph(word(-1), ":R", False, False))
        and (morphex(\3, ":[NAQ].*:s", ":[GWpi]") or morphex(\3, ":[NAQ].*:m", ":[GWYfe]"))
        and (not re.search("^(?:elles|celles-(?:ci|là)|lesquelles)$", \1) or not morph(word(-1), ":R", False, False))
    -3>> =suggFemPlur(@)                                                     # Accord avec le sujet « \1 » : « \3 » devrait être au féminin pluriel.

TEST: elles se sentent {{perdu}}


__[i]/ppas(ppas_le_verbe_pensée)__
    le ((?:trouv|consid[éè]r|cr[ouû]|rend|voilà)\w*) +({w_2}[esx])  @@w,$
10355
10356
10357
10358
10359
10360
10361
10362

10363
10364
10365
10366
10367
10368
10369
10370
10371
10372
10373
10374
10375
10376
10377


10378
10379
10380
10381
10382
10383
10384
10385
10386
10387
10388
10389


10390
10391
10392
10393
10394
10395
10396
10357
10358
10359
10360
10361
10362
10363

10364
10365
10366
10367
10368
10369
10370
10371
10372
10373
10374
10375
10376
10377


10378
10379
10380
10381
10382
10383
10384
10385
10386
10387
10388
10389


10390
10391
10392
10393
10394
10395
10396
10397
10398







-
+













-
-
+
+










-
-
+
+








__[i](p_les_avoir_fait_vinfi)__
    les ({avoir}) +(fait) +(?:[mts](?:e +|’)|)({infi}) @@w,w,$ <<- morph(\1, ">avoir ", False) and morph(\3, ":Y", False) ~2>> _

__[i]/ppas(ppas_pronom_avoir)__
    (?:j’|je |tu |ils? |elles? |on |et )(?:ne +|n’|l(?:ui|eur) +|)({avoir}) +({w_2})  @@w,$
    <<- not re.search("(?i)^(?:barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours)$", \2) and morph(word(-1), ">puisque? ", False, True)
    and morph(\1, ":V0a", False) and not \2.isupper() and morphex(\2, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])")
        and morph(\1, ":V0a", False) and not \2.isupper() and morphex(\2, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])")
    -2>> =suggMasSing(@)
    # Ce verbe devrait être un participe passé au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: ils leur avaient {{donnés}} du fil à retordre.
TEST: il a {{affronte}} une bande de voleurs de bétail
TEST: J’ai {{mettrai}} du sel.                                                    ->> mis
TEST: J’ai {{lut}} son journal.                                                   ->> lu
TEST: Ils avaient barre sur lui.


__[i]/ppas(ppas_nous_vous_avoir)__
    ([nv]ous) +(?:ne +|n’|l(?:ui|eur) +|)({avoir}) +({w_2})  @@0,w,$
    <<- morph(\1, ":Os", False)
    and not re.search("(?i)^(?:barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours)$", \3) and morph(word(-1), ">puisque? ", False, True)
    and morph(\2, ":V0a", False) and not \3.isupper() and morphex(\3, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])")
        and not re.search("(?i)^(?:barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours)$", \3) and morph(word(-1), ">puisque? ", False, True)
        and morph(\2, ":V0a", False) and not \3.isupper() and morphex(\3, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])")
    -3>> =suggMasSing(@)
    # Ce verbe devrait être un participe passé au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: Nous avons {{donne}} tout notre potentiel.
TEST: D’un côté, le modèle occidental, […], nous a libérés de […]


__[i]/ppas(ppas_det_nom_avoir)__
    (l(?:’|es? |a |eurs )|ce(?:s|tte|t|rtaine?s|) |des |quelques |[mts](?:es|on|a) |[nv]o(?:s|tre) ) *({w_2}) +(?:ne +|n’|l(?:ui|eur) +|)({avoir}) +({w_2})  @@0,w,w,$
    <<- not re.search("(?i)^(?:barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours)$", \4) and morph(word(-1), ">puisque? ", False, True)
    and not morph(\2, ":G", False) and morph(\3, ":V0a", False) and not \4.isupper() and morphex(\4, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])")
    and not (\3 == "avions" and morph(\4, ":3[sp]", False))
        and not morph(\2, ":G", False) and morph(\3, ":V0a", False) and not \4.isupper() and morphex(\4, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])")
        and not (\3 == "avions" and morph(\4, ":3[sp]", False))
    -4>> =suggMasSing(@)
    # Ce verbe devrait être un participe passé au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: Les femmes lui avait {{conseillées}} de se taire.
TEST: le mur avait {{était}} détruit
TEST: Certains les ont d’abord jugés trop lents.

10440
10441
10442
10443
10444
10445
10446
10447

10448
10449
10450
10451
10452
10453
10454
10442
10443
10444
10445
10446
10447
10448

10449
10450
10451
10452
10453
10454
10455
10456







-
+








TEST: des hommes, des femmes, des enfants qui ne leur avaient {{faits}} que du bien.


__[i]/ppas(ppas_avoir_ppas_mas_sing)__
    avoir +({w_2})  @@$
    <<- not re.search("(?i)^(?:confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours)$", \1)
    and morphex(\1, ":Q.*:(?:f|m:p)", ":m:[si]") and before("(?i)(?:après +$|sans +$|pour +$|que? +$|quand +$|, +$|^ *$)")
        and morphex(\1, ":Q.*:(?:f|m:p)", ":m:[si]") and before("(?i)(?:après +$|sans +$|pour +$|que? +$|quand +$|, +$|^ *$)")
    -1>> =suggMasSing(@)
    # Le participe passé devrait être au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: Il a {{prit}} le train.
TEST: Les élèves lui ont {{données}}.
TEST: Les élèves lui ont {{donnés}}.
TEST: Les élèves lui ont {{donnée}}.
10479
10480
10481
10482
10483
10484
10485
10486

10487
10488
10489
10490
10491
10492
10493
10494
10495
10496
10497
10498
10499
10500
10501
10502
10503
10504
10505
10506
10507
10508



10509
10510
10511
10512
10513
10514
10515
10516
10517
10518
10519
10520
10521
10522
10523


10524
10525
10526
10527
10528
10529
10530
10531
10532
10533
10534
10535
10536
10537
10538
10539
10540
10541




10542
10543
10544
10545
10546
10547
10548
10549
10550
10551
10552
10553
10554

10555
10556
10557
10558
10559
10560
10561
10481
10482
10483
10484
10485
10486
10487

10488
10489
10490
10491
10492
10493
10494
10495
10496
10497
10498
10499
10500
10501
10502
10503
10504
10505
10506
10507



10508
10509
10510
10511
10512
10513
10514
10515
10516
10517
10518
10519
10520
10521
10522
10523


10524
10525
10526
10527
10528
10529
10530
10531
10532
10533
10534
10535
10536
10537
10538
10539




10540
10541
10542
10543
10544
10545
10546
10547
10548
10549
10550
10551
10552
10553
10554
10555

10556
10557
10558
10559
10560
10561
10562
10563







-
+



















-
-
-
+
+
+













-
-
+
+














-
-
-
-
+
+
+
+












-
+







TEST: nous avions quelque peu {{tempérés}} leurs ardeurs


## avoir avec participe passé
__[i]/ppas(ppas_m_t_l_avoir)__
    [lmt]’(?:en +|y +|)({avoir}) +({w_3}) @@2,$
    <<- morph(\1, ">avoir ", False) and morphex(\2, ":(?:Y|[123][sp])", ":[QGWMX]")
    and not re.search(r"(?i)^t’as +envie", \0)
        and not re.search(r"(?i)^t’as +envie", \0)
    -2>> =suggVerbPpas(@, ":m:s")                                                                   # Confusion : employez un participe passé.

TEST: m’avoir {{terminer}}.
TEST: il m’a {{souffler}} la bonne réponse.
TEST: elle t’en a {{parle}}.
TEST: c’est vous qui m’avez {{convertit}}.
TEST: parce que t’as envie que je le fasse



!!
!!
!!!! COD précédant que                                                                                  
!!
!!

__[i]/ppas(ppas_det_plur_COD_que_avoir)__
    ([ldmtsc]es) +({w_2}) +que? +(?:j’|tu |ils? |[nv]ous |elles? |on ) *(?:ne +|n’|)({avoir}) +({w_2}[éiust]e?)(?! [mts]’)  @@0,w,w,$
    <<- morph(\3, ":V0a", False)
    and not ((re.search("^(?:décidé|essayé|tenté|oublié)$", \4) and after(" +d(?:e |’)")) or (re.search("^réussi$", \4) and after(" +à")))
    and morph(\2, ":[NAQ]", False) and morphex(\4, ":V[0-3]..t.*:Q.*:s", ":[GWpi]")
    and not morph(word(1), ":(?:Y|Oo|D)", False)
        and not ((re.search("^(?:décidé|essayé|tenté|oublié)$", \4) and after(" +d(?:e |’)")) or (re.search("^réussi$", \4) and after(" +à")))
        and morph(\2, ":[NAQ]", False) and morphex(\4, ":V[0-3]..t.*:Q.*:s", ":[GWpi]")
        and not morph(word(1), ":(?:Y|Oo|D)", False)
    -4>> =suggPlur(@, \2)
    # Si « \1 \2… » est bien le COD du participe passé « \4 », celui-ci devrait être au pluriel (et accordé en genre).|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: Les documents qu’ils ont {{acheté}}.
TEST: les flacons qu’ils ont réussi à acquérir
TEST: ça faisait des années que j’avais délaissé ce lieu
TEST: Les électeurs de Donald que l’on avait rencontrés jusque-là boivent l’eau d’une seule fontaine : Fox News et les sites et radios conservateurs.
TEST: des choses que j’aurais oublié d’aborder.


__[i]/ppas(ppas_det_mas_sing_COD_que_avoir)__
    (le |l’|cet? |[mts]on |un ) *({w_2}) +que? +(?:j’|tu |ils? |[nv]ous |elles? |on ) *(?:ne +|n’|)({avoir}) +({w_2}[es])  @@0,w,w,$
    <<- morph(\3, ":V0a", False)
    and morph(\2, ":[NAQ].*:m", False)
    and (morphex(\4, ":V[0-3]..t.*:Q.*:f", ":[GWme]") or morphex(\4, ":V[0-3]..t.*:Q.*:p", ":[GWsi]"))
        and morph(\2, ":[NAQ].*:m", False)
        and (morphex(\4, ":V[0-3]..t.*:Q.*:f", ":[GWme]") or morphex(\4, ":V[0-3]..t.*:Q.*:p", ":[GWsi]"))
    -4>> =suggMasSing(@)
    # Si « \1 \2… » est bien le COD du participe passé « \4 », celui-ci devrait être au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: Le document qu’ils ont de temps en temps {{achetés}}.
TEST: L’homme que j’ai {{aidée}}.
TEST: L’homme qu’ils ont beaucoup {{aidée}}.
TEST: L’homme que nous avons un peu {{aidée}}.
TEST: le flacon qu’ils ont réussi à acquérir


__[i]/ppas(ppas_det_fem_sing_COD_que_avoir)__
    (la |l’|cette |[mts]a |mon |une ) *({w_2}) +que? +(?:j’|tu |ils? |[nv]ous |elles? |on ) *(?:ne +|n’|)({avoir}) +({w_2}[éiust])(?! [mts]’)
    @@0,w,w,$
    <<- morph(\3, ":V0a", False)
    and not ((re.search("^(?:décidé|essayé|tenté)$", \4) and after(" +d(?:e |’)")) or (re.search("^réussi$", \4) and after(" +à")))
    and morph(\2, ":[NAQ].*:f", False)
    and (morphex(\4, ":V[0-3]..t.*:Q.*:m", ":[GWfe]") or morphex(\4, ":V[0-3]..t.*:Q.*:p", ":[GWsi]"))
    and not morph(word(1), ":(?:Y|Oo)|>que?", False)
        and not ((re.search("^(?:décidé|essayé|tenté)$", \4) and after(" +d(?:e |’)")) or (re.search("^réussi$", \4) and after(" +à")))
        and morph(\2, ":[NAQ].*:f", False)
        and (morphex(\4, ":V[0-3]..t.*:Q.*:m", ":[GWfe]") or morphex(\4, ":V[0-3]..t.*:Q.*:p", ":[GWsi]"))
        and not morph(word(1), ":(?:Y|Oo)|>que?", False)
    -4>> =suggFemSing(@)
    # Si « \1 \2… » est bien le COD du participe passé « \4 », celui-ci devrait être au féminin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: La femme que j’ai {{aidé}}.
TEST: La femme que j’ai beaucoup {{aidé}}.
TEST: La femme que j’ai un peu {{aidé}}.
TEST: la danse qu’ils ont réussi à faire


__[i]/ppas(ppas_ce_que_pronom_avoir)__
    ce +que? +(?:j’|tu |ils? |[nv]ous |elles? |on |ça |ce(?:la|ci) ) *(?:ne +|n’|)({avoir}) +({w_2}[es])  @@w,$
    <<- morph(\1, ":V0a", False)
    and (morphex(\2, ":V[0-3]..t.*:Q.*:f", ":[GWme]") or morphex(\2, ":V[0-3]..t.*:Q.*:p", ":[GWsi]"))
        and (morphex(\2, ":V[0-3]..t.*:Q.*:f", ":[GWme]") or morphex(\2, ":V[0-3]..t.*:Q.*:p", ":[GWsi]"))
    -2>> =suggMasSing(@)
    # Le participe passé devrait être au masculin singulier.|http://fr.wikipedia.org/wiki/Accord_du_participe_pass%C3%A9_en_fran%C3%A7ais

TEST: ce que ça a {{donnée}}


__[i]/ppas(ppas_avoir_conf_infi)__
10616
10617
10618
10619
10620
10621
10622
10623

10624
10625
10626
10627
10628
10629
10630

10631
10632
10633
10634
10635
10636
10637
10618
10619
10620
10621
10622
10623
10624

10625
10626
10627
10628
10629
10630
10631

10632
10633
10634
10635
10636
10637
10638
10639







-
+






-
+







!!!! Participes passés avec formes interrogatives                                                   
!!
!!

__[i]/ppas(ppas_avoir_pronom1)__
    (?<![ltm]’)({avoir})[- ](?:je|tu|ils?|elles?|t-(?:ils?|elles?|on)|on) +({w2})  @@0,$
    <<- morph(\1, ":V0a", False) and morphex(\2, ":(?:Y|2p|Q.*:[fp])", ":m:[si]") and \2 != "prise"
    and not morph(word(-1), ">(?:les|[nv]ous|en)|:[NAQ].*:[fp]", False) and not before(r"(?i)\b(?:quel(?:le|)s?|combien) ")
        and not morph(word(-1), ">(?:les|[nv]ous|en)|:[NAQ].*:[fp]", False) and not before(r"(?i)\b(?:quel(?:le|)s?|combien) ")
    -2>> =suggMasSing(@)
    # Avec « avoir », il faut un participe passé au masculin singulier.

__[i]/ppas(ppas_avoir_pronom2)__
    (?<![ltm]’)({avoir})-(?:[nv]ous) +({w2})  @@0,$
    <<- morph(\1, ":V0a", False) and morphex(\2, ":(?:Y|2p|Q.*:[fp])", ":m:[si]") and \2 != "prise"
    and not morph(word(-1), ">(?:les|[nv]ous|en)|:[NAQ].*:[fp]", False) and not before(r"(?i)\b(?:quel(?:le|)s?|combien) ")
        and not morph(word(-1), ">(?:les|[nv]ous|en)|:[NAQ].*:[fp]", False) and not before(r"(?i)\b(?:quel(?:le|)s?|combien) ")
    -2>> =suggMasSing(@)
    # Avec « avoir », il faut un participe passé au masculin singulier.

__[i]/ppas(ppas_l_m_t_avoir_pronom)__
    ([ltm]’)({avoir})[- ](?:je|tu|ils?|elles?|t-(?:ils?|elles?|on)|[nv]ous|on) +({w2}s)  @@0,2,$
    <<- morph(\2, ":V0a", False) and morphex(\3, ":(?:Y|2p|Q.*:p)", ":[si]") 
    -3>> =suggMasSing(@)
10799
10800
10801
10802
10803
10804
10805
10806
10807


10808
10809
10810
10811
10812
10813
10814
10815
10816
10817
10818
10819
10820
10821

10822
10823
10824
10825
10826
10827
10828
10801
10802
10803
10804
10805
10806
10807


10808
10809
10810
10811
10812
10813
10814
10815
10816
10817
10818
10819
10820
10821
10822

10823
10824
10825
10826
10827
10828
10829
10830







-
-
+
+













-
+







TEST: — {{Allé}} prendre une cuite.


# verbes du 2ᵉ et du 3ᵉ groupe en -t
__[i]/imp(imp_vgroupe2_vgroupe3_t)__
    ^ *(\w+t)(?![- ](?:je|tu|[nv]ous|ils?|elles?|on|t-ils?|t-elles?))  @@$
    <<- morphex(\1, ":V[23].*:Ip.*:3s", ":[GNA]|>(?:devoir|suffire)") and analyse(\1[:-1]+"s", ":E:2s", False)
    and not (re.search("(?i)^vient$", \1) and after("^ +(?:l[ea]|se |s’)"))
    and not (re.search("(?i)^dit$", \1) and after("^ +[A-ZÉÈÂÎ]"))
        and not (re.search("(?i)^vient$", \1) and after("^ +(?:l[ea]|se |s’)"))
        and not (re.search("(?i)^dit$", \1) and after("^ +[A-ZÉÈÂÎ]"))
    -1>> =\1[:-1]+"s"                                                               # S’il s’agit d’un impératif, la terminaison est “is”, non “it”.

TEST: {{Finit}} ton assiette.
TEST: Ne {{pourrit}} pas l’ambiance.
TEST: Suffit de s’en servir.
TEST: Et ne doit pas être rejeté dans les limbes.
TEST: Vient s’ajouter à ce contexte la perception, partagée par beaucoup, du caractère fortement menaçant de l’environnement économique et géopolitique.


# verbes du 3ᵉ groupe en -d
__[i]/imp(imp_vgroupe3_d)__
    ^ *(\w+d)(?![- ](?:je|tu|[nv]ous|ils?|elles?|on|t-ils?|t-elles?))  @@$
    <<- morphex(\1, ":V3.*:Ip.*:3s", ":[GNA]")
    and not (re.search("(?i)^répond$", \1) and after("^ +[A-ZÉÈÂÎ]"))
        and not (re.search("(?i)^répond$", \1) and after("^ +[A-ZÉÈÂÎ]"))
    -1>> \1s                                                                        # S’il s’agit d’un impératif, ajoutez un “s”.

TEST: {{Prend}} le chemin de droite.
TEST: N’{{attend}} pas qu’elle vienne.
TEST: — Pour ma part, répond P., je crois que tout va bien.


11319
11320
11321
11322
11323
11324
11325
11326
11327


11328
11329
11330
11331
11332
11333
11334
11321
11322
11323
11324
11325
11326
11327


11328
11329
11330
11331
11332
11333
11334
11335
11336







-
-
+
+









#### PAS D’INFINITIF

__[i]/ppas(ppas_être)__
    (?<![cC]’)({etre}) +({w_2}er)  @@0,$
    <<- morph(\1, ":V0e", False) and (morphex(\2, ":Y", ":[NAQ]") or \2 in aSHOULDBEVERB) and not re.search("(?i)^(?:soit|été)$", \1)
    and not morph(word(-1), ":Y|>ce", False, False) and not before("(?i)ce que? +$")
    and not morph(word(-1), ":Y", False, False) and not before_chk1(r"^ *>? *(\w[\w-]+)", ":Y")
        and not morph(word(-1), ":Y|>ce", False, False) and not before("(?i)ce que? +$")
        and not morph(word(-1), ":Y", False, False) and not before_chk1(r"^ *>? *(\w[\w-]+)", ":Y")
    -2>> =suggVerbPpas(@)                                                   # Incohérence. Après « être », le verbe ne doit pas être à l’infinitif.

TEST: ils sont {{tromper}} par tous ces hypocrites.
TEST: Jeûner n’est pas seulement cesser de manger.
TEST: Ne pas aimer n’est pas oublier l’autre.


11468
11469
11470
11471
11472
11473
11474
11475

11476
11477
11478
11479
11480
11481

11482
11483
11484
11485
11486
11487
11488
11489
11490
11491
11492
11493
11494
11495

11496
11497
11498
11499
11500
11501
11502
11470
11471
11472
11473
11474
11475
11476

11477
11478
11479
11480
11481
11482

11483
11484
11485
11486
11487
11488
11489
11490
11491
11492
11493
11494
11495
11496

11497
11498
11499
11500
11501
11502
11503
11504







-
+





-
+













-
+







TEST: Cela {{dis}}, on ne sait pas comment s’en sortir.
TEST: Y avait-il seulement quelqu’un pour vouloir soumettre ses recherches ?


__[i]/conj(conj_tout)__
    tout +({w_1})  @@$
    <<- morphex(\1, ":V", ":(?:3s|P|Q|Y|G|3p!)") and not morph(word(-1), ":[VRD]|>de", False, False)
    and not( morph(\1, ":(?:Y|N.*:m:[si])", False) and not re.search(" (?:qui|>) ", \0) )
        and not( morph(\1, ":(?:Y|N.*:m:[si])", False) and not re.search(" (?:qui|>) ", \0) )
    -1>> =suggVerb(@, ":3s")                                 # Conjugaison erronée. Accord avec « tout ». Le verbe devrait être à la 3ᵉ personne du singulier.

__[i]/conj(conj_tout_qui)__
    tout +qui +({w_1})  @@$
    <<- morphex(\1, ":V", ":(?:3s|P|Q|G|3p!)") and not morph(word(-1), ":[VRD]|>de", False, False)
    and not( morph(\1, ":(?:Y|N.*:m:[si])", False) and not re.search(" (?:qui|>) ", \0) )
        and not( morph(\1, ":(?:Y|N.*:m:[si])", False) and not re.search(" (?:qui|>) ", \0) )
    -1>> =suggVerb(@, ":3s")                                 # Conjugaison erronée. Accord avec « tout ». Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: Tout {{reviens}} à ça.
TEST: Tout qui {{deviens}} fou.
TEST: Le tout nouveau président de la fondation qui héberge Wikipédia
TEST: tout discours de sortie nourrit immanquablement la sortie
TEST: Tout vous expliquer est difficile.
TEST: J’essaie de bien tout vous expliquer.


__[i]/conj(conj_lequel_laquelle)__
    (l(?:equel|aquelle)) +(?:qui +|)({w_1})  @@0,$
    <<- morphex(\2, ":V", ":(?:3s|P|Q|G|3p!)") and not morph(word(-1), ":[VR]|>de", False, False)
    and not( morph(\2, ":Y", False) and not re.search(" (?:qui|>) ", \0) )
        and not( morph(\2, ":Y", False) and not re.search(" (?:qui|>) ", \0) )
    -2>> =suggVerb(@, ":3s")                                 # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: Lequel {{viendraient}} nous donner des leçons ?
TEST: Laquelle choisir ?
TEST: Lequel manger ?


11512
11513
11514
11515
11516
11517
11518
11519

11520
11521
11522
11523
11524
11525
11526
11514
11515
11516
11517
11518
11519
11520

11521
11522
11523
11524
11525
11526
11527
11528







-
+







TEST: C’en était malsain.
TEST: C’en devenait trop.


__[i]/conj(conj_elle)__
    (?<![dD]’)(elle) +({w_1})  @@0,$
    <<- morphex(\2, ":V", ":(?:3s|P|G)") and not morph(word(-1), ":R|>(?:et|ou)", False, False)
    and not (morph(\2, ":[PQ]", False) and morph(word(-1), ":V0.*:3s", False, False))
        and not (morph(\2, ":[PQ]", False) and morph(word(-1), ":V0.*:3s", False, False))
    -2>> =suggVerb(@, ":3s")                                 # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du singulier.
    <<- __also__ and morph(\2, ":3p", False) -1>> elles      # Accord avec « \2 ».

TEST: Elle {{conquis}}.
TEST: Elle {{finis}}.
TEST: Elle {{pâlis}}.
TEST: {{Elles}} {{donne}} des leçons.
11540
11541
11542
11543
11544
11545
11546
11547

11548
11549
11550
11551
11552
11553
11554
11542
11543
11544
11545
11546
11547
11548

11549
11550
11551
11552
11553
11554
11555
11556







-
+







TEST: avec toi qui ne sais rien de rien, mieux {{vaux}} ne rien dire.
TEST: Mais là-bas mieux {{valais}} ouvrir sa gueule que se taire.


__[i]/conj(conj_personne_aucun_rien_nul)__
    (personne|aucun|rien|nul(?:le|)) +(?:qui +|)({w_1})  @@0,$
    <<- morphex(\2, ":V", ":(?:3s|P|G)") and morphex(word(-1), ":C", ":(?:Y|P|Q|[123][sp]|R)", True)
    and not( \1.endswith("ien") and before("> +$") and morph(\2, ":Y", False) )
        and not( \1.endswith("ien") and before("> +$") and morph(\2, ":Y", False) )
    -2>> =suggVerb(@, ":3s")                                 # Conjugaison erronée. Accord avec « \1… ». Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: Personne ne {{peux}} me le dire.
TEST: Rien ne {{sers}} de courir
TEST: Rien n’{{arrives}} sans raison
TEST: Rien, en ce qui le concernait, ne {{pouvais}} le ramener à la raison.
TEST: personne n’en {{parlent}}
11590
11591
11592
11593
11594
11595
11596
11597
11598


11599
11600
11601
11602
11603
11604
11605
11606
11607


11608
11609
11610
11611
11612
11613
11614
11615
11616
11617



11618
11619
11620
11621
11622
11623
11624
11592
11593
11594
11595
11596
11597
11598


11599
11600
11601
11602
11603
11604
11605
11606
11607


11608
11609
11610
11611
11612
11613
11614
11615
11616



11617
11618
11619
11620
11621
11622
11623
11624
11625
11626







-
-
+
+







-
-
+
+







-
-
-
+
+
+







TEST: manger {{fais}} grossir.
TEST: boire immodérément {{nuis}} à la santé


__[i]/conj(conj_det_sing_nom)__
    (?<![dD]’)(une?|[mts](?:on|a)|ce(?:tte|t|)) +({w_2}) +({w_2})  @@0,w,$
    <<- not (re.search("(?i)^une? +(?:dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet) ", \0) and morph(\3, ":3p", False))
    and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":V", ":(?:3s|P|Q|Y|3p!|G)") and morphex(word(-1), ":C", ":(?:Y|P)", True)
    and not (before(r"(?i)\b(?:et|ou) +$") and morph(\3, ":[123]?p", False)) and not before(r"(?i)\bni .* ni ") >>>
        and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":V", ":(?:3s|P|Q|Y|3p!|G)") and morphex(word(-1), ":C", ":(?:Y|P)", True)
        and not (before(r"(?i)\b(?:et|ou) +$") and morph(\3, ":[123]?p", False)) and not before(r"(?i)\bni .* ni ") >>>
    <<- not checkAgreement(\2, \3)
    -3>> =suggVerb(@, ":3s")                            # Conjugaison erronée. Accord avec « \1 \2… ». Le verbe devrait être à la 3ᵉ personne du singulier.
    <<- __else__ and isAmbiguousAndWrong(\2, \3, ":s", ":3s")
    -3>> =suggVerb(@, ":3s", suggSing)                  # Accord avec « \1 \2… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
__[i]/conj(conj_det_sing_nom_confusion)__
    (?<![dD]’)(l(?:e(?:ur|) |a |’)) *({w_2}) +({w_2})  @@0,w,$
    <<- not (re.search("(?i)^la +moitié ", \0) and morph(\3, ":3p", False))
    and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":V", ":(?:3s|P|Q|Y|3p!|G)") and morphex(word(-1), ":C", ":(?:Y|P)", True)
    and not (before(r"(?i)\b(?:et|ou) +$") and morph(\3, ":[123]?p", False)) and not before(r"(?i)\bni .* ni ") >>>
        and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":V", ":(?:3s|P|Q|Y|3p!|G)") and morphex(word(-1), ":C", ":(?:Y|P)", True)
        and not (before(r"(?i)\b(?:et|ou) +$") and morph(\3, ":[123]?p", False)) and not before(r"(?i)\bni .* ni ") >>>
    <<- not checkAgreement(\2, \3)
    -3>> =suggVerb(@, ":3s")                            # Conjugaison erronée. Accord avec « \1 \2… ». Le verbe devrait être à la 3ᵉ personne du singulier.
    <<- __else__ and isVeryAmbiguousAndWrong(\2, \3, ":s", ":3s", isStart())
    -3>> =suggVerb(@, ":3s", suggSing)                  # Accord avec « \1 \2… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
__[i]/conj(conj_det_sing_nom_qui)__
    (?<![dD]’)(l[ea] |une? |l’|[mts](?:on|a) |ce(?:tte|t|) |leur ) *({w_2}) +qui +({w_2})  @@0,w,$
    <<- not ( re.search("(?i)^(?:une? +(?:dizaine|douzaine|quinzaine|vingtaine|trentaine|quarantaine|cinquantaine|soixantaine|centaine|majorité|minorité|millier|partie|poignée|tas|paquet) |la +moitié) ", \0)
    and morph(\3, ":3p", False) )
    and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":V", ":(?:3s|P|Q|Y|3p!|G)") and morphex(word(-1), ":C", ":(?:Y|P)", True)
    and not (before(r"(?i)\b(?:et|ou) +$") and morph(\3, ":[123]p", False)) and not before(r"(?i)\bni .* ni ")
        and morph(\3, ":3p", False) )
        and morphex(\2, ":[NAQ].*:[si]", ":G") and morphex(\3, ":V", ":(?:3s|P|Q|Y|3p!|G)") and morphex(word(-1), ":C", ":(?:Y|P)", True)
        and not (before(r"(?i)\b(?:et|ou) +$") and morph(\3, ":[123]p", False)) and not before(r"(?i)\bni .* ni ")
    -3>> =suggVerb(@, ":3s")                            # Conjugaison erronée. Accord avec « \1 \2… ». Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: La {{N.S.A.}} {{espionneras}} toujours tout le monde
TEST: La suspicion envers les élus {{accroissaient}}…                                               ->> accroissait
TEST: Le chien n’{{es}} pas mort.
TEST: Ce roman-là de Jean-Paul Sartre {{es}} passionnant.
TEST: Cette confusion qui {{donnent}} le tournis.
11708
11709
11710
11711
11712
11713
11714
11715

11716
11717
11718
11719
11720
11721
11722
11710
11711
11712
11713
11714
11715
11716

11717
11718
11719
11720
11721
11722
11723
11724







-
+







TEST: Ceux qui {{chante}} toute la journée…
TEST: Celles qui {{pense}}.


__[i]/conj(conj_ceux_là_celles_ci_lesquels)__
    (ce(?:ux-(?:ci|là)|lles-(?:ci|là))|lesquel(?:le|)s) +(?:qui +|)({w_1})  @@0,$
    <<- morphex(\2, ":V", ":(?:3p|P|Q|G)") and not morph(word(-1), ":[VR]", False, False)
    and not (morph(\2, ":Y", False) and re.search(r"(?i)lesquel", \1) and not re.search(" qui |>", \0))
        and not (morph(\2, ":Y", False) and re.search(r"(?i)lesquel", \1) and not re.search(" qui |>", \0))
    -2>> =suggVerb(@, ":3p")                                # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: lesquels {{devienne}} des ennuyeux incomparables.
TEST: Mais parmi les millions de causes à défendre, lesquelles choisir ?


__[i]/conj(conj_elles)__
11794
11795
11796
11797
11798
11799
11800
11801

11802
11803
11804
11805
11806
11807
11808
11809

11810
11811
11812
11813
11814
11815
11816
11817
11818
11819
11820
11821
11822
11823

11824
11825
11826
11827
11828
11829
11830
11831
11832
11833
11834
11835

11836
11837
11838
11839
11840
11841
11842
11796
11797
11798
11799
11800
11801
11802

11803
11804
11805
11806
11807
11808
11809
11810

11811
11812
11813
11814
11815
11816
11817
11818
11819
11820
11821
11822
11823
11824

11825
11826
11827
11828
11829
11830
11831
11832
11833
11834
11835
11836

11837
11838
11839
11840
11841
11842
11843
11844







-
+







-
+













-
+











-
+







TEST: {{certain}} {{donne}} beaucoup.
TEST: certaine est la défaite.


__[i]/conj(conj_det_plur_nom)__
    ([cmts]es|[nv]os|leurs|quelques) +({w_2}) +({w_2})  @@0,w,$
    <<- morph(\2, ":[NAQ].*:[pi]", False) and morphex(\3, ":V", ":(?:[13]p|P|Y|G|A.*:e:[pi])") and morphex(word(-1), ":C", ":[YP]", True)
    and not( morph(\3, ":3s", False) and before(r"(?i)\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") ) >>>
        and not( morph(\3, ":3s", False) and before(r"(?i)\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") ) >>>
    <<- not checkAgreement(\2, \3)
    -3>> =suggVerb(@, ":3p")                                # Conjugaison erronée. Accord avec « \1 \2… ». Le verbe devrait être à la 3ᵉ personne du pluriel.
    <<- __else__ and isAmbiguousAndWrong(\2, \3, ":p", ":3p")
    -3>> =suggVerb(@, ":3p", suggPlur)                      # Accord avec « \1 \2… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
__[i]/conj(conj_det_plur_nom_qui)__
    ([cmts]es|[nv]os|leurs|quelques) +({w_2}) +qui +({w_2})  @@0,w,$
    <<- morph(\2, ":[NAQ].*:[pi]", False) and morphex(\3, ":V", ":(?:[13]p|P|Y|G|A.*:e:[pi])") and morphex(word(-1), ":C", ":[YP]", True)
    and not( morph(\3, ":3s", False) and before(r"(?i)\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
        and not( morph(\3, ":3s", False) and before(r"(?i)\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
    -3>> =suggVerb(@, ":3p")                                # Conjugaison erronée. Accord avec « \1 \2… ». Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: Ses « chiens » {{coure}} sur ma pelouse.
TEST: mes filles {{passe}} ce matin
TEST: vos filles {{passes}} ce matin
TEST: ces travaux qui {{demande}} tant d’efforts.
TEST: vos questions ne {{réclame}} aucune réflexion.
TEST: le lien entre les agences de renseignement et ces mêmes entreprises pouvait reposer sur des activités de surveillance à proprement parler.


__[i]/conj(conj_det_plur_nom_confusion)__
    (les|certaine?s|plusieurs) +({w_2}) +({w_2})  @@0,w,$
    <<- morph(\2, ":[NAQ].*:[pi]", False) and morphex(\3, ":V", ":(?:[13]p|P|Y|G|A.*:e:[pi])") and morphex(word(-1), ":C", ":[YP]", True)
    and not( morph(\3, ":3s", False) and before(r"(?i)\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") ) >>>
        and not( morph(\3, ":3s", False) and before(r"(?i)\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") ) >>>
    <<- not checkAgreement(\2, \3)
    -3>> =suggVerb(@, ":3p")                                # Conjugaison erronée. Accord avec « \1 \2… ». Le verbe devrait être à la 3ᵉ personne du pluriel.
    <<- __else__ and (\1 == "les" or \1 == "Les") and isVeryAmbiguousAndWrong(\2, \3, ":p", ":3p", isStart())
    -3>> =suggVerb(@, ":3p", suggPlur)                      # Accord avec « les \2… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
    <<- __else__ and (\1 == "certains" or \1 == "Certains") and isVeryAmbiguousAndWrong(\2, \3, ":m:p", ":3p", isStart())
    -3>> =suggVerb(@, ":3p", suggMasPlur)                   # Accord avec « certains \2… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
    <<- __else__ and (\1 == "certaines" or \1 == "Certaines") and isVeryAmbiguousAndWrong(\2, \3, ":f:p", ":3p", isStart())
    -3>> =suggVerb(@, ":3p", suggFemPlur)                   # Accord avec « certaines \2… » incorrect. Conjugaison erronée ou accord nom/adjectif incorrect.
__[i]/conj(conj_det_plur_nom_qui_confusion)__
    (les|certaine?s|plusieurs) +({w_2}) +qui +({w_2})  @@0,w,$
    <<- morph(\2, ":[NAQ].*:[pi]", False) and morphex(\3, ":V", ":(?:[13]p|P|Q|Y|G|A.*:e:[pi])") and morphex(word(-1), ":C", ":[YP]", True)
    and not( morph(\3, ":3s", False) and before(r"(?i)\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
        and not( morph(\3, ":3s", False) and before(r"(?i)\b(?:l[ea] |l’|une? |ce(?:tte|t|) |[mts](?:on|a) |[nv]otre ).+ entre .+ et ") )
    -3>> =suggVerb(@, ":3p")                                # Conjugaison erronée. Accord avec « \1 \2… ». Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: Les abstentions {{est}} présumée manifester un défaut d’opinion marquée
TEST: Les cours de culture générale nous {{apporte}} de l’ouverture d’esprit.
TEST: Les hommes ne le lui {{pardonnes}} pas.
TEST: Les infirmières à mi-temps ne {{travaille}} pas dans cette aile.
TEST: les données, en quantité plus que suffisante, {{indique}} que…
11927
11928
11929
11930
11931
11932
11933
11934
11935


11936
11937
11938
11939
11940
11941
11942
11943
11944
11945
11946
11947
11948
11949
11950
11951
11952

11953
11954
11955
11956
11957
11958
11959
11929
11930
11931
11932
11933
11934
11935


11936
11937
11938
11939
11940
11941
11942
11943
11944
11945
11946
11947
11948
11949
11950
11951
11952
11953

11954
11955
11956
11957
11958
11959
11960
11961







-
-
+
+
















-
+








#### NOMS PROPRES

# 3sg
__[s]/conj(conj_nom_propre)__
    ([A-ZÉÈ][\w-]+) +({w_1})  @@0,$
    <<- not before(r"\b(?:et |ou |[dD][eu] |ni |[dD]e l’) *$") and morph(\1, ":M", False) and morphex(\2, ":[123][sp]", ":(?:G|3s|3p!|P|M|[AQ].*:[si])")
    and not morph(word(-1), ":[VRD]", False, False) and not before(r"([A-ZÉÈ][\w-]+), +([A-ZÉÈ][\w-]+), +$")
    and not (morph(\2, ":3p", False) and word(-1))
        and not morph(word(-1), ":[VRD]", False, False) and not before(r"([A-ZÉÈ][\w-]+), +([A-ZÉÈ][\w-]+), +$")
        and not (morph(\2, ":3p", False) and word(-1))
    -2>> =suggVerb(@, ":3s")
    # Conjugaison erronée. Accord avec « \1 ». Le verbe devrait être à la 3ᵉ personne du singulier.

TEST: Marc {{arrives}} demain.
TEST: Paul ne {{viens}} pas demain.
TEST: Marc Aurèle {{étaient}} l’empereur des Romains. (Pas de trait d’union sur Marc Aurèle.)
TEST: Arthur D. parvient à…
TEST: Les fondateurs pionniers de l’Internet n’avaient pas prévu
TEST: les compteurs Geiger ne détectent pas le polonium
TEST: Des femmes de l’administration Obama y racontent qu’elles ont constaté qu’il leur arrivait régulièrement de ne pas être invitées


# 3pl
__[s]/conj(conj_nom_propre_et_nom_propre)__
    (?<!et |ou |[dD][eu] |ni )([A-ZÉÈ][\w-]+) et ([A-ZÉÈ][\w-]+) +({w_1})  @@0,w,$
    <<- morph(\1, ":M", False) and morph(\2, ":M", False)
    and morphex(\3, ":[123][sp]", ":(?:G|3p|P|Q.*:[pi])") and not morph(word(-1), ":R", False, False)
        and morphex(\3, ":[123][sp]", ":(?:G|3p|P|Q.*:[pi])") and not morph(word(-1), ":R", False, False)
    -3>> =suggVerb(@, ":3p")
    # Conjugaison erronée. Accord avec « \1 et \2 ». Le verbe devrait être à la 3ᵉ personne du pluriel.

TEST: Samantha et Eva {{viennes}} demain.
TEST: Samantha et Eva leur {{décrive}} une leçon.


12227
12228
12229
12230
12231
12232
12233
12234
12235


12236
12237
12238
12239
12240
12241
12242
12243
12244
12245
12246
12247
12248
12249
12250
12251
12252
12253
12254
12255


12256
12257
12258
12259
12260
12261
12262
12229
12230
12231
12232
12233
12234
12235


12236
12237
12238
12239
12240
12241
12242
12243
12244
12245
12246
12247
12248
12249
12250
12251
12252
12253
12254
12255


12256
12257
12258
12259
12260
12261
12262
12263
12264







-
-
+
+


















-
-
+
+







TEST: donnant à entendre qu’il avait l’intention de violer Laura dès qu’il en aurait l’occasion


# verbe que + subjonctif
__[i]/vmode(vmode_qqch_que_subjonctif1)__
    (afin|avant|pour|quoi|(?:perm|fa|v[oe]|ordonn|exig|désir|dout|suff|préf[éè]r)\w+) +que? +({w_2}) +({w_2})  @@0,w,$
    <<- morph(\1, ">(?:afin|avant|pour|quoi|permettre|falloir|vouloir|ordonner|exiger|désirer|douter|préférer|suffire) ", False)
    and morph(\2, ":(?:Os|M)", False) and morphex(\3, ":I", ":[GYS]")
    and not (morph(\1, ">douter ", False) and morph(\3, ":(?:If|K)", False))
        and morph(\2, ":(?:Os|M)", False) and morphex(\3, ":I", ":[GYS]")
        and not (morph(\1, ">douter ", False) and morph(\3, ":(?:If|K)", False))
    -3>> =suggVerbMode(@, ":S", \2)                                                 # Après « \1 que », ce verbe devrait être au subjonctif.

TEST: Il suffit qu’il {{court}} plus
TEST: Je veux qu’il {{finit}} son repas.
TEST: quoi qu’il en {{conclut}}
TEST: Je ne veux pas que tu {{es}} des ennuis
TEST: Avant que tu {{pars}}, je voudrais qu’on discute.
TEST: Nul doute qu’elle nourrira à brève échéance la haine de demain à notre égard.
TEST: Je ne doute pas qu’ils réussiront leur mission.
TEST: Je me doutais bien qu’Apple pourrait marcher
TEST: il ne fait aucun doute qu’Amazon le sait.
TEST: quoi que nous autres hommes ayons pu faire


# Bien que + subjonctif
__[i]/vmode(vmode_bien_que_subjonctif)__
    bien  ?que? ({w_2}) +({w_2})  @@w,$
    <<- morph(\1, ":(?:Os|M)", False) and morphex(\2, ":V.*:I", ":(?:[GSK]|If)|>(?:hériter|recevoir|donner|offrir) ") and isStart()
    and not ( morph(\2, ":V0a", False) and morph(word(1), ">(?:hériter|recevoir|donner|offrir) ", False) )
    and not before0(r"(?i)\bsi ")
        and not ( morph(\2, ":V0a", False) and morph(word(1), ">(?:hériter|recevoir|donner|offrir) ", False) )
        and not before0(r"(?i)\bsi ")
    -2>> =suggVerbMode(@, ":S", \1)                                                                 # Après « bien que », le verbe s’emploie au subjonctif.

TEST: Il ne le savait pas, bien qu’il en {{avait}} entendu parler.
TEST: Bien que je {{prends}} mon mal en patience.
TEST: C’est un joli bien. Bien qu’il a hérité de son oncle, notez bien.
TEST: Bien qu’il avait donné à ses enfants.
TEST: si bien que je me suis toujours demandée si cela ne m’avait pas un peu bousillé les yeux

Modified gc_lang/fr/webext/panel/lex_editor.js from [8312ea2175] to [b2a35ae675].

588
589
590
591
592
593
594
595

596
597
598
599
600
601
602
588
589
590
591
592
593
594

595
596
597
598
599
600
601
602







-
+







        let sMinutes = (oDate.getMinutes()).toString().padStart(2, "0");
        return `${oDate.getFullYear()}-${sMonth}-${sDay}, ${sHours}:${sMinutes}`;
    }
}


const oBinaryDict = {
    // 
    
    oJSON: null,

    load: function () {
        if (bChrome) {
            browser.storage.local.get("oDictionary", this._load);
            return;
        }
621
622
623
624
625
626
627
628
629



630
631
632
633
634
635
636
621
622
623
624
625
626
627


628
629
630
631
632
633
634
635
636
637







-
-
+
+
+







        this.oJSON = oDAWG.createBinary(1);
        this.save();
        oWidgets.hideElement("build_progress");
        oWidgets.showElement("export_button");
        // debug
        console.log(oDAWG.morph("finis"));
        let oIBDAWG = new IBDAWG(this.oJSON);
        let lEntry2 = oIBDAWG.select();
        console.log(lEntry2);
        for (let e of oIBDAWG.select()) {
            console.log(e);
        }
    },

    save: function () {
        browser.storage.local.set({ "oDictionary": this.oJSON });
    },

    import: function () {

Modified graphspell-js/dawg.js from [c471dee066] to [fdeac2dc31].

369
370
371
372
373
374
375
376

377
378
379
380
381
382
383
369
370
371
372
373
374
375

376
377
378
379
380
381
382
383







-
+







        }
        let oJSON = {
            "sName": this.sName,
            "nVersion": nMethod,
            "sHeader": this.sHeader + nMethod + "/",
            "lArcVal": this.lArcVal,
            "nArcVal": this.nArcVal,
            "byDic": sByDic,
            "byDic": sByDic,  // binary word graph
            "sLang": this.sLang,
            "nChar": this.nChar,
            "nBytesArc": this.nBytesArc,
            "nBytesNodeAddress": this.nBytesNodeAddress,
            "nEntries": this.nEntry,
            "nNode": this.nNode,
            "nArc": this.nArc,