大门|大门-CS-2005 |问题85

请考虑下面的表达式语法。表达式计算的语义规则在每个语法产品旁边都有说明。

null
 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/

这个解决方案是由 维内特·珀斯瓦尼 . 这个问题的小测验

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享