请考虑以下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?
注–该问题是多项选择题(MSQ)。
(A)可以合并,因为前瞻不同。
(B)可以合并,但会导致SR冲突。
(C)可以合并,但会导致RR冲突。
(D)可以合并,因为c上的goto会导致两个不同的集合。答案: (B) (C)
说明:给定的两个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是终端符号。
选项(B)和(C)是正确的。
这个问题的测验
如果您在以上帖子中发现任何错误,请在下面发表评论