summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2006-02-28 21:41:30 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2006-02-28 21:41:30 (GMT)
commit87a8b4fee56b8204ee9f7b0ce2e5db0564e8f86e (patch)
tree948a60d492ea6fbb64c7a2e3a6f8af04a906d3e6
parentcd8ca8092f5ccdafe80e81488baf867041afc2b1 (diff)
downloadcpython-87a8b4fee56b8204ee9f7b0ce2e5db0564e8f86e.zip
cpython-87a8b4fee56b8204ee9f7b0ce2e5db0564e8f86e.tar.gz
cpython-87a8b4fee56b8204ee9f7b0ce2e5db0564e8f86e.tar.bz2
unparse.py can now unparse itself.
-rw-r--r--Demo/parser/unparse.py141
1 files changed, 139 insertions, 2 deletions
diff --git a/Demo/parser/unparse.py b/Demo/parser/unparse.py
index 72691b5..dd75c22 100644
--- a/Demo/parser/unparse.py
+++ b/Demo/parser/unparse.py
@@ -12,6 +12,7 @@ class Unparser:
self.f = file
self._indent = 0
self.dispatch(tree)
+ print >>self.f,""
self.f.flush()
def fill(self, text = ""):
@@ -76,6 +77,31 @@ class Unparser:
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 @@ class Unparser:
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 @@ class Unparser:
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 @@ class Unparser:
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 @@ class Unparser:
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(", ")