[Python-checkins] r42685 - python/trunk/Demo/parser/unparse.py

martin.v.loewis python-checkins at python.org
Tue Feb 28 22:41:31 CET 2006


Author: martin.v.loewis
Date: Tue Feb 28 22:41:30 2006
New Revision: 42685

Modified:
   python/trunk/Demo/parser/unparse.py
Log:
unparse.py can now unparse itself.


Modified: python/trunk/Demo/parser/unparse.py
==============================================================================
--- python/trunk/Demo/parser/unparse.py	(original)
+++ python/trunk/Demo/parser/unparse.py	Tue Feb 28 22:41:30 2006
@@ -12,6 +12,7 @@
         self.f = file
         self._indent = 0
         self.dispatch(tree)
+        print >>self.f,""
         self.f.flush()
 
     def fill(self, text = ""):
@@ -76,6 +77,31 @@
             self.write(" = ")
         self.dispatch(t.value)
 
+    def _AugAssign(self, t):
+        self.fill()
+        self.dispatch(t.target)
+        self.write(" "+self.binop[t.op.__class__.__name__]+"= ")
+        self.dispatch(t.value)
+
+    def _Return(self, t):
+        self.fill("return ")
+        if t.value:
+            self.dispatch(t.value)
+
+    def _Print(self, t):
+        self.fill("print ")
+        do_comma = False
+        if t.dest:
+            self.write(">>")
+            self.dispatch(t.dest)
+            do_comma = True
+        for e in t.values:
+            if do_comma:self.write(", ")
+            else:do_comma=True
+            self.dispatch(e)
+        if not t.nl:
+            self.write(",")
+
     def _ClassDef(self, t):
         self.write("\n")
         self.fill("class "+t.name)
@@ -110,6 +136,20 @@
             self.dispatch(t.orelse)
             self.leave()
 
+    def _For(self, t):
+        self.fill("for ")
+        self.dispatch(t.target)
+        self.write(" in ")
+        self.dispatch(t.iter)
+        self.enter()
+        self.dispatch(t.body)
+        self.leave()
+        if t.orelse:
+            self.fill("else")
+            self.enter()
+            self.dispatch(t.orelse)
+            self.leave
+
     # expr
     def _Str(self, tree):
         self.write(repr(tree.s))
@@ -117,6 +157,9 @@
     def _Name(self, t):
         self.write(t.id)
 
+    def _Num(self, t):
+        self.write(repr(t.n))
+
     def _List(self, t):
         self.write("[")
         for e in t.elts:
@@ -124,6 +167,25 @@
             self.write(", ")
         self.write("]")
 
+    def _Dict(self, t):
+        self.write("{")
+        for k,v in zip(t.keys, t.values):
+            self.dispatch(k)
+            self.write(" : ")
+            self.dispatch(v)
+            self.write(", ")
+        self.write("}")
+
+    def _Tuple(self, t):
+        if not t.elts:
+            self.write("()")
+            return
+        self.write("(")
+        for e in t.elts:
+            self.dispatch(e)
+            self.write(", ")
+        self.write(")")
+
     unop = {"Invert":"~", "Not": "not", "UAdd":"+", "USub":"-"}
     def _UnaryOp(self, t):
         self.write(self.unop[t.op.__class__.__name__])
@@ -131,14 +193,89 @@
         self.dispatch(t.operand)
         self.write(")")
 
+    binop = { "Add":"+", "Sub":"-", "Mult":"*", "Div":"/", "Mod":"%",
+                    "RShift":"<<", "BitOr":"|", "BitXor":"^", "BitAnd":"&",
+                    "FloorDiv":"//"}
+    def _BinOp(self, t):
+        self.write("(")
+        self.dispatch(t.left)
+        self.write(")" + self.binop[t.op.__class__.__name__] + "(")
+        self.dispatch(t.right)
+        self.write(")")
+
+    cmpops = {"Eq":"==", "NotEq":"!=", "Lt":"<", "LtE":"<=", "Gt":">", "GtE":">=",
+                        "Is":"is", "IsNot":"is not", "In":"in", "NotIn":"not in"}
+    def _Compare(self, t):
+        self.write("(")
+        self.dispatch(t.left)
+        for o, e in zip(t.ops, t.comparators):
+            self.write(") " +self.cmpops[o.__class__.__name__] + " (")
+            self.dispatch(e)
+            self.write(")")
+
+    def _Attribute(self,t):
+        self.dispatch(t.value)
+        self.write(".")
+        self.write(t.attr)
+
+    def _Call(self, t):
+        self.dispatch(t.func)
+        self.write("(")
+        comma = False
+        for e in t.args:
+            if comma: self.write(", ")
+            else: comma = True
+            self.dispatch(e)
+        for e in t.keywords:
+            if comma: self.write(", ")
+            else: comma = True
+            self.dispatch(e)
+        if t.starargs:
+            if comma: self.write(", ")
+            else: comma = True
+            self.write("*")
+            self.dispatch(t.stararg)
+        if t.kwargs:
+            if comma: self.write(", ")
+            else: comma = True
+            self.write("**")
+            self.dispatch(t.stararg)
+        self.write(")")
+
+    def _Subscript(self, t):
+        self.dispatch(t.value)
+        self.write("[")
+        self.dispatch(t.slice)
+        self.write("]")
+
+    # slice
+    def _Index(self, t):
+        self.dispatch(t.value)
+
+    def _Slice(self, t):
+        if t.lower:
+            self.dispatch(t.lower)
+        self.write(":")
+        if t.upper:
+            self.dispatch(t.upper)
+        if t.step:
+            self.write(":")
+            self.dispatch(t.step)
+
     # others
     def _arguments(self, t):
         first = True
-        # XXX t.defaults
-        for a in t.args:
+        nonDef = len(t.args)-len(t.defaults)
+        for a in t.args[0:nonDef]:
             if first:first = False
             else: self.write(", ")
             self.dispatch(a)
+        for a,d in zip(t.args[nonDef:], t.defaults):
+            if first:first = False
+            else: self.write(", ")
+            self.dispatch(a),
+            self.write("=")
+            self.dispatch(d)
         if t.vararg:
             if first:first = False
             else: self.write(", ")


More information about the Python-checkins mailing list