2009-05-11 213 views

回答

27

考虑:

A ::= A B 

的等同的代码

boolean A() { 
    if (A()) { 
     return B(); 
    } 
    return false; 
} 

看到无限递归?

16

对于任何有兴趣

A ::= A B | A C | D | E 

可以被改写为:

A ::= (D | E) (B | C)* 

变换的一般形式是:后跟任意数量的左侧的非左递归析取项中的任一项没有第一个元素的递归分离。

改革行动代码是有点诡计,但我可以插入n-chug以及。

+0

我第一次看到这种情况,我总是看到建议使用一个新的非终端,通常称为A' – 2009-05-11 20:14:50

+0

那么一些基于BNF的工具不允许()组,因此您最终坚持使用新的规则解决方案。我有点偏向于我提出的形式,因为我的解析器生成器也需要进行动作转换,所以使它在没有新规则的情况下工作会更容易。 – BCS 2009-05-11 20:20:20

+1

这并没有真正回答这个问题。作为评论会更好。 – 2011-01-24 13:10:32