#![allow(dead_code)] mod common; mod vm; use structopt::StructOpt; use std::{fs, io, process, path::{Path, PathBuf}}; #[derive(StructOpt, Debug)] struct Options { // maybe some other options: // * debug #[structopt(name = "FILE", parse(from_os_str))] input: PathBuf, } type Result = std::result::Result>; fn get_input_string(path: impl AsRef) -> io::Result { fs::read_to_string(path.as_ref()) } fn main() -> Result<()> { use vm::{ state::State, obj::{ assemble::{Asm, Assemble}, syn::{lexer, parser}, } }; let opt = Options::from_args(); let text = get_input_string(&opt.input)?; let lexerdef = lexer::lexerdef(); let lexer = lexerdef.lexer(&text); let (res, errors) = parser::parse(&lexer); // print errors for err in errors.iter() { println!("{}", err.pp(&lexer, &parser::token_epp)); } if !errors.is_empty() { process::exit(1); } let res = res.unwrap(); let mut asm = Asm::default(); let object = res.assemble(&mut asm)?; let mut state = State::new(); state.load_object(object, 64 * 1024 * 1024)?; let status = state.exec()?; process::exit((status & 0xffff_ffff) as i32); }