首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中编写抽象语法树的访问者模式?

如何在Python中编写抽象语法树的访问者模式?
EN

Stack Overflow用户
提问于 2010-03-27 02:14:08
回答 2查看 21.5K关注 0票数 34

我的同事建议我编写一个访问者模式来浏览AST。有没有人能告诉我更多,我该如何开始写?

据我所知,AST中的每个节点都会有visit()方法(?)会以某种方式被调用(从哪里?)。这就是我的理解。

为了简化这一切,假设我有节点RootExpressionNumberOp,树看起来像这样:

代码语言:javascript
复制
       Root
        |
       Op(+)
      /   \
     /     \
 Number(5)  \
             Op(*)
             /   \
            /     \
           /       \
       Number(2)   Number(444)

有人能想到访问者模式是如何访问这棵树来产生输出的:

代码语言:javascript
复制
 5 + 2 * 444

谢谢,波达·西多。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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类型作为参数来调度正确的访问器。

票数 17
EN

Stack Overflow用户

发布于 2010-03-27 02:32:54

有关ast.NodeVisitor,请参阅the docs,例如,粗略的可能性可能是:

代码语言:javascript
复制
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,

当然,即使在需要的地方,这也不会发出括号,所以实际上需要做更多的工作,但是,这是一个开始;-)。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2525677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档