如何向ANTLR生成的C解析器添加属性?

时间:2011-10-24 15:33:44

标签: antlr parser-generator

我在我的C ++程序中使用ANTLR生成的c解析器,我希望在解析器中使用我的帮助器类来编写如下内容:

constant_declaration 
:   'const' type_specifier ID ('[' constant_expression ']')? '=' initializer
    {
        parserHelper->addConstant($type_specifier.text, $ID.text);
    }
;

其中parserHelper是我的C ++助手对象。但我坚持将这个助手传递给C解析器。在面向对象语言中,简单的方法是使用基本解析器类。在C中是不可能的。我现在唯一的解决方案是在@members部分中定义全局变量并在解析之前对其进行初始化:

@members
{
    ParserHelper* parserHelper;
}

由于某些原因,这对我来说很不方便。有没有办法将此变量放入ANTLR生成的C解析器结构中?

1 个答案:

答案 0 :(得分:2)

一种可能的解决方案是使用名为范围的ANTLR而不是全局成员部分。

以下实施应符合您的要求:

scope GlobalScope
{
    ParserHelper* parserHelper;
}

rootRule
scope GlobalScope
@init {
  // Initialize the scope attributes
  // Somehow retrieve or create a PointerHelper (you can eventually pass it by an argument of the rootRule)
  $GlobalScope::parserHelper = ...;
}
:
...
;

constant_declaration 
:   'const' type_specifier ID ('[' constant_expression ']')? '=' initializer
    {
        $GlobalScope::parserHelper->addConstant($type_specifier.text, $ID.text);
    }
;