1

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 で検索しましたが、答えが見つかりませんでした。

ありがとうございました!

4

0 に答える 0