6

Bison を使用してパーサーを生成しています。Bison が LALR ではなく GLR を使用して対処する必要がある場合に、shift/reduce の競合が 1 つあります。しかし、%glr-parserディレクティブを渡しましたが、ソース ファイルにはまだ LALR パーサーであると記載されています。%skeleton "glr.cc"GLR C++ パーサーであり、それを使用しても出力が変わらないことを示唆する "glr.cc" スケルトンも見つけました。Bison はすべてのターゲット言語のすべてのアルゴリズムを出荷していませんか?

4

3 に答える 3

2

%glr-parserGLRパーサーを入手するだけです。GLR パーサーには競合 (shift/reduce または reduce/reduce) がある可能性があることに注意してください。これは、生成されたパーサーが両方の選択肢を試し、結果を統一するということだけです。

競合に関するメッセージを黙らせたい場合は、 と を使用でき%expectます%expect-rr。ただし、すべての競合が何であるかを理解していない場合に盲目的に GLR パーサーを使用するのは危険です。注意しないと、結果のパーサーは一部の入力を解析するのに指数関数的に時間がかかるか、実行時にあいまいなエラーが発生する可能性があります。

于 2011-12-15T22:48:35.883 に答える
1

%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
于 2012-10-30T08:30:35.380 に答える
0

私は同じ問題を抱えています。私が学んだこと — Bison は、新しい出力の生成に失敗すると 1 を返します。質問:なぜですか?C++ バリアント ( %define api.value.type variant) を無効にしたため、Bison の GLR ではサポートされていませんが、忘れてください%define api.token.constructor。そして、プロンプトのないバイソンは壊れるだけです。

トラブルシューティングを頑張ってください。

于 2019-06-15T05:45:42.593 に答える