oak_wat/parser/element_type.rs
1use oak_core::{ElementType, UniversalElementRole};
2
3/// Element types for the WebAssembly Text (WAT) format.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6#[repr(u8)]
7pub enum WatElementType {
8 /// Whitespace.
9 Whitespace,
10 /// Newline.
11 Newline,
12 /// A comment.
13 Comment,
14 /// An error token.
15 Error,
16 /// End of stream.
17 Eof,
18 /// Text.
19 Text,
20
21 /// An integer literal.
22 IntegerLiteral,
23 /// A floating-point literal.
24 FloatLiteral,
25 /// A string literal.
26 StringLiteral,
27 /// An identifier.
28 Identifier,
29
30 /// `module` keyword.
31 ModuleKw,
32 /// `func` keyword.
33 FuncKw,
34 /// `export` keyword.
35 ExportKw,
36 /// `import` keyword.
37 ImportKw,
38 /// `type` keyword.
39 TypeKw,
40 /// `param` keyword.
41 ParamKw,
42 /// `result` keyword.
43 ResultKw,
44 /// `local` keyword.
45 LocalKw,
46 /// `global` keyword.
47 GlobalKw,
48 /// `memory` keyword.
49 MemoryKw,
50 /// `table` keyword.
51 TableKw,
52 /// `elem` keyword.
53 ElemKw,
54 /// `data` keyword.
55 DataKw,
56 /// `start` keyword.
57 StartKw,
58
59 /// `block` keyword.
60 BlockKw,
61 /// `loop` keyword.
62 LoopKw,
63 /// `if` keyword.
64 IfKw,
65 /// `then` keyword.
66 ThenKw,
67 /// `else` keyword.
68 ElseKw,
69 /// `end` keyword.
70 EndKw,
71 /// `br` keyword.
72 BrKw,
73 /// `br_if` keyword.
74 BrIfKw,
75 /// `br_table` keyword.
76 BrTableKw,
77 /// `return` keyword.
78 ReturnKw,
79 /// `call` keyword.
80 CallKw,
81 /// `call_indirect` keyword.
82 CallIndirectKw,
83
84 /// `local.get` keyword.
85 LocalGetKw,
86 /// `local.set` keyword.
87 LocalSetKw,
88 /// `local.tee` keyword.
89 LocalTeeKw,
90 /// `global.get` keyword.
91 GlobalGetKw,
92 /// `global.set` keyword.
93 GlobalSetKw,
94
95 /// `i32.load` keyword.
96 I32LoadKw,
97 /// `i64.load` keyword.
98 I64LoadKw,
99 /// `f32.load` keyword.
100 F32LoadKw,
101 /// `f64.load` keyword.
102 F64LoadKw,
103 /// `i32.load8_s` keyword.
104 I32Load8SKw,
105 /// `i32.load8_u` keyword.
106 I32Load8UKw,
107 /// `i32.load16_s` keyword.
108 I32Load16SKw,
109 /// `i32.load16_u` keyword.
110 I32Load16UKw,
111 /// `i64.load8_s` keyword.
112 I64Load8SKw,
113 /// `i64.load8_u` keyword.
114 I64Load8UKw,
115 /// `i64.load16_s` keyword.
116 I64Load16SKw,
117 /// `i64.load16_u` keyword.
118 I64Load16UKw,
119 /// `i64.load32_s` keyword.
120 I64Load32SKw,
121 /// `i64.load32_u` keyword.
122 I64Load32UKw,
123 /// `i32.store` keyword.
124 I32StoreKw,
125 /// `i64.store` keyword.
126 I64StoreKw,
127 /// `f32.store` keyword.
128 F32StoreKw,
129 /// `f64.store` keyword.
130 F64StoreKw,
131 /// `i32.store8` keyword.
132 I32Store8Kw,
133 /// `i32.store16` keyword.
134 I32Store16Kw,
135 /// `i64.store8` keyword.
136 I64Store8Kw,
137 /// `i64.store16` keyword.
138 I64Store16Kw,
139 /// `i64.store32` keyword.
140 I64Store32Kw,
141 /// `memory.size` keyword.
142 MemorySizeKw,
143 /// `memory.grow` keyword.
144 MemoryGrowKw,
145
146 /// `i32.const` keyword.
147 I32ConstKw,
148 /// `i64.const` keyword.
149 I64ConstKw,
150 /// `f32.const` keyword.
151 F32ConstKw,
152 /// `f64.const` keyword.
153 F64ConstKw,
154
155 /// `i32.add` keyword.
156 I32AddKw,
157 /// `i64.add` keyword.
158 I64AddKw,
159 /// `f32.add` keyword.
160 F32AddKw,
161 /// `f64.add` keyword.
162 F64AddKw,
163 /// `i32.sub` keyword.
164 I32SubKw,
165 /// `i64.sub` keyword.
166 I64SubKw,
167 /// `f32.sub` keyword.
168 F32SubKw,
169 /// `f64.sub` keyword.
170 F64SubKw,
171 /// `i32.mul` keyword.
172 I32MulKw,
173 /// `i64.mul` keyword.
174 I64MulKw,
175 /// `f32.mul` keyword.
176 F32MulKw,
177 /// `f64.mul` keyword.
178 F64MulKw,
179 /// `i32.div_s` keyword.
180 I32DivSKw,
181 /// `i32.div_u` keyword.
182 I32DivUKw,
183 /// `i64.div_s` keyword.
184 I64DivSKw,
185 /// `i64.div_u` keyword.
186 I64DivUKw,
187 /// `f32.div` keyword.
188 F32DivKw,
189 /// `f64.div` keyword.
190 F64DivKw,
191 /// `i32.rem_s` keyword.
192 I32RemSKw,
193 /// `i32.rem_u` keyword.
194 I32RemUKw,
195 /// `i64.rem_s` keyword.
196 I64RemSKw,
197 /// `i64.rem_u` keyword.
198 I64RemUKw,
199 /// `i32.and` keyword.
200 I32AndKw,
201 /// `i64.and` keyword.
202 I64AndKw,
203 /// `i32.or` keyword.
204 I32OrKw,
205 /// `i64.or` keyword.
206 I64OrKw,
207 /// `i32.xor` keyword.
208 I32XorKw,
209 /// `i64.xor` keyword.
210 I64XorKw,
211 /// `i32.shl` keyword.
212 I32ShlKw,
213 /// `i64.shl` keyword.
214 I64ShlKw,
215 /// `i32.shr_s` keyword.
216 I32ShrSKw,
217 /// `i32.shr_u` keyword.
218 I32ShrUKw,
219 /// `i64.shr_s` keyword.
220 I64ShrSKw,
221 /// `i64.shr_u` keyword.
222 I64ShrUKw,
223 /// `i32.rotl` keyword.
224 I32RotlKw,
225 /// `i64.rotl` keyword.
226 I64RotlKw,
227 /// `i32.rotr` keyword.
228 I32RotrKw,
229 /// `i64.rotr` keyword.
230 I64RotrKw,
231
232 /// `i32.eq` keyword.
233 I32EqKw,
234 /// `i64.eq` keyword.
235 I64EqKw,
236 /// `f32.eq` keyword.
237 F32EqKw,
238 /// `f64.eq` keyword.
239 F64EqKw,
240 /// `i32.ne` keyword.
241 I32NeKw,
242 /// `i64.ne` keyword.
243 I64NeKw,
244 /// `f32.ne` keyword.
245 F32NeKw,
246 /// `f64.ne` keyword.
247 F64NeKw,
248 /// `i32.lt_s` keyword.
249 I32LtSKw,
250 /// `i32.lt_u` keyword.
251 I32LtUKw,
252 /// `i64.lt_s` keyword.
253 I64LtSKw,
254 /// `i64.lt_u` keyword.
255 I64LtUKw,
256 /// `f32.lt` keyword.
257 F32LtKw,
258 /// `f64.lt` keyword.
259 F64LtKw,
260 /// `i32.gt_s` keyword.
261 I32GtSKw,
262 /// `i32.gt_u` keyword.
263 I32GtUKw,
264 /// `i64.gt_s` keyword.
265 I64GtSKw,
266 /// `i64.gt_u` keyword.
267 I64GtUKw,
268 /// `f32.gt` keyword.
269 F32GtKw,
270 /// `f64.gt` keyword.
271 F64GtKw,
272 /// `i32.le_s` keyword.
273 I32LeSKw,
274 /// `i32.le_u` keyword.
275 I32LeUKw,
276 /// `i64.le_s` keyword.
277 I64LeSKw,
278 /// `i64.le_u` keyword.
279 I64LeUKw,
280 /// `f32.le` keyword.
281 F32LeKw,
282 /// `f64.le` keyword.
283 F64LeKw,
284 /// `i32.ge_s` keyword.
285 I32GeSKw,
286 /// `i32.ge_u` keyword.
287 I32GeUKw,
288 /// `i64.ge_s` keyword.
289 I64GeSKw,
290 /// `i64.ge_u` keyword.
291 I64GeUKw,
292 /// `f32.ge` keyword.
293 F32GeKw,
294 /// `f64.ge` keyword.
295 F64GeKw,
296
297 /// `(`.
298 LeftParen,
299 /// `)`.
300 RightParen,
301
302 /// A WebAssembly module.
303 Module,
304 /// A function.
305 Func,
306 /// An export.
307 Export,
308 /// An import.
309 Import,
310 /// A type definition.
311 Type,
312 /// A parameter.
313 Param,
314 /// A result.
315 Result,
316 /// A local variable.
317 Local,
318 /// A global variable.
319 Global,
320 /// Memory definition.
321 Memory,
322 /// Table definition.
323 Table,
324 /// Element segment.
325 Elem,
326 /// Data segment.
327 Data,
328 /// Start function.
329 Start,
330 /// A block.
331 Block,
332 /// A loop.
333 Loop,
334 /// An if statement.
335 If,
336 /// An instruction.
337 Instruction,
338 /// Root node.
339 Root,
340 /// A generic item.
341 Item,
342}
343
344impl WatElementType {
345 /// Returns the element type for the given keyword.
346 pub fn from_keyword(text: &str) -> Option<Self> {
347 match text {
348 "module" => Some(Self::ModuleKw),
349 "func" => Some(Self::FuncKw),
350 "export" => Some(Self::ExportKw),
351 "import" => Some(Self::ImportKw),
352 "type" => Some(Self::TypeKw),
353 "param" => Some(Self::ParamKw),
354 "result" => Some(Self::ResultKw),
355 "local" => Some(Self::LocalKw),
356 "global" => Some(Self::GlobalKw),
357 "memory" => Some(Self::MemoryKw),
358 "table" => Some(Self::TableKw),
359 "elem" => Some(Self::ElemKw),
360 "data" => Some(Self::DataKw),
361 "start" => Some(Self::StartKw),
362 "block" => Some(Self::BlockKw),
363 "loop" => Some(Self::LoopKw),
364 "if" => Some(Self::IfKw),
365 "then" => Some(Self::ThenKw),
366 "else" => Some(Self::ElseKw),
367 "end" => Some(Self::EndKw),
368 _ => None,
369 }
370 }
371}
372
373impl ElementType for WatElementType {
374 type Role = UniversalElementRole;
375
376 fn role(&self) -> Self::Role {
377 match self {
378 Self::Root => UniversalElementRole::Root,
379 Self::Error => UniversalElementRole::Error,
380 Self::Module => UniversalElementRole::Definition,
381 Self::Func => UniversalElementRole::Definition,
382 _ => UniversalElementRole::None,
383 }
384 }
385}
386
387impl From<crate::lexer::token_type::WatTokenType> for WatElementType {
388 fn from(token: crate::lexer::token_type::WatTokenType) -> Self {
389 unsafe { std::mem::transmute(token) }
390 }
391}