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

pedronis at codespeak.net pedronis at codespeak.net
Fri Sep 9 17:06:18 CEST 2005


Author: pedronis
Date: Fri Sep  9 17:06:16 2005
New Revision: 17407

Modified:
   pypy/dist/pypy/interpreter/astcompiler/ast.py
   pypy/dist/pypy/interpreter/astcompiler/ast.txt
   pypy/dist/pypy/interpreter/astcompiler/astgen.py
Log:
introduce some more common bases in the ast hierarchy to avoid all attributes to migrate to Node.

Some more work required on this.



Modified: pypy/dist/pypy/interpreter/astcompiler/ast.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/ast.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/ast.py	Fri Sep  9 17:06:16 2005
@@ -72,7 +72,58 @@
     def accept(self, visitor):
         return visitor.visitExpression(self)
 
-class Add(Node):
+class AbstractFunction(Node):
+    def __init__(self, lineno=-1):
+        Node.__init__(self, lineno)
+
+    def getChildren(self):
+        "NOT_RPYTHON"
+        return []
+
+    def getChildNodes(self):
+        return []
+
+    def __repr__(self):
+        return "AbstractFunction()"
+
+    def accept(self, visitor):
+        return visitor.visitAbstractFunction(self)
+
+class AbstractTest(Node):
+    def __init__(self, lineno=-1):
+        Node.__init__(self, lineno)
+
+    def getChildren(self):
+        "NOT_RPYTHON"
+        return []
+
+    def getChildNodes(self):
+        return []
+
+    def __repr__(self):
+        return "AbstractTest()"
+
+    def accept(self, visitor):
+        return visitor.visitAbstractTest(self)
+
+class BinaryOp(Node):
+    def __init__(self, lineno=-1):
+        Node.__init__(self, lineno)
+
+    def getChildren(self):
+        "NOT_RPYTHON"
+        return []
+
+    def getChildNodes(self):
+        return []
+
+    def __repr__(self):
+        return "BinaryOp()"
+
+    def accept(self, visitor):
+        return visitor.visitBinaryOp(self)
+
+class Add(BinaryOp):
     def __init__(self, (left, right), lineno=-1):
         Node.__init__(self, lineno)
         self.left = left
@@ -91,7 +142,7 @@
     def accept(self, visitor):
         return visitor.visitAdd(self)
 
-class And(Node):
+class And(AbstractTest):
     def __init__(self, nodes, lineno=-1):
         Node.__init__(self, lineno)
         self.nodes = nodes
@@ -274,7 +325,24 @@
     def accept(self, visitor):
         return visitor.visitAugAssign(self)
 
-class Backquote(Node):
+class UnaryOp(Node):
+    def __init__(self, lineno=-1):
+        Node.__init__(self, lineno)
+
+    def getChildren(self):
+        "NOT_RPYTHON"
+        return []
+
+    def getChildNodes(self):
+        return []
+
+    def __repr__(self):
+        return "UnaryOp()"
+
+    def accept(self, visitor):
+        return visitor.visitUnaryOp(self)
+
+class Backquote(UnaryOp):
     def __init__(self, expr, lineno=-1):
         Node.__init__(self, lineno)
         self.expr = expr
@@ -292,7 +360,24 @@
     def accept(self, visitor):
         return visitor.visitBackquote(self)
 
-class Bitand(Node):
+class BitOp(Node):
+    def __init__(self, lineno=-1):
+        Node.__init__(self, lineno)
+
+    def getChildren(self):
+        "NOT_RPYTHON"
+        return []
+
+    def getChildNodes(self):
+        return []
+
+    def __repr__(self):
+        return "BitOp()"
+
+    def accept(self, visitor):
+        return visitor.visitBitOp(self)
+
+class Bitand(BitOp):
     def __init__(self, nodes, lineno=-1):
         Node.__init__(self, lineno)
         self.nodes = nodes
@@ -312,7 +397,7 @@
     def accept(self, visitor):
         return visitor.visitBitand(self)
 
-class Bitor(Node):
+class Bitor(BitOp):
     def __init__(self, nodes, lineno=-1):
         Node.__init__(self, lineno)
         self.nodes = nodes
@@ -332,7 +417,7 @@
     def accept(self, visitor):
         return visitor.visitBitor(self)
 
-class Bitxor(Node):
+class Bitxor(BitOp):
     def __init__(self, nodes, lineno=-1):
         Node.__init__(self, lineno)
         self.nodes = nodes
@@ -556,7 +641,7 @@
     def accept(self, visitor):
         return visitor.visitDiscard(self)
 
-class Div(Node):
+class Div(BinaryOp):
     def __init__(self, (left, right), lineno=-1):
         Node.__init__(self, lineno)
         self.left = left
@@ -622,7 +707,7 @@
     def accept(self, visitor):
         return visitor.visitExec(self)
 
