我正在開發DOT語言的解析器,並遇到「子圖」語句問題。懷疑pyparsing最長匹配錯誤
我沒有問題讓我的SUBGRAPH解析表達式正常工作(請參見下面的片段),但是當我在STMT中添加它作爲替代時它無法匹配。
簡單的測試:
test = '''subgraph cluster01 { n003 ; n004 ; }'''
FRAG_1 = SUBGRAPH + StringEnd()
FRAG_2 = STMT + StringEnd()
res1 = FRAG_1.parseString(test) # OK
res2 = FRAG_2.parseString(test) # ParseException -
錯誤:
subgraph cluster01 { n003 ; n004 ; }
^
ERROR: Expected end of text (at char 9), (line:1, col:10)
我嫌疑這個問題涉及到我的STMT表達 - 它貪婪匹配關鍵字 「子圖」 作爲NODE_STMT而不是匹配爲SUBGRAPH,但是我的期望是通過使用「Or」表達式(「^」),最長匹配算法將選擇SUBGR APH超過NODE_STMT。或者它可能是別的。
我的部分語法低於:
語法片段:
LCURL = Literal("{").suppress()
RCURL = Literal("}").suppress()
STMTSEP = Literal(";").suppress()
ID = Word(alphas, alphanums + "_")
SUBGRAPH_KW = Keyword("subgraph", caseless=True)
SUBGRAPH = Forward("SUBGRAPH")
NODE_ID = ID("NODE_ID")
NODE_STMT = NODE_ID("NODE")
STMT = NODE_STMT("NODE")^SUBGRAPH("SUBGRAPH")
STMT_LIST = ZeroOrMore(STMT("STMT") + Optional(STMTSEP))
SUBGRAPH << Group(SUBGRAPH_KW + ID("SUBGRAPHNAME")) + Group(LCURL + STMT_LIST + RCURL)
太棒了!我將需要考慮ParserElement.setResultName()的正確使用方式實際上是什麼...... – SMagrath
好抓!我還沒有看到這個特殊問題出現在這個特定的表單(結果名稱+前進)之前,肯定需要添加到我的pyparsing陷阱列表中。 – PaulMcG