Merge branch 'slimconfigure'
[m6w6/ext-psi] / src / parser.c
index aad454662c76db8cda45113826d71f417198c7be..d9d7b58db666af94ab6fd180212db57952f58e32 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 1.0.2 on Mon Sep 11 16:12:23 2017 */
+/* Generated by re2c 1.0.2 on Tue Oct 24 14:53:03 2017 */
 #line 1 "src/parser.re"
 /*******************************************************************************
  Copyright (c) 2016, Michael Wallner <mike@php.net>.
@@ -200,6 +200,67 @@ bool psi_parser_process(struct psi_parser *P, struct psi_plist *tokens, size_t *
        return true;
 }
 
+void psi_parser_postprocess(struct psi_parser *P)
+{
+       unsigned flags;
+       zend_string *name;
+       struct psi_validate_scope scope = {0};
+
+       psi_validate_scope_ctor(&scope);
+       scope.defs = &P->preproc->defs;
+
+       flags = P->flags;
+       P->flags |= PSI_SILENT;
+
+       /* register const macros */
+       ZEND_HASH_FOREACH_STR_KEY_PTR(&P->preproc->defs, name, scope.macro)
+       {
+               if (scope.macro->sig) {
+               } else if (scope.macro->exp) {
+                       if (psi_num_exp_validate(PSI_DATA(P), scope.macro->exp, &scope)) {
+                               struct psi_impl_type *type;
+                               struct psi_impl_def_val *def;
+                               struct psi_const *cnst;
+                               struct psi_num_exp *num;
+                               char *name_str = malloc(name->len + sizeof("psi\\"));
+
+                               strcat(strcpy(name_str, "psi\\"), name->val);
+                               num = psi_num_exp_copy(scope.macro->exp);
+                               def = psi_impl_def_val_init(PSI_T_NUMBER, num);
+                               type = psi_impl_type_init(PSI_T_NUMBER, "<eval number>");
+                               cnst = psi_const_init(type, name_str, def);
+                               P->consts = psi_plist_add(P->consts, &cnst);
+                               free(name_str);
+                       }
+               } else {
+                       if (psi_plist_count(scope.macro->tokens) == 1) {
+                               struct psi_token *t;
+
+                               if (psi_plist_get(scope.macro->tokens, 0, &t)) {
+                                       if (t->type == PSI_T_QUOTED_STRING) {
+                                               struct psi_impl_type *type;
+                                               struct psi_impl_def_val *def;
+                                               struct psi_const *cnst;
+                                               char *name_str = malloc(name->len + sizeof("psi\\"));
+
+                                               strcat(strcpy(name_str, "psi\\"), name->val);
+                                               type = psi_impl_type_init(PSI_T_STRING, "string");
+                                               def = psi_impl_def_val_init(PSI_T_QUOTED_STRING, t->text);
+                                               cnst = psi_const_init(type, name_str, def);
+                                               P->consts = psi_plist_add(P->consts, &cnst);
+                                               free(name_str);
+                                       }
+                               }
+                       }
+               }
+       }
+       ZEND_HASH_FOREACH_END();
+
+       P->flags = flags;
+
+       psi_validate_scope_dtor(&scope);
+}
+
 bool psi_parser_parse(struct psi_parser *P, struct psi_parser_input *I)
 {
        struct psi_plist *scanned, *preproc;
@@ -219,6 +280,8 @@ bool psi_parser_parse(struct psi_parser *P, struct psi_parser_input *I)
                return false;
        }
 
+       psi_parser_postprocess(P);
+
        psi_plist_free(preproc);
        return true;
 }
@@ -253,7 +316,7 @@ void psi_parser_free(struct psi_parser **P)
        }
 
 union int_suffix {
-       char s[SIZEOF_UINT32_T];
+       char s[4];
        uint32_t i;
 };
 
@@ -278,8 +341,10 @@ struct psi_plist *psi_parser_scan(struct psi_parser *P, struct psi_parser_input
                ctxmrk = NULL;
                tok = cur;
 
+               (void) ctxmrk;
+
                
-#line 283 "src/parser.c"
+#line 348 "src/parser.c"
                {
                        unsigned char yych;
                        unsigned int yyaccept = 0;
@@ -404,9 +469,9 @@ struct psi_plist *psi_parser_scan(struct psi_parser *P, struct psi_parser_input
 yy2:
                        ++cur;
 yy3:
-#line 448 "src/parser.re"
+#line 513 "src/parser.re"
                        { NEWTOKEN(-2); goto error; }
-#line 410 "src/parser.c"
+#line 475 "src/parser.c"
 yy4:
                        ++cur;
                        if (lim <= cur) if (cur >= lim) goto done;;
@@ -418,14 +483,14 @@ yy4:
                        default:        goto yy6;
                        }
 yy6:
-#line 447 "src/parser.re"
+#line 512 "src/parser.re"
                        { NEWTOKEN(PSI_T_WHITESPACE); goto start; }
-#line 424 "src/parser.c"
+#line 489 "src/parser.c"
 yy7:
                        ++cur;
-#line 446 "src/parser.re"
+#line 511 "src/parser.re"
                        { NEWTOKEN(PSI_T_EOL); NEWLINE(); goto start; }
-#line 429 "src/parser.c"
+#line 494 "src/parser.c"
 yy9:
                        yych = *++cur;
                        switch (yych) {
@@ -433,14 +498,14 @@ yy9:
                        default:        goto yy10;
                        }
 yy10:
-#line 349 "src/parser.re"
+#line 414 "src/parser.re"
                        { NEWTOKEN(PSI_T_NOT); goto start; }
-#line 439 "src/parser.c"
+#line 504 "src/parser.c"
 yy11:
                        ++cur;
-#line 322 "src/parser.re"
+#line 387 "src/parser.re"
                        { escaped = false; tok += 1; goto string; }
-#line 444 "src/parser.c"
+#line 509 "src/parser.c"
 yy13:
                        yych = *++cur;
                        switch (yych) {
@@ -448,9 +513,9 @@ yy13:
                        default:        goto yy14;
                        }
 yy14:
-#line 332 "src/parser.re"
+#line 397 "src/parser.re"
                        { NEWTOKEN(PSI_T_HASH); goto start; }
-#line 454 "src/parser.c"
+#line 519 "src/parser.c"
 yy15:
                        yych = *++cur;
                        switch (yych) {
@@ -523,9 +588,9 @@ yy15:
                        }
 yy16:
                        ++cur;
-#line 350 "src/parser.re"
+#line 415 "src/parser.re"
                        { NEWTOKEN(PSI_T_MODULO); goto start; }
-#line 529 "src/parser.c"
+#line 594 "src/parser.c"
 yy18:
                        yych = *++cur;
                        switch (yych) {
@@ -533,29 +598,29 @@ yy18:
                        default:        goto yy19;
                        }
 yy19:
-#line 351 "src/parser.re"
+#line 416 "src/parser.re"
                        { NEWTOKEN(PSI_T_AMPERSAND); goto start; }
-#line 539 "src/parser.c"
+#line 604 "src/parser.c"
 yy20:
                        ++cur;
-#line 321 "src/parser.re"
+#line 386 "src/parser.re"
                        { escaped = false; tok += 1; goto character; }
-#line 544 "src/parser.c"
+#line 609 "src/parser.c"
 yy22:
                        ++cur;
-#line 333 "src/parser.re"
+#line 398 "src/parser.re"
                        { NEWTOKEN(PSI_T_LPAREN); goto start; }
-#line 549 "src/parser.c"
+#line 614 "src/parser.c"
 yy24:
                        ++cur;
-#line 334 "src/parser.re"
+#line 399 "src/parser.re"
                        { NEWTOKEN(PSI_T_RPAREN); goto start; }
-#line 554 "src/parser.c"
+#line 619 "src/parser.c"
 yy26:
                        ++cur;
-#line 347 "src/parser.re"
+#line 412 "src/parser.re"
                        { NEWTOKEN(PSI_T_ASTERISK); goto start; }
-#line 559 "src/parser.c"
+#line 624 "src/parser.c"
 yy28:
                        yyaccept = 0;
                        yych = *(mrk = ++cur);
@@ -574,14 +639,14 @@ yy28:
                        default:        goto yy29;
                        }
 yy29:
-#line 352 "src/parser.re"
+#line 417 "src/parser.re"
                        { NEWTOKEN(PSI_T_PLUS); goto start; }
-#line 580 "src/parser.c"
+#line 645 "src/parser.c"
 yy30:
                        ++cur;
-#line 336 "src/parser.re"
+#line 401 "src/parser.re"
                        { NEWTOKEN(PSI_T_COMMA); goto start; }
-#line 585 "src/parser.c"
+#line 650 "src/parser.c"
 yy32:
                        yyaccept = 1;
                        yych = *(mrk = ++cur);
@@ -600,9 +665,9 @@ yy32:
                        default:        goto yy33;
                        }
 yy33:
-#line 353 "src/parser.re"
+#line 418 "src/parser.re"
                        { NEWTOKEN(PSI_T_MINUS); goto start; }
-#line 606 "src/parser.c"
+#line 671 "src/parser.c"
 yy34:
                        yyaccept = 2;
                        yych = *(mrk = ++cur);
@@ -621,9 +686,9 @@ yy34:
                        default:        goto yy35;
                        }
 yy35:
-#line 364 "src/parser.re"
+#line 429 "src/parser.re"
                        { NEWTOKEN(PSI_T_PERIOD); goto start; }
-#line 627 "src/parser.c"
+#line 692 "src/parser.c"
 yy36:
                        yych = *++cur;
                        switch (yych) {
@@ -632,9 +697,9 @@ yy36:
                        default:        goto yy37;
                        }
 yy37:
-#line 354 "src/parser.re"
+#line 419 "src/parser.re"
                        { NEWTOKEN(PSI_T_SLASH); goto start; }
-#line 638 "src/parser.c"
+#line 703 "src/parser.c"
 yy38:
                        yyaccept = 3;
                        yych = *(mrk = ++cur);
@@ -647,9 +712,9 @@ yy38:
                        default:        goto yy126;
                        }
 yy39:
-#line 308 "src/parser.re"
+#line 373 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_INT; goto start; }
-#line 653 "src/parser.c"
+#line 718 "src/parser.c"
 yy40:
                        yyaccept = 3;
                        mrk = ++cur;
@@ -677,14 +742,14 @@ yy40:
                        }
 yy42:
                        ++cur;
-#line 337 "src/parser.re"
+#line 402 "src/parser.re"
                        { NEWTOKEN(PSI_T_COLON); goto start; }
-#line 683 "src/parser.c"
+#line 748 "src/parser.c"
 yy44:
                        ++cur;
-#line 335 "src/parser.re"
+#line 400 "src/parser.re"
                        { NEWTOKEN(PSI_T_EOS); goto start; }
-#line 688 "src/parser.c"
+#line 753 "src/parser.c"
 yy46:
                        yyaccept = 4;
                        yych = *(mrk = ++cur);
@@ -760,9 +825,9 @@ yy46:
                        default:        goto yy47;
                        }
 yy47:
-#line 362 "src/parser.re"
+#line 427 "src/parser.re"
                        { NEWTOKEN(PSI_T_LCHEVR); goto start; }
-#line 766 "src/parser.c"
+#line 831 "src/parser.c"
 yy48:
                        yych = *++cur;
                        switch (yych) {
@@ -770,9 +835,9 @@ yy48:
                        default:        goto yy49;
                        }
 yy49:
-#line 346 "src/parser.re"
+#line 411 "src/parser.re"
                        { NEWTOKEN(PSI_T_EQUALS); goto start; }
-#line 776 "src/parser.c"
+#line 841 "src/parser.c"
 yy50:
                        yych = *++cur;
                        switch (yych) {
@@ -781,14 +846,14 @@ yy50:
                        default:        goto yy51;
                        }
 yy51:
-#line 363 "src/parser.re"
+#line 428 "src/parser.re"
                        { NEWTOKEN(PSI_T_RCHEVR); goto start; }
-#line 787 "src/parser.c"
+#line 852 "src/parser.c"
 yy52:
                        ++cur;
-#line 366 "src/parser.re"
+#line 431 "src/parser.re"
                        { NEWTOKEN(PSI_T_IIF); goto start; }
-#line 792 "src/parser.c"
+#line 857 "src/parser.c"
 yy54:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -800,9 +865,9 @@ yy54:
                        default:        goto yy62;
                        }
 yy55:
-#line 441 "src/parser.re"
+#line 506 "src/parser.re"
                        { NEWTOKEN(PSI_T_NAME); goto start; }
-#line 806 "src/parser.c"
+#line 871 "src/parser.c"
 yy56:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -1045,9 +1110,9 @@ yy74:
                        }
 yy75:
                        ++cur;
-#line 340 "src/parser.re"
+#line 405 "src/parser.re"
                        { NEWTOKEN(PSI_T_LBRACKET); goto start; }
-#line 1051 "src/parser.c"
+#line 1116 "src/parser.c"
 yy77:
                        yych = *++cur;
                        switch (yych) {
@@ -1129,19 +1194,19 @@ yy77:
                        default:        goto yy184;
                        }
 yy78:
-#line 355 "src/parser.re"
+#line 420 "src/parser.re"
                        { NEWTOKEN(PSI_T_BSLASH); goto start; }
-#line 1135 "src/parser.c"
+#line 1200 "src/parser.c"
 yy79:
                        ++cur;
-#line 341 "src/parser.re"
+#line 406 "src/parser.re"
                        { NEWTOKEN(PSI_T_RBRACKET); goto start; }
-#line 1140 "src/parser.c"
+#line 1205 "src/parser.c"
 yy81:
                        ++cur;
-#line 357 "src/parser.re"
+#line 422 "src/parser.re"
                        { NEWTOKEN(PSI_T_CARET); goto start; }
-#line 1145 "src/parser.c"
+#line 1210 "src/parser.c"
 yy83:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -1281,9 +1346,9 @@ yy95:
                        }
 yy96:
                        ++cur;
-#line 338 "src/parser.re"
+#line 403 "src/parser.re"
                        { NEWTOKEN(PSI_T_LBRACE); goto start; }
-#line 1287 "src/parser.c"
+#line 1352 "src/parser.c"
 yy98:
                        yych = *++cur;
                        switch (yych) {
@@ -1291,29 +1356,29 @@ yy98:
                        default:        goto yy99;
                        }
 yy99:
-#line 356 "src/parser.re"
+#line 421 "src/parser.re"
                        { NEWTOKEN(PSI_T_PIPE); goto start; }
-#line 1297 "src/parser.c"
+#line 1362 "src/parser.c"
 yy100:
                        ++cur;
-#line 339 "src/parser.re"
+#line 404 "src/parser.re"
                        { NEWTOKEN(PSI_T_RBRACE); goto start; }
