feat: eval cli

This commit is contained in:
2025-05-20 21:45:13 +08:00
parent 9b3c3d6fe9
commit 36f29a9cac

35
src/bin/eval.rs Normal file
View File

@@ -0,0 +1,35 @@
use std::process::exit;
use inkwell::context::Context;
use itertools::Itertools;
use nixjit::compile::compile;
use nixjit::error::Error;
use nixjit::ir::downgrade;
use nixjit::jit::JITContext;
use nixjit::vm::run;
use nixjit::error::Result;
fn main() -> Result<()> {
let mut args = std::env::args();
if args.len() != 2 {
eprintln!("Usage: {} expr", args.next().unwrap());
exit(1);
}
args.next();
let expr = args.next().unwrap();
let root = rnix::Root::parse(&expr);
if !root.errors().is_empty() {
return Err(Error::ParseError(
root.errors().iter().map(|err| err.to_string()).join(";")
))
}
let expr = root.tree().expr().unwrap();
let downgraded = downgrade(expr)?;
let prog = compile(downgraded);
let ctx = Context::create();
let jit = JITContext::new(&ctx);
println!("{}", run(prog, jit)?);
Ok(())
}