use crate::extension::Extension; crate::ast!(AST { kind: ASTType, extensions: Vec }); #[derive(Debug, Clone)] pub enum ASTType { Program(Vec), // statements Function(Name, Vec, Box), // name, args, block Return(Box>), // expression Loop(Box), // block While(Box, Box), // condition, block For( Box>, Box>, Box>, Box, ), // expr1, expr2, expr3, block Break, Continue, If(Box, Box, Box>), // condition, block, else/else if Block(Vec), // statements Decl(Name, Box), // identifier, expression Expr(Box), // expr // REMOVE LATER Print(Box), // expressions Assign(LhsAssign, Box), Anonymous(Vec, Box), Ternary(Box, Box, Box), Subscript(Box, Box), Binary(Box, BinOp, Box), Unary(UnOp, Box), // primary Lit(Lit), Call(Box, Vec), Member(Box, Box), } #[derive(Debug, Clone)] pub struct Name { pub name: String, pub start_column: usize, pub end_column: usize, pub line: usize, } #[derive(Debug, Clone)] pub enum Lit { Ident(String), Num(f32), Str(String), Bool(bool), Array(Vec), } #[derive(Debug, Clone, Copy)] pub enum BinOp { Add, Sub, Mul, Div, Mod, BitAnd, BitXor, BitOr, Eq, Ne, Gr, Ge, Ls, Le, Or, And, } #[derive(Debug, Clone, Copy)] pub enum UnOp { Not, Neg, } crate::ast!(LhsAssign { kind: LhsAssignType, extensions: Vec }); #[derive(Debug, Clone)] pub enum LhsAssignType { Ident(String), Subscript(Box, Box), }