2009-05-11 148 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