use crate::extension::Extension;
#[derive(Debug, Clone)]
pub struct AST {
pub ast_type: ASTType,
pub extensions: Vec<Extension>,
pub start_line: usize,
pub end_line: usize,
pub start_column: usize,
pub end_column: usize,
}
#[derive(Debug, Clone)]
pub enum ASTType {
Program(Vec<AST>),
// statements
Function(Name, Vec<Name>, Box<AST>), // name, args, block
Return(Box<Option<AST>>), // expression
Loop(Box<AST>), // block
While(Box<AST>, Box<AST>), // condition, block
For(
Box<Option<AST>>,
Box<Option<AST>>,
Box<Option<AST>>,
Box<AST>,
), // expr1, expr2, expr3, block
Break,
Continue,
If(Box<AST>, Box<AST>, Box<Option<AST>>), // condition, block, else/else if
Block(Vec<AST>), // statements
Decl(Name, Box<AST>), // identifier, expression
Expr(Box<AST>), // expr
// REMOVE LATER
Print(Box<AST>),
// expressions
Assign(Name, Box<AST>),
Anonymous(Vec<Name>, Box<AST>),
Ternary(Box<AST>, Box<AST>, Box<AST>),
Subscript(Box<AST>, Box<AST>),
Binary(Box<AST>, BinOp, Box<AST>),
Unary(UnOp, Box<AST>),
// primary
Lit(Lit),
Call(Box<AST>, Vec<AST>),
Member(Box<AST>, Box<AST>),
}
#[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<AST>),
}
#[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,
}