1
4

1 回答 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;
    ...
}

在我看来,这些选择是:

  1. 给出可以合法初始化的原始类型的值NULL。例如,使用Expr*andKind*代替Exprand Kind

  2. 如上所述,使用“虚拟”技巧将值推送到不会被初始化的结构中。

  3. 使用引用参数而不是返回值。例如,

    builtinOp[Kind& kind]
      : TOK_PLUS { kind = PLUS; }
      | TOK_MINUS { kind = MINUS; }
      ;
    
  4. 使用使上述声明和初始化合法的操作来扩充用作值类型的类。即,对于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 回答