Reid/src/main.rs

75 lines
1.9 KiB
Rust

#![forbid(unsafe_code)]
#![warn(clippy::all)]
mod args;
mod compiler;
mod errors;
mod file_io;
mod parser;
mod vm;
use file_io::open_file;
use std::path::Path;
use args::*;
use compiler::{CompiledReid, Compiler};
use parser::Parser;
use vm::{
BuiltinFunctionDef, BuiltinFunctions, FunctionSignature, Value, VariableType, VirtualMachine,
};
// cargo run c_run reid_src/test.reid for previous functionality
fn main() {
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 opt: MainOpt = argh::from_env();
match opt.subcommand {
Subcommand::Compile(_) => {}
Subcommand::Run(_) => {}
Subcommand::CompileAndRun(c_run) => {
let path = Path::new(&c_run.source);
let compiled = compile(path, builtin_functions.signatures());
run(compiled, builtin_functions);
}
}
}
fn compile(path: &Path, builtin: Vec<FunctionSignature>) -> CompiledReid {
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 compiled = Compiler::from(parsed.unwrap())
.with_builtin_functions(builtin)
.compile();
if let Err(error) = compiled {
eprintln!("Compilation error: {}", error);
std::process::exit(1);
}
dbg!(&compiled);
compiled.unwrap()
}
fn run(reid: CompiledReid, builtin: BuiltinFunctions) {
let mut vm = VirtualMachine::from(reid);
vm.add_builtin_functions(builtin);
if let Err(error) = vm.run() {
eprintln!("Runtime panic: {:#?}", error);
std::process::exit(1);
}
}