【问题标题】:Elimination left recursion for E := EE+|EE-|id消除 E := EE+|EE-|id 的左递归
【发布时间】:2009-10-25 13:32:03
【问题描述】:

以下文法如何消除左递归?

E := EE+|EE-|id

使用通用程序:

A := Aa|b

翻译为:

A := b|A'
A' := ϵ| Aa 

将此应用于我们得到的原始语法:

A = E, a = (E+|E-) and b = id

因此:

E := id|E'
E' := ϵ|E(E+|E-)

但这个语法似乎不正确,因为

ϵE+ -> ϵ id +

将是有效的 但这是一个不正确的后缀表达式。

【问题讨论】:

  • 你也许应该提到e 真的是ϵ。反正骗了我。
  • 您的“翻译为”定义存在问题:您引入了一个未定义的术语“e”。您可能可以通过将原始文件重新组合为“E := (EE(+|-))|id”来做一些事情。您的最后评论“那是一个不正确的后缀表达式”有点笼统;为什么'e id +'不正确?它看起来像'push e;推送ID;评估 +' 这通常是可以的。
  • @Konrad: 啊 - 'e' 是空的?...这很重要。
  • 不确定如何输入 epsilon。 :)
  • @Absolute0:没问题 - 只要你解释你使用的符号。

标签: parsing compiler-construction grammar context-free-grammar lexical-analysis


【解决方案1】:

您的“通用程序”被引用错误。取自龙书:

A := Aα | β

变成

A  := βA′
A′ := αA′ | ϵ

…产生:

E  := id E′
E′ := (E + | E -) E′ | ϵ

【讨论】:

  • 如何输入数学符号??
  • Absolute0:简单的技巧:我使用字符表。我在 OS X 上,它有一个工具。在 Windows 上,您可以使用隐藏在“附件”主菜单中的 charmap.exe(但必须切换到 Unicode)。
猜你喜欢
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 2011-02-08
相关资源
最近更新 更多