小编Wim*_*wis的帖子

为什么%prec不会影响这个野牛语法?

考虑下面的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文档的期望相反,后者说默认情况下,规则的优先级是其最后一个标记的优先级.

compiler-construction parsing bison

2
推荐指数
1
解决办法
727
查看次数

标签 统计

bison ×1

compiler-construction ×1

parsing ×1