Antlr中的定制,分类和收集错误

时间:2013-07-23 18:21:45

标签: c# antlr antlr3 antlr4

我是Antlr的新手。我正在尝试实现一个CSS解析器。首先,我使用this语法来生成解析器。我关注this tutorial作为指导。我使用Antlr 3.4在C#中生成代码(接下来,我将使用Antlr 4.0进行尝试)。

我面临几个问题,我无法在互联网上找到资源,以便我能清楚地理解它们。

我遇到的问题:

  1. 生成不同类型的自定义错误消息(错误,警告)。这是在Antlr中提供的吗?请提供一些资源,以了解如何实现这一目标。

  2. 在我关注的教程中,我能够捕获解析和lexing中的异常。但是在我尝试的语法中,即使我已经添加了以下代码并在错误的CSS内容上进行了测试,我也没有给出任何错误。

    partial class CSS3Lexer
    {
        public override void ReportError(RecognitionException e)
        {
            base.ReportError(e);
            Console.WriteLine("Error in lexer at line " + e.Line + ":" + e.CharPositionInLine + e.Message);
        }
    }
    
  3. 我想将错误列表(解析器和词法分析器错误)收集到某种数据结构(错误类型,消息,位置的错误对象列表)中,以便我可以将它们用于另一种任务。有没有更有意义的方法来做到这一点。

  4. 我也希望得到关于我的方法的建议,因为我仍然无法达到更优雅的设计。

1 个答案:

答案 0 :(得分:2)

ANTLR唯一的内置错误报告机制非常简单,并没有提供给特定错误提供错误类别或数字的方法。通常,在分析时发生的所有语法错误都会被赋予相同的错误编号。例如,ANTLR 4工具将解析器错误报告为错误50。

初始解析完成后,您有一个可用的解析树(ANTLR 4)或AST(ANTLR 3),您可以继续执行语义评估。从那里识别的错误可以被视为错误或警告,具体取决于它们的总体影响。您为此使用的数据结构有时是特定于应用程序的,例如Visual Studio或NetBeans扩展,它需要将错误/警告报告给特定的UI组件,但您可以自由地以任何对您有意义的方式进行定义。