Grammalecte  Check-in [663cc65183]

Overview
Comment:[fr] conversion: regex rules -> graph rules
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | fr | rg
Files: files | file ages | folders
SHA3-256: 663cc6518364c113ce4c44297357614c0f3aa8fc2a2b59c9a24055c7fa97e1d9
User & Date: olr on 2018-07-26 11:51:04
Other Links: branch diff | manifest | tags
Context
2018-07-27
08:32
[fr] conversion: regex rules -> graph rules check-in: 070d93f9ad user: olr tags: fr, rg
2018-07-26
11:51
[fr] conversion: regex rules -> graph rules check-in: 663cc65183 user: olr tags: fr, rg
08:31
[core] gc engine: use stored morphologies in tokens if they exist check-in: eecbc6012a user: olr tags: core, rg
Changes

Modified gc_lang/fr/rules.grx from [7d831c71bf] to [e57d770e9f].

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







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


-
-
-
+
+
+







-
-
+
+







!!!
!!!
!!! Processeur: épuration des adverbes, locutions adverbiales, interjections et expressions usuelles  !!
!!!
!!!

__purge_dates__
    depuis le           [1er|1ᵉʳ|~\d\d?]  {mois}    ?[dernier|prochain|~\d{2,5}]¿
    [le|du|au]          [1er|1ᵉʳ|~\d\d?]  {mois}    ?[dernier|prochain|~\d{2,5}]¿
    [jusqu’|jusqu]  au  [1er|1ᵉʳ|~\d\d?]  {mois}    ?[dernier|prochain|~\d{2,5}]¿
    à  compter  du      [1er|1ᵉʳ|~\d\d?]  {mois}    ?[dernier|prochain|~\d{2,5}]¿
    en  l’  an  ~\d{2,5}
    en  l’  an  de  grâce  ~\d{2,5}
    en  {mois}  ~\d{2,5}
    [de|d’|D’]  {mois}  ~\d{2,5}
    à  la  {mi_mois}    ?~\d{2,5}¿
    depuis le           [1er|1ᵉʳ|~^\d\d?$]  {mois}    ?[dernier|prochain|~^\d{2,5}$]¿
    [le|du|au]          [1er|1ᵉʳ|~^\d\d?$]  {mois}    ?[dernier|prochain|~^\d{2,5}$]¿
    [jusqu’|jusqu]  au  [1er|1ᵉʳ|~^\d\d?$]  {mois}    ?[dernier|prochain|~^\d{2,5}$]¿
    à  compter  du      [1er|1ᵉʳ|~^\d\d?$]  {mois}    ?[dernier|prochain|~^\d{2,5}$]¿
    en  l’  an  ~^\d{2,5}$
    en  l’  an  de  grâce  ~^\d{2,5}$
    en  {mois}  ~^\d{2,5}$
    [de|d’|D’]  {mois}  ~^\d{2,5}$
    à  la  {mi_mois}    ?~^\d{2,5}$¿
        <<- ~>> *

    en  ~\d{2,5}  [,|<end>]
    en  ~\d{2,5}  @:¬:[AN].*:[pi]
    de  ~\d{2,5}  @:A.*:s
    en  ~^\d{2,5}$  [,|<end>]
    en  ~^\d{2,5}$  @:¬:[AN].*:[pi]
    de  ~^\d{2,5}$  @:A.*:s
        <<- ~1:2>> *

TEST: ils sont depuis le 2 janvier {{parti}} à l’étranger.
TEST: ils sont depuis le 2 janvier 2012 {{parti}} à l’étranger.


__purge_saisons__
    à  l’  [été|automne|hiver]  ~\d{2,4}
    au  printemps  ~\d{2,4}
    à  l’  [été|automne|hiver]  ~^\d{2,4}$
    au  printemps  ~^\d{2,4}$
        <<- ~>> *

TEST: Une étude de 2005 publiée dans le Journal
TEST: Les cinq variantes de la couverture du magazine Wired d’avril 2016 consacrée à Silicon Valley.
TEST: c’est donc la cinquième en 50 ans


