diff options
author | Martin v. Löwis <martin@v.loewis.de> | 2006-02-28 21:41:30 +0000 |
---|---|---|
committer | Martin v. Löwis <martin@v.loewis.de> | 2006-02-28 21:41:30 +0000 |
commit | fabb57675972d7648c02f6baffd54f64f82ea069 (patch) | |
tree | e52ad340f47540b3027e2995bcc3883deafa56f8 /Demo/parser | |
parent | 872676ee12ccebabfd70602e81707e100f21790d (diff) | |
download | cpython-fabb57675972d7648c02f6baffd54f64f82ea069.tar.gz |
unparse.py can now unparse itself.
Diffstat (limited to 'Demo/parser')
-rw-r--r-- | Demo/parser/unparse.py | 141 |
1 files changed, 139 insertions, 2 deletions
diff --git a/Demo/parser/unparse.py b/Demo/parser/unparse.py index 72691b5ec7..dd75c227ee 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(", ") |