[pypy-svn] r14348 - pypy/dist/pypy/interpreter/astcompiler

ludal at codespeak.net ludal at codespeak.net
Wed Jul 6 18:45:40 CEST 2005


Author: ludal
Date: Wed Jul  6 18:45:36 2005
New Revision: 14348

Added:
   pypy/dist/pypy/interpreter/astcompiler/ast.txt
      - copied unchanged from r14148, pypy/branch/pycompiler/module/recparser/compiler/ast.txt
   pypy/dist/pypy/interpreter/astcompiler/astgen.py
      - copied, changed from r14148, pypy/branch/pycompiler/module/recparser/compiler/astgen.py
Modified:
   pypy/dist/pypy/interpreter/astcompiler/ast.py
   pypy/dist/pypy/interpreter/astcompiler/transformer.py
Log:
(WIP) changes to the ast generator to allow an rpython visitor implementation


Modified: pypy/dist/pypy/interpreter/astcompiler/ast.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/ast.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/ast.py	Wed Jul  6 18:45:36 2005
@@ -31,9 +31,12 @@
         return self.getChildren()
     def getChildNodes(self):
         pass # implemented by subclasses
+    def visit(self, visitor, *args):
+        return visitor.visitNode(self, *args)
 
 class EmptyNode(Node):
-    pass
+    def visit(self, visitor, *args):
+        return visitor.visitEmptyNode(self, *args)
 
 class Expression(Node):
     # Expression is an artificial node class to support "eval"
@@ -50,6 +53,9 @@
     def __repr__(self):
         return "Expression(%s)" % (repr(self.node))
 
+    def visit(self, visitor, *args):
+        return visitor.visitExpression(self, *args)
+
 class Add(Node):
     def __init__(self, (left, right), lineno=None):
         self.left = left
@@ -65,6 +71,9 @@
     def __repr__(self):
         return "Add((%s, %s))" % (repr(self.left), repr(self.right))
 
+    def accept(self, visitor, args):
+        return visitor.visitAdd(self, args)
+
 class And(Node):
     def __init__(self, nodes, lineno=None):
         self.nodes = nodes
@@ -81,6 +90,9 @@
     def __repr__(self):
         return "And(%s)" % (repr(self.nodes),)
 
+    def accept(self, visitor, args):
+        return visitor.visitAnd(self, args)
+
 class AssAttr(Node):
     def __init__(self, expr, attrname, flags, lineno=None):
         self.expr = expr
@@ -97,6 +109,9 @@
     def __repr__(self):
         return "AssAttr(%s, %s, %s)" % (repr(self.expr), repr(self.attrname), repr(self.flags))
 
+    def accept(self, visitor, args):
+        return visitor.visitAssAttr(self, args)
+
 class AssList(Node):
     def __init__(self, nodes, lineno=None):
         self.nodes = nodes
@@ -113,6 +128,9 @@
     def __repr__(self):
         return "AssList(%s)" % (repr(self.nodes),)
 
+    def accept(self, visitor, args):
+        return visitor.visitAssList(self, args)
+
 class AssName(Node):
     def __init__(self, name, flags, lineno=None):
         self.name = name
@@ -128,6 +146,9 @@
     def __repr__(self):
         return "AssName(%s, %s)" % (repr(self.name), repr(self.flags))
 
+    def accept(self, visitor, args):
+        return visitor.visitAssName(self, args)
+
 class AssTuple(Node):
     def __init__(self, nodes, lineno=None):
         self.nodes = nodes
@@ -144,6 +165,9 @@
     def __repr__(self):
         return "AssTuple(%s)" % (repr(self.nodes),)
 
+    def accept(self, visitor, args):
+        return visitor.visitAssTuple(self, args)
+
 class Assert(Node):
     def __init__(self, test, fail, lineno=None):
         self.test = test
@@ -166,6 +190,9 @@
     def __repr__(self):
         return "Assert(%s, %s)" % (repr(self.test), repr(self.fail))
 
+    def accept(self, visitor, args):
+        return visitor.visitAssert(self, args)
+
 class Assign(Node):
     def __init__(self, nodes, expr, lineno=None):
         self.nodes = nodes
