【发布时间】:2015-10-25 18:23:06
【问题描述】:
去除左递归
E->E+T|E-T|T
T->T*F|T/F|F
对于+和*,我确定应该是
E->TE'
E'->+TE'|(e) (e) is empty string
T->FT'
T'->*FT'|(e)
但是对于-或/,我不知道怎么去掉左递归,我想出了下面的,对-和/合适吗?举个例子,对于加号,a+b = b+a,但对于减号,a - b != b -a。所以如果我们使用下面的右递归,我们会遇到像 a-b 这样的问题吗?
E->TE'
E'->+TE'|-TE'|(e)
T->FT'
T'->*FT'|/FT'|(e)
有人知道编译器向我解释吗?提前谢谢。
【问题讨论】:
-
4-3是什么意思?你有解释这个语法的解释器吗?它返回-1而不是1?问题可能不是语法的一部分,而是解释器的一部分。如果是这样,那么您应该提供有关解析器生成器和解释器代码的更多信息。 -
我想你的意思是
T->T*F|T/F|F(而不是E/T) -
@rici 是的,我就是这个意思
-
@CoronA 这与解释器无关。我编辑了我的问题。
-
不清楚您的问题是什么——是的,您展示的最终语法是初始语法的正确左分解。它可以解析
+、-、*或/,就像原始语法一样,并识别完全相同的语言。显然,任何给定输入的解析树都会有所不同。
标签: compiler-construction grammar left-recursion