Parsing 消除立即左递归
我理解,为了从包含形式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∈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 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
看起来很像一个问题(可能更适合该网站)。非常感谢您的详细解释:)