删除左递归

Pra*_*rav 7 compiler-construction grammar

以下语法已经离开了递归

E= E+T|T
T= T*F|F
F= a|b|c
Run Code Online (Sandbox Code Playgroud)

如何删除它?它有什么一般程序吗?

pol*_*nts 14

是的,有一般程序,例如维基百科.

E = TE'
E'= (e) | +TE'
T = FT'
T'= (e) | *FT'
F = a | b | c
Run Code Online (Sandbox Code Playgroud)

应该提到这改变的关联性+,并*从左至右.也就是说,在a + b + c解析之前(a + b) + c,它现在被解析为a + (b + c).

这对于加法和乘法来说不是问题,但例如,对于减法和除法来说这将是一个问题.

维基百科文章详细介绍了左递归删除过程及其复杂性.

  • 那么如何解决这个问题呢?(扭转关联性)我看到这个删除左递归算法的许多副本(直接间接),他们总是写关于破坏关联性的警告,但我还没有看到任何此类文章中的任何解决方案.有什么解决方案吗?还是只有问题?另一个问题是:为什么这有效? (4认同)
  • 我问,因为我还没有看到该算法的任何可靠证据.有"证据"表明从转换后的语法中获得的语​​言仍然是相同的,但对我来说,这样的证明中存在错误:假设如果语法生成相同的输出,则它是相同的.因为它不是!它是一种完全不同的语言,因为它有一个不同的解析树,所以它被机器"理解"得不同.将"抽象语法树"解释为"抽象(语法树)"和"(抽象语法)树"之间的区别相同 - 两个不同的东西. (2认同)