sab*_*wal 0 compiler-construction recursion
我正在研究有关“编译器中的左和右递归”的话题,在陈述中我感到困惑
可以使用left递归或right递归来定义任何类型的序列,但是您应该始终使用left递归,因为它可以解析具有有限堆栈空间的任意数量的元素的序列。
但是那不对吗
当生产以自参考开始时,预测分析器将永远陷入循环
M卡在那让我明白,将不胜感激
关于始终首选左递归的声明来自对自下而上的解析器的讨论。有关导致无限循环的左递归的声明来自对自上而下(预测性)解析器的讨论。
这两种说法都是正确的,因为两种解析算法之间存在差异。
自下而上的解析器可以处理左递归或右递归,但是左递归效率更高,因为它不需要堆栈空间。相比之下,自上而下的解析器只能处理正确的递归。
可以使用自上而下的解析器解析的任何语法都可以自下而上地解析,但事实并非如此:许多语法只能自下而上地解析。(除非您允许无限制的超前或等效地回溯,否则在这种情况下,您将无法再保证在线性时间内进行解析。)