Index: gc_lang/fr/modules-js/gce_analyseur.js ================================================================== --- gc_lang/fr/modules-js/gce_analyseur.js +++ gc_lang/fr/modules-js/gce_analyseur.js @@ -14,40 +14,10 @@ } } return g_morph(oToken, sPattern, sNegPattern, 0, nEnd, false); } -function rewriteSubject (s1, s2) { - // s1 is supposed to be prn/patr/npr (M[12P]) - if (s2 == "lui") { - return "ils"; - } - if (s2 == "moi") { - return "nous"; - } - if (s2 == "toi") { - return "vous"; - } - if (s2 == "nous") { - return "nous"; - } - if (s2 == "vous") { - return "vous"; - } - if (s2 == "eux") { - return "ils"; - } - if (s2 == "elle" || s2 == "elles") { - if (cregex.mbNprMasNotFem(_oSpellChecker.getMorph(s1))) { - return "ils"; - } - // si épicène, indéterminable, mais OSEF, le féminin l’emporte - return "elles"; - } - return s1 + " et " + s2; -} - function apposition (sWord1, sWord2) { // returns true if nom + nom (no agreement required) return sWord2.length < 2 || (cregex.mbNomNotAdj(_oSpellChecker.getMorph(sWord2)) && cregex.mbPpasNomNotAdj(_oSpellChecker.getMorph(sWord1))); } Index: gc_lang/fr/modules/gce_analyseur.py ================================================================== --- gc_lang/fr/modules/gce_analyseur.py +++ gc_lang/fr/modules/gce_analyseur.py @@ -11,32 +11,10 @@ nEnd = nEnd - 2 elif re.search("-l(?:es?|a)-(?:[mt]oi|nous|leur)$|(?:[nv]ous|lui|leur)-en$", dToken["sValue"]): nEnd = dToken["sValue"][0:nEnd].rfind("-") return g_morph(dToken, sPattern, sNegPattern, 0, nEnd, False) - -def rewriteSubject (s1, s2): - "rewrite complex subject: a prn/patr/npr (M[12P]) followed by “et” and " - if s2 == "lui": - return "ils" - if s2 == "moi": - return "nous" - if s2 == "toi": - return "vous" - if s2 == "nous": - return "nous" - if s2 == "vous": - return "vous" - if s2 == "eux": - return "ils" - if s2 in ("elle", "elles"): - if cr.mbNprMasNotFem(_oSpellChecker.getMorph(s1)): - return "ils" - # si épicène, indéterminable, mais OSEF, le féminin l’emporte - return "elles" - return s1 + " et " + s2 - def apposition (sWord1, sWord2): "returns True if nom + nom (no agreement required)" return len(sWord2) < 2 or (cr.mbNomNotAdj(_oSpellChecker.getMorph(sWord2)) and cr.mbPpasNomNotAdj(_oSpellChecker.getMorph(sWord1))) Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -1924,10 +1924,18 @@ __da_été__ >avoir ?@:[WX]¿ été <<- =>> select(\-1, ":Q") + +__da_adverbes__ + environ [$:B|*NUM] + <<- not value(<1, "|l’|un|cet|quel|") =>> exclude(\1, ":N") + + grave + <<- morph(<1, ":D") =>> (\1, ":W") + __da_prépositions__ dans <<- not morph(<1, ":D.*:p|>[a-z]+ième/") =>> select(\1, ":R") @@ -13258,10 +13266,11 @@ à l’ air libre à l’ avenir ?[incertain|prometteur]¿ à l’ échelon [local|cantonal|départemental|régional|national|européen|américain|africaine|asiatique|continental|international|planétaire|galactique|universel] à l’ échelle [locale|cantonale|départementale|régionale|nationale|européenne|américaine|africaine|asiatique|continentale|internationale|planétaire|galactique|universelle] à l’ en croire + à l’ environ à l’ état pur à l’ exclusion de toute autre chose à l’ extrémité [est|ouest|nord|sud] à l’ ordre du jour à l’ un d’ entre [nous|vous|eux|iels] @@ -15389,18 +15398,10 @@ <<- ~3>> * [Mr|Mlle|Mme|Mgr|miss] ~^[A-ZÉÈÊ] <<- ~2>> * - $:Cs ~^[A-ZÉÈÊ] et [moi|toi|lui|elle|nous|vous|eux|elles] - <<- morph(\2, ":M") and not before("\\b(?:plus|moins|aussi) .* que +$") - ~2:4>> =rewriteSubject(\2,\4) + "||" - - ~^[A-ZÉÈÊ] et [moi|toi|lui|elle|nous|vous|eux|elles] - <<- morph(\2, ":M") - ~2:0>> =rewriteSubject(\2,\4) + "||" - __purge_pronom_aussi__ [j’|je] *WORD moi aussi <<- morph(\2, ":1s") ~3:0>> * @@ -16074,10 +16075,27 @@ @@@@GRAPH: purge_passe3|pp3 _ @@@@ @@@@ @@@@ @@@@ + +__fusions_noms_propres_et_pronoms__ + [|,|(|$:Cs] [moi|toi|lui|elle|iel|nous|vous|eux|elles|iels|$:M] et [moi|nous] + [|,|(|$:Cs] [moi|nous] et [moi|toi|lui|elle|iel|nous|vous|eux|elles|iels|$:M] + <<- not value(\1, "|que|qu’|") ~2:0>> ␣ + <<- __also__ /2>> _eq_nous_ + + [|,|(|$:Cs] [toi|lui|elle|iel|vous|eux|elles|iels|$:M] et [toi|vous] + [|,|(|$:Cs] [toi|vous] et [toi|lui|elle|iel|vous|eux|elles|iels|$:M] + <<- not value(\1, "|que|qu’|") ~2:0>> ␣ + <<- __also__ /2>> _eq_vous_ + + [|,|(|$:Cs] [lui|elle|iel|eux|elles|iels|$:M] et [lui|elle|iel|eux|elles|iels] + [|,|(|$:Cs] [lui|elle|iel|eux|elles|iels] et [lui|elle|iel|eux|elles|iels|$:M] + <<- not value(\1, "|que|qu’|") ~2:0>> ␣ + <<- __also__ /2>> _eq_iels_ + __da_le_la_les_leur2__ [|,|(] c’ ?[ne|n’]¿ >être [le|la|l’|les] @:[NA]¬:G [|,|(] ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿ ?[ne|n’]¿ ?[le|la|l’|les|en|me|m’|te|t’|se|s’|nous|vous|lui|leur|y]¿ *WORD [le|la|l’|les] @:[NA]¬:[YG] [|,|(] ?[je|tu|il|elle|on|nous|vous|ils|elles|iel|iels]¿ ?[ne|n’]¿ [me|m’|te|t’|se|s’|nous|vous] [le|la|l’|les|en|y] *WORD [le|la|l’|les] @:[NA]¬:[YG] @@ -20057,20 +20075,22 @@ ## Nombres __gn_nombre_lettres_1m__ $:B:e:p *WORD - <<- /gn/ not value(\1, "|neuf|mille|") and morph(\2, ":[NA].*:s", "*") and not value(\2, "|maximum|minimum|multiplié|divisé|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|") + <<- /gn/ not value(\1, "|neuf|mille|") and morph(\2, ":[NA].*:s", "*") and not morph(<1, ":D.*:s") + and not value(\2, "|maximum|minimum|multiplié|divisé|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|") and not re.search("^[IVXLDM]+$", \1) -2>> =suggPlur(\2) && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel. neuf *WORD - <<- /gn/ morph(\2, ":[NA].*:s", "*") and not morph(<1, ":N.*:m:[is]") and not value(\2, "|maximum|minimum|multiplié|divisé|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|") + <<- /gn/ morph(\2, ":[NA].*:s", "*") and not morph(<1, ":N.*:m:[is]") and not morph(<1, ":D.*:s") + and not value(\2, "|maximum|minimum|multiplié|divisé|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|") -2>> =suggPlur(\2) && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel. mille *WORD - <<- /gn/ not value(\2, "|maximum|minimum|multiplié|divisé|") and morph(\2, ":[NA].*:s", "*") and not value(<1, "|le|un|ce|du|") + <<- /gn/ not value(\2, "|maximum|minimum|multiplié|divisé|") and morph(\2, ":[NA].*:s", "*") and not morph(<1, ":D.*:s") -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. ->> idiots TEST: Il a abandonné neuf {{enfant}}. ->> enfants TEST: On peut trouver mille {{travailleur}} d’un claquement de doigts. ->> travailleurs @@ -20083,25 +20103,26 @@ TEST: un mille marin. TEST: L’article VII mentionné dans la revue TEST: Le produit de cinq multiplié par trois. TEST: deux divisé par douze TEST: il en faut trois minimum, cinq maximum +TEST: il vit dans un vingt-quatre mètre carré. __gn_nombre_chiffres_1m__ [0|1|01] @:[NAQ].*:p¬* <<- /gn/ space_after(\1, 1, 1) and not value(\2, "|Rois|Corinthiens|Thessaloniciens|") -2>> =suggSing(\2) && Accord de nombre erroné avec « \1 » : « \2 » devrait être au singulier. *NUM *WORD - <<- /gn/ space_after(\1, 1, 1) and not value(<1, "|/|") and not re.search("^0*[01](?:,[0-9]+|)$", \1) and not morph(<1, ":N") - and morph(\2, ":[NA].*:s", "*") and not value(\2, "|maximum|minimum|multiplié|divisé|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|") + <<- /gn/ space_after(\1, 1, 1) and not value(<1, "|/|") and not re.search("^0*[01](?:,[0-9]+|)$", \1) and morph(\2, ":[NA].*:s", "*") and not morph(<1, ":(?:N|D.*:s)") + and not value(\2, "|maximum|minimum|multiplié|divisé|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|") -2>> =suggPlur(\2) && Accord de nombre erroné avec « \1 » : « \2 » devrait être au pluriel. *NUM *WORD *WORD <<- /gn/ not value(\2, "|maximum|minimum|fois|multiplié|divisé|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|") - and not re.search("^0*[01](?:,[0-9]+|)$", \1) and not value(<1, "|et|ou|de|d’|") and not morph(\3, ">(?:seule|maximum|minimum)/") >>> + and not re.search("^0*[01](?:,[0-9]+|)$", \1) and not morph(<1, ">(?:et|ou)/|:(?:N|D.*:[si])") and not morph(\3, ">(?:seul|maximum|minimum)/|:(?:[BG]|V0)") >>> <<- /gn/ ((morph(\2, ":[NA].*:m", ":(?:B|e|G|V0|f)") and morph(\3, ":[NA].*:f", "*")) or (morph(\2, ":[NA].*:f", ":(?:B|e|G|V0|m)") and morph(\3, ":[NA].*:m", "*"))) and not apposition(\2, \3) -3>> =switchGender(\3, True) && Accord de genre erroné entre « \2 » et « \3 ». <<- /gn/ __also__ and hasFemForm(\2) -2>> =switchGender(\2, True) && Accord de genre erroné avec « \3 ». <<- /gn/ morph(\2, ":[NA].*:[pi]", "*") and morph(\3, ":[NA].*:s", "*") and not apposition(\2, \3) and not (value(>1, "|et|,|") and morph(>2, ":A")) @@ -20123,10 +20144,13 @@ TEST: 1 La Mort TEST: L’année 2019 a commencé à le montrer TEST: La « première génération » d’ordinateurs des années 1950 a déjà largement cédé la place à une deuxième (transistorisée) TEST: Au sein du club des pays les plus prospères, la richesse par habitant est néanmoins 52 fois supérieure à celle des pays à faibles revenus, d’après la Banque mondiale. TEST: 1 à 2 comprimés par jour voire 2 à 3 maximum +TEST: elle vit dans un 24 m carré. +TEST: elle vit dans un 24 m² triste de la banlieue de Paris. +TEST: dans son 240 m2 lumineux, c’est la belle vie. ## trouver ça/ceci/cela + adj __gn_trouver_ça_adj__ >trouver [ça|cela|ceci] @:A.*:(?:f|m:p)¬:(?:G|3[sp]|M) @@ -22165,13 +22189,10 @@ !!! !!! Processeur: simplification des substantifs !! !!! !!! - -### Simplification des groupes nominaux - __purge_prépositions_pronoms__ à part [cela|ceci|ça] à [cela|ceci|ça] près <<- ~>> * @@ -22412,10 +22433,12 @@ [un|une] d’ [eux|elles] [un|une] d’ entre [nous|vous|eux|elles] [un|une] des [nôtres|vôtres] <<- ~2:0>> * + +### Simplification des syntagmes nominaux __purge_syntagmes_nominaux__ [à|au|aux|avec|en|lors|ayant] [de|d’] [un|une|la|l’|leur|leurs|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|quelques|certains|certaines] @:[NAM] [à|au|aux|avec|en|lors|ayant] [de|d’] [un|une|la|l’|leur|leurs|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|quelques|certains|certaines] @:[NA] ?,¿ [ne|n’|me|m’|te|t’|se|s’|nous|vous|y|c’|ça|ç’|je|j’|tu|il|elle|on|ils|elles|iel|iels|le|la|l’|les|mon|ma|ta|sa|notre|votre|leur|mes|tes|ses|nos|vos|leurs|ce|cet|cette|ces|quel|quels|quelle|quelles] [à|au|aux|avec|en|lors|ayant] [de|d’] [un|une|la|l’|leur|leurs|ce|cet|cette|ces|mon|ton|son|ma|ta|sa|mes|tes|ses|notre|votre|nos|vos|quelques|certains|certaines] @:[NA] @:[VR]¬:[NAP] @@ -26813,12 +26836,36 @@ TEST: ce qu’ils font me {{donnent}} la nausée. ->> donne TEST: tu ne sais pas, mais ce que tu fais {{deviens}} plus facile ->> devient TEST: ceux contre ce que nous faisons deviennent hargneux. TEST: ce qu’elles accomplissent est formidable. + +## 1pl +__conj_eq_nous__ + [|,|(|$:Cs] /_eq_nous_ @:V¬:(?:G|Y|P|1p|M|A.*:p) + <<- /conj/ -3>> =suggVerb(\3, ":1p") && Conjugaison probablement erronée. Accord avec “\2”. Le verbe devrait être à la 1ʳᵉ personne du pluriel. + +TEST: vous et nous {{iront}} dans la forêt + + +## 2pl +__conj_eq_vous__ + [|,|(|$:Cs] /_eq_vous_ @:V¬:(?:G|P|2p|M|A.*:p) + <<- /conj/ -3>> =suggVerb(\3, ":2p") && Conjugaison probablement erronée. Accord avec “\2”. Le verbe devrait être à la 2ᵉ personne du pluriel. + +TEST: vous et eux {{partirait}} ensemble. + ## 3pl +__conj_eq_iels__ + /_eq_iels_ @:V¬:(?:3p|P|G|M|A.*:p) + <<- /conj/ not morph(<1, ":R") and not (morph(\2, ":Q") and morph(<1, ":V0.*:3p")) + -2>> =suggVerb(\2, ":3p") && Conjugaison probablement erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du pluriel. + +TEST: lui et elle {{était}} dans l’affliction + + __conj_elles__ elles @:V¬:(?:3p|P|G|M|A.*:f:p) <<- /conj/ not morph(<1, ":R") and not (morph(\2, ":Q") and morph(<1, ":V0.*:3p")) -2>> =suggVerb(\2, ":3p") && Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du pluriel. <<- /conj/ __also__ and morph(\2, ":3s") -1>> elle && Accord avec “\2”. @@ -26834,11 +26881,11 @@ TEST: eux attaqués par des mécanoïdes, elles attaquées par des insectoïdes. TEST: tout ce qui vient d’elles sera écarté. __conj_iels__ - iels @:V¬:(?:3p|P|G|M|A.*:f:p) + iels @:V¬:(?:3p|P|G|M|A.*:p) <<- /conj/ not morph(<1, ":R") and not (morph(\2, ":Q") and morph(<1, ":V0.*:3p")) -2>> =suggVerb(\2, ":3p") && Conjugaison erronée. Accord avec “\1”. Le verbe devrait être à la 3ᵉ personne du pluriel. <<- /conj/ __also__ and morph(\2, ":3s") -1>> iel && Accord avec “\2”. iels qui @:V¬:(?:3p|P|G|M)