将AST编译回源代码我目前正在构建用PHP编写的PHP解析器,因为在我以前的问题..这个解析器本身效果相当好。显然,解析器本身并没有什么好处(除了静态分析)。我想将转换应用到AST,然后将其编译回源代码。应用这些转换并不是什么大问题,正常的访问者模式应该能做到这一点。我目前的问题是,如何将AST编译回源代码。我认为基本上有两种可能性:使用一些预定义的方案编译代码保留原始代码的格式,并仅在已更改的节点上应用1。现在,我想集中精力于1,因为第2条似乎很难完成(但是如果你有关于这方面的提示,我想听听它们)。但我不太确定哪种设计模式可以用来编译代码。实现此功能的最简单方法是添加->compile方法对所有节点执行。我在这里看到的缺点是,很难更改生成的输出的格式。要做到这一点,需要更改节点本身。因此,我正在寻找一个不同的解决方案。我听说访问者模式也可以用于这个,但我真的无法想象这应该如何工作。正如我所理解的访客模式,你有一些NodeTraverser在所有节点上递归迭代并调用->visita的方法Visitor..这听起来非常适合节点操作,其中Visitor->visit方法可以简单地更改它所传递的节点,但我不知道如何使用它进行编译。一个显而易见的想法是将节点树从叶子迭代到根,并用源代码替换访问的节点。但这似乎不是一个很干净的解决方案?
3 回答
慕森卡
TA贡献1806条经验 获得超8个赞
如果你不喜欢我的定义。我使用prettyprint一词来包含任何AST到文本转换,无论是强制执行标准布局,保留原始布局,还是将两者混合在同一语言的不同部分,还是混合两者,因为树是一种包含一种语言的子树和另一种语言的任意子树的混合树(是的,我有机器可以无缝地完成所有这些操作)。我对“未解析”并不满意;虽然它所做的在逻辑上与解析相反,但它实际上根本不进行任何解析,因此这个术语混淆了
- 3 回答
- 0 关注
- 865 浏览
添加回答
举报
0/150
提交
取消