構文エラーが発生したときに「期待トークン」リストを生成する既知の方法はありますか?私はパーサージェネレータとしてLemonを使用しています。レモンパーサージェネレータを使用した「予想トークン」
5
A
答えて
9
これは動作するようです:
%syntax_error {
int n = sizeof(yyTokenName)/sizeof(yyTokenName[0]);
for (int i = 0; i < n; ++i) {
int a = yy_find_shift_action(yypParser, (YYCODETYPE)i);
if (a < YYNSTATE + YYNRULE) {
printf("possible token: %s\n", yyTokenName[i]);
}
}
}
それはすべての可能なトークンをしようとすると、現在のパーサの状態で適用されているものを印刷します。
誤ったトークンが来た場合、パーサーはすぐにsyntax_errorを呼び出さないが、スタック上の内容を減らして、トークンを後でシフトできるようにします。ほかのものを減らすことができず、現在のトークンをシフトすることができないときだけ、構文解析プログラムはsyntax_errorを呼び出します。削減するとパーサの状態が変わります。つまり、削減前に適用されていたトークンよりも少ないトークンしか表示されない可能性があります。しかしそれはエラー報告のために十分であるはずです。
1
レモンでそのようなリストを生成する直接の方法はありません。しかし、レモンツールのデバッグ出力と生成されたパーサのデバッグトレースを使ってこれを試すことができます。 ParseTrace関数の呼び出し後、生成されたパーサは、シフトとリダクションのリストを出力し、入力ストリームに適用します。最後のシフト前の構文エラーには、エラー前の現在の状態の数が含まれています。あなたのパーサの* .outファイルでこの状態を見つけ、その期待されるトークンのリストを見てください。
関連する問題
- 1. トークンの構文エラー ")"、;予想
- 2. ')' の前に予想される ';' トークンG ++
- 3. 前に予想される表現「:」トークン
- 4. CorePlot - '@'トークンの前に予想されるトークン
- 5. cs7003予想外の使用
- 6. 予想される識別子または '(' の前に '{' トークン
- 7. トークンを使用したAjax
- 8. WindowLIstener - トークン後に予想される識別子
- 9. Cで構造体へのポインティング - エラー:予想「)」「*」トークン
- 10. C:エラー:予期した ')' before ';'トークン
- 11. Cコードのエラー:予想される識別子または「(」の前に「{」トークン
- 12. pytest.raisesを使用して予想されるカスタムエラーをキャッチする
- 13. 予期しないトークン=
- 14. 予期しないトークン<
- 15. Blenderの予想外の結果を使用したThree.js .daeモデルのリギング
- 16. トークンを使用したサービスベースの認証
- 17. jQuery Ajaxを使用したJWTトークン
- 18. リフレクションを使用したトークン置換
- 19. 「)」予想(Javaは)
- 20. 予想外
- 21. Android用のICUのコンパイル:エラー: '*'トークンの前にコンストラクタ、デストラクタ、または型変換が予想される
- 22. タイプスクリプトエラー: ';' "let"キーワードを使用すると予想される
- 23. socket.ioを使用しているときにHTMLの "予期しないトークン<"エラーが発生しました
- 24. Typescriptを使って書かれたGulpfile - SyntaxError:予期しないトークンのインポート
- 25. クーダエラーC2054:予想「(」「__device__」
- 26. クラステンプレート、予想コンストラクタ、デストラクタ
- 27. 予想外の「@」プログラム
- 28. 予想方法「NSDateFormatter *」
- 29. エラー:lxml.etree.XMLSyntaxError:予想 '>'
- 30. 予想外のJRuby:
まさに私が求めていたもの!しかし、あなたはyy_find_shift_actionの最初のパラメータとして 'yypParser'を忘れています:) –