/
mojoshader_lexer.c
1242 lines (1210 loc) · 23.7 KB
1
/* Generated by re2c 3.0 */
2
3
4
5
6
7
8
9
10
11
12
13
/**
* MojoShader; generate shader programs from bytecode of compiled
* Direct3D shaders.
*
* Please see the file LICENSE.txt in the source's root directory.
*
* This file written by Ryan C. Gordon.
*/
// This was originally based on examples/pp-c.re from re2c: http://re2c.org/
// re2c is public domain code.
//
14
15
// You build mojoshader_lexer.c from the .re file with re2c...
// re2c -is -o mojoshader_lexer.c mojoshader_lexer.re
16
17
18
19
20
21
22
23
24
25
26
27
//
// Changes to the lexer are done to the .re file, not the C code!
//
// Please note that this isn't a perfect C lexer, since it is used for both
// HLSL and shader assembly language, and follows the quirks of Microsoft's
// tools.
#define __MOJOSHADER_INTERNAL__ 1
#include "mojoshader_internal.h"
typedef unsigned char uchar;
28
#define YYMAXFILL 8
29
30
#define RET(t) return update_state(s, eoi, cursor, token, (Token) t)
31
32
33
34
#define YYCTYPE uchar
#define YYCURSOR cursor
#define YYLIMIT limit
#define YYMARKER s->lexer_marker
35
#define YYFILL(n) { if ((n) == 1) { cursor = sentinel; limit = cursor + YYMAXFILL; eoi = 1; } }
36
37
38
39
40
static uchar sentinel[YYMAXFILL];
static Token update_state(IncludeState *s, int eoi, const uchar *cur,
const uchar *tok, const Token val)
41
{
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
if (eoi)
{
s->bytes_left = 0;
s->source = (const char *) s->source_base + s->orig_length;
if ( (tok >= sentinel) && (tok < (sentinel+YYMAXFILL)) )
s->token = s->source;
else
s->token = (const char *) tok;
} // if
else
{
s->bytes_left -= (unsigned int) (cur - ((const uchar *) s->source));
s->source = (const char *) cur;
s->token = (const char *) tok;
} // else
s->tokenlen = (unsigned int) (s->source - s->token);
s->tokenval = val;
return val;
60
61
} // update_state
62
Token preprocessor_lexer(IncludeState *s)
63
64
{
const uchar *cursor = (const uchar *) s->source;
65
const uchar *token = cursor;
66
const uchar *matchptr;
67
const uchar *limit = cursor + s->bytes_left;
68
int eoi = 0;
69
70
71
72
73
74
75
// preprocessor directives are only valid at start of line.
if (s->tokenval == ((Token) '\n'))
goto ppdirective; // may jump back to scanner_loop.
76
scanner_loop:
77
if (YYLIMIT == YYCURSOR) YYFILL(1);
78
79
80
81
82
83
token = cursor;
{
YYCTYPE yych;
unsigned int yyaccept = 0;
84
if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
85
yych = *YYCURSOR;
86
switch (yych) {
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
case 0x00: goto yy1;
case '\t':
case '\v':
case '\f':
case ' ': goto yy4;
case '\n': goto yy5;
case '\r': goto yy7;
case '!': goto yy8;
case '"': goto yy9;
case '#': goto yy10;
case '%': goto yy11;
case '&': goto yy12;
case '\'': goto yy13;
case '(': goto yy14;
case ')': goto yy15;
case '*': goto yy16;
case '+': goto yy17;
case ',': goto yy18;
case '-': goto yy19;
case '.': goto yy20;
case '/': goto yy22;
case '0': goto yy23;
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': goto yy25;
case ':': goto yy27;
case ';': goto yy28;
case '<': goto yy29;
case '=': goto yy31;
case '>': goto yy32;
case '?': goto yy34;
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
case 'G':
case 'H':
case 'I':
case 'J':
case 'K':
case 'L':
case 'M':
case 'N':
case 'O':
case 'P':
case 'Q':
case 'R':
case 'S':
case 'T':
case 'U':
case 'V':
case 'W':
case 'X':
case 'Y':
case 'Z':
case '_':
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
case 'g':
case 'h':
case 'i':
case 'j':
case 'k':
case 'l':
case 'm':
case 'n':
case 'o':
case 'p':
case 'q':
case 'r':
case 's':
case 't':
case 'u':
case 'v':
case 'w':
case 'x':
case 'y':
case 'z': goto yy35;
case '[': goto yy37;
case '\\': goto yy38;
case ']': goto yy39;
case '^': goto yy40;
case '{': goto yy41;
case '|': goto yy42;
case '}': goto yy43;
case '~': goto yy44;
default: goto yy2;
186
}
187
yy1:
188
189
++YYCURSOR;
{ if (eoi) { RET(TOKEN_EOI); } goto bad_chars; }
190
yy2:
191
++YYCURSOR;
192
yy3:
193
{ goto bad_chars; }
194
yy4:
195
++YYCURSOR;
196
if (YYLIMIT <= YYCURSOR) YYFILL(1);
197
yych = *YYCURSOR;
198
if (yych <= '\n') {
199
if (yych == '\t') goto yy4;
200
} else {
201
202
if (yych <= '\f') goto yy4;
if (yych == ' ') goto yy4;
203
}
204
{ if (s->report_whitespace) RET(' '); goto scanner_loop; }
205
yy5:
206
++YYCURSOR;
207
yy6:
208
{ s->line++; RET('\n'); }
209
yy7:
210
yych = *++YYCURSOR;
211
212
213
if (yych == '\n') goto yy5;
goto yy6;
yy8:
214
yych = *++YYCURSOR;
215
if (yych == '=') goto yy45;
216
{ RET('!'); }
217
yy9:
218
219
yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
220
221
222
223
if (yych == '\n') goto yy3;
if (yych == '\r') goto yy3;
goto yy47;
yy10:
224
yych = *++YYCURSOR;
225
if (yych == '#') goto yy51;
226
{ RET(TOKEN_HASH); }
227
yy11:
228
yych = *++YYCURSOR;
229
if (yych == '=') goto yy52;
230
{ RET('%'); }
231
yy12:
232
yych = *++YYCURSOR;
233
234
if (yych == '&') goto yy53;
if (yych == '=') goto yy54;
235
{ RET('&'); }
236
yy13:
237
238
yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
239
240
241
242
if (yych == '\n') goto yy3;
if (yych == '\r') goto yy3;
goto yy56;
yy14:
243
++YYCURSOR;
244
{ RET('('); }
245
yy15:
246
++YYCURSOR;
247
{ RET(')'); }
248
yy16:
249
yych = *++YYCURSOR;
250
if (yych == '=') goto yy58;
251
{ RET('*'); }
252
yy17:
253
yych = *++YYCURSOR;
254
255
if (yych == '+') goto yy59;
if (yych == '=') goto yy60;
256
{ RET('+'); }
257
yy18:
258
++YYCURSOR;
259
{ RET(','); }
260
yy19:
261
yych = *++YYCURSOR;
262
263
if (yych == '-') goto yy61;
if (yych == '=') goto yy62;
264
{ RET('-'); }
265
yy20:
266
yych = *++YYCURSOR;
267
268
269
if (yych <= '/') goto yy21;
if (yych <= '9') goto yy63;
yy21:
270
{ RET('.'); }
271
yy22:
272
273
yych = *++YYCURSOR;
if (yych <= '.') {
274
if (yych == '*') goto yy65;
275
} else {
276
277
if (yych <= '/') goto yy66;
if (yych == '=') goto yy67;
278
279
}
{ RET('/'); }
280
yy23:
281
282
yyaccept = 1;
yych = *(YYMARKER = ++YYCURSOR);
283
284
285
286
if (yych == 'X') goto yy70;
if (yych == 'x') goto yy70;
goto yy26;
yy24:
287
{ RET(TOKEN_INT_LITERAL); }
288
yy25:
289
290
291
292
yyaccept = 1;
YYMARKER = ++YYCURSOR;
if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
yych = *YYCURSOR;
293
yy26:
294
295
if (yych <= 'L') {
if (yych <= '9') {
296
297
298
if (yych == '.') goto yy63;
if (yych <= '/') goto yy24;
goto yy25;
299
} else {
300
301
302
if (yych == 'E') goto yy68;
if (yych <= 'K') goto yy24;
goto yy69;
303
304
305
}
} else {
if (yych <= 'e') {
306
307
308
if (yych == 'U') goto yy69;
if (yych <= 'd') goto yy24;
goto yy68;
309
310
} else {
if (yych <= 'l') {
311
312
if (yych <= 'k') goto yy24;
goto yy69;
313
} else {
314
315
if (yych == 'u') goto yy69;
goto yy24;
316
317
318
}
}
}
319
yy27:
320
++YYCURSOR;
321
{ RET(':'); }
322
yy28:
323
++YYCURSOR;
324
{ if (s->asm_comments) goto singlelinecomment; RET(';'); }
325
yy29:
326
yych = *++YYCURSOR;
327
328
329
330
if (yych <= ';') goto yy30;
if (yych <= '<') goto yy71;
if (yych <= '=') goto yy72;
yy30:
331
{ RET('<'); }
332
yy31:
333
yych = *++YYCURSOR;
334
if (yych == '=') goto yy73;
335
{ RET('='); }
336
yy32:
337
yych = *++YYCURSOR;
338
339
340
341
if (yych <= '<') goto yy33;
if (yych <= '=') goto yy74;
if (yych <= '>') goto yy75;
yy33:
342
{ RET('>'); }
343
yy34:
344
++YYCURSOR;
345
{ RET('?'); }
346
yy35:
347
++YYCURSOR;
348
349
350
if (YYLIMIT <= YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if (yych <= 'Z') {
351
352
353
if (yych <= '/') goto yy36;
if (yych <= '9') goto yy35;
if (yych >= 'A') goto yy35;
354
355
} else {
if (yych <= '_') {
356
if (yych >= '_') goto yy35;
357
} else {
358
359
if (yych <= '`') goto yy36;
if (yych <= 'z') goto yy35;
360
361
}
}
362
yy36:
363
{ RET(TOKEN_IDENTIFIER); }
364
yy37:
365
++YYCURSOR;
366
{ RET('['); }
367
yy38:
368
369
yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
370
371
372
373
374
if (yych <= 0x08) goto yy3;
if (yych <= '\r') goto yy77;
if (yych == ' ') goto yy77;
goto yy3;
yy39:
375
++YYCURSOR;
376
{ RET(']'); }
377
yy40:
378
yych = *++YYCURSOR;
379
if (yych == '=') goto yy81;
380
{ RET('^'); }
381
yy41:
382
++YYCURSOR;
383
{ RET('{'); }
384
yy42:
385
yych = *++YYCURSOR;
386
387
if (yych == '=') goto yy82;
if (yych == '|') goto yy83;
388
{ RET('|'); }
389
yy43:
390
391
++YYCURSOR;
{ RET('}'); }
392
yy44:
393
++YYCURSOR;
394
{ RET('~'); }
395
yy45:
396
397
++YYCURSOR;
{ RET(TOKEN_NEQ); }
398
yy46:
399
++YYCURSOR;
400
if (YYLIMIT <= YYCURSOR) YYFILL(1);
401
yych = *YYCURSOR;
402
yy47:
403
if (yych <= '\r') {
404
405
if (yych == '\n') goto yy48;
if (yych <= '\f') goto yy46;
406
} else {
407
if (yych <= '"') {
408
409
if (yych <= '!') goto yy46;
goto yy49;
410
} else {
411
412
if (yych == '\\') goto yy50;
goto yy46;
413
}
414
}
415
yy48:
416
417
YYCURSOR = YYMARKER;
if (yyaccept <= 1) {
418
if (yyaccept == 0) {
419
goto yy3;
420
} else {
421
goto yy24;
422
423
}
} else {
424
goto yy64;
425
}
426
yy49:
427
428
++YYCURSOR;
{ RET(TOKEN_STRING_LITERAL); }
429
yy50:
430
++YYCURSOR;
431
if (YYLIMIT <= YYCURSOR) YYFILL(1);
432
yych = *YYCURSOR;
433
434
435
if (yych <= 'b') {
if (yych <= '7') {
if (yych <= '&') {
436
437
if (yych == '"') goto yy46;
goto yy48;
438
} else {
439
440
441
if (yych <= '\'') goto yy46;
if (yych <= '/') goto yy48;
goto yy46;
442
443
}
} else {
444
if (yych <= '[') {
445
446
if (yych == '?') goto yy46;
goto yy48;
447
} else {
448
449
450
if (yych <= '\\') goto yy46;
if (yych <= '`') goto yy48;
goto yy46;
451
452
453
}
}
} else {
454
455
if (yych <= 'r') {
if (yych <= 'm') {
456
457
if (yych == 'f') goto yy46;
goto yy48;
458
} else {
459
460
461
if (yych <= 'n') goto yy46;
if (yych <= 'q') goto yy48;
goto yy46;
462
463
}
} else {
464
if (yych <= 'u') {
465
466
if (yych == 't') goto yy46;
goto yy48;
467
} else {
468
469
470
if (yych <= 'v') goto yy46;
if (yych == 'x') goto yy84;
goto yy48;
471
472
473
}
}
}
474
yy51:
475
++YYCURSOR;
476
{ RET(TOKEN_HASHHASH); }
477
yy52:
478
++YYCURSOR;
479
{ RET(TOKEN_MODASSIGN); }
480
yy53:
481
482
++YYCURSOR;
{ RET(TOKEN_ANDAND); }
483
yy54:
484
485
++YYCURSOR;
{ RET(TOKEN_ANDASSIGN); }
486
yy55:
487
++YYCURSOR;
488
if (YYLIMIT <= YYCURSOR) YYFILL(1);
489
yych = *YYCURSOR;
490
yy56:
491
if (yych <= '\r') {
492
493
494
if (yych == '\n') goto yy48;
if (yych <= '\f') goto yy55;
goto yy48;
495
} else {
496
if (yych <= '\'') {
497
if (yych <= '&') goto yy55;
498
} else {
499
500
if (yych == '\\') goto yy57;
goto yy55;
501
502
}
}
503
++YYCURSOR;
504
505
goto yy24;
yy57:
506
++YYCURSOR;
507
if (YYLIMIT <= YYCURSOR) YYFILL(1);
508
yych = *YYCURSOR;
509
510
511
if (yych <= 'b') {
if (yych <= '7') {
if (yych <= '&') {
512
513
if (yych == '"') goto yy55;
goto yy48;
514
} else {
515
516
517
if (yych <= '\'') goto yy55;
if (yych <= '/') goto yy48;
goto yy55;
518
}
519
} else {
520
if (yych <= '[') {
521
522
if (yych == '?') goto yy55;
goto yy48;
523
} else {
524
525
526
if (yych <= '\\') goto yy55;
if (yych <= '`') goto yy48;
goto yy55;
527
}
528
529
}
} else {
530
531
if (yych <= 'r') {
if (yych <= 'm') {
532
533
if (yych == 'f') goto yy55;
goto yy48;
534
} else {
535
536
537
if (yych <= 'n') goto yy55;
if (yych <= 'q') goto yy48;
goto yy55;
538
539
}
} else {
540
if (yych <= 'u') {
541
542
if (yych == 't') goto yy55;
goto yy48;
543
} else {
544
545
546
if (yych <= 'v') goto yy55;
if (yych == 'x') goto yy85;
goto yy48;
547
548
549
}
}
}
550
yy58:
551
++YYCURSOR;
552
{ RET(TOKEN_MULTASSIGN); }
553
yy59:
554
++YYCURSOR;
555
{ RET(TOKEN_INCREMENT); }
556
yy60:
557
++YYCURSOR;
558
{ RET(TOKEN_ADDASSIGN); }
559
yy61:
560
561
++YYCURSOR;
{ RET(TOKEN_DECREMENT); }
562
yy62:
563
564
++YYCURSOR;
{ RET(TOKEN_SUBASSIGN); }
565
yy63:
566
yyaccept = 2;
567
YYMARKER = ++YYCURSOR;
568
if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
569
yych = *YYCURSOR;
570
571
if (yych <= 'G') {
if (yych <= 'D') {
572
573
if (yych <= '/') goto yy64;
if (yych <= '9') goto yy63;
574
} else {
575
576
if (yych <= 'E') goto yy68;
if (yych <= 'F') goto yy86;
577
578
}
} else {
579
if (yych <= 'e') {
580
581
if (yych <= 'H') goto yy86;
if (yych >= 'e') goto yy68;
582
} else {
583
584
if (yych == 'g') goto yy64;
if (yych <= 'h') goto yy86;
585
586
}
}
587
yy64:
588
{ RET(TOKEN_FLOAT_LITERAL); }
589
yy65:
590
591
++YYCURSOR;
{ goto multilinecomment; }
592
yy66:
593
594
++YYCURSOR;
{ goto singlelinecomment; }
595
yy67:
596
597
++YYCURSOR;
{ RET(TOKEN_DIVASSIGN); }
598
yy68:
599
yych = *++YYCURSOR;
600
if (yych <= ',') {
601
602
if (yych == '+') goto yy87;
goto yy48;
603
} else {
604
605
606
607
if (yych <= '-') goto yy87;
if (yych <= '/') goto yy48;
if (yych <= '9') goto yy88;
goto yy48;
608
}
609
yy69:
610
++YYCURSOR;
611
if (YYLIMIT <= YYCURSOR) YYFILL(1);
612
yych = *YYCURSOR;
613
if (yych <= 'U') {
614
615
616
if (yych == 'L') goto yy69;
if (yych <= 'T') goto yy24;
goto yy69;
617
} else {
618
if (yych <= 'l') {
619
620
if (yych <= 'k') goto yy24;
goto yy69;
621
} else {
622
623
if (yych == 'u') goto yy69;
goto yy24;
624
625
}
}
626
yy70:
627
yych = *++YYCURSOR;
628
if (yych <= '@') {
629
630
631
if (yych <= '/') goto yy48;
if (yych <= '9') goto yy89;
goto yy48;
632
} else {
633
634
635
636
if (yych <= 'F') goto yy89;
if (yych <= '`') goto yy48;
if (yych <= 'f') goto yy89;
goto yy48;
637
}
638
yy71:
639
yych = *++YYCURSOR;
640
if (yych == '=') goto yy90;
641
{ RET(TOKEN_LSHIFT); }
642
yy72:
643
644
++YYCURSOR;
{ RET(TOKEN_LEQ); }
645
yy73:
646
647
++YYCURSOR;
{ RET(TOKEN_EQL); }
648
yy74:
649
650
++YYCURSOR;
{ RET(TOKEN_GEQ); }
651
yy75:
652
yych = *++YYCURSOR;
653
if (yych == '=') goto yy91;
654
{ RET(TOKEN_RSHIFT); }
655
yy76:
656
657
658
++YYCURSOR;
if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
yych = *YYCURSOR;
659
yy77:
660
if (yych <= '\f') {
661
662
if (yych <= 0x08) goto yy48;
if (yych != '\n') goto yy76;
663
} else {
664
665
666
if (yych <= '\r') goto yy80;
if (yych == ' ') goto yy76;
goto yy48;
667
}
668
yy78:
669
++YYCURSOR;
670
yy79:
671
{ s->line++; goto scanner_loop; }
672
yy80:
673
yych = *++YYCURSOR;
674
675
676
if (yych == '\n') goto yy78;
goto yy79;
yy81:
677
678
++YYCURSOR;
{ RET(TOKEN_XORASSIGN); }
679
yy82:
680
681
++YYCURSOR;
{ RET(TOKEN_ORASSIGN); }
682
yy83:
683
684
++YYCURSOR;
{ RET(TOKEN_OROR); }
685
yy84:
686
++YYCURSOR;
687
if (YYLIMIT <= YYCURSOR) YYFILL(1);
688
yych = *YYCURSOR;
689
if (yych <= '@') {
690
691
692
if (yych <= '/') goto yy48;
if (yych <= '9') goto yy46;
goto yy48;
693
} else {
694
695
696
697
if (yych <= 'F') goto yy46;
if (yych <= '`') goto yy48;
if (yych <= 'f') goto yy46;
goto yy48;
698
}
699
yy85:
700
701
702
703
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if (yych <= '@') {
704
705
706
if (yych <= '/') goto yy48;
if (yych <= '9') goto yy55;
goto yy48;
707
} else {
708
709
710
711
if (yych <= 'F') goto yy55;
if (yych <= '`') goto yy48;
if (yych <= 'f') goto yy55;
goto yy48;
712
}
713
yy86:
714
++YYCURSOR;
715
716
goto yy64;
yy87:
717
yych = *++YYCURSOR;
718
719
720
if (yych <= '/') goto yy48;
if (yych >= ':') goto yy48;
yy88:
721
++YYCURSOR;
722
if (YYLIMIT <= YYCURSOR) YYFILL(1);
723
yych = *YYCURSOR;
724
if (yych <= 'G') {
725
if (yych <= '9') {
726
727
if (yych <= '/') goto yy64;
goto yy88;
728
} else {
729
730
if (yych == 'F') goto yy86;
goto yy64;
731
732
}
} else {
733
if (yych <= 'f') {
734
735
736
if (yych <= 'H') goto yy86;
if (yych <= 'e') goto yy64;
goto yy86;
737
} else {
738
739
if (yych == 'h') goto yy86;
goto yy64;
740
741
}
}
742
yy89:
743
++YYCURSOR;
744
if (YYLIMIT <= YYCURSOR) YYFILL(1);
745
yych = *YYCURSOR;
746
747
if (yych <= 'T') {
if (yych <= '@') {
748
749
750
if (yych <= '/') goto yy24;
if (yych <= '9') goto yy89;
goto yy24;
751
} else {
752
753
754
if (yych <= 'F') goto yy89;
if (yych == 'L') goto yy69;
goto yy24;
755
756
}
} else {
757
if (yych <= 'k') {
758
759
760
761
if (yych <= 'U') goto yy69;
if (yych <= '`') goto yy24;
if (yych <= 'f') goto yy89;
goto yy24;
762
} else {
763
764
765
if (yych <= 'l') goto yy69;
if (yych == 'u') goto yy69;
goto yy24;
766
767
}
}
768
yy90:
769
++YYCURSOR;
770
{ RET(TOKEN_LSHIFTASSIGN); }
771
yy91:
772
++YYCURSOR;
773
{ RET(TOKEN_RSHIFTASSIGN); }
774
775
776
777
}
multilinecomment:
778
if (YYLIMIT == YYCURSOR) YYFILL(1);
779
matchptr = cursor;
780
781
782
783
// The "*\/" is just to avoid screwing up text editor syntax highlighting.
{
YYCTYPE yych;
784
if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
785
yych = *YYCURSOR;
786
if (yych <= '\f') {
787
788
789
if (yych <= 0x00) goto yy93;
if (yych == '\n') goto yy96;
goto yy94;
790
} else {
791
792
793
if (yych <= '\r') goto yy98;
if (yych == '*') goto yy99;
goto yy94;
794
}
795
yy93:
796
++YYCURSOR;
797
{
798
799
if (eoi)
RET(TOKEN_INCOMPLETE_COMMENT);
800
801
goto multilinecomment;
}
802
yy94:
803
++YYCURSOR;
804
yy95:
805
{ goto multilinecomment; }
806
yy96:
807
++YYCURSOR;
808
yy97:
809
{
810
s->line++;
811
812
goto multilinecomment;
}
813
yy98:
814
yych = *++YYCURSOR;
815
816
817
if (yych == '\n') goto yy96;
goto yy97;
yy99:
818
yych = *++YYCURSOR;
819
if (yych != '/') goto yy95;
820
++YYCURSOR;
821
{
822
823
if (s->report_comments)
RET(TOKEN_MULTI_COMMENT);
824
825
else if (s->report_whitespace)
RET(' ');
826
827
828
829
830
831
832
833
834
835
836
837
// Microsoft's preprocessor allows multiline comments
// before a preprocessor directive, even though C/C++
// doesn't. See if we've hit this case.
#if MATCH_MICROSOFT_PREPROCESSOR
if (s->tokenval == ((Token) '\n')) // was start of line?
{
update_state(s, eoi, cursor, token, (Token) '\n');
goto ppdirective; // may jump back to scanner_loop.
}
#endif
838
839
goto scanner_loop;
}
840
841
842
843
}
singlelinecomment:
844
if (YYLIMIT == YYCURSOR) YYFILL(1);
845
matchptr = cursor;
846
847
848
{
YYCTYPE yych;
849
if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
850
yych = *YYCURSOR;
851
if (yych <= '\n') {
852
853
854
if (yych <= 0x00) goto yy101;
if (yych <= '\t') goto yy102;
goto yy103;
855
} else {
856
857
if (yych == '\r') goto yy105;
goto yy102;
858
}
859
yy101:
860
++YYCURSOR;
861
862
863
864
865
866
867
868
869
870
{
if (eoi)
{
if (s->report_comments)
RET(TOKEN_SINGLE_COMMENT);
else
RET(TOKEN_EOI);
}
goto singlelinecomment;
}
871
yy102:
872
873
++YYCURSOR;
{ goto singlelinecomment; }
874
yy103:
875
++YYCURSOR;
876
yy104:
877
878
879
880
881
882
{
if (s->report_comments)
{
cursor = matchptr; // so we RET('\n') next.
RET(TOKEN_SINGLE_COMMENT);
}
883
s->line++;
884
885
886
token = matchptr;
RET('\n');
}
887
yy105:
888
yych = *++YYCURSOR;
889
890
if (yych == '\n') goto yy103;
goto yy104;
891
892
893
894
895
896
897
898
899
900
901
902
}
ppdirective:
if (YYLIMIT == YYCURSOR) YYFILL(1);
{
YYCTYPE yych;
unsigned int yyaccept = 0;
if ((YYLIMIT - YYCURSOR) < 8) YYFILL(8);
yych = *YYCURSOR;
if (yych <= '\f') {
903
904
if (yych == '\t') goto yy108;
if (yych >= '\v') goto yy108;
905
906
} else {
if (yych <= ' ') {
907
if (yych >= ' ') goto yy108;
908
} else {
909
if (yych == '#') goto yy109;
910
911
}
}
912
++YYCURSOR;
913
yy107:
914
915
916
917
918
{
token = cursor = (const uchar *) s->source;
limit = cursor + s->bytes_left;
goto scanner_loop;
}
919
yy108:
920
921
922
923
++YYCURSOR;
if (YYLIMIT <= YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
if (yych <= '\n') {
924
if (yych == '\t') goto yy108;
925
} else {
926
927
if (yych <= '\f') goto yy108;
if (yych == ' ') goto yy108;
928
}
929
{ goto ppdirective; }
930
yy109:
931
932
933
934
yyaccept = 0;
yych = *(YYMARKER = ++YYCURSOR);
if (yych <= 'h') {
if (yych <= 0x1F) {
935
936
if (yych == '\t') goto yy111;
goto yy107;
937
} else {
938
939
940
941
if (yych <= ' ') goto yy111;
if (yych <= 'c') goto yy107;
if (yych <= 'e') goto yy111;
goto yy107;
942
943
944
}
} else {
if (yych <= 'o') {
945
946
947
if (yych <= 'i') goto yy111;
if (yych == 'l') goto yy111;
goto yy107;
948
} else {
949
950
951
if (yych <= 'p') goto yy111;
if (yych == 'u') goto yy111;
goto yy107;
952
953
}
}
954
yy110:
955
++YYCURSOR;
956
if ((YYLIMIT - YYCURSOR) < 7) YYFILL(7);
957
yych = *YYCURSOR;
958
yy111:
959
960
if (yych <= 'h') {
if (yych <= ' ') {
961
962
if (yych == '\t') goto yy110;
if (yych >= ' ') goto yy110;
963
} else {
964
965
966
if (yych <= 'c') goto yy112;
if (yych <= 'd') goto yy113;
if (yych <= 'e') goto yy114;
967
968
}
} else {
969
if (yych <= 'o') {
970
971
if (yych <= 'i') goto yy115;
if (yych == 'l') goto yy116;
972
} else {
973
974
if (yych <= 'p') goto yy117;
if (yych == 'u') goto yy118;
975
976
}
}
977
yy112:
978
YYCURSOR = YYMARKER;
979
if (yyaccept == 0) {
980
goto yy107;
981
} else {
982
goto yy124;
983
}
984
yy113:
985
yych = *++YYCURSOR;
986
987
988
if (yych == 'e') goto yy119;
goto yy112;
yy114:
989
990
yych = *++YYCURSOR;
if (yych <= 'm') {
991
992
if (yych == 'l') goto yy120;
goto yy112;
993
} else {
994
995
996
if (yych <= 'n') goto yy121;
if (yych == 'r') goto yy122;
goto yy112;
997
}
998
yy115:
999
yych = *++YYCURSOR;
1000
if (yych == 'f') goto yy123;