Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 058a5ad

Browse files
committed
Two changes to visitor API:
Remove _preorder as alias for dispatch and call dispatch directly. Add an extra optional argument to walk() XXX Also comment out some code that does debugging prints.
1 parent cccc478 commit 058a5ad

2 files changed

Lines changed: 46 additions & 40 deletions

File tree

Lib/compiler/visitor.py

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import sys
21
from compiler import ast
32

3+
# XXX should probably rename ASTVisitor to ASTWalker
4+
# XXX can it be made even more generic?
5+
46
class ASTVisitor:
57
"""Performs a depth-first walk of the AST
68
@@ -44,7 +46,7 @@ def __init__(self):
4446
def default(self, node, *args):
4547
for child in node.getChildren():
4648
if isinstance(child, ast.Node):
47-
apply(self._preorder, (child,) + args)
49+
self.dispatch(child, *args)
4850

4951
def dispatch(self, node, *args):
5052
self.node = node
@@ -54,22 +56,20 @@ def dispatch(self, node, *args):
5456
className = klass.__name__
5557
meth = getattr(self.visitor, 'visit' + className, self.default)
5658
self._cache[klass] = meth
57-
if self.VERBOSE > 0:
58-
className = klass.__name__
59-
if self.VERBOSE == 1:
60-
if meth == 0:
61-
print "dispatch", className
62-
else:
63-
print "dispatch", className, (meth and meth.__name__ or '')
59+
## if self.VERBOSE > 0:
60+
## className = klass.__name__
61+
## if self.VERBOSE == 1:
62+
## if meth == 0:
63+
## print "dispatch", className
64+
## else:
65+
## print "dispatch", className, (meth and meth.__name__ or '')
6466
return meth(node, *args)
6567

6668
def preorder(self, tree, visitor, *args):
6769
"""Do preorder walk of tree using visitor"""
6870
self.visitor = visitor
69-
visitor.visit = self._preorder
70-
self._preorder(tree, *args) # XXX *args make sense?
71-
72-
_preorder = dispatch
71+
visitor.visit = self.dispatch
72+
self.dispatch(tree, *args) # XXX *args make sense?
7373

7474
class ExampleASTVisitor(ASTVisitor):
7575
"""Prints examples of the nodes that aren't visited
@@ -90,7 +90,7 @@ def dispatch(self, node, *args):
9090
if self.VERBOSE > 1:
9191
print "dispatch", className, (meth and meth.__name__ or '')
9292
if meth:
93-
return apply(meth, (node,) + args)
93+
meth(node, *args)
9494
elif self.VERBOSE > 0:
9595
klass = node.__class__
9696
if not self.examples.has_key(klass):
@@ -102,15 +102,18 @@ def dispatch(self, node, *args):
102102
if attr[0] != '_':
103103
print "\t", "%-12.12s" % attr, getattr(node, attr)
104104
print
105-
return apply(self.default, (node,) + args)
105+
return self.default(node, *args)
106+
107+
# XXX this is an API change
106108

107109
_walker = ASTVisitor
108-
def walk(tree, visitor, verbose=None):
109-
w = _walker()
110+
def walk(tree, visitor, walker=None, verbose=None):
111+
if walker is None:
112+
walker = _walker()
110113
if verbose is not None:
111-
w.VERBOSE = verbose
112-
w.preorder(tree, visitor)
113-
return w.visitor
114+
walker.VERBOSE = verbose
115+
walker.preorder(tree, visitor)
116+
return walker.visitor
114117

115118
def dumpNode(node):
116119
print node.__class__

Tools/compiler/compiler/visitor.py

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1-
import sys
21
from compiler import ast
32

3+
# XXX should probably rename ASTVisitor to ASTWalker
4+
# XXX can it be made even more generic?
5+
46
class ASTVisitor:
57
"""Performs a depth-first walk of the AST
68
@@ -44,7 +46,7 @@ def __init__(self):
4446
def default(self, node, *args):
4547
for child in node.getChildren():
4648
if isinstance(child, ast.Node):
47-
apply(self._preorder, (child,) + args)
49+
self.dispatch(child, *args)
4850

4951
def dispatch(self, node, *args):
5052
self.node = node
@@ -54,22 +56,20 @@ def dispatch(self, node, *args):
5456
className = klass.__name__
5557
meth = getattr(self.visitor, 'visit' + className, self.default)
5658
self._cache[klass] = meth
57-
if self.VERBOSE > 0:
58-
className = klass.__name__
59-
if self.VERBOSE == 1:
60-
if meth == 0:
61-
print "dispatch", className
62-
else:
63-
print "dispatch", className, (meth and meth.__name__ or '')
59+
## if self.VERBOSE > 0:
60+
## className = klass.__name__
61+
## if self.VERBOSE == 1:
62+
## if meth == 0:
63+
## print "dispatch", className
64+
## else:
65+
## print "dispatch", className, (meth and meth.__name__ or '')
6466
return meth(node, *args)
6567

6668
def preorder(self, tree, visitor, *args):
6769
"""Do preorder walk of tree using visitor"""
6870
self.visitor = visitor
69-
visitor.visit = self._preorder
70-
self._preorder(tree, *args) # XXX *args make sense?
71-
72-
_preorder = dispatch
71+
visitor.visit = self.dispatch
72+
self.dispatch(tree, *args) # XXX *args make sense?
7373

7474
class ExampleASTVisitor(ASTVisitor):
7575
"""Prints examples of the nodes that aren't visited
@@ -90,7 +90,7 @@ def dispatch(self, node, *args):
9090
if self.VERBOSE > 1:
9191
print "dispatch", className, (meth and meth.__name__ or '')
9292
if meth:
93-
return apply(meth, (node,) + args)
93+
meth(node, *args)
9494
elif self.VERBOSE > 0:
9595
klass = node.__class__
9696
if not self.examples.has_key(klass):
@@ -102,15 +102,18 @@ def dispatch(self, node, *args):
102102
if attr[0] != '_':
103103
print "\t", "%-12.12s" % attr, getattr(node, attr)
104104
print
105-
return apply(self.default, (node,) + args)
105+
return self.default(node, *args)
106+
107+
# XXX this is an API change
106108

107109
_walker = ASTVisitor
108-
def walk(tree, visitor, verbose=None):
109-
w = _walker()
110+
def walk(tree, visitor, walker=None, verbose=None):
111+
if walker is None:
112+
walker = _walker()
110113
if verbose is not None:
111-
w.VERBOSE = verbose
112-
w.preorder(tree, visitor)
113-
return w.visitor
114+
walker.VERBOSE = verbose
115+
walker.preorder(tree, visitor)
116+
return walker.visitor
114117

115118
def dumpNode(node):
116119
print node.__class__

0 commit comments

Comments
 (0)