-#line 1302 "src/parser.c"
+#line 1367 "src/parser.c"
 yy102:
                        ++cur;
-#line 348 "src/parser.re"
+#line 413 "src/parser.re"
                        { NEWTOKEN(PSI_T_TILDE); goto start; }
-#line 1307 "src/parser.c"
+#line 1372 "src/parser.c"
 yy104:
                        ++cur;
-#line 342 "src/parser.re"
+#line 407 "src/parser.re"
                        { NEWTOKEN(PSI_T_CMP_NE); goto start; }
-#line 1312 "src/parser.c"
+#line 1377 "src/parser.c"
 yy106:
                        ++cur;
-#line 331 "src/parser.re"
+#line 396 "src/parser.re"
                        { NEWTOKEN(PSI_T_CPP_PASTE); goto start; }
-#line 1317 "src/parser.c"
+#line 1382 "src/parser.c"
 yy108:
                        ++cur;
                        if (lim <= cur) if (cur >= lim) goto done;;
@@ -1387,14 +1452,14 @@ yy108:
                        default:        goto yy108;
                        }
 yy110:
-#line 443 "src/parser.re"
+#line 508 "src/parser.re"
                        { NEWTOKEN(PSI_T_DOLLAR_NAME); goto start; }
-#line 1393 "src/parser.c"
+#line 1458 "src/parser.c"
 yy111:
                        ++cur;
-#line 344 "src/parser.re"
+#line 409 "src/parser.re"
                        { NEWTOKEN(PSI_T_AND); goto start; }
-#line 1398 "src/parser.c"
+#line 1463 "src/parser.c"
 yy113:
                        yych = *++cur;
                        switch (yych) {
@@ -1528,19 +1593,19 @@ yy116:
                        default:        goto yy118;
                        }
 yy118:
-#line 314 "src/parser.re"
+#line 379 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT; goto start; }
-#line 1534 "src/parser.c"
+#line 1599 "src/parser.c"
 yy119:
                        ++cur;
-#line 328 "src/parser.re"
+#line 393 "src/parser.re"
                        { goto comment; }
-#line 1539 "src/parser.c"
+#line 1604 "src/parser.c"
 yy121:
                        ++cur;
-#line 329 "src/parser.re"
+#line 394 "src/parser.re"
                        { goto comment_sl; }
-#line 1544 "src/parser.c"
+#line 1609 "src/parser.c"
 yy123:
                        yyaccept = 6;
                        mrk = ++cur;
@@ -1616,9 +1681,9 @@ yy128:
                        }
 yy129:
                        cur -= 1;
-#line 310 "src/parser.re"
+#line 375 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_INT | PSI_NUMBER_L; cur += 1; goto start; }
-#line 1622 "src/parser.c"
+#line 1687 "src/parser.c"
 yy130:
                        yych = *++cur;
                        switch (yych) {
@@ -1628,9 +1693,9 @@ yy130:
                        }
 yy131:
                        cur -= 1;
-#line 309 "src/parser.re"
+#line 374 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_INT | PSI_NUMBER_U; cur += 1; goto start; }
-#line 1634 "src/parser.c"
+#line 1699 "src/parser.c"
 yy132:
                        yych = *++cur;
                        switch (yych) {
@@ -1734,29 +1799,29 @@ yy133:
                        }
 yy135:
                        ++cur;
-#line 358 "src/parser.re"
+#line 423 "src/parser.re"
                        { NEWTOKEN(PSI_T_LSHIFT); goto start; }
-#line 1740 "src/parser.c"
+#line 1805 "src/parser.c"
 yy137:
                        ++cur;
-#line 360 "src/parser.re"
+#line 425 "src/parser.re"
                        { NEWTOKEN(PSI_T_CMP_LE); goto start; }
-#line 1745 "src/parser.c"
+#line 1810 "src/parser.c"
 yy139:
                        ++cur;
-#line 343 "src/parser.re"
+#line 408 "src/parser.re"
                        { NEWTOKEN(PSI_T_CMP_EQ); goto start; }
-#line 1750 "src/parser.c"
+#line 1815 "src/parser.c"
 yy141:
                        ++cur;
-#line 361 "src/parser.re"
+#line 426 "src/parser.re"
                        { NEWTOKEN(PSI_T_CMP_GE); goto start; }
-#line 1755 "src/parser.c"
+#line 1820 "src/parser.c"
 yy143:
                        ++cur;
-#line 359 "src/parser.re"
+#line 424 "src/parser.re"
                        { NEWTOKEN(PSI_T_RSHIFT); goto start; }
-#line 1760 "src/parser.c"
+#line 1825 "src/parser.c"
 yy145:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -1837,9 +1902,9 @@ yy146:
                        default:        goto yy61;
                        }
 yy147:
-#line 421 "src/parser.re"
+#line 486 "src/parser.re"
                        { NEWTOKEN(PSI_T_AS); goto start; }
-#line 1843 "src/parser.c"
+#line 1908 "src/parser.c"
 yy148:
                        ++cur;
                        if (lim <= cur) if (cur >= lim) goto done;;
@@ -2088,9 +2153,9 @@ yy160:
                        default:        goto yy61;
                        }
 yy161:
-#line 391 "src/parser.re"
+#line 456 "src/parser.re"
                        { NEWTOKEN(PSI_T_IF); goto start; }
-#line 2094 "src/parser.c"
+#line 2159 "src/parser.c"
 yy162:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -2104,9 +2169,9 @@ yy162:
 yy163:
                        ++cur;
                        cur -= 1;
-#line 326 "src/parser.re"
-                       { char_width = SIZEOF_WCHAR_T/8; }
-#line 2110 "src/parser.c"
+#line 391 "src/parser.re"
+                       { char_width = sizeof(wchar_t)/8; }
+#line 2175 "src/parser.c"
 yy165:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -2223,9 +2288,9 @@ yy178:
 yy179:
                        ++cur;
                        cur -= 1;
-#line 325 "src/parser.re"
+#line 390 "src/parser.re"
                        { char_width = 4; }
-#line 2229 "src/parser.c"
+#line 2294 "src/parser.c"
 yy181:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -2324,9 +2389,9 @@ yy184:
                        default:        goto yy184;
                        }
 yy186:
-#line 442 "src/parser.re"
+#line 507 "src/parser.re"
                        { NEWTOKEN(PSI_T_NSNAME); goto start; }
-#line 2330 "src/parser.c"
+#line 2395 "src/parser.c"
 yy187:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -2455,9 +2520,9 @@ yy201:
 yy202:
                        ++cur;
                        cur -= 1;
-#line 324 "src/parser.re"
+#line 389 "src/parser.re"
                        { char_width = 2; }
-#line 2461 "src/parser.c"
+#line 2526 "src/parser.c"
 yy204:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -2485,14 +2550,14 @@ yy206:
                        }
 yy207:
                        ++cur;
-#line 345 "src/parser.re"
+#line 410 "src/parser.re"
                        { NEWTOKEN(PSI_T_OR); goto start; }
-#line 2491 "src/parser.c"
+#line 2556 "src/parser.c"
 yy209:
                        ++cur;
-#line 365 "src/parser.re"
+#line 430 "src/parser.re"
                        { NEWTOKEN(PSI_T_ELLIPSIS); goto start; }
