【问题标题】:(syntax trees) recursively iterating over trees bottom-up with current top-down path(语法树)以当前自上而下的路径自下而上递归地遍历树
【发布时间】:2010-01-19 17:52:58
【问题描述】:

我有一个需要迭代的abstract syntax tree。 AST 由lemon port to PHP 生成。

现在“通常”,我会使用全新的闪亮 (PHP 5.3.1) SPL 类,它看起来像这样:

$it = new \RecursiveIteratorIterator(
  new \RecursiveArrayIterator($ast['rule']),
  \RecursiveIteratorIterator::SELF_FIRST);

实际上,这就是我在代码的另一部分所做的,它确定了整个树的粗略类型(即它可以是一个赋值、一个条件等)。现在抛开细节不谈,唯一重要的是迭代是做RecursiveIteratorIterator::SELF_FIRST,也就是自顶向下。

回到我的问题,我需要自下而上迭代 AST,即类似 RecursiveIteratorIterator::CHILD_FIRST 的东西,以便在树中进行一些替换和优化。

问题是,这些操作需要上下文感知,即我需要到当前节点的路径。而且由于我想自下而上迭代,所以我不能使用 RecursiveIteratorIterator。

想一想。我想自下而上迭代并在每次迭代时拥有当前节点的自上而下上下文(堆栈)。从技术上讲,它应该是可能的,因为 RecursiveIteratorIterator 必须首先到达树的尾部,才能向后迭代。在到达尾部的过程中,它可以缓存当前位置,并在从递归返回时简单地弹出元素。

现在这是一个关键字:缓存。这就是为什么我怀疑另一个 SPL 类应该可以实现:RecursiveCachingIterator。

问题是:真的有可能吗?如果是,怎么做?

我一直在尝试编写一些代码,但没有成功,而且文档很少。真的,真的很稀缺。

谁使用 SPL 找到了最优雅的解决方案,脱帽致敬!你是 PH​​P 大师!

PS:如果不清楚,我正在寻找尽可能多的 SPL (re) 用法。我知道我可以使用自定义堆栈编写自己的递归函数,无需提醒我。

【问题讨论】:

  • 我已经设法通过继承 RecursiveIteratorIterator 并分别在 ::endChildren() 和 ::callGetChildren 中管理堆栈来使其工作。也许这会对某人有所帮助。向我自己致敬:-)
  • 是的。向你致敬,如果你真的详细说明了你是如何解决问题的。

标签: php abstract-syntax-tree standard-library spl


【解决方案1】:

我已经设法通过继承 RecursiveIteratorIterator 并分别管理 ::endChildren() 和 ::callGetChildren 中的堆栈来使其工作。也许这会对某人有所帮助。向我自己致敬:-)

【讨论】:

  • 如果你能添加一些示例代码会很酷。
猜你喜欢
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多