1 に答える
この問題に対して私が見つけた解決策は次のとおりです。問題の核心は、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
and を使用しKind
ます。上記の「ダミー」トリックを使用して、初期化されない構造体に値をプッシュします。
戻り値の代わりに参照パラメーターを使用します。例えば、
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);
私はそれがかなりハックであることを知っていますが、当分の間#4で行きます。たまたま、私のExpr
クラスにはこれらの操作のかなり自然な定義があります。
PS ANTLR リストで、C バックエンドのメンテナーは、この問題が将来のリリースで解決される可能性があることをほのめかしています。