ANLTR4 C#BailErrorStrategy

时间:2017-05-12 20:18:08

标签: c# antlr4

我试图通过继承我的主要项目词法分析器来严格捕捉所有词汇错误,但无法弄清楚如何附上我的班级:

public class BailLexer : LISBASICLexer
{
    public BailLexer(ICharStream input) : base(input)
    {
    }

    public override void Recover(LexerNoViableAltException e)
    {
        IToken token = e.OffendingToken;
        string message = string.Format("error at line {0}, position {1} at {2} ", token.Line, token.Column, token.Text);
        throw new ParseCanceledException(message);
    }
}

到我的词法分析员:

AntlrInputStream inputStream = new AntlrInputStream(stream);
LISBASICLexer lexer = new LISBASICLexer(inputStream);
lexer.RemoveErrorListeners();
lexer.AddErrorListener(new BailLexer(inputStream));

当我对此进行编码时,编译器会给我这个错误:

Error   7   The best overloaded method match for 'Antlr4.Runtime.Recognizer<int,Antlr4.Runtime.Atn.LexerATNSimulator>.AddErrorListener(Antlr4.Runtime.IAntlrErrorListener<int>)' has some invalid arguments C:\prj\LISC-ANTLR\LISC-ANTLR\FormWorkbench.cs   63  6   LISC-ANTLR

将自定义错误监听器连接到词法分析器需要什么样的机制?到目前为止,我尝试转换Java示例的尝试毫无结果。我试图像TestRig那样捕捉词汇错误,例如:

line 6:6 token recognition error at: 'L'
line 6:7 token recognition error at: 'O'
line 6:8 token recognition error at: 'G'

有人可以举个例子吗?

1 个答案:

答案 0 :(得分:0)

答案很简单:我需要用我的自定义词替换我的词法分析器,而不是添加一个监听器:

AntlrInputStream inputStream = new AntlrInputStream(stream);
BailLexer lexer = new BailLexer(inputStream);

仍然没有陷入我希望的错误,但至少我现在有严格的错误。