Parsing 为什么Yacc/野牛规则毫无用处?
与 我明白了 $bison-dv tiger.yyParsing 为什么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
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
的规则无效。这是两个解析器之间的唯一区别吗?这是两个解析器之间的唯一区别吗?