@@ -187,6 +214,9 @@
     def __repr__(self):
         return "Assign(%s, %s)" % (repr(self.nodes), repr(self.expr))
 
+    def accept(self, visitor, args):
+        return visitor.visitAssign(self, args)
+
 class AugAssign(Node):
     def __init__(self, node, op, expr, lineno=None):
         self.node = node
@@ -203,6 +233,9 @@
     def __repr__(self):
         return "AugAssign(%s, %s, %s)" % (repr(self.node), repr(self.op), repr(self.expr))
 
+    def accept(self, visitor, args):
+        return visitor.visitAugAssign(self, args)
+
 class Backquote(Node):
     def __init__(self, expr, lineno=None):
         self.expr = expr
@@ -217,6 +250,9 @@
     def __repr__(self):
         return "Backquote(%s)" % (repr(self.expr),)
 
+    def accept(self, visitor, args):
+        return visitor.visitBackquote(self, args)
+
 class Bitand(Node):
     def __init__(self, nodes, lineno=None):
         self.nodes = nodes
@@ -233,6 +269,9 @@
     def __repr__(self):
         return "Bitand(%s)" % (repr(self.nodes),)
 
+    def accept(self, visitor, args):
+        return visitor.visitBitand(self, args)
+
 class Bitor(Node):
     def __init__(self, nodes, lineno=None):
         self.nodes = nodes
@@ -249,6 +288,9 @@
     def __repr__(self):
         return "Bitor(%s)" % (repr(self.nodes),)
 
+    def accept(self, visitor, args):
+        return visitor.visitBitor(self, args)
+
 class Bitxor(Node):
     def __init__(self, nodes, lineno=None):
         self.nodes = nodes
@@ -265,6 +307,9 @@
     def __repr__(self):
         return "Bitxor(%s)" % (repr(self.nodes),)
 
+    def accept(self, visitor, args):
+        return visitor.visitBitxor(self, args)
+
 class Break(Node):
     def __init__(self, lineno=None):
         self.lineno = lineno
@@ -278,6 +323,9 @@
     def __repr__(self):
         return "Break()"
 
+    def accept(self, visitor, args):
+        return visitor.visitBreak(self, args)
+
 class CallFunc(Node):
     def __init__(self, node, args, star_args = None, dstar_args = None, lineno=None):
         self.node = node
@@ -307,6 +355,9 @@
     def __repr__(self):
         return "CallFunc(%s, %s, %s, %s)" % (repr(self.node), repr(self.args), repr(self.star_args), repr(self.dstar_args))
 
+    def accept(self, visitor, args):
+        return visitor.visitCallFunc(self, args)
+
 class Class(Node):
     def __init__(self, name, bases, doc, code, lineno=None):
         self.name = name
@@ -332,6 +383,9 @@
     def __repr__(self):
         return "Class(%s, %s, %s, %s)" % (repr(self.name), repr(self.bases), repr(self.doc), repr(self.code))
 
+    def accept(self, visitor, args):
+        return visitor.visitClass(self, args)
+
 class Compare(Node):
     def __init__(self, expr, ops, lineno=None):
         self.expr = expr
@@ -353,6 +407,9 @@
     def __repr__(self):
         return "Compare(%s, %s)" % (repr(self.expr), repr(self.ops))
 
+    def accept(self, visitor, args):
+        return visitor.visitCompare(self, args)
+
 class Const(Node):
     def __init__(self, value, lineno=None):
         self.value = value
@@ -367,6 +424,9 @@
     def __repr__(self):
         return "Const(%s)" % (repr(self.value),)
 
+    def accept(self, visitor, args):
+        return visitor.visitConst(self, args)
+
 class Continue(Node):
     def __init__(self, lineno=None):
         self.lineno = lineno
@@ -380,6 +440,9 @@
     def __repr__(self):
         return "Continue()"
 
+    def accept(self, visitor, args):
+        return visitor.visitContinue(self, args)
+
 class Decorators(Node):
     def __init__(self, nodes, lineno=None):
         self.nodes = nodes
@@ -396,6 +459,9 @@
     def __repr__(self):
         return "Decorators(%s)" % (repr(self.nodes),)
 
