Add assembler and execution logic

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>
This commit is contained in:
2020-02-18 17:44:41 -05:00
parent 0598bd1526
commit b0ef49bc2a
11 changed files with 788 additions and 78 deletions

View File

@@ -21,14 +21,29 @@ fn get_input_string() -> io::Result<String> {
}
fn main() -> Result<()> {
use vm::obj::syn::{lexer, parser};
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 {
for err in errors.iter() {
println!("{}", err.pp(&lexer, &parser::token_epp));
}
println!("{:?}", res);
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(())
}