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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (128)

我写一个访客模式来浏览AST。

据我所知,AST中的每个节点visit()方法(?)将以某种方式被调用(从哪里?)。

为了简化一切,假设我有节点Root,,,Expression,,,Number,,,Op这棵树是这样的:

       Root
        |
       Op(+)
      /   \
     /     \
 Number(5)  \
             Op(*)
             /   \
            /     \
           /       \
       Number(2)   Number(444)

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

 5 + 2 * 444
提问于
用户回答回答于

基本上,您希望实现一种用于双重调度.AST中的每个节点都需要实现一个accept()方法(不是visit()方法)。该方法以访问者对象作为参数。在这方面accept()方法,则调用visit()方法(每个AST节点类型都有一个;在Java中,您将使用参数重载,在Python中,我想您可以使用不同的visit_*()方法)。然后,将以正确的节点类型作为参数分派正确的访问者。

用户回答回答于
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,

扫码关注云+社区

领取腾讯云代金券