Blocs d'instructions

This commit is contained in:
2024-06-12 22:15:26 +02:00
parent 897a6c4c13
commit 6ed3e4c68c
6 changed files with 107 additions and 27 deletions

View File

@@ -2,7 +2,7 @@ use crate::expr::{Assign, Binary, Expr, Grouping, Unary, Variable};
use crate::expr::Literal::{LiteralBool, LiteralNumber, LiteralString};
use crate::token::Token;
use crate::token_type::TokenType;
use crate::stmt::{ExpressionStatement, PrintStatement, Statement, VarStatement};
use crate::stmt::{BlockStatement, ExpressionStatement, PrintStatement, Statement, VarStatement};
pub struct Parser {
tokens: Vec<Token>,
@@ -225,10 +225,26 @@ impl Parser {
fn statement(&mut self) -> Result<Statement, ParseError> {
if self.match_token(&[TokenType::Print]) {
self.print_statement()
} else {
self.expr_statement()
return self.print_statement();
}
if self.match_token(&[TokenType::LeftBrace]) {
return self.block_statement();
}
self.expr_statement()
}
fn block_statement(&mut self) -> Result<Statement, ParseError> {
let mut statements: Vec<Statement> = Vec::new();
while !self.check(&TokenType::RightBrace) && !self.is_at_end() {
statements.push(self.declaration()?);
}
self.consume(&TokenType::RightBrace, String::from("Expect '}' after block"))?;
Ok(Statement::Block(BlockStatement::new(statements)))
}
fn print_statement(&mut self) -> Result<Statement, ParseError> {