-#line 2496 "src/parser.c"
+#line 2561 "src/parser.c"
 yy211:
                        yych = *++cur;
                        switch (yych) {
@@ -2507,15 +2572,15 @@ yy211:
 yy212:
                        ++cur;
                        cur -= 1;
-#line 315 "src/parser.re"
+#line 380 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT | PSI_NUMBER_F; cur += 1; goto start; }
-#line 2513 "src/parser.c"
+#line 2578 "src/parser.c"
 yy214:
                        ++cur;
                        cur -= 1;
-#line 316 "src/parser.re"
+#line 381 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT | PSI_NUMBER_L; cur += 1; goto start; }
-#line 2519 "src/parser.c"
+#line 2584 "src/parser.c"
 yy216:
                        yych = *++cur;
                        switch (yych) {
@@ -2527,9 +2592,9 @@ yy217:
                        ++cur;
 yy218:
                        cur -= 2;
-#line 311 "src/parser.re"
+#line 376 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_INT | PSI_NUMBER_UL; cur += 2; goto start; }
-#line 2533 "src/parser.c"
+#line 2598 "src/parser.c"
 yy219:
                        yych = *++cur;
                        switch (yych) {
@@ -2576,9 +2641,9 @@ yy220:
                        }
 yy222:
                        ++cur;
-#line 444 "src/parser.re"
+#line 509 "src/parser.re"
                        { tok += 1; cur -= 1; NEWTOKEN(PSI_T_CPP_HEADER); cur += 1; goto start; }
-#line 2582 "src/parser.c"
+#line 2647 "src/parser.c"
 yy224:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -2789,9 +2854,9 @@ yy241:
                        default:        goto yy61;
                        }
 yy242:
-#line 416 "src/parser.re"
+#line 481 "src/parser.re"
                        { NEWTOKEN(PSI_T_LET); goto start; }
-#line 2795 "src/parser.c"
+#line 2860 "src/parser.c"
 yy243:
                        yyaccept = 12;
                        yych = *(mrk = ++cur);
@@ -2864,9 +2929,9 @@ yy243:
                        default:        goto yy61;
                        }
 yy244:
-#line 415 "src/parser.re"
+#line 480 "src/parser.re"
                        { NEWTOKEN(PSI_T_LIB); goto start; }
-#line 2870 "src/parser.c"
+#line 2935 "src/parser.c"
 yy245:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -2996,9 +3061,9 @@ yy252:
                        default:        goto yy61;
                        }
 yy253:
-#line 417 "src/parser.re"
+#line 482 "src/parser.re"
                        { NEWTOKEN(PSI_T_SET); goto start; }
-#line 3002 "src/parser.c"
+#line 3067 "src/parser.c"
 yy254:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -3224,9 +3289,9 @@ yy272:
                        default:        goto yy61;
                        }
 yy273:
-#line 385 "src/parser.re"
+#line 450 "src/parser.re"
                        { NEWTOKEN(PSI_T_INT); goto start; }
-#line 3230 "src/parser.c"
+#line 3295 "src/parser.c"
 yy274:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -3292,9 +3357,9 @@ yy281:
 yy282:
                        ++cur;
                        cur -= 1;
-#line 323 "src/parser.re"
+#line 388 "src/parser.re"
                        { char_width = 1; }
-#line 3298 "src/parser.c"
+#line 3363 "src/parser.c"
 yy284:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -3326,27 +3391,27 @@ yy287:
 yy288:
                        ++cur;
                        cur -= 2;
-#line 318 "src/parser.re"
+#line 383 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT | PSI_NUMBER_DD; cur += 2; goto start; }
-#line 3332 "src/parser.c"
+#line 3397 "src/parser.c"
 yy290:
                        ++cur;
                        cur -= 2;
-#line 317 "src/parser.re"
+#line 382 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT | PSI_NUMBER_DF; cur += 2; goto start; }
-#line 3338 "src/parser.c"
+#line 3403 "src/parser.c"
 yy292:
                        ++cur;
                        cur -= 2;
-#line 319 "src/parser.re"
+#line 384 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_FLT | PSI_NUMBER_DL; cur += 2; goto start; }
-#line 3344 "src/parser.c"
+#line 3409 "src/parser.c"
 yy294:
                        ++cur;
                        cur -= 3;
-#line 312 "src/parser.re"
+#line 377 "src/parser.re"
                        { NEWTOKEN(PSI_T_NUMBER); token->flags = PSI_NUMBER_INT | PSI_NUMBER_ULL; cur += 3; goto start; }
-#line 3350 "src/parser.c"
+#line 3415 "src/parser.c"
 yy296:
                        ++cur;
                        if ((lim - cur) < 3) if (cur >= lim) goto done;;
@@ -3502,9 +3567,9 @@ yy304:
                        default:        goto yy61;
                        }
 yy305:
-#line 395 "src/parser.re"
+#line 460 "src/parser.re"
                        { NEWTOKEN(PSI_T_ELIF); goto start; }
-#line 3508 "src/parser.c"
+#line 3573 "src/parser.c"
 yy306:
                        yyaccept = 16;
                        yych = *(mrk = ++cur);
@@ -3577,9 +3642,9 @@ yy306:
                        default:        goto yy61;
                        }
 yy307:
-#line 394 "src/parser.re"
+#line 459 "src/parser.re"
                        { NEWTOKEN(PSI_T_ELSE); goto start; }
-#line 3583 "src/parser.c"
+#line 3648 "src/parser.c"
 yy308:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -3684,9 +3749,9 @@ yy312:
                        default:        goto yy61;
                        }
 yy313:
-#line 422 "src/parser.re"
+#line 487 "src/parser.re"
                        { NEWTOKEN(PSI_T_FREE); goto start; }
-#line 3690 "src/parser.c"
+#line 3755 "src/parser.c"
 yy314:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -3807,9 +3872,9 @@ yy320:
                        default:        goto yy61;
                        }
 yy321:
-#line 406 "src/parser.re"
+#line 471 "src/parser.re"
                        { NEWTOKEN(PSI_T_NULL); goto start; }
-#line 3813 "src/parser.c"
+#line 3878 "src/parser.c"
 yy322:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -3961,9 +4026,9 @@ yy332:
                        default:        goto yy61;
                        }
 yy333:
-#line 423 "src/parser.re"
+#line 488 "src/parser.re"
                        { NEWTOKEN(PSI_T_TEMP); goto start; }
-#line 3967 "src/parser.c"
+#line 4032 "src/parser.c"
 yy334:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -4084,9 +4149,9 @@ yy340:
                        default:        goto yy61;
                        }
 yy341:
-#line 404 "src/parser.re"
+#line 469 "src/parser.re"
                        { NEWTOKEN(PSI_T_TRUE); goto start; }
-#line 4090 "src/parser.c"
+#line 4155 "src/parser.c"
 yy342:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -4175,9 +4240,9 @@ yy344:
                        default:        goto yy61;
                        }
 yy345:
-#line 432 "src/parser.re"
+#line 497 "src/parser.re"
                        { NEWTOKEN(PSI_T_ZVAL); goto start; }
-#line 4181 "src/parser.c"
+#line 4246 "src/parser.c"
 yy346:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -4287,9 +4352,9 @@ yy351:
                        default:        goto yy61;
                        }
 yy352:
-#line 382 "src/parser.re"
+#line 447 "src/parser.re"
                        { NEWTOKEN(PSI_T_BOOL); goto start; }
-#line 4293 "src/parser.c"
+#line 4358 "src/parser.c"
 yy353:
                        yyaccept = 23;
                        yych = *(mrk = ++cur);
