消除立即左递归

时间:2014-01-21 09:08:05

标签: parsing recursion compiler-construction computation-theory

我理解为了消除包含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∈

有人可以解释一下这是怎么回事

1 个答案:

答案 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'

由于b1T,因此

E => T E'

定义E'我们得到

E' => a1 E' | epsilon

由于a1+ T,因此

E' => + T E' | epsilon 

因此你最终得到了语法

E => T E'
E' => + T E' | epsilon