+    def accept(self, visitor, args):
+        return visitor.visitDecorators(self, args)
+
 class Dict(Node):
     def __init__(self, items, lineno=None):
         self.items = items
@@ -412,6 +478,9 @@
     def __repr__(self):
         return "Dict(%s)" % (repr(self.items),)
 
+    def accept(self, visitor, args):
+        return visitor.visitDict(self, args)
+
 class Discard(Node):
     def __init__(self, expr, lineno=None):
         self.expr = expr
@@ -426,6 +495,9 @@
     def __repr__(self):
         return "Discard(%s)" % (repr(self.expr),)
 
+    def accept(self, visitor, args):
+        return visitor.visitDiscard(self, args)
+
 class Div(Node):
     def __init__(self, (left, right), lineno=None):
         self.left = left
@@ -441,6 +513,9 @@
     def __repr__(self):
         return "Div((%s, %s))" % (repr(self.left), repr(self.right))
 
+    def accept(self, visitor, args):
+        return visitor.visitDiv(self, args)
+
 class Ellipsis(Node):
     def __init__(self, lineno=None):
         self.lineno = lineno
@@ -454,6 +529,9 @@
     def __repr__(self):
         return "Ellipsis()"
 
+    def accept(self, visitor, args):
+        return visitor.visitEllipsis(self, args)
+
 class Exec(Node):
     def __init__(self, expr, locals, globals, lineno=None):
         self.expr = expr
@@ -480,6 +558,9 @@
     def __repr__(self):
         return "Exec(%s, %s, %s)" % (repr(self.expr), repr(self.locals), repr(self.globals))
 
+    def accept(self, visitor, args):
+        return visitor.visitExec(self, args)
+
 class FloorDiv(Node):
     def __init__(self, (left, right), lineno=None):
         self.left = left
@@ -495,6 +576,9 @@
     def __repr__(self):
         return "FloorDiv((%s, %s))" % (repr(self.left), repr(self.right))
 
+    def accept(self, visitor, args):
+        return visitor.visitFloorDiv(self, args)
+
 class For(Node):
     def __init__(self, assign, list, body, else_, lineno=None):
         self.assign = assign
@@ -523,6 +607,9 @@
     def __repr__(self):
         return "For(%s, %s, %s, %s)" % (repr(self.assign), repr(self.list), repr(self.body), repr(self.else_))
 
+    def accept(self, visitor, args):
+        return visitor.visitFor(self, args)
+
 class From(Node):
     def __init__(self, modname, names, lineno=None):
         self.modname = modname
@@ -538,6 +625,9 @@
     def __repr__(self):
         return "From(%s, %s)" % (repr(self.modname), repr(self.names))
 
+    def accept(self, visitor, args):
+        return visitor.visitFrom(self, args)
+
 class Function(Node):
     def __init__(self, decorators, name, argnames, defaults, flags, doc, code, lineno=None):
         self.decorators = decorators
@@ -553,7 +643,7 @@
             self.varargs = 1
         if flags & CO_VARKEYWORDS:
             self.kwargs = 1
-
+    
 
 
     def getChildren(self):
@@ -578,13 +668,16 @@
     def __repr__(self):
         return "Function(%s, %s, %s, %s, %s, %s, %s)" % (repr(self.decorators), repr(self.name), repr(self.argnames), repr(self.defaults), repr(self.flags), repr(self.doc), repr(self.code))
 
+    def accept(self, visitor, args):
+        return visitor.visitFunction(self, args)
+
 class GenExpr(Node):
     def __init__(self, code, lineno=None):
         self.code = code
         self.lineno = lineno
         self.argnames = ['[outmost-iterable]']
         self.varargs = self.kwargs = None
-
+    
 
 
     def getChildren(self):
@@ -596,6 +689,9 @@
     def __repr__(self):
         return "GenExpr(%s)" % (repr(self.code),)
 
+    def accept(self, visitor, args):
+        return visitor.visitGenExpr(self, args)
+
 class GenExprFor(Node):
     def __init__(self, assign, iter, ifs, lineno=None):
         self.assign = assign
@@ -622,6 +718,9 @@
     def __repr__(self):
         return "GenExprFor(%s, %s, %s)" % (repr(self.assign), repr(self.iter), repr(self.ifs))
 