@@ -4362,9 +4427,9 @@ yy353:
                        default:        goto yy61;
                        }
 yy354:
-#line 383 "src/parser.re"
+#line 448 "src/parser.re"
                        { NEWTOKEN(PSI_T_CHAR); goto start; }
-#line 4368 "src/parser.c"
+#line 4433 "src/parser.c"
 yy355:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -4451,9 +4516,9 @@ yy357:
                        default:        goto yy61;
                        }
 yy358:
-#line 379 "src/parser.re"
+#line 444 "src/parser.re"
                        { NEWTOKEN(PSI_T_ENUM); goto start; }
-#line 4457 "src/parser.c"
+#line 4522 "src/parser.c"
 yy359:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -4534,9 +4599,9 @@ yy360:
                        default:        goto yy61;
                        }
 yy361:
-#line 375 "src/parser.re"
+#line 440 "src/parser.re"
                        { NEWTOKEN(PSI_T_LINE); goto start; }
-#line 4540 "src/parser.c"
+#line 4605 "src/parser.c"
 yy362:
                        yyaccept = 26;
                        yych = *(mrk = ++cur);
@@ -4609,9 +4674,9 @@ yy362:
                        default:        goto yy61;
                        }
 yy363:
-#line 386 "src/parser.re"
+#line 451 "src/parser.re"
                        { NEWTOKEN(PSI_T_LONG); goto start; }
-#line 4615 "src/parser.c"
+#line 4680 "src/parser.c"
 yy364:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -4740,9 +4805,9 @@ yy372:
                        default:        goto yy61;
                        }
 yy373:
-#line 381 "src/parser.re"
+#line 446 "src/parser.re"
                        { NEWTOKEN(PSI_T_VOID); goto start; }
-#line 4746 "src/parser.c"
+#line 4811 "src/parser.c"
 yy374:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -4822,9 +4887,9 @@ yy375:
                        default:        goto yy61;
                        }
 yy376:
-#line 410 "src/parser.re"
+#line 475 "src/parser.re"
                        { NEWTOKEN(PSI_T_ARRAY); goto start; }
-#line 4828 "src/parser.c"
+#line 4893 "src/parser.c"
 yy377:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -4937,9 +5002,9 @@ yy382:
                        default:        goto yy61;
                        }
 yy383:
-#line 433 "src/parser.re"
+#line 498 "src/parser.re"
                        { NEWTOKEN(PSI_T_COUNT); goto start; }
-#line 4943 "src/parser.c"
+#line 5008 "src/parser.c"
 yy384:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -5020,9 +5085,9 @@ yy385:
                        default:        goto yy61;
                        }
 yy386:
-#line 396 "src/parser.re"
+#line 461 "src/parser.re"
                        { NEWTOKEN(PSI_T_ENDIF); goto start; }
-#line 5026 "src/parser.c"
+#line 5091 "src/parser.c"
 yy387:
                        yyaccept = 31;
                        yych = *(mrk = ++cur);
@@ -5095,9 +5160,9 @@ yy387:
                        default:        goto yy61;
                        }
 yy388:
-#line 401 "src/parser.re"
+#line 466 "src/parser.re"
                        { NEWTOKEN(PSI_T_ERROR); goto start; }
-#line 5101 "src/parser.c"
+#line 5166 "src/parser.c"
 yy389:
                        yyaccept = 32;
                        yych = *(mrk = ++cur);
@@ -5170,9 +5235,9 @@ yy389:
                        default:        goto yy61;
                        }
 yy390:
-#line 405 "src/parser.re"
+#line 470 "src/parser.re"
                        { NEWTOKEN(PSI_T_FALSE); goto start; }
-#line 5176 "src/parser.c"
+#line 5241 "src/parser.c"
 yy391:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -5261,9 +5326,9 @@ yy393:
                        default:        goto yy61;
                        }
 yy394:
-#line 392 "src/parser.re"
+#line 457 "src/parser.re"
                        { NEWTOKEN(PSI_T_IFDEF); goto start; }
-#line 5267 "src/parser.c"
+#line 5332 "src/parser.c"
 yy395:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -5360,9 +5425,9 @@ yy398:
                        default:        goto yy61;
                        }
 yy399:
-#line 407 "src/parser.re"
+#line 472 "src/parser.re"
                        { NEWTOKEN(PSI_T_MIXED); goto start; }
-#line 5366 "src/parser.c"
+#line 5431 "src/parser.c"
 yy400:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -5563,9 +5628,9 @@ yy416:
                        default:        goto yy61;
                        }
 yy417:
-#line 399 "src/parser.re"
+#line 464 "src/parser.re"
                        { NEWTOKEN(PSI_T_UNDEF); goto start; }
-#line 5569 "src/parser.c"
+#line 5634 "src/parser.c"
 yy418:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -5681,9 +5746,9 @@ yy424:
                        default:        goto yy61;
                        }
 yy425:
-#line 380 "src/parser.re"
+#line 445 "src/parser.re"
                        { NEWTOKEN(PSI_T_CONST); goto start; }
-#line 5687 "src/parser.c"
+#line 5752 "src/parser.c"
 yy426:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -5765,9 +5830,9 @@ yy427:
                        default:        goto yy61;
                        }
 yy428:
-#line 387 "src/parser.re"
+#line 452 "src/parser.re"
                        { NEWTOKEN(PSI_T_FLOAT); goto start; }
-#line 5771 "src/parser.c"
+#line 5836 "src/parser.c"
 yy429:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -5847,9 +5912,9 @@ yy430:
                        default:        goto yy61;
                        }
 yy431:
-#line 384 "src/parser.re"
+#line 449 "src/parser.re"
                        { NEWTOKEN(PSI_T_SHORT); goto start; }
-#line 5853 "src/parser.c"
+#line 5918 "src/parser.c"
 yy432:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -5950,9 +6015,9 @@ yy436:
                        default:        goto yy61;
                        }
 yy437:
-#line 378 "src/parser.re"
+#line 443 "src/parser.re"
                        { NEWTOKEN(PSI_T_UNION); goto start; }
-#line 5956 "src/parser.c"
+#line 6021 "src/parser.c"
 yy438:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -6039,9 +6104,9 @@ yy440:
                        default:        goto yy61;
                        }
 yy441:
-#line 430 "src/parser.re"
+#line 495 "src/parser.re"
                        { NEWTOKEN(PSI_T_ARRVAL); goto start; }
-#line 6045 "src/parser.c"
+#line 6110 "src/parser.c"
 yy442:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -6138,9 +6203,9 @@ yy445:
                        default:        goto yy61;
                        }
 yy446:
-#line 434 "src/parser.re"
+#line 499 "src/parser.re"
                        { NEWTOKEN(PSI_T_CALLOC); goto start; }
-#line 6144 "src/parser.c"
+#line 6209 "src/parser.c"
 yy447:
                        yyaccept = 42;
                        yych = *(mrk = ++cur);
@@ -6215,9 +6280,9 @@ yy447:
                        default:        goto yy61;
                        }
 yy448:
-#line 397 "src/parser.re"
+#line 462 "src/parser.re"
                        { NEWTOKEN(PSI_T_DEFINE); goto start; }
-#line 6221 "src/parser.c"
+#line 6286 "src/parser.c"
 yy449:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -6306,9 +6371,9 @@ yy451:
                        default:        goto yy61;
                        }
 yy452:
-#line 393 "src/parser.re"
+#line 458 "src/parser.re"
                        { NEWTOKEN(PSI_T_IFNDEF); goto start; }
