考虑以下 LR(1) 文法的两组 LR(1) 项。
X -> c.X, c/d
X -> .cX, c/d
X -> .d, c/d
X -> c.X, $
X -> .cX, $
X -> .d, $
以下哪些与在相应的 LALR 解析器中合并两个集合相关的陈述是错误的?
- 无法合并,因为前瞻不同。
- 可以合并但会导致SR冲突。
- 可以合并但会导致RR冲突。
- 无法合并,因为 c 上的 goto 将导致两个不同的集合。
(A)仅 1 个
(B)仅 2 个
(C)仅 1 和 4
(D) 1、2、3 和 4答案: (D)
说明:给定的两个 LR(1) 项目集是:
X -> c.X, c/d
X -> .cX, c/d
X -> .d, c/d
and
X -> c.X, $
X -> .cX, $
X -> .d, $
逗号后的符号/终结符是 Look-Ahead 符号。
这些是 LR(1)(LR(1) 也称为 CLR(1))项的集合。
LALR(1) 解析器组合了 LR(1) 项集,这些项集在第一个组件方面相同但在第二个组件方面不同。
在 LR(1) 项集 ( A -> B , c ) 的产生式规则中,A->B 是第一个组件,而先行符号集(此处为 c)是第二个组件.
现在我们可以看到在给定的集合中,对应产生式规则的第一个组件在两个集合中是相同的,它们仅在第二个组件(即它们的前瞻符号)上不同,因此我们可以将这些集合组合成一个单一的集合将会 :
X -> c.X, c/d/$
X -> .cX, c/d/$
X -> .d, c/d/$
这样做是为了减少解析器状态的总数。
现在我们可以检查给出的语句。
陈述 1:该陈述是错误的,因为合并已经完成,因为第二个组件,即前瞻不同。
语句 2 :在合并的集合中,我们看不到任何 Shift-Reduce 冲突(因为甚至不可能减少,当存在形式 P -> q. 的产生式时,减少是可能的)
语句 3:在合并的集合中,我们看不到任何 Reduce-Reduce 冲突(原因同上,甚至不可能有任何 reduce,所以没有 RR 冲突的机会)
语句4:这个语句也是错误的,因为goto是带在非终结符上的,而不是终结符上的,而c是终结符。
因此,所有陈述都是错误的,因此选项 D。
这个问题的测验