2013-08-28 6 views
6

Antlr 3からAntlr 4にアップグレードしました。このコードを使用して、このコードを使用して例外をキャッチしていました。しかし、これはANTLR 4.実行時にAntlr4のパーサによって与えられたエラーを収集する方法

partial class XParser 
{ 
    public override void ReportError(RecognitionException e) 
    { 
     base.ReportError(e); 
     Console.WriteLine("Error in Parser at line " + ":" + e.OffendingToken.Column + e.OffendingToken.Line + e.Message); 
    } 
} 

のために働いていませんこれは、入力ストリームで発生したエラーを蓄積の予想方法は何かANTLR 4では

'Parser.ReportError(Antlr4.Runtime.RecognitionException)': no suitable method found to override 

を表示されるエラーです。私はネット上でこれを達成する方法を見つけることができませんでした。私にいくつかのガイドラインを教えてください。

EDIT:あなたは、私が言及したクラスのいずれかを使用して、このパーサクラスを拡張することができます言ったように私は

partial class XParser : IAntlrErrorListener<IToken> 
{ 
    public void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e) 
    { 
     Console.WriteLine("Error in parser at line " + ":" + e.OffendingToken.Column + e.OffendingToken.Line + e.Message); 
    } 
} 

以下のようXParserを実装している

。しかし、私はこのリスナーを登録することができませんでした。メインプログラムでは、引数を渡すことと混同しています。listener。登録のお手伝いをしてください。

これらのクラスがわかるように、より意味のあるエラーメッセージを生成する能力はありますか?

答えて

9

IAntlrErrorListener<IToken>を実装する必要があります。上記のようにエラーを報告する場合は、SyntaxErrorメソッドに焦点を当てる必要があります。拡張したい場合は、いくつかの基本クラスを利用できます。

エラーリスナーは、parser.AddErrorListener(listener)を呼び出すことによって、パーサインスタンスに取り付けられています。

編集:エラーリスナーインターフェイスを実装する新しいクラスを作成する必要があります。次に、リスナーをパーサーにアタッチします。パーサ自体はエラーリスナインタフェースを実装しません。

+0

私の編集を見てください。私はいくつかの混乱と説明をしています。仕事を通して大いに助けてくれてありがとう。それをたくさんありがとう。 –

+0

@Diode投稿を更新しました。 :) –

+1

@ 290Z28ありがとうございます。なぜ私はレクサーに同じことをすることができません。私は別のクラスを作成し、 'IAntlrErrorListener 'から実装することによって、パーサのために行ったことを真似しようとしました。レクサーのインスタンスには、メソッドの「AddErrorListener」があります。 –

関連する問題