47 lines
1.3 KiB
Rust
47 lines
1.3 KiB
Rust
mod err;
|
|
mod ins;
|
|
mod parser;
|
|
mod context;
|
|
mod vm;
|
|
|
|
use err::*;
|
|
use parser::*;
|
|
use context::*;
|
|
use vm::*;
|
|
|
|
|
|
// https://playsecurity.org/rawfile/grass_mud_horse_language_specification.md
|
|
// https://p.rogram.me/grassmudhorse.js/grassmudhorse.js
|
|
fn main() {
|
|
let input = "草草草泥马 马草草草泥草草草草泥泥马 草马草 泥马草泥 草草草泥草泥草马 泥马草草 草草草泥马 泥草草草 草马草 草草草泥草泥泥马 泥草草泥 马泥草草泥草草草泥草泥马 马草马草泥草草草草泥泥马 马草草草泥草草草泥草泥马 草马马 马马马";
|
|
|
|
let instructions = match parse_lang(input) {
|
|
Ok(i) => i, Err(err) => {
|
|
println!("Parse error: {}", err);
|
|
return;
|
|
},
|
|
};
|
|
|
|
let mut context = Context::new(false);
|
|
|
|
if context.is_debug() {
|
|
println!("[DEBUG] parsed instructions:");
|
|
for (ptr, ins) in instructions.iter().enumerate() {
|
|
println!("{} {:?}", ptr, ins);
|
|
}
|
|
}
|
|
|
|
let vm = Vm::new(instructions);
|
|
vm.defint_labels(&mut context);
|
|
|
|
match vm.execute(&mut context) {
|
|
Err(RuntimeError::EndVm) => (),
|
|
Err(err) => println!("Vm error: {}", err),
|
|
Ok(_) => (),
|
|
}
|
|
|
|
if context.is_debug() {
|
|
println!("[DEBUG] Vm ended, context: {:?}", context);
|
|
}
|
|
}
|