Files
rasp/src/main.rs

51 lines
1.3 KiB
Rust
Raw Normal View History

#![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<T> = std::result::Result<T, Box<dyn std::error::Error>>;
fn get_input_string(path: impl AsRef<Path>) -> io::Result<String> {
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);
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()?;
//println!("exit status: {:#04x}", status);
process::exit((status & 0xffff_ffff) as i32);
}