2014-05-02 70 views
2

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

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

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

在pyparser:

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

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

所以,在declarationPart,变量可以出现在变量和模式。按照上面的顺序,我没有递归问题,但'平等'没有被检测到,只有变量被解析。当我把'变量'作为第二项时,我确实有无限递归。

模式规则被简化 - 我确实需要分开。

我能理解失效机理,但我不知道这是一个语言的定义问题,或者如果我忽略了语法的东西...

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

回答

0

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

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

,然后用萎靡不振最终非法结构是应对意外在语义分析阶段被这个语法所接受。

+0

感谢您的回复!问题是这两个规则都是单独需要的。它们是完整语言定义的一部分,可能约有50条规则,并且它们已被分离以改进结构。 – jcoppens