annotate src/main.rs @ 93:c06d12a81637

Better test failure. Use assert_diff! instead of assert_eq! so we can actually see what the differences are.
author Bastien Orivel <eijebong@bananium.fr>
date Tue, 14 Jun 2016 02:53:29 +0200
parents 4e62a8927dcc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
93
c06d12a81637 Better test failure. Use assert_diff! instead of assert_eq! so we can actually see what the differences are.
Bastien Orivel <eijebong@bananium.fr>
parents: 90
diff changeset
1 #[macro_use(assert_diff)]
c06d12a81637 Better test failure. Use assert_diff! instead of assert_eq! so we can actually see what the differences are.
Bastien Orivel <eijebong@bananium.fr>
parents: 90
diff changeset
2 extern crate difference;
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
3 extern crate cpython;
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
4
93
c06d12a81637 Better test failure. Use assert_diff! instead of assert_eq! so we can actually see what the differences are.
Bastien Orivel <eijebong@bananium.fr>
parents: 90
diff changeset
5
62
d255a932553f Fix a few warnings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 23
diff changeset
6 #[cfg(test)]
23
5a7c3393382b Add a simple test for ast.Assign.
Bastien Orivel <eijebong@bananium.fr>
parents: 22
diff changeset
7 mod tests;
5a7c3393382b Add a simple test for ast.Assign.
Bastien Orivel <eijebong@bananium.fr>
parents: 22
diff changeset
8
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
9 mod python_tb;
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
10 mod python_parse;
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
11 mod python_ast;
90
4e62a8927dcc Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 88
diff changeset
12 mod python_symtable;
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
13 mod ast_convert;
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
14 mod ast_dump;
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
15 //mod ast_scope;
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
16 //mod ast_rewrite;
9
fa7e285f88e7 Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
17 //mod ast_type;
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
18
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
19 use std::fs::File;
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
20 use std::io::Read;
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
21
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
22 fn main() {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
23 let filename = match std::env::args().nth(1) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
24 Some(filename) => filename,
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
25 None => {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
26 // TODO: use stderr instead.
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
27 println!("USAGE: {} <filename> [filename…]", std::env::args().nth(0).unwrap());
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
28 std::process::exit(1);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
29 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
30 };
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
31
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
32 let code = {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
33 let mut file = match File::open(&filename) {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
34 Ok(file) => file,
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
35 Err(err) => {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
36 // TODO: use stderr instead.
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
37 println!("Error while opening file “{}”: {}", filename, err);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
38 std::process::exit(2);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
39 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
40 };
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
41 let mut code = String::new();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
42 file.read_to_string(&mut code).unwrap();
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
43 code
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
44 };
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
45
90
4e62a8927dcc Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 88
diff changeset
46 let module = match python_parse::parse_ast(code.clone()) {
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
47 Ok(module) => module,
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
48 Err(err) => {
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
49 // TODO: use stderr instead.
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
50 println!("Error while parsing file “{}”:", filename);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
51 python_tb::traceback(err);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
52 std::process::exit(3);
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
53 }
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
54 };
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
55
90
4e62a8927dcc Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 88
diff changeset
56 let symtable = match python_symtable::generate_symtable(code, &filename) {
4e62a8927dcc Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 88
diff changeset
57 Ok(symtable) => symtable,
4e62a8927dcc Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 88
diff changeset
58 Err(err) => {
4e62a8927dcc Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 88
diff changeset
59 // TODO: use stderr instead.
4e62a8927dcc Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 88
diff changeset
60 println!("Error while parsing file “{}”:", filename);
4e62a8927dcc Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 88
diff changeset
61 python_tb::traceback(err);
4e62a8927dcc Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 88
diff changeset
62 std::process::exit(4);
4e62a8927dcc Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 88
diff changeset
63 }
4e62a8927dcc Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 88
diff changeset
64 };
4e62a8927dcc Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 88
diff changeset
65 println!("{:#?}", symtable);
4e62a8927dcc Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 88
diff changeset
66
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
67 let module_ast = ast_convert::convert_ast("__main__".to_string(), &module);
22
25b202005d1d Return a String from ast_dump instead of printing it directly.
Bastien Orivel <eijebong@bananium.fr>
parents: 13
diff changeset
68 println!("{}", ast_dump::dump_ast(&module_ast));
13
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
69 //let scoped_ast = ast_scope::scope_ast(vec!(module_ast));
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
70 //println!("{:#?}", scoped_ast);
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
71 //let new_scoped_ast = ast_scope::check_scoping(scoped_ast);
38b0d63697b1 Import the full AST grammar from CPython 3.5.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 9
diff changeset
72 //println!("{:#?}", new_scoped_ast);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
73 //ast_rewrite::rewrite_ast(module_ast);
9
fa7e285f88e7 Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 0
diff changeset
74 //ast_type::type_ast(scoped_ast);
0
211b0df72e64 Hello world!
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff changeset
75 }