use crate::extension::Extension; #[derive(Debug, Clone)] pub struct AST { pub ast_type: ASTType, pub extensions: Vec, pub start_line: usize, pub end_line: usize, pub start_column: usize, pub end_column: usize, } #[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(Name, 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, }