Could someone please explain to me why recursive-descent parsers can't work with a grammar containing left recursion?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
consider:
A ::= A B
the equivalent code is
boolean A() {
if (A()) {
return B();
}
return false;
}
see the infinite recursion?
回答2:
For whoever is interested
A ::= A B | A C | D | E
can be rewritten as:
A ::= (D | E) (B | C)*
The general form of the transformation is: any one of the non left recursive disjuncts followed by any number of the left recursive disjuncts without the first element.
Reforming the action code is a bit trickery but I thing that can be plug-n-chug as well.