-#line 6312 "src/parser.c"
+#line 6377 "src/parser.c"
 yy453:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -6389,9 +6454,9 @@ yy454:
                        default:        goto yy61;
                        }
 yy455:
-#line 427 "src/parser.re"
+#line 492 "src/parser.re"
                        { NEWTOKEN(PSI_T_INTVAL); goto start; }
-#line 6395 "src/parser.c"
+#line 6460 "src/parser.c"
 yy456:
                        yyaccept = 45;
                        yych = *(mrk = ++cur);
@@ -6464,9 +6529,9 @@ yy456:
                        default:        goto yy61;
                        }
 yy457:
-#line 411 "src/parser.re"
+#line 476 "src/parser.re"
                        { NEWTOKEN(PSI_T_OBJECT); goto start; }
-#line 6470 "src/parser.c"
+#line 6535 "src/parser.c"
 yy458:
                        yyaccept = 46;
                        yych = *(mrk = ++cur);
@@ -6539,9 +6604,9 @@ yy458:
                        default:        goto yy61;
                        }
 yy459:
-#line 431 "src/parser.re"
+#line 496 "src/parser.re"
                        { NEWTOKEN(PSI_T_OBJVAL); goto start; }
-#line 6545 "src/parser.c"
+#line 6610 "src/parser.c"
 yy460:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -6638,9 +6703,9 @@ yy463:
                        default:        goto yy61;
                        }
 yy464:
-#line 420 "src/parser.re"
+#line 485 "src/parser.re"
                        { NEWTOKEN(PSI_T_RETURN); goto start; }
-#line 6644 "src/parser.c"
+#line 6709 "src/parser.c"
 yy465:
                        yyaccept = 48;
                        yych = *(mrk = ++cur);
@@ -6713,9 +6778,9 @@ yy465:
                        default:        goto yy61;
                        }
 yy466:
-#line 413 "src/parser.re"
+#line 478 "src/parser.re"
                        { NEWTOKEN(PSI_T_STATIC); goto start; }
-#line 6719 "src/parser.c"
+#line 6784 "src/parser.c"
 yy467:
                        yyaccept = 49;
                        yych = *(mrk = ++cur);
@@ -6788,9 +6853,9 @@ yy467:
                        default:        goto yy61;
                        }
 yy468:
-#line 409 "src/parser.re"
+#line 474 "src/parser.re"
                        { NEWTOKEN(PSI_T_STRING); goto start; }
-#line 6794 "src/parser.c"
+#line 6859 "src/parser.c"
 yy469:
                        yyaccept = 50;
                        yych = *(mrk = ++cur);
@@ -6863,9 +6928,9 @@ yy469:
                        default:        goto yy61;
                        }
 yy470:
-#line 424 "src/parser.re"
+#line 489 "src/parser.re"
                        { NEWTOKEN(PSI_T_STRLEN); goto start; }
-#line 6869 "src/parser.c"
+#line 6934 "src/parser.c"
 yy471:
                        yyaccept = 51;
                        yych = *(mrk = ++cur);
@@ -6938,9 +7003,9 @@ yy471:
                        default:        goto yy61;
                        }
 yy472:
-#line 425 "src/parser.re"
+#line 490 "src/parser.re"
                        { NEWTOKEN(PSI_T_STRVAL); goto start; }
-#line 6944 "src/parser.c"
+#line 7009 "src/parser.c"
 yy473:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -7037,9 +7102,9 @@ yy476:
                        default:        goto yy61;
                        }
 yy477:
-#line 438 "src/parser.re"
+#line 503 "src/parser.re"
                        { NEWTOKEN(PSI_T_TO_INT); goto start; }
-#line 7043 "src/parser.c"
+#line 7108 "src/parser.c"
 yy478:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -7171,9 +7236,9 @@ yy486:
                        default:        goto yy61;
                        }
 yy487:
-#line 388 "src/parser.re"
+#line 453 "src/parser.re"
                        { NEWTOKEN(PSI_T_DOUBLE); goto start; }
-#line 7177 "src/parser.c"
+#line 7242 "src/parser.c"
 yy488:
                        yyaccept = 54;
                        yych = *(mrk = ++cur);
@@ -7246,9 +7311,9 @@ yy488:
                        default:        goto yy527;
                        }
 yy489:
-#line 367 "src/parser.re"
+#line 432 "src/parser.re"
                        { NEWTOKEN(PSI_T_PRAGMA); goto start; }
-#line 7252 "src/parser.c"
+#line 7317 "src/parser.c"
 yy490:
                        yyaccept = 55;
                        yych = *(mrk = ++cur);
@@ -7321,9 +7386,9 @@ yy490:
                        default:        goto yy61;
                        }
 yy491:
-#line 390 "src/parser.re"
+#line 455 "src/parser.re"
                        { NEWTOKEN(PSI_T_SIGNED); goto start; }
-#line 7327 "src/parser.c"
+#line 7392 "src/parser.c"
 yy492:
                        yyaccept = 56;
                        yych = *(mrk = ++cur);
@@ -7396,9 +7461,9 @@ yy492:
                        default:        goto yy61;
                        }
 yy493:
-#line 374 "src/parser.re"
+#line 439 "src/parser.re"
                        { NEWTOKEN(PSI_T_SIZEOF); goto start; }
-#line 7402 "src/parser.c"
+#line 7467 "src/parser.c"
 yy494:
                        yyaccept = 57;
                        yych = *(mrk = ++cur);
@@ -7471,9 +7536,9 @@ yy494:
                        default:        goto yy61;
                        }
 yy495:
-#line 377 "src/parser.re"
+#line 442 "src/parser.re"
                        { NEWTOKEN(PSI_T_STRUCT); goto start; }
-#line 7477 "src/parser.c"
+#line 7542 "src/parser.c"
 yy496:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -7567,9 +7632,9 @@ yy499:
                        default:        goto yy61;
                        }
 yy500:
-#line 429 "src/parser.re"
+#line 494 "src/parser.re"
                        { NEWTOKEN(PSI_T_BOOLVAL); goto start; }
-#line 7573 "src/parser.c"
+#line 7638 "src/parser.c"
 yy501:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -7658,9 +7723,9 @@ yy503:
                        default:        goto yy61;
                        }
 yy504:
-#line 398 "src/parser.re"
+#line 463 "src/parser.re"
                        { NEWTOKEN(PSI_T_DEFINED); goto start; }
-#line 7664 "src/parser.c"
+#line 7729 "src/parser.c"
 yy505:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -7750,9 +7815,9 @@ yy507:
                        default:        goto yy61;
                        }
 yy508:
-#line 402 "src/parser.re"
+#line 467 "src/parser.re"
                        { NEWTOKEN(PSI_T_INCLUDE); goto start; }
-#line 7756 "src/parser.c"
+#line 7821 "src/parser.c"
 yy509:
                        yyaccept = 61;
                        yych = *(mrk = ++cur);
@@ -7825,9 +7890,9 @@ yy509:
                        default:        goto yy61;
                        }
 yy510:
-#line 426 "src/parser.re"
+#line 491 "src/parser.re"
                        { NEWTOKEN(PSI_T_PATHVAL); goto start; }
-#line 7831 "src/parser.c"
+#line 7896 "src/parser.c"
 yy511:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -7924,9 +7989,9 @@ yy514:
                        default:        goto yy61;
                        }
 yy515:
