Ajout des instructions.
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user