use std::io::Write;
use crate::lang::eval::{Eval, EvalResult};
use crate::lang::parse::parse;
use crate::lang::semantics::SemanticAnalyzer;
pub struct Runtime<'a> {
semantics: SemanticAnalyzer,
eval: Eval<'a>,
}
impl<'a> Runtime<'a> {
pub fn new(sink: &'a mut dyn Write, interactive: bool) -> Self {
let semantics = SemanticAnalyzer::new();
let eval = Eval::new(sink, interactive);
Self { semantics, eval }
}
pub fn eval(&mut self, cmd: &str) -> EvalResult {
let stmts = match parse(cmd) {
Ok(s) => s,
Err(e) => return EvalResult::Err(e.to_string()),
};
match self.semantics.analyze(&stmts) {
Ok(_) => (),
Err(e) => return EvalResult::Err(e.to_string()),
};
self.eval.eval(&stmts)
}
}