~starkingdoms/starkingdoms

ref: d024fde6beb37c38cb2f0c7088a828aaa6b2a09d starkingdoms/crates/kabel/src/ast.rs -rw-r--r-- 1.9 KiB
d024fde6 — ghostly_zsh oh shut up cargo.lock 8 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
use crate::extension::Extension;

crate::ast!(AST {
    kind: ASTType,
    extensions: Vec<Extension>
});

#[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(LhsAssign, 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,
}

crate::ast!(LhsAssign { kind: LhsAssignType, extensions: Vec<Extension> });

#[derive(Debug, Clone)]
pub enum LhsAssignType {
    Ident(String),
    Subscript(Box<AST>, Box<AST>),
}