Mercurial > python-compiler.rs
diff 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 |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/src/ast_rewrite.rs @@ -0,0 +1,101 @@ +use python_ast::{Module, Statement, Expr}; + +trait Visitor<T> { + fn visit_module(&mut self, module: Module) -> T; + fn visit_statement(&mut self, statement: Statement) -> T; + fn visit_expr(&mut self, expr: Expr) -> T; +} + +struct Rewrite { +} + +impl Visitor<()> for Rewrite { + fn visit_module(&mut self, module: Module) -> () { + for statement in module.statements { + println!("{:?}", statement); + self.visit_statement(statement); + } + } + + fn visit_statement(&mut self, statement: Statement) -> () { + match statement { + Statement::FunctionDef(Expr::Name(name), arguments, body) => { + for expr in arguments { + self.visit_expr(expr); + } + for statement in body { + self.visit_statement(statement); + } + }, + Statement::FunctionDef(_, _, _) => { + println!("Statement:FunctionDef Error"); + panic!() + }, + Statement::If(test, body, orelse) => { + self.visit_expr(test); + for statement in body { + self.visit_statement(statement); + } + for statement in orelse { + self.visit_statement(statement); + } + }, + Statement::Assign(targets, value) => { + self.visit_expr(value); + for target in targets { + self.visit_expr(target); + } + }, + Statement::Return(expr) => { + self.visit_expr(expr); + }, + Statement::ImportFrom(module, names) => { + //self.visit_expr(module); + }, + Statement::Expr(expr) => { + self.visit_expr(expr); + }, + Statement::Error => { + println!("Statement::Error"); + panic!() + }, + } + } + + fn visit_expr(&mut self, expr: Expr) -> () { + match expr { + Expr::BinOp(left, op, right) => { + self.visit_expr(*left); + self.visit_expr(*right); + }, + Expr::Compare(left, ops, comparators) => { + self.visit_expr(*left); + }, + Expr::Call(func, args) => { + let func = *func; + let func = match func { + Expr::Name(arg) => arg, + _ => panic!() + }; + for expr in args { + self.visit_expr(expr); + } + }, + Expr::Alias(_, _) => (), + Expr::Name(_) => (), + Expr::NameConstant(value) => (), + Expr::Str(_) => (), + Expr::Num(_) => (), + Expr::Error => { + println!("Expr::Error"); + panic!() + } + } + } +} + +#[allow(dead_code)] +pub fn rewrite_ast(ast: Module) { + let mut typing = Rewrite{}; + typing.visit_module(ast); +}