C# 使用C的ANTLR忽略最后一行

C# 使用C的ANTLR忽略最后一行,c#,antlr,C#,Antlr,我们使用ANTLR的C版本4.6.4来解析工具中使用的代码段。该语法类似于IEC61131,即类似Pascal的PLC语言。当有人输入一个代码段并忘记最后一行的分号时,解析器将忽略这一行。我能做些什么来获得一些反馈?我需要至少给用户一个错误消息 我已经有一个错误处理程序: class ErrorListener : IAntlrErrorListener<IToken> { public void SyntaxError(IRecognizer recognizer, ITo

我们使用ANTLR的C版本4.6.4来解析工具中使用的代码段。该语法类似于IEC61131,即类似Pascal的PLC语言。当有人输入一个代码段并忘记最后一行的分号时,解析器将忽略这一行。我能做些什么来获得一些反馈?我需要至少给用户一个错误消息

我已经有一个错误处理程序:

class ErrorListener : IAntlrErrorListener<IToken>
{
    public void SyntaxError(IRecognizer recognizer, IToken offendingSymbol, int line, int charPositionInLine, string msg, RecognitionException e)
    {
        _errorLine = offendingSymbol.Line;
        _errorColumn = offendingSymbol.Column + 1;
        _errorText = "Error on line " + _errorLine + ", column " + _errorColumn;
    }
}
我的lexer和parser函数是:

public CommonTokenStream Lex(string stLike)
{
    AntlrInputStream input = new AntlrInputStream(stLike);
    IEC61131Lexer lexer = new IEC61131Lexer(input);
    CommonTokenStream tokenStream = new CommonTokenStream(lexer);

    return tokenStream;
}

public IParseTree Parse(CommonTokenStream tokenStream)
{
    IEC61131Parser parser = new IEC61131Parser(tokenStream);
    ErrorListener listener = new ErrorListener();
    parser.AddErrorListener((IAntlrErrorListener<IToken>)listener);

    return parser.iec_source();
}
它们被称为:

    CommonTokenStream tokenStream = Lex(stLike);
    IParseTree tree = Parse(tokenStream);

    // If parsing went OK, _errorText will be empty
    if (_errorText == "")
    {
        // Walk the tree to create code
        IEC61131PlcVisitor visitor = new IEC61131PlcVisitor(theClass, tokenStream, target);
        visitor.Indent = indent;
        result = visitor.Visit(tree);
    }
    else
    {
        result = "<" + _errorText + ">";
    }
当我解析结尾缺少分号的代码段时,lexer会为它生成标记,但解析器会在最后一个分号处停止

在iec_源规则末尾添加EOF令牌


这样,解析器就会知道它必须到达输入的末尾,如果在最后一个识别的语句之后没有找到文件的末尾,就会发出错误。

这正是我所需要的。谢谢!很抱歉我反应迟钝。