带
%nonassoc ELSE
%nonassoc THEN
我得到了
$ bison -dv tiger.yy
tiger.yy:74.5-28:警告:由于冲突,规则在解析器中无用[-Wother]
:IF exp THEN exp ELSE exp
^^^^^^^^^^^^^^^^^^^^^^^^
但是
%nonassoc THEN
%nonassoc ELSE
规则有效。
这里发生了什么?为什么会这样呢?
答案 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
的规则无用。