我是新来的野牛解析,我不明白它是如何工作的。我有以下语法,我一直保持最低限度以突出问题。野牛减少/减少
%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()
或do_something_2()
因为我再也无法分辨expr
是variable_expr
或composite_expr
。
有没有其他办法可以做到这一点?任何人都可以解释为什么那里首先减少/减少冲突?
请记住,这是一个精简版本,实际上,规则composite_expr
是非常长的。所以重复它是不可能的。
感谢您的回答。我非常喜欢我将立即使用的最后一个解决方案。 – linepogl