use crate::ast::stmt::Stmt; #[derive(Debug, Clone)] pub enum Expr { /// 字面量:number / string / bool / nil Literal(Literal), /// 变量引用 Variable(String), /// 赋值表达式:a = b Assign { name: String, op: AssignOp, value: Box, }, /// 属性访问表达式:object.name Get { object: Box, name: String, }, /// 属性赋值表达式:object.name = value Set { object: Box, name: String, op: AssignOp, value: Box, }, /// 对象字面量:{ key: value, ... } ObjectLiteral { properties: Vec<(String, Expr)>, }, /// 数组字面量:[ expr, expr, ... ] ArrayLiteral { elements: Vec, }, /// 索引访问:expr[index] IndexGet { array: Box, index: Box, }, /// 索引赋值:expr[index] = value IndexSet { array: Box, index: Box, op: AssignOp, value: Box, }, /// 一元运算:!expr / -expr Unary { op: UnaryOp, right: Box, }, /// 二元运算:a + b Binary { left: Box, op: BinaryOp, right: Box, }, /// 逻辑运算:&& || Logical { left: Box, op: LogicalOp, right: Box, }, /// 函数调用 Call { callee: Box, arguments: Vec, }, /// 匿名函数(为闭包预留) Lambda { params: Vec, body: Vec, }, } #[derive(Debug, Clone)] pub enum Literal { Number(f64), String(String), Bool(bool), Nil, } #[derive(Debug, Clone, Copy)] pub enum UnaryOp { Negate, // - Not, // ! } #[derive(Debug, Clone, Copy)] pub enum BinaryOp { Add, Sub, Mul, Div, Mod, Greater, GreaterEqual, Less, LessEqual, Equal, NotEqual, } #[derive(Debug, Clone, Copy)] pub enum LogicalOp { And, Or, } #[derive(Debug, Clone, Copy)] pub enum AssignOp { Equal, // = PlusEqual, // += MinusEqual, // -= StarEqual, // *= SlashEqual, // /= PercentEqual, // %= }