diff --git a/examples/test.lua b/examples/test.lua index 8063bbf..d839ae2 100644 --- a/examples/test.lua +++ b/examples/test.lua @@ -21,4 +21,5 @@ print(add(10)(15)) print(add(10)(15)) print(b) print(min(11, 9)) -print(10 - 15) \ No newline at end of file +print(10 - 15) +print("hello there!") \ No newline at end of file diff --git a/src/ast.rs b/src/ast.rs index f6f8312..dd2a524 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -421,6 +421,9 @@ impl Parse for PrimaryExpression { Expression::Literal(Literal::Number( u64::from_str_radix(&value, 10).unwrap() as f64 )) + } else if let Some(Token::StringLit(value)) = peeked { + stream.next(); // Consume string-literal + Expression::Literal(Literal::String(value)) } else { Expression::ValueRef(stream.parse()?) }; @@ -492,7 +495,8 @@ fn parse_binop_rhs( Ok(lhs.0) } -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone)] pub enum Literal { Number(LuaNumber), + String(String), } diff --git a/src/compile.rs b/src/compile.rs index 05982c7..1820e5c 100644 --- a/src/compile.rs +++ b/src/compile.rs @@ -318,6 +318,11 @@ impl Expression { constants.insert(Constant::Number(value.to_bits())); constants } + Literal::String(value) => { + let mut constants = HashSet::new(); + constants.insert(Constant::String(value.clone())); + constants + } }, } } @@ -530,6 +535,7 @@ impl Expression { reg, state.get_constant(&match literal { Literal::Number(value) => Constant::Number(value.to_bits()), + Literal::String(value) => Constant::String(value.clone()), }), )); (instructions, vec![reg]) diff --git a/src/main.rs b/src/main.rs index d996176..b7641c3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -104,22 +104,22 @@ fn main() { let mut run = closure.run(Vec::new()); while run.next().unwrap().is_none() { - let (instructions, state, constants) = - compile("print(b)", constants.clone(), state.prototypes.clone()); + // let (instructions, state, constants) = + // compile("print(b)", constants.clone(), state.prototypes.clone()); - // dbg!(&instructions); + // // dbg!(&instructions); - let mut new_run = run.execute(instructions, state, constants); - while { - match new_run.next() { - Ok(Some(_)) => false, - Ok(None) => true, - Err(e) => { - print!("Error: {}", e); - false - } - } - } {} + // let mut new_run = run.execute(instructions, state, constants); + // while { + // match new_run.next() { + // Ok(Some(_)) => false, + // Ok(None) => true, + // Err(e) => { + // print!("Error: {}", e); + // false + // } + // } + // } {} } dbg!(&vm.environment.borrow().globals); diff --git a/src/vm.rs b/src/vm.rs index 29bb318..9b9ed28 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -122,6 +122,7 @@ pub struct Environment { #[derive(Clone)] pub enum Value { + String(String), Number(VMNumber), RustFunction(Rc>), Function(Closure), @@ -236,15 +237,16 @@ impl Value { impl Debug for Value { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Self::Number(arg0) => f + Value::Number(arg0) => f .debug_tuple("Number") .field(&LuaNumber::from_bits(*arg0)) .finish(), - Self::RustFunction(arg0) => f.debug_tuple("RustFunction").field(arg0).finish(), - Self::Function(closure) => f + Value::String(value) => f.debug_tuple("String").field(value).finish(), + Value::RustFunction(arg0) => f.debug_tuple("RustFunction").field(arg0).finish(), + Value::Function(closure) => f .debug_tuple(&format!("Function({})", closure.prototype)) .finish(), - Self::Nil => write!(f, "Nil"), + Value::Nil => write!(f, "Nil"), } } } @@ -420,7 +422,7 @@ impl ClosureRunner { self.set_stack( *reg, match constants.get(*constant as usize).unwrap() { - Constant::String(_) => todo!(), + Constant::String(value) => Value::String(value.clone()), Constant::Number(value) => Value::Number(*value), }, );