【发布时间】: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