Parsing 间接左递归的消除

Parsing 间接左递归的消除,parsing,recursion,Parsing,Recursion,我在理解如何删除此语法中的左递归的在线解释时遇到问题。我知道如何删除直接递归,但不清楚如何处理间接递归。有人能解释一下吗 A --> B x y | x B --> C D C --> A | c D --> d 我学会这样做的方法是用每个扩展替换一个有问题的非终端符号。在这种情况下,我们首先将B替换为其扩展: A --> B x y | x B --> C D 变成 A --> C x y | D x y | x A --> A x y

我在理解如何删除此语法中的左递归的在线解释时遇到问题。我知道如何删除直接递归,但不清楚如何处理间接递归。有人能解释一下吗

A --> B x y | x 
B --> C D
C --> A | c
D --> d

我学会这样做的方法是用每个扩展替换一个有问题的非终端符号。在这种情况下,我们首先将B替换为其扩展:

A --> B x y | x
B --> C D
变成

A --> C x y | D x y | x
A --> A x y | c x y | D x y | x
现在,我们对非终端符号C执行相同的操作:

A --> C x y | D x y | x
C --> A | c
变成

A --> C x y | D x y | x
A --> A x y | c x y | D x y | x
剩下的唯一语法规则是

D --> d
因此,您也可以进行替换,将整个语法保留为

A --> A x y | c x y | d x y | x
现在没有间接的左递归,因为根本没有间接的

另见


要完全消除左递归(而不仅仅是间接左递归),请从您自己的材料中引入A'符号(此澄清和完成归功于OP):


对naomik评论的回应

是的,语法具有有趣的属性,您可以根据语法规则的约束来描述某些语义功能。有一些转换算法可以处理某些类型的解析问题

在本例中,我们希望删除左递归:语法的一个可取特性是,任何规则的使用都必须使用至少一个输入标记(终端符号)。左递归打开了解析器中无限递归的大门


多年前,我在“计算基础”和“编译器构造”课程中学习了这些东西。我们不会编写语法分析器来适应特定的语法,而是将语法转换为我们想要的语法分析器样式。

如果您的帖子中没有包含特定的解释,我们如何帮助您理解它?请阅读并遵循帮助文档中的发布指南;适用于这里。所以最后的答案应该是A->x A'和A'->xyA'|cxyA'|dxyA'| epsilon?我想我不明白你是如何开始这些步骤的。这些步骤来自我的研究生班“计算基础”,在我们关于消除某些不舒服的语法规则的部分。我现在明白了。。。您需要完全消除左递归,而不仅仅是间接的左递归。是的,你完成了最后一步。我会更新我的答案。好的,谢谢。为什么你的答案和我刚才看到的另一个有这么大的不同?您的解决方案是否更简单?