我理解为了消除包含A⇒Aα形式的语法的立即左递归,我需要用A⇒βA'和A'⇒αA/∈
替换它我有以下作品,我需要消除立即左递归
E⇒E+ T / T
E⇒E+ T / T
T⇒T* F / T
F⇒(E)/(ID)
我可以看到,在淘汰后,第一次制作变为
E⇒TE'
E'⇒+ TE'/T∈
有人可以解释一下这是怎么回事
答案 0 :(得分:2)
这真的只是遵循算法的问题。我们来看一般情况。根据算法的形式规则:
A => A a1 | ... | A aN | b1 | .. | bN
其中A a1, ..., A aN
是终结符和非终结符的非零左递归序列,而b1, ..., bN
是不以终端A
开头的终端和非终结符的序列。
算法说我们需要用
替换它A => b1 A' | ... | bN A'
A' => a1 A' | ... | aN A' | epsilon
让我们来看看你的情况。我们在这里
E => E + T | T
因此,您可以认为a1
是序列+ T
,因为E + T
是终端和非终结符的左递归序列。同样,您可以将B1
视为T
,因为这是一个非左递归序列。我们现在使用它来定义新的非终结E
:
E => b1 E'
由于b1
为T
,因此
E => T E'
定义E'
我们得到
E' => a1 E' | epsilon
由于a1
为+ T
,因此
E' => + T E' | epsilon
因此你最终得到了语法
E => T E'
E' => + T E' | epsilon