2017-07-01 66 views
0

为什么这Yacc /野牛规则无用?

%nonassoc ELSE 
%nonassoc THEN 

我得到

$野牛-dv tiger.yy
tiger.yy:74.5-28:警告:规则解析器无用由于冲突[-Wother]
:IF THEN EXP EXP EXP ELSE
^^^^^^^^^^^^^^^^^^^^^^^^

%nonassoc THEN 
%nonassoc ELSE 

该规则起作用。

这是怎么回事?为什么会这样?

+1

这是两个解析器之间的唯一区别吗? – DyZ

回答

1

正如警告所说,该规则是无用的,因为如果THEN优先于ELSE,那么移位/减少冲突的解决方案将无法应用规则。

我猜想语法实际上包括像:

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

因为如果ELSE条款是强制性的,也不会有冲突。上面的规则有一个移位/减少冲突,因为当ELSE处于IF exp THEN IF exp THEN exp ELSE...解析超前记号有可能要么ELSE减少IF exp THEN expexp

为了正确地解析表达式,有必要以有利于动作,使得ELSE将与最内可用IF相关联。没有优先声明,这将是默认的解决方案,因为yacc/bison更喜欢转换reduce。但是,如果bison使用默认分辨率,它也会产生关于分辨率的警告。为了避免这种警告,通过给予ELSE优先于THEN来显式强制默认分辨率是很常见的。这是什么

%nonassoc THEN 
%nonassoc ELSE 

呢。如果你写的优先级声明中的其他顺序,

%nonassoc ELSE 
%nonassoc THEN 

然后你给THEN优先ELSE,这意味着你指示解析器生成宁愿减少它的最后一个非终端是THEN在转移ELSE生产。 Bison/yacc会遵守该请求,但如果这样做,它永远不会移动ELSE,使包含ELSE的规则无效。