Index: compile_rules_graph.py ================================================================== --- compile_rules_graph.py +++ compile_rules_graph.py @@ -46,30 +46,30 @@ if sCode[0:1] == "=": sCode = sCode[1:] sCode = sCode.replace("__also__", "bCondMemo") sCode = sCode.replace("__else__", "not bCondMemo") sCode = sCode.replace("sContext", "_sAppContext") - sCode = re.sub(r"(morph|morphVC|analyse|value|tag|displayInfo)[(]\\(\d+)", 'g_\\1(lToken[nTokenOffset+\\2]', sCode) - sCode = re.sub(r"(morph|morphVC|analyse|value|tag|displayInfo)[(]\\-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1]', sCode) - sCode = re.sub(r"(select|exclude|define|define_from|change_meta)[(][\\](\d+)", 'g_\\1(lToken[nTokenOffset+\\2]', sCode) - sCode = re.sub(r"(select|exclude|define|define_from|change_meta)[(][\\]-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1]', sCode) - sCode = re.sub(r"(tag_before|tag_after)[(][\\](\d+)", 'g_\\1(lToken[nTokenOffset+\\2], dTags', sCode) - sCode = re.sub(r"(tag_before|tag_after)[(][\\]-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1], dTags', sCode) - sCode = re.sub(r"space_after[(][\\](\d+)", 'g_space_between_tokens(lToken[nTokenOffset+\\1], lToken[nTokenOffset+\\1+1]', sCode) - sCode = re.sub(r"space_after[(][\\]-(\d+)", 'g_space_between_tokens(lToken[nLastToken-\\1+1], lToken[nLastToken-\\1+2]', sCode) - sCode = re.sub(r"analyse_with_next[(][\\](\d+)", 'g_merged_analyse(lToken[nTokenOffset+\\1], lToken[nTokenOffset+\\1+1]', sCode) - sCode = re.sub(r"analyse_with_next[(][\\]-(\d+)", 'g_merged_analyse(lToken[nLastToken-\\1+1], lToken[nLastToken-\\1+2]', sCode) - sCode = re.sub(r"(morph|analyse|tag|value)\(>1", 'g_\\1(lToken[nLastToken+1]', sCode) # next token - sCode = re.sub(r"(morph|analyse|tag|value)\(<1", 'g_\\1(lToken[nTokenOffset]', sCode) # previous token - sCode = re.sub(r"(morph|analyse|tag|value)\(>(\d+)", 'g_\\1(g_token(lToken, nLastToken+\\2)', sCode) # next token - sCode = re.sub(r"(morph|analyse|tag|value)\(<(\d+)", 'g_\\1(g_token(lToken, nTokenOffset+1-\\2)', sCode) # previous token + sCode = re.sub(r"\b(morph|morphVC|analyse|value|tag|displayInfo)[(]\\(\d+)", 'g_\\1(lToken[nTokenOffset+\\2]', sCode) + sCode = re.sub(r"\b(morph|morphVC|analyse|value|tag|displayInfo)[(]\\-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1]', sCode) + sCode = re.sub(r"\b(select|exclude|define|define_from|add_morph|change_meta)[(][\\](\d+)", 'g_\\1(lToken[nTokenOffset+\\2]', sCode) + sCode = re.sub(r"\b(select|exclude|define|define_from|add_morph|change_meta)[(][\\]-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1]', sCode) + sCode = re.sub(r"\b(tag_before|tag_after)[(][\\](\d+)", 'g_\\1(lToken[nTokenOffset+\\2], dTags', sCode) + sCode = re.sub(r"\b(tag_before|tag_after)[(][\\]-(\d+)", 'g_\\1(lToken[nLastToken-\\2+1], dTags', sCode) + sCode = re.sub(r"\bspace_after[(][\\](\d+)", 'g_space_between_tokens(lToken[nTokenOffset+\\1], lToken[nTokenOffset+\\1+1]', sCode) + sCode = re.sub(r"\bspace_after[(][\\]-(\d+)", 'g_space_between_tokens(lToken[nLastToken-\\1+1], lToken[nLastToken-\\1+2]', sCode) + sCode = re.sub(r"\banalyse_with_next[(][\\](\d+)", 'g_merged_analyse(lToken[nTokenOffset+\\1], lToken[nTokenOffset+\\1+1]', sCode) + sCode = re.sub(r"\banalyse_with_next[(][\\]-(\d+)", 'g_merged_analyse(lToken[nLastToken-\\1+1], lToken[nLastToken-\\1+2]', sCode) + sCode = re.sub(r"\b(morph|analyse|tag|value)\(>1", 'g_\\1(lToken[nLastToken+1]', sCode) # next token + sCode = re.sub(r"\b(morph|analyse|tag|value)\(<1", 'g_\\1(lToken[nTokenOffset]', sCode) # previous token + sCode = re.sub(r"\b(morph|analyse|tag|value)\(>(\d+)", 'g_\\1(g_token(lToken, nLastToken+\\2)', sCode) # next token + sCode = re.sub(r"\b(morph|analyse|tag|value)\(<(\d+)", 'g_\\1(g_token(lToken, nTokenOffset+1-\\2)', sCode) # previous token sCode = re.sub(r"\bspell *[(]", '_oSpellChecker.isValid(', sCode) sCode = re.sub(r"\bbefore\(\s*", 'look(sSentence[:lToken[1+nTokenOffset]["nStart"]], ', sCode) # before(sCode) sCode = re.sub(r"\bafter\(\s*", 'look(sSentence[lToken[nLastToken]["nEnd"]:], ', sCode) # after(sCode) sCode = re.sub(r"\bbefore0\(\s*", 'look(sSentence0[:lToken[1+nTokenOffset]["nStart"]], ', sCode) # before0(sCode) sCode = re.sub(r"\bafter0\(\s*", 'look(sSentence[lToken[nLastToken]["nEnd"]:], ', sCode) # after0(sCode) - sCode = re.sub(r"analyseWord[(]", 'analyse(', sCode) + sCode = re.sub(r"\banalyseWord[(]", 'analyse(', sCode) sCode = re.sub(r"[\\](\d+)", 'lToken[nTokenOffset+\\1]["sValue"]', sCode) sCode = re.sub(r"[\\]-(\d+)", 'lToken[nLastToken-\\1+1]["sValue"]', sCode) sCode = re.sub(r">1", 'lToken[nLastToken+1]["sValue"]', sCode) sCode = re.sub(r"<1", 'lToken[nTokenOffset]["sValue"]', sCode) return sCode Index: gc_core/js/lang_core/gc_engine.js ================================================================== --- gc_core/js/lang_core/gc_engine.js +++ gc_core/js/lang_core/gc_engine.js @@ -1446,10 +1446,18 @@ } else if (lDefault) { oToken["lMorph"] = lDefault; } return true; } + +function g_add_morph (oToken, lNewMorph) { + "Disambiguation: add a morphology to a token" + let lMorph = (oToken.hasOwnProperty("lMorph")) ? oToken["lMorph"] : _oSpellChecker.getMorph(oToken["sValue"]); + lMorph.push(...lNewMorph); + oToken["lMorph"] = lMorph; + return true; +} function g_define (oToken, lMorph) { // set morphologies of , always return true oToken["lMorph"] = lMorph; return true; Index: gc_core/py/lang_core/gc_engine.py ================================================================== --- gc_core/py/lang_core/gc_engine.py +++ gc_core/py/lang_core/gc_engine.py @@ -1194,15 +1194,14 @@ return True dTokenPos[nPos]["lMorph"] = lMorph return True - #### Disambiguation for graph rules def g_select (dToken, sPattern, lDefault=None): - "select morphologies for according to , always return True" + "Disambiguation: select morphologies for according to , always return True" lMorph = dToken["lMorph"] if "lMorph" in dToken else _oSpellChecker.getMorph(dToken["sValue"]) if not lMorph or len(lMorph) == 1: if lDefault: dToken["lMorph"] = lDefault #echo("DA:", dToken["sValue"], dToken["lMorph"]) @@ -1216,11 +1215,11 @@ #echo("DA:", dToken["sValue"], dToken["lMorph"]) return True def g_exclude (dToken, sPattern, lDefault=None): - "select morphologies for according to , always return True" + "Disambiguation: select morphologies for according to , always return True" lMorph = dToken["lMorph"] if "lMorph" in dToken else _oSpellChecker.getMorph(dToken["sValue"]) if not lMorph or len(lMorph) == 1: if lDefault: dToken["lMorph"] = lDefault #echo("DA:", dToken["sValue"], dToken["lMorph"]) @@ -1232,20 +1231,28 @@ elif lDefault: dToken["lMorph"] = lDefault #echo("DA:", dToken["sValue"], dToken["lMorph"]) return True + +def g_add_morph (dToken, lNewMorph): + "Disambiguation: add a morphology to a token" + lMorph = dToken["lMorph"] if "lMorph" in dToken else _oSpellChecker.getMorph(dToken["sValue"]) + lMorph.extend(lNewMorph) + dToken["lMorph"] = lMorph + return True + def g_define (dToken, lMorph): - "set morphologies of , always return True" + "Disambiguation: set morphologies of , always return True" dToken["lMorph"] = lMorph #echo("DA:", dToken["sValue"], lMorph) return True def g_define_from (dToken, nLeft=None, nRight=None): - "set morphologies of with slicing its value with and " + "Disambiguation: set morphologies of with slicing its value with and " if nLeft is not None: dToken["lMorph"] = _oSpellChecker.getMorph(dToken["sValue"][slice(nLeft, nRight)]) else: dToken["lMorph"] = _oSpellChecker.getMorph(dToken["sValue"]) return True Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -1999,10 +1999,15 @@ <<- =>> exclude(\2, ":V") par *WORD <<- =>> exclude(\2, ":[123][sp]") + nombre [de|d’|des] [@:[NA]||,] + <<- not morph(<1, ":D") >>> + <<- morph(<1, ":A.*:[me]:[si]") =>> add_morph(\1, [">nombre/:G:D"]) + <<- __else__ =>> define(\1, [">nombre/:G:D"]) + plein [de|d’] @:[AN] <<- not morph(<1, ">(?:être|(?:re|)devenir|rester|demeurer|sembler|para[iî]tre)/") =>> =define(\1, [":G"]) source [de|d’] <<- morph(<1, ">(?:être|(?:re|)devenir|rester|demeurer|sembler|para[iî]tre)/") =>> define(\1, [":LV"]) @@ -13330,16 +13335,17 @@ <<- =>> =select(\-2, ":D") and exclude(\-1, ":[123][sp]") __da_substantifs__ [|,] $:D *WORD *WORD [ne|n’|me|m’|te|t’|se|s’] - [|,] $:D *WORD *WORD [le|la|l’|les|en|nous|vous|lui|leur|y] @:(?:[123][sp]|P) + [|,] $:D *WORD *WORD [en|nous|vous|lui|y] @:(?:[123][sp]|P) + [|,] $:D *WORD *WORD [le|la|l’|les|leur] @:(?:[123][sp]|P)¬:[NA] [|,] $:D *WORD *WORD [nous|vous] [le|la|l’|les|en|y] @:(?:[123][sp]|P) [|,] $:D *WORD *WORD [le|la|l’|les] [lui|leur|en|y] @:(?:[123][sp]|P) [|,] $:D *WORD *WORD [lui|leur|y] en @:(?:[123][sp]|P) - [|,] $:D *WORD *WORD @:(?:3[sp]|P) - <<- morph(\3, ":[NA]", ":(?:G|V0)") and morph(\4, ":[NA]", ":[PG]") =>> exclude(\4, ":V") + [|,] $:D *WORD *WORD @:(?:3[sp]|P)¬:[GW] + <<- morph(\3, ":[NA]", ":(?:G|V0)") and morph(\4, ":[NA]", ":(?:[PG]|V0)") =>> exclude(\4, ":V") [des|ces|mes|tes|ses|nos|vos|quelques|lesdits] @:A.*:[pi] @:N.*:[pi]¬(?:3[sp]|G) <<- =>> exclude(\3, ":V") les @:A.*:[pi]¬:V @:N.*:[pi]¬(?:3[sp]|G) @@ -13676,11 +13682,13 @@ TEST: Les pompes à chaleur sont moins rentables. TEST: Ce qui rend les pompes à chaleur moins rentables. TEST: l’accusation de lynchage médiatique proférée par François de Clermont à l’encontre de “Marianne” ne tient pas. TEST: La poïesis, en grec, est ce qui permet de faire passer n’importe quoi du non-être à l’être TEST: un moteur nouvelle génération - +TEST: La première est la critique dite artiste +TEST: la critique conduit nombre de protestataires à se replier sur des modalités de défense efficaces dans le passé mais désormais largement inadaptées +TEST: Tu crois que Microsoft peut contraindre les projets libres à quoi que ce soit ? @@@@ @@@@ @@@@ @@ -15847,10 +15855,22 @@ TEST: c’est son point de {{vu}} qui prime. TEST: Son point de {{vus}} prévaudra toujours, faites-vous à cette idée ou dégagez. TEST: de mon point de {{vues}} + +__sgpl_verbe__ + >faire rires + <<- /sgpl/ -2>> rire # Faire rire. Rire est un verbe, il ne prend pas la marque du pluriel. + + [>pouvoir|>vouloir|>falloir] [rires|mangers|êtres|avoirs] + <<- /sgpl/ morph(\1, ":V") -2>> =\2[:-1] # Si “\2” est censé être un verbe, ne mettez pas la marque du pluriel. + + +TEST: On peut {{rires}}, non ? +TEST: Faire {{rires}}, c’est compliqué. + !! !! !!!! Confusions !!