考虑下面的野牛语法(这是从一个更大的语法我正在剥了下来):为什么%prec在这个野牛语法中没有效果?
%token ident
%left '+'
%left CALLPREC
%%
start: add ';' ;
expr: ident | call | add ;
call: expr '(' ')' %prec CALLPREC ;
add: expr '+' expr ;
显然没有先例解析表达式像foo + bar()
时,有一个S/R冲突。我试图理解为什么%prec
声明不能解决这个冲突。我使用的是野牛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]
奇怪的是,消除了%prec CALLPREC
并宣布%left '('
解决冲突,但在宣布%left ')'
没有。这与我所期望的Bison文档相反,后者说[by] default, the precedence of a rule is that of its last token。
很清楚,谢谢!我有你所描述的错误观念。现在我已经发布了,我看到[你回答了几乎相同的问题](http://stackoverflow.com/questions/2068637/shift-reduce-problem-with-c-like-grammar-under-bison)四几年前也是如此。 – 2014-10-04 01:04:56