Index: gc_lang/fr/modules-js/cregex.js ================================================================== --- gc_lang/fr/modules-js/cregex.js +++ gc_lang/fr/modules-js/cregex.js @@ -7,12 +7,10 @@ var cregex = { ///// Lemme _zLemma: new RegExp(">([a-zà-öø-ÿ0-9Ā-ʯ][a-zà-öø-ÿ0-9Ā-ʯ-]+)"), ///// Masculin / féminin / singulier / pluriel - _zGender: new RegExp(":[mfe]"), - _zNumber: new RegExp(":[spi]"), _zGenderNumber: new RegExp(":[mfe]:[spi]"), ///// Nom et adjectif _zNA: new RegExp(":[NA]"), @@ -29,11 +27,11 @@ _zNAe: new RegExp(":[NA].*:e"), _zNAme: new RegExp(":[NA].*:[me]"), _zNAfe: new RegExp(":[NA].*:[fe]"), //// nombre et genre - // singuilier + // singulier _zNAms: new RegExp(":[NA].*:m.*:s"), _zNAfs: new RegExp(":[NA].*:f.*:s"), _zNAes: new RegExp(":[NA].*:e.*:s"), _zNAmes: new RegExp(":[NA].*:[me].*:s"), _zNAfes: new RegExp(":[NA].*:[fe].*:s"), @@ -86,68 +84,26 @@ getLemmaOfMorph: function (sMorph) { return this._zLemma.exec(sMorph)[1]; }, agreement: function (l1, l2) { - // check number agreement - if (!this.mbInv(l1) && !this.mbInv(l2)) { - if (this.mbSg(l1) && !this.mbSg(l2)) { - return false; - } - if (this.mbPl(l1) && !this.mbPl(l2)) { - return false; - } - } - // check gender agreement - if (this.mbEpi(l1) || this.mbEpi(l2)) { - return true; - } - if (this.isMas(l1) && !this.mbMas(l2)) { - return false; - } - if (this.isFem(l1) && !this.mbFem(l2)) { + // returns True if agreement in gender and number is possible between morphologies and + let [sGender1, sNumber1] = this.getGenderNumber(l1); + let [sGender2, sNumber2] = this.getGenderNumber(l2); + if (sNumber1 !== ":i" && sNumber2 !== ":i" && sNumber1 !== sNumber2) { + return false; + } + if (sGender1 !== ":e" && sGender2 !== ":e" && sGender1 !== sGender2) { return false; } return true; }, checkConjVerb: function (lMorph, sReqConj) { return lMorph.some(s => s.includes(sReqConj)); }, - getGender: function (lMorph) { - // returns gender of word (':m', ':f', ':e' or empty string). - let sGender = ""; - for (let sMorph of lMorph) { - let m = this._zGender.exec(sMorph); - if (m) { - if (!sGender) { - sGender = m[0]; - } else if (sGender != m[0]) { - return ":e"; - } - } - } - return sGender; - }, - - getNumber: function (lMorph) { - // returns number of word (':s', ':p', ':i' or empty string). - let sNumber = ""; - for (let sMorph of lMorph) { - let m = this._zNumber.exec(sMorph); - if (m) { - if (!sNumber) { - sNumber = m[0]; - } else if (sNumber != m[0]) { - return ":i"; - } - } - } - return sNumber; - }, - getGenderNumber: function (lMorph) { // returns tuple (gender, number) of word: (':m', ':f', ':e' or empty string) and (':s', ':p', ':i' or empty string) let sGender = ""; let sNumber = ""; for (let sMorph of lMorph) { @@ -297,12 +253,10 @@ }; if (typeof(exports) !== 'undefined') { exports._zLemma = cregex._zLemma; - exports._zGender = cregex._zGender; - exports._zNumber = cregex._zNumber; exports._zNA = cregex._zNA; exports._zNAs = cregex._zNAs; exports._zNAp = cregex._zNAp; exports._zNAi = cregex._zNAi; exports._zNAsi = cregex._zNAsi; @@ -342,14 +296,13 @@ exports._zNP = cregex._zNP; exports._zNPm = cregex._zNPm; exports._zNPf = cregex._zNPf; exports._zNPe = cregex._zNPe; exports.getLemmaOfMorph = cregex.getLemmaOfMorph; - exports.checkAgreement = cregex.checkAgreement; + exports.agreement = cregex.agreement; + exports.getGenderNumber = cregex.getGenderNumber; exports.checkConjVerb = cregex.checkConjVerb; - exports.getGender = cregex.getGender; - exports.getNumber = cregex.getNumber; exports.isNom = cregex.isNom; exports.isNomNotAdj = cregex.isNomNotAdj; exports.isAdj = cregex.isAdj; exports.isNomAdj = cregex.isNomAdj; exports.isNomVconj = cregex.isNomVconj; 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 @@ -51,12 +51,12 @@ let lMorph1 = gc_engine.oSpellChecker.getMorph(sWord1); let lMorph2 = gc_engine.oSpellChecker.getMorph(sWord2); if (lMorph1.length == 0 || lMorph2.length == 0) { return ":N:e:p"; } - let sGender1 = cregex.getGender(lMorph1); - let sGender2 = cregex.getGender(lMorph2); + let [sGender1, ] = cregex.getGenderNumber(lMorph1); + let [sGender2, ] = cregex.getGenderNumber(lMorph2); if (sGender1 == ":m" || sGender2 == ":m") { return ":N:m:p"; } if (sGender1 == ":f" || sGender2 == ":f") { return ":N:f:p"; Index: gc_lang/fr/modules/cregex.py ================================================================== --- gc_lang/fr/modules/cregex.py +++ gc_lang/fr/modules/cregex.py @@ -6,12 +6,10 @@ #### Lemme Lemma = re.compile(r"^>(\w[\w-]*)") #### Analyses -Gender = re.compile(":[mfe]") -Number = re.compile(":[spi]") GenderNumber = re.compile(":[mfe]:[spi]") #### Nom et adjectif NA = re.compile(":[NA]") @@ -86,53 +84,22 @@ "return lemma in morphology " return Lemma.search(s).group(1) def agreement (l1, l2): "returns True if agreement in gender and number is possible between morphologies and " - # check number agreement - if not mbInv(l1) and not mbInv(l2): - if mbSg(l1) and not mbSg(l2): - return False - if mbPl(l1) and not mbPl(l2): - return False - # check gender agreement - if mbEpi(l1) or mbEpi(l2): - return True - if isMas(l1) and not mbMas(l2): - return False - if isFem(l1) and not mbFem(l2): + sGender1, sNumber1 = getGenderNumber(l1) + sGender2, sNumber2 = getGenderNumber(l2) + if sNumber1 != ":i" and sNumber2 != ":i" and sNumber1 != sNumber2: + return False + if sGender1 != ":e" and sGender2 != ":e" and sGender1 != sGender2: return False return True def checkConjVerb (lMorph, sReqConj): "returns True if in " return any(sReqConj in s for s in lMorph) -def getGender (lMorph): - "returns gender of word (':m', ':f', ':e' or empty string)." - sGender = "" - for sMorph in lMorph: - m = Gender.search(sMorph) - if m: - if not sGender: - sGender = m.group(0) - elif sGender != m.group(0): - return ":e" - return sGender - -def getNumber (lMorph): - "returns number of word (':s', ':p', ':i' or empty string)." - sNumber = "" - for sMorph in lMorph: - m = Number.search(sMorph) - if m: - if not sNumber: - sNumber = m.group(0) - elif sNumber != m.group(0): - return ":i" - return sNumber - def getGenderNumber (lMorph): "returns tuple (gender, number) of word: (':m', ':f', ':e' or empty string) and (':s', ':p', ':i' or empty string)" sGender = "" sNumber = "" for sMorph in lMorph: Index: gc_lang/fr/modules/gce_analyseur.py ================================================================== --- gc_lang/fr/modules/gce_analyseur.py +++ gc_lang/fr/modules/gce_analyseur.py @@ -41,17 +41,18 @@ return True if 1 < len(s) < 16 and s[0:1].islower() and (not s[1:].islower() or _zUnitNumbers.search(s)): return True return False -def queryNamesPOS(sWord1, sWord2): +def queryNamesPOS (sWord1, sWord2): + "returns POS tag for and as a whole" lMorph1 = _oSpellChecker.getMorph(sWord1) lMorph2 = _oSpellChecker.getMorph(sWord2) if not lMorph1 or not lMorph2: return ":N:e:p" - sGender1 = cr.getGender(lMorph1) - sGender2 = cr.getGender(lMorph2) + sGender1, _ = cr.getGenderNumber(lMorph1) + sGender2, _ = cr.getGenderNumber(lMorph2) if sGender1 == ":m" or sGender2 == ":m": return ":N:m:p" if sGender1 == ":f" or sGender2 == ":f": return ":N:f:p" return ":N:e:p" Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -3305,20 +3305,17 @@ à [la|l’|leur] @:[NA]¬:Y [sans|pour|par] [la|l’|le|les|leur] @:[NA]¬:Y [à|par] @:[NA]¬:Y <<- =>> select(\-1, "", ":V") - [de|d’] ?[la|l’|leur]¿ @:¬:[YD] - <<- not value(<1, "|semblant|") =>> select(\-1, "", ":V") - - du @:[NA].*:[me]:[si]¬:[GY] - <<- =>> select(\2, ":[NA]") - - aucun @:[NA].*:[me]:s¬:G - aucune @:[NA].*:[fe]:s¬:G + aucun @:[NA].*:[me]:s¬:(?:G|V0) + aucune @:[NA].*:[fe]:s¬:(?:G|V0) <<- =>> select(\1, ":D") and select(\2, ":N") + [au|aux] @:[NA]¬:V0 + <<- =>> select(\-1, "", ":V") + certains @:[NA].*:[me]:p¬:(?:G|3p|V0) certaines @:[NA].*:[fe]:p¬:(?:G|3p|V0) <<- =>> select(\1, ":D") and select(\2, ":[NA]") d’ [un|une] *WORD @@ -3328,18 +3325,20 @@ <<- =>> select(\2, ":N") l’ [un|une] *WORD <<- not value(\3, "|plus|") =>> select(\3, ":[123][sp]") - [des|chaque|quelque|quelques|cet|cette|ces|mon|ma|ta|mes|tes|ses|au|aux|notre|votre|nos|vos|leurs|aucun|aucune] *WORD - <<- not morph(\-1, ":V0") =>> select(\-1, "", ":V") + chaque @:[NA]¬:V0 + chaque [avoir|être] + <<- =>> select(\-1, "", ":V") ce @:[NA].*:[me]:[si]¬:(?:3[sp]|V0) <<- not value(<1, "|il|elle|on|iel|ils|elles|iels|ne|n’|") =>> select(\-1, ":[NA]") - sa @¬:(?:V0|3s) - <<- =>> select(\2, "", ":V") + [cet|cette|ces] @:[NA]¬:V0 + [cet|cette|ces] [avoir|être] + <<- =>> select(\-1, "", ":V") les ~.es$ <<- not value(<1, "|tu|ne|n’|me|m’|te|t’|se|s’|nous|vous|") and morph(\2, ":V1.*Ip.*:2s") and not tagbefore(\1, "_2s_") and not value(>1, "|tu|pas|jamais|") =>> select(\2, "", ":V") @@ -3347,39 +3346,78 @@ <<- not value(<1, "|l’|quelqu’|quelqu|") and not value(\2, "|a|fut|fût|est|fait|") and not morph(\2, ":P") =>> select(\2, "", ":V") [/_VCint_|/_VCimp_] [le|la|l’|leur|les] $:¬:Y <<- =>> select(\2, ":D") + [de|d’] ?[la|l’|leur]¿ @:¬:[YD] + <<- not value(<1, "|semblant|") =>> select(\-1, "", ":V") + de [>tel|ce|cet|cette|ces|mon|ma|ta|sa|mes|tes|ses|notre|votre|plein|pleine] *WORD <<- =>> select(\3, "", ":V") de [tous|toutes] les *WORD <<- =>> select(\4, ":[NA]") + des @:[NA] + <<- not \1.isupper() =>> select(\-1, "", ":V") + + du @:[NA].*:[me]:[si]¬:[GY] + <<- =>> select(\2, ":[NA]") + en [plein|pleine] *WORD <<- =>> select(\3, ":[NA]") en tant que *WORD <<- =>> select(\4, ":[NA]") la nuit <<- =>> select(\2, ":N") + leurs @:[NA]¬:V0 + <<- not value(<1, "|je|tu|il|on|elle|iel|nous|vous|ils|elles|iels|") =>> select(\-1, ":[NA]") + + mon @:[NA]¬:V0 + mon [avoir|être] + <<- =>> select(\-1, "", ":V") + + [ma|ta] @:[NA]¬:V0 + <<- =>> select(\-1, "", ":V") + + sa @¬:(?:V0|3s) + <<- =>> select(\2, "", ":V") + + [notre|votre] @:[NA]¬:V0 + <<- not value(<1, "|du|le|la|l’|les|des|") =>> select(\-1, "", ":V") + + [mes|tes|ses|nos|vos] @:[NA]¬:V0 + <<- =>> select(\-1, "", ":V") + + [nos|vos] @:[NA]¬:V0 + <<- =>> select(\-1, "", ":V") + ni *WORD <<- =>> select(\-1, ":N") nombre [de|d’|des] <<- morph(<1, ":[VR]||>,") =>> select(\1, ":N") par *WORD <<- =>> select(\2, "", ":[123][sp]") - plein [de|d’] @:[AN] + plein [de|d’] @:[NA] <<- not morph(<1, ":(?:D.*:m|V[0-3]e)") =>> =define(\1, ":G") plusieurs @:[NA].*:p¬:(?:G|3p|V0) <<- =>> select(\1, ":D") and select(\2, ":[NA]") + + [quel|quels|quelle|quelles] @:[NA]¬:V0 + [quel|quels|quelle|quelles] [être|avoir] + <<- =>> select(\-1, "", ":V") + + [quelque|quelques] @:[NA]¬:V0 + [quelque|quelques] [avoir|être] + <<- =>> select(\-1, "", ":V") sans @:[ISKP] <<- =>> select(\2, ":[NA]") source [de|d’] @@ -7402,11 +7440,11 @@ __conf_on_ont__ [|,|/_start_] ?l’¿ (ont) [ne|n’|me|m’|te|se|s’] [|,|/_start_] ?l’¿ (ont) [lui|nous|vous] @:[123][sp]¬:G [|,|/_start_] ?l’¿ (ont) [leur|le|la|l’] @:[123][sp]¬:(?:G|[NA].*:[si]) - [|,|/_start_] ?l’¿ (ont) @:[123][sp]¬:[GQ]|>(?:envie|charge|peine|affaire|hâte|force|recours|somme)/ + [|,|/_start_] ?l’¿ (ont) @:[123][sp]¬:[GQ]|>(?:envie|charge|peine|marre|affaire|hâte|force|recours|somme)/ <<- /conf/ -1>> on && Confusion probable : le mot “ont” est une conjugaison du verbe avoir. [|,|/_start_] ?l’¿ ont t’ <<- /conf/ not value(>1, "|il|ils|elle|elles|iel|iels|") --2>> on && Confusion probable : le mot “ont” est une conjugaison du verbe avoir. @@ -8660,15 +8698,15 @@ TEST: Il les y {{à}}. ->> a TEST: Y {{à}} du poulet ->> a [l’|les] à - <<- /conf/ not \1.isupper() and not value(>1, "|côté|coup|pic|peine|peu|plat|propos|valoir|") + <<- /conf/ not \1.isupper() and not value(>1, "|côté|coup|pic|peine|marre|peu|plat|propos|valoir|") -2>> a && Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”. en à - <<- /conf/ not \1.isupper() and not value(>1, "|côté|coup|pic|peine|peu|plat|propos|valoir|") and not morph(<1, ">venir/") + <<- /conf/ not \1.isupper() and not value(>1, "|côté|coup|pic|peine|marre|peu|plat|propos|valoir|") and not morph(<1, ">venir/") -2>> a && Confusion : “à” est une préposition. Pour le verbe avoir, écrivez “a”. TEST: Ce fâcheux, comme à son habitude, les {{à}} ennuyés à mourir. ->> a TEST: Lui l’{{à}} pris par surprise. ->> a TEST: Il y en {{à}}. ->> a @@ -9351,11 +9389,11 @@ ## substantifs __conf_substantif_à_substantif!3__ *WORD a $:N¬* <<- /conf/ \2.islower() - and not value(\3, "|accès|bon|bonne|beau|besoin|charge|confiance|connaissance|conscience|crainte|droit|envie|été|faim|force|grand|grande|hâte|honte|interdiction|intérêt|lieu|mauvaise|peine|peur|raison|rapport|recours|soif|tendance|terre|tort|trait|vent|vocation|") + and not value(\3, "|accès|bon|bonne|beau|besoin|charge|confiance|connaissance|conscience|crainte|droit|envie|été|faim|force|grand|grande|hâte|honte|interdiction|intérêt|lieu|mauvaise|marre|peine|peur|raison|rapport|recours|soif|tendance|terre|tort|trait|vent|vocation|") and morph(\1, ":N", "*") -2>> à && Confusion probable : “a” est une forme conjuguée du verbe “avoir”. Pour la préposition, écrivez “à”.|https://fr.wiktionary.org/wiki/%C3%A0 TEST: les bobos {{a}} trottinette ->> à TEST: la lettre A est la première lettre de l’alphabet @@ -18661,10 +18699,11 @@ >porte d’ entrée >pot [de|d’] [chambre|colle|départ|échappement] >poteau d’ exécution >poudre aux yeux >poudre d’ escampette + >poudre [de|d’] perlimpinpin >poule aux œufs d’ or >pouvoir d’ achat >prédication [de|d’] rue >préfecture [de|d’] police >président en exercice @@ -18849,10 +18888,11 @@ >vente aux enchères >ventilateur à merde >vérification [de|d’] routine vernis à ongles >ver [de|d’] terre + >ver à soie >verre à pied >vêtement [de|d’] rechange >vidéo X >vie [de|d’] bohème >violence [par|sur] personne dépositaire de l’ autorité publique @@ -19248,21 +19288,21 @@ >avoir ?[pas|jamais|plus|guère|point]¿ un peu >avoir ?[pas|jamais|plus|guère|point]¿ un petit peu >avoir ?[pas|jamais|plus|guère|point]¿ un tout petit peu <<- morph(>1, ":[QY]") ~2:0>> * - >avoir [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|pitié|soif|vent] + >avoir [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|marre|peur|peine|pitié|soif|vent] >avoir bon [dos|fond] >avoir bon pied ?,¿ bon œil >avoir carte blanche >avoir forme [humaine|animale] >avoir partie [gagnée|liée] >avoir voix au chapitre <<- ~2:0>> ␣ <<- =>> define(\2, ":ÉV") - >avoir [pas|jamais|plus|guère|point] [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|pitié|soif|vent] + >avoir [pas|jamais|plus|guère|point] [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|marre|peur|peine|pitié|soif|vent] >avoir [pas|jamais|plus|guère|point] bon [dos|fond] >avoir [pas|jamais|plus|guère|point] bon pied ?,¿ bon œil >avoir [pas|jamais|plus|guère|point] carte blanche >avoir [pas|jamais|plus|guère|point] forme [humaine|animale] >avoir [pas|jamais|plus|guère|point] gain de cause @@ -19270,11 +19310,11 @@ >avoir [pas|jamais|plus|guère|point] quartier libre >avoir [pas|jamais|plus|guère|point] voix au chapitre <<- ~3:0>> ␣ <<- =>> define(\3, ":ÉV") - >avoir ?[pas|jamais|plus|guère|point]¿ [tous|toutes] les @:B:.:p [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|pitié|soif|vent] + >avoir ?[pas|jamais|plus|guère|point]¿ [tous|toutes] les @:B:.:p [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|marre|peur|peine|pitié|soif|vent] >avoir ?[pas|jamais|plus|guère|point]¿ [tous|toutes] les @:B:.:p @:(?:Q|V1.*:Y) <<- ~2:-2>> * n’ >avoir que $:Q <<- ~3>> * @@ -19302,21 +19342,21 @@ /_VCint_ ?[pas|jamais|plus|guère|point]¿ un peu /_VCint_ ?[pas|jamais|plus|guère|point]¿ un petit peu /_VCint_ ?[pas|jamais|plus|guère|point]¿ un tout petit peu <<- morphVC(\1, ":V0a") and morph(>1, ":[QY]") ~2:0>> * - /_VCint_ [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|pitié|soif|vent] + /_VCint_ [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|marre|peur|peine|pitié|soif|vent] /_VCint_ bon [dos|fond] /_VCint_ bon pied ?,¿ bon œil /_VCint_ carte blanche /_VCint_ forme [humaine|animale] /_VCint_ partie [gagnée|liée] /_VCint_ voix au chapitre <<- morphVC(\1, ":V0a") ~2:0>> ␣ <<- __also__ =>> define(\2, ":ÉV") - /_VCint_ [pas|jamais|plus|guère|point] [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|pitié|soif|vent] + /_VCint_ [pas|jamais|plus|guère|point] [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|marre|peur|peine|pitié|soif|vent] /_VCint_ [pas|jamais|plus|guère|point] bon [dos|fond] /_VCint_ [pas|jamais|plus|guère|point] bon pied ?,¿ bon œil /_VCint_ [pas|jamais|plus|guère|point] carte blanche /_VCint_ [pas|jamais|plus|guère|point] forme [humaine|animale] /_VCint_ [pas|jamais|plus|guère|point] gain de cause @@ -19324,11 +19364,11 @@ /_VCint_ [pas|jamais|plus|guère|point] quartier libre /_VCint_ [pas|jamais|plus|guère|point] voix au chapitre <<- morphVC(\1, ":V0a") ~3:0>> ␣ <<- __also__ =>> define(\3, ":ÉV") - /_VCint_ ?[pas|jamais|plus|guère|point]¿ [tous|toutes] les @:B:.:p [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|peur|peine|pitié|soif|vent] + /_VCint_ ?[pas|jamais|plus|guère|point]¿ [tous|toutes] les @:B:.:p [besoin|confiance|connaissance|conscience|crainte|envie|faim|honte|marre|peur|peine|pitié|soif|vent] /_VCint_ ?[pas|jamais|plus|guère|point]¿ [tous|toutes] les @:B:.:p @:(?:Q|V1.*:Y) <<- morphVC(\1, ":V0a") ~2:-2>> * __purge_après_verbe__ @@ -22379,18 +22419,18 @@ TEST: Tout ce qui a {{lieue}} hors de ce pays est ignoré. ->> lieu TEST: la répression extrêmement violente des diverses manifestations qui ont eu lieu depuis la fin du mois de novembre # mare / marre -__conf_marre_mare__ +__conf_marre_mare!6__ [la|une|cette|quelle|cette|ma|ta|sa] ?petite¿ marre <<- /conf/ --1>> mare && Confusion. Pour parler d’une petite étendue d’eau, écrivez “mare”. En “avoir marre de” = “en avoir assez de”. en >avoir mare <<- /conf/ -3>> marre && Confusion. Une mare est une petite étendue d’eau. -TEST: cette {{marre}} est presque sèche. ->> mare +TEST: la {{marre}} est presque sèche. ->> mare TEST: j’en ai {{mare}} de tout ça. ->> marre TEST: en avoir vraiment {{mare}} de ces conneries. ->> marre # mâter / mater @@ -24709,11 +24749,11 @@ __gn_ces_aux_pluriel_1m__ [ces|aux] *WORD <<- /gn/ morph(\2, ":[NA].*:s", ":[ipGW]") and not (value(>1, "|et|ou|") and morph(>2, ":[NA]")) -2>> =suggPlur(\2) && Accord de nombre erroné : « \2 » devrait être au pluriel. - <<- /gn/ __also__ and morph(\2, ">[bcçdfglklmnpqrstvwxz].*:m", ":f") >>> + <<- /gn/ __also__ and morph(\2, ">[bcçdfgjklmnpqrstvwxz].*:m", ":f") >>> <<- /gn/ \1.endswith("x") or \1.endswith("X") -1>> au && Accord de nombre erroné : « \2 » est au singulier. <<- /gn/ __else__ -1>> ce && Accord de nombre erroné : « \2 » est au singulier. TEST: {{ces}} {{détournement}} de fonds et ces vols ->> ce|||détournements TEST: ces {{étudiant}} sont légion. ->> étudiants @@ -25921,24 +25961,88 @@ TEST: l’existence de la foi {{rejeté}} ->> rejetée TEST: son homologue de la ville écarté de l’ordre __gn_det_nom_de_det_nom_adj_sing!3__ - [le|la|l’|un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre|leur] *WORD [de|d’] [la|l’|un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre|leur] *WORD @:[NA].*:p¬:(?:G|P|[me]:[is]|V0|3[sp]) - [le|la|l’|un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre|leur] *WORD du *WORD @:[NA].*:p¬:(?:G|P|[me]:[is]|V0|3[sp]) + [le|la|l’|un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre|leur] *WORD [de|d’] [la|l’|un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre|leur] *WORD @:[NA].*:p¬:(?:G|P|i|s|V0|3[sp]) + [le|la|l’|un|une|ce|cet|cette|mon|ton|son|ma|ta|sa|notre|votre|leur] *WORD du *WORD @:[NA].*:p¬:(?:G|P|i|s|V0|3[sp]) <<- /gn/ morph(\-2, ":[NA].*:[me]") and not apposition(\-2, \-1) --1>> =suggSing(\-1, True) && Accord erroné : “\-1” devrait être au masculin singulier. TEST: la femme de notre homme {{expulsés}} ->> expulsé + +__gn_det_nom_de_det_nom_adj_sing_plur__ + [le|un|ce|cet] *WORD de [ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD @:A¬:(?:G|P|V0|3[sp]) + [le|un|ce|cet] *WORD des *WORD @:A¬:(?:G|P|V0|3[sp]) + <<- /gn/ morph(\2, ":[NA].*:[me]:[si]", ":[fp]") and morph(\-2, ":[NA].*:[pi]") and not apposition(\-2, \-1) + and not agreement(\-2, \-1) and not agreement(\2, \-1) + --1>> =suggAgree(\-1, \-2) + "|" + suggMasSing(\-1) && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”. + + [la|une|cette|ma|ta|sa] *WORD de [ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD @:A¬:(?:G|P|V0|3[sp]) + [la|une|cette|ma|ta|sa] *WORD des *WORD @:A¬:(?:G|P|V0|3[sp]) + <<- /gn/ morph(\2, ":[NA].*:[fe]:[si]", ":[mp]") and morph(\-2, ":[NA].*:[pi]") and not apposition(\-2, \-1) + and not agreement(\-2, \-1) and not agreement(\2, \-1) + --1>> =suggAgree(\-1, \-2) + "|" + suggFemSing(\-1) && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”. + + [l’|notre|votre|leur] *WORD de [ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD @:A¬:(?:G|P|V0|3[sp]) + [l’|notre|votre|leur] *WORD des *WORD @:A¬:(?:G|P|V0|3[sp]) + <<- /gn/ morph(\2, ":[NA].*:[si]", ":p") and morph(\-2, ":[NA].*:[pi]") and not apposition(\-2, \-1) + and not agreement(\-2, \-1) and not agreement(\2, \-1) + --1>> =suggAgree(\-1, \-2) + "|" + suggAgree(\-1, \2) && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”. + + [mon|ton|son] *WORD de [ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD @:A¬:(?:G|P|V0|3[sp]) + [mon|ton|son] *WORD des *WORD @:A¬:(?:G|P|V0|3[sp]) + <<- /gn/ morph(\2, ":[NA].*:[si]", ":p") and morph(\-2, ":[NA].*:[pi]") and not apposition(\-2, \-1) + and not agreement(\-2, \-1) and not agreement(\2, \-1) >>> + <<- /gn/ morph(\2, ">[bcçdfgjklmnpqrstvwxz].*:[NA].*:[me]:[si]") + --1>> =suggAgree(\-1, \-2) + "|" + suggMasSing(\-1, \2) && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”. + <<- /gn/ __else__ and morph(\2, ":[NA].*:[si]") + --1>> =suggAgree(\-1, \-2) + "|" + suggAgree(\-1, \2) && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”. + + [les|ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD [de|d’] [un|ce|cet] *WORD @:A¬:(?:G|P|V0|3[sp]) + [les|ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD du *WORD @:A¬:(?:G|P|V0|3[sp]) + <<- /gn/ morph(\2, ":[NA].*:[pi]", ":s") and morph(\-2, ":[NA].*:[me]:[si]") and not apposition(\-2, \-1) + and not agreement(\-2, \-1) and not agreement(\2, \-1) + --1>> =suggMasSing(\-1) + "|" + suggAgree(\-1, \2) && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”. + + [les|ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD [de|d’] [la|une|cette|ma|ta|sa] *WORD @:A¬:(?:G|P|V0|3[sp]) + <<- /gn/ morph(\2, ":[NA].*:[pi]", ":s") and morph(\-2, ":[NA].*:[fe]:[si]") and not apposition(\-2, \-1) + and not agreement(\-2, \-1) and not agreement(\2, \-1) + --1>> =suggFemSing(\-1) + "|" + suggAgree(\-1, \2) && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”. + + [les|ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD [de|d’] [l’|notre|votre|leur] *WORD @:A¬:(?:G|P|V0|3[sp]) + <<- /gn/ morph(\2, ":[NA].*:[pi]", ":s") and morph(\-2, ":[NA].*:[si]") and not apposition(\-2, \-1) + and not agreement(\-2, \-1) and not agreement(\2, \-1) + --1>> =suggAgree(\-1, \-2) + "|" + suggAgree(\-1, \2) && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”. + + [les|ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD [de|d’] [mon|ton|son] *WORD @:A¬:(?:G|P|V0|3[sp]) + <<- /gn/ morph(\2, ":[NA].*:[pi]", ":s") and morph(\-2, ":[NA].*:[si]") and not apposition(\-2, \-1) + and not agreement(\-2, \-1) and not agreement(\2, \-1) >>> + <<- /gn/ morph(\-2, ">[bcçdfgjklmnpqrstvwxz].*:[NA].*:[me]:[si]") + --1>> =suggMasSing(\-1, \-2) + "|" + suggAgree(\-1, \2) && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”. + <<- /gn/ __else__ and morph(\-2, ":[NA].*:[si]") + --1>> =suggAgree(\-1, \-2) + "|" + suggAgree(\-1, \2) && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”. + +TEST: le pari des fous {{engagées}} dans cette fuite en avant ->> engagé|engagés +TEST: la faute de ces idiots {{inconscient}} ->> inconscients|inconsciente +TEST: l’erreur de nos dirigeants {{oublié}} par tout le monde ->> oubliés|oubliée +TEST: son président de ces jours {{passée}} ->> passés|passé +TEST: son élégance de ces jours {{passées}} ->> passés|passée +TEST: quelques erreurs du passé {{oubliés}} ->> oublié|oubliées +TEST: les errements de la cité {{voisin}} ->> voisine|voisins +TEST: vos compatriotes de votre ville {{tenu}} en haleine ->> tenue|tenus +TEST: les instructions de mon président {{ignorée}} ->> ignoré|ignorées +TEST: quelques consignes de son instructeur {{oubliée}} ->> oublié|oubliées + __gn_det_nom_de_det_nom_adj_plur__ - [les|ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD de [ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD @:[NA].*:[pi]¬:(?:G|P|s|V0|3[sp]) - [les|ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD des *WORD @:[NA].*:[pi]¬:(?:G|P|s|V0|3[sp]) + [les|ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD de [ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD @:A.*:[pi]¬:(?:G|P|s|V0|3[sp]) + [les|ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD des *WORD @:A.*:[pi]¬:(?:G|P|s|V0|3[sp]) <<- /gn/ morph(\2, ":[NA].*:[pi]", ":s") and morph(\-2, ":[NA].*:[pi]") and not apposition(\-2, \-1) and not agreement(\-2, \-1) and not agreement(\2, \-1) - --1>> =suggAgree(\-1, \-2) && Accord erroné : “\-1” devrait être accordé avec “\2” ou “\-2”. + --1>> =suggAgree(\-1, \-2) && Accord erroné : “\-1” devrait être accordé avec “\-2” ou “\2”. [les|ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD de [ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD @:[NA].*:s¬:(?:G|P|i|p|V0|3[sp]) [les|ces|mes|tes|ses|nos|vos|leurs|quelques] *WORD des *WORD @:[NA].*:s¬:(?:G|P|i|p|V0|3[sp]) <<- /gn/ morph(\2, ":[NA].*:[pi]", ":s") and morph(\-2, ":[NA].*:[pi]") and not apposition(\-2, \-1) and not (value(>1, "|et|ou|") and morph(>2, ":A.*:[si]")) --1>> =suggPlur(\-1) && Accord erroné : “\-1” devrait être au pluriel. @@ -29200,11 +29304,14 @@ TEST: elles ne s’y étaient pas {{donnée}}. ->> données TEST: sans fin elles se sont succédé -__ppas_se_être__ +__ppas_ne_me_te_se_être__ + [ne|n’] ?[y|en]¿ être @:(?:Y|[123][sp])¬:[QAG] + <<- /ppas/ --1>> =suggVerbPpas(\-1) && Incohérence. Le verbe devrait être un participe passé. + [me|m’|te|se|s’] ?[y|en]¿ >être @:(?:Y|[123][sp])¬:[QAG] <<- /ppas/ morph(\-2, ":[123]s") --1>> =suggVerbPpas(\-1, ":s") && Incohérence. Le verbe devrait être un participe passé. <<- /ppas/ morph(\-2, ":[123]p") --1>> =suggVerbPpas(\-1, ":p") && Incohérence. Le verbe devrait être un participe passé. <<- /ppas/ __else__ --1>> =suggVerbPpas(\-1) && Incohérence. Le verbe devrait être un participe passé. @@ -29213,10 +29320,12 @@ --1>> =suggSing(\-1) && Le participe passé devrait être au singulier. tu t’ ?[y|en]¿ [es|étais|seras|serais|fus|fusses] @:(?:Y|[123][sp])¬:[QG] <<- /ppas/ --1>> =suggVerbPpas(\-1, ":s") && Incohérence. Le verbe devrait être un participe passé. +TEST: n’y être {{attacher}} que par habitude ->> attaché|attachés|attachée|attachées +TEST: n’être {{attacher}} à rien ->> attaché|attachés|attachée|attachées TEST: s’être toujours {{donner}} le mot. ->> donné|donnée|donnés|données TEST: je suis venu et me suis totalement {{donnés}} à cette œuvre ->> donné TEST: c’est de ce qui s’est {{passe}}. ->> passé|passée TEST: s’était toujours {{passe}} comme ça avec elle ->> passé|passée TEST: s’est {{approche}} de la penderie ->> approché|approchée @@ -30215,28 +30324,28 @@ !!!! Participes passés: accord avec le substantif précédent !! __ppas_sujet_être_accord_immunités__ *WORD [que|qu’] [un|le|ce|cet|une|la|ma|ta|sa|cette|l’|mon|ton|son|notre|votre|leur|les|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|$:B] *WORD ?[ne|n’]¿ ?[en|y]¿ - || ([>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir]) + || [>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir] || [être|devenir|redevenir|rester|paraître|paraitre|sembler] *WORD *WORD [que|qu’] [un|le|ce|cet|une|la|ma|ta|sa|cette|l’|mon|ton|son|notre|votre|leur|les|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|$:B] *WORD ?[ne|n’]¿ ?[en|y]¿ - || ([>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir]) + || [>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir] || être [devenu+e|redevenu+e|resté+e|demeuré+e] *WORD *WORD [que|qu’] [un|le|ce|cet|une|la|ma|ta|sa|cette|l’|mon|ton|son|notre|votre|leur|les|ces|mes|tes|ses|nos|vos|leurs|quelques|plusieurs|$:B] *WORD ?[ne|n’]¿ ?[en|y]¿ - || ([>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir]) + || [>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir] || avoir [été|semblé|paru] *WORD <<- /ppas/ agreement(\1, \-1) !-1>> *WORD [que|qu’] $:M ?[ne|n’]¿ - || ([>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir]) + || [>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir] || [être|devenir|redevenir|rester|paraître|paraitre|sembler] *WORD *WORD [que|qu’] $:M ?[ne|n’]¿ - || ([>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir]) + || [>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir] || être [devenu+e|redevenu+e|resté+e|demeuré+e] *WORD *WORD [que|qu’] $:M ?[ne|n’]¿ - || ([>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir]) + || [>affirmer|>croire|>déclarer|>désirer|>détester|>dire|>estimer|>imaginer|>penser|>préférer|>savoir|>souhaiter|>vouloir] || avoir [été|semblé|paru] *WORD <<- /ppas/ agreement(\1, \-1) !-1>> __ppas_sujet_être_accord_singulier__ @@ -30727,10 +30836,11 @@ TEST: ce qu’il avait cru être devenait un rêve lointain et à peine concevable. TEST: la grande crainte du maire est de voir s’effondrer d’autres immeubles TEST: la grande crainte du maire est de voir arriver d’autres immigrés TEST: Ce faisant, la chambre criminelle nous précise que relayer n’est pas forcément diffamer TEST: maintenir en confinement certaines personnes sous prétexte qu’elles sont à risques serait une mesure inconstitutionnelle et discriminatoire. +TEST: Nous avons vu cet être donner sa vie pour son enfant. !! !! @@ -30877,11 +30987,11 @@ <<- !3>> __ppas_ayant__ ayant @:(?:Q.*:[fp]|[123][sp])¬:(?:G|N|m:[si]) - <<- /ppas/ not value(\-1, "|barre|confiance|charge|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") and not value(<1, "|m’|t’|l’|nous|vous|les|") + <<- /ppas/ not value(\-1, "|barre|confiance|charge|cours|envie|marre|peine|prise|crainte|cure|affaire|hâte|force|recours|") and not value(<1, "|m’|t’|l’|nous|vous|les|") --1>> =suggMasSing(\-1) && Après avoir, il faut un participe passé au masculin singulier (sauf si le COD se trouve avant le verbe, improbable dans ce cas de figure). TEST: ayant {{marqués}} les esprits, tout le monde se souvenait d’elles. ->> marqué TEST: ayant prise sur les événements, elle ne voyait aucune raison de s’alarmer. @@ -30889,32 +30999,32 @@ TEST: il pensait, nous ayant oubliés, que nous l’aurions oublié, nous aussi. __ppas_pronom_avoir__ il ?[ne|n’]¿ ?[lui|leur]¿ >avoir *WORD - <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") + <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|marre|peine|prise|crainte|cure|affaire|hâte|force|recours|") and (value(<1, "||,|comme|comment|et|lorsque|lorsqu’|mais|où|ou|quand|qui|pourquoi|puisque|puisqu’|quoique|quoiqu’|si|s’|sinon|") or (value(<1, "|que|qu’|") and morph(<2, ":V|", ":[NA]"))) and \-1.islower() and morph(\-1, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])") --1>> =suggVerbPpas(\-1, ":m:s") && 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 il ?[ne|n’]¿ y >avoir *WORD - <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") + <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|marre|peine|prise|crainte|cure|affaire|hâte|force|recours|") and (value(<1, "||,|comme|comment|et|lorsque|lorsqu’|mais|où|ou|quand|qui|pourquoi|puisque|puisqu’|quoique|quoiqu’|si|s’|sinon|") or (value(<1, "|que|qu’|") and morph(<2, ":V|", ":[NA]"))) and \-1.islower() and morph(\-1, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|N|Q.*:m:[si])") --1>> =suggVerbPpas(\-1, ":m:s") && 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 [je|j’|tu|elle|on|ils|elles|iel|iels|et|qui|ça|cela|ceci|celui-ci|celui-là|celle-ci|celle-là|ceux-ci|ceux-là|celles-ci|celles-là] ?[ne|n’]¿ ?[lui|leur|y]¿ >avoir *WORD - <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") + <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|marre|peine|prise|crainte|cure|affaire|hâte|force|recours|") and (value(<1, "||,|comme|comment|et|lorsque|lorsqu’|mais|où|ou|quand|qui|pourquoi|puisque|puisqu’|quoique|quoiqu’|si|s’|sinon|") or (value(<1, "|que|qu’|") and morph(<2, ":V|", ":[NA]"))) and \-1.islower() and morph(\-1, ":(?:[123][sp]|Q.*:[fp])", ":(?:G|W|Q.*:m:[si])") --1>> =suggVerbPpas(\-1, ":m:s") && 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 [je|j’|tu|il|elle|on|ils|elles|iel|iels|et|qui|ça|cela|ceci|celui-ci|celui-là|celle-ci|celle-là|ceux-ci|ceux-là|celles-ci|celles-là] ?[ne|n’]¿ en >avoir *WORD - <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") + <<- /ppas/ not value(\-1, "|barre|confiance|cours|envie|marre|peine|prise|crainte|cure|affaire|hâte|force|recours|") and (value(<1, "||,|comme|comment|et|lorsque|lorsqu’|mais|où|ou|quand|qui|pourquoi|puisque|puisqu’|quoique|quoiqu’|si|s’|sinon|") or (value(<1, "|que|qu’|") and morph(<2, ":V|", ":[NA]"))) and \-1.islower() and morph(\-1, ":(?:[123][sp])", ":[GWQ]") --1>> =suggVerbPpas(\-1, ":m:s") && 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 @@ -31088,18 +31198,23 @@ TEST: Pourquoi m’avoir {{ignorés}} ainsi ? ->> ignoré TEST: sans avoir {{ignorée}} le problème. ->> ignoré ## avoir avec participe passé -__ppas_m_t_l_avoir__ +__ppas_n_m_t_l_avoir__ + n’ ?[en|y]¿ >avoir @:(?:Y|[123][sp])¬:[QGWMX] + <<- /ppas/ not value(\-1, "|confiance|charge|cours|envie|marre|peine|prise|crainte|cure|affaire|hâte|force|recours|pouvoir|") + --1>> =suggVerbPpas(\-1, ":m:s") && Confusion probable : employez un participe passé. + [l’|m’] ?[en|y]¿ >avoir @:(?:Y|[123][sp])¬:[QGWMX] - <<- /ppas/ --1>> =suggVerbPpas(\-1, ":m:s") && Confusion : employez un participe passé. + <<- /ppas/ --1>> =suggVerbPpas(\-1, ":m:s") && Confusion : employez un participe passé. t’ ?[en|y]¿ >avoir @:(?:Y|[123][sp])¬:[QGWMX] - <<- /ppas/ not value(\-1, "|confiance|charge|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") - --1>> =suggVerbPpas(\-1, ":m:s") && Confusion : employez un participe passé. + <<- /ppas/ not value(\-1, "|confiance|charge|cours|envie|marre|peine|prise|crainte|cure|affaire|hâte|force|recours|") + --1>> =suggVerbPpas(\-1, ":m:s") && Confusion : employez un participe passé. +TEST: n’y avoir jamais {{toucher}} ->> touché TEST: m’avoir {{terminer}}. ->> terminé TEST: il m’a {{souffler}} la bonne réponse. ->> soufflé TEST: elle t’en a {{parle}}. ->> parlé TEST: c’est vous qui m’avez {{convertit}}. ->> converti TEST: Mélanie l’a {{transformer}} ->> transformé @@ -31334,19 +31449,19 @@ !!!! Participes passés avec “avoir” (formes interrogatives) !! __ppas_avoir_interrogatif__ *WORD /_VCint_ *WORD - <<- /ppas/ morphVC(\2, ":V0a") and not value(\3, "|barre|charge|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") >>> + <<- /ppas/ morphVC(\2, ":V0a") and not value(\3, "|barre|charge|confiance|cours|envie|peine|marre|prise|crainte|cure|affaire|hâte|force|recours|") >>> <<- /ppas/ morph(\3, ":(?:Y|[123][sp])", ":[QMG]") -3>> =suggVerbPpas(\3, ":m:s") && Incohérence probable avec “\2”. Après “avoir”, ce verbe devrait être un participe passé. <<- /ppas/ __else__ and not value(\1, "|les|l’|m’|t’|nous|vous|en|") and morph(\3, ":Q.*:[fp]", ":m:[si]") and not morph(\1, ":[NA].*:[fp]") and not before("(?i)\\b(?:quel(?:le|)s?|combien) ") -3>> =suggVerbPpas(\3, ":m:s") && Avec “avoir”, il faut un participe passé (au masculin singulier, sauf éventuellement si un COD précède). [|,|(] ?n’¿ /_VCint_ *WORD - <<- /ppas/ morphVC(\-2, ":V0a") and not value(\-1, "|barre|charge|confiance|cours|envie|peine|prise|crainte|cure|affaire|hâte|force|recours|") >>> + <<- /ppas/ morphVC(\-2, ":V0a") and not value(\-1, "|barre|charge|confiance|cours|envie|peine|marre|prise|crainte|cure|affaire|hâte|force|recours|") >>> <<- /ppas/ morph(\-1, ":(?:Y|[123][sp])", ":[QMG]") --1>> =suggVerbPpas(\-1, ":m:s") && Incohérence probable avec “\-2”. Après “avoir”, ce verbe devrait être un participe passé. <<- /ppas/ __else__ and morph(\-1, ":Q.*:[fp]", ":m:[si]") --1>> =suggVerbPpas(\-1, ":m:s") && Avec “avoir”, il faut un participe passé (au masculin singulier, sauf éventuellement si un COD précède).