【发布时间】:2009-05-11 09:56:45
【问题描述】:
有人可以向我解释为什么递归下降解析器不能使用包含左递归的语法吗?
【问题讨论】:
有人可以向我解释为什么递归下降解析器不能使用包含左递归的语法吗?
【问题讨论】:
考虑:
A ::= A B
等效代码是
boolean A() {
if (A()) {
return B();
}
return false;
}
看到无限递归了吗?
【讨论】:
给感兴趣的人
A ::= A B | A C | D | E
可以改写为:
A ::= (D | E) (B | C)*
转换的一般形式是:任何一个非左递归析取后跟任意数量的没有第一个元素的左递归析取。
修改动作代码有点棘手,但我也可以即插即用。
【讨论】: