From fe2a83174fa856752ac7b352ec4123a42e3337e0 Mon Sep 17 00:00:00 2001 From: Alek Ratzloff Date: Wed, 16 Feb 2022 17:07:50 -0800 Subject: [PATCH] Add the start of array impl * Array syntax * Array compilation * ArrayBegin and ArrayEnd inst * mod obj::array Signed-off-by: Alek Ratzloff --- src/compile.rs | 9 +++++++++ src/obj/array.rs | 0 src/obj/mod.rs | 2 ++ src/syn/ast.rs | 3 +++ src/syn/parser.pest | 1 + src/syn/parser.rs | 5 +++++ src/vm/inst.rs | 6 ++++++ src/vm/machine.rs | 6 ++++++ 8 files changed, 32 insertions(+) create mode 100644 src/obj/array.rs diff --git a/src/compile.rs b/src/compile.rs index a9bfab5..d736fab 100644 --- a/src/compile.rs +++ b/src/compile.rs @@ -70,6 +70,15 @@ impl<'s> Compile<'s> { let inst = Inst::PushValue(QuoteObj::new(quote)); vec![SpInst::new(expr.span().clone(), inst)] } + Expr::Array(stmts) => { + self.scope_stack.push_scope(); + let mut compiled = self.compile(stmts.clone()); + let _locals = self.scope_stack.pop_scope().unwrap(); + // Add prefix and suffix to the compiled items + compiled.insert(0, SpInst::new(expr.span().clone(), Inst::BeginArray)); + compiled.push(SpInst::new(expr.span().clone(), Inst::EndArray)); + compiled + } } } diff --git a/src/obj/array.rs b/src/obj/array.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/obj/mod.rs b/src/obj/mod.rs index eb70140..f56844e 100644 --- a/src/obj/mod.rs +++ b/src/obj/mod.rs @@ -1,5 +1,6 @@ #[macro_use] mod macros; +pub mod array; pub mod bool; pub mod builtin; pub mod float; @@ -8,6 +9,7 @@ pub mod quote; pub mod str; pub mod prelude { + pub use crate::obj::array::*; pub use crate::obj::bool::*; pub use crate::obj::builtin::*; pub use crate::obj::float::*; diff --git a/src/syn/ast.rs b/src/syn/ast.rs index f3403a7..89c78ab 100644 --- a/src/syn/ast.rs +++ b/src/syn/ast.rs @@ -22,6 +22,9 @@ pub enum Expr { /// A quoted expression list. Quote(Vec), + + /// A list of statements that create the items of an array. + Array(Vec), } /// A single, finite value. diff --git a/src/syn/parser.pest b/src/syn/parser.pest index 8427318..54ba63c 100644 --- a/src/syn/parser.pest +++ b/src/syn/parser.pest @@ -19,6 +19,7 @@ apply = @{ "!" } assign = { ":" ~ word } atom = { float | int | assign | word | str | apply } quote = { "[" ~ stmt* ~ "]" } +array = { "{" ~ stmt* ~ "}" } expr = { atom | quote } include = { "%include" ~ str } stmt = { include | expr } diff --git a/src/syn/parser.rs b/src/syn/parser.rs index d936642..2dbfcaa 100644 --- a/src/syn/parser.rs +++ b/src/syn/parser.rs @@ -81,6 +81,11 @@ fn parse_expr(source: &Rc, pair: Pair) -> Result { .map(|pair| parse_stmt(source, pair.into_inner().next().unwrap())) .collect::>>()?, ), + Rule::array => Expr::Array( + pair.into_inner() + .map(|pair| parse_stmt(source, pair.into_inner().next().unwrap())) + .collect::>>()?, + ), rule => unreachable!("{:?}", rule), }; let span = Span { diff --git a/src/vm/inst.rs b/src/vm/inst.rs index 17d3188..c479259 100644 --- a/src/vm/inst.rs +++ b/src/vm/inst.rs @@ -17,6 +17,12 @@ pub enum Inst { //Dup, /// Applies the top stack value, which should be a macro. Call, + + /// Begin creating a new array object. + BeginArray, + + /// End creating a new array object. + EndArray, } pub type SpInst = Spanned; diff --git a/src/vm/machine.rs b/src/vm/machine.rs index cd6f7fc..7bd1ccc 100644 --- a/src/vm/machine.rs +++ b/src/vm/machine.rs @@ -295,6 +295,12 @@ impl Machine { let value = self.stack_pop()?; value.call(Some(inst.span().clone()), self)?; } + Inst::BeginArray => { + todo!() + } + Inst::EndArray => { + todo!() + } }; // Update this frame's PC