gpt4 book ai didi

java - 使用访问者模式的树转换

转载 作者:太空狗 更新时间:2023-10-29 20:55:05 24 4
gpt4 key购买 nike

(免责声明:这些示例是在构建编译器的上下文中给出的,但这个问题都是关于访问者模式的,不需要任何编译器理论知识。)我正在阅读 Andrew Appel 的 Modern Compiler Implementation in 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 的灵 active 的情况下完成。我想不出任何解决方案不是非常 hacky - 谁能告诉我预期的设计?

最佳答案

SAX 解析器是一种访问者。为避免向方法添加返回值,您可以使用堆栈:

class Visitor {
Stack<Node> stack = new Stack<Node>();

// . . .

void visitPlus(PlusExp pe) {
pe.left.accept(this);
pe.right.accept(this);
Node b = stack.pop();
Node a = stack.pop();
stack.push(new BinOp(BinOp.PLUS, a, b));
}

关于java - 使用访问者模式的树转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1898967/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com