消除左递归

时间:2014-09-29 15:42:37

标签: grammar left-recursion

我正在尝试从后续语法中删除左递归:

S -> id = E
S -> id [ E ] = E
E -> E [ E ]
E -> id

我尝试按照https://en.wikipedia.org/wiki/Left_recursion提供的左递归删除算法,但E -> E [ E ]行给了我问题,应该如何处理? 我不想得到一个完整的解决方案,只是一些提示,所以我可以真正了解它是如何工作的。

到目前为止我所尝试的是:

E -> E [ E ]
E -> id

变为:

E -> id E'
E' -> [ E ] E'

哪个不对。我甚至在这里走在正确的轨道上吗?

1 个答案:

答案 0 :(得分:4)

按照您链接的算法,您需要A - > Aα| β,你有

E -> E [ E ] | id

所以A是E,α是[ E ],β是id。去除左递归的结果是A - > βA'和A' - > ε| αA',所以你得到规则:

E -> id E'
E' -> ε | [ E ] E'

所以看起来你得到了正确的结果,你只是省略了E' - > ε规则......