我正在研究有关“编译器中的左右递归”的话题,在该陈述中我感到困惑
可以使用左递归或右递归来定义任何类型的序列,但是您应始终使用左递归,因为它可以解析具有有限堆栈空间的任意数量的元素的序列。 < / p>
但那不对吗
当制作以自我参考开始时,则使用预测解析器 永远陷入循环
我被困在那里,让我明确表示感谢
答案 0 :(得分:5)
关于始终首选左递归的声明来自对自下而上的解析器的讨论。有关导致递归循环的左递归的声明来自对自上而下(预测性)解析器的讨论。
两个语句都是正确的,因为两种解析算法之间存在差异。
自下而上的解析器可以处理左递归或右递归,但是左递归效率更高,因为它不需要堆栈空间。相比之下,自上而下的解析器只能处理正确的递归。
可以使用自上而下的解析器解析的任何语法都可以自下而上地解析,但事实并非如此:许多语法只能自下而上地解析。 (除非您允许无限的前瞻或等效地回溯,否则您将不能再保证在线性时间内进行解析。)