セクション 1.5.4 任意の述語による解析の制御: bison のマニュアルでは、次の形式のブラケット間の述語の戻り値をチェックすることで、ルールのオプションの前もって解析を失敗させることができると指定しています。
parent_rule: %?{ test_predicate_flag } child_rule_1 |
%?{ !test_predicate_flag } child_rule_2;
問題は、文法ファイルで上記の形式を使用すると、次の構文エラーが発生することです。
error: invalid directive: ‘%?{’
マニュアルに記載されているように%glr-parser
、最初のフラグの前にフラグを追加しました。%%
足りないものはありますか?
更新: 投稿する前に bison バージョン 3.0 でこれを試みましたが、うまくいきませんでした。ドキュメントが言うように、この「実験的機能」に関する人々の経験に関するオンラインの情報はあまりありません。それが彼らのために働くことを誰かが確認または否定できますか?
更新 #2: rici が投稿した解決策に従った後、結果の .c ファイルに問題があります。コンパイルのデバッグを支援するために、bison は次の形式の #line ディレクティブを出力しているようです。
#line <line_no> <grammar_file_prefix>.tab.c
任意の述語生成の場合、ルールの上記の述語オプションは、パーサー ファイルのメイン スイッチ ブロックで次のようになります。
if (! (#line <line_no> <grammar_file_prefix>.tab.c
もちろん、これはコンパイルされません。残りのルール一致オプションで見られるように、case ステートメントの開始前の行に出力されることを意図していると思います。バグレポートが提出されたら、バグレポートに追加する別の情報がありますか? 今のところ、これらを検索して置き換えて先に進むことができます。