【问题标题】: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'

由于b1T,这就变成了

E => T E'

定义E' 我们得到

E' => a1 E' | epsilon

由于a1+ T,这就变成了

E' => + T E' | epsilon 

这样你就得到了语法

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

【讨论】:

  • 非常感谢您的详细解释:)
猜你喜欢
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
相关资源
最近更新 更多