1

bison / yacc GLRパーサーで「期待されるトークン」を取得するにはどうすればよいですか?

やあ、

私が行っているプロジェクトには、あいまいな文法がいくつかあります。だから私は%glr-parserを使ってshift/reduceの競合を解決しようとしています。

非GLRパーサーを使用していた場合、構文エラーを検出したときにyystate(グローバル変数)を使用して「予期されるトークン」を取得できます。しかし、GLRパーサーに切り替えた後、グローバル変数ではなくなったことがわかりました。

だから私の質問は、構文エラーがあるときにGLRパーサーで「期待されるトークン」を取得する方法はありますか?

4

1 に答える 1

1

GLR パーサーに有効な情報がないことは正しいyystateため、「予期されるトークン」の単純な解決策はありません。

デフォルトの LALR パーサーと GLR パーシング アルゴリズムの違いを理解する必要がある理由を理解するには、これについては、http ://www.delorie.com/gnu/docs/bison/bison_11.html で詳しく説明されています。基本的に、GLR (Generalized LR) は複数の同時スレッドを実行し、それぞれが異なるあいまいな代替手段を試して一致を検索します。それらのどれも一致しない場合、解析は失敗し、構文エラーの状況になります。したがって、予想されるトークンは 1 つではありませんが、多くの予想されるトークンが存在する可能性があります。それが曖昧な理由です。Bison パーサーがどのように機能するかを説明する適切なドキュメントは、 http : //www.cs.uic.edu/~spopuri/cparser.html です。非 GLR 解析での yystate 変数の機能が説明されています。

GLR パーサーのより良いエラー メッセージを生成する方法は、この質問に対する @rici の回答で最もよく説明されています。多くの点で、この質問は実際にはその質問の複製です。

両方が同じ問題について尋ねている理由がかなり不明瞭であるため、重複として閉じられていません。

于 2015-02-26T16:24:23.760 に答える