2014-05-02 71 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