Blocs d'instructions
This commit is contained in:
@@ -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> {
|
||||
|
||||
Reference in New Issue
Block a user