我正在为DOT语言开发一个解析器,在“子图”语句方面遇到了问题。你知道吗
我没有问题让我的子图解析表达式正常工作(见下面的片段),但是当我在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”作为节点STMT而不是匹配作为子图,但是我的期望是,通过使用“Or”表达式(“^”)最长匹配算法将选择子图而不是节点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
对象的副本:调用
setResultsName()
,调用语法是creates a copy of the ParserElement object的快捷方式。你知道吗这是一个问题,因为
SUBGRAPH
是一个Forward
对象,在代码中它还没有完全定义。你知道吗你真的不应该为每件事,每一个地方,所有的时间定名字!在实际需要的时间和地点这样做,并记住它会创建
ParserElement
对象的副本。你知道吗通常,我建议在将表达式组装成更高级别的表达式之前,不要指定结果名称,如下所示:
但是,当使用
Forward
时,这可能会对您不利,这里就是这样。OP代码中的一个特定错误是我认为OP试图使用results name快捷方式,但实际上创建了一个内容为
Forward
的Literal("SUBGRAPH")
。将此更改为从
Or
表达式中删除结果名称可以解决原来的问题。但我仍然认为这属于“抓住你了”的范畴。你知道吗相关问题 更多 >
编程相关推荐