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?
You need to implement
IAntlrErrorListener<IToken>
. If all you want to is report errors like you have above, then you should focus on theSyntaxError
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.