Finalisation de l'interpreteur d'expressions.

This commit is contained in:
2024-05-20 23:17:46 +02:00
parent 48507617e5
commit 3e27109d2a
4 changed files with 184 additions and 53 deletions

View File

@@ -10,6 +10,7 @@ pub struct Grouping {
pub expression: Box<Expr>,
}
#[derive(Clone)]
pub enum Literal {
LiteralNumber(f64),
LiteralString(String),
@@ -29,44 +30,11 @@ pub enum Expr {
UnaryExpr(Unary),
}
pub trait ExprVisitor {
fn visit_binary(&mut self, b: &Binary);
fn visit_grouping(&mut self, g: &Grouping);
fn visit_literal(&mut self, l: &Literal);
fn visit_unary(&mut self, u: &Unary);
fn visit_expr(&mut self, e: &Expr);
pub trait ExprVisitor<T> {
fn visit_binary(&mut self, b: &Binary) -> T;
fn visit_grouping(&mut self, g: &Grouping) -> T;
fn visit_literal(&mut self, l: &Literal) ->T;
fn visit_unary(&mut self, u: &Unary) -> T;
fn visit_expr(&mut self, e: &Expr) -> T;
}
pub trait VisitableExpr {
fn accept(&self, visitor: &mut impl ExprVisitor);
}
impl VisitableExpr for Binary {
fn accept(&self, visitor: &mut impl ExprVisitor) {
visitor.visit_binary(self);
}
}
impl VisitableExpr for Grouping {
fn accept(&self, visitor: &mut impl ExprVisitor) {
visitor.visit_grouping(self);
}
}
impl VisitableExpr for Literal {
fn accept(&self, visitor: &mut impl ExprVisitor) {
visitor.visit_literal(self);
}
}
impl VisitableExpr for Unary {
fn accept(&self, visitor: &mut impl ExprVisitor) {
visitor.visit_unary(self);
}
}
impl VisitableExpr for Expr {
fn accept(&self, visitor: &mut impl ExprVisitor) {
visitor.visit_expr(self);
}
}