php语法树,关于php :(语法树)使用当前自上而下的路径递归迭代自下而上的树

我有一个抽象的语法树,需要进行迭代。 AST由柠檬端口到PHP生成。

现在"正常"地,我将使用崭新且闪亮的(PHP 5.3.1)SPL类来完成此操作,它看起来像这样:

$it = new

ecursiveIteratorIterator(

new

ecursiveArrayIterator($ast['rule']),

ecursiveIteratorIterator::SELF_FIRST);

实际上,这就是我在代码的另一部分中所做的事情,它确定了整个树的粗略类型(即它可以是赋值,条件等)。现在,除了细节之外,唯一重要的是迭代已完成RecursiveIteratorIterator :: SELF_FIRST,即自上而下。

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

问题是,这些操作必须是上下文感知的,即我需要到当前节点的路径。而且由于我要自下而上进行迭代,因此RecursiveIteratorIterator不能实现这一点。

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

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

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

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

谁能使用SPL找到最优雅的解决方案,那就来了!您是PHP专家!

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

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

是。 如果您确实详细说明了解决问题的方式,请向您表示感谢。

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

如果您要添加一些示例代码,那就太酷了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值