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

时间:2019-04-06 16:16:43

标签: recursion compiler-construction

我正在研究有关“编译器中的左右递归”的话题,在该陈述中我感到困惑

可以使用左递归或右递归来定义任何类型的序列,但是您应始终使用左递归,因为它可以解析具有有限堆栈空间的任意数量的元素的序列。 < / p>

但那不对吗

  

当制作以自我参考开始时,则使用预测解析器   永远陷入循环

我被困在那里,让我明确表示感谢

1 个答案:

答案 0 :(得分:5)

关于始终首选左递归的声明来自对自下而上的解析器的讨论。有关导致递归循环的左递归的声明来自对自上而下(预测性)解析器的讨论。

两个语句都是正确的,因为两种解析算法之间存在差异。

自下而上的解析器可以处理左递归或右递归,但是左递归效率更高,因为它不需要堆栈空间。相比之下,自上而下的解析器只能处理正确的递归。

可以使用自上而下的解析器解析的任何语法都可以自下而上地解析,但事实并非如此:许多语法只能自下而上地解析。 (除非您允许无限的前瞻或等效地回溯,否则您将不能再保证在线性时间内进行解析。)