繁体   English   中英

Antlr 4-C#:在解析错误时引发自定义事件

[英]Antlr 4 - C#: Raise Custom Events on Parsing Errors

我将Antlr 4和C#用作目标,并且想在发生语法错误时引发一个事件。

我的语法

/*
 * Parser Rules
 */

text : term+  EOF
;

term : a1 a2 a3
;
a1: ....
...
...

发生错误时,我希望解析器的行为忽略输入文本,直到找到下一项为止。 引发的事件应获取整个被忽略的文本,错误位置的行和列以及错误消息。

我扩展了基类BaseErrorListener:

public class DictionaryErrorListener : Antlr4.Runtime.BaseErrorListener
{
    public event EventHandler<ParsingErrorEventArgs> ParsingErrorOccured;

    protected void OnParsingErrorOccured(int line, int column, string errorMessage, string text)
    {
        EventHandler<ParsingErrorEventArgs> handler = ParsingErrorOccured;
        if (handler != null)
        {
            handler(this, new ParsingErrorEventArgs(line, column, errorMessage, text));
        }
    }

    public override void SyntaxError(Antlr4.Runtime.IRecognizer recognizer, Antlr4.Runtime.IToken offendingSymbol, int line, int charPositionInLine, string msg, Antlr4.Runtime.RecognitionException e)
    {
        OnParsingErrorOccured(line, charPositionInLine, msg, ignoredText);
    }
}

我的问题是:

  • 我走对了吗?
  • 如何获得被忽略的文字?

IAntlrErrorListener接口用于报告错误(以及与解析器性能有关的某些其他非错误条件)。 IAntlrErrorStrategy接口负责错误处理/恢复。 该接口的默认实现是DefaultErrorStrategy 通常,这是运行时的更高级功能之一。 我已经在Java运行时的DefaultErrorStrategy的文档中提供了合理的详细程度,但是绝对很难做到。

通常,我不会尝试使用更好的错误处理程序,而是采用不同的语法策略:

  1. 放宽语法-这意味着我有意允许语法匹配语言上语法上不正确的输入。
  2. 然后,我将不正确的语法视为语义错误,并在解析完成后使用侦听器或访问者报告错误。

如果您以“严格”语法(仅允许使用您的语言的确切语法)开头,那么轻松的过程将包括允许使用其他语法,同时在后解析阶段添加语义错误以解决特定的错误您允许的语法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM