Implement shorthand for array definition
This commit is contained in:
		
							parent
							
								
									1ec9bdb166
								
							
						
					
					
						commit
						0e63219205
					
				
							
								
								
									
										7
									
								
								examples/array_short.reid
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								examples/array_short.reid
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| // Arithmetic, function calls and imports! | ||||
| 
 | ||||
| fn main() -> u16 { | ||||
|   let mut a = [5; 20]; | ||||
| 
 | ||||
|   return a[15]; | ||||
| } | ||||
| @ -57,6 +57,7 @@ pub enum ExpressionKind { | ||||
|     Deref(String), | ||||
|     Literal(Literal), | ||||
|     Array(Vec<Expression>), | ||||
|     ArrayShort(Box<Expression>, u64), | ||||
|     /// Array-indexed, e.g. <expr>[<expr>]
 | ||||
|     Indexed(Box<Expression>, Box<Expression>), | ||||
|     /// Struct-accessed, e.g. <expr>.<expr>
 | ||||
|  | ||||
| @ -250,17 +250,38 @@ impl Parse for PrimaryExpression { | ||||
|                 } | ||||
|                 Token::BracketOpen => { | ||||
|                     stream.next(); // Consume
 | ||||
|                     let mut expressions = Vec::new(); | ||||
|                     if let Ok(exp) = 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()) | ||||
|                     } | ||||
|                 } | ||||
|                 _ => Err(stream.expecting_err("expression")?)?, | ||||
|             } | ||||
|         } else { | ||||
|  | ||||
| @ -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)) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user