语法 - 无限递归

时间:2014-05-02 15:25:42

标签: parsing pyparsing

在尝试定义oz语言的官方语法时,我遇到了无限递归。我把它缩小了(我认为)这些规则:

<declarationPart> ::= <variable> | <pattern> '=' <expression> | <statement>

<pattern> ::= ['!'] <variable>

在pyparser中:

pattern             = Forward()
pattern     << (Optional(exclam_tkn) + variable)

declarationPart = ( variable \
            | (pattern + equal + expression) \
            | statement)

因此,在declarationPart中,变量可以出现在变量和模式中。按照上面的顺序,我没有递归问题,但没有检测到“相等”,只解析了变量。当我把'variable'作为第二个条目时,我确实有无限递归。

简化了模式规则 - 我确实需要单独使用它。

我可以理解失败机制,但我不知道这是否是语言定义问题,或者我是否忽略了语法中的某些内容......

如何使这项工作?或者建议调试解析过程?

1 个答案:

答案 0 :(得分:0)

我特别不熟悉pyparsing,但对于一般的解析目的,我可能只是将两个规则合并为一个,就像这样

<declarationPart> ::= ['!'] <variable> [ '=' <expression> ] | <statement>

然后处理标记在语义分析阶段被该语法意外接受的最终非法构造。