我试图在运行时Lexing时累积词法错误。我在this answer中遵循了解析器错误的确切方法。但是当我尝试对Lexer这样做时。
class Class2 : IAntlrErrorListener<IToken>
{
public void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
{
Console.WriteLine("Error in lexer at line " + ":" + e.OffendingToken.Column + e.OffendingToken.Line + e.Message);
}
}
并注册此监听器,如下所示。
Class2 z = new Class2();
lexer.AddErrorListener(z);
但这会产生意外的错误。
Argument 1: cannot convert from 'CSSParserAntlr.Class2' to 'Antlr4.Runtime.IAntlrErrorListener<int>'
和
The best overloaded method match for 'Antlr4.Runtime.Recognizer<int,Antlr4.Runtime.Atn.LexerATNSimulator>.AddErrorListener(Antlr4.Runtime.IAntlrErrorListener<int>)' has some invalid arguments
请告诉我为什么会这样。
答案 0 :(得分:2)
首先,您获得此异常的原因是您需要按如下方式声明Class2:
class Class2 : IAntlrErrorListener<int>
为了匹配Lexer的类签名,定义如下:
public abstract class Lexer : Recognizer<int, LexerATNSimulator>, ITokenSource
AddErrorListener的方法签名在Recognizer中定义,以匹配类定义中的Symbol类型,如下所示:
public abstract class Recognizer<Symbol, ATNInterpreter> : IRecognizer
这意味着Lexer在扩展Recognizer时将“int”指定为“Symbol”,因此AddErrorListener方法需要一个int类型的IAntlrErrorListener。
现在,您的问题的真实答案:不要为词法分析器编写错误侦听器。 lexing中的错误是lex语法的错误,而不是用户输入的错误。错误侦听器对于在Parser中处理错误的用户输入很有用。应该在开发期间测试Lexer语法的覆盖范围 - 即,所有可能的输入都将匹配某些标记。如果在开发过程中遇到lex错误,则默认的错误监听器就可以了。
有关详细信息,请参阅此处的答案:ANTLR4 Lexer error reporting (length of offending characters)