69 lines
1.3 KiB
Rust
69 lines
1.3 KiB
Rust
use crate::token::Token;
|
|
|
|
#[derive(Clone)]
|
|
pub struct Assign {
|
|
pub name: Token,
|
|
pub value: Box<Expr>,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct Binary {
|
|
pub left: Box<Expr>,
|
|
pub operator: Token,
|
|
pub right: Box<Expr>,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct Grouping {
|
|
pub expression: Box<Expr>,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub enum Literal {
|
|
LiteralNumber(f64),
|
|
LiteralString(String),
|
|
LiteralBool(bool),
|
|
LiteralNil,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct Unary {
|
|
pub operator: Token,
|
|
pub right: Box<Expr>,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct Variable {
|
|
pub name: Token,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub struct Logical {
|
|
pub left: Box<Expr>,
|
|
pub operator: Token,
|
|
pub right: Box<Expr>,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
pub enum Expr {
|
|
BinaryExpr(Binary),
|
|
GroupingExpr(Grouping),
|
|
LiteralExpr(Literal),
|
|
LogicalExpr(Logical),
|
|
UnaryExpr(Unary),
|
|
VariableExpr(Variable),
|
|
AssignExpr(Assign),
|
|
}
|
|
|
|
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;
|
|
fn visit_variable(&mut self, v: &Variable) -> T;
|
|
fn visit_assign(&mut self, a: &Assign) -> T;
|
|
fn visit_logical(&mut self, l: &Logical) -> T;
|
|
}
|
|
|