1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
(* SPDX-License-Identifier: AGPL-3.0-or-later *)
(* Copyright © 2021-2026 OCamlPro *)
(* Written by the Owi programmers *)

let keywords : (string * Text_parser.token) Array.t =
  [| ("align", ALIGN)
   ; ("any", ANY)
   ; ("any.convert_extern", ANY_CONVERT_EXTERN)
   ; ("anyref", ANY_REF)
   ; ("array", ARRAY)
   ; ("array.copy", ARRAY_COPY)
   ; ("array.fill", ARRAY_FILL)
   ; ("array.get", ARRAY_GET)
   ; ("array.get_s", ARRAY_GET_S)
   ; ("array.get_u", ARRAY_GET_U)
   ; ("array.init_data", ARRAY_INIT_DATA)
   ; ("array.init_elem", ARRAY_INIT_ELEM)
   ; ("array.len", ARRAY_LEN)
   ; ("array.new", ARRAY_NEW_CANON)
   ; ("array.new_data", ARRAY_NEW_CANON_DATA)
   ; ("array.new_default", ARRAY_NEW_CANON_DEFAULT)
   ; ("array.new_elem", ARRAY_NEW_CANON_ELEM)
   ; ("array.new_fixed", ARRAY_NEW_CANON_FIXED)
   ; ("arrayref", ARRAY_REF)
   ; ("array.set", ARRAY_SET)
   ; ("assert_exhaustion", ASSERT_EXHAUSTION)
   ; ("assert_invalid", ASSERT_INVALID)
   ; ("assert_malformed", ASSERT_MALFORMED)
   ; ("assert_return", ASSERT_RETURN)
   ; ("assert_trap", ASSERT_TRAP)
   ; ("assert_unlinkable", ASSERT_UNLINKABLE)
   ; ("binary", BINARY)
   ; ("block", BLOCK)
   ; ("br", BR)
   ; ("br_if", BR_IF)
   ; ("br_on_cast", BR_ON_CAST)
   ; ("br_on_cast_fail", BR_ON_CAST_FAIL)
   ; ("br_on_non_null", BR_ON_NON_NULL)
   ; ("br_on_null", BR_ON_NULL)
   ; ("br_table", BR_TABLE)
   ; ("call", CALL)
   ; ("call_indirect", CALL_INDIRECT)
   ; ("call_ref", CALL_REF)
   ; ("data", DATA)
   ; ("data.drop", DATA_DROP)
   ; ("declare", DECLARE)
   ; ("definition", DEFINITION)
   ; ("drop", DROP)
   ; ("elem.drop", ELEM_DROP)
   ; ("elem", ELEM)
   ; ("else", ELSE)
   ; ("end", END)
   ; ("eq", EQ)
   ; ("eqref", EQ_REF)
   ; ("exn", EXN)
   ; ("exnref", EXN_REF)
   ; ("export", EXPORT)
   ; ("extern.convert_any", EXTERN_CONVERT_ANY)
   ; ("extern", EXTERN)
   ; ("externref", EXTERN_REF)
   ; ("f32.abs", F32_ABS)
   ; ("f32.add", F32_ADD)
   ; ("f32.ceil", F32_CEIL)
   ; ("f32.const", F32_CONST)
   ; ("f32.convert_i32_s", F32_CONVERT_I32_S)
   ; ("f32.convert_i32_u", F32_CONVERT_I32_U)
   ; ("f32.convert_i64_s", F32_CONVERT_I64_S)
   ; ("f32.convert_i64_u", F32_CONVERT_I64_U)
   ; ("f32.copysign", F32_COPYSIGN)
   ; ("f32.demote_f64", F32_DEMOTE_F64)
   ; ("f32.div", F32_DIV)
   ; ("f32.eq", F32_EQ)
   ; ("f32", F32)
   ; ("f32.floor", F32_FLOOR)
   ; ("f32.ge", F32_GE)
   ; ("f32.gt", F32_GT)
   ; ("f32.le", F32_LE)
   ; ("f32.load", F32_LOAD)
   ; ("f32.lt", F32_LT)
   ; ("f32.max", F32_MAX)
   ; ("f32.min", F32_MIN)
   ; ("f32.mul", F32_MUL)
   ; ("f32.nearest", F32_NEAREST)
   ; ("f32.ne", F32_NE)
   ; ("f32.neg", F32_NEG)
   ; ("f32.reinterpret_i32", F32_REINTERPRET_I32)
   ; ("f32.reinterpret_i64", F32_REINTERPRET_I64)
   ; ("f32.sqrt", F32_SQRT)
   ; ("f32.store", F32_STORE)
   ; ("f32.sub", F32_SUB)
   ; ("f32.trunc", F32_TRUNC)
   ; ("f32x4.add", F32X4_ADD)
   ; ("f32x4.ceil", F32X4_CEIL)
   ; ("f32x4.convert_i32x4_s", F32X4_CONVERT_I32X4_S)
   ; ("f32x4.eq", F32X4_EQ)
   ; ("f32x4", F32X4)
   ; ("f32x4.min", F32X4_MIN)
   ; ("f32x4.pmin", F32X4_PMIN)
   ; ("f64.abs", F64_ABS)
   ; ("f64.add", F64_ADD)
   ; ("f64.ceil", F64_CEIL)
   ; ("f64.const", F64_CONST)
   ; ("f64.convert_i32_s", F64_CONVERT_I32_S)
   ; ("f64.convert_i32_u", F64_CONVERT_I32_U)
   ; ("f64.convert_i64_s", F64_CONVERT_I64_S)
   ; ("f64.convert_i64_u", F64_CONVERT_I64_U)
   ; ("f64.copysign", F64_COPYSIGN)
   ; ("f64.div", F64_DIV)
   ; ("f64.eq", F64_EQ)
   ; ("f64", F64)
   ; ("f64.floor", F64_FLOOR)
   ; ("f64.ge", F64_GE)
   ; ("f64.gt", F64_GT)
   ; ("f64.le", F64_LE)
   ; ("f64.load", F64_LOAD)
   ; ("f64.lt", F64_LT)
   ; ("f64.max", F64_MAX)
   ; ("f64.min", F64_MIN)
   ; ("f64.mul", F64_MUL)
   ; ("f64.nearest", F64_NEAREST)
   ; ("f64.ne", F64_NE)
   ; ("f64.neg", F64_NEG)
   ; ("f64.promote_f32", F64_PROMOTE_F32)
   ; ("f64.reinterpret_i32", F64_REINTERPRET_I32)
   ; ("f64.reinterpret_i64", F64_REINTERPRET_I64)
   ; ("f64.sqrt", F64_SQRT)
   ; ("f64.store", F64_STORE)
   ; ("f64.sub", F64_SUB)
   ; ("f64.trunc", F64_TRUNC)
   ; ("f64x2.add", F64X2_ADD)
   ; ("f64x2.ceil", F64X2_CEIL)
   ; ("f64x2.eq", F64X2_EQ)
   ; ("f64x2", F64X2)
   ; ("f64x2.min", F64X2_MIN)
   ; ("f64x2.pmin", F64X2_PMIN)
   ; ("field", FIELD)
   ; ("final", FINAL)
   ; ("func", FUNC)
   ; ("funcref", FUNC_REF)
   ; ("get", GET)
   ; ("global.get", GLOBAL_GET)
   ; ("global", GLOBAL)
   ; ("global.set", GLOBAL_SET)
   ; ("i16", I16)
   ; ("i16x8.add", I16X8_ADD)
   ; ("i16x8.add_sat_s", I16X8_ADD_SAT_S)
   ; ("i16x8.eq", I16X8_EQ)
   ; ("i16x8.extadd_pairwise_i8x16_s", I16X8_EXTADD_PAIRWISE_I8X16_S)
   ; ("i16x8.extend_high_i8x16_s", I16X8_EXTEND_HIGH_I8X16_S)
   ; ("i16x8_extend_high_i8x16_s", I16X8_EXTEND_HIGH_I8X16_S)
   ; ("i16x8.extmul_low_i8x16_s", I16X8_EXTMUL_LOW_I8X16_S)
   ; ("i16x8", I16X8)
   ; ("i16x8.min_s", I16X8_MIN_S)
   ; ("i16x8.q15mulr_sat_s", I16X8_Q15MULR_SAT_S)
   ; ("i31.get_s", I31_GET_S)
   ; ("i31.get_u", I31_GET_U)
   ; ("i31", I31)
   ; ("i31ref", I31_REF)
   ; ("i32.add", I32_ADD)
   ; ("i32.and", I32_AND)
   ; ("i32.clz", I32_CLZ)
   ; ("i32.const", I32_CONST)
   ; ("i32.ctz", I32_CTZ)
   ; ("i32.div_s", I32_DIV_S)
   ; ("i32.div_u", I32_DIV_U)
   ; ("i32.eq", I32_EQ)
   ; ("i32.eqz", I32_EQZ)
   ; ("i32.extend16_s", I32_EXTEND16_S)
   ; ("i32.extend8_s", I32_EXTEND8_S)
   ; ("i32.ge_s", I32_GE_S)
   ; ("i32.ge_u", I32_GE_U)
   ; ("i32.gt_s", I32_GT_S)
   ; ("i32.gt_u", I32_GT_U)
   ; ("i32", I32)
   ; ("i32.le_s", I32_LE_S)
   ; ("i32.le_u", I32_LE_U)
   ; ("i32.load16_s", I32_LOAD16_S)
   ; ("i32.load16_u", I32_LOAD16_U)
   ; ("i32.load8_s", I32_LOAD8_S)
   ; ("i32.load8_u", I32_LOAD8_U)
   ; ("i32.load", I32_LOAD)
   ; ("i32.lt_s", I32_LT_S)
   ; ("i32.lt_u", I32_LT_U)
   ; ("i32.mul", I32_MUL)
   ; ("i32.ne", I32_NE)
   ; ("i32.or", I32_OR)
   ; ("i32.popcnt", I32_POPCNT)
   ; ("i32.reinterpret_f32", I32_REINTERPRET_F32)
   ; ("i32.reinterpret_f64", I32_REINTERPRET_F64)
   ; ("i32.rem_s", I32_REM_S)
   ; ("i32.rem_u", I32_REM_U)
   ; ("i32.rotl", I32_ROTL)
   ; ("i32.rotr", I32_ROTR)
   ; ("i32.shl", I32_SHL)
   ; ("i32.shr_s", I32_SHR_S)
   ; ("i32.shr_u", I32_SHR_U)
   ; ("i32.store16", I32_STORE16)
   ; ("i32.store8", I32_STORE8)
   ; ("i32.store", I32_STORE)
   ; ("i32.sub", I32_SUB)
   ; ("i32.trunc_f32_s", I32_TRUNC_F32_S)
   ; ("i32.trunc_f32_u", I32_TRUNC_F32_U)
   ; ("i32.trunc_f64_s", I32_TRUNC_F64_S)
   ; ("i32.trunc_f64_u", I32_TRUNC_F64_U)
   ; ("i32.trunc_sat_f32_s", I32_TRUNC_SAT_F32_S)
   ; ("i32.trunc_sat_f32_u", I32_TRUNC_SAT_F32_U)
   ; ("i32.trunc_sat_f64_s", I32_TRUNC_SAT_F64_S)
   ; ("i32.trunc_sat_f64_u", I32_TRUNC_SAT_F64_U)
   ; ("i32.wrap_i64", I32_WRAP_I64)
   ; ("i32x4.add", I32X4_ADD)
   ; ("i32x4.dot_i16x8_s", I32X4_DOT_I16X8_S)
   ; ("i32x4.eq", I32X4_EQ)
   ; ("i32x4.extadd_pairwise_i16x8_s", I32X4_EXTADD_PAIRWISE_I16X8_S)
   ; ("i32x4.extmul_low_i16x8_s", I32X4_EXTMUL_LOW_I16X8_S)
   ; ("i32x4", I32X4)
   ; ("i32x4.min_s", I32X4_MIN_S)
   ; ("i32x4.mul", I32X4_MUL)
   ; ("i32x4.sub", I32X4_SUB)
   ; ("i32x4.trunc_sat_f32x4_s", I32X4_TRUNC_SAT_F32X4_S)
   ; ("i32x4.trunc_sat_f64x2_s_zero", I32X4_TRUNC_SAT_F64X2_S_ZERO)
   ; ("i32.xor", I32_XOR)
   ; ("i64.add", I64_ADD)
   ; ("i64.and", I64_AND)
   ; ("i64.clz", I64_CLZ)
   ; ("i64.const", I64_CONST)
   ; ("i64.ctz", I64_CTZ)
   ; ("i64.div_s", I64_DIV_S)
   ; ("i64.div_u", I64_DIV_U)
   ; ("i64.eq", I64_EQ)
   ; ("i64.eqz", I64_EQZ)
   ; ("i64.extend16_s", I64_EXTEND16_S)
   ; ("i64.extend32_s", I64_EXTEND32_S)
   ; ("i64.extend8_s", I64_EXTEND8_S)
   ; ("i64.extend_i32_s", I64_EXTEND_I32_S)
   ; ("i64.extend_i32_u", I64_EXTEND_I32_U)
   ; ("i64.ge_s", I64_GE_S)
   ; ("i64.ge_u", I64_GE_U)
   ; ("i64.gt_s", I64_GT_S)
   ; ("i64.gt_u", I64_GT_U)
   ; ("i64", I64)
   ; ("i64.le_s", I64_LE_S)
   ; ("i64.le_u", I64_LE_U)
   ; ("i64.load16_s", I64_LOAD16_S)
   ; ("i64.load16_u", I64_LOAD16_U)
   ; ("i64.load32_s", I64_LOAD32_S)
   ; ("i64.load32_u", I64_LOAD32_U)
   ; ("i64.load8_s", I64_LOAD8_S)
   ; ("i64.load8_u", I64_LOAD8_U)
   ; ("i64.load", I64_LOAD)
   ; ("i64.lt_s", I64_LT_S)
   ; ("i64.lt_u", I64_LT_U)
   ; ("i64.mul", I64_MUL)
   ; ("i64.ne", I64_NE)
   ; ("i64.or", I64_OR)
   ; ("i64.popcnt", I64_POPCNT)
   ; ("i64.reinterpret_f32", I64_REINTERPRET_F32)
   ; ("i64.reinterpret_f64", I64_REINTERPRET_F64)
   ; ("i64.rem_s", I64_REM_S)
   ; ("i64.rem_u", I64_REM_U)
   ; ("i64.rotl", I64_ROTL)
   ; ("i64.rotr", I64_ROTR)
   ; ("i64.shl", I64_SHL)
   ; ("i64.shr_s", I64_SHR_S)
   ; ("i64.shr_u", I64_SHR_U)
   ; ("i64.store16", I64_STORE16)
   ; ("i64.store32", I64_STORE32)
   ; ("i64.store8", I64_STORE8)
   ; ("i64.store", I64_STORE)
   ; ("i64.sub", I64_SUB)
   ; ("i64.trunc_f32_s", I64_TRUNC_F32_S)
   ; ("i64.trunc_f32_u", I64_TRUNC_F32_U)
   ; ("i64.trunc_f64_s", I64_TRUNC_F64_S)
   ; ("i64.trunc_f64_u", I64_TRUNC_F64_U)
   ; ("i64.trunc_sat_f32_s", I64_TRUNC_SAT_F32_S)
   ; ("i64.trunc_sat_f32_u", I64_TRUNC_SAT_F32_U)
   ; ("i64.trunc_sat_f64_s", I64_TRUNC_SAT_F64_S)
   ; ("i64.trunc_sat_f64_u", I64_TRUNC_SAT_F64_U)
   ; ("i64x2.abs", I64X2_ABS)
   ; ("i64x2.add", I64X2_ADD)
   ; ("i64x2.eq", I64X2_EQ)
   ; ("i64x2.extmul_low_i32x4_s", I64X2_EXTMUL_LOW_I32X4_S)
   ; ("i64x2", I64X2)
   ; ("i64x2.mul", I64X2_MUL)
   ; ("i64x2.sub", I64X2_SUB)
   ; ("i64.xor", I64_XOR)
   ; ("i8", I8)
   ; ("i8x16.add", I8X16_ADD)
   ; ("i8x16.add_sat_s", I8X16_ADD_SAT_S)
   ; ("i8x16_add_sat_s", I8X16_ADD_SAT_S)
   ; ("i8x16.eq", I8X16_EQ)
   ; ("i8x16.extract_lane_s", I8X16_EXTRACT_LANE_S)
   ; ("i8x16", I8X16)
   ; ("i8x16.min_s", I8X16_MIN_S)
   ; ("i8x16.shl", I8X16_SHL)
   ; ("i8x16.splat", I8X16_SPLAT)
   ; ("if", IF)
   ; ("import", IMPORT)
   ; ("instance", INSTANCE)
   ; ("invoke", INVOKE)
   ; ("item", ITEM)
   ; ("local.get", LOCAL_GET)
   ; ("local", LOCAL)
   ; ("local.set", LOCAL_SET)
   ; ("local.tee", LOCAL_TEE)
   ; ("loop", LOOP)
   ; ("memory.copy", MEMORY_COPY)
   ; ("memory.fill", MEMORY_FILL)
   ; ("memory.grow", MEMORY_GROW)
   ; ("memory.init", MEMORY_INIT)
   ; ("memory", MEMORY)
   ; ("memory.size", MEMORY_SIZE)
   ; ("module", MODULE)
   ; ("mut", MUTABLE)
   ; ("nan:arithmetic", NAN_ARITH)
   ; ("nan:canonical", NAN_CANON)
   ; ("noexn", NO_EXN)
   ; ("noextern", NOEXTERN)
   ; ("nofunc", NOFUNC)
   ; ("none", NONE)
   ; ("nop", NOP)
   ; ("nullexnref", NULL_EXN_REF)
   ; ("nullexternref", NULL_EXTERN_REF)
   ; ("nullfuncref", NULL_FUNC_REF)
   ; ("null", NULL)
   ; ("nullref", NULL_REF)
   ; ("offset", OFFSET)
   ; ("param", PARAM)
   ; ("quote", QUOTE)
   ; ("rec", REC)
   ; ("ref.array", REF_ARRAY)
   ; ("ref.as_non_null", REF_AS_NON_NULL)
   ; ("ref.cast", REF_CAST)
   ; ("ref.eq", REF_EQ)
   ; ("ref.extern", REF_EXTERN)
   ; ("ref.func", REF_FUNC)
   ; ("ref.host", REF_HOST)
   ; ("ref.i31", REF_I31)
   ; ("ref.is_null", REF_IS_NULL)
   ; ("ref.null", REF_NULL)
   ; ("ref", REF)
   ; ("ref.struct", REF_STRUCT)
   ; ("ref.test", REF_TEST)
   ; ("register", REGISTER)
   ; ("result", RESULT)
   ; ("return_call_indirect", RETURN_CALL_INDIRECT)
   ; ("return_call_ref", RETURN_CALL_REF)
   ; ("return_call", RETURN_CALL)
   ; ("return", RETURN)
   ; ("select", SELECT)
   ; ("start", START)
   ; ("struct.get_s", STRUCT_GET_S)
   ; ("struct.get", STRUCT_GET)
   ; ("struct.get_u", STRUCT_GET_U)
   ; ("struct.new_default", STRUCT_NEW_CANON_DEFAULT)
   ; ("struct.new", STRUCT_NEW_CANON)
   ; ("structref", STRUCT_REF)
   ; ("struct.set", STRUCT_SET)
   ; ("struct", STRUCT)
   ; ("sub", SUB)
   ; ("table.copy", TABLE_COPY)
   ; ("table.fill", TABLE_FILL)
   ; ("table.get", TABLE_GET)
   ; ("table.grow", TABLE_GROW)
   ; ("table.init", TABLE_INIT)
   ; ("table.set", TABLE_SET)
   ; ("table.size", TABLE_SIZE)
   ; ("table", TABLE)
   ; ("tag", TAG)
   ; ("then", THEN)
   ; ("type", TYPE)
   ; ("unreachable", UNREACHABLE)
   ; ("v128.any_true", V128_ANY_TRUE)
   ; ("v128.const", V128_CONST)
   ; ("v128.load16_lane", V128_LOAD16_LANE)
   ; ("v128.load32_lane", V128_LOAD32_LANE)
   ; ("v128.load32_zero", V128_LOAD32_ZERO)
   ; ("v128.load64_lane", V128_LOAD64_LANE)
   ; ("v128.load8_lane", V128_LOAD8_LANE)
   ; ("v128.load8_splat", V128_LOAD8_SPLAT)
   ; ("v128.load8x8_s", V128_LOAD8X8_S)
   ; ("v128.load", V128_LOAD)
   ; ("v128.not", V128_NOT)
   ; ("v128.store16_lane", V128_STORE16_LANE)
   ; ("v128.store32_lane", V128_STORE32_LANE)
   ; ("v128.store32_zero", V128_STORE32_ZERO)
   ; ("v128.store64_lane", V128_STORE64_LANE)
   ; ("v128.store8_lane", V128_STORE8_LANE)
   ; ("v128.store", V128_STORE)
   ; ("v128", V128)
   ; ("v128.load8x8_u", V128_LOAD8X8_U)
   ; ("i8x16.shr_s", I8X16_SHR_S)
   ; ("v128.and", V128_AND)
   ; ("i8x16.all_true", I8X16_ALL_TRUE)
   ; ("f32x4.convert_i32x4_u", F32X2_CONVERT_I32X4_U)
   ; ("f32x4.sub", F32X4_SUB)
   ; ("f32x4.ne", F32X4_NE)
   ; ("f32x4.pmax", F32X4_PMAX)
   ; ("f32x4.floor", F32X4_FLOOR)
   ; ("f32x4.max", F32X4_MAX)
   ; ("f64x2.sub", F64X2_SUB)
   ; ("f64x2.ne", F64X2_NE)
   ; ("f64x2.pmax", F64X2_PMAX)
   ; ("f64x2.floor", F64X2_FLOOR)
   ; ("f64x2.max", F64X2_MAX)
   ; ("i16x8.min_u", I16X8_MIN_U)
   ; ("i16x8.sub", I16X8_SUB)
   ; ("i16x8.ne", I16X8_NE)
   ; ("i16x8.extadd_pairwise_i8x16_u", I16X8_EXTADD_PAIRWISE_I8X16_U)
   ; ("i16x8.extmul_high_i8x16_s", I16X8_EXTMUL_HIGH_I8X16_S)
   ; ("i16x8.add_sat_u", I16X8_ADD_SAT_U)
   ; ("i32x4.min_u", I32X4_MIN_U)
   ; ("i32x4.neg", I32X4_NEG)
   ; ("i32x4.ne", I32X4_NE)
   ; ("i32x4.extadd_pairwise_i16x8_u", I32X4_EXTADD_PAIRWISE_I16X8_U)
   ; ("i32x4.extmul_high_i16x8_s", I32X4_EXTMUL_HIGH_I16X8_S)
   ; ("i32x4.trunc_sat_f32x4_u", I32X4_TRUNC_SAT_F32X4_U)
   ; ("i32x4.trunc_sat_f64x2_u_zero", I32X4_TRUNC_SAT_F64X2_U_ZERO)
   ; ("i64x2.neg", I64X2_NEG)
   ; ("i64x2.ne", I64X2_NE)
   ; ("i64x2.extmul_high_i32x4_s", I64X2_EXTMUL_HIGH_I32X4_S)
   ; ("i8x16.min_u", I8X16_MIN_U)
   ; ("i8x16.sub", I8X16_SUB)
   ; ("i8x16.ne", I8X16_NE)
   ; ("i8x16.add_sat_u", I8X16_ADD_SAT_U)
   ; ("i16x8.extend_high_i8x16_u", I16X8_EXTEND_HIGH_I8X16_U)
   ; ("i8x16.extract_lane_u", I8X16_EXTRACT_LANE_U)
   ; ("v128.load16_splat", V128_LOAD16_SPLAT)
   ; ("i8x16.all_true", I8X16_ALL_TRUE)
   ; ("v128.load64_zero", V128_LOAD64_ZERO)
   ; ("i16x8.splat", I16X8_SPLAT)
   ; ("v128.load16x4_s", V128_LOAD16X4_S)
   ; ("i8x16.shr_u", I8X16_SHR_U)
   ; ("v128.or", V128_OR)
   ; ("i8x16.bitmask", I8X16_BITMASK)
   ; ("f64x2.convert_low_i32x4_s", F64X2_CONVERT_LOW_I32X4_S)
   ; ("f32x4.mul", F32X4_MUL)
   ; ("f32x4.lt", F32X4_LT)
   ; ("f32x4.trunc", F32X4_TRUNC)
   ; ("f32x4.abs", F32X4_ABS)
   ; ("f64x2.mul", F64X2_MUL)
   ; ("f64x2.lt", F64X2_LT)
   ; ("f64x2.trunc", F64X2_TRUNC)
   ; ("f64x2.abs", F64X2_ABS)
   ; ("i16x8.max_s", I16X8_MAX_S)
   ; ("i16x8.mul", I16X8_MUL)
   ; ("i16x8.lt_s", I16X8_LT_S)
   ; ("i16x8.extmul_low_i8x16_u", I16X8_EXTMUL_LOW_I8X16_U)
   ; ("i16x8.sub_sat_s", I16X8_SUB_SAT_S)
   ; ("i32x4.max_s", I32X4_MAX_S)
   ; ("i32x4.lt_s", I32X4_LT_S)
   ; ("i32x4.extmul_low_i16x8_u", I32X4_EXTMUL_LOW_I16X8_U)
   ; ("i64x2.lt_s", I64X2_LT_S)
   ; ("i64x2.extmul_low_i32x4_u", I64X2_EXTMUL_LOW_I32X4_U)
   ; ("i8x16.max_s", I8X16_MAX_S)
   ; ("i8x16.neg", I8X16_NEG)
   ; ("i8x16.lt_s", I8X16_LT_S)
   ; ("i8x16.sub_sat_s", I8X16_SUB_SAT_S)
   ; ("i16x8.extend_low_i8x16_s", I16X8_EXTEND_LOW_I8X16_S)
   ; ("i16x8.extract_lane_s", I16X8_EXTRACT_LANE_S)
   ; ("v128.load16x4_s", V128_LOAD16X4_S)
   ; ("v128.load32_splat", V128_LOAD32_SPLAT)
   ; ("v128.bitselect", V128_BITSELECT)
   ; ("i32x4.extract_lane", I32X4_EXTRACT_LANE)
   ; ("i32x4.splat", I32X4_SPLAT)
   ; ("f32x4.div", F32X4_DIV)
   ; ("f32x4.le", F32X4_LE)
   ; ("f32x4.nearest", F32X4_NEAREST)
   ; ("f32x4.splat", F32X4_SPLAT)
   ; ("f64x2.convert_low_i32x4_u", F64X2_CONVERT_LOW_I32X4_U)
   ; ("f64x2.div", F64X2_DIV)
   ; ("f64x2.le", F64X2_LE)
   ; ("f64x2.nearest", F64X2_NEAREST)
   ; ("i16x8.all_true", I16X8_ALL_TRUE)
   ; ("i16x8.extend_low_i8x16_u", I16X8_EXTEND_LOW_I8X16_U)
   ; ("i16x8.extmul_high_i8x16_u", I16X8_EXTMUL_HIGH_I8X16_U)
   ; ("i16x8.extract_lane_u", I16X8_EXTRACT_LANE_U)
   ; ("i16x8.lt_u", I16X8_LT_U)
   ; ("i16x8.max_u", I16X8_MAX_U)
   ; ("i16x8.neg", I16X8_NEG)
   ; ("i16x8.shl", I16X8_SHL)
   ; ("i16x8.sub_sat_u", I16X8_SUB_SAT_U)
   ; ("i32x4.extmul_high_i16x8_u", I32X4_EXTMUL_HIGH_I16X8_U)
   ; ("i32x4.lt_u", I32X4_LT_U)
   ; ("i32x4.max_u", I32X4_MAX_U)
   ; ("i64x2.extmul_high_i32x4_u", I64X2_EXTMUL_HIGH_I32X4_U)
   ; ("i64x2.extract_lane", I64X2_EXTRACT_LANE)
   ; ("i64x2.le_s", I64X2_LE_S)
   ; ("i8x16.lt_u", I8X16_LT_U)
   ; ("i8x16.max_u", I8X16_MAX_U)
   ; ("i8x16.sub_sat_u", I8X16_SUB_SAT_U)
   ; ("i8x16.swizzle", I8X16_SWIZZLE)
   ; ("v128.load16x4_u", V128_LOAD16X4_U)
   ; ("v128.load64_splat", V128_LOAD64_SPLAT)
   ; ("v128.xor", V128_XOR)
   ; ("f32x4.extract_lane", F32X4_EXTRACT_LANE)
   ; ("f32x4.gt", F32X4_GT)
   ; ("f32x4.neg", F32X4_NEG)
   ; ("f64x2.gt", F64X2_GT)
   ; ("f64x2.neg", F64X2_NEG)
   ; ("i16x8.avgr_u", I16X8_AVGR_U)
   ; ("i16x8.bitmask", I16X8_BITMASK)
   ; ("i16x8.le_s", I16X8_LE_S)
   ; ("i16x8.shr_s", I16X8_SHR_S)
   ; ("i32x4.abs", I32X4_ABS)
   ; ("i32x4.extend_high_i16x8_s", I32X4_EXTEND_HIGH_I16X8_S)
   ; ("i32x4.le_s", I32X4_LE_S)
   ; ("i64x2.gt_s", I64X2_GT_S)
   ; ("i64x2.splat", I64X2_SPLAT)
   ; ("i8x16.avgr_u", I8X16_AVGR_U)
   ; ("i8x16.le_s", I8X16_LE_S)
   ; ("i8x16.narrow_i16x8_s", I8X16_NARROW_I16X8_S)
   ; ("v128.andnot", V128_ANDNOT)
   ; ("v128.load32x2_s", V128_LOAD32X2_S)
   ; ("f32x4.ge", F32X4_GE)
   ; ("f32x4.sqrt", F32X4_SQRT)
   ; ("f64x2.ge", F64X2_GE)
   ; ("f64x2.splat", F64X2_SPLAT)
   ; ("f64x2.sqrt", F64X2_SQRT)
   ; ("i16x8.abs", I16X8_ABS)
   ; ("i16x8.le_u", I16X8_LE_U)
   ; ("i16x8.shr_u", I16X8_SHR_U)
   ; ("i32x4.all_true", I32X4_ALL_TRUE)
   ; ("i32x4.extend_high_i16x8_u", I32X4_EXTEND_HIGH_I16X8_U)
   ; ("i32x4.le_u", I32X4_LE_U)
   ; ("i64x2.ge_s", I64X2_GE_S)
   ; ("i8x16.abs", I8X16_ABS)
   ; ("i8x16.le_u", I8X16_LE_U)
   ; ("i8x16.narrow_i16x8_u", I8X16_NARROW_I16X8_U)
   ; ("i8x16.replace_lane", I8X16_REPLACE_LANE)
   ; ("v128.load32x2_u", V128_LOAD32X2_U)
   ; ("i32x4.shl", I32X4_SHL)
   ; ("i32x4.bitmask", I32X4_BITMASK)
   ; ("i16x8.narrow_i32x4_s", I16X8_NARROW_I32X4_S)
   ; ("i16x8.gt_s", I16X8_GT_S)
   ; ("i32x4.gt_s", I32X4_GT_S)
   ; ("i8x16.popcnt", I8X16_POPCNT)
   ; ("i8x16.gt_s", I8X16_GT_S)
   ; ("i32x4.extend_low_i16x8_s", I32X4_EXTEND_LOW_I16X8_S)
   ; ("i16x8.replace_lane", I16X8_REPLACE_LANE)
   ; ("f64x2.extract_lane", F64X2_EXTRACT_LANE)
   ; ("i16x8.gt_u", I16X8_GT_U)
   ; ("i16x8.narrow_i32x4_u", I16X8_NARROW_I32X4_U)
   ; ("i32x4.extend_low_i16x8_u", I32X4_EXTEND_LOW_I16X8_U)
   ; ("i32x4.gt_u", I32X4_GT_U)
   ; ("i32x4.replace_lane", I32X4_REPLACE_LANE)
   ; ("i32x4.shr_s", I32X4_SHR_S)
   ; ("i64x2.all_true", I64X2_ALL_TRUE)
   ; ("i8x16.gt_u", I8X16_GT_U)
   ; ("f32x4.replace_lane", F32X4_REPLACE_LANE)
   ; ("f64x2.promote_low_f32x4", F64X2_PROMOTE_LOW_F32X4)
   ; ("i16x8.ge_s", I16X8_GE_S)
   ; ("i32x4.ge_s", I32X4_GE_S)
   ; ("i32x4.shr_u", I32X4_SHR_U)
   ; ("i64x2.bitmask", I64X2_BITMASK)
   ; ("i64x2.extend_high_i32x4_s", I64X2_EXTEND_HIGH_I32X4_S)
   ; ("i8x16.ge_s", I8X16_GE_S)
   ; ("f32x4.demote_f64x2_zero", F32X4_DEMOTE_F64X2_ZERO)
   ; ("i16x8.ge_u", I16X8_GE_U)
   ; ("i32x4.ge_u", I32X4_GE_U)
   ; ("i64x2.extend_high_i32x4_u", I64X2_EXTEND_HIGH_I32X4_U)
   ; ("i64x2.replace_lane", I64X2_REPLACE_LANE)
   ; ("i64x2.shl", I64X2_SHL)
   ; ("i8x16.ge_u", I8X16_GE_U)
   ; ("f64x2.replace_lane", F64X2_REPLACE_LANE)
   ; ("i64x2.extend_low_i32x4_s", I64X2_EXTEND_LOW_I32X4_S)
   ; ("i64x2.shr_s", I64X2_SHR_S)
   ; ("i64x2.shr_u", I64X2_SHR_U)
   ; ("i64x2.extend_low_i32x4_u", I64X2_EXTEND_LOW_I32X4_U)
   ; ("i8x16.shuffle", I8X16_SHUFFLE)
   ; (")", RPAR)
   ; ("(", LPAR)
  |]

