How to collect errors during run time given by a parser in Antlr4
Asked Answered
C

1

7

I have upgraded from Antlr 3 to Antlr 4. I was using this code to catch exceptions using this code. But this is not working for Antlr 4.

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);
    }
}

This is the error that appears

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

In Antlr 4 what is the expected way of accumulating errors that occurs in the input stream. I was unable to find a way to achieve this on the net. Please provide me some guidelines.

EDIT:

I have implemented the XParser as below

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);
    }
}

As you said I can extend this parser class using any of the mentioned classes. But I was unable to register this listener, in the main program I am confused with passing argument as the listener. Please help me with the registering.

As I can see these classes has the capability of producing more meaningful error messages don't they?

Customable answered 28/8, 2013 at 10:3 Comment(0)
M
12

You need to implement IAntlrErrorListener<IToken>. If all you want to is report errors like you have above, then you should focus on the SyntaxError method. Several base classes are available if you want to extend one.

The error listener is attached to the parser instance by calling parser.AddErrorListener(listener).

Edit: You need to create a new class which implements the error listener interface. You then attach the listener to the parser. The parser itself will not implement the error listener interface.

Madera answered 28/8, 2013 at 11:18 Comment(3)
Please take a look at my edit. I have some confusion and clarification. Thanks for the big help through out the work. Appreciate it a lot.Customable
@290Z28 Thanks that works. Why can't I do the same thing to Lexer. I tried to imitate what I did for the parser by creating another class and implementing from IAntlrErrorListener<IToken> . lexer instance has AddErrorListener a method.Customable
confused with the name :)Customable

© 2022 - 2024 — McMap. All rights reserved.