6584
6585
6586
6587
6588
6589
6590
6591
6592
6593
6594
6595





6596
6597
6598
6599
6600
6601
6602
6584
6585
6586
6587
6588
6589
6590





6591
6592
6593
6594
6595
6596
6597
6598
6599
6600
6601
6602







-
-
-
-
-
+
+
+
+
+







    mois        après   mois
    décennie    après   décennie
    année       après   année
    siècle      après   siècle
    génération  après   génération
        <<- ~>> *

    [à|de]  ~\d\d?  h  ?~\d\d?¿
    [à|de]  ~\d\d?  h  ?~\d\d?¿   [du|ce]  [matin|soir]
    [à|de]  ~\d\d?  h  ?~\d\d?¿   de  l’ après-midi
    [à|de]  ~\d\d?  h  ?~\d\d?¿   cet  après-midi
    [à|de]  ~\d\d?  h  ?~\d\d?¿   demain  [matin|soir|après-midi]
    [à|de]  ~^\d\d?$  h  ?~^\d\d?$¿
    [à|de]  ~^\d\d?$  h  ?~^\d\d?$¿   [du|ce]  [matin|soir]
    [à|de]  ~^\d\d?$  h  ?~^\d\d?$¿   de  l’ après-midi
    [à|de]  ~^\d\d?$  h  ?~^\d\d?$¿   cet  après-midi
    [à|de]  ~^\d\d?$  h  ?~^\d\d?$¿   demain  [matin|soir|après-midi]
        <<- ~>> *

TEST: Le train de 2 h 47 {{arriveraient}} en retard.
TEST: Le train de 2 h 47 du matin {{arriveraient}} en retard.


__purge_prépositions_qqn__
6663
6664
6665
6666
6667
6668
6669
6670

6671
6672
6673
6674
6675
6676
6677
6663
6664
6665
6666
6667
6668
6669

6670
6671
6672
6673
6674
6675
6676
6677







-
+







    mutatis     mutandis
        <<- ~>> *


__purge_locutions__
    , [oui|non] ,
    , entre autres ?choses¿ ,
    à ~\d+(?:,\d+|)  %
    à ~^\d+(?:,\d+|)$  %
    à [autrui|bâbord|califourchon|chacun|confesse|contrecœur|contre-cœur|contretemps|demi-mot|foison|grand-peine|loisir|merveille|moitié|nouveau|outrance|peine|perpétuité|présent|raison|rallonge|rebrousse-poil|reculons|regret|renverse|risque|tâtons|tort|tribord|tout-va]
    à aucun prix
    à autre chose
    à bas [cout|coût|prix]
    à bâtons rompus
    à beaucoup près
    à belles dents
6706
6707
6708
6709
6710
6711
6712
6713

6714
6715
6716
6717
6718
6719
6720
6706
6707
6708
6709
6710
6711
6712

6713
6714
6715
6716
6717
6718
6719
6720







-
+







    à couper le souffle
    à court terme
    à courte [échéance|portée]
    à des kilomètres à la ronde
    à défaut d’autre chose
    à dose homéopathique
    à durée limitée
    à ~\d+ reprises
    à ~^\d+$ reprises
    à @:B reprises
    à [plusieurs|quelques|maintes] reprises
    à de  [nombreuses|multiples]  reprises
    à double [titre|tranchant]
    à en juger par [mon|ton|son|notre|votre|leur] expérience
    à en perdre haleine
    à en perdre la tête
6916
6917
6918
6919
6920
6921
6922
6923

6924
6925
6926
6927
6928
6929
6930
6916
6917
6918
6919
6920
6921
6922

6923
6924
6925
6926
6927
6928
6929
6930







