Add array expression parsing
This commit is contained in:
		
							parent
							
								
									887071eeb6
								
							
						
					
					
						commit
						8f95d445c0
					
				@ -1,7 +1,7 @@
 | 
				
			|||||||
// Arithmetic, function calls and imports!
 | 
					// Arithmetic, function calls and imports!
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn array() -> [u16; 4] {
 | 
					fn array() -> [u16; 4] {
 | 
				
			||||||
    return true;
 | 
					    return [1, 2, 3, 4];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn main() -> u16 {
 | 
					fn main() -> u16 {
 | 
				
			||||||
 | 
				
			|||||||
@ -38,6 +38,7 @@ pub struct Expression(pub ExpressionKind, pub TokenRange);
 | 
				
			|||||||
pub enum ExpressionKind {
 | 
					pub enum ExpressionKind {
 | 
				
			||||||
    VariableName(String),
 | 
					    VariableName(String),
 | 
				
			||||||
    Literal(Literal),
 | 
					    Literal(Literal),
 | 
				
			||||||
 | 
					    Array(Vec<Expression>),
 | 
				
			||||||
    Binop(BinaryOperator, Box<Expression>, Box<Expression>),
 | 
					    Binop(BinaryOperator, Box<Expression>, Box<Expression>),
 | 
				
			||||||
    FunctionCall(Box<FunctionCallExpression>),
 | 
					    FunctionCall(Box<FunctionCallExpression>),
 | 
				
			||||||
    BlockExpr(Box<Block>),
 | 
					    BlockExpr(Box<Block>),
 | 
				
			||||||
 | 
				
			|||||||
@ -97,7 +97,19 @@ impl Parse for PrimaryExpression {
 | 
				
			|||||||
                    stream.expect(Token::ParenClose)?;
 | 
					                    stream.expect(Token::ParenClose)?;
 | 
				
			||||||
                    exp
 | 
					                    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 {
 | 
					        } else {
 | 
				
			||||||
            Err(stream.expected_err("expression")?)?
 | 
					            Err(stream.expected_err("expression")?)?
 | 
				
			||||||
 | 
				
			|||||||
@ -149,6 +149,7 @@ impl ast::Expression {
 | 
				
			|||||||
                };
 | 
					                };
 | 
				
			||||||
                mir::ExprKind::If(mir::IfExpression(Box::new(cond), then_block, else_block))
 | 
					                mir::ExprKind::If(mir::IfExpression(Box::new(cond), then_block, else_block))
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					            ast::ExpressionKind::Array(expressions) => todo!(),
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        mir::Expression(kind, self.1.into())
 | 
					        mir::Expression(kind, self.1.into())
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user