diatom_core/frontend/parser/
ast.rs1use 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 {
24 loc: Loc,
25 value: Option<Expr>,
26 },
27 Loop {
29 loc: Loc,
30 condition: Option<Expr>,
31 body: Vec<Stmt>,
32 },
33 For {
35 loc: Loc,
36 loop_variable: Box<Expr>,
37 iterator: Box<Expr>,
38 body: Vec<Stmt>,
39 },
40 Def {
42 loc: Loc,
43 variable: Box<Expr>,
44 parameters: Vec<(String, Loc)>,
45 body: Vec<Stmt>,
46 },
47 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}