0

セクション 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 ステートメントの開始前の行に出力されることを意図していると思います。バグレポートが提出されたら、バグレポートに追加する別の情報がありますか? 今のところ、これらを検索して置き換えて先に進むことができます。

4

1 に答える 1

0

セマンティック述語機能は、2013 年 7 月末にリリースされた bison 3.0 で追加されました。この記事を書いている時点では、まだほとんどの OS ディストリビューションにバンドルされていないため、試すにはソースからインストールする必要があります。しかし、bison のソース コードをざっと見てみると (2013 年 10 月 10 日現在、scan.gram.l の 269 行目に、スキャナー仕様のバグらしきものが見つかりました)。

その行のパターンは一致します(nonletter は alnumまたは%{nonletter}[[::graph:]]+以外のものです)。これは確実に一致します。%{%?{

ただし、一致しません%? {。マニュアルの例を試してみましたが、実際には:

widget:
       %?{  new_syntax } "widget" id new_args  { $$ = f($3, $4); }
     | %?{ !new_syntax } "widget" id old_args  { $$ = f($3, $4); }
     ;

表示されるエラーが発生しますが、

widget:
       %?  {  new_syntax } "widget" id new_args  { $$ = f($3, $4); }
     | %?  { !new_syntax } "widget" id old_args  { $$ = f($3, $4); }
     ;

ではない。

?で一致しない文字を追加することで修正できると思います{notletter}。少なくとも、私はそれを試しましたが、その後、上記の両方のスニペットが「機能しました」(少なくとも、bison が .c ファイルを生成する範囲で)。

于 2013-10-12T04:22:29.127 に答える