#![allow(dead_code)] mod common; mod vm; use std::{env, fs, io, process}; type Result = std::result::Result>; fn get_input_string() -> io::Result { let args: Vec = env::args().collect(); if args.len() <= 1 { println!( "usage: {} file.asm", args.get(0).map(String::as_str).unwrap_or("rasp") ); process::exit(1); } else { fs::read_to_string(&args[1]) } } fn main() -> Result<()> { use vm::{ state::State, obj::{ assemble::{Asm, Assemble}, syn::{lexer, parser}, } }; let text = get_input_string()?; let lexerdef = lexer::lexerdef(); let lexer = lexerdef.lexer(&text); let (res, errors) = parser::parse(&lexer); for err in errors.iter() { println!("{}", err.pp(&lexer, &parser::token_epp)); } if !errors.is_empty() { return Ok(()); } 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()?; println!("exit status: {:#04x}", status); Ok(()) }