我目前正在构建用PHP编写的PHP Parser,因为my previous question中没有现有的解析器。 parser itself效果很好。
现在很明显,解析器本身没什么用(除了静态分析)。我想将转换应用于AST,然后将其编译回源代码。应用转换不是一个大问题,普通的访客模式应该这样做。
我目前的问题是如何将AST编译回源代码。我看到基本上有两种可能性:
现在我想专注于1.因为2.似乎很难完成(但如果你有相关的提示,我想听听它们。)
但我不确定哪种设计模式可用于编译代码。我看到实现这一点的最简单方法是向所有节点添加->compile
方法。我在这里看到的缺点是,更改生成的输出的格式非常困难。人们需要更改节点本身才能做到这一点。因此,我正在寻找一种不同的解决方案。
我听说过访客模式也可以用于此,但我无法想象它应该如何运作。据我了解访问者模式,您有一些NodeTraverser
在所有节点上递归迭代,并调用->visit
的{{1}}方法。对于节点操作来说这听起来很有希望,Visitor
方法可以简单地改变它传递的Node,但我不知道它如何用于编译。一个显而易见的想法是将节点树从叶子迭代到根,并用源代码替换访问的节点。但这在某种程度上似乎不是一个非常干净的解决方案?
答案 0 :(得分:58)