📜  门|门CS 2013 |第 65 题

📅  最后修改于: 2021-09-24 06:07:49             🧑  作者: Mango

考虑以下 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 解析器中合并两个集合相关的陈述是错误的?

  1. 无法合并,因为前瞻不同。
  2. 可以合并但会导致SR冲突。
  3. 可以合并但会导致RR冲突。
  4. 无法合并,因为 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。
这个问题的测验