-
+







    au propre comme au figuré
    au préalable
    au quotidien
    au ras des pâquerettes
    au saut du lit
    au sens [figuré|large|propre]
    au surplus
    au ~[xXvViI]+[eᵉ] siècle
    au ~^[xXvViI]+[eᵉ]$ siècle
    au-delà du descriptible
    au-dessus [de|d’] {pronom_obj}
    aujourd’hui
    auparavant
    ?tout¿ aussi
    aussitôt
    ?tout¿ au fond [de|d’] {pronom_obj}
7001
7002
7003
7004
7005
7006
7007
7008

7009
7010
7011
7012
7013
7014
7015
7016



7017
7018
7019
7020
7021
7022
7023
7001
7002
7003
7004
7005
7006
7007

7008
7009
7010
7011
7012
7013



7014
7015
7016
7017
7018
7019
7020
7021
7022
7023







-
+





-
-
-
+
+
+







    [croyez-le|crois-le] ou [non|pas]
    cul par-dessus tête
    dans [ce|ces] [cas-là|cas-ci]
    dans ce cas [précis|particulier]
    dans ces cas [précis|particuliers]
    dans l’ [idéal|immédiat]
    dans la mesure du possible
    dans les années ~\d\d+
    dans les années ~^\d{2,5}$
    dans peu de temps
    dans tout [cela|ça|ceci]
    dans très peu de temps
    dans un cas comme dans l’autre
    dans une [certaine|large|moindre] mesure
    début {mois} ~\d\d{2,5}
    au début {mois} ~\d\d{2,5}
    en ce début {mois} ~\d\d{2,5}
    début {mois} ~^\d{2,5}$
    au début {mois} ~^\d{2,5}$
    en ce début {mois} ~^\d{2,5}$
    d’ abord
    d’ affilée
    d’ ailleurs
    d’ année en année
    d’ aujourd’hui
    d’ antan
    d’ autant [plus|moins]
7055
7056
7057
7058
7059
7060
7061
7062

7063
7064
7065
7066
7067
7068
7069
7055
7056
7057
7058
7059
7060
7061

7062
7063
7064
7065
7066
7067
7068
7069







-
+







    d’ un commun accord
    d’ une autre trempe
    d’ une [façon|manière] ou d’une autre
    d’ une certaine [façon|manière]
    d’ une tout autre ampleur
    d’ une [minute|seconde] à l’ autre
    de-ci ?,¿ de-là
    de ~\d+(?:,\d+|) %
    de ~^\d+(?:,\d+|)$ %
    de [cesse|conserve|facto|fait|guingois|luxe|nouveau|permanence|partout|préférence|profundis|rechange|routine|surcroît|surcroit|visu]
    de A à Z
    de bas (?:en haut|étage)
    de basse [condition|extraction]
    de bon [aloi|cœur|gré|matin|sens|ton]
    de bonne [facture|famille|foi|heure|humeur|grâce|qualité|compagnie]
    de bric et de broc
7169
7170
7171
7172
7173
7174
7175
7176

7177
7178
7179
7180
7181
7182

7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201
7202

7203
7204
7205
7206
7207
7208
7209
7169
7170
7171
7172
7173
7174
7175

7176
7177
7178
7179
7180
7181

7182
7183
7184
7185
7186
7187
7188
7189
7190
7191
7192
7193
7194
7195
7196
7197
7198
7199
7200
7201

7202
7203
7204
7205
7206
7207
7208
7209







-
+





-
+



















