私は 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 つの reduce/reduce 競合が発生します。
もちろん、composite_expr ルールを次のように書き直すと...
composite_expr:
expr '+' expr
| '~' expr { /* ??? */ }
;
...その後、競合はありませんが、 isまたは かどうかわからなくなったため、 do_something_1()
orを呼び出すことができません。do_something_2()
expr
variable_expr
composite_expr
これを行うことができる他の方法はありますか?そもそも競合を削減/削減する理由を誰かが説明できますか?
これは簡略化されたバージョンであり、実際にはルールcomposite_expr
が非常に長いことに注意してください。したがって、それを複製することは問題外です。