【问题标题】:Eliminating Immediate Left Recursion消除立即左递归
【发布时间】:2014-02-10 18:39:24
【问题描述】:
我知道为了从包含 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∈
谁能解释一下这是怎么回事
【问题讨论】:
标签:
parsing
recursion
compiler-construction
computation-theory
【解决方案1】:
这实际上只是遵循算法的问题。让我们看一下一般情况。根据算法规则的形式:
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