考虑下面的Bison语法(这是从我正在研究的更大的语法中删除的):
%token ident
%left '+'
%left CALLPREC
%%
start: add ';' ;
expr: ident | call | add ;
call: expr '(' ')' %prec CALLPREC ;
add: expr '+' expr ;
Run Code Online (Sandbox Code Playgroud)
显然没有优先权,在解析表达式时会出现/ r冲突foo + bar().我试图理解为什么%prec声明不解决这个冲突.我正在使用Bison 3.0.2,它似乎认为该指令毫无用处:
$ bison -r state,solved -Wall ambigram.y
ambigram.y: warning: 1 shift/reduce conflict [-Wconflicts-sr]
ambigram.y:5.1-5: warning: useless precedence and associativity for CALLPREC [-Wprecedence]
Run Code Online (Sandbox Code Playgroud)
奇怪的是,消除%prec CALLPREC和宣告%left '('解决了冲突,但声明%left ')'没有.这与我对Bison文档的期望相反,后者说默认情况下,规则的优先级是其最后一个标记的优先级.