Parsing 消除立即左递归

Parsing 消除立即左递归,parsing,recursion,compiler-construction,computation-theory,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⇒特 E'⇒+TE'/T∈ 有人能解释一下这是怎么来的吗?其实这只是遵循算法的问题。让我们看看一般情况。根据算法,以下形式的规则: A => A a1 | ... | A aN | b1 | .. | bN 其中,aa1,…,aan是终端和非终

我理解,为了从包含形式a的结果的语法中消除立即左递归⇒Aα我需要用A代替它⇒βA'和A'⇒αA/∈

我有以下产品,我需要消除立即左递归

E⇒E+T/T

E⇒E+T/T

T⇒T*F/T

F⇒(E) /(id)

我可以看到,在消除后,第一次生产变为

E⇒特

E'⇒+TE'/T∈


有人能解释一下这是怎么来的吗?其实这只是遵循算法的问题。让我们看看一般情况。根据算法,以下形式的规则:

A => A a1 | ... | A aN | b1 | .. | bN
其中,
aa1,…,aan
是终端和非终端的非零左递归序列,
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' => + T E' | epsilon 
定义我们得到的
E'

E' => a1 E' | epsilon
既然
a1
+T
这就变成了

E => T E'
E' => + T E' | epsilon 
因此,你最终得到了语法

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

看起来很像一个问题(可能更适合该网站)。非常感谢您的详细解释:)