2011-02-09 2 views
9

파이썬 ast (추상 구문 트리)로 놀고 있습니다.Python ast 모듈을 사용하여 구문 트리에 노드 방문

나는 다음과 같이 썼고 AST의 모든 노드를 방문했다.

import ast 

class Py2Neko(ast.NodeVisitor): 
    def generic_visit(self, node): 
       print type(node).__name__ 
       ast.NodeVisitor.generic_visit(self, node) 

     def visit_Name(self, node): 
       print 'Name :', node.id 

     def visit_Num(self, node): 
       print 'Num :', node.__dict__['n'] 

     def visit_Str(self, node): 
       print "Str :", node.s 

if __name__ == '__main__': 

    node = ast.parse("a = 1 + 2") 

    print ast.dump(node) 

    v = Py2Neko() 
    v.visit(node) 

그런 다음 Py2Neko 클래스에 몇 가지 방법

def visit_Print(self, node): 
    print "Print :" 

def visit_Assign(self, node): 
    print "Assign :" 

def visit_Expr(self, node): 
    print "Expr :" 

그러나이 "인쇄"문 또는 assignement 또는 식을 발견하면 그때는 멈출 추가하지 않을 것 같다을 추가했다.

그것은 출력 :

Module(body=[Assign(targets=[Name(id='a', ctx=Store())], value=BinOp(left=Num(n=1), op=Add(),  right=Num(n=2)))]) 
Module 
Assign : 

누군가가 내가 뭘 잘못했는지 말해 줄 수.

나는 비 터미널 노드의 파이썬 2.6.6

답변

10

visit_Assign 메서드가 할당 노드의 자식 노드를 명시 적으로 처리하지 않으므로 구문 트리의 트래버스가 중지됩니다.

ast.py의 구현에서 NodeVisitor.generic_visit 메소드를 살펴보면 현재 노드의 하위 노드를 반복하는 것을 볼 수 있습니다. 그래서, 당신은 명시 적으로 아이를 처리하는 데 필요한 사용자 각각의 방법에서 기본 클래스 generic_visit 메서드를 호출 할 수 있습니다 :

import ast 

class Py2Neko(ast.NodeVisitor): 
    def generic_visit(self, node): 
     print type(node).__name__ 
     ast.NodeVisitor.generic_visit(self, node) 

    def visit_Name(self, node): 
     print 'Name :', node.id 

    def visit_Num(self, node): 
     print 'Num :', node.__dict__['n'] 

    def visit_Str(self, node): 
     print "Str :", node.s 

    def visit_Print(self, node): 
     print "Print :" 
     ast.NodeVisitor.generic_visit(self, node) 

    def visit_Assign(self, node): 
     print "Assign :" 
     ast.NodeVisitor.generic_visit(self, node) 

    def visit_Expr(self, node): 
     print "Expr :" 
     ast.NodeVisitor.generic_visit(self, node) 

if __name__ == '__main__': 
    node = ast.parse("a = 1 + 2") 

    print ast.dump(node) 

    v = Py2Neko() 
    v.visit(node) 
+0

좋아요, 당신이 설명했던 것을 가지고 있습니다, 지금은 분명합니다, 정말 고마워요! – narke

4

을 사용하고, 당신의 방문 기능은 아이들을 방문한다. 자세한 내용은 Simple example of how to use ast.NodeVisitor?을 참조하십시오.

+0

D' 오 -이 생각하지만, 어떻게 든 (불합리) 가정 하였다를'NodeVisitor'이 처리 할 그것 자체에있어. – delnan

+0

나는 당신이 제공 한 예를 보았지만 아이들을 방문하는 방법을 어떻게 지정 했습니까? 예를 들면 다음과 같습니다. http://dev.pocoo.org/hg/sandbox/file/98ce1ce17c7c/ast/codegen.py visit_Print() 등이 있으며 작동하지 않지만 나에게는 적합하지 않은 것 같습니다. – narke