有人可以向我解释为什么递归下降解析器无法使用包含左递归的语法吗?
答案 0 :(得分:30)
考虑:
A ::= A B
等效代码是
boolean A() {
if (A()) {
return B();
}
return false;
}
看到无限递归?
答案 1 :(得分:17)
对于任何有兴趣的人
A ::= A B | A C | D | E
可以改写为:
A ::= (D | E) (B | C)*
转换的一般形式是:任何一个非左递归析取,后跟任意数量的左递归析取而没有第一个元素。
改变动作代码有点诡计,但我的事情也可能是插件。