+    def accept(self, visitor, args):
+        return visitor.visitGenExprFor(self, args)
+
 class GenExprIf(Node):
     def __init__(self, test, lineno=None):
         self.test = test
@@ -636,6 +735,9 @@
     def __repr__(self):
         return "GenExprIf(%s)" % (repr(self.test),)
 
+    def accept(self, visitor, args):
+        return visitor.visitGenExprIf(self, args)
+
 class GenExprInner(Node):
     def __init__(self, expr, quals, lineno=None):
         self.expr = expr
@@ -657,6 +759,9 @@
     def __repr__(self):
         return "GenExprInner(%s, %s)" % (repr(self.expr), repr(self.quals))
 
+    def accept(self, visitor, args):
+        return visitor.visitGenExprInner(self, args)
+
 class Getattr(Node):
     def __init__(self, expr, attrname, lineno=None):
         self.expr = expr
@@ -672,6 +777,9 @@
     def __repr__(self):
         return "Getattr(%s, %s)" % (repr(self.expr), repr(self.attrname))
 
+    def accept(self, visitor, args):
+        return visitor.visitGetattr(self, args)
+
 class Global(Node):
     def __init__(self, names, lineno=None):
         self.names = names
@@ -686,6 +794,9 @@
     def __repr__(self):
         return "Global(%s)" % (repr(self.names),)
 
+    def accept(self, visitor, args):
+        return visitor.visitGlobal(self, args)
+
 class If(Node):
     def __init__(self, tests, else_, lineno=None):
         self.tests = tests
@@ -708,6 +819,9 @@
     def __repr__(self):
         return "If(%s, %s)" % (repr(self.tests), repr(self.else_))
 
+    def accept(self, visitor, args):
+        return visitor.visitIf(self, args)
+
 class Import(Node):
     def __init__(self, names, lineno=None):
         self.names = names
@@ -722,6 +836,9 @@
     def __repr__(self):
         return "Import(%s)" % (repr(self.names),)
 
+    def accept(self, visitor, args):
+        return visitor.visitImport(self, args)
+
 class Invert(Node):
     def __init__(self, expr, lineno=None):
         self.expr = expr
@@ -736,6 +853,9 @@
     def __repr__(self):
         return "Invert(%s)" % (repr(self.expr),)
 
+    def accept(self, visitor, args):
+        return visitor.visitInvert(self, args)
+
 class Keyword(Node):
     def __init__(self, name, expr, lineno=None):
         self.name = name
@@ -751,6 +871,9 @@
     def __repr__(self):
         return "Keyword(%s, %s)" % (repr(self.name), repr(self.expr))
 
+    def accept(self, visitor, args):
+        return visitor.visitKeyword(self, args)
+
 class Lambda(Node):
     def __init__(self, argnames, defaults, flags, code, lineno=None):
         self.argnames = argnames
@@ -763,7 +886,7 @@
             self.varargs = 1
         if flags & CO_VARKEYWORDS:
             self.kwargs = 1
-
+    
 
 
     def getChildren(self):
@@ -783,6 +906,9 @@
     def __repr__(self):
         return "Lambda(%s, %s, %s, %s)" % (repr(self.argnames), repr(self.defaults), repr(self.flags), repr(self.code))
 
+    def accept(self, visitor, args):
+        return visitor.visitLambda(self, args)
+
 class LeftShift(Node):
     def __init__(self, (left, right), lineno=None):
         self.left = left
@@ -798,6 +924,9 @@
     def __repr__(self):
         return "LeftShift((%s, %s))" % (repr(self.left), repr(self.right))
 
+    def accept(self, visitor, args):
+        return visitor.visitLeftShift(self, args)
+
 class List(Node):
     def __init__(self, nodes, lineno=None):
         self.nodes = nodes
@@ -814,6 +943,9 @@
     def __repr__(self):
         return "List(%s)" % (repr(self.nodes),)
 
+    def accept(self, visitor, args):
+        return visitor.visitList(self, args)
+
 class ListComp(Node):
     def __init__(self, expr, quals, lineno=None):
         self.expr = expr
