在ANTLR 4中累积Lexer错误

时间:2013-08-28 15:02:03

标签: c#-4.0 antlr antlr4

我试图在运行时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

请告诉我为什么会这样。

1 个答案:

答案 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)