From f55f9be345e714352a869efbab9170e16bac786e Mon Sep 17 00:00:00 2001 From: Sofia Date: Tue, 17 Mar 2026 22:10:40 +0200 Subject: [PATCH] Add floats --- examples/test.lua | 2 +- src/ast.rs | 21 ++++++++++++++++++--- src/vm.rs | 4 ++-- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/examples/test.lua b/examples/test.lua index 9c0e831..b71855d 100644 --- a/examples/test.lua +++ b/examples/test.lua @@ -20,7 +20,7 @@ global sometable = {} sometable["hello"] = {} sometable["hello"].there = "my dude" -print(max(11, 9)) +print(max(11.12345, 9)) print(add(10)(15)) print(add(10)(15)) print(b) diff --git a/src/ast.rs b/src/ast.rs index 5a855b8..c48149f 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -465,9 +465,24 @@ impl Parse for PrimaryExpression { Expression::FunctionDefinition(function.kind.params, function.kind.block) } else if let Some(Token::DecimalValue(value)) = peeked { stream.next(); // Consume decimal value - Expression::Literal(Literal::Integer(LuaInteger( - i64::from_str_radix(&value, 10).unwrap(), - ))) + + let initial_value = i64::from_str_radix(&value, 10).unwrap(); + + if stream.peek() == Some(Token::Symbol('.')) { + stream.next(); // consume dot + if let Some(Token::DecimalValue(decimal_string)) = stream.next() { + let decimal_value = u64::from_str_radix(&decimal_string, 10).unwrap(); + let log10 = decimal_value.ilog10(); + let decimal_value = decimal_value as f64 / (10u64.pow(log10 + 1) as f64); + Expression::Literal(Literal::Float(LuaFloat( + initial_value as f64 + decimal_value, + ))) + } else { + return Err(stream.expected_err("number")); + } + } else { + Expression::Literal(Literal::Integer(LuaInteger(initial_value))) + } } else if let Some(Token::StringLit(value)) = peeked { stream.next(); // Consume string-literal Expression::Literal(Literal::String(value)) diff --git a/src/vm.rs b/src/vm.rs index b220151..ca0e558 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -98,7 +98,7 @@ impl Debug for Constant { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Self::String(arg0) => f.debug_tuple("String").field(arg0).finish(), - Self::Float(arg0) => f.debug_tuple("Number").field(&arg0.lua_number()).finish(), + Self::Float(arg0) => f.debug_tuple("Float").field(&arg0.lua_number()).finish(), Self::Integer(arg0) => f.debug_tuple("Integer").field(arg0).finish(), Self::Bool(arg0) => f.debug_tuple("Boolean").field(arg0).finish(), Self::Nil => f.debug_tuple("Nil").finish(), @@ -432,7 +432,7 @@ impl Value { impl Debug for Value { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - Value::Float(arg0) => f.debug_tuple("Number").field(&arg0.lua_number()).finish(), + Value::Float(arg0) => f.debug_tuple("Float").field(&arg0.lua_number()).finish(), Value::Integer(arg0) => f.debug_tuple("Integer").field(arg0).finish(), Value::Boolean(arg0) => f.debug_tuple("Boolean").field(arg0).finish(), Value::String(value) => f.debug_tuple("String").field(value).finish(),