我正在尝试从后续语法中删除左递归:
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'
哪个不对。我甚至在这里走在正确的轨道上吗?
答案 0 :(得分:4)
按照您链接的算法,您需要A - > Aα| β,你有
E -> E [ E ] | id
所以A是E
,α是[ E ]
,β是id
。去除左递归的结果是A - > βA'和A' - > ε| αA',所以你得到规则:
E -> id E'
E' -> ε | [ E ] E'
所以看起来你得到了正确的结果,你只是省略了E' - > ε规则......