Antlr中的自定义、分类和收集错误

本文关键字:错误 分类 自定义 Antlr | 更新日期: 2023-09-27 18:24:24

我是Antlr的新手。我正在尝试实现一个CSS解析器。首先,我使用这个语法来生成解析器。我以本教程为指导。我使用Antlr3.4在C#中生成代码(接下来,我也将使用Antlr4.0进行尝试)。

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

我遇到的问题:

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

  2. 在下面的教程中,我能够捕捉解析和词法分析中的异常。但在语法方面,我尝试过的并没有给出任何错误,即使我添加了以下代码并在错误的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. 我想将错误列表(解析器和lexer错误)收集到某种数据结构中(具有错误类型、消息、位置的错误对象列表),以便将它们用于另一项任务。有没有一种更有意义的方法可以做到这一点。

我也想得到关于我的方法的建议,因为我仍然无法达到一个更优雅的设计。

Antlr中的自定义、分类和收集错误

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

初始解析完成后,您可以使用解析树(ANTLR4)或AST(ANTLR3),继续执行语义评估。从那时起识别的错误可以被视为错误或警告,这取决于其总体影响。用于此目的的数据结构有时是特定于应用程序的,例如Visual Studio或NetBeans扩展,它需要向特定的UI组件报告错误/警告,但在其他方面,您可以自由定义任何对您有意义的方式。