%nonassoc ELSE
%nonassoc THEN
我得到
$野牛-dv tiger.yy
tiger.yy:74.5-28:警告:规则解析器无用由于冲突[-Wother]
:IF THEN EXP EXP EXP ELSE
^^^^^^^^^^^^^^^^^^^^^^^^
但
%nonassoc THEN
%nonassoc ELSE
该规则起作用。
这是怎么回事?为什么会这样?
%nonassoc ELSE
%nonassoc THEN
我得到
$野牛-dv tiger.yy
tiger.yy:74.5-28:警告:规则解析器无用由于冲突[-Wother]
:IF THEN EXP EXP EXP ELSE
^^^^^^^^^^^^^^^^^^^^^^^^
但
%nonassoc THEN
%nonassoc ELSE
该规则起作用。
这是怎么回事?为什么会这样?
正如警告所说,该规则是无用的,因为如果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 exp
到exp
。
为了正确地解析表达式,有必要以有利于移动作,使得ELSE
将与最内可用IF
相关联。没有优先声明,这将是默认的解决方案,因为yacc/bison更喜欢转换reduce。但是,如果bison使用默认分辨率,它也会产生关于分辨率的警告。为了避免这种警告,通过给予ELSE
优先于THEN
来显式强制默认分辨率是很常见的。这是什么
%nonassoc THEN
%nonassoc ELSE
呢。如果你写的优先级声明中的其他顺序,
%nonassoc ELSE
%nonassoc THEN
然后你给THEN
优先ELSE
,这意味着你指示解析器生成宁愿减少它的最后一个非终端是THEN
在转移ELSE
生产。 Bison/yacc会遵守该请求,但如果这样做,它永远不会移动ELSE
,使包含ELSE
的规则无效。
这是两个解析器之间的唯一区别吗? – DyZ