Skip to main content

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}