2012-02-22 16 views
2

ANTLR v3のリカバリと再リンクエラーに問題があります。私はこのリンクhttp://www.antlr.org/blog/antlr3/error.handling.tmlに従うが、私はその解決策を持っていない。 私はこのようなソースプログラムで例えば、いくつかの報告と回復を 作りたい: 学生入力コード:ANTLR:エラーリカバリとレポート

FOR(int a=0;a<10;a++){ 
b=b*a; 
} 

とプログラムは次のように報告します: プログラム:「あなたのためのキーワードを意味しているのですために?" 学生の答え: "はい" その後、システムの回復と自動的にソースコードを変更します。 ANTLR v3でそれをどうやって行うのですか?ANTLRとやりとりできますか? ヘルプが必要です。みんなありがとう!

+0

構文解析をゼロから再開することはできますか?実装を単純化するかもしれない。 – sarnold

+0

ええ..あなたは解決策を持っていますか? –

答えて

1

私は、生成されたパーサークラス内でorg.antlr.runtime.BaseRecognizer.recoverFromMismatchedTokenを無効にする必要があると思います。

この関数は、ANTLRが無効なトークンを検出したときに呼び出されます。したがって、あなた自身の機能では、回復が必要かどうかをユーザーに尋ねることができます。

必要に応じて、BaseRecognizer.recoverFromMismatchedTokenに電話してリカバリを実行できます。そうでない場合は、例外MismatchedTokenExceptionを投げることができます。

+0

あなたは私にその例のリンクを教えてもらえますか?私はちょうど混乱します。しかし、lex liの前にありがとう –

+0

私はC#でANTLRを使用するので、あなたにJavaの例を与えることはできません。 https://github.com/lextm/sharpsnmplib/blob/2f9e8d2d48547b37e7cb6d75cdcb0ffae29f82e3/SharpSnmpLib/Mib/SmiParser.csこれは最終的にANTLRとマージされますC#で定義された部分クラスは、あるSmi.g文法からSmiParser.csファイルを生成ファイル。 SmiParserクラスは、ANTLRのBaseRecognizerから派生したクラスです。ここでは、RecoverFromMismatchedToken関数をオーバーライドして、例外を常にスローします。 Javaでは、同様の方法で関数をオーバーライドし、独自のロジックを実装する必要があります。 –

+0

そのソリューションのためにlex liに感謝します。あなたのケースでは、このようなANTLRの概念を使用することは不可能ですhttp://stackoverflow.com/questions/9262195/parsing-java-code-with-antlr-need-concept –