//use std::{env, fs}; //use kabel::{debug::{debug_ast, debug_token_array}, run_lexer, run_parser, run_semantic_analysis}; use kabel::{run_codegen, run_lexer, run_parser, run_semantic_analysis, vm::{Value, VM}}; fn main() { /*let args: Vec = env::args().collect(); let program = fs::read_to_string(args[1].clone()).unwrap();*/ let program = "print \"hello, \" + \"world\";".to_string(); let mut output = "".to_string(); let lexer = run_lexer(program.to_string()); for error in lexer.errors.clone() { output += &error.to_string(); output += "\n"; } //output += &format!("{:?}", lexer.output); if lexer.errors.len() != 0 || lexer.output.len() == 0 { println!("{}", output); return; } //output += &debug_token_array(lexer.output.clone()); let (ast, parser) = run_parser(program.to_string(), lexer.output); for error in parser.errors.clone() { output += &error.to_string(); output += "\n"; } if parser.errors.len() != 0 { println!("{}", output); return; } //output += &debug_ast(ast.clone(), 0); //output += &format!("{:#?}", ast); let analyzer = run_semantic_analysis(program.to_string(), ast.clone()); for error in analyzer.errors.clone() { output += &error.to_string(); output += "\n"; } let codegen = run_codegen(program, ast); let mut vm = codegen.vm; match vm.run() { Ok(()) => {} Err(e) => output += &e.to_string(), } println!("{}", output); }