Parse number literals

This commit is contained in:
Sofia 2026-03-14 17:36:01 +02:00
parent 6340f67152
commit 12e2fab066
3 changed files with 18 additions and 5 deletions

View File

@ -1 +1 @@
local c = max(a, b)
c = max(5, 7)

View File

@ -5,6 +5,8 @@ use crate::token_stream::{
lexer::{Keyword, Position, Token},
};
pub type LuaNumber = f64;
#[derive(Debug, Clone)]
pub struct Node<T: Clone + Debug> {
pub kind: T,
@ -273,6 +275,7 @@ pub enum Expression {
BinOp(BinaryOperator, Box<Node<Expression>>, Box<Node<Expression>>),
FunctionDefinition(Vec<Node<String>>, Block),
FunctionCall(Box<Node<Expression>>, Node<ExpressionList>),
Literal(Literal),
}
impl Parse for Expression {
@ -283,7 +286,7 @@ impl Parse for Expression {
}
#[derive(Debug, Clone)]
pub struct ExpressionList(Vec<Node<Expression>>);
pub struct ExpressionList(pub Vec<Node<Expression>>);
impl Parse for ExpressionList {
fn parse(mut stream: TokenStream) -> Result<Self, TokenStreamError> {
@ -311,7 +314,7 @@ impl BinaryOperator {
pub fn precedence(&self) -> u32 {
match self {
BinaryOperator::Lt => 100,
BinaryOperator::Gt => 105,
BinaryOperator::Gt => 100,
}
}
}
@ -324,6 +327,11 @@ impl Parse for PrimaryExpression {
let mut expression = if peeked == Some(Token::Keyword(Keyword::Function)) {
let function = stream.parse::<Node<Function>>()?;
Expression::FunctionDefinition(function.kind.params, function.kind.block)
} else if let Some(Token::DecimalValue(value)) = peeked {
stream.next(); // Consume decimal value
Expression::Literal(Literal::Number(
u64::from_str_radix(&value, 10).unwrap() as f64
))
} else {
Expression::ValueRef(stream.parse()?)
};
@ -398,3 +406,8 @@ impl Parse for BinaryOperator {
}
}
}
#[derive(Debug, Clone, Copy)]
pub enum Literal {
Number(LuaNumber),
}

View File

@ -20,10 +20,10 @@ fn main() {
dbg!(&tokens);
let block = stream.parse::<Block>().unwrap();
let chunk = stream.parse::<Block>().unwrap();
stream.expect(Token::Eof).unwrap();
dbg!(block);
dbg!(chunk);
println!("Hello, world!");
}