#[cfg(feature = "timer")] use std::time::Instant; use debug::debug_token_array; use lexer::{Lexer, Token}; use parser::{Parser, AST}; use semantic_analysis::Analyzer; pub mod debug; pub mod error; pub mod lexer; pub mod macros; pub mod parser; pub mod semantic_analysis; pub fn run_lexer(input: String) -> Lexer { let mut lexer = Lexer::new(input); while lexer.next_token() {} lexer } pub fn run_parser(text: String, input: Vec) -> (AST, Parser) { let mut parser = Parser::new(text, input); (parser.program(), parser) } pub fn run_semantic_analysis(text: String, input: AST) -> Analyzer { let mut analyzer = Analyzer::new(text); analyzer.visit(input); analyzer } // TODO: output bytecode pub fn compile(program: String) -> String { let mut output = "".to_string(); #[cfg(feature = "timer")] let program_instant = Instant::now(); #[cfg(feature = "timer")] let lexer_instant = Instant::now(); let lexer = run_lexer(program.clone()); #[cfg(feature = "timer")] { let lexer_elapsed = lexer_instant.elapsed(); println!("lexer took: {:?}", lexer_elapsed); } for error in lexer.errors.clone() { output += &error.to_string(); output += "\n"; //println!("{}", error); } #[cfg(feature = "debug")] { output += &debug_token_array(lexer.output.clone()); } if lexer.errors.len() != 0 || lexer.output.len() == 0 { return output; } #[cfg(feature = "timer")] let parser_instant = Instant::now(); let (ast, parser) = run_parser(program.clone(), lexer.output); #[cfg(feature = "timer")] { let parser_elapsed = parser_instant.elapsed(); println!("parser took: {:?}", parser_elapsed); } #[cfg(feature = "debug")] println!("{:#?}", ast); for error in parser.errors.clone() { output += &error.to_string(); output += "\n"; } if parser.errors.len() != 0 { return output; } #[cfg(feature = "timer")] let analyzer_instant = Instant::now(); let analyzer = run_semantic_analysis(program, ast); for error in analyzer.errors.clone() { output += &error.to_string(); output += "\n"; } #[cfg(feature = "timer")] { let analyzer_elapsed = analyzer_instant.elapsed(); println!("semantic analysis took: {:?}", analyzer_elapsed); let program_elapsed = program_instant.elapsed(); println!("{:?}", program_elapsed); } output }