Parsing 为什么右递归语法不适合自底向上LR(k)解析? 为什么右递归语法不适合自底向上LR(k)解析

Parsing 为什么右递归语法不适合自底向上LR(k)解析? 为什么右递归语法不适合自底向上LR(k)解析,parsing,recursion,context-free-grammar,Parsing,Recursion,Context Free Grammar,我知道自下而上的解析从叶子开始,一直到根节点,而自上而下的解析从根节点开始,一直到根节点。我对这些问题做了一些研究,了解了如何修改它们,但无法直接回答为什么这样做不起作用。感谢您的帮助。[OP将问题标题从“为什么不能…被使用”改为“为什么不合适…”,这反过来又将我的评论变成了答案,因此我将其作为一个答案发布。] 您可以将左递归规则或右递归规则用于任何LR(k)解析算法 如果要构建树,正确的递归规则会导致解析过程的一个有趣特性:必须保持堆栈与正确的递归一样深,以跟踪收集的节点 人们会给你一个列表中

我知道自下而上的解析从叶子开始,一直到根节点,而自上而下的解析从根节点开始,一直到根节点。我对这些问题做了一些研究,了解了如何修改它们,但无法直接回答为什么这样做不起作用。感谢您的帮助。

[OP将问题标题从“为什么不能…被使用”改为“为什么不合适…”,这反过来又将我的评论变成了答案,因此我将其作为一个答案发布。]


您可以将左递归规则或右递归规则用于任何LR(k)解析算法

如果要构建树,正确的递归规则会导致解析过程的一个有趣特性:必须保持堆栈与正确的递归一样深,以跟踪收集的节点

人们会给你一个列表中包含一百万项的源文件,所以你的堆栈一定很深。如果使用正确的递归规则,这可能足够深,因此如果堆栈大小固定,则会耗尽空间

通常,解析器堆栈是使用处理器的自然下推堆栈实现的。我们的通用操作系统(Windows、Linux)和它们的通用编译器恰好为您提供了支持,因此在某种意义上,它们加剧了这个问题


使用左递归规则,可以减少每个列表项之后的值,这样堆栈基本上可以是单位深度。更友好的是:不会崩溃,并且可以很好地使用缓存。

谁说正确的递归语法不适合LR(k)解析?“他们工作得很好。”显然我是我的教授。我正在完成考试复习,这是其中一个问题。我有点困惑,因为以前在课堂上从来没有提到过它,在我的教科书或powerpoints中也没有发现与之相关的内容。你可以在任何LR(k)解析算法中使用左递归或右递归规则。如果您要构建树,右递归有一个有趣的特性:您必须保持与右递归一样深的堆栈来跟踪收集的节点。人们会给你一个列表中包含一百万项的源文件,所以你的堆栈一定很深。使用左递归规则,您可以在每一步之后减少,堆栈基本上可以是单位深度。因此,您可以使用任何一种规则。正确的方法可以深入;因此,拥有固定大小堆栈的人有时会耗尽资源。。。。所以你的教授可能会告诉你一些很深的东西,也可能是愚蠢的。没有理由很难说。@IraBaxter我给他发了电子邮件,他基本上证实了你说的话。实际上,您可以使用右递归语法和LR(k)解析算法,但他寻找的答案是堆栈深度部分。他基本上重申了您所说的必须构建与正确递归一样深的堆栈,理论上这可能是无限的。谢谢你的意见,非常感谢。