请考虑下面的表达式语法。表达式计算的语义规则在每个语法产品旁边都有说明。
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) 它检测换档-减少冲突,并以减少而不是换档操作的方式解决冲突 答复: (C) 说明:
出身背景 yacc冲突解决使用以下规则完成: 在转移/减少冲突时,转移优先于减少。 首先,减少冲突比其他冲突更可取。
您可以通过构造LALR(1)解析表直接回答这个问题,尽管这是一个耗时的过程。为了更快地回答这个问题,我们可以直观地看到,这种语法肯定会发生变化,减少冲突。在这种情况下,鉴于这是一个单一选择的问题,(C)选项将是正确的答案。
简单的解释是生成LALR(1)解析表,这是一个漫长的过程。一旦我们有了解析表,我们就可以清楚地看到这一点 i、 上述语法中不会出现reduce/reduce冲突 二、shift/reduce冲突将通过优先选择shift来解决,从而使表达式计算器具有正确的关联性。
根据以上结论,唯一正确的选择似乎是(C)。
参考:
http://dinosaur.compilertools.net/yacc/
这个解决方案是由 维内特·珀斯瓦尼 . 这个问题的小测验