如何修复YACC转移/减少后增量运算符的冲突?

Zif*_*fre 6 parsing yacc lalr bison shift-reduce-conflict

我正在YACC(实际上是Bison)写一个语法,我有一个转移/减少问题.它包括后缀增量和减量运算符.这是语法的精简版:

%token NUMBER ID INC DEC

%left      '+' '-'
%left      '*' '/'
%right     PREINC
%left      POSTINC

%%

expr: NUMBER
|     ID
|     expr '+' expr
|     expr '-' expr
|     expr '*' expr
|     expr '/' expr
|     INC expr %prec PREINC
|     DEC expr %prec PREINC
|     expr INC %prec POSTINC
|     expr DEC %prec POSTINC
|     '(' expr ')'
;

%%
Run Code Online (Sandbox Code Playgroud)

Bison告诉我有12个移位/减少冲突,但如果我注释掉后缀增量和减量的行,它就可以正常工作.有谁知道如何解决这个冲突?在这一点上,我正在考虑转向LL(k)解析器生成器,这使得它更容易,但LALR语法似乎总是更自然地编写.我也在考虑GLR,但我不知道有什么好的C/C++ GLR解析器生成器.

tom*_*jen 3

%glr-parser如果您在选项部分中指定,Bison/Yacc 可以生成 GLR 解析器。