separate crates for compiler-lib, compiler-cli and vm

This commit is contained in:
Michael Sippel 2024-08-14 00:26:18 +02:00
parent 72122bf4fc
commit 4e9a4d1204
Signed by: senvas
GPG key ID: F96CF119C34B64A6
17 changed files with 337 additions and 191 deletions

12
ltvm/Cargo.toml Normal file
View file

@ -0,0 +1,12 @@
[package]
name = "ltvm"
version = "0.1.0"
edition = "2021"
[dependencies]
ltcore = { path = "../lib-ltcore" }
tisc = { path = "../../lib-tisc" }
clap = { version = "4.5.15", features = ["derive"] }
tiny-ansi = "0.1.0"
bincode = "1.3.3"

55
ltvm/src/main.rs Normal file
View file

@ -0,0 +1,55 @@
use {
std::io::Read,
clap::Parser,
tiny_ansi::TinyAnsi,
};
#[derive(Parser, Debug)]
#[command(version, about, long_about = None)]
struct Args {
/// source files
sources: Vec< String >,
/// entry symbol
#[arg(short, long, default_value_t = String::from("main"))]
entry: String,
/// memory size
#[arg(short, long, default_value_t = 0x1000)]
memsize: usize
}
fn main() {
let args = Args::parse();
let mut vm = tisc::VM::new( args.memsize );
let mut linker = tisc::Linker::new();
let mut symbols = std::collections::HashMap::<String, tisc::LinkAddr>::new();
for source_path in args.sources.iter() {
let mut input = std::io::BufReader::new(
std::fs::File::open(source_path).expect("Failed to open file")
);
linker.import( source_path, bincode::deserialize_from( input ).expect("") );
}
/*
let entry_addr = symbols.get(&args.entry)
.expect(&format!("cant find entry symbol '{}'", args.entry));
*/
let entry_addr = linker.get_link_addr(&args.entry).unwrap();
let bytecode = linker.link_total().expect("Link error:");
eprintln!("{} ({} bytes)", "Loaded bytecode.".green(), bytecode.len());
eprintln!("================\n");
vm.load(bytecode);
vm.execute(entry_addr);
eprintln!(
"\n================\nVM execution finished\ndatastack = {:?}\n====",
vm.data_stack
);
}