Index: compile_rules.py ================================================================== --- compile_rules.py +++ compile_rules.py @@ -588,9 +588,9 @@ "paragraph_rules_JS": jsconv.writeRulesToJSArray(mergeRulesByOption(lParagraphRulesJS)), "sentence_rules_JS": jsconv.writeRulesToJSArray(mergeRulesByOption(lSentenceRulesJS)) } dVars.update(dOptions) # compile graph rules - dVars2 = crg.make(lGraphRule, dDEF, sLang, bJavaScript) + dVars2 = crg.make(lGraphRule, dDEF, sLang, dOptPriority, bJavaScript) dVars.update(dVars2) return dVars Index: compile_rules_graph.py ================================================================== --- compile_rules_graph.py +++ compile_rules_graph.py @@ -100,11 +100,11 @@ aRule.append(sToken) for aRule in lTokenLines: yield aRule -def createRule (iLine, sRuleName, sTokenLine, iActionBlock, sActions, nPriority, dDef): +def createRule (iLine, sRuleName, sTokenLine, iActionBlock, sActions, nPriority, dOptPriority, dDef): "generator: create rule as list" # print(iLine, "//", sRuleName, "//", sTokenLine, "//", sActions, "//", nPriority) for lToken in genTokenLines(sTokenLine, dDef): # Calculate positions dPos = {} # key: iGroup, value: iToken @@ -118,11 +118,11 @@ # Parse actions for iAction, sAction in enumerate(sActions.split(" <<- ")): sAction = sAction.strip() if sAction: sActionId = sRuleName + "__b" + str(iActionBlock) + "_a" + str(iAction) + "_" + str(len(lToken)) - aAction = createAction(sActionId, sAction, nPriority, len(lToken), dPos) + aAction = createAction(sActionId, sAction, nPriority, dOptPriority, len(lToken), dPos) if aAction: dACTIONS[sActionId] = aAction lResult = list(lToken) lResult.extend(["##"+str(iLine), sActionId]) yield lResult @@ -150,18 +150,20 @@ if re.search("[.]\\w+[(]|sugg\\w+[(]|\\([0-9]|\\[[0-9]", sText): print("# Warning at line " + sActionId + ": This message looks like code. Line should probably begin with =") print(sText) -def createAction (sActionId, sAction, nPriority, nToken, dPos): +def createAction (sActionId, sAction, nPriority, dOptPriority, nToken, dPos): "create action rule as a list" # Option sOption = False m = re.match("/(\\w+)/", sAction) if m: sOption = m.group(1) sAction = sAction[m.end():].strip() + if nPriority == -1: + nPriority = dOptPriority.get(sOption, 4) # valid action? m = re.search(r"(?P[-~=/>])(?P\d+\.?|)(?P:\.?\d+|)>>", sAction) if not m: print(" # Error. No action found at: ", sActionId) return None @@ -272,19 +274,19 @@ else: print(" # Unknown action.", sActionId) return None -def make (lRule, dDef, sLang, bJavaScript): +def make (lRule, dDef, sLang, dOptPriority, bJavaScript): "compile rules, returns a dictionary of values" # for clarity purpose, don’t create any file here # removing comments, zeroing empty lines, creating definitions, storing tests, merging rule lines print(" parsing rules...") lTokenLine = [] sActions = "" - nPriority = 4 + nPriority = -1 dAllGraph = {} sGraphName = "" iActionBlock = 0 for i, sLine in lRule: @@ -309,11 +311,11 @@ # new rule group m = re.match("__(\\w+)(!\\d|)__", sLine) if m: sRuleName = m.group(1) iActionBlock = 1 - nPriority = int(m.group(2)[1:]) if m.group(2) else 4 + nPriority = int(m.group(2)[1:]) if m.group(2) else -1 else: print("Error at rule group: ", sLine, " -- line:", i) break elif re.search("^ +<<- ", sLine) or sLine.startswith(" ") \ or re.search("^ +#", sLine) or re.search(r"^ [-~=>/](?:\d(?::\d+|)|)>> ", sLine) : @@ -344,11 +346,11 @@ # processing rules print(" preparing rules...") for sGraphName, lRuleLine in dAllGraph.items(): lPreparedRule = [] for i, sRuleGroup, sTokenLine, iActionBlock, sActions, nPriority in lRuleLine: - for lRule in createRule(i, sRuleGroup, sTokenLine, iActionBlock, sActions, nPriority, dDef): + for lRule in createRule(i, sRuleGroup, sTokenLine, iActionBlock, sActions, nPriority, dOptPriority, dDef): lPreparedRule.append(lRule) # Graph creation oDARG = darg.DARG(lPreparedRule, sLang) dAllGraph[sGraphName] = oDARG.createGraph() # Debugging Index: gc_lang/fr/rules.grx ================================================================== --- gc_lang/fr/rules.grx +++ gc_lang/fr/rules.grx @@ -2289,20 +2289,10 @@ __[i](p_pseudo_xxx)__ (pseudo-){w_2} @@0 <<- ~1>> * TEST: il n’avait contracté qu’un {{pseudo mariage}}. - -__[i]/tu(tu_préfixe_divers)__ - (anti|auto|arrière|avant|demi|extra|intra|multi|non|post|sans|sous) ({w1}) @@0,$ - <<- spell(\1+"-"+\2) and analyse(\1+"-"+\2, ":", False) and morph(word(-1), ":D", False, not bool(re.search("(?i)^(?:s(?:ans|ous)|non)$", \1))) - ->> \1-\2 # Il manque probablement un trait d’union. - -TEST: il a pris une balle dans l’{{arrière train}}. -TEST: Ce {{sans gêne}} mérite une bonne leçon - - @@@@ @@@@ @@ -2311,15 +2301,29 @@ @@@@GRAPH: graphe1 _ @@@@ @@@@ @@@@ @@@@ + +__tu_préfixe_divers__ + [anti|auto|arrière|avant|demi|extra|intra|multi|post] *WORD + <<- /tu/ analyse_with_next(\1, "-", ":") and morph(<1, ":D|") + ->> \1-\2 # Il manque probablement un trait d’union. + + [non|sans|sous] *WORD + <<- /tu/ analyse_with_next(\1, "-", ":") and morph(<1, ":D") + ->> \1-\2 # Il manque probablement un trait d’union. + +TEST: il a pris une balle dans l’{{arrière train}}. +TEST: Ce {{sans gêne}} mérite une bonne leçon +TEST: Sans gêne, il avança parmi nous. + __tu_mots_composés_verbe_nom__ [attrape|garde|porte|brise|cache|casse|chauffe|contre|coupe|cure|croque|entre|essuie|lance|lave|lève|marque|pare|passe|perce|pèse|porte|poste|pousse|presse|protège|ramasse|serre|taille|tire|tourne|traîne|traine|vide] *WORD - <<- /tu/ not (morph(\1, ":G") and morph(\2, ":[GYB]")) and morph(<1, ":(?:D|V0e)|") and analyse_with_next(\1, "-", ":N") - ->> \1-\2 # Il manque probablement un trait d’union. + <<- /tu/ not (morph(\1, ":G") and morph(\2, ":[GYB]")) and morph(<1, ":(?:D|V0e)|") and analyse_with_next(\1, "-", ":N") + ->> \1-\2 # Il manque probablement un trait d’union. TEST: ce sont des {{lève tard}}. TEST: un {{brise glace}} TEST: entre deux chaises…