diff --git a/src/bin/eval.rs b/src/bin/eval.rs new file mode 100644 index 0000000..99462ef --- /dev/null +++ b/src/bin/eval.rs @@ -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(()) +}