From 0e6321920565ed8d2e0efb39aca41fa596158c95 Mon Sep 17 00:00:00 2001 From: sofia Date: Thu, 24 Jul 2025 22:04:48 +0300 Subject: [PATCH] Implement shorthand for array definition --- examples/array_short.reid | 7 +++++++ reid/src/ast/mod.rs | 1 + reid/src/ast/parse.rs | 35 ++++++++++++++++++++++++++++------- reid/src/ast/process.rs | 6 ++++++ 4 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 examples/array_short.reid diff --git a/examples/array_short.reid b/examples/array_short.reid new file mode 100644 index 0000000..53c6464 --- /dev/null +++ b/examples/array_short.reid @@ -0,0 +1,7 @@ +// Arithmetic, function calls and imports! + +fn main() -> u16 { + let mut a = [5; 20]; + + return a[15]; +} diff --git a/reid/src/ast/mod.rs b/reid/src/ast/mod.rs index b4531ce..19779b1 100644 --- a/reid/src/ast/mod.rs +++ b/reid/src/ast/mod.rs @@ -57,6 +57,7 @@ pub enum ExpressionKind { Deref(String), Literal(Literal), Array(Vec), + ArrayShort(Box, u64), /// Array-indexed, e.g. [] Indexed(Box, Box), /// Struct-accessed, e.g. . diff --git a/reid/src/ast/parse.rs b/reid/src/ast/parse.rs index af70249..32da973 100644 --- a/reid/src/ast/parse.rs +++ b/reid/src/ast/parse.rs @@ -250,16 +250,37 @@ impl Parse for PrimaryExpression { } Token::BracketOpen => { stream.next(); // Consume - 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()?); + if let Some(Token::Semi) = stream.peek() { + stream.next(); // Consume colon + let Some(Token::DecimalValue(val)) = stream.next() else { + return Err(stream + .expecting_err("decimal value describing array length")?); + }; + stream.expect(Token::BracketClose)?; + Expression( + Kind::ArrayShort( + Box::new(exp), + u64::from_str_radix(&val, 10).expect( + "Unable to parse array length to 64-bit decimal value", + ), + ), + stream.get_range().unwrap(), + ) + } else { + let mut expressions = Vec::new(); + 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()) } + } else { + stream.expect(Token::BraceClose)?; + Expression(Kind::Array(Vec::new()), stream.get_range().unwrap()) } - stream.expect(Token::BracketClose)?; - Expression(Kind::Array(expressions), stream.get_range().unwrap()) } _ => Err(stream.expecting_err("expression")?)?, } diff --git a/reid/src/ast/process.rs b/reid/src/ast/process.rs index 36b6410..6abfa4f 100644 --- a/reid/src/ast/process.rs +++ b/reid/src/ast/process.rs @@ -378,6 +378,12 @@ impl ast::Expression { Box::new(expression.process(module_id)), ty.0.clone().into_mir(module_id), ), + ast::ExpressionKind::ArrayShort(expression, len) => mir::ExprKind::Array( + vec![*expression.clone(); *len as usize] + .iter() + .map(|e| e.process(module_id)) + .collect(), + ), }; mir::Expression(kind, self.1.as_meta(module_id))