構文エラーが発生したときに「期待トークン」リストを生成する既知の方法はありますか?私はパーサージェネレータとして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. Jinja2の:予想トークン「」、得た 『:』
- 2. エラー:予想 ':'、 ''、 ';'、 '}' または '__attribute__' トークン
- 3. トークンの構文エラー ")"、;予想
- 4. エラー: "<"は予期しないトークンです。予想されるトークンは ';'です。
- 5. 角度グレートアップリング予期しないトークンpunc«}»、予想されるpunc«:»
- 6. Eroor:F:/ReactNativeProject/FirstProject/index.android.js:予想予期しないトークン、((23:8)
- 7. ')' の前に予想される ';' トークンG ++
- 8. 前に予想される表現「:」トークン
- 9. cs7003予想外の使用
- 10. "in jsx"を使用した予期しないトークン
- 11. Webpack - Uncaught SyntaxError:Reduxを使用した予期しないトークンのインポート
- 12. SyntaxErrorの取得:Angular.jsを使用した予期しないトークン
- 13. jest enzyme returnsを使用したユニットテストSyntaxError:予期しないトークン
- 14. ノードを使用した予期しないトークンのインポート
- 15. CorePlot - '@'トークンの前に予想されるトークン
- 16. React:予期せぬトークンが予想される(
- 17. 予想される識別子または '(' の前に '{' トークン
- 18. エラー予想コンストラクタ、デストラクタ、または型変換の前に「(」トークン
- 19. Pythonを使用したFFT - 予想外の低周波数
- 20. 外部ソートアルゴリズムを使用したソートの予想時間
- 21. カルマエラー "SyntaxError:js/controllers/batch.jsの 'in'でトークンが予想されました:9
- 22. eStarget.nameを使用して予期しないトークンをsetState
- 23. TemplateSyntaxError:予想されるトークン '文末ブロックの終了'、 '%'を取得
- 24. トークンを使用したAjax
- 25. Angular2:(SystemJS)予期しないトークン] SyntaxError:予期しないトークン]?
- 26. Pugテンプレートを使用すると予期しないトークン "インデント"
- 27. Cで構造体へのポインティング - エラー:予想「)」「*」トークン
- 28. CPP:前に予想される主な表現トークン
- 29. WindowLIstener - トークン後に予想される識別子
- 30. Qt作成者:予想されるトークン ';' 'got') '
まさに私が求めていたもの!しかし、あなたはyy_find_shift_actionの最初のパラメータとして 'yypParser'を忘れています:) –