vyre-libs 0.6.3

vyre Category A library ecosystem - pure-IR compositions over vyre-ops hardware primitives
Documentation
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
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
use super::super::gpu_source_bytes::{
    literal_scan_common_buffers, literal_scan_program, literal_scan_status_output,
    packed_source_byte_len_expr, safe_load_source_byte_expr,
};
use super::*;

/// Build the 17b.3a char-constant scanner `Program`.
#[must_use]
pub fn gpu_char_constant_scan(source_len: u32) -> Program {
    let _ = source_len;
    let source_byte_len = packed_source_byte_len_expr();
    let safe_load =
        |addr: Expr| -> Expr { safe_load_source_byte_expr(addr, source_byte_len.clone()) };

    let body: Vec<Node> = vec![Node::if_then(
        Expr::eq(Expr::InvocationId { axis: 0 }, Expr::u32(0)),
        vec![
            Node::let_bind("start", Expr::load("start_pos", Expr::u32(0))),
            Node::let_bind("idx", Expr::var("start")),
            // Detect prefix: u8 (2 bytes), L/u/U (1 byte).
            Node::let_bind("p0", safe_load(Expr::var("idx"))),
            Node::let_bind("p1", safe_load(Expr::add(Expr::var("idx"), Expr::u32(1)))),
            Node::let_bind(
                "is_u8_prefix",
                Expr::select(
                    Expr::and(
                        Expr::eq(Expr::var("p0"), Expr::u32(b'u' as u32)),
                        Expr::eq(Expr::var("p1"), Expr::u32(b'8' as u32)),
                    ),
                    Expr::u32(1),
                    Expr::u32(0),
                ),
            ),
            Node::let_bind(
                "is_single_prefix",
                Expr::select(
                    Expr::and(
                        Expr::eq(Expr::var("is_u8_prefix"), Expr::u32(0)),
                        Expr::or(
                            Expr::eq(Expr::var("p0"), Expr::u32(b'L' as u32)),
                            Expr::or(
                                Expr::eq(Expr::var("p0"), Expr::u32(b'u' as u32)),
                                Expr::eq(Expr::var("p0"), Expr::u32(b'U' as u32)),
                            ),
                        ),
                    ),
                    Expr::u32(1),
                    Expr::u32(0),
                ),
            ),
            // Tentatively advance past the prefix.
            Node::if_then(
                Expr::eq(Expr::var("is_u8_prefix"), Expr::u32(1)),
                vec![Node::assign(
                    "idx",
                    Expr::add(Expr::var("idx"), Expr::u32(2)),
                )],
            ),
            Node::if_then(
                Expr::eq(Expr::var("is_single_prefix"), Expr::u32(1)),
                vec![Node::assign(
                    "idx",
                    Expr::add(Expr::var("idx"), Expr::u32(1)),
                )],
            ),
            // Expect opening `'`.
            Node::let_bind("opener", safe_load(Expr::var("idx"))),
            Node::let_bind(
                "opened",
                Expr::select(
                    Expr::eq(Expr::var("opener"), Expr::u32(b'\'' as u32)),
                    Expr::u32(1),
                    Expr::u32(0),
                ),
            ),
            // If we didn't find an opener: this isn't a char
            // constant; return ok=0, consumed=0. Reset idx so the
            // post-loop math doesn't double-count the prefix skip.
            Node::let_bind("ok_so_far", Expr::var("opened")),
            Node::let_bind("value", Expr::u32(0)),
            Node::let_bind("saw_char", Expr::u32(0)),
            Node::if_then(
                Expr::eq(Expr::var("opened"), Expr::u32(1)),
                vec![
                    // Step past `'`.
                    Node::assign("idx", Expr::add(Expr::var("idx"), Expr::u32(1))),
                    Node::let_bind("done_content", Expr::u32(0)),
                    Node::loop_for(
                        "k",
                        Expr::u32(0),
                        Expr::u32(MAX_CONTENT_BYTES),
                        vec![Node::if_then(
                            Expr::eq(Expr::var("done_content"), Expr::u32(0)),
                            vec![
                                Node::let_bind("ch", safe_load(Expr::var("idx"))),
                                // Closing quote → break.
                                Node::if_then(
                                    Expr::eq(Expr::var("ch"), Expr::u32(b'\'' as u32)),
                                    vec![Node::assign("done_content", Expr::u32(1))],
                                ),
                                // Embedded newline → error.
                                Node::if_then(
                                    Expr::and(
                                        Expr::eq(Expr::var("done_content"), Expr::u32(0)),
                                        Expr::or(
                                            Expr::eq(Expr::var("ch"), Expr::u32(b'\n' as u32)),
                                            Expr::eq(Expr::var("ch"), Expr::u32(b'\r' as u32)),
                                        ),
                                    ),
                                    vec![
                                        Node::assign("ok_so_far", Expr::u32(0)),
                                        Node::assign("done_content", Expr::u32(1)),
                                    ],
                                ),
                                // Truncated buffer → error.
                                Node::if_then(
                                    Expr::and(
                                        Expr::eq(Expr::var("done_content"), Expr::u32(0)),
                                        Expr::ge(Expr::var("idx"), source_byte_len.clone()),
                                    ),
                                    vec![
                                        Node::assign("ok_so_far", Expr::u32(0)),
                                        Node::assign("done_content", Expr::u32(1)),
                                    ],
                                ),
                                // Otherwise: regular char or escape.
                                Node::if_then(
                                    Expr::eq(Expr::var("done_content"), Expr::u32(0)),
                                    vec![
                                        Node::let_bind(
                                            "is_escape",
                                            Expr::select(
                                                Expr::eq(Expr::var("ch"), Expr::u32(b'\\' as u32)),
                                                Expr::u32(1),
                                                Expr::u32(0),
                                            ),
                                        ),
                                        Node::if_then_else(
                                            Expr::eq(Expr::var("is_escape"), Expr::u32(1)),
                                            vec![
                                                // Read the byte after `\`.
                                                Node::let_bind(
                                                    "esc",
                                                    safe_load(Expr::add(
                                                        Expr::var("idx"),
                                                        Expr::u32(1),
                                                    )),
                                                ),
                                                // Categorize the escape: numeric kinds need
                                                // dedicated greedy scanners; everything else
                                                // decodes via the simple-escape lookup.
                                                Node::let_bind(
                                                    "is_octal_start",
                                                    Expr::select(
                                                        Expr::and(
                                                            Expr::ge(
                                                                Expr::var("esc"),
                                                                Expr::u32(b'0' as u32),
                                                            ),
                                                            Expr::le(
                                                                Expr::var("esc"),
                                                                Expr::u32(b'7' as u32),
                                                            ),
                                                        ),
                                                        Expr::u32(1),
                                                        Expr::u32(0),
                                                    ),
                                                ),
                                                Node::let_bind(
                                                    "is_hex_start",
                                                    Expr::select(
                                                        Expr::eq(
                                                            Expr::var("esc"),
                                                            Expr::u32(b'x' as u32),
                                                        ),
                                                        Expr::u32(1),
                                                        Expr::u32(0),
                                                    ),
                                                ),
                                                Node::let_bind(
                                                    "is_ucn4_start",
                                                    Expr::select(
                                                        Expr::eq(
                                                            Expr::var("esc"),
                                                            Expr::u32(b'u' as u32),
                                                        ),
                                                        Expr::u32(1),
                                                        Expr::u32(0),
                                                    ),
                                                ),
                                                Node::let_bind(
                                                    "is_ucn8_start",
                                                    Expr::select(
                                                        Expr::eq(
                                                            Expr::var("esc"),
                                                            Expr::u32(b'U' as u32),
                                                        ),
                                                        Expr::u32(1),
                                                        Expr::u32(0),
                                                    ),
                                                ),
                                                // Simple-escape lookup. Numeric-start
                                                // categories take precedence below; this
                                                // value covers named escapes and identity
                                                // escapes.
                                                Node::let_bind(
                                                    "simple_val",
                                                    Expr::select(
                                                        Expr::eq(
                                                            Expr::var("esc"),
                                                            Expr::u32(b'n' as u32),
                                                        ),
                                                        Expr::u32(b'\n' as u32),
                                                        Expr::select(
                                                            Expr::eq(
                                                                Expr::var("esc"),
                                                                Expr::u32(b't' as u32),
                                                            ),
                                                            Expr::u32(b'\t' as u32),
                                                            Expr::select(
                                                                Expr::eq(
                                                                    Expr::var("esc"),
                                                                    Expr::u32(b'r' as u32),
                                                                ),
                                                                Expr::u32(b'\r' as u32),
                                                                Expr::select(
                                                                    Expr::eq(
                                                                        Expr::var("esc"),
                                                                        Expr::u32(b'a' as u32),
                                                                    ),
                                                                    Expr::u32(7),
                                                                    Expr::select(
                                                                        Expr::eq(
                                                                            Expr::var("esc"),
                                                                            Expr::u32(b'b' as u32),
                                                                        ),
                                                                        Expr::u32(8),
                                                                        Expr::select(
                                                                            Expr::eq(
                                                                                Expr::var("esc"),
                                                                                Expr::u32(
                                                                                    b'f' as u32,
                                                                                ),
                                                                            ),
                                                                            Expr::u32(12),
                                                                            Expr::select(
                                                                                Expr::eq(
                                                                                    Expr::var(
                                                                                        "esc",
                                                                                    ),
                                                                                    Expr::u32(
                                                                                        b'v' as u32,
                                                                                    ),
                                                                                ),
                                                                                Expr::u32(11),
                                                                                // Default: the literal byte after `\`
                                                                                // (covers ' " ? \\ and `\<other>`).
                                                                                Expr::var("esc"),
                                                                            ),
                                                                        ),
                                                                    ),
                                                                ),
                                                            ),
                                                        ),
                                                    ),
                                                ),
                                                // ---- Octal: \0..\7, up to 3 digits ----
                                                // Read up to 3 octal digits starting at
                                                // idx+1. octal_value accumulates; octal_len
                                                // counts digits actually consumed.
                                                Node::let_bind("octal_value", Expr::u32(0)),
                                                Node::let_bind("octal_len", Expr::u32(0)),
                                                Node::let_bind("octal_done", Expr::u32(0)),
                                                Node::loop_for(
                                                    "od",
                                                    Expr::u32(0),
                                                    Expr::u32(3),
                                                    vec![Node::if_then(
                                                        Expr::and(
                                                            Expr::eq(
                                                                Expr::var("is_octal_start"),
                                                                Expr::u32(1),
                                                            ),
                                                            Expr::eq(
                                                                Expr::var("octal_done"),
                                                                Expr::u32(0),
                                                            ),
                                                        ),
                                                        vec![
                                                            Node::let_bind(
                                                                "ob",
                                                                safe_load(Expr::add(
                                                                    Expr::add(
                                                                        Expr::var("idx"),
                                                                        Expr::u32(1),
                                                                    ),
                                                                    Expr::var("od"),
                                                                )),
                                                            ),
                                                            Node::let_bind(
                                                                "is_oct",
                                                                Expr::select(
                                                                    Expr::and(
                                                                        Expr::ge(
                                                                            Expr::var("ob"),
                                                                            Expr::u32(b'0' as u32),
                                                                        ),
                                                                        Expr::le(
                                                                            Expr::var("ob"),
                                                                            Expr::u32(b'7' as u32),
                                                                        ),
                                                                    ),
                                                                    Expr::u32(1),
                                                                    Expr::u32(0),
                                                                ),
                                                            ),
                                                            Node::if_then_else(
                                                                Expr::eq(
                                                                    Expr::var("is_oct"),
                                                                    Expr::u32(1),
                                                                ),
                                                                vec![
                                                                    Node::assign(
                                                                        "octal_value",
                                                                        Expr::add(
                                                                            Expr::mul(
                                                                                Expr::var(
                                                                                    "octal_value",
                                                                                ),
                                                                                Expr::u32(8),
                                                                            ),
                                                                            Expr::sub(
                                                                                Expr::var("ob"),
                                                                                Expr::u32(
                                                                                    b'0' as u32,
                                                                                ),
                                                                            ),
                                                                        ),
                                                                    ),
                                                                    Node::assign(
                                                                        "octal_len",
                                                                        Expr::add(
                                                                            Expr::var("octal_len"),
                                                                            Expr::u32(1),
                                                                        ),
                                                                    ),
                                                                ],
                                                                vec![Node::assign(
                                                                    "octal_done",
                                                                    Expr::u32(1),
                                                                )],
                                                            ),
                                                        ],
                                                    )],
                                                ),
                                                // ---- Hex: \xH+, greedy ----
                                                Node::let_bind("hex_value", Expr::u32(0)),
                                                Node::let_bind("hex_len", Expr::u32(0)),
                                                Node::let_bind("hex_done", Expr::u32(0)),
                                                Node::loop_for(
                                                    "hd",
                                                    Expr::u32(0),
                                                    Expr::u32(8),
                                                    vec![Node::if_then(
                                                        Expr::and(
                                                            Expr::eq(
                                                                Expr::var("is_hex_start"),
                                                                Expr::u32(1),
                                                            ),
                                                            Expr::eq(
                                                                Expr::var("hex_done"),
                                                                Expr::u32(0),
                                                            ),
                                                        ),
                                                        vec![
                                                            Node::let_bind(
                                                                "hb",
                                                                safe_load(Expr::add(
                                                                    Expr::add(
                                                                        Expr::var("idx"),
                                                                        Expr::u32(2),
                                                                    ),
                                                                    Expr::var("hd"),
                                                                )),
                                                            ),
                                                            Node::let_bind(
                                                                "hb_dec",
                                                                Expr::select(
                                                                    Expr::and(
                                                                        Expr::ge(
                                                                            Expr::var("hb"),
                                                                            Expr::u32(b'0' as u32),
                                                                        ),
                                                                        Expr::le(
                                                                            Expr::var("hb"),
                                                                            Expr::u32(b'9' as u32),
                                                                        ),
                                                                    ),
                                                                    Expr::u32(1),
                                                                    Expr::u32(0),
                                                                ),
                                                            ),
                                                            Node::let_bind(
                                                                "hb_lc",
                                                                Expr::select(
                                                                    Expr::and(
                                                                        Expr::ge(
                                                                            Expr::var("hb"),
                                                                            Expr::u32(b'a' as u32),
                                                                        ),
                                                                        Expr::le(
                                                                            Expr::var("hb"),
                                                                            Expr::u32(b'f' as u32),
                                                                        ),
                                                                    ),
                                                                    Expr::u32(1),
                                                                    Expr::u32(0),
                                                                ),
                                                            ),
                                                            Node::let_bind(
                                                                "hb_uc",
                                                                Expr::select(
                                                                    Expr::and(
                                                                        Expr::ge(
                                                                            Expr::var("hb"),
                                                                            Expr::u32(b'A' as u32),
                                                                        ),
                                                                        Expr::le(
                                                                            Expr::var("hb"),
                                                                            Expr::u32(b'F' as u32),
                                                                        ),
                                                                    ),
                                                                    Expr::u32(1),
                                                                    Expr::u32(0),
                                                                ),
                                                            ),
                                                            Node::let_bind(
                                                                "hb_val",
                                                                Expr::select(
                                                                    Expr::eq(
                                                                        Expr::var("hb_dec"),
                                                                        Expr::u32(1),
                                                                    ),
                                                                    Expr::sub(
                                                                        Expr::var("hb"),
                                                                        Expr::u32(b'0' as u32),
                                                                    ),
                                                                    Expr::select(
                                                                        Expr::eq(
                                                                            Expr::var("hb_lc"),
                                                                            Expr::u32(1),
                                                                        ),
                                                                        Expr::add(
                                                                            Expr::sub(
                                                                                Expr::var("hb"),
                                                                                Expr::u32(
                                                                                    b'a' as u32,
                                                                                ),
                                                                            ),
                                                                            Expr::u32(10),
                                                                        ),
                                                                        Expr::select(
                                                                            Expr::eq(
                                                                                Expr::var("hb_uc"),
                                                                                Expr::u32(1),
                                                                            ),
                                                                            Expr::add(
                                                                                Expr::sub(
                                                                                    Expr::var("hb"),
                                                                                    Expr::u32(
                                                                                        b'A' as u32,
                                                                                    ),
                                                                                ),
                                                                                Expr::u32(10),
                                                                            ),
                                                                            Expr::u32(99),
                                                                        ),
                                                                    ),
                                                                ),
                                                            ),
                                                            Node::let_bind(
                                                                "is_hexd",
                                                                Expr::select(
                                                                    Expr::lt(
                                                                        Expr::var("hb_val"),
                                                                        Expr::u32(16),
                                                                    ),
                                                                    Expr::u32(1),
                                                                    Expr::u32(0),
                                                                ),
                                                            ),
                                                            Node::if_then_else(
                                                                Expr::eq(
                                                                    Expr::var("is_hexd"),
                                                                    Expr::u32(1),
                                                                ),
                                                                vec![
                                                                    Node::assign(
                                                                        "hex_value",
                                                                        Expr::add(
                                                                            Expr::mul(
                                                                                Expr::var(
                                                                                    "hex_value",
                                                                                ),
                                                                                Expr::u32(16),
                                                                            ),
                                                                            Expr::var("hb_val"),
                                                                        ),
                                                                    ),
                                                                    Node::assign(
                                                                        "hex_len",
                                                                        Expr::add(
                                                                            Expr::var("hex_len"),
                                                                            Expr::u32(1),
                                                                        ),
                                                                    ),
                                                                ],
                                                                vec![Node::assign(
                                                                    "hex_done",
                                                                    Expr::u32(1),
                                                                )],
                                                            ),
                                                        ],
                                                    )],
                                                ),
                                                // ---- UCN: \uHHHH or \UHHHHHHHH, fixed length ----
                                                Node::let_bind(
                                                    "ucn_digits",
                                                    Expr::select(
                                                        Expr::eq(
                                                            Expr::var("is_ucn4_start"),
                                                            Expr::u32(1),
                                                        ),
                                                        Expr::u32(4),
                                                        Expr::select(
                                                            Expr::eq(
                                                                Expr::var("is_ucn8_start"),
                                                                Expr::u32(1),
                                                            ),
                                                            Expr::u32(8),
                                                            Expr::u32(0),
                                                        ),
                                                    ),
                                                ),
                                                Node::let_bind("ucn_value", Expr::u32(0)),
                                                Node::let_bind("ucn_ok", Expr::u32(1)),
                                                Node::loop_for(
                                                    "ud",
                                                    Expr::u32(0),
                                                    Expr::u32(8),
                                                    vec![Node::if_then(
                                                        Expr::lt(
                                                            Expr::var("ud"),
                                                            Expr::var("ucn_digits"),
                                                        ),
                                                        vec![
                                                            Node::let_bind(
                                                                "ub",
                                                                safe_load(Expr::add(
                                                                    Expr::add(
                                                                        Expr::var("idx"),
                                                                        Expr::u32(2),
                                                                    ),
                                                                    Expr::var("ud"),
                                                                )),
                                                            ),
                                                            Node::let_bind(
                                                                "ub_dec",
                                                                Expr::select(
                                                                    Expr::and(
                                                                        Expr::ge(
                                                                            Expr::var("ub"),
                                                                            Expr::u32(b'0' as u32),
                                                                        ),
                                                                        Expr::le(
                                                                            Expr::var("ub"),
                                                                            Expr::u32(b'9' as u32),
                                                                        ),
                                                                    ),
                                                                    Expr::u32(1),
                                                                    Expr::u32(0),
                                                                ),
                                                            ),
                                                            Node::let_bind(
                                                                "ub_lc",
                                                                Expr::select(
                                                                    Expr::and(
                                                                        Expr::ge(
                                                                            Expr::var("ub"),
                                                                            Expr::u32(b'a' as u32),
                                                                        ),
                                                                        Expr::le(
                                                                            Expr::var("ub"),
                                                                            Expr::u32(b'f' as u32),
                                                                        ),
                                                                    ),
                                                                    Expr::u32(1),
                                                                    Expr::u32(0),
                                                                ),
                                                            ),
                                                            Node::let_bind(
                                                                "ub_uc",
                                                                Expr::select(
                                                                    Expr::and(
                                                                        Expr::ge(
                                                                            Expr::var("ub"),
                                                                            Expr::u32(b'A' as u32),
                                                                        ),
                                                                        Expr::le(
                                                                            Expr::var("ub"),
                                                                            Expr::u32(b'F' as u32),
                                                                        ),
                                                                    ),
                                                                    Expr::u32(1),
                                                                    Expr::u32(0),
                                                                ),
                                                            ),
                                                            Node::let_bind(
                                                                "ub_val",
                                                                Expr::select(
                                                                    Expr::eq(
                                                                        Expr::var("ub_dec"),
                                                                        Expr::u32(1),
                                                                    ),
                                                                    Expr::sub(
                                                                        Expr::var("ub"),
                                                                        Expr::u32(b'0' as u32),
                                                                    ),
                                                                    Expr::select(
                                                                        Expr::eq(
                                                                            Expr::var("ub_lc"),
                                                                            Expr::u32(1),
                                                                        ),
                                                                        Expr::add(
                                                                            Expr::sub(
                                                                                Expr::var("ub"),
                                                                                Expr::u32(
                                                                                    b'a' as u32,
                                                                                ),
                                                                            ),
                                                                            Expr::u32(10),
                                                                        ),
                                                                        Expr::select(
                                                                            Expr::eq(
                                                                                Expr::var("ub_uc"),
                                                                                Expr::u32(1),
                                                                            ),
                                                                            Expr::add(
                                                                                Expr::sub(
                                                                                    Expr::var("ub"),
                                                                                    Expr::u32(
                                                                                        b'A' as u32,
                                                                                    ),
                                                                                ),
                                                                                Expr::u32(10),
                                                                            ),
                                                                            Expr::u32(99),
                                                                        ),
                                                                    ),
                                                                ),
                                                            ),
                                                            Node::if_then_else(
                                                                Expr::lt(
                                                                    Expr::var("ub_val"),
                                                                    Expr::u32(16),
                                                                ),
                                                                vec![Node::assign(
                                                                    "ucn_value",
                                                                    Expr::add(
                                                                        Expr::mul(
                                                                            Expr::var("ucn_value"),
                                                                            Expr::u32(16),
                                                                        ),
                                                                        Expr::var("ub_val"),
                                                                    ),
                                                                )],
                                                                vec![Node::assign(
                                                                    "ucn_ok",
                                                                    Expr::u32(0),
                                                                )],
                                                            ),
                                                        ],
                                                    )],
                                                ),
                                                // ---- Compose final esc_val + extra_advance ----
                                                Node::let_bind(
                                                    "esc_val",
                                                    Expr::select(
                                                        Expr::eq(
                                                            Expr::var("is_octal_start"),
                                                            Expr::u32(1),
                                                        ),
                                                        Expr::var("octal_value"),
                                                        Expr::select(
                                                            Expr::eq(
                                                                Expr::var("is_hex_start"),
                                                                Expr::u32(1),
                                                            ),
                                                            Expr::var("hex_value"),
                                                            Expr::select(
                                                                Expr::or(
                                                                    Expr::eq(
                                                                        Expr::var("is_ucn4_start"),
                                                                        Expr::u32(1),
                                                                    ),
                                                                    Expr::eq(
                                                                        Expr::var("is_ucn8_start"),
                                                                        Expr::u32(1),
                                                                    ),
                                                                ),
                                                                Expr::var("ucn_value"),
                                                                Expr::var("simple_val"),
                                                            ),
                                                        ),
                                                    ),
                                                ),
                                                // Bytes to advance from the `\`. Octal: 1
                                                // (for `\`) + octal_len. Hex: 2 (for `\x`) +
                                                // hex_len. UCN: 2 (for `\u`/`\U`) + ucn_digits.
                                                // Simple: 2 (for `\<one>`).
                                                Node::let_bind(
                                                    "extra_advance",
                                                    Expr::select(
                                                        Expr::eq(
                                                            Expr::var("is_octal_start"),
                                                            Expr::u32(1),
                                                        ),
                                                        Expr::add(
                                                            Expr::u32(1),
                                                            Expr::var("octal_len"),
                                                        ),
                                                        Expr::select(
                                                            Expr::eq(
                                                                Expr::var("is_hex_start"),
                                                                Expr::u32(1),
                                                            ),
                                                            Expr::add(
                                                                Expr::u32(2),
                                                                Expr::var("hex_len"),
                                                            ),
                                                            Expr::select(
                                                                Expr::or(
                                                                    Expr::eq(
                                                                        Expr::var("is_ucn4_start"),
                                                                        Expr::u32(1),
                                                                    ),
                                                                    Expr::eq(
                                                                        Expr::var("is_ucn8_start"),
                                                                        Expr::u32(1),
                                                                    ),
                                                                ),
                                                                Expr::add(
                                                                    Expr::u32(2),
                                                                    Expr::var("ucn_digits"),
                                                                ),
                                                                Expr::u32(2),
                                                            ),
                                                        ),
                                                    ),
                                                ),
                                                // Hex with no digits is an error per CPU
                                                // ref. Same for UCN with bad digits.
                                                Node::if_then(
                                                    Expr::and(
                                                        Expr::eq(
                                                            Expr::var("is_hex_start"),
                                                            Expr::u32(1),
                                                        ),
                                                        Expr::eq(
                                                            Expr::var("hex_len"),
                                                            Expr::u32(0),
                                                        ),
                                                    ),
                                                    vec![Node::assign("ok_so_far", Expr::u32(0))],
                                                ),
                                                Node::if_then(
                                                    Expr::and(
                                                        Expr::or(
                                                            Expr::eq(
                                                                Expr::var("is_ucn4_start"),
                                                                Expr::u32(1),
                                                            ),
                                                            Expr::eq(
                                                                Expr::var("is_ucn8_start"),
                                                                Expr::u32(1),
                                                            ),
                                                        ),
                                                        Expr::eq(Expr::var("ucn_ok"), Expr::u32(0)),
                                                    ),
                                                    vec![Node::assign("ok_so_far", Expr::u32(0))],
                                                ),
                                                // Append to value.
                                                Node::assign(
                                                    "value",
                                                    Expr::bitor(
                                                        Expr::shl(Expr::var("value"), Expr::u32(8)),
                                                        Expr::bitand(
                                                            Expr::var("esc_val"),
                                                            Expr::u32(0xff),
                                                        ),
                                                    ),
                                                ),
                                                Node::assign("saw_char", Expr::u32(1)),
                                                Node::assign(
                                                    "idx",
                                                    Expr::add(
                                                        Expr::var("idx"),
                                                        Expr::var("extra_advance"),
                                                    ),
                                                ),
                                            ],
                                            vec![
                                                // Plain byte.
                                                Node::assign(
                                                    "value",
                                                    Expr::bitor(
                                                        Expr::shl(Expr::var("value"), Expr::u32(8)),
                                                        Expr::bitand(
                                                            Expr::var("ch"),
                                                            Expr::u32(0xff),
                                                        ),
                                                    ),
                                                ),
                                                Node::assign("saw_char", Expr::u32(1)),
                                                Node::assign(
                                                    "idx",
                                                    Expr::add(Expr::var("idx"), Expr::u32(1)),
                                                ),
                                            ],
                                        ),
                                    ],
                                ),
                            ],
                        )],
                    ),
                    // After the loop, idx must be at the closing `'`.
                    Node::let_bind("closer", safe_load(Expr::var("idx"))),
                    Node::if_then(
                        Expr::ne(Expr::var("closer"), Expr::u32(b'\'' as u32)),
                        vec![Node::assign("ok_so_far", Expr::u32(0))],
                    ),
                    // Empty `''` is an error.
                    Node::if_then(
                        Expr::eq(Expr::var("saw_char"), Expr::u32(0)),
                        vec![Node::assign("ok_so_far", Expr::u32(0))],
                    ),
                    // On success, step past closing `'`.
                    Node::if_then(
                        Expr::eq(Expr::var("ok_so_far"), Expr::u32(1)),
                        vec![Node::assign(
                            "idx",
                            Expr::add(Expr::var("idx"), Expr::u32(1)),
                        )],
                    ),
                ],
            ),
            Node::let_bind(
                "consumed",
                Expr::select(
                    Expr::eq(Expr::var("ok_so_far"), Expr::u32(1)),
                    Expr::sub(Expr::var("idx"), Expr::var("start")),
                    Expr::u32(0),
                ),
            ),
            Node::let_bind(
                "value_final",
                Expr::select(
                    Expr::eq(Expr::var("ok_so_far"), Expr::u32(1)),
                    Expr::var("value"),
                    Expr::u32(0),
                ),
            ),
            Node::store("value_out", Expr::u32(0), Expr::var("value_final")),
            Node::store("bytes_consumed_out", Expr::u32(0), Expr::var("consumed")),
            Node::store("ok_out", Expr::u32(0), Expr::var("ok_so_far")),
        ],
    )];

    let mut buffers = literal_scan_common_buffers(
        BINDING_SOURCE,
        BINDING_START_POS,
        BINDING_VALUE_OUT,
        BINDING_BYTES_CONSUMED_OUT,
    );
    buffers.push(literal_scan_status_output("ok_out", BINDING_OK_OUT));
    literal_scan_program(buffers, body, OP_ID)
}