我有一个语法,根据产生的顺序,快乐报告 3 减少/减少冲突或没有。我能找到的最小示例是:
%tokentype {Token}
%token
int { Int }
'-' { Neg }
both { Both }
%nonassoc both
%left '-'
%nonassoc NEG
%%
E : int {IntE}
| both E E {BothE $2 $3}
| '-' E %prec NEG {NegE $2}
| E '-' E {SubE $1 $3}
{
data Token = Int | Neg | Both deriving Show
data Expr = BothE Expr Expr | IntE | SubE Expr Expr | NegE Expr deriving Show
}
这有 3 个减少-减少冲突,基于无法区分“ both 7 -3
”和“ both 7-3 2
”。很公平!
但是,如果将最后两个产生式换成 E ('-' E %prec NEG
和E '-' E
),reduce/reduce 冲突就会消失。更令人费解的是,如果您随后删除该%prec NEG
指令,它们就会返回。我对这里发生的事情感到很困惑:为什么顺序很重要?