Use lrpar for parsing, big 'ol syntax overhaul
Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
59
src/main.rs
59
src/main.rs
@@ -3,7 +3,7 @@
|
||||
mod common;
|
||||
mod vm;
|
||||
|
||||
use std::{convert::TryFrom, env, fs, io, process};
|
||||
use std::{env, fs, io, process};
|
||||
|
||||
type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
|
||||
|
||||
@@ -21,55 +21,14 @@ fn get_input_string() -> io::Result<String> {
|
||||
}
|
||||
|
||||
fn main() -> Result<()> {
|
||||
use vm::obj::syn::parser::SectionsParser;
|
||||
let contents = get_input_string()?;
|
||||
let ast = match SectionsParser::new().parse(&contents) {
|
||||
Ok(ast) => ast,
|
||||
Err(err) => {
|
||||
eprintln!("{}", err);
|
||||
process::exit(1);
|
||||
}
|
||||
};
|
||||
let obj = vm::obj::obj::Object::try_from(&ast)?;
|
||||
dump(&obj)?;
|
||||
let mut vm = vm::vm::Vm::new();
|
||||
vm.load_object(obj, 1024 * 1024 * 64)?; // 64mb
|
||||
let status = vm.run()?;
|
||||
println!("{}", status);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
fn dump(obj: &vm::obj::obj::Object) -> Result<()> {
|
||||
use vm::obj::obj::Section;
|
||||
use vm::visit::VisitInst;
|
||||
let mut stdout = io::stdout();
|
||||
for section in &obj.sections {
|
||||
match section {
|
||||
Section::Data { start, contents, .. } => {
|
||||
const WIDTH: usize = 4;
|
||||
println!("data section at 0x{:08x}", start);
|
||||
for (i, b) in contents.iter().enumerate() {
|
||||
if i % WIDTH == 0 {
|
||||
print!("{:08x} | ", ((*start as usize) + i));
|
||||
}
|
||||
print!("{:02x} ", b);
|
||||
if i % WIDTH == (WIDTH - 1) {
|
||||
println!();
|
||||
}
|
||||
}
|
||||
println!();
|
||||
}
|
||||
Section::Code { start, contents, .. } => {
|
||||
println!("code section at 0x{:08x}", start);
|
||||
let mut disasm = vm::disassemble::Disassemble::new(&mut stdout, contents, *start);
|
||||
while !disasm.is_done() {
|
||||
disasm.visit_inst()?;
|
||||
}
|
||||
println!();
|
||||
}
|
||||
Section::Meta { .. } => continue,
|
||||
};
|
||||
use vm::obj::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 {
|
||||
println!("{}", err.pp(&lexer, &parser::token_epp));
|
||||
}
|
||||
println!("{:?}", res);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user