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 } |
