在尝试定义oz语言的官方语法时,我遇到了无限递归。我把它缩小了(我认为)这些规则:
<declarationPart> ::= <variable> | <pattern> '=' <expression> | <statement>
<pattern> ::= ['!'] <variable>
在pyparser中:
pattern = Forward()
pattern << (Optional(exclam_tkn) + variable)
declarationPart = ( variable \
| (pattern + equal + expression) \
| statement)
因此,在declarationPart中,变量可以出现在变量和模式中。按照上面的顺序,我没有递归问题,但没有检测到“相等”,只解析了变量。当我把'variable'作为第二个条目时,我确实有无限递归。
简化了模式规则 - 我确实需要单独使用它。
我可以理解失败机制,但我不知道这是否是语言定义问题,或者我是否忽略了语法中的某些内容......
如何使这项工作?或者建议调试解析过程?
答案 0 :(得分:0)
我特别不熟悉pyparsing
,但对于一般的解析目的,我可能只是将两个规则合并为一个,就像这样
<declarationPart> ::= ['!'] <variable> [ '=' <expression> ] | <statement>
然后处理标记在语义分析阶段被该语法意外接受的最终非法构造。