问题
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?
回答1:
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.
来源:https://stackoverflow.com/questions/18484869/how-to-collect-errors-during-run-time-given-by-a-parser-in-antlr4