Mercurial > python-compiler.rs
comparison src/ast_scope.rs @ 10:3bf4903d1d2c
Add Assign and ImportFrom bindings.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Thu, 02 Jun 2016 01:00:29 +0100 |
parents | fa7e285f88e7 |
children | 5c169d5807b5 |
comparison
equal
deleted
inserted
replaced
9:fa7e285f88e7 | 10:3bf4903d1d2c |
---|---|
96 scoping.visit(vec!(ast)); | 96 scoping.visit(vec!(ast)); |
97 scoping | 97 scoping |
98 } | 98 } |
99 */ | 99 */ |
100 | 100 |
101 fn scope_expr(expr: Expr, block: &mut Block) { | |
102 println!("{:?}", expr); | |
103 } | |
104 | |
101 fn scope_statement(statement: Statement, block: &mut Block) { | 105 fn scope_statement(statement: Statement, block: &mut Block) { |
102 let new_block = match statement.clone() { | 106 let new_block = match statement.clone() { |
107 Statement::Assign(targets, value) => { | |
108 //scope_expr(value, &mut block); | |
109 for target in targets { | |
110 match target { | |
111 Expr::Name(name) => block.bindings.push(name), | |
112 _ => () // No new binding. | |
113 } | |
114 } | |
115 None | |
116 }, | |
103 Statement::FunctionDef(name, args, statements) => { | 117 Statement::FunctionDef(name, args, statements) => { |
104 block.bindings.push(name.clone()); | 118 block.bindings.push(name.clone()); |
105 let mut function_block = Block{statements: vec!(), bindings: args.clone()}; | 119 let mut function_block = Block{statements: vec!(), bindings: args.clone()}; |
106 for other_statement in statements { | 120 for statement in statements { |
107 scope_statement(other_statement, &mut function_block); | 121 scope_statement(statement, &mut function_block); |
108 } | 122 } |
109 Some(Box::new(function_block)) | 123 Some(Box::new(function_block)) |
124 }, | |
125 Statement::ImportFrom(module, names) => { | |
126 for name in names { | |
127 let name = match name { | |
128 Expr::Alias(name, asname) => (name, asname), | |
129 _ => panic!() | |
130 }; | |
131 let nameas = name.1; | |
132 let name = name.0; | |
133 match nameas { | |
134 Some(name) => block.bindings.push(name), | |
135 None => block.bindings.push(name) | |
136 } | |
137 } | |
138 None | |
110 }, | 139 }, |
111 _ => None | 140 _ => None |
112 }; | 141 }; |
113 block.statements.push((statement, new_block)); | 142 block.statements.push((statement, new_block)); |
114 } | 143 } |