2020-02-03 17:56:32 -05:00
|
|
|
#![allow(dead_code)]
|
|
|
|
|
|
2020-01-25 19:17:39 -05:00
|
|
|
mod common;
|
|
|
|
|
mod vm;
|
|
|
|
|
|
2020-02-25 14:19:12 -05:00
|
|
|
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,
|
|
|
|
|
}
|
2020-01-27 19:07:57 -05:00
|
|
|
|
|
|
|
|
type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
|
|
|
|
|
|
2020-02-25 14:19:12 -05:00
|
|
|
fn get_input_string(path: impl AsRef<Path>) -> io::Result<String> {
|
|
|
|
|
fs::read_to_string(path.as_ref())
|
2020-01-27 19:07:57 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn main() -> Result<()> {
|
2020-02-18 17:44:41 -05:00
|
|
|
use vm::{
|
|
|
|
|
state::State,
|
|
|
|
|
obj::{
|
|
|
|
|
assemble::{Asm, Assemble},
|
|
|
|
|
syn::{lexer, parser},
|
|
|
|
|
}
|
|
|
|
|
};
|
2020-02-25 14:19:12 -05:00
|
|
|
let opt = Options::from_args();
|
|
|
|
|
let text = get_input_string(&opt.input)?;
|
2020-02-17 16:15:06 -05:00
|
|
|
let lexerdef = lexer::lexerdef();
|
|
|
|
|
let lexer = lexerdef.lexer(&text);
|
|
|
|
|
let (res, errors) = parser::parse(&lexer);
|
2020-02-25 14:21:39 -05:00
|
|
|
// print errors
|
2020-02-18 17:44:41 -05:00
|
|
|
for err in errors.iter() {
|
2020-02-17 16:15:06 -05:00
|
|
|
println!("{}", err.pp(&lexer, &parser::token_epp));
|
2020-02-10 16:31:08 -05:00
|
|
|
}
|
2020-02-18 17:44:41 -05:00
|
|
|
if !errors.is_empty() {
|
2020-02-25 13:45:04 -05:00
|
|
|
process::exit(1);
|
2020-02-18 17:44:41 -05:00
|
|
|
}
|
|
|
|
|
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()?;
|
2020-02-25 13:45:04 -05:00
|
|
|
process::exit((status & 0xffff_ffff) as i32);
|
2020-02-10 16:31:08 -05:00
|
|
|
}
|