2012-07-29 5 views

答えて

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を呼び出します。削減するとパーサの状態が変わります。つまり、削減前に適用されていたトークンよりも少ないトークンしか表示されない可能性があります。しかしそれはエラー報告のために十分であるはずです。

+2

まさに私が求めていたもの!しかし、あなたはyy_find_shift_actionの最初のパラメータとして 'yypParser'を忘れています:) –

1

レモンでそのようなリストを生成する直接の方法はありません。しかし、レモンツールのデバッグ出力と生成されたパーサのデバッグトレースを使ってこれを試すことができます。 ParseTrace関数の呼び出し後、生成されたパーサは、シフトとリダクションのリストを出力し、入力ストリームに適用します。最後のシフト前の構文エラーには、エラー前の現在の状態の数が含まれています。あなたのパーサの* .outファイルでこの状態を見つけ、その期待されるトークンのリストを見てください。

関連する問題