use crate::token::Token; #[derive(Clone)] pub struct Assign { pub name: Token, pub value: Box, } #[derive(Clone)] pub struct Binary { pub left: Box, pub operator: Token, pub right: Box, } #[derive(Clone)] pub struct Grouping { pub expression: Box, } #[derive(Clone)] pub enum Literal { LiteralNumber(f64), LiteralString(String), LiteralBool(bool), LiteralNil, } #[derive(Clone)] pub struct Unary { pub operator: Token, pub right: Box, } #[derive(Clone)] pub struct Variable { pub name: Token, } #[derive(Clone)] pub struct Logical { pub left: Box, pub operator: Token, pub right: Box, } #[derive(Clone)] pub enum Expr { BinaryExpr(Binary), GroupingExpr(Grouping), LiteralExpr(Literal), LogicalExpr(Logical), UnaryExpr(Unary), VariableExpr(Variable), AssignExpr(Assign), } pub trait ExprVisitor { 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; }