Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 392
diyoda_ Avatar asked Aug 28 '13 10:08

diyoda_


1 Answers

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.

  • ConsoleErrorListener
  • BaseErrorListener
  • DiagnosticErrorListener

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.

like image 157
Sam Harwell Avatar answered Sep 28 '22 12:09

Sam Harwell