c++ - 注释期间和之后的 AST 排列

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

在 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/

相关文章:

C++ 错误 : No Match for Call

c++ - cpp dll中c静态库的功能

C++ 继承类具有同名成员

c++ - 按值返回的函数的值类别是否总是 xvalue?

c++ - 方法,调用所有基类的同名方法(如果存在)并将返回值保存到列表中

c++ - 使用 Boost::Spirit::X3 解析复数

c++ - 使用 Boost Spirit 为类似矩阵的输入编写解析器

c# - 使用ANTLR用C#解析C++

c++ - 为什么 std::tie 没有标记为 C++14 的 constexpr?

c++ - 如何使用 parse/phrase_parse 函数