From cbe22bb89ef9c62a9090970bd5ae1437c8fe0de5 Mon Sep 17 00:00:00 2001 From: Alek Ratzloff Date: Sat, 8 Jan 2022 10:13:27 -0800 Subject: [PATCH] Start adding eval and machine implementations, remove Inst for now We're not compiling yet and mostly want to get the name stuff figured out. Also may switch to using anyhow error handling. Signed-off-by: Alek Ratzloff --- src/main.rs | 5 ++++- src/syn/ast.rs | 2 +- src/vm/error.rs | 8 ++------ src/vm/eval.rs | 25 ++++++++----------------- src/vm/inst.rs | 11 ----------- src/vm/mod.rs | 1 - 6 files changed, 15 insertions(+), 37 deletions(-) delete mode 100644 src/vm/inst.rs 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;