Boost.Spirit中节点之间的双向关系

时间:2017-05-08 22:28:13

标签: boost-spirit

我使用Boost.Spirit来解析类似于

的结构
namespace Foo { class Bar { ... } }

这很好用:我得到了namespace_declaration类型的对象,它有一个包含它的内容的变体列表,例如class_declaration s。

我的问题是:我如何确保在解析阶段,class_declaration可以引用其包含的namespace_declaration?换句话说,我怎样才能引用那个我刚刚解析过的对象?

1 个答案:

答案 0 :(得分:3)

你做不到。至少不舒服。

您希望这样做的事实可能表明您正在混淆解析和处理代码。

如果你需要的只是语义检查,你可以尝试在上下文的子规则中注入必要的细节,例如:使用继承的属性。

如果仅仅因为封闭结构(显然)尚未完成这一事实,这不可能合理地成为“双向关系”:

  • namespace X { class Y { }; }逻辑上,您可以期望已经解析了名称"X" - 但不能保证它已被分配到公开的属性值
  • while (condition) { statement; }
  • 的情况下对条件表达式的同意
  • 但是,请考虑do { statement; } while (condition);,您可以看到为什么不能指望statement知道封闭控制流程语句。

所以,总而言之,我建议

  1. 关注点分离:先解析,语义检查,转换,稍后处理
  2. 如果您必须动态获取语义信息(例如由于上下文语法)明确传递上下文
相关问题