1

我试图在运行时进行 Lexing 时累积词法分析器错误。我已经按照这个答案中的解析器错误实现这一点的确切方法。但是当我尝试对 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

请给我一些为什么会发生这种情况的原因。

4

1 回答 1

2

首先,你得到这个异常的原因是你需要声明 Class2 如下:

class Class2 : IAntlrErrorListener<int> 

为了匹配 Lexer 的类签名,定义如下:

public abstract class Lexer : Recognizer<int, LexerATNSimulator>, ITokenSource

AddErrorListener 的方法签名在识别器中定义,以匹配类定义中的符号类型,如下所示:

public abstract class Recognizer<Symbol, ATNInterpreter> : IRecognizer

这意味着 Lexer 在扩展 Recognizer 时将“int”指定为“Symbol”,因此 AddErrorListener 方法需要一个 int 类型的 IAntlrErrorListener。

现在,您问题的真正答案是:不要为词法分析器编写错误侦听器。词法分析中的错误是词法语法的错误,而不是用户输入的错误。错误侦听器对于处理解析器中的错误用户输入很有用。在开发过程中应该测试词法分析器的覆盖率——即,所有可能的输入都将匹配某个标记。如果您在开发过程中遇到 lex 错误,默认的错误侦听器就可以了。

有关更多信息,请参阅此处的答案:ANTLR4 Lexer error reporting(违规字符的长度)

于 2013-12-29T18:25:34.917 回答