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

标签 parsing compiler-construction

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

这里有一些例子:
Doctrine 2 (一个 ORM)使用 SQLWalker遍历 AST 并从节点生成 SQL。
Twig (一种模板语言)让节点输出自己的代码(这是一个 if 语句节点)。

最佳答案

使用单独的 Walker 进行代码生成可以避免随着目标表示数量的增加而导致 AST 节点类数量的组合激增。当 Walker 负责代码生成时,您只需更改 Walker 类即可将其重新定位到不同的表示形式。但是当 AST 节点本身负责编译时,您需要为每个单独的目标表示使用每个节点的不同版本。

关于parsing - 为什么要构建 AST walker 而不是让节点负责自己的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6364186/

相关文章:

Python:如何读取只有键(没有值)的配置文件

c# - 获取模式之后没有类或 ID 的文本

ruby-on-rails - Rails 中的 Spreadsheet.open 给出此错误 "unknown encoding name - MACINTOSH"

maven-2 - 使用maven2用jdk1.5编译项目

Python 配置解析器从一个部分获取所有值?

python - 如何提取 XML 特定值字段并列出它们?

c - 字符串之间有空格

java - 如何通过 CompilationTask 设置编译源

memory - 如果 v8 使用 "code"或 "text"内存类型,或者如果所有内容都在堆/堆栈中

c# - var 关键字不推断 RepeaterItem 的类型,这是为什么呢?