我是 Bison 解析的新手,我无法理解它是如何工作的。我有以下语法,我在其中保持最低限度以突出问题。
%left '~'
%left '+'
%token T_VARIABLE
%%
start: expr;
expr: composite_expr | variable_expr;
variable_expr: T_VARIABLE;
composite_expr:
expr '+' expr
| '~' variable_expr { do_something_1(); }
| '~' composite_expr { do_something_2(); }
;
%%
如您所见,我想'~'
根据后面的表达式类型对运算符应用不同的函数。但是,这会产生 2 个减少/减少冲突。
当然,如果我像这样重写composite_expr 规则......
composite_expr:
expr '+' expr
| '~' expr { /* ??? */ }
;
...然后没有冲突,但现在我不能打电话do_something_1()
ordo_something_2()
因为我不能再判断expr
is variable_expr
or composite_expr
。
还有其他方法可以做到这一点吗?谁能解释为什么首先减少/减少冲突?
请记住,这是一个精简版,实际上,规则composite_expr
很长。所以复制它是不可能的。