ANTLR3 C ターゲットを使用して単純な言語の文法を書いています。ANTLR によって生成された AST にいくつかのデータを添付したいと考えています。アタッチするデータが小さいため、一般的な void ポインターを使用するのANTLR3_BASE_TREE_struct
は非常に簡単です。ANTLR3c のドキュメントには、次のように記載されています。
void * u
Generic void pointer allows the grammar programmer to attach any structure they like to
a tree node, in many cases saving the need to create their own tree and tree adaptors.
次に、以下のように文法を書きました (ここでは文法の一部のみを示します)。
datum
@declarations {
parser_data_t* data;
}
@init{
data = HPS_MALLOC(sizeof(parser_data_t));
HPS_RT_ASSERT(data, HPS_ERR_NOMEM);
}
: simpleDatum
{
data->candidate = 0;
$datum.tree->u = data;
}
-> ^(I_DATUM simpleDatum)
| compoundDatum
{
data->candidate = 1;
$datum.tree->u = data;
}
-> ^(I_DATUM compoundDatum)
;
次に、レクサー/パーサーを生成し、コンパイルして関数にリンクしmain
ます。プログラムを実行すると、セグメント違反が発生しました。ANTLR によって生成されたパーサーを確認したところ、問題が見つかりました。データ構造に有効な値が割り当てられていなかったため、割り当て$datum.tree->u = data
によってセグメント違反が発生したため、無効な参照です。$datum.tree
$datum.tree->u
私が望むのは、非終端を表すツリーノードにデータを添付datum
することです.誰でもそれを達成する方法を教えてくれますか? Google と StackOverflow で検索しましたが、答えが見つかりませんでした。
ありがとうございました!