Bison を使用してパーサーを生成しています。Bison が LALR ではなく GLR を使用して対処する必要がある場合に、shift/reduce の競合が 1 つあります。しかし、%glr-parser
ディレクティブを渡しましたが、ソース ファイルにはまだ LALR パーサーであると記載されています。%skeleton "glr.cc"
GLR C++ パーサーであり、それを使用しても出力が変わらないことを示唆する "glr.cc" スケルトンも見つけました。Bison はすべてのターゲット言語のすべてのアルゴリズムを出荷していませんか?
3 に答える
%glr-parser
GLRパーサーを入手するだけです。GLR パーサーには競合 (shift/reduce または reduce/reduce) がある可能性があることに注意してください。これは、生成されたパーサーが両方の選択肢を試し、結果を統一するということだけです。
競合に関するメッセージを黙らせたい場合は、 と を使用でき%expect
ます%expect-rr
。ただし、すべての競合が何であるかを理解していない場合に盲目的に GLR パーサーを使用するのは危険です。注意しないと、結果のパーサーは一部の入力を解析するのに指数関数的に時間がかかるか、実行時にあいまいなエラーが発生する可能性があります。
%skeleton "glr.cc"
「出力を変更しなかった」というのが何を意味するのかわかりません。本当に出力を再生成しましたか? もしそうなら、詳細を教えてください。
$ echo "%% exp: '0'" > /tmp/f.y
$ bison -S lalr1.cc /tmp/f.y -o f1.cc
$ bison -S glr.cc /tmp/f.y -o f2.cc
$ ls -l f1.cc f2.cc
-rw-r--r-- 1 akim wheel 28373 30 oct 09:29 f1.cc
-rw-r--r-- 1 akim wheel 82767 30 oct 09:29 f2.cc
私は同じ問題を抱えています。私が学んだこと — Bison は、新しい出力の生成に失敗すると 1 を返します。質問:なぜですか?C++ バリアント ( %define api.value.type variant
) を無効にしたため、Bison の GLR ではサポートされていませんが、忘れてください%define api.token.constructor
。そして、プロンプトのないバイソンは壊れるだけです。
トラブルシューティングを頑張ってください。