在很多地方(例如在这个答案中here https://stackoverflow.com/a/8496838/7571421),我看到有人说 LR(0) 语法不能包含 ε 产生式。
Also in 维基百科 https://en.wikipedia.org/wiki/LL_grammar我见过这样的说法: ε 自由 LL(1) 语法也是 SLR(1)。
现在我面临的问题是我无法推理出这些陈述背后的逻辑。
好吧,我知道 LR(0) 语法通过空堆栈接受 DPDA 接受的语言,即它们接受的语言必须具有前缀属性。 [但是,如果我们假设结束标记,则可以处理此前缀属性,因此给定任何语言,前缀属性应始终得到满足。许多文字如计算理论 by Sipser假设这个结束标记只是他们的论点]。话虽这么说,我们可以(非正式地?)说,如果 LR(0) 项的规范集合中不存在具有移位归约冲突或归约-归约冲突的状态,则语法是 LR(0)。
在此背景下,我尝试考虑以下语法:
S -> Aa
A -> ε
LR(0) 项目的规范集合
在上面的DFA中,我发现没有任何状态存在移位-归约冲突或归约-归约冲突。
所以根据我的分析,这个语法应该是LR(0)。但它也有 ε 的产生。
这个例子是不是与下面的说法相矛盾:
“没有带有 ε 产生式的文法可以是 LR(0)”
我想如果我知道上面引用的陈述背后的逻辑,那么我就能更好地理解这个概念。
实际上我的主要问题是由以下声明引起的:
ε 自由 LL(1) 文法也是 SLR(1)。
当我问我的一位朋友时,他给出了这样的论点:由于 LL(1) 文法是 ε 自由的,因此它是 LR(0),因此它是 SLR(1)。
但我也无法理解他的逻辑。当我问他有关推理的问题时,他开始分享有关“ε 产生式的语法永远不可能是 LR(0)”的帖子......
但就我个人而言,我无法想到“ε free LL(1) 语法如何是 SLR(1)”的任何逻辑。它真的与上面的“带有ε产生式的文法不能是LR(0)”的性质有关吗?如果是这样,请帮助我。如果不是,那么我是否应该考虑针对第二个困惑提出一个单独的问题?
我的编译器设计概念仅来自乌尔曼的《龙》一书。还有来自 Ullman 和其他一些文本(如 Sipser、Linz)的 TOC 知识。