-class FloorDiv(Node):
+class FloorDiv(BinaryOp):
     def __init__(self, (left, right), lineno=-1):
         Node.__init__(self, lineno)
         self.left = left
@@ -692,7 +777,7 @@
     def accept(self, visitor):
         return visitor.visitFrom(self)
 
-class Function(Node):
+class Function(AbstractFunction):
     def __init__(self, decorators, name, argnames, defaults, flags, doc, code, lineno=-1):
         Node.__init__(self, lineno)
         self.decorators = decorators
@@ -736,7 +821,7 @@
     def accept(self, visitor):
         return visitor.visitFunction(self)
 
-class GenExpr(Node):
+class GenExpr(AbstractFunction):
     def __init__(self, code, lineno=-1):
         Node.__init__(self, lineno)
         self.code = code
@@ -917,7 +1002,7 @@
     def accept(self, visitor):
         return visitor.visitImport(self)
 
-class Invert(Node):
+class Invert(UnaryOp):
     def __init__(self, expr, lineno=-1):
         Node.__init__(self, lineno)
         self.expr = expr
@@ -954,7 +1039,7 @@
     def accept(self, visitor):
         return visitor.visitKeyword(self)
 
-class Lambda(Node):
+class Lambda(AbstractFunction):
     def __init__(self, argnames, defaults, flags, code, lineno=-1):
         Node.__init__(self, lineno)
         self.argnames = argnames
@@ -990,7 +1075,7 @@
     def accept(self, visitor):
         return visitor.visitLambda(self)
 
-class LeftShift(Node):
+class LeftShift(BinaryOp):
     def __init__(self, (left, right), lineno=-1):
         Node.__init__(self, lineno)
         self.left = left
@@ -1100,7 +1185,7 @@
     def accept(self, visitor):
         return visitor.visitListCompIf(self)
 
-class Mod(Node):
+class Mod(BinaryOp):
     def __init__(self, (left, right), lineno=-1):
         Node.__init__(self, lineno)
         self.left = left
@@ -1138,7 +1223,7 @@
     def accept(self, visitor):
         return visitor.visitModule(self)
 
-class Mul(Node):
+class Mul(BinaryOp):
     def __init__(self, (left, right), lineno=-1):
         Node.__init__(self, lineno)
         self.left = left
@@ -1192,7 +1277,7 @@
     def accept(self, visitor):
         return visitor.visitNoneConst(self)
 
-class Not(Node):
+class Not(UnaryOp):
     def __init__(self, expr, lineno=-1):
         Node.__init__(self, lineno)
         self.expr = expr
@@ -1228,7 +1313,7 @@
     def accept(self, visitor):
         return visitor.visitNumberConst(self)
 
-class Or(Node):
+class Or(AbstractTest):
     def __init__(self, nodes, lineno=-1):
         Node.__init__(self, lineno)
         self.nodes = nodes
@@ -1265,7 +1350,7 @@
     def accept(self, visitor):
         return visitor.visitPass(self)
 
-class Power(Node):
+class Power(BinaryOp):
     def __init__(self, (left, right), lineno=-1):
         Node.__init__(self, lineno)
         self.left = left
@@ -1385,7 +1470,7 @@
     def accept(self, visitor):
         return visitor.visitReturn(self)
 
-class RightShift(Node):
+class RightShift(BinaryOp):
     def __init__(self, (left, right), lineno=-1):
         Node.__init__(self, lineno)
         self.left = left
@@ -1494,7 +1579,7 @@
     def accept(self, visitor):
         return visitor.visitStringConst(self)
 
-class Sub(Node):
+class Sub(BinaryOp):
     def __init__(self, (left, right), lineno=-1):
         Node.__init__(self, lineno)
         self.left = left
@@ -1616,7 +1701,7 @@
     def accept(self, visitor):
         return visitor.visitTuple(self)
 
-class UnaryAdd(Node):
+class UnaryAdd(UnaryOp):
     def __init__(self, expr, lineno=-1):
         Node.__init__(self, lineno)
         self.expr = expr
@@ -1634,7 +1719,7 @@
     def accept(self, visitor):
         return visitor.visitUnaryAdd(self)
 
-class UnarySub(Node):
+class UnarySub(UnaryOp):
     def __init__(self, expr, lineno=-1):
         Node.__init__(self, lineno)
         self.expr = expr
@@ -1717,6 +1802,10 @@
         return self.default(node)
 
 
+    def visitAbstractFunction(self, node):
+        return self.default( node )
+    def visitAbstractTest(self, node):
+        return self.default( node )
     def visitAdd(self, node):
         return self.default( node )
     def visitAnd(self, node):
@@ -1737,6 +1826,10 @@
         return self.default( node )
     def visitBackquote(self, node):
         return self.default( node )
