0

我正在使用 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);
    }
}

我的问题是:

  • 我走对了吗?
  • 如何获取被忽略的文本?
4

1 回答 1

2

IAntlrErrorListener接口用于报告错误(以及与解析器性能相关的某些其他非错误条件)。该IAntlrErrorStrategy接口负责错误处理/恢复。此接口的默认实现是DefaultErrorStrategy. 通常,这是运行时更高级的功能之一。我努力在Java 运行时的DefaultErrorStrategy文档中提供合理的详细信息,但要做到正确肯定不容易

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

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

如果您从“严格”语法(只允许您的语言的确切语法)开始,那么放松过程涉及允许附加语法,同时在解析后阶段添加语义错误以解决特定的不正确您允许的语法。

于 2013-08-29T02:29:23.047 回答