在 X3 中使用 annotation_base::on_success
解析期间可以访问标记的 AST 节点.
我能否获取它们的地址(并存储其他信息,例如相应的输入范围迭代器对)并依赖于它的不变性(对于所有节点,但可能除了顶级 AST 节点,它可以在 parse
) 以后什么时候用?
我可以假设 AST 节点确实已经分配到一个状态,当 parse
返回时该状态不会改变吗?
AST 是聚合和 STL 容器的组合:递归树。
最佳答案
当然也可以移动/复制所有中间 AST 节点。
例如,如果您意识到当 x_rule
解析为 X
然后您解析 x_rule % ','
时会发生什么,这就非常清楚了>。 vector (或其他容器)将移动/复制 X
,所有其他元素可能由于重新分配而移动。
如果目标是在树外附加一些数据,而不会使 AST 节点增长太多,您可以考虑单独存储信息并引用它(通过 id、指针或某种引用)。
在那种情况下,您可能只需要“垃圾收集”您单独存储的数据(并防止在大量回溯的情况下失控积累)。使用 shared_ptr
可以以更多开销为代价方便地实现这一点。
关于c++ - 注释期间和之后的 AST 排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34962982/