diff --git a/src/main.rs b/src/main.rs index 45396a3..6d22818 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,6 +7,7 @@ use std::io::Read; use std::path::PathBuf; use structopt::StructOpt; use syn::parser::Parser; +use vm::eval::Eval; use vm::machine::MachineBuilder; #[derive(Debug, StructOpt)] @@ -40,10 +41,12 @@ fn main() -> Result { exprs.extend(parser.next_expr_list()?); } - let machine = MachineBuilder::default() + let mut machine = MachineBuilder::default() .max_stack_size(opt.max_stack_size) .max_arena_objects(opt.max_arena_objects) .finish(); + let mut eval = Eval::new(&mut machine); + eval.eval_expr_list(&exprs)?; Ok(()) } diff --git a/src/syn/ast.rs b/src/syn/ast.rs index 57bb866..68f0ce0 100644 --- a/src/syn/ast.rs +++ b/src/syn/ast.rs @@ -1,4 +1,4 @@ -use crate::object::{Float, Int, Str, Value}; +use crate::object::{Float, Int, Str}; use crate::syn::span::*; #[derive(Debug, Clone, PartialEq)] diff --git a/src/vm/error.rs b/src/vm/error.rs index bc80024..ced3e8a 100644 --- a/src/vm/error.rs +++ b/src/vm/error.rs @@ -4,12 +4,8 @@ use thiserror::Error; pub enum RuntimeError { #[error("stack overflow")] StackOverflow, - #[error("stack underflow")] - StackUnderflow, - //#[error("unexpected {0}")] - //Unexpected(String), - //#[error("expected {expected}, but got {got}")] - //ExpectedGot { expected: String, got: String }, + //#[error("stack underflow")] + //StackUnderflow, } pub type Result = std::result::Result; diff --git a/src/vm/eval.rs b/src/vm/eval.rs index 0ab5b01..8ddef14 100644 --- a/src/vm/eval.rs +++ b/src/vm/eval.rs @@ -1,6 +1,6 @@ use crate::object::*; use crate::syn::ast::*; -use crate::vm::{error::*, inst::Inst, machine::Machine}; +use crate::vm::{error::*, machine::Machine}; /// An evaluation context for the VM. pub struct Eval<'m> { @@ -12,6 +12,13 @@ impl<'m> Eval<'m> { Self { machine } } + pub fn eval_expr_list(&mut self, exprs: &Vec) -> Result<()> { + for expr in exprs { + self.eval_expr(expr)?; + } + Ok(()) + } + pub fn eval_expr(&mut self, expr: &SpExpr) -> Result<()> { match expr.inner() { Expr::Atom(atom) => match atom.inner() { @@ -26,22 +33,6 @@ impl<'m> Eval<'m> { } Ok(()) } - - pub fn eval_inst(&mut self, inst: Inst) -> Result<()> { - match inst { - Inst::Push(v) => self.machine.stack_push(v)?, - Inst::Pop => { - self.machine - .stack_pop() - .ok_or(RuntimeError::StackUnderflow)?; - } - Inst::When => todo!(), - Inst::If => todo!(), - Inst::Eval => todo!(), - Inst::Print => todo!(), - } - Ok(()) - } } // IDEA: Eval chain diff --git a/src/vm/inst.rs b/src/vm/inst.rs deleted file mode 100644 index 05eedbe..0000000 --- a/src/vm/inst.rs +++ /dev/null @@ -1,11 +0,0 @@ -use crate::object::Value; - -#[derive(Debug, Clone)] -pub enum Inst { - Push(Value), - Pop, - When, - If, - Eval, - Print, -} diff --git a/src/vm/mod.rs b/src/vm/mod.rs index cb9ed28..32e1719 100644 --- a/src/vm/mod.rs +++ b/src/vm/mod.rs @@ -1,4 +1,3 @@ pub mod error; pub mod eval; -pub mod inst; pub mod machine;