注释期间和之后的 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
可以以更多的开销为代价方便地实现这一点。
使用 annotation_base::on_success
.
我能否获取它们的地址(并存储其他信息,例如相应的输入范围迭代器对)并依赖其不变性(对于所有节点,但可能除了顶级 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
可以以更多的开销为代价方便地实现这一点。