我们应该使用哪种类型的递归? (讨论)

which type of recursion should we use? (discussion)

我正在研究关于 "left and right recursion in compiler " 的话题,我在陈述中感到困惑

任何类型的序列都可以使用左递归或右递归来定义,但您应该始终使用左递归,因为它可以解析具有有界堆栈的任意数量元素的序列space.

但是

不是吗

When a production starts with a self reference then predictive parser stuck in a loop forever

M卡在那里让我说清楚不胜感激

关于始终首选左递归的说法来自关于自底向上解析器的讨论。关于左递归导致无限循环的说法来自关于自上而下(预测)解析器的讨论。

两种说法都是正确的,因为两种解析算法是有区别的。

自下而上的解析器可以处理左递归或右递归,但左递归效率稍微高一些,因为它不需要堆栈 space。相比之下,自上而下的解析器只能处理右递归。

任何可以用自上而下解析器解析的文法都可以自下而上解析,但反之则不然:许多文法只能自下而上解析。 (除非你允许无限​​制的先行或回溯,在这种情况下你不能再保证在线性时间内解析。)