我正在为DOT语言开发解析器,并且对“ subgraph”语句有疑问。
我没有问题可以使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表达式-它贪婪地将关键字“ subgraph”匹配为NODE_STMT而不是匹配为SUBGRAPH,但是我期望通过使用“ Or”表达式(“ ^”)来选择最长匹配算法SUBGRAPH超过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)
最佳答案
这是因为要在此行中创建SUBGRAPH
对象的副本:
STMT = NODE_STMT("NODE") ^ SUBGRAPH("SUBGRAPH")
调用
setResultsName()
,该调用语法是creates a copy of the ParserElement object的快捷方式。这是一个问题,因为
SUBGRAPH
是一个Forward
对象,并且在代码中尚未完全定义它。您真的不应该一直为所有地方设置名称!在实际需要的时间和地点这样做,并记住它会创建
ParserElement
对象的副本。关于python - 怀疑pyparsing最长匹配错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38258218/