Yacc/Bison でシフト/リデュースの競合が発生した場合、その競合を希望どおりに解決することは可能ですか? 言い換えれば、シフトまたはリデュースを優先するように明示的に強制することは可能ですか?
私が読んだことについては、デフォルトの解像度に満足している場合は、ジェネレーターに文句を言わないように伝えることができます。あなたの合理的な選択を曖昧にするので、私はこれが本当に好きではありません.
別のオプションは、文法を書き直して問題を修正することです。これが常に可能かどうかはわかりませんが、多くの場合、これにより理解がはるかに難しくなります。
最後に、これを修正できる優先ルールを読みました。私は無知にそれを多くの方法で試しましたが、うまくいきませんでした。そのために優先ルールを使用することは可能ですか? どのように?
私のあいまいな文法は非常に異なっていますが、Bison マニュアルの古典的な if-then-else を使用して具体的な例を示すことができます。
%token IF THEN ELSE variable
%%
stmt:
expr
| if_stmt
;
if_stmt:
IF expr THEN stmt
| IF expr THEN stmt ELSE stmt
;
expr:
variable
;