@@ -835,6 +967,9 @@
     def __repr__(self):
         return "ListComp(%s, %s)" % (repr(self.expr), repr(self.quals))
 
+    def accept(self, visitor, args):
+        return visitor.visitListComp(self, args)
+
 class ListCompFor(Node):
     def __init__(self, assign, list, ifs, lineno=None):
         self.assign = assign
@@ -859,6 +994,9 @@
     def __repr__(self):
         return "ListCompFor(%s, %s, %s)" % (repr(self.assign), repr(self.list), repr(self.ifs))
 
+    def accept(self, visitor, args):
+        return visitor.visitListCompFor(self, args)
+
 class ListCompIf(Node):
     def __init__(self, test, lineno=None):
         self.test = test
@@ -873,6 +1011,9 @@
     def __repr__(self):
         return "ListCompIf(%s)" % (repr(self.test),)
 
+    def accept(self, visitor, args):
+        return visitor.visitListCompIf(self, args)
+
 class Mod(Node):
     def __init__(self, (left, right), lineno=None):
         self.left = left
@@ -888,6 +1029,9 @@
     def __repr__(self):
         return "Mod((%s, %s))" % (repr(self.left), repr(self.right))
 
+    def accept(self, visitor, args):
+        return visitor.visitMod(self, args)
+
 class Module(Node):
     def __init__(self, doc, node, lineno=None):
         self.doc = doc
@@ -903,6 +1047,9 @@
     def __repr__(self):
         return "Module(%s, %s)" % (repr(self.doc), repr(self.node))
 
+    def accept(self, visitor, args):
+        return visitor.visitModule(self, args)
+
 class Mul(Node):
     def __init__(self, (left, right), lineno=None):
         self.left = left
@@ -918,6 +1065,9 @@
     def __repr__(self):
         return "Mul((%s, %s))" % (repr(self.left), repr(self.right))
 
+    def accept(self, visitor, args):
+        return visitor.visitMul(self, args)
+
 class Name(Node):
     def __init__(self, name, lineno=None):
         self.name = name
@@ -932,6 +1082,9 @@
     def __repr__(self):
         return "Name(%s)" % (repr(self.name),)
 
+    def accept(self, visitor, args):
+        return visitor.visitName(self, args)
+
 class Not(Node):
     def __init__(self, expr, lineno=None):
         self.expr = expr
@@ -946,6 +1099,9 @@
     def __repr__(self):
         return "Not(%s)" % (repr(self.expr),)
 
+    def accept(self, visitor, args):
+        return visitor.visitNot(self, args)
+
 class Or(Node):
     def __init__(self, nodes, lineno=None):
         self.nodes = nodes
@@ -962,6 +1118,9 @@
     def __repr__(self):
         return "Or(%s)" % (repr(self.nodes),)
 
+    def accept(self, visitor, args):
+        return visitor.visitOr(self, args)
+
 class Pass(Node):
     def __init__(self, lineno=None):
         self.lineno = lineno
@@ -975,6 +1134,9 @@
     def __repr__(self):
         return "Pass()"
 
+    def accept(self, visitor, args):
+        return visitor.visitPass(self, args)
+
 class Power(Node):
     def __init__(self, (left, right), lineno=None):
         self.left = left
@@ -990,6 +1152,9 @@
     def __repr__(self):
         return "Power((%s, %s))" % (repr(self.left), repr(self.right))
 
+    def accept(self, visitor, args):
+        return visitor.visitPower(self, args)
+
 class Print(Node):
     def __init__(self, nodes, dest, lineno=None):
         self.nodes = nodes
@@ -1012,6 +1177,9 @@
     def __repr__(self):
         return "Print(%s, %s)" % (repr(self.nodes), repr(self.dest))
 
+    def accept(self, visitor, args):
+        return visitor.visitPrint(self, args)
+
 class Printnl(Node):
     def __init__(self, nodes, dest, lineno=None):
         self.nodes = nodes
@@ -1034,6 +1202,9 @@
     def __repr__(self):
         return "Printnl(%s, %s)" % (repr(self.nodes), repr(self.dest))
 
+    def accept(self, visitor, args):
+        return visitor.visitPrintnl(self, args)
+
 class Raise(Node):
     def __init__(self, expr1, expr2, expr3, lineno=None):
         self.expr1 = expr1
