@@ -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