繁体   English   中英

消除立即左递归

[英]Eliminating Immediate Left Recursion

我知道为了从包含 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∈

有人能解释一下这是怎么来的吗

这实际上只是遵循算法的问题。 让我们看一下一般情况。 根据算法的形式规则:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM