Mercurial > python-compiler.rs
comparison src/ast_dump.rs @ 0:211b0df72e64
Hello world!
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sun, 29 May 2016 19:15:02 +0100 |
parents | |
children | b90e49ab734b |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:211b0df72e64 |
---|---|
1 use python_ast::{Module, Statement, Expr, BinOp}; | |
2 | |
3 use std::iter; | |
4 | |
5 impl BinOp { | |
6 fn to_string(&self) -> &'static str { | |
7 match *self { | |
8 BinOp::BinAdd => "+", | |
9 BinOp::BinMult => "*", | |
10 BinOp::BinEq => "==", | |
11 BinOp::BinLt => "<", | |
12 BinOp::Error => "BinOp::Error" | |
13 } | |
14 } | |
15 } | |
16 | |
17 impl Expr { | |
18 fn to_string(&self) -> String { | |
19 match self.clone() { | |
20 Expr::BinOp(a, op, b) => format!("{} {} {}", a.to_string(), op.to_string(), b.to_string()), | |
21 Expr::Compare(left, ops, comparators) => format!("{} {}", left.to_string(), { | |
22 let mut arguments = vec!(); | |
23 | |
24 // XXX: wrong order! | |
25 for op in ops { | |
26 arguments.push(op.to_string().to_string()) | |
27 } | |
28 for comparator in comparators { | |
29 arguments.push(comparator.to_string()) | |
30 } | |
31 /* | |
32 for (op, comparator) in ops.zip(comparators) { | |
33 let op = op.unwrap(); | |
34 let comparator = comparator.unwrap(); | |
35 arguments.push(format!("{} {}", op.to_string(), comparator.to_string())) | |
36 } | |
37 */ | |
38 | |
39 arguments.join(" ") | |
40 }), | |
41 Expr::Call(func, args) => format!("{}({})", func.to_string(), { | |
42 let mut arguments = vec!(); | |
43 for arg in args { | |
44 arguments.push(arg.to_string()); | |
45 } | |
46 arguments.join(", ") | |
47 }), | |
48 Expr::Alias(name, asname) => { | |
49 if asname.is_empty() { | |
50 format!("{}", name) | |
51 } else { | |
52 format!("{} as {}", name, asname) | |
53 } | |
54 } | |
55 Expr::Name(name) => format!("{}", name), | |
56 Expr::NameConstant(name) => format!("{}", name), | |
57 Expr::Str(s) => format!("\"{}\"", s), | |
58 Expr::Num(n) => format!("{}", n), | |
59 Expr::Error => "Expr::Error".to_string() | |
60 } | |
61 } | |
62 } | |
63 | |
64 fn make_indent(indent: usize) -> String { | |
65 let indent: String = iter::repeat(" ").take(indent).collect(); | |
66 indent | |
67 } | |
68 | |
69 impl Statement { | |
70 fn to_string(&self, indent: usize) -> String { | |
71 match self.clone() { | |
72 Statement::FunctionDef(Expr::Name(name), arguments, body) => format!("{}def {}({}):\n{}", make_indent(indent), name, { | |
73 let mut args = vec!(); | |
74 for arg in arguments { | |
75 args.push(arg.to_string()); | |
76 } | |
77 args.join(", ") | |
78 }, { | |
79 let mut statements = vec!(); | |
80 for statement in body { | |
81 statements.push(statement.to_string(indent + 1)); | |
82 } | |
83 statements.join("\n") | |
84 }), | |
85 Statement::FunctionDef(_, _, _) => format!("error!"), | |
86 Statement::Global(names) => format!("{}global {}", make_indent(indent), names.join(", ")), | |
87 Statement::If(test, body, orelse) => format!("{}if {}:\n{}", make_indent(indent), test.to_string(), { | |
88 let mut statements = vec!(); | |
89 for arg in body { | |
90 statements.push(arg.to_string(indent + 1)); | |
91 } | |
92 | |
93 let mut orelse_ = vec!(); | |
94 for arg in orelse { | |
95 orelse_.push(arg.to_string(indent + 1)); | |
96 } | |
97 | |
98 if orelse_.is_empty() { | |
99 statements.join("\n") | |
100 } else { | |
101 format!("{}\n{}else:\n{}", statements.join("\n"), make_indent(indent), orelse_.join("\n")) | |
102 } | |
103 }), | |
104 Statement::Assign(targets, value) => format!("{}{} = {}", make_indent(indent), { | |
105 let mut exprs = vec!(); | |
106 for target in targets { | |
107 exprs.push(target.to_string()); | |
108 } | |
109 exprs.join(", ") | |
110 }, value.to_string()), | |
111 Statement::Return(expr) => format!("{}return {}", make_indent(indent), expr.to_string()), | |
112 Statement::ImportFrom(module, names) => format!("{}from {} import {}", make_indent(indent), module.to_string(), { | |
113 let mut exprs = vec!(); | |
114 for alias in names.iter() { | |
115 let alias = alias.to_string(); | |
116 exprs.push(alias); | |
117 } | |
118 exprs.join(", ") | |
119 }), | |
120 Statement::Expr(expr) => format!("{}{}", make_indent(indent), expr.to_string()), | |
121 Statement::Error => format!("{}Statement::Error", make_indent(indent)) | |
122 } | |
123 } | |
124 } | |
125 | |
126 #[allow(dead_code)] | |
127 pub fn dump_ast(ast: &Module) { | |
128 for statement in &ast.statements { | |
129 println!("{}", statement.to_string(0)); | |
130 } | |
131 } |