我在我的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解析器结构中?
答案 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);
}
;