//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<String> = env::args().collect();
let program =
fs::read_to_string(args[1].clone()).unwrap();*/
let program = "print 7%3;".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(&mut output) {
Ok(()) => {}
Err(e) => output += &e.to_string(),
}
println!("{}", output);
}