Change-Id: Iab7e00cc26a4f9727d3ab98691ef379921a33052 Reviewed-on: https://cl.tvl.fyi/c/depot/+/5240 Tested-by: BuildkiteCI Reviewed-by: kanepyork <rikingcoding@gmail.com> Reviewed-by: Profpatsch <mail@profpatsch.de> Reviewed-by: grfn <grfn@gws.fyi> Reviewed-by: tazjin <tazjin@tvl.su>
28 lines
650 B
Rust
28 lines
650 B
Rust
use clap::Clap;
|
|
|
|
use crate::{codegen, interpreter, parser, tc, Result};
|
|
|
|
/// Evaluate an expression and print its result
|
|
#[derive(Clap)]
|
|
pub struct Eval {
|
|
/// JIT-compile with LLVM instead of interpreting
|
|
#[clap(long)]
|
|
jit: bool,
|
|
|
|
/// Expression to evaluate
|
|
expr: String,
|
|
}
|
|
|
|
impl Eval {
|
|
pub fn run(self) -> Result<()> {
|
|
let (_, parsed) = parser::expr(&self.expr)?;
|
|
let hir = tc::typecheck_expr(parsed)?;
|
|
let result = if self.jit {
|
|
codegen::jit_eval::<i64>(&hir)?.into()
|
|
} else {
|
|
interpreter::eval(&hir)?
|
|
};
|
|
println!("{}", result);
|
|
Ok(())
|
|
}
|
|
}
|