Ajout des instructions.

This commit is contained in:
2024-05-21 08:44:11 +02:00
parent 3e27109d2a
commit de653f9bc5
6 changed files with 118 additions and 30 deletions

View File

@@ -2,12 +2,14 @@ use crate::expr::{Binary, Expr, Grouping, Unary};
use crate::expr::Literal::{LiteralBool, LiteralNumber, LiteralString};
use crate::token::Token;
use crate::token_type::TokenType;
use crate::stmt::{ExpressionStatement, PrintStatement, Statement};
pub struct Parser {
tokens: Vec<Token>,
current: usize
}
#[derive(Debug)]
pub struct ParseError {
message: String
}
@@ -203,13 +205,32 @@ impl Parser {
}
}
pub fn parse(&mut self) -> Option<Expr> {
match self.expression() {
Ok(expr) => Some(expr),
Err(error) => {
println!("Error while parsing expression : {}",error.message);
None
}
fn statement(&mut self) -> Statement {
if self.match_token(&[TokenType::Print]) {
self.print_statement()
} else {
self.expr_statement()
}
}
fn print_statement(&mut self) -> Statement {
let e = self.expression().unwrap();
self.consume(&TokenType::Semicolon, String::from("; attendu")).unwrap();
Statement::Print(PrintStatement{ expr: e })
}
fn expr_statement(&mut self) -> Statement {
let e = self.expression().unwrap();
self.consume(&TokenType::Semicolon, String::from("; attendu")).unwrap();
Statement::Expression(ExpressionStatement{ expr: e })
}
pub fn parse(&mut self) -> Vec<Statement> {
let mut statements= Vec::new();
while !self.is_at_end() {
statements.push(self.statement());
}
statements
}
}