-#line 440 "src/parser.re"
+#line 505 "src/parser.re"
                        { NEWTOKEN(PSI_T_TO_BOOL); goto start; }
-#line 7930 "src/parser.c"
+#line 7995 "src/parser.c"
 yy516:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -8023,9 +8088,9 @@ yy519:
                        default:        goto yy61;
                        }
 yy520:
-#line 400 "src/parser.re"
+#line 465 "src/parser.re"
                        { NEWTOKEN(PSI_T_WARNING); goto start; }
-#line 8029 "src/parser.c"
+#line 8094 "src/parser.c"
 yy521:
                        yyaccept = 64;
                        yych = *(mrk = ++cur);
@@ -8098,9 +8163,9 @@ yy521:
                        default:        goto yy61;
                        }
 yy522:
-#line 372 "src/parser.re"
+#line 437 "src/parser.re"
                        { NEWTOKEN(PSI_T_CPP_ASM); goto start; }
-#line 8104 "src/parser.c"
+#line 8169 "src/parser.c"
 yy523:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -8275,9 +8340,9 @@ yy529:
                        default:        goto yy61;
                        }
 yy530:
-#line 376 "src/parser.re"
+#line 441 "src/parser.re"
                        { NEWTOKEN(PSI_T_TYPEDEF); goto start; }
-#line 8281 "src/parser.c"
+#line 8346 "src/parser.c"
 yy531:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -8364,9 +8429,9 @@ yy533:
                        default:        goto yy61;
                        }
 yy534:
-#line 408 "src/parser.re"
+#line 473 "src/parser.re"
                        { NEWTOKEN(PSI_T_CALLABLE); goto start; }
-#line 8370 "src/parser.c"
+#line 8435 "src/parser.c"
 yy535:
                        yyaccept = 67;
                        yych = *(mrk = ++cur);
@@ -8439,9 +8504,9 @@ yy535:
                        default:        goto yy61;
                        }
 yy536:
-#line 412 "src/parser.re"
+#line 477 "src/parser.re"
                        { NEWTOKEN(PSI_T_CALLBACK); goto start; }
-#line 8445 "src/parser.c"
+#line 8510 "src/parser.c"
 yy537:
                        yyaccept = 68;
                        yych = *(mrk = ++cur);
@@ -8514,9 +8579,9 @@ yy537:
                        default:        goto yy61;
                        }
 yy538:
-#line 428 "src/parser.re"
+#line 493 "src/parser.re"
                        { NEWTOKEN(PSI_T_FLOATVAL); goto start; }
-#line 8520 "src/parser.c"
+#line 8585 "src/parser.c"
 yy539:
                        yyaccept = 69;
                        yych = *(mrk = ++cur);
@@ -8589,9 +8654,9 @@ yy539:
                        default:        goto yy61;
                        }
 yy540:
-#line 414 "src/parser.re"
+#line 479 "src/parser.re"
                        { NEWTOKEN(PSI_T_FUNCTION); goto start; }
-#line 8595 "src/parser.c"
+#line 8660 "src/parser.c"
 yy541:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -8688,9 +8753,9 @@ yy544:
                        default:        goto yy61;
                        }
 yy545:
-#line 436 "src/parser.re"
+#line 501 "src/parser.re"
                        { NEWTOKEN(PSI_T_TO_ARRAY); goto start; }
-#line 8694 "src/parser.c"
+#line 8759 "src/parser.c"
 yy546:
                        yyaccept = 71;
                        yych = *(mrk = ++cur);
@@ -8763,9 +8828,9 @@ yy546:
                        default:        goto yy61;
                        }
 yy547:
-#line 439 "src/parser.re"
+#line 504 "src/parser.re"
                        { NEWTOKEN(PSI_T_TO_FLOAT); goto start; }
-#line 8769 "src/parser.c"
+#line 8834 "src/parser.c"
 yy548:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -8868,9 +8933,9 @@ yy552:
                        default:        goto yy61;
                        }
 yy553:
-#line 369 "src/parser.re"
+#line 434 "src/parser.re"
                        { NEWTOKEN(PSI_T_CPP_INLINE); goto start; }
-#line 8874 "src/parser.c"
+#line 8939 "src/parser.c"
 yy554:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -9025,9 +9090,9 @@ yy557:
                        default:        goto yy61;
                        }
 yy558:
-#line 389 "src/parser.re"
+#line 454 "src/parser.re"
                        { NEWTOKEN(PSI_T_UNSIGNED); goto start; }
-#line 9031 "src/parser.c"
+#line 9096 "src/parser.c"
 yy559:
                        yyaccept = 74;
                        yych = *(mrk = ++cur);
@@ -9100,9 +9165,9 @@ yy559:
                        default:        goto yy61;
                        }
 yy560:
-#line 373 "src/parser.re"
+#line 438 "src/parser.re"
                        { NEWTOKEN(PSI_T_VOLATILE); goto start; }
-#line 9106 "src/parser.c"
+#line 9171 "src/parser.c"
 yy561:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -9199,9 +9264,9 @@ yy564:
                        default:        goto yy61;
                        }
 yy565:
-#line 435 "src/parser.re"
+#line 500 "src/parser.re"
                        { NEWTOKEN(PSI_T_TO_OBJECT); goto start; }
-#line 9205 "src/parser.c"
+#line 9270 "src/parser.c"
 yy566:
                        yyaccept = 76;
                        yych = *(mrk = ++cur);
@@ -9274,9 +9339,9 @@ yy566:
                        default:        goto yy61;
                        }
 yy567:
-#line 437 "src/parser.re"
+#line 502 "src/parser.re"
                        { NEWTOKEN(PSI_T_TO_STRING); goto start; }
-#line 9280 "src/parser.c"
+#line 9345 "src/parser.c"
 yy568:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -9461,9 +9526,9 @@ yy574:
                        default:        goto yy61;
                        }
 yy575:
-#line 418 "src/parser.re"
+#line 483 "src/parser.re"
                        { NEWTOKEN(PSI_T_PRE_ASSERT); goto start; }
-#line 9467 "src/parser.c"
+#line 9532 "src/parser.c"
 yy576:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -9550,9 +9615,9 @@ yy578:
                        default:        goto yy61;
                        }
 yy579:
-#line 370 "src/parser.re"
+#line 435 "src/parser.re"
                        { NEWTOKEN(PSI_T_CPP_RESTRICT); goto start; }
-#line 9556 "src/parser.c"
+#line 9621 "src/parser.c"
 yy580:
                        yyaccept = 5;
                        mrk = ++cur;
@@ -9708,9 +9773,9 @@ yy582:
                        default:        goto yy61;
                        }
 yy583:
-#line 419 "src/parser.re"
+#line 484 "src/parser.re"
                        { NEWTOKEN(PSI_T_POST_ASSERT); goto start; }
-#line 9714 "src/parser.c"
+#line 9779 "src/parser.c"
 yy584:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -9800,9 +9865,9 @@ yy586:
                        default:        goto yy527;
                        }
 yy587:
-#line 368 "src/parser.re"
+#line 433 "src/parser.re"
                        { NEWTOKEN(PSI_T_PRAGMA_ONCE); goto start; }
-#line 9806 "src/parser.c"
+#line 9871 "src/parser.c"
 yy588:
                        yyaccept = 81;
                        yych = *(mrk = ++cur);
@@ -9875,9 +9940,9 @@ yy588:
                        default:        goto yy61;
                        }
 yy589:
-#line 403 "src/parser.re"
+#line 468 "src/parser.re"
                        { NEWTOKEN(PSI_T_INCLUDE_NEXT); goto start; }
