Files
rlox/src/expr.rs

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;
}