注释期间和之后的AST安排

时间:2016-01-23 11:39:42

标签: c++ c++14 boost-spirit boost-spirit-x3

使用annotation_base::on_success在X3中解析期间可以访问标记的AST节点。

我可以获取它们的地址(以及存储以及其他信息,如相应的输入范围迭代器对)并依赖于它的不变性(对于所有,但可能除了顶级AST节点,可以在{之后移动/复制) {1}})以后何时使用?

我可以假设AST节点已经分配了一个状态,当parse返回时不会改变吗?

AST是聚合和STL容器的组合:递归树。

1 个答案:

答案 0 :(得分:1)

当然,所有中间AST节点也可以移动/复制。

例如,如果您意识到x_rule解析为X然后解析x_rule % ','时会发生什么,那么这一点非常清楚。向量(或其他容器)将移动/复制X,并且由于重新分配,所有其他元素可能会移动。

如果目标是将一些数据附加到树之外,而不会过多地增加AST节点,则可以考虑单独存储信息并引用它(通过id,指针或某种类型的引用)。

在这种情况下,你可能只需要"垃圾收集"您单独存储的数据(并防止在重回溯的情况下失控累积)。使用shared_ptr可以以更高的开销为代价方便地为您提供帮助。