Skip to main content

oak_wat/lexer/
token_type.rs

1use oak_core::{Token, TokenType, UniversalTokenRole};
2
3/// A token in the WebAssembly Text (WAT) language.
4pub type WatToken = Token<WatTokenType>;
5
6impl TokenType for WatTokenType {
7    type Role = UniversalTokenRole;
8    const END_OF_STREAM: Self = Self::Eof;
9
10    fn is_ignored(&self) -> bool {
11        matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
12    }
13
14    fn role(&self) -> Self::Role {
15        match self {
16            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
17            Self::Comment => UniversalTokenRole::Comment,
18            Self::IntegerLiteral | Self::FloatLiteral | Self::StringLiteral => UniversalTokenRole::Literal,
19            Self::Identifier => UniversalTokenRole::Name,
20            Self::ModuleKw
21            | Self::FuncKw
22            | Self::ExportKw
23            | Self::ImportKw
24            | Self::TypeKw
25            | Self::ParamKw
26            | Self::ResultKw
27            | Self::LocalKw
28            | Self::GlobalKw
29            | Self::MemoryKw
30            | Self::TableKw
31            | Self::ElemKw
32            | Self::DataKw
33            | Self::StartKw
34            | Self::BlockKw
35            | Self::LoopKw
36            | Self::IfKw
37            | Self::ThenKw
38            | Self::ElseKw
39            | Self::EndKw
40            | Self::BrKw
41            | Self::BrIfKw
42            | Self::BrTableKw
43            | Self::ReturnKw
44            | Self::CallKw
45            | Self::CallIndirectKw
46            | Self::LocalGetKw
47            | Self::LocalSetKw
48            | Self::LocalTeeKw
49            | Self::GlobalGetKw
50            | Self::GlobalSetKw
51            | Self::I32LoadKw
52            | Self::I64LoadKw
53            | Self::F32LoadKw
54            | Self::F64LoadKw
55            | Self::I32StoreKw
56            | Self::I64StoreKw
57            | Self::F32StoreKw
58            | Self::F64StoreKw
59            | Self::MemorySizeKw
60            | Self::MemoryGrowKw
61            | Self::I32ConstKw
62            | Self::I64ConstKw
63            | Self::F32ConstKw
64            | Self::F64ConstKw
65            | Self::I32AddKw
66            | Self::I64AddKw
67            | Self::F32AddKw
68            | Self::F64AddKw
69            | Self::I32SubKw
70            | Self::I64SubKw
71            | Self::F32SubKw
72            | Self::F64SubKw
73            | Self::I32MulKw
74            | Self::I64MulKw
75            | Self::F32MulKw
76            | Self::F64MulKw
77            | Self::I32EqKw
78            | Self::I64EqKw
79            | Self::F32EqKw
80            | Self::F64EqKw
81            | Self::I32NeKw
82            | Self::I64NeKw
83            | Self::F32NeKw
84            | Self::F64NeKw
85            | Self::DropKw
86            | Self::SelectKw
87            | Self::UnreachableKw
88            | Self::NopKw
89            | Self::I32Kw
90            | Self::I64Kw
91            | Self::F32Kw
92            | Self::F64Kw => UniversalTokenRole::Keyword,
93            Self::LeftParen | Self::RightParen => UniversalTokenRole::Punctuation,
94            Self::Eq => UniversalTokenRole::Operator,
95            _ => UniversalTokenRole::None,
96        }
97    }
98}
99
100/// Token types for the WebAssembly Text (WAT) language.
101#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
102#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
103#[repr(u8)]
104pub enum WatTokenType {
105    // Base kinds
106    /// Whitespace.
107    Whitespace,
108    /// Newline.
109    Newline,
110    /// Comment.
111    Comment,
112    /// Error token.
113    Error,
114    /// End of stream.
115    Eof,
116    /// Plain text.
117    Text,
118
119    // Literals
120    /// Integer literal.
121    IntegerLiteral,
122    /// Floating-point literal.
123    FloatLiteral,
124    /// String literal.
125    StringLiteral,
126    /// Identifier (starting with $).
127    Identifier,
128
129    // Keywords - Module structure
130    /// `module` keyword.
131    ModuleKw,
132    /// `func` keyword.
133    FuncKw,
134    /// `export` keyword.
135    ExportKw,
136    /// `import` keyword.
137    ImportKw,
138    /// `type` keyword.
139    TypeKw,
140    /// `param` keyword.
141    ParamKw,
142    /// `result` keyword.
143    ResultKw,
144    /// `local` keyword.
145    LocalKw,
146    /// `global` keyword.
147    GlobalKw,
148    /// `memory` keyword.
149    MemoryKw,
150    /// `table` keyword.
151    TableKw,
152    /// `elem` keyword.
153    ElemKw,
154    /// `data` keyword.
155    DataKw,
156    /// `start` keyword.
157    StartKw,
158
159    // Keywords - Control flow
160    /// `block` keyword.
161    BlockKw,
162    /// `loop` keyword.
163    LoopKw,
164    /// `if` keyword.
165    IfKw,
166    /// `then` keyword.
167    ThenKw,
168    /// `else` keyword.
169    ElseKw,
170    /// `end` keyword.
171    EndKw,
172    /// `br` keyword.
173    BrKw,
174    /// `br_if` keyword.
175    BrIfKw,
176    /// `br_table` keyword.
177    BrTableKw,
178    /// `return` keyword.
179    ReturnKw,
180    /// `call` keyword.
181    CallKw,
182    /// `call_indirect` keyword.
183    CallIndirectKw,
184
185    // Keywords - Variable operations
186    /// `local.get` keyword.
187    LocalGetKw,
188    /// `local.set` keyword.
189    LocalSetKw,
190    /// `local.tee` keyword.
191    LocalTeeKw,
192    /// `global.get` keyword.
193    GlobalGetKw,
194    /// `global.set` keyword.
195    GlobalSetKw,
196
197    // Keywords - Memory operations
198    /// `i32.load` keyword.
199    I32LoadKw,
200    /// `i64.load` keyword.
201    I64LoadKw,
202    /// `f32.load` keyword.
203    F32LoadKw,
204    /// `f64.load` keyword.
205    F64LoadKw,
206    /// `i32.load8_s` keyword.
207    I32Load8SKw,
208    /// `i32.load8_u` keyword.
209    I32Load8UKw,
210    /// `i32.load16_s` keyword.
211    I32Load16SKw,
212    /// `i32.load16_u` keyword.
213    I32Load16UKw,
214    /// `i64.load8_s` keyword.
215    I64Load8SKw,
216    /// `i64.load8_u` keyword.
217    I64Load8UKw,
218    /// `i64.load16_s` keyword.
219    I64Load16SKw,
220    /// `i64.load16_u` keyword.
221    I64Load16UKw,
222    /// `i64.load32_s` keyword.
223    I64Load32SKw,
224    /// `i64.load32_u` keyword.
225    I64Load32UKw,
226    /// `i32.store` keyword.
227    I32StoreKw,
228    /// `i64.store` keyword.
229    I64StoreKw,
230    /// `f32.store` keyword.
231    F32StoreKw,
232    /// `f64.store` keyword.
233    F64StoreKw,
234    /// `i32.store8` keyword.
235    I32Store8Kw,
236    /// `i32.store16` keyword.
237    I32Store16Kw,
238    /// `i64.store8` keyword.
239    I64Store8Kw,
240    /// `i64.store16` keyword.
241    I64Store16Kw,
242    /// `i64.store32` keyword.
243    I64Store32Kw,
244    /// `memory.size` keyword.
245    MemorySizeKw,
246    /// `memory.grow` keyword.
247    MemoryGrowKw,
248
249    // Keywords - Constants
250    /// `i32.const` keyword.
251    I32ConstKw,
252    /// `i64.const` keyword.
253    I64ConstKw,
254    /// `f32.const` keyword.
255    F32ConstKw,
256    /// `f64.const` keyword.
257    F64ConstKw,
258
259    // Keywords - Arithmetic operations
260    /// `i32.add` keyword.
261    I32AddKw,
262    /// `i64.add` keyword.
263    I64AddKw,
264    /// `f32.add` keyword.
265    F32AddKw,
266    /// `f64.add` keyword.
267    F64AddKw,
268    /// `i32.sub` keyword.
269    I32SubKw,
270    /// `i64.sub` keyword.
271    I64SubKw,
272    /// `f32.sub` keyword.
273    F32SubKw,
274    /// `f64.sub` keyword.
275    F64SubKw,
276    /// `i32.mul` keyword.
277    I32MulKw,
278    /// `i64.mul` keyword.
279    I64MulKw,
280    /// `f32.mul` keyword.
281    F32MulKw,
282    /// `f64.mul` keyword.
283    F64MulKw,
284    /// `i32.div_s` keyword.
285    I32DivSKw,
286    /// `i32.div_u` keyword.
287    I32DivUKw,
288    /// `i64.div_s` keyword.
289    I64DivSKw,
290    /// `i64.div_u` keyword.
291    I64DivUKw,
292    /// `f32.div` keyword.
293    F32DivKw,
294    /// `f64.div` keyword.
295    F64DivKw,
296    /// `i32.rem_s` keyword.
297    I32RemSKw,
298    /// `i32.rem_u` keyword.
299    I32RemUKw,
300    /// `i64.rem_s` keyword.
301    I64RemSKw,
302    /// `i64.rem_u` keyword.
303    I64RemUKw,
304
305    // Keywords - Comparison operations
306    /// `i32.eq` keyword.
307    I32EqKw,
308    /// `i64.eq` keyword.
309    I64EqKw,
310    /// `f32.eq` keyword.
311    F32EqKw,
312    /// `f64.eq` keyword.
313    F64EqKw,
314    /// `i32.ne` keyword.
315    I32NeKw,
316    /// `i64.ne` keyword.
317    I64NeKw,
318    /// `f32.ne` keyword.
319    F32NeKw,
320    /// `f64.ne` keyword.
321    F64NeKw,
322    /// `i32.lt_s` keyword.
323    I32LtSKw,
324    /// `i32.lt_u` keyword.
325    I32LtUKw,
326    /// `i64.lt_s` keyword.
327    I64LtSKw,
328    /// `i64.lt_u` keyword.
329    I64LtUKw,
330    /// `f32.lt` keyword.
331    F32LtKw,
332    /// `f64.lt` keyword.
333    F64LtKw,
334    /// `i32.gt_s` keyword.
335    I32GtSKw,
336    /// `i32.gt_u` keyword.
337    I32GtUKw,
338    /// `i64.gt_s` keyword.
339    I64GtSKw,
340    /// `i64.gt_u` keyword.
341    I64GtUKw,
342    /// `f32.gt` keyword.
343    F32GtKw,
344    /// `f64.gt` keyword.
345    F64GtKw,
346    /// `i32.le_s` keyword.
347    I32LeSKw,
348    /// `i32.le_u` keyword.
349    I32LeUKw,
350    /// `i64.le_s` keyword.
351    I64LeSKw,
352    /// `i64.le_u` keyword.
353    I64LeUKw,
354    /// `f32.le` keyword.
355    F32LeKw,
356    /// `f64.le` keyword.
357    F64LeKw,
358    /// `i32.ge_s` keyword.
359    I32GeSKw,
360    /// `i32.ge_u` keyword.
361    I32GeUKw,
362    /// `i64.ge_s` keyword.
363    I64GeSKw,
364    /// `i64.ge_u` keyword.
365    I64GeUKw,
366    /// `f32.ge` keyword.
367    F32GeKw,
368    /// `f64.ge` keyword.
369    F64GeKw,
370
371    // Keywords - Bitwise operations
372    /// `i32.and` keyword.
373    I32AndKw,
374    /// `i64.and` keyword.
375    I64AndKw,
376    /// `i32.or` keyword.
377    I32OrKw,
378    /// `i64.or` keyword.
379    I64OrKw,
380    /// `i32.xor` keyword.
381    I32XorKw,
382    /// `i64.xor` keyword.
383    I64XorKw,
384    /// `i32.shl` keyword.
385    I32ShlKw,
386    /// `i64.shl` keyword.
387    I64ShlKw,
388    /// `i32.shr_s` keyword.
389    I32ShrSKw,
390    /// `i32.shr_u` keyword.
391    I32ShrUKw,
392    /// `i64.shr_s` keyword.
393    I64ShrSKw,
394    /// `i64.shr_u` keyword.
395    I64ShrUKw,
396    /// `i32.rotl` keyword.
397    I32RotlKw,
398    /// `i64.rotl` keyword.
399    I64RotlKw,
400    /// `i32.rotr` keyword.
401    I32RotrKw,
402    /// `i64.rotr` keyword.
403    I64RotrKw,
404
405    // Keywords - Conversions
406    /// `i32.wrap_i64` keyword.
407    I32WrapI64Kw,
408    /// `i64.extend_i32_s` keyword.
409    I64ExtendI32SKw,
410    /// `i64.extend_i32_u` keyword.
411    I64ExtendI32UKw,
412    /// `i32.trunc_f32_s` keyword.
413    I32TruncF32SKw,
414    /// `i32.trunc_f32_u` keyword.
415    I32TruncF32UKw,
416    /// `i32.trunc_f64_s` keyword.
417    I32TruncF64SKw,
418    /// `i32.trunc_f64_u` keyword.
419    I32TruncF64UKw,
420    /// `i64.trunc_f32_s` keyword.
421    I64TruncF32SKw,
422    /// `i64.trunc_f32_u` keyword.
423    I64TruncF32UKw,
424    /// `i64.trunc_f64_s` keyword.
425    I64TruncF64SKw,
426    /// `i64.trunc_f64_u` keyword.
427    I64TruncF64UKw,
428    /// `f32.convert_i32_s` keyword.
429    F32ConvertI32SKw,
430    /// `f32.convert_i32_u` keyword.
431    F32ConvertI32UKw,
432    /// `f32.convert_i64_s` keyword.
433    F32ConvertI64SKw,
434    /// `f32.convert_i64_u` keyword.
435    F32ConvertI64UKw,
436    /// `f64.convert_i32_s` keyword.
437    F64ConvertI32SKw,
438    /// `f64.convert_i32_u` keyword.
439    F64ConvertI32UKw,
440    /// `f64.convert_i64_s` keyword.
441    F64ConvertI64SKw,
442    /// `f64.convert_i64_u` keyword.
443    F64ConvertI64UKw,
444    /// `f32.demote_f64` keyword.
445    F32DemoteF64Kw,
446    /// `f64.promote_f32` keyword.
447    F64PromoteF32Kw,
448
449    // Keywords - Other instructions
450    /// `drop` keyword.
451    DropKw,
452    /// `select` keyword.
453    SelectKw,
454    /// `unreachable` keyword.
455    UnreachableKw,
456    /// `nop` keyword.
457    NopKw,
458
459    // Keywords - Types
460    /// `i32` keyword.
461    I32Kw,
462    /// `i64` keyword.
463    I64Kw,
464    /// `f32` keyword.
465    F32Kw,
466    /// `f64` keyword.
467    F64Kw,
468    /// `funcref` keyword.
469    FuncrefKw,
470    /// `externref` keyword.
471    ExternrefKw,
472
473    // Keywords - Other
474    /// `mut` keyword.
475    MutKw,
476    /// `offset` keyword.
477    OffsetKw,
478    /// `align` keyword.
479    AlignKw,
480
481    // Punctuations
482    /// `(`.
483    LeftParen,
484    /// `)`.
485    RightParen,
486    /// `[`.
487    LeftBracket,
488    /// `]`.
489    RightBracket,
490    /// `{`.
491    LeftBrace,
492    /// `}`.
493    RightBrace,
494    /// `;`.
495    Semicolon,
496    /// `,`.
497    Comma,
498    /// `.`.
499    Dot,
500    /// `"`.
501    Quote,
502    /// `$`.
503    Dollar,
504    /// `+`.
505    Plus,
506    /// `-`.
507    Minus,
508    /// `*`.
509    Star,
510    /// `/`.
511    Slash,
512    /// `=`.
513    Eq,
514    /// `:`.
515    Colon,
516    /// `?`.
517    Question,
518    /// `!`.
519    Bang,
520    /// `@`.
521    At,
522    /// `#`.
523    Hash,
524    /// `%`.
525    Percent,
526    /// `^`.
527    Caret,
528    /// `&`.
529    Ampersand,
530    /// `<`.
531    LessThan,
532    /// `>`.
533    GreaterThan,
534    /// `\`.
535    Backslash,
536    /// `|`.
537    Pipe,
538    /// `~`.
539    Tilde,
540    // Special
541    /// Root node.
542    Root,
543    /// Source file.
544    SourceFile,
545    /// Module.
546    Module,
547    /// Item.
548    Item,
549}