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}