1 /* Generated by re2c 1.1.1 on Fri Nov 2 07:35:40 2018 */
2 #line 1 "src/parser.re"
3 /*******************************************************************************
4 Copyright (c) 2016, Michael Wallner <mike@php.net>.
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are met:
10 * Redistributions of source code must retain the above copyright notice,
11 this list of conditions and the following disclaimer.
12 * Redistributions in binary form must reproduce the above copyright
13 notice, this list of conditions and the following disclaimer in the
14 documentation and/or other materials provided with the distribution.
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
20 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 *******************************************************************************/
28 #include "php_psi_stdinc.h"
34 #include <Zend/zend_smart_str.h>
41 # define YYMAXFILL 256
44 struct psi_parser
*psi_parser_init(struct psi_parser
*P
, psi_error_cb error
, unsigned flags
)
47 P
= malloc(sizeof(*P
));
49 memset(P
, 0, sizeof(*P
));
51 psi_data_ctor_with_dtors(PSI_DATA(P
), error
, flags
);
53 P
->preproc
= psi_cpp_init(P
);
55 psi_cpp_load_defaults(P
->preproc
);
60 struct psi_parser_input
*psi_parser_open_file(struct psi_parser
*P
, const char *filename
, bool report_errors
)
64 struct psi_parser_input
*fb
;
66 if (stat(filename
, &sb
)) {
68 P
->error(PSI_DATA(P
), NULL
, PSI_WARNING
,
69 "Could not stat '%s': %s",
70 filename
, strerror(errno
));
75 if (!(fb
= malloc(sizeof(*fb
) + sb
.st_size
+ YYMAXFILL
))) {
77 P
->error(PSI_DATA(P
), NULL
, PSI_WARNING
,
78 "Could not allocate %zu bytes for reading '%s': %s",
79 sb
.st_size
+ YYMAXFILL
, filename
, strerror(errno
));
84 if (!(fp
= fopen(filename
, "r"))) {
87 P
->error(PSI_DATA(P
), NULL
, PSI_WARNING
,
88 "Could not open '%s' for reading: %s",
89 filename
, strerror(errno
));
94 if (sb
.st_size
!= fread(fb
->buffer
, 1, sb
.st_size
, fp
)) {
98 P
->error(PSI_DATA(P
), NULL
, PSI_WARNING
,
99 "Could not read %zu bytes from '%s': %s",
100 sb
.st_size
+ YYMAXFILL
, filename
, strerror(errno
));
105 fb
->length
= sb
.st_size
;
106 fb
->file
= zend_string_init_interned(filename
, strlen(filename
), 1);
111 struct psi_parser_input
*psi_parser_open_string(struct psi_parser
*P
, const char *string
, size_t length
)
113 struct psi_parser_input
*sb
;
115 if (!(sb
= malloc(sizeof(*sb
) + length
+ YYMAXFILL
))) {
116 P
->error(PSI_DATA(P
), NULL
, PSI_WARNING
,
117 "Could not allocate %zu bytes: %s",
118 length
+ YYMAXFILL
, strerror(errno
));
122 memcpy(sb
->buffer
, string
, length
);
123 memset(sb
->buffer
+ length
, 0, YYMAXFILL
);
126 sb
->file
= zend_string_init_interned("<stdin>", strlen("<stdin>"), 1);
131 struct psi_plist
*psi_parser_preprocess(struct psi_parser
*P
, struct psi_plist
**tokens
)
133 if (psi_cpp_process(P
->preproc
, tokens
)) {
139 bool psi_parser_process(struct psi_parser
*P
, struct psi_plist
*tokens
, size_t *processed
)
141 if (psi_plist_count(tokens
)) {
142 return 0 == psi_parser_proc_parse(P
, tokens
, processed
);
147 void psi_parser_postprocess(struct psi_parser
*P
)
151 struct psi_validate_scope scope
= {0};
153 psi_validate_scope_ctor(&scope
);
154 scope
.defs
= &P
->preproc
->defs
;
157 P
->flags
|= PSI_SILENT
;
159 /* register const macros */
160 ZEND_HASH_FOREACH_STR_KEY_PTR(&P
->preproc
->defs
, name
, scope
.macro
)
162 if (scope
.macro
->sig
) {
163 } else if (scope
.macro
->exp
) {
164 if (psi_num_exp_validate(PSI_DATA(P
), scope
.macro
->exp
, &scope
)) {
165 struct psi_impl_type
*type
;
166 struct psi_impl_def_val
*def
;
167 struct psi_const
*cnst
;
168 struct psi_num_exp
*num
;
169 smart_str ns_name
= {0};
170 zend_string
*name_str
, *type_str
;
172 smart_str_appendl_ex(&ns_name
, ZEND_STRL("psi\\"), 1);
173 smart_str_append_ex(&ns_name
, name
, 1);
174 name_str
= smart_str_extract(&ns_name
);
175 type_str
= zend_string_init_interned(ZEND_STRL("<eval number>"), 1);
177 num
= psi_num_exp_copy(scope
.macro
->exp
);
178 def
= psi_impl_def_val_init(PSI_T_NUMBER
, num
);
179 type
= psi_impl_type_init(PSI_T_NUMBER
, type_str
);
180 cnst
= psi_const_init(type
, name_str
, def
);
181 P
->consts
= psi_plist_add(P
->consts
, &cnst
);
182 zend_string_release(name_str
);
183 zend_string_release(type_str
);
186 if (psi_plist_count(scope
.macro
->tokens
) == 1) {
189 if (psi_plist_get(scope
.macro
->tokens
, 0, &t
)) {
190 if (t
->type
== PSI_T_QUOTED_STRING
) {
191 struct psi_impl_type
*type
;
192 struct psi_impl_def_val
*def
;
193 struct psi_const
*cnst
;
194 smart_str ns_name
= {0};
195 zend_string
*name_str
, *type_str
;
197 smart_str_appendl_ex(&ns_name
, ZEND_STRL("psi\\"), 1);
198 smart_str_append_ex(&ns_name
, name
, 1);
199 name_str
= smart_str_extract(&ns_name
);
200 type_str
= zend_string_init_interned(ZEND_STRL("string"), 1);
202 type
= psi_impl_type_init(PSI_T_STRING
, type_str
);
203 def
= psi_impl_def_val_init(PSI_T_QUOTED_STRING
, t
->text
);
204 cnst
= psi_const_init(type
, name_str
, def
);
205 P
->consts
= psi_plist_add(P
->consts
, &cnst
);
206 zend_string_release(name_str
);
207 zend_string_release(type_str
);
213 ZEND_HASH_FOREACH_END();
217 psi_validate_scope_dtor(&scope
);
220 bool psi_parser_parse(struct psi_parser
*P
, struct psi_parser_input
*I
)
222 struct psi_plist
*scanned
, *preproc
;
223 size_t processed
= 0;
225 if (!(scanned
= psi_parser_scan(P
, I
))) {
229 if (!(preproc
= psi_parser_preprocess(P
, &scanned
))) {
230 psi_plist_free(scanned
);
234 if (!psi_parser_process(P
, preproc
, &processed
)) {
235 psi_plist_free(preproc
);
239 psi_parser_postprocess(P
);
241 psi_plist_free(preproc
);
245 void psi_parser_dtor(struct psi_parser
*P
)
247 psi_cpp_free(&P
->preproc
);
248 psi_data_dtor(PSI_DATA(P
));
250 memset(P
, 0, sizeof(*P
));
253 void psi_parser_free(struct psi_parser
**P
)
266 #define NEWTOKEN(t) \
267 if (t == PSI_T_COMMENT || t == PSI_T_WHITESPACE) { \
268 token = psi_token_init(t, "", 0, tok - eol + 1, I->lines, I->file); \
270 token = psi_token_init(t, tok, cur - tok, tok - eol + 1, I->lines, I->file); \
272 tokens = psi_plist_add(tokens, &token); \
273 if (P->flags & PSI_DEBUG) { \
274 fprintf(stderr, "PSI< "); \
275 psi_token_dump(2, token); \
279 struct psi_plist
*psi_parser_scan(struct psi_parser
*P
, struct psi_parser_input
*I
)
281 struct psi_plist
*tokens
;
282 struct psi_token
*token
;
283 const char *tok
, *cur
, *lim
, *mrk
, *eol
, *ctxmrk
;
288 PSI_DEBUG_PRINT(P
, "PSI: scanning %s\n", I
->file
->val
);
290 tok
= mrk
= eol
= cur
= I
->buffer
;
291 lim
= I
->buffer
+ I
->length
;
293 tokens
= psi_plist_init((psi_plist_dtor
) psi_token_free
);
303 #line 304 "src/parser.c"
306 unsigned int yyaccept
= 0;
307 if ((lim
- cur
) < 15) if (cur
>= lim
) goto done
;;
352 case '\'': goto yy20
;
403 case '\\': goto yy77
;
421 case '}': goto yy100
;
422 case '~': goto yy102
;
428 #line 469 "src/parser.re"
429 { NEWTOKEN(-2); goto error
; }
430 #line 431 "src/parser.c"
433 if (lim
<= cur
) if (cur
>= lim
) goto done
;;
442 #line 468 "src/parser.re"
443 { NEWTOKEN(PSI_T_WHITESPACE
); goto start
; }
444 #line 445 "src/parser.c"
447 #line 467 "src/parser.re"
448 { NEWTOKEN(PSI_T_EOL
); NEWLINE(); goto start
; }
449 #line 450 "src/parser.c"
453 case '=': goto yy104
;
457 #line 370 "src/parser.re"
458 { NEWTOKEN(PSI_T_NOT
); goto start
; }
459 #line 460 "src/parser.c"
462 #line 343 "src/parser.re"
463 { escaped
= false; tok
+= 1; goto string
; }
464 #line 465 "src/parser.c"
468 case '#': goto yy106
;
472 #line 353 "src/parser.re"
473 { NEWTOKEN(PSI_T_HASH
); goto start
; }
474 #line 475 "src/parser.c"
547 #line 371 "src/parser.re"
548 { NEWTOKEN(PSI_T_MODULO
); goto start
; }
549 #line 550 "src/parser.c"
553 case '&': goto yy111
;
557 #line 372 "src/parser.re"
558 { NEWTOKEN(PSI_T_AMPERSAND
); goto start
; }
559 #line 560 "src/parser.c"
562 #line 342 "src/parser.re"
563 { escaped
= false; tok
+= 1; goto character
; }
564 #line 565 "src/parser.c"
567 #line 354 "src/parser.re"
568 { NEWTOKEN(PSI_T_LPAREN
); goto start
; }
569 #line 570 "src/parser.c"
572 #line 355 "src/parser.re"
573 { NEWTOKEN(PSI_T_RPAREN
); goto start
; }
574 #line 575 "src/parser.c"
577 #line 368 "src/parser.re"
578 { NEWTOKEN(PSI_T_ASTERISK
); goto start
; }
579 #line 580 "src/parser.c"
582 yych
= *(mrk
= ++cur
);
584 case '.': goto yy113
;
598 #line 373 "src/parser.re"
599 { NEWTOKEN(PSI_T_PLUS
); goto start
; }
600 #line 601 "src/parser.c"
603 #line 357 "src/parser.re"
604 { NEWTOKEN(PSI_T_COMMA
); goto start
; }
605 #line 606 "src/parser.c"
608 yych
= *(mrk
= ++cur
);
610 case '.': goto yy113
;
624 #line 374 "src/parser.re"
625 { NEWTOKEN(PSI_T_MINUS
); goto start
; }
626 #line 627 "src/parser.c"
629 yych
= *(mrk
= ++cur
);
631 case '.': goto yy115
;
641 case '9': goto yy116
;
645 #line 385 "src/parser.re"
646 { NEWTOKEN(PSI_T_PERIOD
); goto start
; }
647 #line 648 "src/parser.c"
651 case '*': goto yy119
;
652 case '/': goto yy121
;
656 #line 375 "src/parser.re"
657 { NEWTOKEN(PSI_T_SLASH
); goto start
; }
658 #line 659 "src/parser.c"
661 yych
= *(mrk
= ++cur
);
663 case '.': goto yy123
;
665 case 'e': goto yy127
;
667 case 'x': goto yy132
;
671 #line 329 "src/parser.re"
672 { NEWTOKEN(PSI_T_NUMBER
); token
->flags
= PSI_NUMBER_INT
; goto start
; }
673 #line 674 "src/parser.c"
677 if ((lim
- cur
) < 3) if (cur
>= lim
) goto done
;;
680 case '.': goto yy123
;
692 case 'e': goto yy127
;
694 case 'l': goto yy128
;
696 case 'u': goto yy130
;
701 #line 358 "src/parser.re"
702 { NEWTOKEN(PSI_T_COLON
); goto start
; }
703 #line 704 "src/parser.c"
706 #line 356 "src/parser.re"
707 { NEWTOKEN(PSI_T_EOS
); goto start
; }
708 #line 709 "src/parser.c"
711 yych
= *(mrk
= ++cur
);
778 case 'z': goto yy133
;
779 case '<': goto yy135
;
780 case '=': goto yy137
;
784 #line 383 "src/parser.re"
785 { NEWTOKEN(PSI_T_LCHEVR
); goto start
; }
786 #line 787 "src/parser.c"
790 case '=': goto yy139
;
794 #line 367 "src/parser.re"
795 { NEWTOKEN(PSI_T_EQUALS
); goto start
; }
796 #line 797 "src/parser.c"
800 case '=': goto yy141
;
801 case '>': goto yy143
;
805 #line 384 "src/parser.re"
806 { NEWTOKEN(PSI_T_RCHEVR
); goto start
; }
807 #line 808 "src/parser.c"
810 #line 387 "src/parser.re"
811 { NEWTOKEN(PSI_T_IIF
); goto start
; }
812 #line 813 "src/parser.c"
815 yych
= *(mrk
= ++cur
);
818 case 'r': goto yy145
;
820 case 's': goto yy146
;
824 #line 462 "src/parser.re"
825 { NEWTOKEN(PSI_T_NAME
); goto start
; }
826 #line 827 "src/parser.c"
829 yych
= *(mrk
= ++cur
);
832 case 'o': goto yy149
;
837 yych
= *(mrk
= ++cur
);
840 case 'a': goto yy150
;
842 case 'o': goto yy151
;
847 yych
= *(mrk
= ++cur
);
850 case 'e': goto yy152
;
855 yych
= *(mrk
= ++cur
);
858 case 'l': goto yy153
;
860 case 'n': goto yy154
;
862 case 'r': goto yy155
;
867 yych
= *(mrk
= ++cur
);
870 case 'a': goto yy156
;
872 case 'l': goto yy157
;
874 case 'r': goto yy158
;
876 case 'u': goto yy159
;
882 if (lim
<= cur
) if (cur
>= lim
) goto done
;;
949 case 0x7F: goto yy55
;
950 case '\\': goto yy148
;
955 yych
= *(mrk
= ++cur
);
958 case 'f': goto yy160
;
960 case 'n': goto yy162
;
965 yych
= *(mrk
= ++cur
);
968 case '\'': goto yy163
;
970 case 'e': goto yy165
;
972 case 'i': goto yy166
;
977 yych
= *(mrk
= ++cur
);
980 case 'i': goto yy167
;
985 yych
= *(mrk
= ++cur
);
988 case 'u': goto yy168
;
993 yych
= *(mrk
= ++cur
);
996 case 'b': goto yy169
;
1001 yych
= *(mrk
= ++cur
);
1004 case 'a': goto yy170
;
1006 case 'o': goto yy171
;
1008 case 'r': goto yy172
;
1013 yych
= *(mrk
= ++cur
);
1016 case 'e': goto yy173
;
1021 yych
= *(mrk
= ++cur
);
1024 case 'e': goto yy174
;
1026 case 't': goto yy175
;
1031 yych
= *(mrk
= ++cur
);
1034 case 'e': goto yy176
;
1036 case 'o': goto yy177
;
1038 case 'r': goto yy178
;
1043 yych
= *(mrk
= ++cur
);
1046 case '\'': goto yy179
;
1048 case 'n': goto yy181
;
1053 yych
= *(mrk
= ++cur
);
1056 case 'a': goto yy182
;
1061 yych
= *(mrk
= ++cur
);
1064 case 'v': goto yy183
;
1069 #line 361 "src/parser.re"
1070 { NEWTOKEN(PSI_T_LBRACKET
); goto start
; }
1071 #line 1072 "src/parser.c"
1149 case 0x7F: goto yy78
;
1150 default: goto yy184
;
1153 #line 376 "src/parser.re"
1154 { NEWTOKEN(PSI_T_BSLASH
); goto start
; }
1155 #line 1156 "src/parser.c"
1158 #line 362 "src/parser.re"
1159 { NEWTOKEN(PSI_T_RBRACKET
); goto start
; }
1160 #line 1161 "src/parser.c"
1163 #line 378 "src/parser.re"
1164 { NEWTOKEN(PSI_T_CARET
); goto start
; }
1165 #line 1166 "src/parser.c"
1168 yych
= *(mrk
= ++cur
);
1170 case '_': goto yy187
;
1175 yych
= *(mrk
= ++cur
);
1177 case 'O': goto yy149
;
1178 case 'o': goto yy188
;
1183 yych
= *(mrk
= ++cur
);
1186 case 'a': goto yy150
;
1187 case 'O': goto yy151
;
1188 case 'h': goto yy189
;
1189 case 'o': goto yy190
;
1194 yych
= *(mrk
= ++cur
);
1197 case 'e': goto yy152
;
1198 case 'o': goto yy191
;
1203 yych
= *(mrk
= ++cur
);
1206 case 'l': goto yy153
;
1207 case 'N': goto yy154
;
1209 case 'r': goto yy155
;
1210 case 'n': goto yy192
;
1215 yych
= *(mrk
= ++cur
);
1218 case 'a': goto yy156
;
1219 case 'L': goto yy157
;
1221 case 'r': goto yy158
;
1223 case 'u': goto yy159
;
1224 case 'l': goto yy193
;
1229 yych
= *(mrk
= ++cur
);
1232 case 'f': goto yy160
;
1233 case 'N': goto yy162
;
1234 case 'n': goto yy194
;
1239 yych
= *(mrk
= ++cur
);
1242 case 'e': goto yy165
;
1243 case 'I': goto yy166
;
1244 case 'i': goto yy195
;
1245 case 'o': goto yy196
;
1250 yych
= *(mrk
= ++cur
);
1253 case 'a': goto yy170
;
1255 case 'o': goto yy171
;
1256 case 'R': goto yy172
;
1257 case 'r': goto yy197
;
1262 yych
= *(mrk
= ++cur
);
1265 case 'e': goto yy174
;
1266 case 'T': goto yy175
;
1267 case 'h': goto yy198
;
1268 case 'i': goto yy199
;
1269 case 't': goto yy200
;
1274 yych
= *(mrk
= ++cur
);
1277 case 'e': goto yy176
;
1279 case 'o': goto yy177
;
1281 case 'r': goto yy178
;
1282 case 'y': goto yy201
;
1287 yych
= *(mrk
= ++cur
);
1290 case '\'': goto yy202
;
1291 case '8': goto yy204
;
1292 case 'N': goto yy181
;
1293 case 'n': goto yy205
;
1298 yych
= *(mrk
= ++cur
);
1300 case 'o': goto yy206
;
1305 #line 359 "src/parser.re"
1306 { NEWTOKEN(PSI_T_LBRACE
); goto start
; }
1307 #line 1308 "src/parser.c"
1311 case '|': goto yy207
;
1315 #line 377 "src/parser.re"
1316 { NEWTOKEN(PSI_T_PIPE
); goto start
; }
1317 #line 1318 "src/parser.c"
1320 #line 360 "src/parser.re"
1321 { NEWTOKEN(PSI_T_RBRACE
); goto start
; }
1322 #line 1323 "src/parser.c"
1325 #line 369 "src/parser.re"
1326 { NEWTOKEN(PSI_T_TILDE
); goto start
; }
1327 #line 1328 "src/parser.c"
1330 #line 363 "src/parser.re"
1331 { NEWTOKEN(PSI_T_CMP_NE
); goto start
; }
1332 #line 1333 "src/parser.c"
1335 #line 352 "src/parser.re"
1336 { NEWTOKEN(PSI_T_CPP_PASTE
); goto start
; }
1337 #line 1338 "src/parser.c"
1340 if (lim
<= cur
) if (cur
>= lim
) goto done
;;
1407 case 0x7F: goto yy110
;
1408 default: goto yy108
;
1411 #line 464 "src/parser.re"
1412 { NEWTOKEN(PSI_T_DOLLAR_NAME
); goto start
; }
1413 #line 1414 "src/parser.c"
1416 #line 365 "src/parser.re"
1417 { NEWTOKEN(PSI_T_AND
); goto start
; }
1418 #line 1419 "src/parser.c"
1431 case '9': goto yy116
;
1432 default: goto yy114
;
1447 case 10: goto yy186
;
1448 case 11: goto yy242
;
1449 case 12: goto yy244
;
1450 case 13: goto yy253
;
1451 case 14: goto yy273
;
1452 case 15: goto yy305
;
1453 case 16: goto yy307
;
1454 case 17: goto yy313
;
1455 case 18: goto yy321
;
1456 case 19: goto yy333
;
1457 case 20: goto yy341
;
1458 case 21: goto yy345
;
1459 case 22: goto yy352
;
1460 case 23: goto yy354
;
1461 case 24: goto yy358
;
1462 case 25: goto yy361
;
1463 case 26: goto yy363
;
1464 case 27: goto yy373
;
1465 case 28: goto yy376
;
1466 case 29: goto yy383
;
1467 case 30: goto yy386
;
1468 case 31: goto yy388
;
1469 case 32: goto yy390
;
1470 case 33: goto yy394
;
1471 case 34: goto yy399
;
1472 case 35: goto yy417
;
1473 case 36: goto yy425
;
1474 case 37: goto yy428
;
1475 case 38: goto yy431
;
1476 case 39: goto yy437
;
1477 case 40: goto yy441
;
1478 case 41: goto yy446
;
1479 case 42: goto yy448
;
1480 case 43: goto yy452
;
1481 case 44: goto yy455
;
1482 case 45: goto yy457
;
1483 case 46: goto yy459
;
1484 case 47: goto yy464
;
1485 case 48: goto yy466
;
1486 case 49: goto yy468
;
1487 case 50: goto yy470
;
1488 case 51: goto yy472
;
1489 case 52: goto yy477
;
1490 case 53: goto yy487
;
1491 case 54: goto yy489
;
1492 case 55: goto yy491
;
1493 case 56: goto yy493
;
1494 case 57: goto yy495
;
1495 case 58: goto yy500
;
1496 case 59: goto yy504
;
1497 case 60: goto yy508
;
1498 case 61: goto yy510
;
1499 case 62: goto yy515
;
1500 case 63: goto yy520
;
1501 case 64: goto yy522
;
1502 case 65: goto yy530
;
1503 case 66: goto yy534
;
1504 case 67: goto yy536
;
1505 case 68: goto yy538
;
1506 case 69: goto yy540
;
1507 case 70: goto yy545
;
1508 case 71: goto yy547
;
1509 case 72: goto yy553
;
1510 case 73: goto yy558
;
1511 case 74: goto yy560
;
1512 case 75: goto yy565
;
1513 case 76: goto yy567
;
1514 case 77: goto yy575
;
1515 case 78: goto yy579
;
1516 case 79: goto yy583
;
1517 case 80: goto yy587
;
1518 case 81: goto yy589
;
1519 default: goto yy594
;
1524 case '.': goto yy209
;
1525 default: goto yy114
;
1530 if ((lim
- cur
) < 2) if (cur
>= lim
) goto done
;;
1542 case '9': goto yy116
;
1544 case 'd': goto yy211
;
1546 case 'f': goto yy212
;
1548 case 'l': goto yy214
;
1549 default: goto yy118
;
1552 #line 335 "src/parser.re"
1553 { NEWTOKEN(PSI_T_NUMBER
); token
->flags
= PSI_NUMBER_FLT
; goto start
; }
1554 #line 1555 "src/parser.c"
1557 #line 349 "src/parser.re"
1559 #line 1560 "src/parser.c"
1562 #line 350 "src/parser.re"
1563 { goto comment_sl
; }
1564 #line 1565 "src/parser.c"
1568 if ((lim
- cur
) < 3) if (cur
>= lim
) goto done
;;
1580 case '9': goto yy123
;
1582 case 'd': goto yy211
;
1584 case 'e': goto yy127
;
1586 case 'f': goto yy212
;
1588 case 'l': goto yy214
;
1589 default: goto yy118
;
1593 if ((lim
- cur
) < 3) if (cur
>= lim
) goto done
;;
1604 case '7': goto yy125
;
1606 case 'l': goto yy128
;
1608 case 'u': goto yy130
;
1615 case '-': goto yy113
;
1625 case '9': goto yy116
;
1626 default: goto yy114
;
1630 yych
= *(mrk
= ++cur
);
1633 case 'l': goto yy216
;
1635 case 'u': goto yy217
;
1636 default: goto yy129
;
1640 #line 331 "src/parser.re"
1641 { NEWTOKEN(PSI_T_NUMBER
); token
->flags
= PSI_NUMBER_INT
| PSI_NUMBER_L
; cur
+= 1; goto start
; }
1642 #line 1643 "src/parser.c"
1647 case 'l': goto yy219
;
1648 default: goto yy131
;
1652 #line 330 "src/parser.re"
1653 { NEWTOKEN(PSI_T_NUMBER
); token
->flags
= PSI_NUMBER_INT
| PSI_NUMBER_U
; cur
+= 1; goto start
; }
1654 #line 1655 "src/parser.c"
1679 case 'f': goto yy220
;
1680 default: goto yy114
;
1684 if (lim
<= cur
) if (cur
>= lim
) goto done
;;
1752 case 'z': goto yy133
;
1753 case '>': goto yy222
;
1754 default: goto yy114
;
1758 #line 379 "src/parser.re"
1759 { NEWTOKEN(PSI_T_LSHIFT
); goto start
; }
1760 #line 1761 "src/parser.c"
1763 #line 381 "src/parser.re"
1764 { NEWTOKEN(PSI_T_CMP_LE
); goto start
; }
1765 #line 1766 "src/parser.c"
1768 #line 364 "src/parser.re"
1769 { NEWTOKEN(PSI_T_CMP_EQ
); goto start
; }
1770 #line 1771 "src/parser.c"
1773 #line 382 "src/parser.re"
1774 { NEWTOKEN(PSI_T_CMP_GE
); goto start
; }
1775 #line 1776 "src/parser.c"
1778 #line 380 "src/parser.re"
1779 { NEWTOKEN(PSI_T_RSHIFT
); goto start
; }
1780 #line 1781 "src/parser.c"
1783 yych
= *(mrk
= ++cur
);
1786 case 'r': goto yy224
;
1791 yych
= *(mrk
= ++cur
);
1856 case 0x7F: goto yy147
;
1857 case '\\': goto yy148
;
1861 #line 442 "src/parser.re"
1862 { NEWTOKEN(PSI_T_AS
); goto start
; }
1863 #line 1864 "src/parser.c"
1866 if (lim
<= cur
) if (cur
>= lim
) goto done
;;
1943 case 0x7F: goto yy114
;
1944 default: goto yy184
;
1948 yych
= *(mrk
= ++cur
);
1951 case 'o': goto yy225
;
1956 yych
= *(mrk
= ++cur
);
1959 case 'l': goto yy226
;
1964 yych
= *(mrk
= ++cur
);
1967 case 'u': goto yy227
;
1972 yych
= *(mrk
= ++cur
);
1975 case 'f': goto yy228
;
1980 yych
= *(mrk
= ++cur
);
1983 case 'i': goto yy229
;
1985 case 's': goto yy230
;
1990 yych
= *(mrk
= ++cur
);
1993 case 'd': goto yy231
;
1998 yych
= *(mrk
= ++cur
);
2001 case 'r': goto yy232
;
2006 yych
= *(mrk
= ++cur
);
2009 case 'l': goto yy233
;
2014 yych
= *(mrk
= ++cur
);
2017 case 'o': goto yy234
;
2022 yych
= *(mrk
= ++cur
);
2025 case 'e': goto yy235
;
2030 yych
= *(mrk
= ++cur
);
2033 case 'n': goto yy236
;
2038 yych
= *(mrk
= ++cur
);
2103 case 0x7F: goto yy161
;
2105 case 'd': goto yy237
;
2107 case 'n': goto yy238
;
2108 case '\\': goto yy148
;
2112 #line 412 "src/parser.re"
2113 { NEWTOKEN(PSI_T_IF
); goto start
; }
2114 #line 2115 "src/parser.c"
2117 yych
= *(mrk
= ++cur
);
2120 case 'c': goto yy239
;
2122 case 't': goto yy240
;
2128 #line 347 "src/parser.re"
2129 { char_width
= sizeof(wchar_t)/8; }
2130 #line 2131 "src/parser.c"
2133 yych
= *(mrk
= ++cur
);
2136 case 't': goto yy241
;
2141 yych
= *(mrk
= ++cur
);
2144 case 'b': goto yy243
;
2149 yych
= *(mrk
= ++cur
);
2152 case 'x': goto yy245
;
2157 yych
= *(mrk
= ++cur
);
2160 case 'l': goto yy246
;
2165 yych
= *(mrk
= ++cur
);
2168 case 'j': goto yy247
;
2173 yych
= *(mrk
= ++cur
);
2176 case 't': goto yy248
;
2181 yych
= *(mrk
= ++cur
);
2184 case 's': goto yy249
;
2189 yych
= *(mrk
= ++cur
);
2192 case 'e': goto yy250
;
2197 yych
= *(mrk
= ++cur
);
2200 case 't': goto yy251
;
2205 yych
= *(mrk
= ++cur
);
2208 case 't': goto yy252
;
2213 yych
= *(mrk
= ++cur
);
2216 case 'a': goto yy254
;
2218 case 'r': goto yy255
;
2223 yych
= *(mrk
= ++cur
);
2226 case 'm': goto yy256
;
2231 yych
= *(mrk
= ++cur
);
2233 case '_': goto yy257
;
2238 yych
= *(mrk
= ++cur
);
2241 case 'u': goto yy258
;
2247 #line 346 "src/parser.re"
2249 #line 2250 "src/parser.c"
2252 yych
= *(mrk
= ++cur
);
2255 case 'd': goto yy259
;
2260 yych
= *(mrk
= ++cur
);
2263 case 'r': goto yy260
;
2268 yych
= *(mrk
= ++cur
);
2271 case 'a': goto yy261
;
2277 if (lim
<= cur
) if (cur
>= lim
) goto done
;;
2343 case 0x7F: goto yy186
;
2344 case '\\': goto yy148
;
2345 default: goto yy184
;
2348 #line 463 "src/parser.re"
2349 { NEWTOKEN(PSI_T_NSNAME
); goto start
; }
2350 #line 2351 "src/parser.c"
2353 yych
= *(mrk
= ++cur
);
2355 case 'a': goto yy262
;
2356 case 'e': goto yy263
;
2357 case 'i': goto yy264
;
2358 case 'r': goto yy265
;
2363 yych
= *(mrk
= ++cur
);
2365 case 'O': goto yy225
;
2366 case 'o': goto yy266
;
2371 yych
= *(mrk
= ++cur
);
2373 case 'a': goto yy267
;
2378 yych
= *(mrk
= ++cur
);
2381 case 'u': goto yy227
;
2382 case 'n': goto yy268
;
2387 yych
= *(mrk
= ++cur
);
2389 case 'u': goto yy269
;
2394 yych
= *(mrk
= ++cur
);
2397 case 'd': goto yy231
;
2398 case 'u': goto yy270
;
2403 yych
= *(mrk
= ++cur
);
2405 case 'O': goto yy234
;
2406 case 'o': goto yy271
;
2411 yych
= *(mrk
= ++cur
);
2414 case 'c': goto yy239
;
2415 case 'T': goto yy240
;
2416 case 't': goto yy272
;
2421 yych
= *(mrk
= ++cur
);
2424 case 'b': goto yy243
;
2425 case 'n': goto yy274
;
2430 yych
= *(mrk
= ++cur
);
2432 case 'n': goto yy275
;
2437 yych
= *(mrk
= ++cur
);
2440 case 'e': goto yy250
;
2441 case 'a': goto yy276
;
2446 yych
= *(mrk
= ++cur
);
2448 case 'o': goto yy277
;
2453 yych
= *(mrk
= ++cur
);
2455 case 'g': goto yy278
;
2456 case 'z': goto yy279
;
2461 yych
= *(mrk
= ++cur
);
2464 case 'a': goto yy254
;
2465 case 'R': goto yy255
;
2466 case 'r': goto yy280
;
2471 yych
= *(mrk
= ++cur
);
2473 case 'p': goto yy281
;
2479 #line 345 "src/parser.re"
2481 #line 2482 "src/parser.c"
2484 yych
= *(mrk
= ++cur
);
2486 case '"': goto yy282
;
2491 yych
= *(mrk
= ++cur
);
2494 case 'd': goto yy259
;
2495 case 'i': goto yy284
;
2496 case 's': goto yy285
;
2501 yych
= *(mrk
= ++cur
);
2503 case 'i': goto yy286
;
2504 case 'l': goto yy287
;
2509 #line 366 "src/parser.re"
2510 { NEWTOKEN(PSI_T_OR
); goto start
; }
2511 #line 2512 "src/parser.c"
2514 #line 386 "src/parser.re"
2515 { NEWTOKEN(PSI_T_ELLIPSIS
); goto start
; }
2516 #line 2517 "src/parser.c"
2521 case 'd': goto yy288
;
2523 case 'f': goto yy290
;
2525 case 'l': goto yy292
;
2526 default: goto yy114
;
2531 #line 336 "src/parser.re"
2532 { NEWTOKEN(PSI_T_NUMBER
); token
->flags
= PSI_NUMBER_FLT
| PSI_NUMBER_F
; cur
+= 1; goto start
; }
2533 #line 2534 "src/parser.c"
2537 #line 337 "src/parser.re"
2538 { NEWTOKEN(PSI_T_NUMBER
); token
->flags
= PSI_NUMBER_FLT
| PSI_NUMBER_L
; cur
+= 1; goto start
; }
2539 #line 2540 "src/parser.c"
2544 case 'u': goto yy294
;
2545 default: goto yy114
;
2551 #line 332 "src/parser.re"
2552 { NEWTOKEN(PSI_T_NUMBER
); token
->flags
= PSI_NUMBER_INT
| PSI_NUMBER_UL
; cur
+= 2; goto start
; }
2553 #line 2554 "src/parser.c"
2558 case 'l': goto yy294
;
2559 default: goto yy218
;
2564 if ((lim
- cur
) < 3) if (cur
>= lim
) goto done
;;
2567 case '.': goto yy296
;
2589 case 'f': goto yy220
;
2591 case 'l': goto yy128
;
2593 case 'p': goto yy127
;
2595 case 'u': goto yy130
;
2600 #line 465 "src/parser.re"
2601 { tok
+= 1; cur
-= 1; NEWTOKEN(PSI_T_CPP_HEADER
); cur
+= 1; goto start
; }
2602 #line 2603 "src/parser.c"
2605 yych
= *(mrk
= ++cur
);
2608 case 'a': goto yy298
;
2610 case 'v': goto yy299
;
2615 yych
= *(mrk
= ++cur
);
2618 case 'l': goto yy300
;
2623 yych
= *(mrk
= ++cur
);
2626 case 'l': goto yy301
;
2631 yych
= *(mrk
= ++cur
);
2634 case 'n': goto yy302
;
2639 yych
= *(mrk
= ++cur
);
2642 case 'i': goto yy303
;
2647 yych
= *(mrk
= ++cur
);
2650 case 'f': goto yy304
;
2655 yych
= *(mrk
= ++cur
);
2658 case 'e': goto yy306
;
2663 yych
= *(mrk
= ++cur
);
2666 case 'i': goto yy308
;
2671 yych
= *(mrk
= ++cur
);
2674 case 'o': goto yy309
;
2679 yych
= *(mrk
= ++cur
);
2682 case 's': goto yy310
;
2687 yych
= *(mrk
= ++cur
);
2690 case 'a': goto yy311
;
2695 yych
= *(mrk
= ++cur
);
2698 case 'e': goto yy312
;
2703 yych
= *(mrk
= ++cur
);
2706 case 'c': goto yy314
;
2711 yych
= *(mrk
= ++cur
);
2714 case 'e': goto yy315
;
2719 yych
= *(mrk
= ++cur
);
2722 case 'd': goto yy316
;
2727 yych
= *(mrk
= ++cur
);
2730 case 'l': goto yy317
;
2735 yych
= *(mrk
= ++cur
);
2738 case 'v': goto yy318
;
2743 yych
= *(mrk
= ++cur
);
2808 case 0x7F: goto yy242
;
2809 case '\\': goto yy148
;
2813 #line 437 "src/parser.re"
2814 { NEWTOKEN(PSI_T_LET
); goto start
; }
2815 #line 2816 "src/parser.c"
2818 yych
= *(mrk
= ++cur
);
2883 case 0x7F: goto yy244
;
2884 case '\\': goto yy148
;
2888 #line 436 "src/parser.re"
2889 { NEWTOKEN(PSI_T_LIB
); goto start
; }
2890 #line 2891 "src/parser.c"
2893 yych
= *(mrk
= ++cur
);
2896 case 'e': goto yy319
;
2901 yych
= *(mrk
= ++cur
);
2904 case 'l': goto yy320
;
2909 yych
= *(mrk
= ++cur
);
2912 case 'e': goto yy322
;
2914 case 'v': goto yy323
;
2919 yych
= *(mrk
= ++cur
);
2922 case 'h': goto yy324
;
2927 yych
= *(mrk
= ++cur
);
2930 case 't': goto yy325
;
2935 yych
= *(mrk
= ++cur
);
2937 case '_': goto yy326
;
2942 yych
= *(mrk
= ++cur
);
2945 case 'u': goto yy327
;
2950 yych
= *(mrk
= ++cur
);
3015 case 0x7F: goto yy253
;
3016 case '\\': goto yy148
;
3020 #line 438 "src/parser.re"
3021 { NEWTOKEN(PSI_T_SET
); goto start
; }
3022 #line 3023 "src/parser.c"
3025 yych
= *(mrk
= ++cur
);
3028 case 't': goto yy328
;
3033 yych
= *(mrk
= ++cur
);
3036 case 'i': goto yy329
;
3038 case 'l': goto yy330
;
3040 case 'v': goto yy331
;
3045 yych
= *(mrk
= ++cur
);
3048 case 'p': goto yy332
;
3053 yych
= *(mrk
= ++cur
);
3056 case 'a': goto yy334
;
3058 case 'b': goto yy335
;
3060 case 'f': goto yy336
;
3062 case 'i': goto yy337
;
3064 case 'o': goto yy338
;
3066 case 's': goto yy339
;
3071 yych
= *(mrk
= ++cur
);
3074 case 'e': goto yy340
;
3079 yych
= *(mrk
= ++cur
);
3082 case 'e': goto yy342
;
3087 yych
= *(mrk
= ++cur
);
3090 case 'n': goto yy343
;
3095 yych
= *(mrk
= ++cur
);
3098 case 'l': goto yy344
;
3103 yych
= *(mrk
= ++cur
);
3105 case 's': goto yy346
;
3106 case 't': goto yy347
;
3111 yych
= *(mrk
= ++cur
);
3113 case 'x': goto yy348
;
3118 yych
= *(mrk
= ++cur
);
3120 case 'n': goto yy349
;
3125 yych
= *(mrk
= ++cur
);
3127 case 'e': goto yy350
;
3132 yych
= *(mrk
= ++cur
);
3134 case 'L': goto yy300
;
3135 case 'l': goto yy351
;
3140 yych
= *(mrk
= ++cur
);
3142 case 'r': goto yy353
;
3147 yych
= *(mrk
= ++cur
);
3149 case 's': goto yy355
;
3154 yych
= *(mrk
= ++cur
);
3156 case 'b': goto yy356
;
3161 yych
= *(mrk
= ++cur
);
3163 case 'm': goto yy357
;