Parsing 为什么Yacc/野牛规则毫无用处?

Parsing 为什么Yacc/野牛规则毫无用处?,parsing,bison,yacc,Parsing,Bison,Yacc,与 我明白了 $bison-dv tiger.yy tiger.yy:74.5-28:警告:由于冲突,规则在解析器中无效[-Wother] :IF exp然后exp ELSE exp ^^^^^^^^^^^^^^^^^^^^^^^^ 但是 %nonassoc ELSE %nonassoc THEN 这条规则有效 这是怎么回事?为什么会出现这种情况?正如警告所说,该规则是无用的,因为如果那么优先于其他,那么移位/减少冲突的解决方案就无法应用该规则 我认为语法实际上包括如下内容: %nonasso

我明白了

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

但是

%nonassoc ELSE
%nonassoc THEN
这条规则有效


这是怎么回事?为什么会出现这种情况?

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

我认为语法实际上包括如下内容:

%nonassoc THEN
%nonassoc ELSE
因为如果
ELSE
子句是强制性的,就不会有冲突。上述规则存在移位/减少冲突,因为当
ELSE
是解析
IF-exp-THEN IF-exp-THEN exp-ELSE…
时的先行标记时,可以移位
ELSE
将内部
IF-exp-THEN exp
还原为
exp

为了正确解析表达式,必须支持shift操作,以便
ELSE
将与最里面的可用
IF
关联。如果没有优先级声明,这将是默认的解决方案,因为yacc/bison更喜欢shift而不是reduce。但是,如果bison使用默认分辨率,它也会生成有关分辨率的警告。为了避免警告,通常会通过赋予
ELSE
优先于
THEN
来明确强制默认解析。那是什么

exp: IF exp THEN exp ELSE exp
   | IF exp THEN exp
是的。如果以其他顺序编写优先级声明

%nonassoc THEN
%nonassoc ELSE

然后给
then
优先于
ELSE
,这意味着您指示解析器生成器减少最后一个非终结符为
then
的生成,而不是移位
ELSE
。Bison/yacc将遵守该请求,但如果它这样做,它将永远无法移动
ELSE
,使包含
ELSE
的规则无效。

正如警告所说,该规则无效,因为如果
那么
优先于
ELSE
,然后,移位/减少冲突的解决使规则无法应用

我认为语法实际上包括如下内容:

%nonassoc THEN
%nonassoc ELSE
因为如果
ELSE
子句是强制性的,就不会有冲突。上述规则存在移位/减少冲突,因为当
ELSE
是解析
IF-exp-THEN IF-exp-THEN exp-ELSE…
时的先行标记时,可以移位
ELSE
将内部
IF-exp-THEN exp
还原为
exp

为了正确解析表达式,必须支持shift操作,以便
ELSE
将与最里面的可用
IF
关联。如果没有优先级声明,这将是默认的解决方案,因为yacc/bison更喜欢shift而不是reduce。但是,如果bison使用默认分辨率,它也会生成有关分辨率的警告。为了避免警告,通常会通过赋予
ELSE
优先于
THEN
来明确强制默认解析。那是什么

exp: IF exp THEN exp ELSE exp
   | IF exp THEN exp
是的。如果以其他顺序编写优先级声明

%nonassoc THEN
%nonassoc ELSE

然后给
then
优先于
ELSE
,这意味着您指示解析器生成器减少最后一个非终结符为
then
的生成,而不是移位
ELSE
。Bison/yacc将遵守该请求,但如果它这样做,它将永远无法移动
ELSE
,使包含
ELSE
的规则无效。

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