view src/main.rs @ 96:20c1c9d7803d default tip

Fix dump failure in strings containing backquotes and double quotes.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Tue, 28 Jun 2016 01:40:55 +0100
parents c06d12a81637
children
line wrap: on
line source

#[macro_use(assert_diff)]
extern crate difference;
extern crate cpython;


#[cfg(test)]
mod tests;

mod python_tb;
mod python_parse;
mod python_ast;
mod python_symtable;
mod ast_convert;
mod ast_dump;
//mod ast_scope;
//mod ast_rewrite;
//mod ast_type;

use std::fs::File;
use std::io::Read;

fn main() {
    let filename = match std::env::args().nth(1) {
        Some(filename) => filename,
        None => {
            // TODO: use stderr instead.
            println!("USAGE: {} <filename> [filename…]", std::env::args().nth(0).unwrap());
            std::process::exit(1);
        }
    };

    let code = {
        let mut file = match File::open(&filename) {
            Ok(file) => file,
            Err(err) => {
                // TODO: use stderr instead.
                println!("Error while opening file “{}”: {}", filename, err);
                std::process::exit(2);
            }
        };
        let mut code = String::new();
        file.read_to_string(&mut code).unwrap();
        code
    };

    let module = match python_parse::parse_ast(code.clone()) {
        Ok(module) => module,
        Err(err) => {
            // TODO: use stderr instead.
            println!("Error while parsing file “{}”:", filename);
            python_tb::traceback(err);
            std::process::exit(3);
        }
    };

    let symtable = match python_symtable::generate_symtable(code, &filename) {
        Ok(symtable) => symtable,
        Err(err) => {
            // TODO: use stderr instead.
            println!("Error while parsing file “{}”:", filename);
            python_tb::traceback(err);
            std::process::exit(4);
        }
    };
    println!("{:#?}", symtable);

    let module_ast = ast_convert::convert_ast("__main__".to_string(), &module);
    println!("{}", ast_dump::dump_ast(&module_ast));
    //let scoped_ast = ast_scope::scope_ast(vec!(module_ast));
    //println!("{:#?}", scoped_ast);
    //let new_scoped_ast = ast_scope::check_scoping(scoped_ast);
    //println!("{:#?}", new_scoped_ast);
    //ast_rewrite::rewrite_ast(module_ast);
    //ast_type::type_ast(scoped_ast);
}