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 <alekratz@gmail.com>
This commit is contained in:
@@ -7,6 +7,7 @@ use std::io::Read;
|
|||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use structopt::StructOpt;
|
use structopt::StructOpt;
|
||||||
use syn::parser::Parser;
|
use syn::parser::Parser;
|
||||||
|
use vm::eval::Eval;
|
||||||
use vm::machine::MachineBuilder;
|
use vm::machine::MachineBuilder;
|
||||||
|
|
||||||
#[derive(Debug, StructOpt)]
|
#[derive(Debug, StructOpt)]
|
||||||
@@ -40,10 +41,12 @@ fn main() -> Result {
|
|||||||
exprs.extend(parser.next_expr_list()?);
|
exprs.extend(parser.next_expr_list()?);
|
||||||
}
|
}
|
||||||
|
|
||||||
let machine = MachineBuilder::default()
|
let mut machine = MachineBuilder::default()
|
||||||
.max_stack_size(opt.max_stack_size)
|
.max_stack_size(opt.max_stack_size)
|
||||||
.max_arena_objects(opt.max_arena_objects)
|
.max_arena_objects(opt.max_arena_objects)
|
||||||
.finish();
|
.finish();
|
||||||
|
|
||||||
|
let mut eval = Eval::new(&mut machine);
|
||||||
|
eval.eval_expr_list(&exprs)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use crate::object::{Float, Int, Str, Value};
|
use crate::object::{Float, Int, Str};
|
||||||
use crate::syn::span::*;
|
use crate::syn::span::*;
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq)]
|
||||||
|
|||||||
@@ -4,12 +4,8 @@ use thiserror::Error;
|
|||||||
pub enum RuntimeError {
|
pub enum RuntimeError {
|
||||||
#[error("stack overflow")]
|
#[error("stack overflow")]
|
||||||
StackOverflow,
|
StackOverflow,
|
||||||
#[error("stack underflow")]
|
//#[error("stack underflow")]
|
||||||
StackUnderflow,
|
//StackUnderflow,
|
||||||
//#[error("unexpected {0}")]
|
|
||||||
//Unexpected(String),
|
|
||||||
//#[error("expected {expected}, but got {got}")]
|
|
||||||
//ExpectedGot { expected: String, got: String },
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type Result<T, E = RuntimeError> = std::result::Result<T, E>;
|
pub type Result<T, E = RuntimeError> = std::result::Result<T, E>;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
use crate::object::*;
|
use crate::object::*;
|
||||||
use crate::syn::ast::*;
|
use crate::syn::ast::*;
|
||||||
use crate::vm::{error::*, inst::Inst, machine::Machine};
|
use crate::vm::{error::*, machine::Machine};
|
||||||
|
|
||||||
/// An evaluation context for the VM.
|
/// An evaluation context for the VM.
|
||||||
pub struct Eval<'m> {
|
pub struct Eval<'m> {
|
||||||
@@ -12,6 +12,13 @@ impl<'m> Eval<'m> {
|
|||||||
Self { machine }
|
Self { machine }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn eval_expr_list(&mut self, exprs: &Vec<SpExpr>) -> Result<()> {
|
||||||
|
for expr in exprs {
|
||||||
|
self.eval_expr(expr)?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
pub fn eval_expr(&mut self, expr: &SpExpr) -> Result<()> {
|
pub fn eval_expr(&mut self, expr: &SpExpr) -> Result<()> {
|
||||||
match expr.inner() {
|
match expr.inner() {
|
||||||
Expr::Atom(atom) => match atom.inner() {
|
Expr::Atom(atom) => match atom.inner() {
|
||||||
@@ -26,22 +33,6 @@ impl<'m> Eval<'m> {
|
|||||||
}
|
}
|
||||||
Ok(())
|
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
|
// IDEA: Eval chain
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
use crate::object::Value;
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
pub enum Inst {
|
|
||||||
Push(Value),
|
|
||||||
Pop,
|
|
||||||
When,
|
|
||||||
If,
|
|
||||||
Eval,
|
|
||||||
Print,
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
pub mod error;
|
pub mod error;
|
||||||
pub mod eval;
|
pub mod eval;
|
||||||
pub mod inst;
|
|
||||||
pub mod machine;
|
pub mod machine;
|
||||||
|
|||||||
Reference in New Issue
Block a user