📜  门| GATE-CS-2005 |第85章

📅  最后修改于: 2021-06-29 21:09:15             🧑  作者: Mango

考虑以下表达语法。用于表达计算的语义规则在每个语法产生的旁边都有说明。

E → number      E.val = number. val
    | E '+' E      E(1).val = E(2).val + E(3).val
    | E '×' E     E(1).val = E(2).val × E(3).val

上面的语法和语义规则被馈送到yacc工具(这是一种LALR(1)解析器生成器),用于解析和评估算术表达式。关于给定语法的yacc的作用,下列哪一项是正确的?
(A)它检测递归并消除递归
(B)检测减少-减少冲突,并解决
(C)它检测移位-减少冲突,并解决冲突,而有利于通过移位而不是减少动作
(D)它检测到班次减少冲突,并解决了冲突,有利于减少班次答案: (C)
解释:

背景
yacc冲突解决使用以下规则完成:
移位/减少冲突时,移位优先于减少。
在减少/减少冲突的同时,优先使用首个reduce优先于其他方法。

您可以通过构造LALR(1)解析表来直接回答此问题,尽管过程很耗时。为了更快地回答它,人们可以直观地看到这种语法肯定会产生移位-减少冲突。在这种情况下,鉴于这是一个单选题,(C)选项将是正确的答案。

愚蠢的解释是生成LALR(1)解析表,这是一个漫长的过程。一旦有了解析表,我们就可以清楚地看到
一世。在上面给定的语法中不会出现reduce / reduce冲突
ii。移位/减少冲突将通过优先考虑移位来解决,从而使表达式计算器具有正确的关联性。

根据以上结论,似乎只有正确的选择是(C)。

参考:

http://dinosaur.compilertools.net/yacc/

此解决方案由Vineet Purswani提供
这个问题的测验