【发布时间】:2009-12-14 04:41:00
【问题描述】:
(免责声明:这些示例是在构建编译器的上下文中给出的,但是这个问题都是关于访问者模式的,不需要任何编译器理论知识。)我正在阅读 Andrew Appel 的 Java 中的现代编译器实现尝试自学编译器理论(所以不,这不是家庭作业),我无法理解他想如何使用访问者模式将 AST 转换为 IR 树。 (注意:我在 Python 中执行此操作,因此我也可以学习 Python,这就是为什么即将出现的示例不在 Java 中的原因。)据我了解,访问者模式中的访问和接受方法是设计为无效类型的,所以如果我有类似的东西
class PlusExp(Exp):
def __init__(self, exp_left, exp_right):
self.exp_left = exp_left
self.exp_right = exp_right
def accept(self, v):
v.visit_plus_exp(self)
那么我希望能够编写一个访问者方法,例如
def visit_plus_exp(self, plus_exp):
return BINOP(BinOp.PLUS,
plus_exp.exp_left.accept(self),
plus_exp.exp_right.accept(self))
这会将两个子表达式转换为 IR,然后将它们与表示加号表达式的 BINOP 链接起来。当然,除非我修改所有接受函数以返回额外信息,否则这是不可能的,这也很麻烦,因为有时您只需要一个不返回任何内容的打印访问者。然而,本文坚持访问者是正确的方式,在 Java 中,这意味着它可以在没有 Python 的灵活性的情况下完成。我想不出任何不是非常 hacky 的解决方案 - 任何人都可以告诉我预期的设计吗?
【问题讨论】:
-
嘿,我也想学编译器……那本书是学习编译器的好书吗???
-
我觉得作为介绍还是挺不错的。它会引导您完成(无需牵手)编译器的实现,该编译器将 Java 的一个子集作为其源并发出本机代码。它还包含一系列编译器理论的高级主题。
-
是否涵盖代码生成部分?
-
是的 - 请参阅我之前的评论,我说过它会发出本机代码。
-
是的,你做到了!!!谢谢哥们:-)
标签: java python tree abstract-syntax-tree visitor-pattern