我的同事建议我编写一个访问者模式来浏览AST。有没有人能告诉我更多,我该如何开始写?
据我所知,AST中的每个节点都会有visit()
方法(?)会以某种方式被调用(从哪里?)。这就是我的理解。
为了简化这一切,假设我有节点Root
、Expression
、Number
、Op
,树看起来像这样:
Root
|
Op(+)
/ \
/ \
Number(5) \
Op(*)
/ \
/ \
/ \
Number(2) Number(444)
有人能想到访问者模式是如何访问这棵树来产生输出的:
5 + 2 * 444
谢谢,波达·西多。
发布于 2010-03-27 04:09:28
维基百科对how the Visitor pattern works有一个很好的概述,尽管他们使用的示例实现是用Java语言编写的。不过,您可以轻松地将其移植到Python,不是吗?
基本上,您希望为double dispatch实现一种机制。AST中的每个节点都需要实现一个accept()
方法(而不是visit()
方法)。该方法接受一个访问者对象作为参数。在这个accept()
方法的实现中,您将调用访问者对象的visit()
方法(每种AST节点类型都有一个方法;在Java语言中,您将使用参数重载,在Python语言中,我想您可以使用不同的visit_*()
方法)。然后,将使用正确的Node类型作为参数来调度正确的访问器。
发布于 2010-03-27 02:32:54
有关ast.NodeVisitor
,请参阅the docs,例如,粗略的可能性可能是:
import ast
class MyVisitor(ast.NodeVisitor):
def visit_BinaryOp(self, node):
self.visit(node.left)
print node.op,
self.visit(node.right)
def visit_Num(self, node):
print node.n,
当然,即使在需要的地方,这也不会发出括号,所以实际上需要做更多的工作,但是,这是一个开始;-)。
https://stackoverflow.com/questions/2525677
复制相似问题