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);
    

私はそれがかなりハックであることを知っていますが、当分の間#4で行きます。たまたま、私のExprクラスにはこれらの操作のかなり自然な定義があります。

PS ANTLR リストで、C バックエンドのメンテナーは、この問題が将来のリリースで解決される可能性があることをほのめかしています。

于 2010-02-25T19:31:44.833 に答える