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是一个无效的引用。

我想要的是将一些数据附加到代表 non-terminal 的树节点上datum,任何人都可以告诉我如何实现吗?我在谷歌和 StackOverflow 中搜索过,但没有找到答案。

谢谢!

4

0 回答 0