monkey-compiler 0.9.1

a compiler for monkeylang
Documentation
use compiler::compiler::Compiler;
use compiler::vm::VM;

use compiler::symbol_table::SymbolTable;
use object::Object;
use std::io::stdin;
use std::io::{self, Write};
use std::rc::Rc;

use parser::parse;

fn main() {
    println!("Welcome to monkey compiler by gengjiawen");
    let mut constants = vec![];
    let mut symbol_table = SymbolTable::new();
    let mut globals = vec![Rc::new(Object::Null); compiler::vm::GLOBAL_SIZE];
    loop {
        print!("> ");
        io::stdout().flush().unwrap();
        let mut input = String::new();
        stdin().read_line(&mut input).unwrap();

        if input.trim_end().is_empty() {
            println!("bye");
            std::process::exit(0);
        }

        let program = match parse(&input) {
            Ok(x) => x,
            Err(e) => {
                println!("{}", e[0]);
                continue;
            }
        };

        let mut compiler = Compiler::new_with_state(symbol_table, constants);

        match compiler.compile(&program) {
            Ok(bytecodes) => {
                let mut vm = VM::new_with_global_store(bytecodes, globals);
                vm.run();
                println!("{}", vm.last_popped_stack_elm().unwrap());
                globals = vm.globals;
            }
            Err(e) => {
                println!("{}", e);
            }
        };

        symbol_table = compiler.symbol_table;
        constants = compiler.constants;
    }
}