【发布时间】:2009-05-20 20:24:08
【问题描述】:
我正在用 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 ')'
;
%%
Bison 告诉我有 12 个移位/减少冲突,但如果我注释掉后缀递增和递减的行,它就可以正常工作。有谁知道如何解决这个冲突?在这一点上,我正在考虑迁移到 LL(k) 解析器生成器,这使它更容易,但 LALR 语法似乎总是更自然地编写。我也在考虑 GLR,但我不知道有什么好的 C/C++ GLR 解析器生成器。
【问题讨论】:
-
如果反对者至少给出一个理由,我将不胜感激......
标签: parsing yacc bison shift-reduce-conflict lalr