+    def visitBinaryOp(self, node):
+        return self.default( node )
+    def visitBitOp(self, node):
+        return self.default( node )
     def visitBitand(self, node):
         return self.default( node )
     def visitBitor(self, node):
@@ -1857,6 +1950,8 @@
         return self.default( node )
     def visitUnaryAdd(self, node):
         return self.default( node )
+    def visitUnaryOp(self, node):
+        return self.default( node )
     def visitUnarySub(self, node):
         return self.default( node )
     def visitWhile(self, node):

Modified: pypy/dist/pypy/interpreter/astcompiler/ast.txt
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/ast.txt	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/ast.txt	Fri Sep  9 17:06:16 2005
@@ -9,8 +9,9 @@
 Module: doc*, node
 Stmt: nodes!
 Decorators: nodes!
-Function: decorators&, name*, argnames*, defaults!, flags*, doc*, code
-Lambda: argnames*, defaults!, flags*, code
+AbstractFunction:
+Function(AbstractFunction): decorators&, name*, argnames*, defaults!, flags*, doc*, code
+Lambda(AbstractFunction): argnames*, defaults!, flags*, code
 Class: name*, bases!, doc*, code
 Pass: 
 Break: 
@@ -42,17 +43,18 @@
 ListComp: expr, quals!
 ListCompFor: assign, list, ifs!
 ListCompIf: test
-GenExpr: code 
+GenExpr(AbstractFunction): code 
 GenExprInner: expr, quals!
 GenExprFor: assign, iter, ifs!
 GenExprIf: test
 List: nodes!
 Dict: items!
-Not: expr
+UnaryOp:
+Not(UnaryOp): expr
 Compare: expr, ops!
 Name: varname*
 Global: names*
-Backquote: expr
+Backquote(UnaryOp): expr
 Getattr: expr, attrname*
 CallFunc: node, args!, star_args& = None, dstar_args& = None
 Keyword: name*, expr
@@ -62,23 +64,26 @@
 Slice: expr, flags*, lower&, upper&
 Assert: test, fail&
 Tuple: nodes!
-Or: nodes!
-And: nodes!
-Bitor: nodes!
-Bitxor: nodes!
-Bitand: nodes!
-LeftShift: (left, right)
-RightShift: (left, right)
-Add: (left, right)
-Sub: (left, right)
-Mul: (left, right)
-Div: (left, right)
-Mod: (left, right)
-Power: (left, right)
-FloorDiv: (left, right)
-UnaryAdd: expr
-UnarySub: expr
-Invert: expr
+AbstractTest:
+Or(AbstractTest): nodes!
+And(AbstractTest): nodes!
+BitOp:
+Bitor(BitOp): nodes!
+Bitxor(BitOp): nodes!
+Bitand(BitOp): nodes!
+BinaryOp:
+LeftShift(BinaryOp): (left, right)
+RightShift(BinaryOp): (left, right)
+Add(BinaryOp): (left, right)
+Sub(BinaryOp): (left, right)
+Mul(BinaryOp): (left, right)
+Div(BinaryOp): (left, right)
+Mod(BinaryOp): (left, right)
+Power(BinaryOp): (left, right)
+FloorDiv(BinaryOp): (left, right)
+UnaryAdd(UnaryOp): expr
+UnarySub(UnaryOp): expr
+Invert(UnaryOp): expr
 
 init(Function):
     self.varargs = self.kwargs = 0

Modified: pypy/dist/pypy/interpreter/astcompiler/astgen.py
==============================================================================
--- pypy/dist/pypy/interpreter/astcompiler/astgen.py	(original)
+++ pypy/dist/pypy/interpreter/astcompiler/astgen.py	Fri Sep  9 17:06:16 2005
@@ -58,7 +58,7 @@
         if self.parent:
             self.parent = classes[self.parent]
         else:
-            self.parent = NodeInfo("Node","")
+            self.parent = Node_NodeInfo
 
     def get_argnames(self):
         if '(' in self.args:
@@ -232,6 +232,8 @@
         print >> buf, "    def visit%s(self, node):" % self.name
         print >> buf, "        return self.default( node )"
 
+Node_NodeInfo = NodeInfo("Node","")
+
 rx_init = re.compile('init\((.*)\):')
 rx_flatten_nodes = re.compile('flatten_nodes\((.*)\.(.*)\):')
 rx_additional_methods = re.compile('(.*)\.(.*)\((.*?)\):')
@@ -331,8 +333,15 @@
     print prologue
     print
     classes = parse_spec(SPEC)
-    for info in classes:
+    emitted = {Node_NodeInfo: True}
+    def emit(info):
+        if info in emitted:
+            return
+        emitted[info] = True
+        emit(info.parent)
         print info.gen_source()
+    for info in classes:
+        emit(info)
     gen_ast_visitor(classes)
     print epilogue
 



More information about the Pypy-commit mailing list