From 8f95d445c01d18ea280c18b41d1cc18d528842c0 Mon Sep 17 00:00:00 2001 From: sofia Date: Sun, 13 Jul 2025 17:41:57 +0300 Subject: [PATCH] Add array expression parsing --- reid/examples/reid/array.reid | 2 +- reid/src/ast/mod.rs | 1 + reid/src/ast/parse.rs | 14 +++++++++++++- reid/src/ast/process.rs | 1 + 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/reid/examples/reid/array.reid b/reid/examples/reid/array.reid index 3856e00..67ca7cc 100644 --- a/reid/examples/reid/array.reid +++ b/reid/examples/reid/array.reid @@ -1,7 +1,7 @@ // Arithmetic, function calls and imports! fn array() -> [u16; 4] { - return true; + return [1, 2, 3, 4]; } fn main() -> u16 { diff --git a/reid/src/ast/mod.rs b/reid/src/ast/mod.rs index f9bc5e7..5a9f37a 100644 --- a/reid/src/ast/mod.rs +++ b/reid/src/ast/mod.rs @@ -38,6 +38,7 @@ pub struct Expression(pub ExpressionKind, pub TokenRange); pub enum ExpressionKind { VariableName(String), Literal(Literal), + Array(Vec), Binop(BinaryOperator, Box, Box), FunctionCall(Box), BlockExpr(Box), diff --git a/reid/src/ast/parse.rs b/reid/src/ast/parse.rs index edebb0c..1c63141 100644 --- a/reid/src/ast/parse.rs +++ b/reid/src/ast/parse.rs @@ -97,7 +97,19 @@ impl Parse for PrimaryExpression { stream.expect(Token::ParenClose)?; exp } - _ => Err(stream.expected_err("identifier, constant or parentheses")?)?, + Token::BracketOpen => { + let mut expressions = Vec::new(); + if let Ok(exp) = stream.parse() { + expressions.push(exp); + while let Some(Token::Comma) = stream.peek() { + stream.next(); // Consume comma + expressions.push(stream.parse()?); + } + } + stream.expect(Token::BracketClose)?; + Expression(Kind::Array(expressions), stream.get_range().unwrap()) + } + _ => Err(stream.expected_err("identifier, constant, parentheses or brackets")?)?, } } else { Err(stream.expected_err("expression")?)? diff --git a/reid/src/ast/process.rs b/reid/src/ast/process.rs index e3a926f..694f1b0 100644 --- a/reid/src/ast/process.rs +++ b/reid/src/ast/process.rs @@ -149,6 +149,7 @@ impl ast::Expression { }; mir::ExprKind::If(mir::IfExpression(Box::new(cond), then_block, else_block)) } + ast::ExpressionKind::Array(expressions) => todo!(), }; mir::Expression(kind, self.1.into())