//use std::{env, fs}; use std::{env, fs}; use kabel::{debug::{debug_ast, debug_bytecode, debug_stack, debug_token_array}, run_codegen, run_lexer, run_parser, run_semantic_analysis}; fn main() { /*let args: Vec = env::args().collect(); let program = fs::read_to_string(args[1].clone()).unwrap();*/ let program = "var a = 2; var b = 3; print a+b; { var b = 7; var c = 4; print c; } ".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 += "\n\n"; //output += &format!("{:#?}", ast); let (ast, analyzer) = run_semantic_analysis(program.to_string(), ast.clone()); for error in analyzer.errors.clone() { output += &error.to_string(); output += "\n"; } if analyzer.errors.len() != 0 { println!("{}", output); return; } //output += &format!("{:#?}", ast); let codegen = run_codegen(program, ast); let mut vm = codegen.vm; output += &debug_bytecode(&vm.chunk); output += "\n"; match vm.run(&mut output) { Ok(()) => {} Err(e) => output += &e.to_string(), } println!("{}", output); }