From 0a6d13c5f6805da2e1afe129793d6f1e510ced1f Mon Sep 17 00:00:00 2001 From: Sofia Date: Sun, 15 Mar 2026 19:24:30 +0200 Subject: [PATCH] Add regular expression statement, make sure rust functions work --- examples/test.lua | 4 ++-- src/ast.rs | 3 +++ src/compile.rs | 5 +++++ src/vm.rs | 17 ++++++++++++----- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/examples/test.lua b/examples/test.lua index ada36c8..5eadab2 100644 --- a/examples/test.lua +++ b/examples/test.lua @@ -5,5 +5,5 @@ function add(x) end end -pr = print(add(10)(15)) -pr = print(add(10)(15)) \ No newline at end of file +print(max(11, 9)) +print(add(10)(15)) \ No newline at end of file diff --git a/src/ast.rs b/src/ast.rs index 6526472..396dfff 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -209,6 +209,7 @@ pub enum Statement { Assignment(Option, Vec>, ExpressionList), Return(ExpressionList), If(Node, Block), + Expression(Node), } impl Parse for Statement { @@ -266,6 +267,8 @@ impl Parse for Statement { vec![name], ExpressionList(vec![stream.parse()?]), )) + } else if let Ok(expr) = stream.parse() { + Ok(Self::Expression(expr)) } else { Err(stream.expecting_err("statement")) } diff --git a/src/compile.rs b/src/compile.rs index af3fde8..743cfeb 100644 --- a/src/compile.rs +++ b/src/compile.rs @@ -103,6 +103,7 @@ impl Statement { constants.extend(then.find_constants(scope)); constants } + Statement::Expression(expr) => expr.kind.find_constants(scope), } } @@ -224,6 +225,10 @@ impl Statement { )); } Statement::If(node, block) => todo!(), + Statement::Expression(expr) => { + let (instr, _) = expr.kind.compile(state, scope, None); + instructions.extend(instr); + } } instructions diff --git a/src/vm.rs b/src/vm.rs index c36630b..decb72c 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -291,11 +291,18 @@ impl ClosureRunner { match value { Value::RustFunction(func) => { let ret_values = func.borrow_mut().execute(params); - for i in 0..=(*ret_len - 2) { - self.stack.insert( - *func_reg + i, - ret_values.get(i as usize).cloned().unwrap_or(Value::Nil), - ); + if *ret_len != 0 { + for i in 0..=(*ret_len - 2) { + self.stack.insert( + *func_reg + i, + ret_values.get(i as usize).cloned().unwrap_or(Value::Nil), + ); + } + } else { + for (i, value) in ret_values.iter().enumerate() { + self.stack.insert(*func_reg + i as u16 + 1, value.clone()); + } + self.top = *func_reg + ret_values.len() as u16; } } Value::Function(closure) => {