为什么这个Yacc / bison规则没用?

时间:2017-07-01 03:01:40

标签: parsing bison yacc

%nonassoc ELSE
%nonassoc THEN

我得到了

  

$ bison -dv tiger.yy
  tiger.yy:74.5-28:警告:由于冲突,规则在解析器中无用[-Wother]
     :IF exp THEN exp ELSE exp
       ^^^^^^^^^^^^^^^^^^^^^^^^

但是

%nonassoc THEN
%nonassoc ELSE

规则有效。

这里发生了什么?为什么会这样呢?

1 个答案:

答案 0 :(得分:2)

正如警告所说,该规则毫无用处,因为如果THEN优先于ELSE,则转换/减少冲突的解决方案会导致规则无法应用。

我认为语法实际上包括:

exp: IF exp THEN exp ELSE exp
   | IF exp THEN exp

因为如果ELSE子句是强制性的,则不存在冲突。上面的规则有一个转移/减少冲突,因为当ELSE是解析IF exp THEN IF exp THEN exp ELSE...时的先行标记时,可以转移 ELSE将<{1}}缩小IF exp THEN exp

为了正确解析表达式,有必要支持 shift 操作,以便exp与最里面的ELSE相关联。如果没有优先级声明,那将是默认解析,因为yacc / bison更喜欢转换为reduce。但是,如果bison使用默认分辨率,它还会产生有关分辨率的警告。为避免出现此警告,通常会IF优先于ELSE来强制执行默认解决方案。那就是

THEN

一样。如果以其他顺序编写优先级声明,

%nonassoc THEN
%nonassoc ELSE

然后您将%nonassoc ELSE %nonassoc THEN 优先于THEN,这意味着您正在指示解析器生成器倾向于减少最后一个非终结符ELSE而不是THEN的生成。 Bison / yacc将遵守该请求,但如果它这样做,它永远不会移动ELSE使得包含ELSE的规则无用。

相关问题