-
+







    debout
    derechef
    donc
    dorénavant
    déjà
    désormais
    depuis @:B [ans|années|mois|semaines|jours|heures|minutes|secondes]
    depuis ~\d+ [ans|années|mois|semaines|jours|heures|minutes|secondes]
    depuis ~^\d+$ [ans|années|mois|semaines|jours|heures|minutes|secondes]
    depuis assez longtemps
    depuis belle lurette
    depuis bien longtemps
    depuis de ?très¿ longues années
    depuis des lustres
    depuis les années ~\d\d+
    depuis les années ~^\d\d+$
    depuis longtemps
    depuis lors
    depuis peu de temps
    depuis quelque temps
    depuis quelques [secondes|minutes|heures|jours|semaines|mois|trimestres|semestres|années|décennies|siècles|millénaires]
    depuis si longtemps
    depuis toujours
    depuis tout ce temps
    depuis très longtemps
    des fois
    des pieds à la tête
    des uns et des autres
    des [années|mois|siècles|millénaires|décennies|semaines] plus [tôt|tard]
    dès [maintenant|lors|aujourd’hui]
    dès à présent
    dès que possible
    dès [demain|hier] ?[soir|matin|après-midi]¿
    Dieu [m’|t’|l’|nous|vous|les] en [garde|préserve]
    Dieu [m’|t’|lui|nous|vous|leur] en soit témoin
    du ~[xXvViI]+[eᵉ] siècle
    du ~^[xXvViI]+[eᵉ]$ siècle
    du [Ier|Iᵉʳ|1er|1ᵉʳ] siècle
    du bout des lèvres
    du début à la fin
    du fond du cœur
    du jour au lendemain
    du haut en bas
    du même [acabit|coup|ordre|tonneau]
7312
7313
7314
7315
7316
7317
7318
7319

7320
7321
7322
7323
7324
7325
7326
7312
7313
7314
7315
7316
7317
7318

7319
7320
7321
7322
7323
7324
7325
7326







-
+







    en ce [moment|temps-là]
    en ce qui [me|te|le|la|les|nous|vous] [concerne|concernait]
    en cet instant
    encore
    encore une fois
    encore et [encore|toujours]
    enfin
    entre {mois} ?~\d{2,5}¿ et {mois} ?~\d{2,5}¿
    entre {mois} ?~^\d{2,5}¿ et {mois} ?~^\d{2,5}¿
    entre chien et loup
    entre de [bonnes|mauvaises] mains
    entre l’ [un|une] et l’ autre
    entre les uns et les autres
    entre [quatre|quatr’|quat’] [zyeux|yeux]
    entre [quatre-zyeux|quatr’zyeux|quat’zyeux|quatre-yeux|quatr’yeux|quat’yeux]
    ensuite
7342
7343
7344
7345
7346
7347
7348
7349
7350


7351
7352
7353
7354
7355
7356
7357
7342
7343
7344
7345
7346
7347
7348


7349
7350
7351
7352
7353
7354
7355
7356
7357







-
-
+
+







    ici [comme|ou] ailleurs
    ici et [là|maintenant]
    ici même
    ici-bas
    il y a ?très¿ longtemps
    il y a ?très¿ peu de temps
    il y a quelques [secondes|minutes|heures|jours|semaines|mois|année|ans|siècles|millénaires]
    il y a moins de ~\d+ [secondes|minutes|heures|jours|semaines|mois|année|ans|siècles|millénaires]
    il y a ~\d+ [secondes|minutes|heures|jours|semaines|mois|année|ans|siècles|millénaires]
    il y a moins de [~\d+$|@:B] [secondes|minutes|heures|jours|semaines|mois|année|ans|siècles|millénaires]
    il y a [~\d+$|@:B] [secondes|minutes|heures|jours|semaines|mois|année|ans|siècles|millénaires]
    il y a quelque temps
    il n’y a pas ?si¿ longtemps
    illico ?presto¿
    jadis
    j’ en passe et des [meilleurs|meilleures]
    jour pour jour
    [jusqu’|jusqu] [alors|ici|aujourd’hui|Noël|Pâques]
7863
7864
7865
7866
7867
7868
7869
7870

7871
7872
7873

7874
7875
7876

7877
7878
7879
7880
7881

7882
7883
7884
7885
7886
7887
7888
7889


7890
7891
7892
7893
7894
7895
7896
7863
7864
7865
7866
7867
7868
7869

7870
7871
7872

7873
7874
7875

7876
7877
7878
7879
7880

7881
7882
7883
7884
7885
7886
7887
7888

