Mercurial > python-compiler.rs
comparison src/ast_rewrite.rs @ 0:211b0df72e64
Hello world!
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Sun, 29 May 2016 19:15:02 +0100 |
parents | |
children | ddf372373a77 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:211b0df72e64 |
---|---|
1 use python_ast::{Module, Statement, Expr}; | |
2 | |
3 trait Visitor<T> { | |
4 fn visit_module(&mut self, module: Module) -> T; | |
5 fn visit_statement(&mut self, statement: Statement) -> T; | |
6 fn visit_expr(&mut self, expr: Expr) -> T; | |
7 } | |
8 | |
9 struct Rewrite { | |
10 } | |
11 | |
12 impl Visitor<()> for Rewrite { | |
13 fn visit_module(&mut self, module: Module) -> () { | |
14 for statement in module.statements { | |
15 println!("{:?}", statement); | |
16 self.visit_statement(statement); | |
17 } | |
18 } | |
19 | |
20 fn visit_statement(&mut self, statement: Statement) -> () { | |
21 match statement { | |
22 Statement::FunctionDef(Expr::Name(name), arguments, body) => { | |
23 for expr in arguments { | |
24 self.visit_expr(expr); | |
25 } | |
26 for statement in body { | |
27 self.visit_statement(statement); | |
28 } | |
29 }, | |
30 Statement::FunctionDef(_, _, _) => { | |
31 println!("Statement:FunctionDef Error"); | |
32 panic!() | |
33 }, | |
34 Statement::If(test, body, orelse) => { | |
35 self.visit_expr(test); | |
36 for statement in body { | |
37 self.visit_statement(statement); | |
38 } | |
39 for statement in orelse { | |
40 self.visit_statement(statement); | |
41 } | |
42 }, | |
43 Statement::Assign(targets, value) => { | |
44 self.visit_expr(value); | |
45 for target in targets { | |
46 self.visit_expr(target); | |
47 } | |
48 }, | |
49 Statement::Return(expr) => { | |
50 self.visit_expr(expr); | |
51 }, | |
52 Statement::ImportFrom(module, names) => { | |
53 //self.visit_expr(module); | |
54 }, | |
55 Statement::Expr(expr) => { | |
56 self.visit_expr(expr); | |
57 }, | |
58 Statement::Error => { | |
59 println!("Statement::Error"); | |
60 panic!() | |
61 }, | |
62 } | |
63 } | |
64 | |
65 fn visit_expr(&mut self, expr: Expr) -> () { | |
66 match expr { | |
67 Expr::BinOp(left, op, right) => { | |
68 self.visit_expr(*left); | |
69 self.visit_expr(*right); | |
70 }, | |
71 Expr::Compare(left, ops, comparators) => { | |
72 self.visit_expr(*left); | |
73 }, | |
74 Expr::Call(func, args) => { | |
75 let func = *func; | |
76 let func = match func { | |
77 Expr::Name(arg) => arg, | |
78 _ => panic!() | |
79 }; | |
80 for expr in args { | |
81 self.visit_expr(expr); | |
82 } | |
83 }, | |
84 Expr::Alias(_, _) => (), | |
85 Expr::Name(_) => (), | |
86 Expr::NameConstant(value) => (), | |
87 Expr::Str(_) => (), | |
88 Expr::Num(_) => (), | |
89 Expr::Error => { | |
90 println!("Expr::Error"); | |
91 panic!() | |
92 } | |
93 } | |
94 } | |
95 } | |
96 | |
97 #[allow(dead_code)] | |
98 pub fn rewrite_ast(ast: Module) { | |
99 let mut typing = Rewrite{}; | |
100 typing.visit_module(ast); | |
101 } |