Overview
Comment: | [build] code cleaning (pylint) |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk | build |
Files: | files | file ages | folders |
SHA3-256: |
1d0bea98d68122087f66946fac72ed4f |
User & Date: | olr on 2019-05-11 12:47:37 |
Other Links: | manifest | tags |
Context
2019-05-11
| ||
12:52 | [build] code cleaning (pylint) check-in: 1e6121ef2b user: olr tags: trunk, build | |
12:47 | [build] code cleaning (pylint) check-in: 1d0bea98d6 user: olr tags: trunk, build | |
12:06 | [build] code cleaning (pylint) check-in: b508963a37 user: olr tags: trunk, build | |
Changes
Modified compile_rules_graph.py from [871ed3780f] to [0b0b0ccb6f].
1 2 3 4 5 6 | """ Grammalecte: compile rules Create a Direct Acyclic Rule Graphs (DARGs) """ import re | < < | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | """ Grammalecte: compile rules Create a Direct Acyclic Rule Graphs (DARGs) """ import re import darg import compile_rules_js_convert as jsconv dACTIONS = {} dFUNCTIONS = {} dFUNCNAME = {} def createFunction (sType, sCode, bStartWithEqual=False): "create a function (stored in <dFUNCTIONS>) and return function name" sCode = prepareFunction(sCode) if sType not in dFUNCNAME: dFUNCNAME[sType] = {} if sCode not in dFUNCNAME[sType]: dFUNCNAME[sType][sCode] = len(dFUNCNAME[sType])+1 sFuncName = "_g_" + sType + "_" + str(dFUNCNAME[sType][sCode]) dFUNCTIONS[sFuncName] = sCode return sFuncName if not bStartWithEqual else "="+sFuncName def storeAction (sActionId, aAction): "store <aAction> in <dACTIONS> avoiding duplicates" nVar = 0 while True: sActionName = sActionId + "_" + str(nVar) if sActionName not in dACTIONS: dACTIONS[sActionName] = aAction return sActionName if aAction == dACTIONS[sActionName]: return sActionName nVar += 1 def prepareFunction (sCode): "convert simple rule syntax to a string of Python code" if sCode[0:1] == "=": |
︙ | ︙ | |||
74 75 76 77 78 79 80 | sCode = re.sub(r"<1", 'lToken[nTokenOffset]["sValue"]', sCode) return sCode def genTokenLines (sTokenLine, dDef): "tokenize a string and return a list of lines of tokens" lToken = sTokenLine.split() | | | 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | sCode = re.sub(r"<1", 'lToken[nTokenOffset]["sValue"]', sCode) return sCode def genTokenLines (sTokenLine, dDef): "tokenize a string and return a list of lines of tokens" lToken = sTokenLine.split() lTokenLines = [] for sToken in lToken: # replace merger characters by spaces if "␣" in sToken: sToken = sToken.replace("␣", " ") # optional token? bNullPossible = sToken.startswith("?") and sToken.endswith("¿") if bNullPossible: |
︙ | ︙ | |||
213 214 215 216 217 218 219 | print(" # Error. No action found at: ", sActionId) return None # Condition sCondition = sAction[:m.start()].strip() if sCondition: sCondition = changeReferenceToken(sCondition, dPos) | | | | 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 | print(" # Error. No action found at: ", sActionId) return None # Condition sCondition = sAction[:m.start()].strip() if sCondition: sCondition = changeReferenceToken(sCondition, dPos) sCondition = createFunction("cond", sCondition) else: sCondition = "" # Case sensitivity bCaseSensitivity = not bool(m.group("casing")) # Action cAction = m.group("action") sAction = sAction[m.end():].strip() sAction = changeReferenceToken(sAction, dPos) # target cStartLimit = "<" |
︙ | ︙ | |||
244 245 246 247 248 249 250 | if not m.group("end"): iEndAction = iStartAction else: if m.group("end").startswith(":."): cEndLimit = "<" iEndAction = int(m.group("end").lstrip(":.")) if dPos and m.group("start"): | < | | | < < < < | 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 | if not m.group("end"): iEndAction = iStartAction else: if m.group("end").startswith(":."): cEndLimit = "<" iEndAction = int(m.group("end").lstrip(":.")) if dPos and m.group("start"): iStartAction = dPos.get(iStartAction, iStartAction) if iEndAction: iEndAction = dPos.get(iEndAction, iEndAction) if iStartAction < 0: iStartAction += 1 if iEndAction < 0: iEndAction += 1 if cAction == "-": ## error |
︙ | ︙ | |||
274 275 276 277 278 279 280 | sURL = "" mURL = re.search("[|] *(https?://.*)", sMsg) if mURL: sURL = mURL.group(1).strip() sMsg = sMsg[:mURL.start(0)].strip() checkTokenNumbers(sMsg, sActionId, nToken) if sMsg[0:1] == "=": | | | | | | | | < | | | 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 | sURL = "" mURL = re.search("[|] *(https?://.*)", sMsg) if mURL: sURL = mURL.group(1).strip() sMsg = sMsg[:mURL.start(0)].strip() checkTokenNumbers(sMsg, sActionId, nToken) if sMsg[0:1] == "=": sMsg = createFunction("msg", sMsg, True) else: checkIfThereIsCode(sMsg, sActionId) # checking consistancy checkTokenNumbers(sAction, sActionId, nToken) if cAction == ">": ## no action, break loop if condition is False return [sOption, sCondition, cAction, ""] if not sAction and cAction != "%": print("# Error in action at line " + sActionId + ": This action is empty.") if sAction[0:1] != "=" and cAction != "=": checkIfThereIsCode(sAction, sActionId) if cAction == "-": ## error detected --> suggestion if sAction[0:1] == "=": sAction = createFunction("sugg", sAction, True) elif sAction.startswith('"') and sAction.endswith('"'): sAction = sAction[1:-1] if not sMsg: print("# Error in action at line " + sActionId + ": The message is empty.") return [sOption, sCondition, cAction, sAction, iStartAction, iEndAction, cStartLimit, cEndLimit, bCaseSensitivity, nPriority, sMsg, sURL] if cAction == "~": ## text processor if sAction[0:1] == "=": sAction = createFunction("tp", sAction, True) elif sAction.startswith('"') and sAction.endswith('"'): sAction = sAction[1:-1] return [sOption, sCondition, cAction, sAction, iStartAction, iEndAction, bCaseSensitivity] if cAction in "%/": ## tags return [sOption, sCondition, cAction, sAction, iStartAction, iEndAction] if cAction == "=": ## disambiguator if "define(" in sAction and not re.search(r"define\(\\-?\d+ *, *\[.*\] *\)", sAction): print("# Error in action at line " + sActionId + ": second argument for <define> must be a list of strings") sAction = createFunction("da", sAction) return [sOption, sCondition, cAction, sAction] print(" # Unknown action.", sActionId) return None def make (lRule, dDef, sLang, dOptPriority): "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 |
︙ | ︙ | |||
403 404 405 406 407 408 409 | # processing rules print(" preparing rules...") for sGraphName, lRuleLine in dAllGraph.items(): print("{:>8,} rules in {:<24} ".format(len(lRuleLine), "<"+sGraphName+">"), end="") lPreparedRule = [] for i, sRuleGroup, sTokenLine, iActionBlock, sActions, nPriority in lRuleLine: | | | | 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 | # processing rules print(" preparing rules...") for sGraphName, lRuleLine in dAllGraph.items(): print("{:>8,} rules in {:<24} ".format(len(lRuleLine), "<"+sGraphName+">"), end="") lPreparedRule = [] for i, sRuleGroup, sTokenLine, iActionBlock, sActions, nPriority in lRuleLine: for aRule in createRule(i, sRuleGroup, sTokenLine, iActionBlock, sActions, nPriority, dOptPriority, dDef): lPreparedRule.append(aRule) # Graph creation oDARG = darg.DARG(lPreparedRule, sLang) dAllGraph[sGraphName] = oDARG.createGraph() # Debugging if False: print("\nRULES:") for e in lPreparedRule: |
︙ | ︙ |