@@ -1061,6 +1232,9 @@
     def __repr__(self):
         return "Raise(%s, %s, %s)" % (repr(self.expr1), repr(self.expr2), repr(self.expr3))
 
+    def accept(self, visitor, args):
+        return visitor.visitRaise(self, args)
+
 class Return(Node):
     def __init__(self, value, lineno=None):
         self.value = value
@@ -1075,6 +1249,9 @@
     def __repr__(self):
         return "Return(%s)" % (repr(self.value),)
 
+    def accept(self, visitor, args):
+        return visitor.visitReturn(self, args)
+
 class RightShift(Node):
     def __init__(self, (left, right), lineno=None):
         self.left = left
@@ -1090,6 +1267,9 @@
     def __repr__(self):
         return "RightShift((%s, %s))" % (repr(self.left), repr(self.right))
 
+    def accept(self, visitor, args):
+        return visitor.visitRightShift(self, args)
+
 class Slice(Node):
     def __init__(self, expr, flags, lower, upper, lineno=None):
         self.expr = expr
@@ -1118,6 +1298,9 @@
     def __repr__(self):
         return "Slice(%s, %s, %s, %s)" % (repr(self.expr), repr(self.flags), repr(self.lower), repr(self.upper))
 
+    def accept(self, visitor, args):
+        return visitor.visitSlice(self, args)
+
 class Sliceobj(Node):
     def __init__(self, nodes, lineno=None):
         self.nodes = nodes
@@ -1134,6 +1317,9 @@
     def __repr__(self):
         return "Sliceobj(%s)" % (repr(self.nodes),)
 
+    def accept(self, visitor, args):
+        return visitor.visitSliceobj(self, args)
+
 class Stmt(Node):
     def __init__(self, nodes, lineno=None):
         self.nodes = nodes
@@ -1150,6 +1336,9 @@
     def __repr__(self):
         return "Stmt(%s)" % (repr(self.nodes),)
 
+    def accept(self, visitor, args):
+        return visitor.visitStmt(self, args)
+
 class Sub(Node):
     def __init__(self, (left, right), lineno=None):
         self.left = left
@@ -1165,6 +1354,9 @@
     def __repr__(self):
         return "Sub((%s, %s))" % (repr(self.left), repr(self.right))
 
+    def accept(self, visitor, args):
+        return visitor.visitSub(self, args)
+
 class Subscript(Node):
     def __init__(self, expr, flags, subs, lineno=None):
         self.expr = expr
@@ -1188,6 +1380,9 @@
     def __repr__(self):
         return "Subscript(%s, %s, %s)" % (repr(self.expr), repr(self.flags), repr(self.subs))
 
+    def accept(self, visitor, args):
+        return visitor.visitSubscript(self, args)
+
 class TryExcept(Node):
     def __init__(self, body, handlers, else_, lineno=None):
         self.body = body
@@ -1213,6 +1408,9 @@
     def __repr__(self):
         return "TryExcept(%s, %s, %s)" % (repr(self.body), repr(self.handlers), repr(self.else_))
 
+    def accept(self, visitor, args):
+        return visitor.visitTryExcept(self, args)
+
 class TryFinally(Node):
     def __init__(self, body, final, lineno=None):
         self.body = body
@@ -1228,6 +1426,9 @@
     def __repr__(self):
         return "TryFinally(%s, %s)" % (repr(self.body), repr(self.final))
 
+    def accept(self, visitor, args):
+        return visitor.visitTryFinally(self, args)
+
 class Tuple(Node):
     def __init__(self, nodes, lineno=None):
         self.nodes = nodes
@@ -1244,6 +1445,9 @@
     def __repr__(self):
         return "Tuple(%s)" % (repr(self.nodes),)
 
+    def accept(self, visitor, args):
+        return visitor.visitTuple(self, args)
+
 class UnaryAdd(Node):
     def __init__(self, expr, lineno=None):
         self.expr = expr
@@ -1258,6 +1462,9 @@
     def __repr__(self):
         return "UnaryAdd(%s)" % (repr(self.expr),)
 
