为什么要构建AST walker而不是让节点负责自己的输出?

rye*_*guy 2 compiler-construction parsing

给定一个AST,是什么原因导致一个Walker类遍历树并执行输出,而不是给每个Node类一个compile()方法并让它负责自己的输出?

以下是一些示例:
Doctrine 2(ORM)使用a SQLWalker来遍历AST并从节点生成SQL.
Twig(模板语言)让节点输出自己的代码(这是一个if语句节点).

Jer*_*man 6

Walker随着目标表示的数量增加,使用单独的代码生成避免了AST节点类的数量的组合爆炸.当a Walker负责代码生成时,您可以通过更改Walker类来将其重新定位到不同的表示形式.但是当AST节点本身负责编译时,每个单独的目标表示需要不同版本的每个节点.