我正在使用 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 中搜索过,但没有找到答案。
谢谢!