考虑以下表达式语法。表达式计算的语义规则在每个语法产生式旁边说明。
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)它检测到 shift-reduce 冲突,并解决冲突以支持 shift 而不是 reduce 动作
(D)它检测 shift-reduce 冲突,并解决冲突,以减少 shift 操作答案: (C)
解释:
背景
yacc 冲突解决是使用以下规则完成的:
当 shift/reduce 冲突时,shift 优于 reduce。
在减少/减少冲突时,首先减少优先于其他减少。
您可以通过构建 LALR(1) 解析表直接回答这个问题,尽管它是一个耗时的过程。为了更快地回答它,人们可以直观地看到这个语法肯定会有一个shift-reduce冲突。在这种情况下,鉴于这是一个单选题,(C)选项将是正确的答案。
万无一失的解释是生成 LALR(1) 解析表,这是一个漫长的过程。一旦我们有了解析表,我们就可以清楚地看到
一世。上面给出的语法中不会出现reduce/reduce冲突
ii. shift/reduce 冲突将通过优先考虑 shift 来解决,从而使表达式计算器具有右关联性。
根据以上结论,似乎唯一正确的选项是(C)。
参考:
http://dinosaur.compilertools.net/yacc/
此解决方案由Vineet Purswani 提供。
这个问题的测验