-#line 9881 "src/parser.c"
+#line 9946 "src/parser.c"
 yy590:
                        yyaccept = 5;
                        yych = *(mrk = ++cur);
@@ -9974,9 +10039,9 @@ yy593:
                        default:        goto yy61;
                        }
 yy594:
-#line 371 "src/parser.re"
+#line 436 "src/parser.re"
                        { NEWTOKEN(PSI_T_CPP_EXTENSION); goto start; }
-#line 9980 "src/parser.c"
+#line 10045 "src/parser.c"
 yy595:
                        ++cur;
                        if ((lim - cur) < 2) if (cur >= lim) goto done;;
@@ -9996,16 +10061,16 @@ yy597:
                        }
 yy598:
                        ++cur;
-#line 445 "src/parser.re"
+#line 510 "src/parser.re"
                        { parens = 2; goto cpp_attribute; }
-#line 10002 "src/parser.c"
+#line 10067 "src/parser.c"
                }
-#line 451 "src/parser.re"
+#line 516 "src/parser.re"
 
 
        character: ;
                
-#line 10009 "src/parser.c"
+#line 10074 "src/parser.c"
                {
                        unsigned char yych;
                        if (lim <= cur) if (cur >= lim) goto done;;
@@ -10019,17 +10084,17 @@ yy598:
                        }
 yy602:
                        ++cur;
-#line 469 "src/parser.re"
+#line 534 "src/parser.re"
                        { escaped = false; goto character; }
-#line 10025 "src/parser.c"
+#line 10090 "src/parser.c"
 yy604:
                        ++cur;
-#line 456 "src/parser.re"
+#line 521 "src/parser.re"
                        { NEWLINE(); goto character; }
-#line 10030 "src/parser.c"
+#line 10095 "src/parser.c"
 yy606:
                        ++cur;
-#line 458 "src/parser.re"
+#line 523 "src/parser.re"
                        {
                        if (escaped) {
                                escaped = false;
@@ -10041,19 +10106,19 @@ yy606:
                        token->flags = char_width;
                        goto start;
                }
-#line 10045 "src/parser.c"
+#line 10110 "src/parser.c"
 yy608:
                        ++cur;
-#line 457 "src/parser.re"
+#line 522 "src/parser.re"
                        { escaped = !escaped;  goto character; }
-#line 10050 "src/parser.c"
+#line 10115 "src/parser.c"
                }
-#line 471 "src/parser.re"
+#line 536 "src/parser.re"
 
 
        string: ;
                
-#line 10057 "src/parser.c"
+#line 10122 "src/parser.c"
                {
                        unsigned char yych;
                        if (lim <= cur) if (cur >= lim) goto done;;
@@ -10067,17 +10132,17 @@ yy608:
                        }
 yy612:
                        ++cur;
-#line 489 "src/parser.re"
+#line 554 "src/parser.re"
                        { escaped = false; goto string; }
-#line 10073 "src/parser.c"
+#line 10138 "src/parser.c"
 yy614:
                        ++cur;
-#line 476 "src/parser.re"
+#line 541 "src/parser.re"
                        { NEWLINE(); goto string; }
-#line 10078 "src/parser.c"
+#line 10143 "src/parser.c"
 yy616:
                        ++cur;
-#line 478 "src/parser.re"
+#line 543 "src/parser.re"
                        {
                        if (escaped) {
                                escaped = false;
@@ -10089,19 +10154,19 @@ yy616:
                        token->flags = char_width;
                        goto start;
                }
-#line 10093 "src/parser.c"
+#line 10158 "src/parser.c"
 yy618:
                        ++cur;
-#line 477 "src/parser.re"
+#line 542 "src/parser.re"
                        { escaped = !escaped; goto string; }
-#line 10098 "src/parser.c"
+#line 10163 "src/parser.c"
                }
-#line 491 "src/parser.re"
+#line 556 "src/parser.re"
 
 
        comment: ;
                
-#line 10105 "src/parser.c"
+#line 10170 "src/parser.c"
                {
                        unsigned char yych;
                        if ((lim - cur) < 2) if (cur >= lim) goto done;;
@@ -10115,14 +10180,14 @@ yy618:
 yy622:
                        ++cur;
 yy623:
-#line 498 "src/parser.re"
+#line 563 "src/parser.re"
                        { goto comment; }
-#line 10121 "src/parser.c"
+#line 10186 "src/parser.c"
 yy624:
                        ++cur;
-#line 496 "src/parser.re"
+#line 561 "src/parser.re"
                        { NEWLINE(); goto comment; }
-#line 10126 "src/parser.c"
+#line 10191 "src/parser.c"
 yy626:
                        yych = *++cur;
                        switch (yych) {
@@ -10131,16 +10196,16 @@ yy626:
                        }
 yy627:
                        ++cur;
-#line 497 "src/parser.re"
+#line 562 "src/parser.re"
                        { NEWTOKEN(PSI_T_COMMENT); goto start; }
-#line 10137 "src/parser.c"
+#line 10202 "src/parser.c"
                }
-#line 500 "src/parser.re"
+#line 565 "src/parser.re"
 
 
        comment_sl: ;
                
-#line 10144 "src/parser.c"
+#line 10209 "src/parser.c"
                {
                        unsigned char yych;
                        if (lim <= cur) if (cur >= lim) goto done;;
@@ -10152,22 +10217,22 @@ yy627:
                        }
 yy631:
                        ++cur;
-#line 506 "src/parser.re"
+#line 571 "src/parser.re"
                        { goto comment_sl; }
-#line 10158 "src/parser.c"
+#line 10223 "src/parser.c"
 yy633:
                        ++cur;
-#line 505 "src/parser.re"
+#line 570 "src/parser.re"
                        { NEWTOKEN(PSI_T_COMMENT); NEWLINE(); goto start; }
-#line 10163 "src/parser.c"
+#line 10228 "src/parser.c"
                }
-#line 508 "src/parser.re"
+#line 573 "src/parser.re"
 
 
        cpp_attribute: ;
 
                
-#line 10171 "src/parser.c"
+#line 10236 "src/parser.c"
                {
                        unsigned char yych;
                        if (lim <= cur) if (cur >= lim) goto done;;
@@ -10181,26 +10246,26 @@ yy633:
                        }
 yy637:
                        ++cur;
-#line 517 "src/parser.re"
+#line 582 "src/parser.re"
                        { goto cpp_attribute; }
-#line 10187 "src/parser.c"
+#line 10252 "src/parser.c"
 yy639:
                        ++cur;
-#line 516 "src/parser.re"
+#line 581 "src/parser.re"
                        { NEWLINE(); goto cpp_attribute; }
-#line 10192 "src/parser.c"
+#line 10257 "src/parser.c"
 yy641:
                        ++cur;
-#line 514 "src/parser.re"
+#line 579 "src/parser.re"
                        { ++parens; goto cpp_attribute; }
-#line 10197 "src/parser.c"
+#line 10262 "src/parser.c"
 yy643:
                        ++cur;
-#line 515 "src/parser.re"
+#line 580 "src/parser.re"
                        { if (parens == 1) { NEWTOKEN(PSI_T_CPP_ATTRIBUTE); goto start; } else { --parens; goto cpp_attribute; } }
-#line 10202 "src/parser.c"
+#line 10267 "src/parser.c"
                }
-#line 519 "src/parser.re"
+#line 584 "src/parser.re"
 
 error: ;