Epsilon(ε) 产生式和 LR(0) 文法和 LL(1) 文法

Epsilon(ε) productions and LR(0) grammars and LL(1) grammars

在很多地方(例如在这个答案here中),我看到写的是LR(0)文法不能包含ε产生式。

我也在 Wikipedia 中看到这样的陈述:一个 ε 自由 LL(1) 文法也是 SLR(1)。


现在我面临的问题是我无法推理出这些语句背后的逻辑。

好吧,我知道 LR(0) 文法通过空堆栈接受 DPDA 接受的语言,即它们接受的语言必须有前缀 属性。 [但是,如果我们假设结束标记,则可以处理此前缀 属性,因此给定任何语言,前缀 属性 应始终得到满足。许多文本,例如 SipserTheory of Computation,都假设这个结束标记只是他们的论点]。话虽这么说,我们可以说(非正式地?)如果在 LR(0) 项的规范集合中没有具有移位-归约冲突或归约-归约冲突的状态,则语法是 LR(0)。

在此背景下,我尝试考虑以下语法:

S -> Aa
A -> ε

LR(0) 项的规范集合

在上面的DFA中,我发现没有任何状态存在shift-reduce冲突或reduce-reduce冲突。

所以根据我的分析,这个文法应该是 LR(0)。但它也有ε生产。

这个例子是不是与以下说法相矛盾:

"no grammar with ε productions can be LR(0)"

我想如果我知道上面引用的语句背后的逻辑,那么我可以更好地理解这个概念。


实际上我的主要问题出现在声明中:

An ε free LL(1) grammar is also SLR(1).

当我问我的一位朋友时,他给出的论点是,由于 LL(1) 文法是 ε 自由的,因此它是 LR(0),因此它是 SLR(1)。

但我也无法理解他的逻辑。当我问他关于推理的问题时,他开始分享 post 关于“ε 产生式的语法永远不会是 LR(0)”...

但我个人想不出任何关于“ε free LL(1) 文法是 SLR(1)”的逻辑。真的和上面属性的“带ε产生式的文法不能是LR(0)”有关系吗?如果是,请帮帮我。如果不是,那我是否应该考虑针对第二个困惑单独提出一个问题?


我的编译器设计概念都是从Ullman的dragon book上得到的。还有来自 Ullman 和 Sipser、Linz 等少数其他文本的 TOC 知识。

你语法的一个显着特点是 A 可以被删除。它绝对没有任何用处。 (通过“消除”,我的意思是简单地删除所有对它的引用;保留作品,否则完好无损。)

的确,它的存在并不排除语法是 LR(0)。类似地,具有不可到达的非终结符和该非终结符的 ε-产生式的文法也可以是 LR(0)。

因此,如果文法具有 生产性 非终结符,同时具有 ε-产生式和一​​些其他 生产生产。但是由于我们通常只考虑没有无意义的非终结符的简化语法,我不确定这种额外的迂腐有多大用处。


关于你关于 ε-free LL(1) 文法的问题,这里有一个粗略的概述:

如果 ε-free 文法不是 LR(0),则存在具有移位和归约动作的状态。由于文法是 ε-free 的,该状态是通过 shift 或 goto 到达的。之前的状态必须有两个不同的产品具有相同的第一个集合,与 LL(1) 条件相矛盾。