#![forbid(unsafe_code)] mod compiler; mod errors; mod file_io; mod parser; mod vm; use file_io::open_file; use std::path::Path; use compiler::Compiler; use parser::Parser; use vm::{BuiltinFunctionDef, BuiltinFunctions, Value, VariableType, VirtualMachine}; fn main() { let path = Path::new("reid_src/test.reid"); let parsed = Parser::from(open_file(&path).ok().unwrap()).parse(); if let Err(error) = parsed { eprintln!("Syntax error: {}", error); std::process::exit(1); } dbg!(&parsed); let print = BuiltinFunctionDef::new( "print", vec![VariableType::TypeString], Box::new(move |args| { if let Value::StringVal(string) = &args[0] { println!("{}", string); } }), ); let builtin_functions = BuiltinFunctions(vec![print]); let compiled = Compiler::from(parsed.unwrap()) .with_builtin_functions(builtin_functions.signatures()) .compile(); if let Err(error) = compiled { eprintln!("Compilation error: {}", error); std::process::exit(1); } dbg!(&compiled); let mut vm = VirtualMachine::from(compiled.unwrap()); vm.add_builtin_functions(builtin_functions); if let Err(error) = vm.run() { eprintln!("Runtime panic: {:#?}", error); std::process::exit(1); } }