+    def accept(self, visitor, args):
+        return visitor.visitUnaryAdd(self, args)
+
 class UnarySub(Node):
     def __init__(self, expr, lineno=None):
         self.expr = expr
@@ -1272,6 +1479,9 @@
     def __repr__(self):
         return "UnarySub(%s)" % (repr(self.expr),)
 
+    def accept(self, visitor, args):
+        return visitor.visitUnarySub(self, args)
+
 class While(Node):
     def __init__(self, test, body, else_, lineno=None):
         self.test = test
@@ -1297,6 +1507,9 @@
     def __repr__(self):
         return "While(%s, %s, %s)" % (repr(self.test), repr(self.body), repr(self.else_))
 
+    def accept(self, visitor, args):
+        return visitor.visitWhile(self, args)
+
 class Yield(Node):
     def __init__(self, value, lineno=None):
         self.value = value
@@ -1311,6 +1524,162 @@
     def __repr__(self):
         return "Yield(%s)" % (repr(self.value),)
 
+    def accept(self, visitor, args):
+        return visitor.visitYield(self, args)
+
+
+class ASTVisitor(object):
+    """This is a visitor base class used to provide the visit
+    method in replacement of the former visitor.visit = walker.dispatch
+    It could also use to identify base type for visit arguments of AST nodes
+    """
+
+    def default(self, node, args):
+        for child in node.getChildNodes():
+            child.visit(self, args)
+
+
+    def visitAdd(self, args):
+        return self.default( args )
+    def visitAnd(self, args):
+        return self.default( args )
+    def visitAssAttr(self, args):
+        return self.default( args )
+    def visitAssList(self, args):
+        return self.default( args )
+    def visitAssName(self, args):
+        return self.default( args )
+    def visitAssTuple(self, args):
+        return self.default( args )
+    def visitAssert(self, args):
+        return self.default( args )
+    def visitAssign(self, args):
+        return self.default( args )
+    def visitAugAssign(self, args):
+        return self.default( args )
+    def visitBackquote(self, args):
+        return self.default( args )
+    def visitBitand(self, args):
+        return self.default( args )
+    def visitBitor(self, args):
+        return self.default( args )
+    def visitBitxor(self, args):
+        return self.default( args )
+    def visitBreak(self, args):
+        return self.default( args )
+    def visitCallFunc(self, args):
+        return self.default( args )
+    def visitClass(self, args):
+        return self.default( args )
+    def visitCompare(self, args):
+        return self.default( args )
+    def visitConst(self, args):
+        return self.default( args )
+    def visitContinue(self, args):
+        return self.default( args )
+    def visitDecorators(self, args):
+        return self.default( args )
+    def visitDict(self, args):
+        return self.default( args )
+    def visitDiscard(self, args):
+        return self.default( args )
+    def visitDiv(self, args):
+        return self.default( args )
+    def visitEllipsis(self, args):
+        return self.default( args )
+    def visitExec(self, args):
+        return self.default( args )
+    def visitFloorDiv(self, args):
+        return self.default( args )
+    def visitFor(self, args):
+        return self.default( args )
+    def visitFrom(self, args):
+        return self.default( args )
+    def visitFunction(self, args):
+        return self.default( args )
+    def visitGenExpr(self, args):
+        return self.default( args )
+    def visitGenExprFor(self, args):
+        return self.default( args )
+    def visitGenExprIf(self, args):
+        return self.default( args )
+    def visitGenExprInner(self, args):
+        return self.default( args )
+    def visitGetattr(self, args):
+        return self.default( args )
+    def visitGlobal(self, args):
+        return self.default( args )
+    def visitIf(self, args):
+        return self.default( args )
+    def visitImport(self, args):
+        return self.default( args )
+    def visitInvert(self, args):
+        return self.default( args )
+    def visitKeyword(self, args):
+        return self.default( args )
+    def visitLambda(self, args):
+        return self.default( args )
+    def visitLeftShift(self, args):
+        return self.default( args )
+    def visitList(self, args):
+        return self.default( args )
+    def visitListComp(self, args):
+        return self.default( args )
+    def visitListCompFor(self, args):
+        return self.default( args )
+    def visitListCompIf(self, args):
+        return self.default( args )
+    def visitMod(self, args):
+        return self.default( args )
+    def visitModule(self, args):
+        return self.default( args )
+    def visitMul(self, args):
+        return self.default( args )
+    def visitName(self, args):
+        return self.default( args )
+    def visitNot(self, args):
+        return self.default( args )
+    def visitOr(self, args):
+        return self.default( args )
+    def visitPass(self, args):
+        return self.default( args )
+    def visitPower(self, args):
+        return self.default( args )
+    def visitPrint(self, args):
+        return self.default( args )
+    def visitPrintnl(self, args):
+        return self.default( args )
+    def visitRaise(self, args):
+        return self.default( args )
+    def visitReturn(self, args):
+        return self.default( args )
+    def visitRightShift(self, args):
+        return self.default( args )
+    def visitSlice(self, args):
+        return self.default( args )
+    def visitSliceobj(self, args):
+        return self.default( args )
+    def visitStmt(self, args):
+        return self.default( args )
+    def visitSub(self, args):
+        return self.default( args )
+    def visitSubscript(self, args):
+        return self.default( args )
+    def visitTryExcept(self, args):
+        return self.default( args )
+    def visitTryFinally(self, args):
+        return self.default( args )
+    def visitTuple(self, args):
+        return self.default( args )
+    def visitUnaryAdd(self, args):
+        return self.default( args )
+    def visitUnarySub(self, args):
+        return self.default( args )
+    def visitWhile(self, args):
+        return self.default( args )
+    def visitYield(self, args):
+        return self.default( args )
+
 for name, obj in globals().items():
     if isinstance(obj, type) and issubclass(obj, Node):
         nodes[name.lower()] = obj