7889
7890
7891
7892
7893
7894
7895
7896
7897







-
+


-
+


-
+




-
+







-
+
+







    je      [t’|vous]   en  [prie|supplie]
    nous    [t’|vous]   en  [prions|supplions]
        <<- ~>> *


# Déterminant + nombre
__p_dét_plur_nombre_nom__
    [les|des|mes|tes|ses|nos|vos|leurs]  ~\d+  @:[NA].*:[pi]¬:(?:V0|3p|Oo|X)|>(?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor)
    [les|des|mes|tes|ses|nos|vos|leurs]  ~^\d+$  @:[NA].*:[pi]¬:(?:V0|3p|Oo|X)|>(?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor)
        <<- ~2>> *

    [les|des|mes|tes|ses|nos|vos|leurs]  ~\d+  ou  ~\d+  @:[NA].*:[pi]¬:(?:V0|3p|Oo|X)|>(?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor)
    [les|des|mes|tes|ses|nos|vos|leurs]  ~^\d+$  ou  ~^\d+$  @:[NA].*:[pi]¬:(?:V0|3p|Oo|X)|>(?:janvier|février|mars|avril|mai|juin|juillet|ao[ûu]t|septembre|octobre|novembre|décembre|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor)
        <<- ~2:4>> *

    [les|des]   >numéro  [un|~\d+|@:B]  et  [~\d+|@:B]
    [les|des]   >numéro  [un|~^\d+$|@:B]  et  [~^\d+$|@:B]
        <<- ~3:0>> *

    la  >numéro  un
    la  >numéro  @:B
    la  >numéro  ~\d+
    la  >numéro  ~^\d+$
        <<- =>> define(\2, [">numéro/:N:f:s"])
        <<- ~3>> *

    le  numéro  un  @:¬:N:[em]:[is]
        <<- ~3>> *

    >numéro  @:B
    >numéro  ~\d+
    >numéro  ~^\d+$
    [n°|no]  ~^\d+$
        <<- ~2>> *


__mot_composé_avec_là__
    ~-[lL][àÀ]$
        <<- morph(\1, ":[NAQ]", ":G", 0, -3) ~>> =\1[:-3]

9167
9168
9169
9170
9171
9172
9173

9174
9175
9176
9177
9178
9179
9180
9168
9169
9170
9171
9172
9173
9174
9175
9176
9177
9178
9179
9180
9181
9182







+







        -2>> =suggPlur(\2)                                                                  # Accord de nombre erroné : « \2 » devrait être au pluriel.

TEST: plusieurs {{foi}} par jour.


## Autres pluriels

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









9207









9208



























9209
9210
9211
9212
9213
9214
9215
9216
9217
9218
9219
9220
9221
9222
9223
9224
9225
9226
9227
9228
9229
9230
9231
9232
9233
9234
9235
9236
9237
9238
9239
9240
9241
9242
9243
9244
9245
9246
9247
9248
9249
9250
9251
9252
9253
9254
9255
9256
9257
9258
9259
9260
9261
9262
9263

9264
9265
9266
9267
9268




9269
9270
9271

9272
9273
9274
9275
9276
9277
9278



9279
9280
9281
9282
9283
9284
9285
9286



9287


9288


9289
9290
9291
9292
9293
9294
9295









9296
9297
9298
9299
9300
9301
9302
9303
9304
9305
9306
9307
9308
9309
9310
9311
9312
9313
9314
9315
9316
9317
9318
9319
9320
9321
9322
9323
9324
9325
9326
9327
9328
9329
9330
9331
9332
9333
9334
9335
9336
9337
9338
9339
9340
9341
9342
9343
9344
9345
9346
9347


9348
9349
9350
9351

9352
9353
9354
9355
9356
9357
9358
9201
9202
9203
9204
9205
9206
9207
9208
9209
9210
9211
9212
9213
9214
9215
9216
9217