let string_to_token = Hashtbl.create 512

let token_to_string = Hashtbl.create 512

let () =
  Array.iter
    (fun (k, v) ->
      Hashtbl.add string_to_token k v;
      Hashtbl.add token_to_string v k )
    keywords

let token_to_string t =
  match Hashtbl.find_opt token_to_string t with
  | Some s -> s
  | None -> (
    match t with
    | NUM s -> Fmt.str "%s" s
    | ID s -> Fmt.str "$%s" s
    | NAME s -> Fmt.str "%S" s
    (* CAUTION: when you add something here, you should also add it to the list of keywords. This exhaustive matching is here just so you don't forget to do it. If it's a special token which carry a value, you should instead add it next to NUM, ID and NAME and print something. *)
    | V128_XOR | V128_STORE8_LANE | V128_STORE64_LANE | V128_STORE32_ZERO
    | V128_STORE32_LANE | V128_STORE16_LANE | V128_STORE | V128_OR | V128_NOT
    | V128_LOAD8_SPLAT | V128_LOAD8_LANE | V128_LOAD8X8_U | V128_LOAD8X8_S
    | V128_LOAD64_ZERO | V128_LOAD64_SPLAT | V128_LOAD64_LANE | V128_LOAD32_ZERO
    | V128_LOAD32_SPLAT | V128_LOAD32_LANE | V128_LOAD32X2_U | V128_LOAD32X2_S
    | V128_LOAD16_SPLAT | V128_LOAD16_LANE | V128_LOAD16X4_U | V128_LOAD16X4_S
    | V128_LOAD | V128_CONST | V128_BITSELECT | V128_ANY_TRUE | V128_ANDNOT
    | V128_AND | V128 | UNREACHABLE | TYPE | THEN | TAG | TABLE_SIZE | TABLE_SET
    | TABLE_INIT | TABLE_GROW | TABLE_GET | TABLE_FILL | TABLE_COPY | TABLE
    | SUB | STRUCT_SET | STRUCT_REF | STRUCT_NEW_CANON_DEFAULT
    | STRUCT_NEW_CANON | STRUCT_GET_U | STRUCT_GET_S | STRUCT_GET | STRUCT
    | START | SELECT | RPAR | RETURN_CALL_REF | RETURN_CALL_INDIRECT
    | RETURN_CALL | RETURN | RESULT | REGISTER | REF_TEST | REF_STRUCT
    | REF_NULL | REF_IS_NULL | REF_I31 | REF_HOST | REF_FUNC | REF_EXTERN
    | REF_EXN | REF_EQ | REF_CAST | REF_AS_NON_NULL | REF_ARRAY | REF | REC
    | QUOTE | PARAM | OFFSET | NULL_REF | NULL_FUNC_REF | NULL_EXTERN_REF
    | NULL_EXN_REF | NULL | NO_EXN | NOP | NONE | NOFUNC | NOEXTERN | NAN_CANON
    | NAN_ARITH | MUTABLE | MODULE | MEMORY_SIZE | MEMORY_INIT | MEMORY_GROW
    | MEMORY_FILL | MEMORY_COPY | MEMORY | LPAR | LOOP | LOCAL_TEE | LOCAL_SET
    | LOCAL_GET | LOCAL | ITEM | INVOKE | INSTANCE | IMPORT | IF | I8X16_SWIZZLE
    | I8X16_SUB_SAT_U | I8X16_SUB_SAT_S | I8X16_SUB | I8X16_SPLAT
    | I8X16_SHUFFLE | I8X16_SHR_U | I8X16_SHR_S | I8X16_SHL | I8X16_REPLACE_LANE
    | I8X16_POPCNT | I8X16_NEG | I8X16_NE | I8X16_NARROW_I16X8_U
    | I8X16_NARROW_I16X8_S | I8X16_MIN_U | I8X16_MIN_S | I8X16_MAX_U
    | I8X16_MAX_S | I8X16_LT_U | I8X16_LT_S | I8X16_LE_U | I8X16_LE_S
    | I8X16_GT_U | I8X16_GT_S | I8X16_GE_U | I8X16_GE_S | I8X16_EXTRACT_LANE_U
    | I8X16_EXTRACT_LANE_S | I8X16_EQ | I8X16_BITMASK | I8X16_AVGR_U
    | I8X16_ALL_TRUE | I8X16_ADD_SAT_U | I8X16_ADD_SAT_S | I8X16_ADD | I8X16_ABS
    | I8X16 | I8 | I64_XOR | I64_TRUNC_SAT_F64_U | I64_TRUNC_SAT_F64_S
    | I64_TRUNC_SAT_F32_U | I64_TRUNC_SAT_F32_S | I64_TRUNC_F64_U
    | I64_TRUNC_F64_S | I64_TRUNC_F32_U | I64_TRUNC_F32_S | I64_SUB | I64_STORE8
    | I64_STORE32 | I64_STORE16 | I64_STORE | I64_SHR_U | I64_SHR_S | I64_SHL
    | I64_ROTR | I64_ROTL | I64_REM_U | I64_REM_S | I64_REINTERPRET_F64
    | I64_REINTERPRET_F32 | I64_POPCNT | I64_OR | I64_NE | I64_MUL | I64_LT_U
    | I64_LT_S | I64_LOAD8_U | I64_LOAD8_S | I64_LOAD32_U | I64_LOAD32_S
    | I64_LOAD16_U | I64_LOAD16_S | I64_LOAD | I64_LE_U | I64_LE_S | I64_GT_U
    | I64_GT_S | I64_GE_U | I64_GE_S | I64_EXTEND_I32_U | I64_EXTEND_I32_S
    | I64_EXTEND8_S | I64_EXTEND32_S | I64_EXTEND16_S | I64_EQZ | I64_EQ
    | I64_DIV_U | I64_DIV_S | I64_CTZ | I64_CONST | I64_CLZ | I64_AND | I64_ADD
    | I64X2_SUB | I64X2_SPLAT | I64X2_SHR_U | I64X2_SHR_S | I64X2_SHL
    | I64X2_REPLACE_LANE | I64X2_NEG | I64X2_NE | I64X2_MUL | I64X2_LT_S
    | I64X2_LE_S | I64X2_GT_S | I64X2_GE_S | I64X2_EXTRACT_LANE
    | I64X2_EXTMUL_LOW_I32X4_U | I64X2_EXTMUL_LOW_I32X4_S
    | I64X2_EXTMUL_HIGH_I32X4_U | I64X2_EXTMUL_HIGH_I32X4_S
    | I64X2_EXTEND_LOW_I32X4_U | I64X2_EXTEND_LOW_I32X4_S
    | I64X2_EXTEND_HIGH_I32X4_U | I64X2_EXTEND_HIGH_I32X4_S | I64X2_EQ
    | I64X2_BITMASK | I64X2_ALL_TRUE | I64X2_ADD | I64X2_ABS | I64X2 | I64
    | I32_XOR | I32_WRAP_I64 | I32_TRUNC_SAT_F64_U | I32_TRUNC_SAT_F64_S
    | I32_TRUNC_SAT_F32_U | I32_TRUNC_SAT_F32_S | I32_TRUNC_F64_U
    | I32_TRUNC_F64_S | I32_TRUNC_F32_U | I32_TRUNC_F32_S | I32_SUB | I32_STORE8
    | I32_STORE16 | I32_STORE | I32_SHR_U | I32_SHR_S | I32_SHL | I32_ROTR
    | I32_ROTL | I32_REM_U | I32_REM_S | I32_REINTERPRET_F64
    | I32_REINTERPRET_F32 | I32_POPCNT | I32_OR | I32_NE | I32_MUL | I32_LT_U
    | I32_LT_S | I32_LOAD8_U | I32_LOAD8_S | I32_LOAD16_U | I32_LOAD16_S
    | I32_LOAD | I32_LE_U | I32_LE_S | I32_GT_U | I32_GT_S | I32_GE_U | I32_GE_S
    | I32_EXTEND8_S | I32_EXTEND16_S | I32_EQZ | I32_EQ | I32_DIV_U | I32_DIV_S
    | I32_CTZ | I32_CONST | I32_CLZ | I32_AND | I32_ADD
    | I32X4_TRUNC_SAT_F64X2_U_ZERO | I32X4_TRUNC_SAT_F64X2_S_ZERO
    | I32X4_TRUNC_SAT_F32X4_U | I32X4_TRUNC_SAT_F32X4_S | I32X4_SUB
    | I32X4_SPLAT | I32X4_SHR_U | I32X4_SHR_S | I32X4_SHL | I32X4_REPLACE_LANE
    | I32X4_NEG | I32X4_NE | I32X4_MUL | I32X4_MIN_U | I32X4_MIN_S | I32X4_MAX_U
    | I32X4_MAX_S | I32X4_LT_U | I32X4_LT_S | I32X4_LE_U | I32X4_LE_S
    | I32X4_GT_U | I32X4_GT_S | I32X4_GE_U | I32X4_GE_S | I32X4_EXTRACT_LANE
    | I32X4_EXTMUL_LOW_I16X8_U | I32X4_EXTMUL_LOW_I16X8_S
    | I32X4_EXTMUL_HIGH_I16X8_U | I32X4_EXTMUL_HIGH_I16X8_S
    | I32X4_EXTEND_LOW_I16X8_U | I32X4_EXTEND_LOW_I16X8_S
    | I32X4_EXTEND_HIGH_I16X8_U | I32X4_EXTEND_HIGH_I16X8_S
    | I32X4_EXTADD_PAIRWISE_I16X8_U | I32X4_EXTADD_PAIRWISE_I16X8_S | I32X4_EQ
    | I32X4_DOT_I16X8_S | I32X4_BITMASK | I32X4_ALL_TRUE | I32X4_ADD | I32X4_ABS
    | I32X4 | I32 | I31_REF | I31_GET_U | I31_GET_S | I31 | I16X8_SUB_SAT_U
    | I16X8_SUB_SAT_S | I16X8_SUB | I16X8_SPLAT | I16X8_SHR_U | I16X8_SHR_S
    | I16X8_SHL | I16X8_REPLACE_LANE | I16X8_Q15MULR_SAT_S | I16X8_NEG
    | I16X8_NE | I16X8_NARROW_I32X4_U | I16X8_NARROW_I32X4_S | I16X8_MUL
    | I16X8_MIN_U | I16X8_MIN_S | I16X8_MAX_U | I16X8_MAX_S | I16X8_LT_U
    | I16X8_LT_S | I16X8_LE_U | I16X8_LE_S | I16X8_GT_U | I16X8_GT_S
    | I16X8_GE_U | I16X8_GE_S | I16X8_EXTRACT_LANE_U | I16X8_EXTRACT_LANE_S
    | I16X8_EXTMUL_LOW_I8X16_U | I16X8_EXTMUL_LOW_I8X16_S
    | I16X8_EXTMUL_HIGH_I8X16_U | I16X8_EXTMUL_HIGH_I8X16_S
    | I16X8_EXTEND_LOW_I8X16_U | I16X8_EXTEND_LOW_I8X16_S
    | I16X8_EXTEND_HIGH_I8X16_U | I16X8_EXTEND_HIGH_I8X16_S
    | I16X8_EXTADD_PAIRWISE_I8X16_U | I16X8_EXTADD_PAIRWISE_I8X16_S | I16X8_EQ
    | I16X8_BITMASK | I16X8_AVGR_U | I16X8_ALL_TRUE | I16X8_ADD_SAT_U
    | I16X8_ADD_SAT_S | I16X8_ADD | I16X8_ABS | I16X8 | I16 | GLOBAL_SET
    | GLOBAL_GET | GLOBAL | GET | FUNC_REF | FUNC | FINAL | FIELD | F64_TRUNC
    | F64_SUB | F64_STORE | F64_SQRT | F64_REINTERPRET_I64 | F64_REINTERPRET_I32
    | F64_PROMOTE_F32 | F64_NEG | F64_NEAREST | F64_NE | F64_MUL | F64_MIN
    | F64_MAX | F64_LT | F64_LOAD | F64_LE | F64_GT | F64_GE | F64_FLOOR
    | F64_EQ | F64_DIV | F64_COPYSIGN | F64_CONVERT_I64_U | F64_CONVERT_I64_S
    | F64_CONVERT_I32_U | F64_CONVERT_I32_S | F64_CONST | F64_CEIL | F64_ADD
    | F64_ABS | F64X2_TRUNC | F64X2_SUB | F64X2_SQRT | F64X2_SPLAT
    | F64X2_REPLACE_LANE | F64X2_PROMOTE_LOW_F32X4 | F64X2_PMIN | F64X2_PMAX
    | F64X2_NEG | F64X2_NEAREST | F64X2_NE | F64X2_MUL | F64X2_MIN | F64X2_MAX
    | F64X2_LT | F64X2_LE | F64X2_GT | F64X2_GE | F64X2_FLOOR
    | F64X2_EXTRACT_LANE | F64X2_EQ | F64X2_DIV | F64X2_CONVERT_LOW_I32X4_U
    | F64X2_CONVERT_LOW_I32X4_S | F64X2_CEIL | F64X2_ADD | F64X2_ABS | F64X2
    | F64 | F32_TRUNC | F32_SUB | F32_STORE | F32_SQRT | F32_REINTERPRET_I64
    | F32_REINTERPRET_I32 | F32_NEG | F32_NEAREST | F32_NE | F32_MUL | F32_MIN
    | F32_MAX | F32_LT | F32_LOAD | F32_LE | F32_GT | F32_GE | F32_FLOOR
    | F32_EQ | F32_DIV | F32_DEMOTE_F64 | F32_COPYSIGN | F32_CONVERT_I64_U
    | F32_CONVERT_I64_S | F32_CONVERT_I32_U | F32_CONVERT_I32_S | F32_CONST
    | F32_CEIL | F32_ADD | F32_ABS | F32X4_TRUNC | F32X4_SUB | F32X4_SQRT
    | F32X4_SPLAT | F32X4_REPLACE_LANE | F32X4_PMIN | F32X4_PMAX | F32X4_NEG
    | F32X4_NEAREST | F32X4_NE | F32X4_MUL | F32X4_MIN | F32X4_MAX | F32X4_LT
    | F32X4_LE | F32X4_GT | F32X4_GE | F32X4_FLOOR | F32X4_EXTRACT_LANE
    | F32X4_EQ | F32X4_DIV | F32X4_DEMOTE_F64X2_ZERO | F32X4_CONVERT_I32X4_S
    | F32X4_CEIL | F32X4_ADD | F32X4_ABS | F32X4 | F32X2_CONVERT_I32X4_U | F32
    | EXTERN_REF | EXTERN_CONVERT_ANY | EXTERN | EXPORT | EXN_REF | EXN | EQ_REF
    | EQUAL | EQ | EOF | END | ELSE | ELEM_DROP | ELEM | DROP | DEFINITION
    | DECLARE | DATA_DROP | DATA | CALL_REF | CALL_INDIRECT | CALL | BR_TABLE
    | BR_ON_NULL | BR_ON_NON_NULL | BR_ON_CAST_FAIL | BR_ON_CAST | BR_IF | BR
    | BLOCK | BINARY | ASSERT_UNLINKABLE | ASSERT_TRAP | ASSERT_RETURN
    | ASSERT_MALFORMED | ASSERT_INVALID | ASSERT_EXHAUSTION | ARRAY_SET
    | ARRAY_REF | ARRAY_NEW_CANON_FIXED | ARRAY_NEW_CANON_ELEM
    | ARRAY_NEW_CANON_DEFAULT | ARRAY_NEW_CANON_DATA | ARRAY_NEW_CANON
    | ARRAY_LEN | ARRAY_INIT_ELEM | ARRAY_INIT_DATA | ARRAY_GET_U | ARRAY_GET_S
    | ARRAY_GET | ARRAY_FILL | ARRAY_COPY | ARRAY | ANY_REF | ANY_CONVERT_EXTERN
    | ANY | ALIGN ->
      assert false )

let string_to_token s = Hashtbl.find_opt string_to_token s