Copied: pypy/dist/pypy/interpreter/astcompiler/astgen.py (from r14148, pypy/branch/pycompiler/module/recparser/compiler/astgen.py)
==============================================================================
--- pypy/branch/pycompiler/module/recparser/compiler/astgen.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/astgen.py	Wed Jul  6 18:45:36 2005
@@ -192,8 +192,12 @@
             print >> buf, '        return "%s()"' % self.name
 
     def _gen_visit(self, buf):
-        print >> buf, "    def visit(self, visitor, *args):"
-        print >> buf, "        return visitor.visit%s(self, *args)" % self.name
+        print >> buf, "    def accept(self, visitor, args):"
+        print >> buf, "        return visitor.visit%s(self, args)" % self.name
+
+    def gen_base_visit(self, buf):
+        print >> buf, "    def visit%s(self, args):" % self.name
+        print >> buf, "        return self.default( args )"
 
 rx_init = re.compile('init\((.*)\):')
 
@@ -222,6 +226,26 @@
             cur = classes[name]
     return sorted(classes.values(), key=lambda n: n.name)
 
+ASTVISITORCLASS='''
+class ASTVisitor(object):
+    """This is a visitor base class used to provide the visit
+    method in replacement of the former visitor.visit = walker.dispatch
+    It could also use to identify base type for visit arguments of AST nodes
+    """
+
+    def default(self, node, args):
+        for child in node.getChildNodes():
+            child.visit(self, args)
+
+'''
+
+def gen_ast_visitor(classes):
+    print ASTVISITORCLASS
+    buf = StringIO()
+    for info in classes:
+        info.gen_base_visit(buf)
+    print buf.getvalue()
+
 def main():
     prologue, epilogue = load_boilerplate(sys.argv[-1])
     print prologue
@@ -229,6 +253,7 @@
     classes = parse_spec(SPEC)
     for info in classes:
         print info.gen_source()
+    gen_ast_visitor(classes)
     print epilogue
 
 if __name__ == "__main__":

Modified: pypy/dist/pypy/interpreter/astcompiler/transformer.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/transformer.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/transformer.py	Wed Jul  6 18:45:36 2005
@@ -21,6 +21,8 @@
 # Portions of this file are:
 # Copyright (C) 1997-1998 Greg Stein. All Rights Reserved.
 #
+# Modified for PYPY
+#
 # This module is provided under a BSD-ish license. See
 #   http://www.opensource.org/licenses/bsd-license.html
 # and replace OWNER, ORGANIZATION, and YEAR as appropriate.



More information about the Pypy-commit mailing list