9218
9219
9220
9221
9222
9223
9224
9225
9226
9227
9228
9229
9230
9231
9232
9233
9234
9235
9236
9237
9238
9239
9240
9241
9242
9243
9244
9245
9246
9247
9248
9249
9250
9251
9252
9253
9254
9255
9256
9257
9258
9259
9260
9261
9262
9263

9264
9265
9266
9267
9268
9269
9270
9271
9272
9273
9274
9275
9276
9277
9278
9279
9280
9281
9282

9283
9284
9285
9286
9287
9288
9289
9290
9291
9292
9293
9294
9295
9296
9297







9298
9299

9300





9301
9302
9303
9304
9305


9306







9307
9308
9309
9310







9311
9312
9313
9314
9315
9316
9317
9318
9319
9320
9321





9322
9323
9324
9325
9326
9327
9328
9329
9330
9331
9332
9333









9334
9335
9336
9337

































9338


9339
9340




9341
9342
9343
9344
9345
9346
9347
9348








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

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









-



















-















-
-
-
-
-
-
-


-
+
-
-
-
-
-
+
+
+
+

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

-
-
-
-
-
-
-
+
+
+

+
+

+
+


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



-
-
-
-
-
-
-
-
-




-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

-
-
+
+
-
-
-
-
+








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


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

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

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

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

TEST: {{Quelle}} homme.                                       ->> Quel
TEST: {{Quel}} femme.                                         ->> Quelle
TEST: {{Quels}} chanson.                                      ->> Quelle
TEST: {{Quelles}} {{tarés}}.
TEST: Quelle sale journée…
TEST: Quelles drôles de prunes


## Cas particuliers
__gn_det_plur_cas_particuliers__
    [ces|des|mes|tes|ses|nos|vos|leurs|quelques] [même|point|son|ton]
        <<- /gn/ -2>> \1s                                                                   # Accord de nombre erroné : mettez au pluriel.

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


## Pluriel des groupes

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

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


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

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


## quelque adverbe

__gn_quelque_adverbe__
    quelques  ~^\d+$
        <<- /gn/ -1>> quelque                                                               # Devant un nombre, « quelque » est un adverbe, donc invariable.

    quelques  @:B
        <<- /gn/ \2 != "cents" -1>> quelque                                                 # Devant un nombre, « quelque » est un adverbe, donc invariable.

TEST: Elle a eu {{quelques}} 300 réponses à sa petite-annonce.
TEST: Il commande {{quelques}} trois cents hommes.
TEST: {{Quelques}} 120 hommes                                 ->> Quelque
TEST: {{Quelques}} deux cents hommes.                         ->> Quelque
TEST: les quelque 2,5 millions d’habitants
TEST: les quelque 12 000 stations-service



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



## Nombres

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

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

    neuf  *WORD

__[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
    -2>> =suggPlur(@)                                                                               # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel.
        <<- /gn/ ( morph(\2, ":[NAQ].*:s", "*") and not morph(<1, ":N.*:m:[is]") and not value(\2, "|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|") )
            or \2 in aREGULARPLURAL
        -2>> =suggPlur(\2)                                                                  # 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.
    mille  *WORD
        <<- /gn/ (morph(\2, ":[NAQ].*:s", "*") or \1 in aREGULARPLURAL) and not value(<1, "|le|un|ce|du|")
        -2>> =suggPlur(\2)                                                                  # 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.
TEST: Il a abandonné neuf {{enfant}}.
TEST: On peut trouver mille {{travailleur}} d’un claquement de doigts.
TEST: un logement neuf bâti par des professionnels.
TEST: un mille marin.


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

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

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)
    -2>> =suggPlur(@)                                                                               # Accord de nombre erroné : « \2 » devrait être au pluriel.

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


