将AST编译回源代码

时间:2011-04-29 13:04:19

标签: php compiler-construction abstract-syntax-tree

我目前正在构建用PHP编写的PHP Parser,因为my previous question中没有现有的解析器。 parser itself效果很好。

现在很明显,解析器本身没什么用(除了静态分析)。我想将转换应用于AST,然后将其编译回源代码。应用转换不是一个大问题,普通的访客模式应该这样做。

我目前的问题是如何将AST编译回源代码。我看到基本上有两种可能性:

  1. 使用某些预定义方案编译代码
  2. 保留原始代码的格式,并仅在已更改的节点上应用1.
  3. 现在我想专注于1.因为2.似乎很难完成(但如果你有相关的提示,我想听听它们。)

    但我不确定哪种设计模式可用于编译代码。我看到实现这一点的最简单方法是向所有节点添加->compile方法。我在这里看到的缺点是,更改生成的输出的格式非常困难。人们需要更改节点本身才能做到这一点。因此,我正在寻找一种不同的解决方案。

    我听说过访客模式也可以用于此,但我无法想象它应该如何运作。据我了解访问者模式,您有一些NodeTraverser在所有节点上递归迭代,并调用->visit的{​​{1}}方法。对于节点操作来说这听起来很有希望,Visitor方法可以简单地改变它传递的Node,但我不知道它如何用于编译。一个显而易见的想法是将节点树从叶子迭代到根,并用源代码替换访问的节点。但这在某种程度上似乎不是一个非常干净的解决方案?

1 个答案:

答案 0 :(得分:58)