Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -2871,11 +2871,11 @@ Saône et Loire <<- /tu/ ->> Saône-et-Loire # Il manque un trait d’union. [St|Ste] ~^[A-ZÉÈÎ] <<- /tu/ ->> \1-\2 - # Il manque un trait d’union s’il s’agit d’une église, d’une cité, d’une communauté… S’il s’agit d’une personne, écrivez « saint(e) » sans majuscule, sans trait d’union. + # Il manque un trait d’union s’il s’agit d’une église, d’une cité, d’une communauté… S’il s’agit d’une personne, écrivez “saint” ou “sainte” sans majuscule, sans trait d’union. TEST: Émigrer au {{Royaume Uni}} TEST: Étudier en {{Grande Bretagne}} TEST: Vivre aux {{Pays Bas}} TEST: Il passe par {{Aix en Provence}} @@ -4817,11 +4817,11 @@ c’ est @:N.*:p¬:(?:G|W|M|A.*:[si]) <<- /conf/ -1:2>> ces|ses # Confusion. Exemples : c’est facile ; ces chats (désignation) ; ses chats (possession)… TEST: {{ses}} au-dessus de ses forces. TEST: {{ces}} comme la peste -TEST: car {{ses}} d’avance perdu +TEST: car {{ses}} d’autre part TEST: {{ces}} qu’il y a tant de pertes TEST: {{ces}} jamais une bonne idée. TEST: {{c’est}} {{délires}} nous ennuient TEST: En 2015, c’est Paris et son agglomération qui… TEST: Ses pas de danse. @@ -5709,11 +5709,11 @@ # statue / statut / statu __conf_statu_statue_statut__ [statut|statue|status] quo <<- /conf/ ->> statu quo # Confusion. Écrivez “statu quo”.|https://fr.wiktionary.org/wiki/statu_quo - statu ~¬[qQ][uU][oO] + statu ~¬^[qQ][uU][oO]$ <<- /conf/ -1>> statut|statue # Confusion : “statu” ne s’emploie que dans l’expression “statu quo”. TEST: Ça n’en finit pas, c’est le {{statut quo}}. TEST: Quelle splendide {{statu}}. @@ -8575,11 +8575,11 @@ <<- ~1:2>> * chaque [an|jour|mois] @¬:(?:A.*:[me]:[si]|Oo|[123][sp]) <<- ~1:2>> * - d’ évidence @¬:A.*:[fe]:[si] + d’ [avance|évidence] @¬:A.*:[fe]:[si] <<- ~1:2>> * dans l’ ensemble @¬:A.*:[me]:[si] <<- ~1:3>> * @@ -8862,22 +8862,44 @@ !! !!!! Groupe nominal (1) !! !! !! -#### 1 mot +## l’ -## Singulier masculin - -__gn_l_accord__ +__gn_l_1m__ l’ @:[NAQ].*:p¬:[123][sp]|:[si] - <<- /gn/ -2>> =suggSing(\2) # Accord de nombre erroné : « \1 » devrait être au singulier. + <<- /gn/ -2>> =suggSing(\2) # Accord de nombre erroné : “\2” devrait être au singulier. TEST: toute l’importance de l’{{accords}} musical. -__gn_le_accord__ +__gn_l_2m__ + l’ @:[NA]¬* @:[NA]¬* + <<- /gn/ not value(<1, "|et|ou|de|") and not value(\2, "|air|") and not morph(\3, ">seule/") >>> + <<- /gn/ ( (morph(\2, ":m", "*") and morph(\3, ":f", "*")) or (morph(\2, ":f", "*") and morph(\3, ":m", "*")) ) and not apposition(\2, \3) + -3>> =switchGender(\3, False) # Accord de genre erroné entre “\2” et “\3”. + <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2) # Accord de genre erroné avec “\3”. + <<- /gn/ morph(\2, ":[si]", "*") and morph(\3, ":p", "*") and not apposition(\2, \3) + -3>> =suggSing(\3) # Accord de nombre erroné avec “\2” : “\3” devrait être au singulier. + + [et|ou|de] l’ @:[NA]¬* @:[NA]¬* + <<- /gn/ not value(\3, "|air|") and not morph(\4, ">seule/") >>> + <<- /gn/ ( (morph(\3, ":m", "*") and morph(\4, ":f", "*")) or (morph(\3, ":f", "*") and morph(\4, ":m", "*")) ) and not apposition(\3, \4) and not morph(<1, ":[NA]") + -4>> =switchGender(\4, False) # Accord de genre erroné entre “\3” et “\4”. + <<- /gn/ __also__ and hasFemForm(\3) -3>> =switchGender(\3) # Accord de genre erroné avec “\4”. + <<- /gn/ morph(\3, ":[si]", "*") and morph(\4, ":p", "*") and not apposition(\3, \4) and not morph(<1, ":[NA]") + -4>> =suggSing(\4) # Accord de nombre erroné avec “\3” : “\4” devrait être au singulier. + +TEST: L’{{amande}} {{amer}} +TEST: l’{{amicale}} {{animal}} +TEST: l’amour {{immortels}} +TEST: du chien et de l’{{excellente}} {{collier}} qu’il avait autour du cou. +TEST: du chien et de l’{{étonnante}} {{collier}} qu’il avait autour du cou. + + +__gn_le_1m__ , le *WORD <<- /gn/ morph(\3, "@:[NAQ].*:f", ":(?:e|m|P|G|W|[123][sp]|Y)") -2>> =suggLesLa(\2) # Accord de genre erroné : « \3 » est féminin. <<- /gn/ __also__ and hasMasForm(\3) -3>> =suggMasSing(\3, True) # Accord de genre erroné : « \2 » est un déterminant masculin. <<- /gn/ __else__ and morph(\3, ":[NAQ].*:p") -3>> =suggMasSing(\3) # Accord de nombre erroné : « \3 » devrait être au singulier. <<- /gn/ __also__ -2>> les # Accord de nombre erroné : « \3 » est au pluriel. @@ -8905,55 +8927,55 @@ TEST: avec {{le}} {{pile}} TEST: {{le}} {{publique}} TEST: {{Le}} {{pendue}} -__gn_ledit_accord__ +__gn_ledit_1m__ ledit *WORD <<- /gn/ morph(\2, ":[NAQ].*:f", ":[GWme]") -1>> ladite # Accord de genre erroné : « \2 » est féminin. <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True) # Accord de genre erroné : « \1 » est un déterminant masculin. <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(\2) # Accord de nombre erroné : « \2 » devrait être au singulier. -__gn_un_accord__ +__gn_un_1m__ un *WORD <<- /gn/ morph(\2, ":[NAQ].*:f", ":(?:e|m|G|W|V0|3s|Y)") -1>> une # Accord de genre erroné : « \2 » est féminin. <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True) # Accord de genre erroné : « \1 » est un déterminant masculin. <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(\2) # Accord de nombre erroné : « \2 » devrait être au singulier. -__gn_un_des_accord__ +__gn_un_des_1m__ un des *WORD <<- /gn/ morph(\3, ":[NAQ].*:f", ":(?:e|m|G|W|V0|3s)") -1>> une # Accord de genre erroné : « \2 » est féminin. <<- /gn/ __also__ and hasMasForm(\3) -3>> =suggMasPlur(\3, True) # Accord de genre erroné : « \1 » est un déterminant masculin. -__gn_du_accord__ +__gn_du_1m__ du *WORD <<- /gn/ morph(\2, ":[NAQ].*:f", ":[GWme]") -1>> de la # Accord de genre erroné : « \2 » est féminin. <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True) # Accord de genre erroné : « \1 » est un déterminant masculin. <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(\2) # Accord de nombre erroné : « \2 » devrait être au singulier. -__gn_cet_accord__ +__gn_cet_1m__ cet *WORD <<- /gn/ morph(\2, ":[NAQ].*:f", ":[GWme]") -1>> cette # Accord de genre erroné : « \2 » est féminin. <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True) # Accord de genre erroné : « \1 » est un déterminant masculin. <<- /gn/ morph(\2, ">[bcçdfgjklmnpqrstvwxz].+:[NAQ].*:m", ":[efGW]") -1>> ce # Accord de genre correct, mais euphonie non respectée.|http://fr.wikipedia.org/wiki/Euphonie <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(\2) # Accord de nombre erroné : « \2 » devrait être au singulier. -__gn_ce_accord__ +__gn_ce_1m__ ce *WORD <<- /gn/ morph(\2, ":[NAQ].*:f", ":(?:3s|[GWme])") -1>> cette # Accord de genre erroné : « \2 » est féminin. <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True) # Accord de genre erroné : « \1 » est un déterminant masculin. <<- /gn/ morph(\2, ":[NAQ].*:f", ":[GWme]") and morph(\2, ":3s") -1>> cette|se # Accord de genre erroné : « \2 » est féminin. Ou bien vous confondez le déterminant “ce” avec le pronom “se”. <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(\2) # Accord de nombre erroné : « \2 » devrait être au singulier. -__gn_mon_ton_son_accord__ +__gn_mon_ton_son_1m__ [mon|ton|son] *WORD <<- /gn/ morph(\1, ":D") >>> <<- /gn/ morph(\2, ">[bcdfgjklmnpqrstvwxz].*:[NAQ].*:f", ":[GWme]") -1>> =\1.replace("on", "a") # Accord de genre erroné : « \2 » est féminin. <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True) # Accord de genre erroné : « \1 » est un déterminant masculin. <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(\2) # Accord de nombre erroné : « \2 » devrait être au singulier. -__gn_au_accord__ +__gn_au_1m__ au *WORD <<- /gn/ morph(\2, ":[NAQ].*:f:s", ":[GWme]") -1>> à la # Accord de genre erroné : « \2 » est féminin. <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasSing(\2, True) # Accord de genre erroné : « \1 » est un déterminant masculin. <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggMasSing(\2) # Accord de nombre erroné : « \2 » devrait être au singulier. <<- /gn/ __also__ -1>> aux # Accord de nombre erroné : « \2 » est au pluriel. @@ -8975,11 +8997,11 @@ TEST: Trente et un hommes sur le pont. ## Singulier féminin -__gn_la_accord__ +__gn_la_1m__ , la *WORD <<- /gn/ morph(\3, ":[NAQ].*:m", ":(?:e|f|P|G|W|[1-3][sp]|Y)") -2>> le # Accord de genre erroné : « \3 » est masculin. <<- /gn/ __also__ and hasFemForm(\3) -3>> =suggFemSing(\3, True) # Accord de genre erroné : « \2 » est un déterminant féminin. <<- /gn/ __else__ and morph(\3, ":[NAQ].*:p") -3>> =suggFemSing(\3) # Accord de nombre erroné : « \3 » devrait être au singulier. @@ -9007,27 +9029,27 @@ TEST: {{la}} {{véhicule}} TEST: {{La}} {{pris}} TEST: la force de la {{formes}} parfaite -__gn_ladite_accord__ +__gn_ladite_1m__ ladite *WORD <<- /gn/ morph(\2, ":[NAQ].*:m", ":[efGW]") -1>> ledit # Accord de genre erroné : « \2 » est masculin. <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggFemSing(\2, True) # Accord de genre erroné : « \1 » est un déterminant féminin. <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggFemSing(\2) # Accord de nombre erroné : « \2 » devrait être au singulier. TEST: ladite {{passions}} l’avait conduit à sa perte. -__gn_une_accord__ +__gn_une_1m__ une *WORD <<- /gn/ morph(\2, ":[NAQ].*:m", ":(?:e|f|G|W|V0|3s|P)") and not ( \2 == "demi" and morph(>1, ":N.*:f", "*") ) -1>> un # Accord de genre erroné : « \2 » est masculin. <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggFemSing(\2, True) # Accord de genre erroné : « \1 » est un déterminant féminin. <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggFemSing(\2) # Accord de nombre erroné : « \2 » devrait être au singulier. -__gn_une_des_accord__ +__gn_une_des_1m__ une des *WORD <<- /gn/ morph(\3, ":[NAQ].*:m", ":(?:e|f|G|W|V0|3s)") -1>> un # Accord de genre erroné : « \3 » est masculin. <<- /gn/ __also__ and hasFemForm(\3) -3>> =suggFemPlur(\3, True) # Accord de genre erroné : « \1 » est un déterminant féminin. TEST: un {{slashs}} ->> slash @@ -9036,17 +9058,17 @@ TEST: Une {{cinglées}} ->> cinglée TEST: {{une}} des {{joueurs}} TEST: mille et une merveilles -__gn_cette_accord__ +__gn_cette_1m__ cette *WORD <<- /gn/ morph(\2, ":[NAQ].*:m", ":[efGW]") -1>> =suggCeOrCet(\2) # Accord de genre erroné : « \2 » est masculin. <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggFemSing(\2, True) # Accord de genre erroné : « \1 » est un déterminant féminin. <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggFemSing(\2) # Accord de nombre erroné : « \2 » devrait être au singulier. -__gn_ma_ta_sa_accord__ +__gn_ma_ta_sa_1m__ [ma|ta|sa] *WORD <<- /gn/ morph(\2, ":[NAQ].*:m", ":[efGW]") -1>> =\1[:-1]+"on" # Accord de genre erroné : « \2 » est masculin. <<- /gn/ __also__ and not re.search("(?i)^[aâeéèêiîoôuûyœæ]", \2) and hasFemForm(\2) -2>> =suggFemSing(\2, True) # Accord de genre erroné : « \1 » est un déterminant féminin. <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggFemSing(\2) # Accord de nombre erroné : « \2 » devrait être au singulier. @@ -9058,11 +9080,11 @@ TEST: {{Cette}} {{animal}} mort. ## Singuliers épicènes -__gn_leur_accord__ +__gn_leur_1m__ , leur *WORD <<- /gn/ morph(\3, ":[NAQ].*:p", "*") -2>> leurs # Accord de nombre erroné avec « \3 ». <<- /gn/ __also__ -3>> =suggSing(\3) # Accord de nombre erroné : « \3 » devrait être au singulier. *WORD leur *WORD @@ -9079,28 +9101,28 @@ TEST: J’en ai assez de {{leur}} {{délires}} TEST: {{Leur}} {{perceptions}} des choses m’exaspère. TEST: dans {{leur}} {{usines}} -__gn_notre_votre_chaque_accord__ +__gn_notre_votre_chaque_1m__ [notre|votre|chaque] *WORD <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siGW]") -2>> =suggSing(\2) # Accord de nombre erroné : « \2 » devrait être au singulier. TEST: Chaque {{chiens}}. ->> chien -__gn_quelque_accord__ +__gn_quelque_1m__ quelque *WORD <<- /gn/ morph(\2, ":[NAQ].*:p", ":[siG]") and not value(>1, "|que|qu’|qu|") -1>> quelques # Il manque un “s” à « quelque » ou « \2 » doit être au singulier. TEST: {{Quelque}} amis ## Pluriels épicènes -__gn_les_accord__ +__gn_les_1m__ , les *WORD <<- /gn/ ( morph(\3, ":[NAQ].*:s", "*") and not (value(>1, "|et|ou|") and morph(>2, ":[NAQ]")) ) or \3 in aREGULARPLURAL -3>> =suggPlur(\3) # Accord de nombre erroné : « \3 » devrait être au pluriel. @@ -9121,11 +9143,11 @@ TEST: les {{véhicule}} ->> véhicules TEST: Les {{démoralisation}}. ->> démoralisations TEST: dans les {{usine}} ->> usines -__gn_leurs_accord__ +__gn_leurs_1m__ leurs *WORD <<- /gn/ (morph(\2, ":[NAQ].*:s", ":(?:[ipGW]|[123][sp])") and not (value(>1, "|et|ou|") and morph(>2, ":[NAQ]"))) or \2 in aREGULARPLURAL -2>> =suggPlur(\2) # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel. <<- /gn/ __also__ -1>> leur # Accord de nombre erroné avec « \2 ». @@ -9132,11 +9154,11 @@ TEST: {{leurs}} {{action}} TEST: {{leur}} {{données}} -__gn_det_pluriel_accord__ +__gn_det_pluriel_1m__ [des|mes|tes|ses|nos|vos|quelques|lesdits|moult] *WORD <<- (morph(\2, ":[NAQ].*:s", ":[ipGW]") and not (value(>1, "|et|ou|") and morph(>2, ":[NAQ]"))) or \2 in aREGULARPLURAL -2>> =suggPlur(\2) # Accord de nombre erroné : « \2 » devrait être au pluriel. @@ -9144,11 +9166,11 @@ TEST: Quelques {{homme}}. ->> hommes TEST: plusieurs {{femme}} sont venues. TEST: une personne ou plusieurs ayant décidé de façon déterminée et coordonnée de faire cuire la grenouille -__gn_ces_aux_pluriel_accord__ +__gn_ces_aux_pluriel_1m__ [ces|aux] *WORD <<- (morph(\2, ":[NAQ].*:s", ":[ipGW]") and not (value(>1, "|et|ou|") and morph(>2, ":[NAQ]"))) or \2 in aREGULARPLURAL -2>> =suggPlur(\2) # Accord de nombre erroné : « \2 » devrait être au pluriel. <<- __also__ and morph(\2, ">[bcdfglklmnpqrstvwxz].*:m", ":f") >>> @@ -9159,11 +9181,11 @@ TEST: ces {{étudiant}} sont légion. TEST: je vais {{aux}} {{cinéma}} TEST: il l’a donné aux {{étudiant}} -__gn_plusieurs_accord__ +__gn_plusieurs_1m__ plusieurs *WORD <<- (morph(\2, ":[NAQ].*:s", ":[ipGWP]") and not (value(>1, "|et|ou|") and morph(>2, ":[NAQ]"))) or \2 in aREGULARPLURAL -2>> =suggPlur(\2) # Accord de nombre erroné : « \2 » devrait être au pluriel. @@ -9171,32 +9193,32 @@ ## Autres pluriels ## certains / certaines -__gn_certains_accord__ +__gn_certains_1m__ certains *WORD <<- /gn/ morph(\2, ":[NAQ].*:f", ":[emGWP]") -1>> certaines # Accord de genre erroné : « \2 » est féminin. <<- /gn/ __also__ and hasMasForm(\2) -2>> =suggMasPlur(\2, True) # Accord de genre erroné : « \1 » est un déterminant masculin. <<- /gn/ ( morph(\2, ":[NAQ].*:s", ":(?:[ipGWP]|V0)") and not (value(>1, "|et|ou|") and morph(>2, ":[NAQ]")) ) or \1 in aREGULARPLURAL -2>> =suggPlur(\2) # Accord de nombre erroné : « \2 » devrait être au pluriel. -__gn_certains_des_accord__ +__gn_certains_des_1m__ certains des *WORD <<- /gn/ morph(\3, ":[NAQ].*:f", ":[emGW]") -1>> certaines # Accord de genre erroné : « \3 » est féminin. <<- /gn/ __also__ and hasMasForm(\3) -3>> =suggMasPlur(\3, True) # Accord de genre erroné : « \1 » est un déterminant masculin. -__gn_certaines_accord__ +__gn_certaines_1m__ certaines *WORD <<- /gn/ morph(\2, ":[NAQ].*:m", ":[efGWP]") -1>> certains # Accord de genre erroné : « \2 » est masculin. <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggFemPlur(\2, True) # Accord de genre erroné : « \1 » est un déterminant féminin. <<- /gn/ ( morph(\2, ":[NAQ].*:s", ":[ipGWP]") and not (value(>1, "|et|ou|") and morph(>2, ":[NAQ]")) ) or \2 in aREGULARPLURAL -2>> =suggPlur(\2) # Accord de nombre erroné : « \2 » devrait être au pluriel. -__gn_certaines_des_accord__ +__gn_certaines_des_1m__ certaines des *WORD <<- /gn/ morph(\3, ":[NAQ].*:m", ":[efGW]") -1>> certains # Accord de genre erroné : « \3 » est masculin. <<- /gn/ __also__ and hasFemForm(\3) -3>> =suggFemPlur(\3, True) # Accord de genre erroné : « \1 » est un déterminant féminin. TEST: Certaines {{danse}} @@ -9205,38 +9227,38 @@ TEST: {{certaines}} des hommes TEST: Un problème rapporté par certains est l’incapacité à trouver un partenaire ## quel / quels / quelle / quelles -__gn_quel_accord__ +__gn_quel_1m__ quel *WORD <<- /gn/ morph(\2, ":[NAQ].*:f:p", ":(?:V0|Oo|[NAQ].*:[me]:[si])") -1>> quelles # Accord de genre et de nombre erroné : « \2 » est féminin et au pluriel. <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggMasSing(\2, True) # Accord de genre et de nombre erroné : « \1 » est masculin et au singulier. <<- /gn/ morph(\2, ":[NAQ].*:m:p", ":(?:V0|Oo|[NAQ].*:[me]:[si])") -1>> quels # Accord de nombre erroné : « \2 » est au pluriel. <<- /gn/ __also__ -2>> =suggSing(\2) # Accord de nombre erroné : « \1 » est au singulier. <<- /gn/ morph(\2, ":[NAQ].*:f:[si]", ":(?:V0|Oo|[NAQ].*:[me]:[si])") -1>> quelle # Accord de genre erroné : « \2 » est féminin. <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggMasSing(\2, True) # Accord de genre erroné : « \1 » est masculin. -__gn_quels_accord__ +__gn_quels_1m__ quels *WORD <<- /gn/ morph(\2, ":[NAQ].*:f:s", ":(?:V0|Oo|[NAQ].*:[me]:[pi])") -1>> quelle # Accord de genre et de nombre erroné : « \2 » est féminin et au singulier. <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggMasPlur(\2, True) # Accord de genre et de nombre erroné : « \1 » est masculin et au pluriel. <<- /gn/ morph(\2, ":[NAQ].*:m:s", ":(?:V0|Oo|[NAQ].*:[me]:[pi])") -1>> quel # Accord de nombre erroné : « \2 » est au singulier. <<- /gn/ __also__ -2>> =suggPlur(\2) # Accord de nombre erroné : « \1 » est au pluriel. <<- /gn/ morph(\2, ":[NAQ].*:f:[pi]", ":(?:V0|Oo|[NAQ].*:[me]:[pi])") -1>> quelles # Accord de genre erroné : « \2 » est féminin. <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggMasPlur(\2, True) # Accord de genre erroné : « \1 » est masculin. -__gn_quelle_accord__ +__gn_quelle_1m__ quelle *WORD <<- /gn/ morph(\2, ":[NAQ].*:m:p", ":(?:V0|Oo|[NAQ].*:[fe]:[si])") -1>> quels # Accord de genre et de nombre erroné : « \2 » est masculin et au pluriel. <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggFemSing(\2, True) # Accord de genre et de nombre erroné : « \1 » est féminin et au singulier. <<- /gn/ morph(\2, ":[NAQ].*:f:p", ":(?:V0|Oo|[NAQ].*:[fe]:[si])") -1>> quelles # Accord de nombre erroné : « \2 » est au pluriel. <<- /gn/ __also__ -2>> =suggSing(\2) # Accord de nombre erroné : « \1 » est au singulier. <<- /gn/ morph(\2, ":[NAQ].*:m:[si]", ":(?:V0|Oo|[NAQ].*:[fe]:[si])") -1>> quel # Accord de genre erroné : « \2 » est masculin. <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggFemSing(\2, True) # Accord de genre erroné : « \1 » est féminin. -__gn_quelles_accord__ +__gn_quelles_1m__ quelles *WORD <<- /gn/ morph(\2, ":[NAQ].*:m:s", ":(?:V0|Oo|[NAQ].*:[fe]:[pi])") -1>> quel # Accord de genre et de nombre erroné. « \2 » est masculin et au singulier. <<- /gn/ __also__ and hasFemForm(\2) -2>> =suggFemPlur(\2, True) # Accord de genre et de nombre erroné : « \1 » est féminin et au pluriel. <<- /gn/ morph(\2, ":[NAQ].*:f:s", ":(?:V0|Oo|[NAQ].*:[fe]:[pi])") -1>> quelle # Accord de nombre erroné : « \2 » est au singulier. <<- /gn/ __also__ -2>> =suggPlur(\2) # Accord de nombre erroné : « \1 » est au pluriel. @@ -9342,20 +9364,20 @@ TEST: des {{son}} que nous entendons jour et nuit. TEST: j’entends ces {{même}} âneries tous les jours ## Pluriel des groupes -__gn_nombre_de_accord__ +__gn_nombre_de_1m__ nombre [de|d’] *WORD <<- /gn/ (morph(\3, ":[NAQ].*:s", ":[ip]|>o(?:nde|xydation|r)/") and morph(<1, ":(?:G|[123][sp])|", ":[AD]")) or \3 in aREGULARPLURAL -3>> =suggPlur(\3) # Ici, « nombre de » devrait probablement être suivi d’un pluriel. TEST: Je connais nombre d’{{emmerdeur}} et aucun n’est pire que lui. -__gn_det_groupe_de_accord__ +__gn_det_groupe_de_1m__ [un|une|le|la|ce|cette|mon|ton|son|ma|ta|sa|les|ces|des|mes|tes|ses|nos|vos|leurs|quelques] [>centaine|>millier|>million|>milliard|>dixaine|>douzaine|>multitude|>horde] [de|d’] *WORD <<- /gn/ morph(\4, ":[NAQ].*:s", ":[ip]") or \4 in aREGULARPLURAL -4>> =suggPlur(\4) # Avec des « \2 \3 \4 », mettre au pluriel. TEST: des centaines de {{bête}} à cornes passèrent devant nous. ->> bêtes @@ -9377,11 +9399,11 @@ TEST: les quelque 2,5 millions d’habitants TEST: les quelque 12 000 stations-service ## Nombres -__gn_nombre_lettres_accord__ +__gn_nombre_lettres_1m__ @:B:e:p *WORD <<- /gn/ not value(\1, "|neuf|mille|") and ( (morph(\2, ":[NAQ].*:s", "*") and not value(\2, "|janvier|février|mars|avril|mai|juin|juillet|août|aout|septembre|octobre|novembre|décembre|rue|route|ruelle|place|boulevard|avenue|allée|chemin|sentier|square|impasse|cour|quai|chaussée|côte|vendémiaire|brumaire|frimaire|nivôse|pluviôse|ventôse|germinal|floréal|prairial|messidor|thermidor|fructidor|") ) or \2 in aREGULARPLURAL) -2>> =suggPlur(\2) # Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel. @@ -9399,11 +9421,11 @@ TEST: On peut trouver mille {{travailleur}} d’un claquement de doigts. TEST: un logement neuf bâti par des professionnels. TEST: un mille marin. -__gn_nombre_chiffres_accord__ +__gn_nombre_chiffres_1m__ [0|1|01] @:[NAQ].*:p¬* <<- /gn/ not value(\2, "|Rois|Corinthiens|Thessaloniciens|") -2>> =suggSing(\2) # Accord de nombre erroné : « \1 » devrait être au singulier. ~^\d+$ *WORD <<- not value(<1, "|/|") and not re.search("^0*[01]$", \1) @@ -9430,11 +9452,11 @@ !!!! Groupe nominal (2) !! !! !! ## Sans article -__gn_2m_accord__ +__gn_start_2m__ @:[NA]¬* @:[NA]¬* <<- /gn/ ((morph(\2, ":m", "*") and morph(\3, ":f", "*")) or (morph(\2, ":f", "*") and morph(\3, ":m", "*"))) and not apposition(\2, \3) -3>> =switchGender(\3) # Accord de genre erroné avec « \2 ». <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2) # Accord de genre erroné avec « \3 ». <<- /gn/ ((morph(\2, ":s", "*") and morph(\3, ":p", "*")) or (morph(\2, ":p", "*") and morph(\3, ":s", "*"))) and not apposition(\2, \3) @@ -9444,11 +9466,11 @@ TEST: {{Femmes}} {{intelligente}}. TEST: {{Homme}} {{impatients}}. ## Prépositions -__gn_2m_pfx_en__ +__gn_pfx_en_2m__ en @:[NA]¬* @:[NA]¬* <<- /gn/ ( (morph(\2, ":m", "*") and morph(\3, ":f", "*")) or (morph(\2, ":f", "*") and morph(\3, ":m", "*")) ) and not apposition(\2, \3) -3>> =switchGender(\3) # Accord de genre erroné avec « \2 ». <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2) # Accord de genre erroné avec « \3 ». <<- /gn/ ( (morph(\2, ":p", "*") and morph(\3, ":s", "*")) or (morph(\2, ":s", "*") and morph(\3, ":p", "*")) ) and not apposition(\2, \3) @@ -9456,12 +9478,13 @@ <<- /gn/ __also__ -2>> =switchPlural(\2) # Accord de nombre erroné avec « \3 ». TEST: en homme {{courtoise}} TEST: en {{femme}} {{cultivées}} -__gn_2m_pfx_à_par_pour_sans__ - [à|par|pour|sans] @:[NA]¬:Y @:[NA] + +__gn_pfx_à_par_pour_sans_2m__ + [à|par|pour|sans] @:[NA]¬:Y @:[NA]¬:G <<- /gn/ ( (morph(\2, ":m", ":[fe]") and morph(\3, ":f", "*")) or (morph(\2, ":f", ":[me]") and morph(\3, ":m", "*")) ) and not apposition(\2, \3) -3>> =switchGender(\3) # Accord de genre erroné avec « \2 ». <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2) # Accord de genre erroné avec « \3 ». <<- /gn/ ( (morph(\2, ":p", ":[si]") and morph(\3, ":s", "*")) or (morph(\2, ":s", ":[pi]") and morph(\3, ":p", "*")) ) and not apposition(\2, \3) -3>> =switchPlural(\3) # Accord de nombre erroné avec « \2 ». @@ -9470,75 +9493,59 @@ TEST: à {{grande}} {{enjambées}} TEST: pour {{belle}} {{appartement}} TEST: une femme sans a priori -@@@@ -@@@@END_GRAPH _ -@@@@ - - - -__[i]/gn(gn_2m_pfx_de_sur_avec_après)__ - (?:de|sur|avec|après) +({w_2}) +({w_2}) @@w,$ - <<- ( (morphex(\1, ":[NAQ].*:m", ":(?:[Gfe]|V0e|Y)") and morph(\2, ":[NAQ].*:f")) or (morphex(\1, ":[NAQ].*:f", ":(?:[Gme]|V0e|Y)") and morph(\2, ":[NAQ].*:m")) ) - and not apposition(\1, \2) and morph(word(-1), ":[VRX]", True, True) - -2>> =switchGender(@) # Accord de genre erroné avec « \1 ». - <<- __also__ and hasFemForm(\1) -1>> =switchGender(@) # Accord de genre erroné avec « \2 ». - <<- ( (morphex(\1, ":[NAQ].*:p", ":(?:[Gsi]|V0e|Y)") and morph(\2, ":[NAQ].*:s")) or (morphex(\1, ":[NAQ].*:s", ":(?:[Gpi]|V0e|Y)") and morph(\2, ":[NAQ].*:p")) ) - and not apposition(\1, \2) and morph(word(-1), ":[VRX]", True, True) - -2>> =switchPlural(@) # Accord de nombre erroné avec « \1 ». - <<- __also__ -1>> =switchPlural(@) # Accord de nombre erroné avec « \2 ». +__gn_pfx_de_2m__ + [de|d’] @:[NA]¬Y @:[NA]¬* + <<- /gn/ ( (morph(\2, ":m", ":[fe]") and morph(\3, ":f", "*")) or (morph(\2, ":f", ":[me]") and morph(\3, ":m", "*")) ) + and not apposition(\2, \3) and not morph(<1, ":[NA]|>(?:et|ou)/") + -3>> =switchGender(\3) # Accord de genre erroné avec « \2 ». + <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2) # Accord de genre erroné avec « \3 ». + <<- /gn/ ( (morph(\2, ":p", ":[si]") and morph(\3, ":s", "*")) or (morph(\2, ":s", ":[pi]") and morph(\3, ":p", "*")) ) + and not apposition(\2, \3) and not morph(<1, ":[NA]|>(?:et|ou)/") + -3>> =switchPlural(\3) # Accord de nombre erroné avec « \2 ». + <<- /gn/ __also__ -2>> =switchPlural(\2) # Accord de nombre erroné avec « \3 ». TEST: Ils ont de {{grandes}} {{oreille}} TEST: de {{grands}} {{homme}} TEST: de {{manière}} {{légal}} TEST: de {{petite}} {{homme}} TEST: de {{pousse}} {{actif}} TEST: De {{bon}} {{conseils}} TEST: De {{mauvaises}} {{hommes}} TEST: Ces produits sont de {{belle}} {{qualités}}. + + +__gn_pfx_de_sur_avec_après_2m__ + [sur|avec|après] @:[NA]¬V0 @:[NA]¬* + <<- /gn/ ( (morph(\2, ":m", ":[fe]") and morph(\3, ":f", "*")) or (morph(\2, ":f", ":[me]") and morph(\3, ":m", "*")) ) + and not apposition(\2, \3) and morph(<1, ":[VRX]|") + -3>> =switchGender(\3) # Accord de genre erroné avec « \2 ». + <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2) # Accord de genre erroné avec « \3 ». + <<- /gn/ ( (morph(\2, ":p", ":[si]") and morph(\3, ":s", "*")) or (morph(\2, ":s", ":[pi]") and morph(\3, ":p", "*")) ) + and not apposition(\2, \3) and morph(<1, ":[VRX]|") + -3>> =switchPlural(\3) # Accord de nombre erroné avec « \2 ». + <<- /gn/ __also__ -2>> =switchPlural(\2) # Accord de nombre erroné avec « \3 ». + +TEST: avec {{grand}} {{industrie}} +TEST: sur {{petite}} {{pied}} TEST: Après être demeurée assise pendant quelque temps, elle se leva TEST: ils choisissent de devenir indépendants -__[i]/gn(gn_de_manière_façon)__ - de +(manière|façon) +({w_3}) @@w,$ - <<- morphex(\2, ":A.*:(m|f:p)", ":[GM]") -2>> =suggFemSing(@) # Accord erroné avec “\1” : l’adjectif devrait être au féminin singulier. + +__gn_de_manière_façon_1m__ + de [manière|façon] @:A.*:(m|f:p)¬:[GM] + <<- /gn/ -3>> =suggFemSing(\3) # Accord erroné avec “\2” : l’adjectif devrait être au féminin singulier. TEST: il fit cela tans de fois et avec brio de manière {{élégant}}. TEST: elle s’y prit avec cet individu de façon {{charmant}}. -## l’ - -__[i]/gn(gn_2m_l)__ - (?> =switchGender(@, False) # Accord de genre erroné entre « \1 » et « \2 ». - <<- __also__ and hasFemForm(\1) -1>> =switchGender(@) # Accord de genre erroné avec « \2 ». - <<- not re.search("(?i)^air$", \1) and not \2.startswith("seul") - and morph(\1, ":[si]") and morph(\2, ":[NAQ].*:p") - and not apposition(\1, \2) and not before(r"\b(?:et|ou|de) +$") - -2>> =suggSing(@) # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier. -__[i]/gn(gn_2m_l_après_et_ou_de)__ - (?:et|ou|de) +l’({w_2}) +({w_2}) @@w,$ - <<- not \2.startswith("seul") - and ( (morph(\1, ":m") and morph(\2, ":[NAQ].*:f")) or (morph(\1, ":f") and morph(\2, ":[NAQ].*:m")) ) - and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]", False, False) - -2>> =switchGender(@, False) # Accord de genre erroné entre « \1 » et « \2 ». - <<- __also__ and hasFemForm(\1) -1>> =switchGender(@) # Accord de genre erroné avec « \2 ». - <<- not re.search("(?i)^air$", \1) and not \2.startswith("seul") - and morph(\1, ":[si]") and morph(\2, ":[NAQ].*:p") - and not apposition(\1, \2) and not morph(word(-1), ":[NAQ]", False, False) - -2>> =suggSing(@) # Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier. - -TEST: L’{{amande}} {{amer}} -TEST: l’{{amicale}} {{animal}} -TEST: du chien et de l’{{excellente}} {{collier}} qu’il avait autour du cou. -TEST: du chien et de l’{{étonnante}} {{collier}} qu’il avait autour du cou. +@@@@ +@@@@END_GRAPH _ +@@@@ ## un / une __[i]/gn(gn_2m_un)__