## quel / quels / quelle / quelles
__[i]/gn(gn_quel_accord)__
    (quel) +({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ].*:f:p", ":(?:V0e|[NAQ].*:[me]:[si])")       -1>> quelles                # Accord de genre et de nombre erroné : « \2 » est féminin et au pluriel.
    <<- __also__ and hasFemForm(\2)                                     -2>> =suggMasSing(@, True)  # Accord de genre et de nombre erroné : « \1 » est masculin et au singulier.
    <<- morphex(\2, ":[NAQ].*:m:p", ":(?:V0e|[NAQ].*:[me]:[si])")       -1>> quels                  # Accord de nombre erroné : « \2 » est au pluriel.
    <<- __also__                                                        -2>> =suggSing(@)           # Accord de nombre erroné : « \1 » est au singulier.
    <<- morphex(\2, ":[NAQ].*:f:[si]", ":(?:V0e|[NAQ].*:[me]:[si])")    -1>> quelle                 # Accord de genre erroné : « \2 » est féminin.
    <<- __also__ and hasFemForm(\2)                                     -2>> =suggMasSing(@, True)  # Accord de genre erroné : « \1 » est masculin.
__[i]/gn(gn_quels_accord)__
    (quels) +({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ].*:f:s", ":(?:V0e|[NAQ].*:[me]:[pi])")       -1>> quelle                 # Accord de genre et de nombre erroné : « \2 » est féminin et au singulier.
    <<- __also__ and hasFemForm(\2)                                     -2>> =suggMasPlur(@, True)  # Accord de genre et de nombre erroné : « \1 » est masculin et au pluriel.
    <<- morphex(\2, ":[NAQ].*:m:s", ":(?:V0e|[NAQ].*:[me]:[pi])")       -1>> quel                   # Accord de nombre erroné : « \2 » est au singulier.
    <<- __also__                                                        -2>> =suggPlur(@)           # Accord de nombre erroné : « \1 » est au pluriel.
    <<- morphex(\2, ":[NAQ].*:f:[pi]", ":(?:V0e|[NAQ].*:[me]:[pi])")    -1>> quelles                # Accord de genre erroné : « \2 » est féminin.
    <<- __also__ and hasFemForm(\2)                                     -2>> =suggMasPlur(@, True)  # Accord de genre erroné : « \1 » est masculin.
__[i]/gn(gn_quelle_accord)__
    (quelle) +({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ].*:m:p", ":(?:V0e|[NAQ].*:[fe]:[si])")       -1>> quels                  # Accord de genre et de nombre erroné : « \2 » est masculin et au pluriel.
    <<- __also__ and hasFemForm(\2)                                     -2>> =suggFemSing(@, True)  # Accord de genre et de nombre erroné : « \1 » est féminin et au singulier.
    <<- morphex(\2, ":[NAQ].*:f:p", ":(?:V0e|[NAQ].*:[fe]:[si])")       -1>> quelles                # Accord de nombre erroné : « \2 » est au pluriel.
    <<- __also__                                                        -2>> =suggSing(@)           # Accord de nombre erroné : « \1 » est au singulier.
    <<- morphex(\2, ":[NAQ].*:m:[si]", ":(?:V0e|[NAQ].*:[fe]:[si])")    -1>> quel                   # Accord de genre erroné : « \2 » est masculin.
    <<- __also__ and hasFemForm(\2)                                     -2>> =suggFemSing(@, True)  # Accord de genre erroné : « \1 » est féminin.
__[i]/gn(gn_quelles_accord)__
    (quelles) +({w_2})  @@0,$
    <<- morphex(\2, ":[NAQ].*:m:s", ":(?:V0e|[NAQ].*:[fe]:[pi])")       -1>> quel                   # Accord de genre et de nombre erroné. « \2 » est masculin et au singulier.
    <<- __also__ and hasFemForm(\2)                                     -2>> =suggFemPlur(@, True)  # Accord de genre et de nombre erroné : « \1 » est féminin et au pluriel.
    <<- morphex(\2, ":[NAQ].*:f:s", ":(?:V0e|[NAQ].*:[fe]:[pi])")       -1>> quelle                 # Accord de nombre erroné : « \2 » est au singulier.
    <<- __also__                                                        -2>> =suggPlur(@)           # Accord de nombre erroné : « \1 » est au pluriel.
    <<- morphex(\2, ":[NAQ].*:m:[pi]", ":(?:V0e|[NAQ].*:[fe]:[pi])")    -1>> quels                  # Accord de genre erroné : « \2 » est masculin.
    <<- __also__ and hasFemForm(\2)                                     -2>> =suggFemPlur(@, True)  # Accord de genre erroné : « \1 » est féminin.

TEST: {{Quelle}} homme.                                       ->> Quel
TEST: {{Quel}} femme.                                         ->> Quelle
@@@@
@@@@END_GRAPH                                                                                      _
TEST: {{Quels}} chanson.                                      ->> Quelle
TEST: {{Quelles}} {{tarés}}.
TEST: Quelle sale journée…
TEST: Quelles drôles de prunes
@@@@


__[i]/gn(gn_quel_quel_accord_être)__
    (quel(?:le|)) (sont|étaient|ser(?:o|aie)nt|fu(?:r|ss)ent)  @@0,$
    <<- not before(r"\btel(?:le|)s? +$")
    -1>> \1s                                                                                        # Accord de nombre erroné avec “\2”.

15300
15301
15302
15303
15304
15305
15306
15307


15308
15309
15310
15311
15312
15313
15314
15315
15316
15317

15318
15319
15320
15321
15322
15323
15324
15325
15326
15327
15328
15329

15330
15331
15332
15333
15334
15335
15336
15290
15291
15292
15293
15294
15295
15296

15297
15298
15299
15300
15301
15302
15303
15304
15305
15306
15307
15308
15309
15310
15311
15312
15313
15314
15315
15316
15317
15318
15319
15320

15321
15322
15323
15324
15325
15326
15327
15328







-
+
+










+











-
+







#TEST: dès que je le {{verrais}}
TEST: dès qu’il le {{voie}}
TEST: donnant à entendre qu’il avait l’intention de violer Laura dès qu’il en aurait l’occasion


# verbe que + subjonctif
__vmode_qqch_que_subjonctif1__
    [afin|avant|pour|quoi|>permettre|>falloir|>vouloir|>ordonner|>exiger|>désirer|>préférer|>suffire]  [que|qu’|qu]  @:(?:Os|M)  @:I¬:[GYS]
    [>permettre|>falloir|>vouloir|>ordonner|>exiger|>désirer|>préférer|>suffire]  [que|qu’|qu]  @:(?:Os|M)  @:I¬:[GYS]
    [afin|avant|pour|quoi|sans]  [que|qu’|qu]  @:(?:Os|M)  @:I¬:[GYS]
        <<- /vmode/ -4>> =suggVerbMode(\4, ":S", \3)                                                # Après « \1 que », ce verbe devrait être au subjonctif.

    >douter  [que|qu’|qu]  @:(?:Os|M)  @:I¬:(?:[GYSK]|If)
        <<- /vmode/ morph(\1, ":V", ":N") -4>> =suggVerbMode(\4, ":S", \3)                          # 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: Sans qu’elle {{prend}} le temps d’analyser le problème.
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


__vmode_qqch_que_subjonctif2__
    à       condition   [que|qu’|qu]    @:(?:Os|M)      @:I¬:[GYS]
    pour    peu         [que|qu’|qu]    @:(?:Os|M)      @:I¬:[GYS]
    il      peut        [que|qu’|qu]    @:(?:Os|M)      @:I¬:[GYS]
        <<- /vmode/ -5>> =suggVerbMode(\5, ":S", \4)                                                    # Ce verbe devrait être au subjonctif.
        <<- /vmode/ -5>> =suggVerbMode(\5, ":S", \4)                                                # Ce verbe devrait être au subjonctif.

TEST: à condition qu’il {{finit}} son boulot.
TEST: pour peu qu’il {{prend}} son devoir sérieux…
TEST: il se peut que nous {{avons}} tort.


# Bien que + subjonctif