diatom_core/frontend/parser/
ast.rs

1use crate::file_manager::Loc;
2
3#[derive(Clone)]
4pub struct ImportItem {
5    pub loc: Loc,
6    pub alias: Option<String>,
7    pub path: Vec<String>,
8}
9
10#[derive(Clone)]
11pub enum Stmt {
12    Expr {
13        loc: Loc,
14        expr: Expr,
15    },
16    Continue {
17        loc: Loc,
18    },
19    Break {
20        loc: Loc,
21    },
22    /// Return, may not have a return value
23    Return {
24        loc: Loc,
25        value: Option<Expr>,
26    },
27    /// loop
28    Loop {
29        loc: Loc,
30        condition: Option<Expr>,
31        body: Vec<Stmt>,
32    },
33    /// for each loop
34    For {
35        loc: Loc,
36        loop_variable: Box<Expr>,
37        iterator: Box<Expr>,
38        body: Vec<Stmt>,
39    },
40    /// Define a function
41    Def {
42        loc: Loc,
43        variable: Box<Expr>,
44        parameters: Vec<(String, Loc)>,
45        body: Vec<Stmt>,
46    },
47    /// Import module
48    Import {
49        loc: Loc,
50        fid: usize,
51        items: Vec<ImportItem>,
52        direct_import_mod: bool,
53    },
54    Error,
55}
56
57#[derive(Clone, Copy)]
58pub enum OpInfix {
59    Assign,
60    Range,
61    Or,
62    And,
63    Eq,
64    Ne,
65    Le,
66    Lt,
67    Ge,
68    Gt,
69    Plus,
70    Minus,
71    Mul,
72    Div,
73    DivFloor,
74    Rem,
75    Exp,
76    Comma,
77    Member,
78    DoubleColon,
79    LArrow,
80    Is,
81}
82
83#[derive(Clone, Copy)]
84pub enum OpPrefix {
85    Not,
86    Neg,
87}
88
89#[derive(Clone, Copy)]
90pub enum OpPostfix {
91    Index,
92    Call,
93}
94
95#[derive(Clone)]
96pub enum Expr {
97    Block {
98        loc: Loc,
99        body: Vec<Stmt>,
100    },
101    If {
102        loc: Loc,
103        conditional: Vec<(Expr, Vec<Stmt>)>,
104        default: Option<Vec<Stmt>>,
105    },
106    Prefix {
107        loc: Loc,
108        op: OpPrefix,
109        rhs: Box<Expr>,
110    },
111    Call {
112        loc: Loc,
113        lhs: Box<Expr>,
114        parameters: Vec<Expr>,
115    },
116    Index {
117        loc: Loc,
118        lhs: Box<Expr>,
119        rhs: Box<Expr>,
120    },
121    Infix {
122        loc: Loc,
123        op: OpInfix,
124        lhs: Box<Expr>,
125        rhs: Box<Expr>,
126    },
127    OpenRange {
128        loc: Loc,
129        lhs: Box<Expr>,
130    },
131    Fn {
132        loc: Loc,
133        parameters: Vec<(String, Loc)>,
134        body: Box<Expr>,
135    },
136    Id {
137        loc: Loc,
138        name: String,
139    },
140    Parentheses {
141        loc: Loc,
142        content: Box<Expr>,
143    },
144    Const {
145        loc: Loc,
146        value: Const,
147    },
148    Error,
149}
150
151impl Expr {
152    pub fn get_loc(&self) -> Loc {
153        match self {
154            Expr::Block { loc, .. } => loc,
155            Expr::If { loc, .. } => loc,
156            Expr::Prefix { loc, .. } => loc,
157            Expr::Call { loc, .. } => loc,
158            Expr::Index { loc, .. } => loc,
159            Expr::Infix { loc, .. } => loc,
160            Expr::Fn { loc, .. } => loc,
161            Expr::Id { loc, .. } => loc,
162            Expr::Parentheses { loc, .. } => loc,
163            Expr::Const { loc, .. } => loc,
164            Expr::Error => unreachable!(),
165            Expr::OpenRange { loc, .. } => loc,
166        }
167        .clone()
168    }
169}
170
171#[derive(Clone)]
172pub enum Const {
173    Unit,
174    Int(i64),
175    Float(f64),
176    Str(String),
177    Bool(bool),
178    List(Vec<Expr>),
179    Table(Vec<(String, Expr, Loc)>),
180}