问问题
1061 次
1 回答
3
这是我找到的解决此问题的方法。问题的症结在于 ANTLR 想要初始化所有返回值和属性。对于非原始类型,ANTLR 只是假设它可以用NULL
. 因此,例如,expression
上面的规则将被翻译成类似
static Expr
expression(pExprParser ctx)
{
Expr e = NULL; // Declare and init return value
Kind k; // declare attributes
Expr op1, op2;
k = NULL; // init attributes
op1 = NULL;
op2 = NULL;
...
}
在我看来,这些选择是:
给出可以合法初始化的原始类型的值
NULL
。例如,使用Expr*
andKind*
代替Expr
andKind
。如上所述,使用“虚拟”技巧将值推送到不会被初始化的结构中。
使用引用参数而不是返回值。例如,
builtinOp[Kind& kind] : TOK_PLUS { kind = PLUS; } | TOK_MINUS { kind = MINUS; } ;
使用使上述声明和初始化合法的操作来扩充用作值类型的类。即,对于
Expr
返回值,您需要一个可以采用的构造函数NULL
:Expr(long int n);
对于
Expr
属性,您需要一个无参数构造函数和一个operator=
可以采用的NULL
:Expr(); Expr operator=(long int n);
我知道这很hacky,但我暂时选择#4。碰巧我的Expr
班级对这些操作有一个相当自然的定义。
PS在 ANTLR 列表上,C 后端的维护者暗示这个问题可能会在未来的版本中得到解决。
于 2010-02-25T19:31:44.833 回答