注释期间和之后的 AST 排列

AST arrangement during annotation and after

使用 annotation_base::on_success.

在 X3 中解析期间可以访问标记的 AST 节点

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

我可以假设,AST 节点确实已经分配到一个状态,当 parse returns 时该状态不会改变吗?

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

当然所有中间AST节点也可以是moved/copied。

例如,如果您意识到 x_rule 解析为 X 然后解析 x_rule % ',' 时会发生什么,这就非常清楚了。向量(或其他容器)将 move/copy 放入 X 中,所有其他元素可能会因重新分配而移动。

如果目标是附加一些数据out-of-tree,而不会使 AST 节点增长太多,您可以考虑单独存储信息并引用它(通过 id、指针或某种引用)。

在那种情况下,您可能只需要 "garbage collect" 您单独存储的数据(并防止 run-away 在大量回溯的情况下积累)。使用 shared_ptr 可以以更多的开销为代价方便地实现这一点。