const Token = @import("Token.zig"); pub const Expr = union(enum) { binary: Binary, grouping: Grouping, literal: Literal, unary: Unary, const Binary = struct { left: *const Expr, operator: Token, right: *const Expr, pub fn init(left: *const Expr, operator: Token, right: *const Expr) Binary { return .{ .left = left, .operator = operator, .right = right, }; } }; const Grouping = struct { expression: *const Expr, pub fn init(expression: *const Expr) Grouping { return .{ .expression = expression, }; } }; const Literal = struct { value: Token.Literal, pub fn init(value: Token.Literal) Literal { return .{ .value = value, }; } }; const Unary = struct { operator: Token, right: *const Expr, pub fn init(operator: Token, right: *const Expr) Unary { return Unary{ .operator = operator, .right = right, }; } }; };