Structures pour représenter une expression et affichage d'un AST.

This commit is contained in:
2024-05-01 14:54:24 +02:00
parent 257f31276f
commit 66e4a515b3
2 changed files with 49 additions and 15 deletions

View File

@@ -1,25 +1,25 @@
use crate::token::Token;
pub struct Binary {
left: Box<Expr>,
operator: Token,
right: Box<Expr>,
pub left: Box<Expr>,
pub operator: Token,
pub right: Box<Expr>,
}
pub struct Grouping {
expression: Box<Expr>,
pub expression: Box<Expr>,
}
pub enum Literal {
LiteralNumber(i8),
LiteralNumber(f64),
LiteralString(String),
LiteralBool(bool),
LiteralNil,
}
pub struct Unary {
operator: Token,
right: Box<Expr>,
pub operator: Token,
pub right: Box<Expr>,
}
pub enum Expr {
@@ -29,11 +29,11 @@ pub enum Expr {
UnaryExpr(Unary),
}
pub trait Visitor {
pub trait Visitable {
fn visit(&self);
}
impl Visitor for Binary {
impl Visitable for Binary {
fn visit(&self) {
print!("( {}",&self.operator.literal);
&self.left.visit();
@@ -42,7 +42,7 @@ impl Visitor for Binary {
}
}
impl Visitor for Grouping {
impl Visitable for Grouping {
fn visit(&self) {
print!("( group ");
&self.expression.visit();
@@ -50,7 +50,7 @@ impl Visitor for Grouping {
}
}
impl Visitor for Literal {
impl Visitable for Literal {
fn visit(&self) {
match &self {
Literal::LiteralNumber(i) => print!("{}", i),
@@ -61,7 +61,7 @@ impl Visitor for Literal {
}
}
impl Visitor for Unary {
impl Visitable for Unary {
fn visit(&self) {
print!("( {}",&self.operator.literal);
&self.right.visit();
@@ -69,8 +69,13 @@ impl Visitor for Unary {
}
}
impl Visitor for Expr {
impl Visitable for Expr {
fn visit(&self) {
&self.visit();
match &self {
Expr::BinaryExpr(b) => { b.visit(); }
Expr::GroupingExpr(g) => { g.visit(); }
Expr::LiteralExpr(l) => { l.visit(); }
Expr::UnaryExpr(u) => { u.visit(); }
}
}
}