Most everything works, but there's one small bug with the execution involving jumps - still have to figure that one out. Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
50 lines
1.2 KiB
Rust
50 lines
1.2 KiB
Rust
#![allow(dead_code)]
|
|
|
|
mod common;
|
|
mod vm;
|
|
|
|
use std::{env, fs, io, process};
|
|
|
|
type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
|
|
|
|
fn get_input_string() -> io::Result<String> {
|
|
let args: Vec<String> = 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: {}", status);
|
|
Ok(())
|
|
}
|