Structures pour représenter une expression et affichage d'un AST.
This commit is contained in:
33
src/expr.rs
33
src/expr.rs
@@ -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(); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user