📜  门| GATE CS 2013 |第65章

📅  最后修改于: 2021-06-29 01:20:56             🧑  作者: 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解析器中的两个集合有关的以下哪些陈述是FALSE?

  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, $ 

逗号后的符号/端子是预读符号。

这些是LR(1)的集合(LR(1)也称为CLR(1))项。

LALR(1)解析器将LR(1)项的集合组合在一起,它们的第一个组成部分相同,而第二个组成部分则不同。

在LR(1)项集的生产规则中,(A-> B,c),A-> B是第一个组件,而符号的Look-Ahead集在这里是c,是第二个组件。

现在我们可以看到,在给定的集合中,两个集合中对应的生产规则的第一个组成部分是相同的,并且它们在第二个组成部分(即,它们的前瞻符号)不同,因此我们可以将这些集合组合为一个集合,将会 :

X -> c.X, c/d/$
X -> .cX, c/d/$
X -> .d, c/d/$

这样做是为了减少解析器状态的总数。

现在我们可以检查给出的语句。

陈述1:该陈述是错误的,因为合并已经完成,因为第二个组件(即前瞻)不同。

语句2:在合并的集合中,我们看不到Shift-Reduce冲突(因为甚至无法进行归约,所以当存在形式为P-> q的生成时,归约是有可能的)

陈述3:在合并的集合中,我们看不到任何Reduce-Reduce冲突(与上述相同的原因,甚至没有还原的可能,因此没有RR冲突的机会)

语句4:此语句也是错误的,因为goto承载在Non-Terminals符号上,而不是在终端符号上,并且c是终端符号。

因此,所有陈述都是错误的,因此是选项D。
这个问题的测验