]> granicus.if.org Git - re2c/commitdiff
Use tags to lex condition goto.
authorUlya Trofimovich <skvadrik@gmail.com>
Wed, 21 Nov 2018 22:03:12 +0000 (22:03 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Wed, 21 Nov 2018 22:04:19 +0000 (22:04 +0000)
re2c/bootstrap/src/ast/lex.cc
re2c/src/ast/lex.re
re2c/src/ast/scanner.h

index d16079453c6d873c6224cb7efdd7a06637d86805..5971906e0e8169212d83ad160973fe9d0b5dd22d 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 1.1.1 on Wed Nov 21 00:09:57 2018 */
+/* Generated by re2c 1.1.1 on Wed Nov 21 08:27:30 2018 */
 #line 1 "../src/ast/lex.re"
 #include "src/util/c99_stdint.h"
 #include <stddef.h>
@@ -1135,7 +1135,7 @@ scan:
 yy201:
        ++YYCURSOR;
 yy202:
-#line 354 "../src/ast/lex.re"
+#line 357 "../src/ast/lex.re"
        {
         fatal_lc(get_cline(), get_column(), "unexpected character: '%c'", *tok);
         goto scan;
@@ -1148,7 +1148,7 @@ yy203:
        if (yybm[0+yych] & 16) {
                goto yy203;
        }
-#line 335 "../src/ast/lex.re"
+#line 338 "../src/ast/lex.re"
        { goto scan; }
 #line 1154 "src/ast/lex.cc"
 yy206:
@@ -1161,7 +1161,7 @@ yy206:
                if (yych == '#') goto yy236;
        }
 yy207:
-#line 342 "../src/ast/lex.re"
+#line 345 "../src/ast/lex.re"
        {
         pos = cur;
         cline++;
@@ -1180,7 +1180,7 @@ yy208:
        goto yy202;
 yy209:
        ++YYCURSOR;
-#line 253 "../src/ast/lex.re"
+#line 256 "../src/ast/lex.re"
        { yylval.regexp = lex_str('"'); return TOKEN_REGEXP; }
 #line 1186 "src/ast/lex.cc"
 yy211:
@@ -1200,13 +1200,13 @@ yy212:
        goto yy202;
 yy213:
        ++YYCURSOR;
-#line 252 "../src/ast/lex.re"
+#line 255 "../src/ast/lex.re"
        { yylval.regexp = lex_str('\''); return TOKEN_REGEXP; }
 #line 1206 "src/ast/lex.cc"
 yy215:
        ++YYCURSOR;
 yy216:
-#line 263 "../src/ast/lex.re"
+#line 266 "../src/ast/lex.re"
        { return *tok; }
 #line 1212 "src/ast/lex.cc"
 yy217:
@@ -1215,7 +1215,7 @@ yy217:
        goto yy216;
 yy218:
        ++YYCURSOR;
-#line 330 "../src/ast/lex.re"
+#line 333 "../src/ast/lex.re"
        {
         yylval.regexp = ast_dot(cline, get_column());
         return TOKEN_REGEXP;
@@ -1232,11 +1232,12 @@ yy221:
        goto yy202;
 yy222:
        ++YYCURSOR;
-#line 245 "../src/ast/lex.re"
+#line 248 "../src/ast/lex.re"
        { return lex_clist(); }
 #line 1238 "src/ast/lex.cc"
 yy224:
-       yych = (YYCTYPE)*++YYCURSOR;
+       yyaccept = 1;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych == '>') goto yy249;
        goto yy216;
 yy225:
@@ -1247,7 +1248,7 @@ yy226:
        if (yybm[0+yych] & 32) {
                goto yy225;
        }
-#line 307 "../src/ast/lex.re"
+#line 310 "../src/ast/lex.re"
        {
         if (!globopts->FFlag || lex_namedef_context_re2c()) {
             yylval.str = new std::string (tok, tok_len());
@@ -1270,19 +1271,19 @@ yy226:
             return TOKEN_REGEXP;
         }
     }
-#line 1274 "src/ast/lex.cc"
+#line 1275 "src/ast/lex.cc"
 yy228:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '^') goto yy251;
-#line 254 "../src/ast/lex.re"
+#line 257 "../src/ast/lex.re"
        { yylval.regexp = lex_cls(false); return TOKEN_REGEXP; }
-#line 1280 "src/ast/lex.cc"
+#line 1281 "src/ast/lex.cc"
 yy230:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'e') goto yy253;
        goto yy226;
 yy231:
-       yyaccept = 1;
+       yyaccept = 2;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yybm[0+yych] & 64) {
                goto yy256;
@@ -1301,7 +1302,7 @@ yy231:
 yy232:
 #line 240 "../src/ast/lex.re"
        { lex_code_in_braces(); return TOKEN_CODE; }
-#line 1305 "src/ast/lex.cc"
+#line 1306 "src/ast/lex.cc"
 yy233:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -1314,14 +1315,22 @@ yy233:
        }
 yy235:
        YYCURSOR = YYMARKER;
-       if (yyaccept <= 1) {
-               if (yyaccept == 0) {
-                       goto yy207;
+       if (yyaccept <= 2) {
+               if (yyaccept <= 1) {
+                       if (yyaccept == 0) {
+                               goto yy207;
+                       } else {
+                               goto yy216;
+                       }
                } else {
                        goto yy232;
                }
        } else {
-               goto yy255;
+               if (yyaccept == 3) {
+                       goto yy248;
+               } else {
+                       goto yy255;
+               }
        }
 yy236:
        ++YYCURSOR;
@@ -1352,57 +1361,84 @@ yy238:
                }
        }
 yy240:
-#line 257 "../src/ast/lex.re"
+#line 260 "../src/ast/lex.re"
        {
         const std::string *name = new std::string(tok + 1, tok_len() - 1);
         yylval.regexp = ast_tag(cline, get_column(), name, tok[0] == '#');
         return TOKEN_REGEXP;
     }
-#line 1362 "src/ast/lex.cc"
+#line 1371 "src/ast/lex.cc"
 yy241:
        ++YYCURSOR;
-#line 250 "../src/ast/lex.re"
+#line 253 "../src/ast/lex.re"
        { tok = cur; return 0; }
-#line 1367 "src/ast/lex.cc"
+#line 1376 "src/ast/lex.cc"
 yy243:
        ++YYCURSOR;
-#line 248 "../src/ast/lex.re"
+#line 251 "../src/ast/lex.re"
        { lex_c_comment(); goto scan; }
-#line 1372 "src/ast/lex.cc"
+#line 1381 "src/ast/lex.cc"
 yy245:
        ++YYCURSOR;
-#line 247 "../src/ast/lex.re"
+#line 250 "../src/ast/lex.re"
        { lex_cpp_comment(); goto scan; }
-#line 1377 "src/ast/lex.cc"
+#line 1386 "src/ast/lex.cc"
 yy247:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '>') goto yy261;
+       yyaccept = 3;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych == '>') goto yy249;
+yy248:
 #line 241 "../src/ast/lex.re"
        { lex_code_indented(); return TOKEN_CODE; }
-#line 1383 "src/ast/lex.cc"
+#line 1394 "src/ast/lex.cc"
 yy249:
        ++YYCURSOR;
-#line 243 "../src/ast/lex.re"
-       { lex_cgoto(); return TOKEN_CNEXT; }
-#line 1388 "src/ast/lex.cc"
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = (YYCTYPE)*YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '\t') {
+                       if (yych <= 0x08) goto yy235;
+                       goto yy249;
+               } else {
+                       if (yych == ' ') goto yy249;
+                       goto yy235;
+               }
+       } else {
+               if (yych <= '_') {
+                       if (yych <= 'Z') {
+                               yyt1 = YYCURSOR;
+                               goto yy261;
+                       }
+                       if (yych <= '^') goto yy235;
+                       yyt1 = YYCURSOR;
+                       goto yy261;
+               } else {
+                       if (yych <= '`') goto yy235;
+                       if (yych <= 'z') {
+                               yyt1 = YYCURSOR;
+                               goto yy261;
+                       }
+                       goto yy235;
+               }
+       }
 yy251:
        ++YYCURSOR;
-#line 255 "../src/ast/lex.re"
+#line 258 "../src/ast/lex.re"
        { yylval.regexp = lex_cls(true);  return TOKEN_REGEXP; }
-#line 1393 "src/ast/lex.cc"
+#line 1429 "src/ast/lex.cc"
 yy253:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '2') goto yy263;
+       if (yych == '2') goto yy264;
        goto yy226;
 yy254:
        ++YYCURSOR;
 yy255:
-#line 291 "../src/ast/lex.re"
+#line 294 "../src/ast/lex.re"
        {
         fatal_lc(get_cline(), get_column(),
             "illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers");
     }
-#line 1406 "src/ast/lex.cc"
+#line 1442 "src/ast/lex.cc"
 yy256:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
@@ -1412,9 +1448,9 @@ yy256:
        }
        if (yych == ',') {
                yyt1 = YYCURSOR;
-               goto yy264;
+               goto yy265;
        }
-       if (yych == '}') goto yy265;
+       if (yych == '}') goto yy266;
        goto yy235;
 yy258:
        ++YYCURSOR;
@@ -1434,33 +1470,52 @@ yy258:
                        if (yych == '`') goto yy235;
                        goto yy258;
                } else {
-                       if (yych == '}') goto yy267;
+                       if (yych == '}') goto yy268;
                        goto yy235;
                }
        }
 yy260:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy269;
+       if (yych == 'i') goto yy270;
        goto yy235;
 yy261:
        ++YYCURSOR;
-#line 244 "../src/ast/lex.re"
-       { lex_cgoto(); return TOKEN_CJUMP; }
-#line 1450 "src/ast/lex.cc"
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = (YYCTYPE)*YYCURSOR;
+       if (yych <= 'Z') {
+               if (yych <= '/') goto yy263;
+               if (yych <= '9') goto yy261;
+               if (yych >= 'A') goto yy261;
+       } else {
+               if (yych <= '_') {
+                       if (yych >= '_') goto yy261;
+               } else {
+                       if (yych <= '`') goto yy263;
+                       if (yych <= 'z') goto yy261;
+               }
+       }
 yy263:
+       p = yyt1;
+#line 243 "../src/ast/lex.re"
+       {
+        yylval.str = new std::string(p, static_cast<size_t>(cur - p));
+        return tok[0] == ':' ? TOKEN_CJUMP : TOKEN_CNEXT;
+    }
+#line 1505 "src/ast/lex.cc"
+yy264:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy270;
+       if (yych == 'c') goto yy271;
        goto yy226;
-yy264:
-       yyaccept = 2;
+yy265:
+       yyaccept = 4;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '/') goto yy255;
-       if (yych <= '9') goto yy271;
-       if (yych == '}') goto yy273;
+       if (yych <= '9') goto yy272;
+       if (yych == '}') goto yy274;
        goto yy255;
-yy265:
+yy266:
        ++YYCURSOR;
-#line 265 "../src/ast/lex.re"
+#line 268 "../src/ast/lex.re"
        {
         if (!s_to_u32_unsafe (tok + 1, cur - 1, yylval.bounds.min)) {
             fatal_lc(get_cline(), get_column(), "repetition count overflow");
@@ -1468,10 +1523,10 @@ yy265:
         yylval.bounds.max = yylval.bounds.min;
         return TOKEN_CLOSESIZE;
     }
-#line 1472 "src/ast/lex.cc"
-yy267:
+#line 1527 "src/ast/lex.cc"
+yy268:
        ++YYCURSOR;
-#line 296 "../src/ast/lex.re"
+#line 299 "../src/ast/lex.re"
        {
         if (!globopts->FFlag) {
             fatal_lc(get_cline(), get_column(),
@@ -1480,26 +1535,26 @@ yy267:
         yylval.str = new std::string (tok + 1, tok_len () - 2); // -2 to omit braces
         return TOKEN_ID;
     }
-#line 1484 "src/ast/lex.cc"
-yy269:
+#line 1539 "src/ast/lex.cc"
+yy270:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy275;
+       if (yych == 'n') goto yy276;
        goto yy235;
-yy270:
+yy271:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == ':') goto yy276;
+       if (yych == ':') goto yy277;
        goto yy226;
-yy271:
+yy272:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '/') goto yy235;
-       if (yych <= '9') goto yy271;
-       if (yych == '}') goto yy278;
+       if (yych <= '9') goto yy272;
+       if (yych == '}') goto yy279;
        goto yy235;
-yy273:
+yy274:
        ++YYCURSOR;
-#line 283 "../src/ast/lex.re"
+#line 286 "../src/ast/lex.re"
        {
         if (!s_to_u32_unsafe (tok + 1, cur - 2, yylval.bounds.min)) {
             fatal_lc(get_cline(), get_column(), "repetition lower bound overflow");
@@ -1507,20 +1562,20 @@ yy273:
         yylval.bounds.max = std::numeric_limits<uint32_t>::max();
         return TOKEN_CLOSESIZE;
     }
-#line 1511 "src/ast/lex.cc"
-yy275:
+#line 1566 "src/ast/lex.cc"
+yy276:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy280;
+       if (yych == 'e') goto yy281;
        goto yy235;
-yy276:
+yy277:
        ++YYCURSOR;
-#line 305 "../src/ast/lex.re"
+#line 308 "../src/ast/lex.re"
        { return TOKEN_CONF; }
-#line 1520 "src/ast/lex.cc"
-yy278:
+#line 1575 "src/ast/lex.cc"
+yy279:
        ++YYCURSOR;
        p = yyt1;
-#line 273 "../src/ast/lex.re"
+#line 276 "../src/ast/lex.re"
        {
         if (!s_to_u32_unsafe (tok + 1, p, yylval.bounds.min)) {
             fatal_lc(get_cline(), get_column(), "repetition lower bound overflow");
@@ -1530,27 +1585,27 @@ yy278:
         }
         return TOKEN_CLOSESIZE;
     }
-#line 1534 "src/ast/lex.cc"
-yy280:
+#line 1589 "src/ast/lex.cc"
+yy281:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '0') goto yy282;
+       if (yych <= '0') goto yy283;
        if (yych <= '9') goto yy235;
-       goto yy282;
-yy281:
+       goto yy283;
+yy282:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy282:
+yy283:
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy281;
+               if (yych == '\t') goto yy282;
                goto yy235;
        } else {
-               if (yych <= ' ') goto yy281;
+               if (yych <= ' ') goto yy282;
                if (yych <= '0') goto yy235;
                if (yych >= ':') goto yy235;
                yyt1 = YYCURSOR;
        }
-yy283:
+yy284:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
@@ -1558,73 +1613,73 @@ yy283:
                if (yych <= '\t') {
                        if (yych <= 0x08) goto yy235;
                } else {
-                       if (yych <= '\n') goto yy287;
+                       if (yych <= '\n') goto yy288;
                        if (yych <= '\f') goto yy235;
-                       goto yy289;
+                       goto yy290;
                }
        } else {
                if (yych <= ' ') {
                        if (yych <= 0x1F) goto yy235;
                } else {
                        if (yych <= '/') goto yy235;
-                       if (yych <= '9') goto yy283;
+                       if (yych <= '9') goto yy284;
                        goto yy235;
                }
        }
-yy285:
+yy286:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy285;
+               if (yych == '\t') goto yy286;
                goto yy235;
        } else {
-               if (yych <= ' ') goto yy285;
-               if (yych == '"') goto yy290;
+               if (yych <= ' ') goto yy286;
+               if (yych == '"') goto yy291;
                goto yy235;
        }
-yy287:
+yy288:
        ++YYCURSOR;
        YYCURSOR = yyt1;
-#line 337 "../src/ast/lex.re"
+#line 340 "../src/ast/lex.re"
        {
         set_sourceline ();
         return TOKEN_LINE_INFO;
     }
-#line 1595 "src/ast/lex.cc"
-yy289:
+#line 1650 "src/ast/lex.cc"
+yy290:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy287;
+       if (yych == '\n') goto yy288;
        goto yy235;
-yy290:
+yy291:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy290;
+               goto yy291;
        }
        if (yych <= '\n') goto yy235;
-       if (yych >= '#') goto yy293;
+       if (yych >= '#') goto yy294;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy287;
-       if (yych == '\r') goto yy289;
+       if (yych == '\n') goto yy288;
+       if (yych == '\r') goto yy290;
        goto yy235;
-yy293:
+yy294:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x00) goto yy235;
        if (yych == '\n') goto yy235;
-       goto yy290;
+       goto yy291;
 }
-#line 358 "../src/ast/lex.re"
+#line 361 "../src/ast/lex.re"
 
 }
 
 bool Scanner::lex_namedef_context_re2c()
 {
 
-#line 1628 "src/ast/lex.cc"
+#line 1683 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -1666,50 +1721,50 @@ bool Scanner::lex_namedef_context_re2c()
        if (yych <= 0x1F) {
                if (yych == '\t') {
                        yyt1 = YYCURSOR;
-                       goto yy297;
+                       goto yy298;
                }
        } else {
                if (yych <= ' ') {
                        yyt1 = YYCURSOR;
-                       goto yy297;
+                       goto yy298;
                }
                if (yych == '=') {
                        yyt1 = YYCURSOR;
-                       goto yy300;
+                       goto yy301;
                }
        }
-yy296:
-#line 365 "../src/ast/lex.re"
-       { return false; }
-#line 1685 "src/ast/lex.cc"
 yy297:
+#line 368 "../src/ast/lex.re"
+       { return false; }
+#line 1740 "src/ast/lex.cc"
+yy298:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy297;
+               goto yy298;
        }
-       if (yych == '=') goto yy300;
-yy299:
-       YYCURSOR = YYMARKER;
-       goto yy296;
+       if (yych == '=') goto yy301;
 yy300:
+       YYCURSOR = YYMARKER;
+       goto yy297;
+yy301:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '>') goto yy299;
+       if (yych == '>') goto yy300;
        ++YYCURSOR;
        YYCURSOR = yyt1;
-#line 364 "../src/ast/lex.re"
+#line 367 "../src/ast/lex.re"
        { return true; }
-#line 1704 "src/ast/lex.cc"
+#line 1759 "src/ast/lex.cc"
 }
-#line 366 "../src/ast/lex.re"
+#line 369 "../src/ast/lex.re"
 
 }
 
 bool Scanner::lex_namedef_context_flex()
 {
 
-#line 1713 "src/ast/lex.cc"
+#line 1768 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -1750,40 +1805,40 @@ bool Scanner::lex_namedef_context_flex()
        yych = (YYCTYPE)*YYCURSOR;
        if (yych == '\t') {
                yyt1 = YYCURSOR;
-               goto yy306;
+               goto yy307;
        }
        if (yych == ' ') {
                yyt1 = YYCURSOR;
-               goto yy306;
+               goto yy307;
        }
-#line 374 "../src/ast/lex.re"
+#line 377 "../src/ast/lex.re"
        { return false; }
-#line 1762 "src/ast/lex.cc"
-yy306:
+#line 1817 "src/ast/lex.cc"
+yy307:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy306;
+               goto yy307;
        }
        if (yych <= '<') {
-               if (yych == ':') goto yy309;
+               if (yych == ':') goto yy310;
        } else {
-               if (yych <= '=') goto yy309;
-               if (yych == '{') goto yy309;
+               if (yych <= '=') goto yy310;
+               if (yych == '{') goto yy310;
        }
        YYCURSOR = yyt1;
-#line 373 "../src/ast/lex.re"
+#line 376 "../src/ast/lex.re"
        { return true; }
-#line 1779 "src/ast/lex.cc"
-yy309:
+#line 1834 "src/ast/lex.cc"
+yy310:
        ++YYCURSOR;
        YYCURSOR = yyt1;
-#line 372 "../src/ast/lex.re"
+#line 375 "../src/ast/lex.re"
        { return false; }
-#line 1785 "src/ast/lex.cc"
+#line 1840 "src/ast/lex.cc"
 }
-#line 375 "../src/ast/lex.re"
+#line 378 "../src/ast/lex.re"
 
 }
 
@@ -1792,7 +1847,7 @@ int Scanner::lex_clist()
     int kind = TOKEN_CLIST;
     CondList *cl = new CondList;
 
-#line 1796 "src/ast/lex.cc"
+#line 1851 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -1829,43 +1884,43 @@ int Scanner::lex_clist()
                  0,   0,   0,   0,   0,   0,   0,   0, 
                  0,   0,   0,   0,   0,   0,   0,   0, 
        };
-       goto yy311;
-yy312:
+       goto yy312;
+yy313:
        ++YYCURSOR;
-yy311:
+yy312:
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy312;
+               goto yy313;
        }
-       if (yych <= 0x1F) goto yy314;
-       if (yych <= '!') goto yy315;
-       if (yych == '>') goto yy318;
-yy314:
-#line 385 "../src/ast/lex.re"
-       { goto cond; }
-#line 1848 "src/ast/lex.cc"
+       if (yych <= 0x1F) goto yy315;
+       if (yych <= '!') goto yy316;
+       if (yych == '>') goto yy319;
 yy315:
+#line 388 "../src/ast/lex.re"
+       { goto cond; }
+#line 1903 "src/ast/lex.cc"
+yy316:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\t') goto yy315;
-       if (yych == ' ') goto yy315;
-#line 383 "../src/ast/lex.re"
+       if (yych == '\t') goto yy316;
+       if (yych == ' ') goto yy316;
+#line 386 "../src/ast/lex.re"
        { kind = TOKEN_CSETUP; goto cond; }
-#line 1857 "src/ast/lex.cc"
-yy318:
+#line 1912 "src/ast/lex.cc"
+yy319:
        ++YYCURSOR;
-#line 384 "../src/ast/lex.re"
+#line 387 "../src/ast/lex.re"
        { kind = TOKEN_CZERO; goto end; }
-#line 1862 "src/ast/lex.cc"
+#line 1917 "src/ast/lex.cc"
 }
-#line 386 "../src/ast/lex.re"
+#line 389 "../src/ast/lex.re"
 
 cond:
     tok = cur;
 
-#line 1869 "src/ast/lex.cc"
+#line 1924 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -1905,42 +1960,42 @@ cond:
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 'Z') {
-               if (yych == '*') goto yy324;
-               if (yych >= 'A') goto yy326;
+               if (yych == '*') goto yy325;
+               if (yych >= 'A') goto yy327;
        } else {
                if (yych <= '_') {
-                       if (yych >= '_') goto yy326;
+                       if (yych >= '_') goto yy327;
                } else {
-                       if (yych <= '`') goto yy322;
-                       if (yych <= 'z') goto yy326;
+                       if (yych <= '`') goto yy323;
+                       if (yych <= 'z') goto yy327;
                }
        }
-yy322:
+yy323:
        ++YYCURSOR;
-#line 392 "../src/ast/lex.re"
+#line 395 "../src/ast/lex.re"
        { goto error; }
-#line 1923 "src/ast/lex.cc"
-yy324:
+#line 1978 "src/ast/lex.cc"
+yy325:
        ++YYCURSOR;
-#line 391 "../src/ast/lex.re"
+#line 394 "../src/ast/lex.re"
        { if (!cl->empty()) goto error; cl->insert("*"); goto next; }
-#line 1928 "src/ast/lex.cc"
-yy326:
+#line 1983 "src/ast/lex.cc"
+yy327:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy326;
+               goto yy327;
        }
-#line 390 "../src/ast/lex.re"
+#line 393 "../src/ast/lex.re"
        { cl->insert(std::string(tok, tok_len())); goto next; }
-#line 1938 "src/ast/lex.cc"
+#line 1993 "src/ast/lex.cc"
 }
-#line 393 "../src/ast/lex.re"
+#line 396 "../src/ast/lex.re"
 
 next:
 
-#line 1944 "src/ast/lex.cc"
+#line 1999 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -1980,67 +2035,67 @@ next:
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= ' ') {
-               if (yych == '\t') goto yy333;
-               if (yych >= ' ') goto yy333;
+               if (yych == '\t') goto yy334;
+               if (yych >= ' ') goto yy334;
        } else {
                if (yych <= ',') {
-                       if (yych >= ',') goto yy334;
+                       if (yych >= ',') goto yy335;
                } else {
-                       if (yych == '>') goto yy337;
+                       if (yych == '>') goto yy338;
                }
        }
        ++YYCURSOR;
-yy332:
-#line 398 "../src/ast/lex.re"
-       { goto error; }
-#line 1997 "src/ast/lex.cc"
 yy333:
+#line 401 "../src/ast/lex.re"
+       { goto error; }
+#line 2052 "src/ast/lex.cc"
+yy334:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= ' ') {
-               if (yych == '\t') goto yy339;
-               if (yych <= 0x1F) goto yy332;
-               goto yy339;
+               if (yych == '\t') goto yy340;
+               if (yych <= 0x1F) goto yy333;
+               goto yy340;
        } else {
                if (yych <= ',') {
-                       if (yych <= '+') goto yy332;
+                       if (yych <= '+') goto yy333;
                } else {
-                       if (yych == '>') goto yy337;
-                       goto yy332;
+                       if (yych == '>') goto yy338;
+                       goto yy333;
                }
        }
-yy334:
+yy335:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy334;
+               goto yy335;
        }
-#line 396 "../src/ast/lex.re"
+#line 399 "../src/ast/lex.re"
        { goto cond; }
-#line 2021 "src/ast/lex.cc"
-yy337:
+#line 2076 "src/ast/lex.cc"
+yy338:
        ++YYCURSOR;
-#line 397 "../src/ast/lex.re"
+#line 400 "../src/ast/lex.re"
        { goto end; }
-#line 2026 "src/ast/lex.cc"
-yy339:
+#line 2081 "src/ast/lex.cc"
+yy340:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= ' ') {
-               if (yych == '\t') goto yy339;
-               if (yych >= ' ') goto yy339;
+               if (yych == '\t') goto yy340;
+               if (yych >= ' ') goto yy340;
        } else {
                if (yych <= ',') {
-                       if (yych >= ',') goto yy334;
+                       if (yych >= ',') goto yy335;
                } else {
-                       if (yych == '>') goto yy337;
+                       if (yych == '>') goto yy338;
                }
        }
        YYCURSOR = YYMARKER;
-       goto yy332;
+       goto yy333;
 }
-#line 399 "../src/ast/lex.re"
+#line 402 "../src/ast/lex.re"
 
 end:
     yylval.clist = cl;
@@ -2050,228 +2105,104 @@ error:
     fatal_l(get_cline(), "syntax error in condition list");
 }
 
-void Scanner::lex_cgoto()
-{
-
-#line 2057 "src/ast/lex.cc"
-{
-       YYCTYPE yych;
-       static const unsigned char yybm[] = {
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0, 128,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-               128,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-       };
-       goto yy342;
-yy343:
-       ++YYCURSOR;
-yy342:
-       if (YYLIMIT <= YYCURSOR) YYFILL(1);
-       yych = (YYCTYPE)*YYCURSOR;
-       if (yybm[0+yych] & 128) {
-               goto yy343;
-       }
-#line 411 "../src/ast/lex.re"
-       { goto name; }
-#line 2105 "src/ast/lex.cc"
-}
-#line 412 "../src/ast/lex.re"
-
-name:
-    tok = cur;
-
-#line 2112 "src/ast/lex.cc"
-{
-       YYCTYPE yych;
-       static const unsigned char yybm[] = {
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-               128, 128, 128, 128, 128, 128, 128, 128, 
-               128, 128,   0,   0,   0,   0,   0,   0, 
-                 0, 128, 128, 128, 128, 128, 128, 128, 
-               128, 128, 128, 128, 128, 128, 128, 128, 
-               128, 128, 128, 128, 128, 128, 128, 128, 
-               128, 128, 128,   0,   0,   0,   0, 128, 
-                 0, 128, 128, 128, 128, 128, 128, 128, 
-               128, 128, 128, 128, 128, 128, 128, 128, 
-               128, 128, 128, 128, 128, 128, 128, 128, 
-               128, 128, 128,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-                 0,   0,   0,   0,   0,   0,   0,   0, 
-       };
-       if (YYLIMIT <= YYCURSOR) YYFILL(1);
-       yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= '^') {
-               if (yych <= '@') goto yy348;
-               if (yych <= 'Z') goto yy350;
-       } else {
-               if (yych == '`') goto yy348;
-               if (yych <= 'z') goto yy350;
-       }
-yy348:
-       ++YYCURSOR;
-#line 417 "../src/ast/lex.re"
-       { fatal_l(get_cline(), "syntax error in condition goto"); }
-#line 2162 "src/ast/lex.cc"
-yy350:
-       ++YYCURSOR;
-       if (YYLIMIT <= YYCURSOR) YYFILL(1);
-       yych = (YYCTYPE)*YYCURSOR;
-       if (yybm[0+yych] & 128) {
-               goto yy350;
-       }
-#line 416 "../src/ast/lex.re"
-       { yylval.str = new std::string (tok, tok_len ()); return; }
-#line 2172 "src/ast/lex.cc"
-}
-#line 418 "../src/ast/lex.re"
-
-}
-
 void Scanner::lex_code_indented()
 {
     const uint32_t line = cline;
     tok = cur;
 code:
 
-#line 2184 "src/ast/lex.cc"
+#line 2115 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '&') {
                if (yych <= '\f') {
-                       if (yych <= 0x00) goto yy355;
-                       if (yych == '\n') goto yy359;
-                       goto yy357;
+                       if (yych <= 0x00) goto yy345;
+                       if (yych == '\n') goto yy349;
+                       goto yy347;
                } else {
-                       if (yych <= '\r') goto yy361;
-                       if (yych == '"') goto yy362;
-                       goto yy357;
+                       if (yych <= '\r') goto yy351;
+                       if (yych == '"') goto yy352;
+                       goto yy347;
                }
        } else {
                if (yych <= 'z') {
-                       if (yych <= '\'') goto yy362;
-                       if (yych == '/') goto yy364;
-                       goto yy357;
+                       if (yych <= '\'') goto yy352;
+                       if (yych == '/') goto yy354;
+                       goto yy347;
                } else {
-                       if (yych == '|') goto yy357;
-                       if (yych <= '}') goto yy365;
-                       goto yy357;
+                       if (yych == '|') goto yy347;
+                       if (yych <= '}') goto yy355;
+                       goto yy347;
                }
        }
-yy355:
+yy345:
        ++YYCURSOR;
-#line 435 "../src/ast/lex.re"
+#line 425 "../src/ast/lex.re"
        { fail_if_eof(); goto code; }
-#line 2214 "src/ast/lex.cc"
-yy357:
+#line 2145 "src/ast/lex.cc"
+yy347:
        ++YYCURSOR;
-yy358:
-#line 440 "../src/ast/lex.re"
+yy348:
+#line 430 "../src/ast/lex.re"
        { goto code; }
-#line 2220 "src/ast/lex.cc"
-yy359:
+#line 2151 "src/ast/lex.cc"
+yy349:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '\f') {
-               if (yych <= 0x08) goto yy360;
-               if (yych <= '\n') goto yy367;
+               if (yych <= 0x08) goto yy350;
+               if (yych <= '\n') goto yy357;
        } else {
-               if (yych <= '\r') goto yy367;
-               if (yych == ' ') goto yy367;
+               if (yych <= '\r') goto yy357;
+               if (yych == ' ') goto yy357;
        }
-yy360:
-#line 428 "../src/ast/lex.re"
+yy350:
+#line 418 "../src/ast/lex.re"
        {
         while (isspace(tok[0])) ++tok;
         while (cur > tok && isspace(cur[-1])) --cur;
         yylval.code = new Code(get_fname (), line, tok, tok_len ());
         return;
     }
-#line 2238 "src/ast/lex.cc"
-yy361:
+#line 2169 "src/ast/lex.cc"
+yy351:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy359;
-       goto yy358;
-yy362:
+       if (yych == '\n') goto yy349;
+       goto yy348;
+yy352:
        ++YYCURSOR;
-#line 439 "../src/ast/lex.re"
+#line 429 "../src/ast/lex.re"
        { lex_string(cur[-1]); goto code; }
-#line 2247 "src/ast/lex.cc"
-yy364:
+#line 2178 "src/ast/lex.cc"
+yy354:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '*') goto yy369;
-       if (yych == '/') goto yy371;
-       goto yy358;
-yy365:
+       if (yych == '*') goto yy359;
+       if (yych == '/') goto yy361;
+       goto yy348;
+yy355:
        ++YYCURSOR;
-#line 436 "../src/ast/lex.re"
+#line 426 "../src/ast/lex.re"
        { fatal_l(get_cline(), "Curly braces are not allowed after ':='"); }
-#line 2257 "src/ast/lex.cc"
-yy367:
+#line 2188 "src/ast/lex.cc"
+yy357:
        ++YYCURSOR;
        YYCURSOR -= 1;
-#line 427 "../src/ast/lex.re"
+#line 417 "../src/ast/lex.re"
        { goto code; }
-#line 2263 "src/ast/lex.cc"
-yy369:
+#line 2194 "src/ast/lex.cc"
+yy359:
        ++YYCURSOR;
-#line 437 "../src/ast/lex.re"
+#line 427 "../src/ast/lex.re"
        { lex_c_comment(); goto code; }
-#line 2268 "src/ast/lex.cc"
-yy371:
+#line 2199 "src/ast/lex.cc"
+yy361:
        ++YYCURSOR;
-#line 438 "../src/ast/lex.re"
+#line 428 "../src/ast/lex.re"
        { lex_cpp_comment(); goto code; }
-#line 2273 "src/ast/lex.cc"
+#line 2204 "src/ast/lex.cc"
 }
-#line 441 "../src/ast/lex.re"
+#line 431 "../src/ast/lex.re"
 
 }
 
@@ -2281,7 +2212,7 @@ void Scanner::lex_code_in_braces()
     uint32_t depth = 1;
 code:
 
-#line 2285 "src/ast/lex.cc"
+#line 2216 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -2322,68 +2253,68 @@ code:
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '&') {
                if (yych <= '\f') {
-                       if (yych <= 0x00) goto yy375;
-                       if (yych == '\n') goto yy379;
-                       goto yy377;
+                       if (yych <= 0x00) goto yy365;
+                       if (yych == '\n') goto yy369;
+                       goto yy367;
                } else {
-                       if (yych <= '\r') goto yy381;
-                       if (yych == '"') goto yy382;
-                       goto yy377;
+                       if (yych <= '\r') goto yy371;
+                       if (yych == '"') goto yy372;
+                       goto yy367;
                }
        } else {
                if (yych <= 'z') {
-                       if (yych <= '\'') goto yy382;
-                       if (yych == '/') goto yy384;
-                       goto yy377;
+                       if (yych <= '\'') goto yy372;
+                       if (yych == '/') goto yy374;
+                       goto yy367;
                } else {
-                       if (yych <= '{') goto yy385;
-                       if (yych == '}') goto yy387;
-                       goto yy377;
+                       if (yych <= '{') goto yy375;
+                       if (yych == '}') goto yy377;
+                       goto yy367;
                }
        }
-yy375:
+yy365:
        ++YYCURSOR;
-#line 461 "../src/ast/lex.re"
+#line 451 "../src/ast/lex.re"
        { fail_if_eof(); goto code; }
-#line 2349 "src/ast/lex.cc"
-yy377:
+#line 2280 "src/ast/lex.cc"
+yy367:
        ++YYCURSOR;
-yy378:
-#line 465 "../src/ast/lex.re"
+yy368:
+#line 455 "../src/ast/lex.re"
        { goto code; }
-#line 2355 "src/ast/lex.cc"
-yy379:
+#line 2286 "src/ast/lex.cc"
+yy369:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yybm[0+yych] & 32) {
-               goto yy389;
+               goto yy379;
        }
-       if (yych == '#') goto yy392;
-yy380:
-#line 460 "../src/ast/lex.re"
+       if (yych == '#') goto yy382;
+yy370:
+#line 450 "../src/ast/lex.re"
        { pos = cur; cline++; goto code; }
-#line 2365 "src/ast/lex.cc"
-yy381:
+#line 2296 "src/ast/lex.cc"
+yy371:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy379;
-       goto yy378;
-yy382:
+       if (yych == '\n') goto yy369;
+       goto yy368;
+yy372:
        ++YYCURSOR;
-#line 464 "../src/ast/lex.re"
+#line 454 "../src/ast/lex.re"
        { lex_string(cur[-1]); goto code; }
-#line 2374 "src/ast/lex.cc"
-yy384:
+#line 2305 "src/ast/lex.cc"
+yy374:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '*') goto yy394;
-       if (yych == '/') goto yy396;
-       goto yy378;
-yy385:
+       if (yych == '*') goto yy384;
+       if (yych == '/') goto yy386;
+       goto yy368;
+yy375:
        ++YYCURSOR;
-#line 458 "../src/ast/lex.re"
+#line 448 "../src/ast/lex.re"
        { ++depth; goto code; }
-#line 2384 "src/ast/lex.cc"
-yy387:
+#line 2315 "src/ast/lex.cc"
+yy377:
        ++YYCURSOR;
-#line 450 "../src/ast/lex.re"
+#line 440 "../src/ast/lex.re"
        {
         if (--depth == 0) {
             yylval.code = new Code(get_fname (), line, tok, tok_len ());
@@ -2391,125 +2322,125 @@ yy387:
         }
         goto code;
     }
-#line 2395 "src/ast/lex.cc"
-yy389:
+#line 2326 "src/ast/lex.cc"
+yy379:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 32) {
-               goto yy389;
+               goto yy379;
        }
-       if (yych == '#') goto yy392;
-yy391:
+       if (yych == '#') goto yy382;
+yy381:
        YYCURSOR = YYMARKER;
-       goto yy380;
-yy392:
+       goto yy370;
+yy382:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy392;
-               goto yy391;
+               if (yych == '\t') goto yy382;
+               goto yy381;
        } else {
-               if (yych <= ' ') goto yy392;
-               if (yych == 'l') goto yy398;
-               goto yy391;
+               if (yych <= ' ') goto yy382;
+               if (yych == 'l') goto yy388;
+               goto yy381;
        }
-yy394:
+yy384:
        ++YYCURSOR;
-#line 462 "../src/ast/lex.re"
+#line 452 "../src/ast/lex.re"
        { lex_c_comment(); goto code; }
-#line 2423 "src/ast/lex.cc"
-yy396:
+#line 2354 "src/ast/lex.cc"
+yy386:
        ++YYCURSOR;
-#line 463 "../src/ast/lex.re"
+#line 453 "../src/ast/lex.re"
        { lex_cpp_comment(); goto code; }
-#line 2428 "src/ast/lex.cc"
-yy398:
+#line 2359 "src/ast/lex.cc"
+yy388:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy391;
+       if (yych != 'i') goto yy381;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy391;
+       if (yych != 'n') goto yy381;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy391;
+       if (yych != 'e') goto yy381;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '0') goto yy403;
-       if (yych <= '9') goto yy391;
-       goto yy403;
-yy402:
+       if (yych <= '0') goto yy393;
+       if (yych <= '9') goto yy381;
+       goto yy393;
+yy392:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy403:
+yy393:
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy402;
-               goto yy391;
+               if (yych == '\t') goto yy392;
+               goto yy381;
        } else {
-               if (yych <= ' ') goto yy402;
-               if (yych <= '0') goto yy391;
-               if (yych >= ':') goto yy391;
+               if (yych <= ' ') goto yy392;
+               if (yych <= '0') goto yy381;
+               if (yych >= ':') goto yy381;
                yyt1 = YYCURSOR;
        }
-yy404:
+yy394:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 64) {
-               goto yy404;
+               goto yy394;
        }
        if (yych <= '\f') {
-               if (yych <= 0x08) goto yy391;
-               if (yych <= '\t') goto yy406;
-               if (yych <= '\n') goto yy408;
-               goto yy391;
+               if (yych <= 0x08) goto yy381;
+               if (yych <= '\t') goto yy396;
+               if (yych <= '\n') goto yy398;
+               goto yy381;
        } else {
-               if (yych <= '\r') goto yy410;
-               if (yych != ' ') goto yy391;
+               if (yych <= '\r') goto yy400;
+               if (yych != ' ') goto yy381;
        }
-yy406:
+yy396:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy406;
-               goto yy391;
+               if (yych == '\t') goto yy396;
+               goto yy381;
        } else {
-               if (yych <= ' ') goto yy406;
-               if (yych == '"') goto yy411;
-               goto yy391;
+               if (yych <= ' ') goto yy396;
+               if (yych == '"') goto yy401;
+               goto yy381;
        }
-yy408:
+yy398:
        ++YYCURSOR;
        YYCURSOR = yyt1;
-#line 459 "../src/ast/lex.re"
+#line 449 "../src/ast/lex.re"
        { set_sourceline (); goto code; }
-#line 2487 "src/ast/lex.cc"
-yy410:
+#line 2418 "src/ast/lex.cc"
+yy400:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy408;
-       goto yy391;
-yy411:
+       if (yych == '\n') goto yy398;
+       goto yy381;
+yy401:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy411;
+               goto yy401;
        }
-       if (yych <= '\n') goto yy391;
-       if (yych >= '#') goto yy414;
+       if (yych <= '\n') goto yy381;
+       if (yych >= '#') goto yy404;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy408;
-       if (yych == '\r') goto yy410;
-       goto yy391;
-yy414:
+       if (yych == '\n') goto yy398;
+       if (yych == '\r') goto yy400;
+       goto yy381;
+yy404:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= 0x00) goto yy391;
-       if (yych == '\n') goto yy391;
-       goto yy411;
+       if (yych <= 0x00) goto yy381;
+       if (yych == '\n') goto yy381;
+       goto yy401;
 }
-#line 466 "../src/ast/lex.re"
+#line 456 "../src/ast/lex.re"
 
 }
 
@@ -2517,70 +2448,70 @@ void Scanner::lex_string(char delim)
 {
 loop:
 
-#line 2521 "src/ast/lex.cc"
+#line 2452 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '!') {
                if (yych <= '\n') {
-                       if (yych <= 0x00) goto yy417;
-                       if (yych <= '\t') goto yy419;
-                       goto yy421;
+                       if (yych <= 0x00) goto yy407;
+                       if (yych <= '\t') goto yy409;
+                       goto yy411;
                } else {
-                       if (yych == '\r') goto yy423;
-                       goto yy419;
+                       if (yych == '\r') goto yy413;
+                       goto yy409;
                }
        } else {
                if (yych <= '\'') {
-                       if (yych <= '"') goto yy424;
-                       if (yych <= '&') goto yy419;
-                       goto yy424;
+                       if (yych <= '"') goto yy414;
+                       if (yych <= '&') goto yy409;
+                       goto yy414;
                } else {
-                       if (yych == '\\') goto yy426;
-                       goto yy419;
+                       if (yych == '\\') goto yy416;
+                       goto yy409;
                }
        }
-yy417:
+yy407:
        ++YYCURSOR;
-#line 476 "../src/ast/lex.re"
+#line 466 "../src/ast/lex.re"
        { fail_if_eof(); goto loop; }
-#line 2549 "src/ast/lex.cc"
-yy419:
+#line 2480 "src/ast/lex.cc"
+yy409:
        ++YYCURSOR;
-yy420:
-#line 477 "../src/ast/lex.re"
+yy410:
+#line 467 "../src/ast/lex.re"
        { goto loop; }
-#line 2555 "src/ast/lex.cc"
-yy421:
+#line 2486 "src/ast/lex.cc"
+yy411:
        ++YYCURSOR;
-#line 475 "../src/ast/lex.re"
+#line 465 "../src/ast/lex.re"
        { pos = cur; ++cline; goto loop; }
-#line 2560 "src/ast/lex.cc"
-yy423:
+#line 2491 "src/ast/lex.cc"
+yy413:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy421;
-       goto yy420;
-yy424:
+       if (yych == '\n') goto yy411;
+       goto yy410;
+yy414:
        ++YYCURSOR;
-#line 473 "../src/ast/lex.re"
+#line 463 "../src/ast/lex.re"
        { if (cur[-1] == delim) return; else goto loop; }
-#line 2569 "src/ast/lex.cc"
-yy426:
+#line 2500 "src/ast/lex.cc"
+yy416:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '&') {
-               if (yych != '"') goto yy420;
+               if (yych != '"') goto yy410;
        } else {
-               if (yych <= '\'') goto yy427;
-               if (yych != '\\') goto yy420;
+               if (yych <= '\'') goto yy417;
+               if (yych != '\\') goto yy410;
        }
-yy427:
+yy417:
        ++YYCURSOR;
-#line 474 "../src/ast/lex.re"
+#line 464 "../src/ast/lex.re"
        { goto loop; }
-#line 2582 "src/ast/lex.cc"
+#line 2513 "src/ast/lex.cc"
 }
-#line 478 "../src/ast/lex.re"
+#line 468 "../src/ast/lex.re"
 
 }
 
@@ -2588,49 +2519,49 @@ void Scanner::lex_c_comment()
 {
 loop:
 
-#line 2592 "src/ast/lex.cc"
+#line 2523 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '\f') {
-               if (yych <= 0x00) goto yy431;
-               if (yych == '\n') goto yy435;
-               goto yy433;
+               if (yych <= 0x00) goto yy421;
+               if (yych == '\n') goto yy425;
+               goto yy423;
        } else {
-               if (yych <= '\r') goto yy437;
-               if (yych == '*') goto yy438;
-               goto yy433;
+               if (yych <= '\r') goto yy427;
+               if (yych == '*') goto yy428;
+               goto yy423;
        }
-yy431:
+yy421:
        ++YYCURSOR;
-#line 487 "../src/ast/lex.re"
+#line 477 "../src/ast/lex.re"
        { fail_if_eof(); goto loop; }
-#line 2610 "src/ast/lex.cc"
-yy433:
+#line 2541 "src/ast/lex.cc"
+yy423:
        ++YYCURSOR;
-yy434:
-#line 488 "../src/ast/lex.re"
+yy424:
+#line 478 "../src/ast/lex.re"
        { goto loop; }
-#line 2616 "src/ast/lex.cc"
-yy435:
+#line 2547 "src/ast/lex.cc"
+yy425:
        ++YYCURSOR;
-#line 486 "../src/ast/lex.re"
+#line 476 "../src/ast/lex.re"
        { pos = cur; ++cline; goto loop; }
-#line 2621 "src/ast/lex.cc"
-yy437:
+#line 2552 "src/ast/lex.cc"
+yy427:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy435;
-       goto yy434;
-yy438:
+       if (yych == '\n') goto yy425;
+       goto yy424;
+yy428:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != '/') goto yy434;
+       if (yych != '/') goto yy424;
        ++YYCURSOR;
-#line 485 "../src/ast/lex.re"
+#line 475 "../src/ast/lex.re"
        { return; }
-#line 2632 "src/ast/lex.cc"
+#line 2563 "src/ast/lex.cc"
 }
-#line 489 "../src/ast/lex.re"
+#line 479 "../src/ast/lex.re"
 
 }
 
@@ -2638,41 +2569,41 @@ void Scanner::lex_cpp_comment()
 {
 loop:
 
-#line 2642 "src/ast/lex.cc"
+#line 2573 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '\n') {
-               if (yych <= 0x00) goto yy443;
-               if (yych <= '\t') goto yy445;
-               goto yy447;
+               if (yych <= 0x00) goto yy433;
+               if (yych <= '\t') goto yy435;
+               goto yy437;
        } else {
-               if (yych == '\r') goto yy449;
-               goto yy445;
+               if (yych == '\r') goto yy439;
+               goto yy435;
        }
-yy443:
+yy433:
        ++YYCURSOR;
-#line 497 "../src/ast/lex.re"
+#line 487 "../src/ast/lex.re"
        { fail_if_eof(); goto loop; }
-#line 2659 "src/ast/lex.cc"
-yy445:
+#line 2590 "src/ast/lex.cc"
+yy435:
        ++YYCURSOR;
-yy446:
-#line 498 "../src/ast/lex.re"
+yy436:
+#line 488 "../src/ast/lex.re"
        { goto loop; }
-#line 2665 "src/ast/lex.cc"
-yy447:
+#line 2596 "src/ast/lex.cc"
+yy437:
        ++YYCURSOR;
-#line 496 "../src/ast/lex.re"
+#line 486 "../src/ast/lex.re"
        { pos = cur; ++cline; return; }
-#line 2670 "src/ast/lex.cc"
-yy449:
+#line 2601 "src/ast/lex.cc"
+yy439:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy447;
-       goto yy446;
+       if (yych == '\n') goto yy437;
+       goto yy436;
 }
-#line 499 "../src/ast/lex.re"
+#line 489 "../src/ast/lex.re"
 
 }
 
@@ -2684,44 +2615,44 @@ fst:
     tok = cur;
     c = get_column();
     
-#line 2688 "src/ast/lex.cc"
+#line 2619 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == ']') goto yy453;
-#line 511 "../src/ast/lex.re"
+       if (yych == ']') goto yy443;
+#line 501 "../src/ast/lex.re"
        { l = lex_cls_chr(); goto snd; }
-#line 2696 "src/ast/lex.cc"
-yy453:
+#line 2627 "src/ast/lex.cc"
+yy443:
        ++YYCURSOR;
-#line 510 "../src/ast/lex.re"
+#line 500 "../src/ast/lex.re"
        { return ast_cls(cline, c0, cls, neg); }
-#line 2701 "src/ast/lex.cc"
+#line 2632 "src/ast/lex.cc"
 }
-#line 512 "../src/ast/lex.re"
+#line 502 "../src/ast/lex.re"
 
 snd:
     
-#line 2707 "src/ast/lex.cc"
+#line 2638 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*(YYMARKER = YYCURSOR);
-       if (yych == '-') goto yy458;
-yy457:
-#line 515 "../src/ast/lex.re"
+       if (yych == '-') goto yy448;
+yy447:
+#line 505 "../src/ast/lex.re"
        { u = l; goto add; }
-#line 2716 "src/ast/lex.cc"
-yy458:
+#line 2647 "src/ast/lex.cc"
+yy448:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != ']') goto yy460;
+       if (yych != ']') goto yy450;
        YYCURSOR = YYMARKER;
-       goto yy457;
-yy460:
+       goto yy447;
+yy450:
        ++YYCURSOR;
        YYCURSOR -= 1;
-#line 516 "../src/ast/lex.re"
+#line 506 "../src/ast/lex.re"
        {
             u = lex_cls_chr();
             if (l > u) {
@@ -2730,9 +2661,9 @@ yy460:
             }
             goto add;
         }
-#line 2734 "src/ast/lex.cc"
+#line 2665 "src/ast/lex.cc"
 }
-#line 524 "../src/ast/lex.re"
+#line 514 "../src/ast/lex.re"
 
 add:
     cls->push_back(ASTRange(l, u, c));
@@ -2744,319 +2675,319 @@ uint32_t Scanner::lex_cls_chr()
     tok = cur;
     const uint32_t l = get_cline(), c = get_column();
     
-#line 2748 "src/ast/lex.cc"
+#line 2679 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
        if ((YYLIMIT - YYCURSOR) < 10) YYFILL(10);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '\f') {
-               if (yych <= 0x00) goto yy464;
-               if (yych == '\n') goto yy468;
-               goto yy466;
+               if (yych <= 0x00) goto yy454;
+               if (yych == '\n') goto yy458;
+               goto yy456;
        } else {
-               if (yych <= '\r') goto yy470;
-               if (yych == '\\') goto yy471;
-               goto yy466;
+               if (yych <= '\r') goto yy460;
+               if (yych == '\\') goto yy461;
+               goto yy456;
        }
-yy464:
+yy454:
        ++YYCURSOR;
-#line 536 "../src/ast/lex.re"
+#line 526 "../src/ast/lex.re"
        { fail_if_eof(); return 0; }
-#line 2767 "src/ast/lex.cc"
-yy466:
+#line 2698 "src/ast/lex.cc"
+yy456:
        ++YYCURSOR;
-yy467:
-#line 542 "../src/ast/lex.re"
+yy457:
+#line 532 "../src/ast/lex.re"
        { return static_cast<uint8_t>(tok[0]); }
-#line 2773 "src/ast/lex.cc"
-yy468:
+#line 2704 "src/ast/lex.cc"
+yy458:
        ++YYCURSOR;
-#line 537 "../src/ast/lex.re"
+#line 527 "../src/ast/lex.re"
        { fatal_lc(l, c, "newline in character class"); }
-#line 2778 "src/ast/lex.cc"
-yy470:
+#line 2709 "src/ast/lex.cc"
+yy460:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy468;
-       goto yy467;
-yy471:
+       if (yych == '\n') goto yy458;
+       goto yy457;
+yy461:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '\\') {
                if (yych <= '/') {
                        if (yych <= '\f') {
-                               if (yych <= 0x00) goto yy472;
-                               if (yych == '\n') goto yy468;
-                               goto yy473;
+                               if (yych <= 0x00) goto yy462;
+                               if (yych == '\n') goto yy458;
+                               goto yy463;
                        } else {
-                               if (yych <= '\r') goto yy475;
-                               if (yych == '-') goto yy476;
-                               goto yy473;
+                               if (yych <= '\r') goto yy465;
+                               if (yych == '-') goto yy466;
+                               goto yy463;
                        }
                } else {
                        if (yych <= 'U') {
-                               if (yych <= '3') goto yy478;
-                               if (yych <= '7') goto yy480;
-                               if (yych <= 'T') goto yy473;
-                               goto yy481;
+                               if (yych <= '3') goto yy468;
+                               if (yych <= '7') goto yy470;
+                               if (yych <= 'T') goto yy463;
+                               goto yy471;
                        } else {
-                               if (yych == 'X') goto yy483;
-                               if (yych <= '[') goto yy473;
-                               goto yy484;
+                               if (yych == 'X') goto yy473;
+                               if (yych <= '[') goto yy463;
+                               goto yy474;
                        }
                }
        } else {
                if (yych <= 'n') {
                        if (yych <= 'b') {
-                               if (yych <= ']') goto yy486;
-                               if (yych <= '`') goto yy473;
-                               if (yych <= 'a') goto yy488;
-                               goto yy490;
+                               if (yych <= ']') goto yy476;
+                               if (yych <= '`') goto yy463;
+                               if (yych <= 'a') goto yy478;
+                               goto yy480;
                        } else {
-                               if (yych == 'f') goto yy492;
-                               if (yych <= 'm') goto yy473;
-                               goto yy494;
+                               if (yych == 'f') goto yy482;
+                               if (yych <= 'm') goto yy463;
+                               goto yy484;
                        }
                } else {
                        if (yych <= 't') {
-                               if (yych == 'r') goto yy496;
-                               if (yych <= 's') goto yy473;
-                               goto yy498;
+                               if (yych == 'r') goto yy486;
+                               if (yych <= 's') goto yy463;
+                               goto yy488;
                        } else {
                                if (yych <= 'v') {
-                                       if (yych <= 'u') goto yy483;
-                                       goto yy500;
+                                       if (yych <= 'u') goto yy473;
+                                       goto yy490;
                                } else {
-                                       if (yych == 'x') goto yy502;
-                                       goto yy473;
+                                       if (yych == 'x') goto yy492;
+                                       goto yy463;
                                }
                        }
                }
        }
-yy472:
-#line 540 "../src/ast/lex.re"
+yy462:
+#line 530 "../src/ast/lex.re"
        { fatal_lc(l, c, "syntax error in escape sequence"); }
-#line 2839 "src/ast/lex.cc"
-yy473:
+#line 2770 "src/ast/lex.cc"
+yy463:
        ++YYCURSOR;
-yy474:
-#line 555 "../src/ast/lex.re"
+yy464:
+#line 545 "../src/ast/lex.re"
        {
             warn.useless_escape(cline, get_column(), tok[1]);
             return static_cast<uint8_t>(tok[1]);
         }
-#line 2848 "src/ast/lex.cc"
-yy475:
+#line 2779 "src/ast/lex.cc"
+yy465:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy468;
-       goto yy474;
-yy476:
+       if (yych == '\n') goto yy458;
+       goto yy464;
+yy466:
        ++YYCURSOR;
-#line 553 "../src/ast/lex.re"
+#line 543 "../src/ast/lex.re"
        { return static_cast<uint8_t>('-'); }
-#line 2857 "src/ast/lex.cc"
-yy478:
+#line 2788 "src/ast/lex.cc"
+yy468:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= '/') goto yy479;
-       if (yych <= '7') goto yy503;
-yy479:
-#line 539 "../src/ast/lex.re"
+       if (yych <= '/') goto yy469;
+       if (yych <= '7') goto yy493;
+yy469:
+#line 529 "../src/ast/lex.re"
        { fatal_lc(l, c, "syntax error in octal escape sequence"); }
-#line 2866 "src/ast/lex.cc"
-yy480:
+#line 2797 "src/ast/lex.cc"
+yy470:
        ++YYCURSOR;
-       goto yy479;
-yy481:
+       goto yy469;
+yy471:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
-               if (yych <= '/') goto yy482;
-               if (yych <= '9') goto yy505;
+               if (yych <= '/') goto yy472;
+               if (yych <= '9') goto yy495;
        } else {
-               if (yych <= 'F') goto yy505;
-               if (yych <= '`') goto yy482;
-               if (yych <= 'f') goto yy505;
+               if (yych <= 'F') goto yy495;
+               if (yych <= '`') goto yy472;
+               if (yych <= 'f') goto yy495;
        }
-yy482:
-#line 538 "../src/ast/lex.re"
+yy472:
+#line 528 "../src/ast/lex.re"
        { fatal_lc(l, c, "syntax error in hexadecimal escape sequence"); }
-#line 2884 "src/ast/lex.cc"
-yy483:
+#line 2815 "src/ast/lex.cc"
+yy473:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
-               if (yych <= '/') goto yy482;
-               if (yych <= '9') goto yy506;
-               goto yy482;
+               if (yych <= '/') goto yy472;
+               if (yych <= '9') goto yy496;
+               goto yy472;
        } else {
-               if (yych <= 'F') goto yy506;
-               if (yych <= '`') goto yy482;
-               if (yych <= 'f') goto yy506;
-               goto yy482;
+               if (yych <= 'F') goto yy496;
+               if (yych <= '`') goto yy472;
+               if (yych <= 'f') goto yy496;
+               goto yy472;
        }
-yy484:
+yy474:
        ++YYCURSOR;
-#line 552 "../src/ast/lex.re"
+#line 542 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\\'); }
-#line 2902 "src/ast/lex.cc"
-yy486:
+#line 2833 "src/ast/lex.cc"
+yy476:
        ++YYCURSOR;
-#line 554 "../src/ast/lex.re"
+#line 544 "../src/ast/lex.re"
        { return static_cast<uint8_t>(']'); }
-#line 2907 "src/ast/lex.cc"
-yy488:
+#line 2838 "src/ast/lex.cc"
+yy478:
        ++YYCURSOR;
-#line 545 "../src/ast/lex.re"
+#line 535 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\a'); }
-#line 2912 "src/ast/lex.cc"
-yy490:
+#line 2843 "src/ast/lex.cc"
+yy480:
        ++YYCURSOR;
-#line 546 "../src/ast/lex.re"
+#line 536 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\b'); }
-#line 2917 "src/ast/lex.cc"
-yy492:
+#line 2848 "src/ast/lex.cc"
+yy482:
        ++YYCURSOR;
-#line 547 "../src/ast/lex.re"
+#line 537 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\f'); }
-#line 2922 "src/ast/lex.cc"
-yy494:
+#line 2853 "src/ast/lex.cc"
+yy484:
        ++YYCURSOR;
-#line 548 "../src/ast/lex.re"
+#line 538 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\n'); }
-#line 2927 "src/ast/lex.cc"
-yy496:
+#line 2858 "src/ast/lex.cc"
+yy486:
        ++YYCURSOR;
-#line 549 "../src/ast/lex.re"
+#line 539 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\r'); }
-#line 2932 "src/ast/lex.cc"
-yy498:
+#line 2863 "src/ast/lex.cc"
+yy488:
        ++YYCURSOR;
-#line 550 "../src/ast/lex.re"
+#line 540 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\t'); }
-#line 2937 "src/ast/lex.cc"
-yy500:
+#line 2868 "src/ast/lex.cc"
+yy490:
        ++YYCURSOR;
-#line 551 "../src/ast/lex.re"
+#line 541 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\v'); }
-#line 2942 "src/ast/lex.cc"
-yy502:
+#line 2873 "src/ast/lex.cc"
+yy492:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
-               if (yych <= '/') goto yy482;
-               if (yych <= '9') goto yy507;
-               goto yy482;
+               if (yych <= '/') goto yy472;
+               if (yych <= '9') goto yy497;
+               goto yy472;
        } else {
-               if (yych <= 'F') goto yy507;
-               if (yych <= '`') goto yy482;
-               if (yych <= 'f') goto yy507;
-               goto yy482;
+               if (yych <= 'F') goto yy497;
+               if (yych <= '`') goto yy472;
+               if (yych <= 'f') goto yy497;
+               goto yy472;
        }
-yy503:
+yy493:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '/') goto yy504;
-       if (yych <= '7') goto yy508;
-yy504:
+       if (yych <= '/') goto yy494;
+       if (yych <= '7') goto yy498;
+yy494:
        YYCURSOR = YYMARKER;
        if (yyaccept == 0) {
-               goto yy479;
+               goto yy469;
        } else {
-               goto yy482;
+               goto yy472;
        }
-yy505:
+yy495:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy504;
-               if (yych <= '9') goto yy510;
-               goto yy504;
+               if (yych <= '/') goto yy494;
+               if (yych <= '9') goto yy500;
+               goto yy494;
        } else {
-               if (yych <= 'F') goto yy510;
-               if (yych <= '`') goto yy504;
-               if (yych <= 'f') goto yy510;
-               goto yy504;
+               if (yych <= 'F') goto yy500;
+               if (yych <= '`') goto yy494;
+               if (yych <= 'f') goto yy500;
+               goto yy494;
        }
-yy506:
+yy496:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy504;
-               if (yych <= '9') goto yy511;
-               goto yy504;
+               if (yych <= '/') goto yy494;
+               if (yych <= '9') goto yy501;
+               goto yy494;
        } else {
-               if (yych <= 'F') goto yy511;
-               if (yych <= '`') goto yy504;
-               if (yych <= 'f') goto yy511;
-               goto yy504;
+               if (yych <= 'F') goto yy501;
+               if (yych <= '`') goto yy494;
+               if (yych <= 'f') goto yy501;
+               goto yy494;
        }
-yy507:
+yy497:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy504;
-               if (yych <= '9') goto yy512;
-               goto yy504;
+               if (yych <= '/') goto yy494;
+               if (yych <= '9') goto yy502;
+               goto yy494;
        } else {
-               if (yych <= 'F') goto yy512;
-               if (yych <= '`') goto yy504;
-               if (yych <= 'f') goto yy512;
-               goto yy504;
+               if (yych <= 'F') goto yy502;
+               if (yych <= '`') goto yy494;
+               if (yych <= 'f') goto yy502;
+               goto yy494;
        }
-yy508:
+yy498:
        ++YYCURSOR;
-#line 544 "../src/ast/lex.re"
+#line 534 "../src/ast/lex.re"
        { return unesc_oct(tok, cur); }
-#line 3007 "src/ast/lex.cc"
-yy510:
+#line 2938 "src/ast/lex.cc"
+yy500:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy504;
-               if (yych <= '9') goto yy514;
-               goto yy504;
+               if (yych <= '/') goto yy494;
+               if (yych <= '9') goto yy504;
+               goto yy494;
        } else {
-               if (yych <= 'F') goto yy514;
-               if (yych <= '`') goto yy504;
-               if (yych <= 'f') goto yy514;
-               goto yy504;
+               if (yych <= 'F') goto yy504;
+               if (yych <= '`') goto yy494;
+               if (yych <= 'f') goto yy504;
+               goto yy494;
        }
-yy511:
+yy501:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy504;
-               if (yych <= '9') goto yy507;
-               goto yy504;
+               if (yych <= '/') goto yy494;
+               if (yych <= '9') goto yy497;
+               goto yy494;
        } else {
-               if (yych <= 'F') goto yy507;
-               if (yych <= '`') goto yy504;
-               if (yych <= 'f') goto yy507;
-               goto yy504;
+               if (yych <= 'F') goto yy497;
+               if (yych <= '`') goto yy494;
+               if (yych <= 'f') goto yy497;
+               goto yy494;
        }
-yy512:
+yy502:
        ++YYCURSOR;
-#line 543 "../src/ast/lex.re"
+#line 533 "../src/ast/lex.re"
        { return unesc_hex(tok, cur); }
-#line 3036 "src/ast/lex.cc"
-yy514:
+#line 2967 "src/ast/lex.cc"
+yy504:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy504;
-               if (yych >= ':') goto yy504;
+               if (yych <= '/') goto yy494;
+               if (yych >= ':') goto yy494;
        } else {
-               if (yych <= 'F') goto yy515;
-               if (yych <= '`') goto yy504;
-               if (yych >= 'g') goto yy504;
+               if (yych <= 'F') goto yy505;
+               if (yych <= '`') goto yy494;
+               if (yych >= 'g') goto yy494;
        }
-yy515:
+yy505:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy504;
-               if (yych <= '9') goto yy506;
-               goto yy504;
+               if (yych <= '/') goto yy494;
+               if (yych <= '9') goto yy496;
+               goto yy494;
        } else {
-               if (yych <= 'F') goto yy506;
-               if (yych <= '`') goto yy504;
-               if (yych <= 'f') goto yy506;
-               goto yy504;
+               if (yych <= 'F') goto yy496;
+               if (yych <= '`') goto yy494;
+               if (yych <= 'f') goto yy496;
+               goto yy494;
        }
 }
-#line 559 "../src/ast/lex.re"
+#line 549 "../src/ast/lex.re"
 
 }
 
@@ -3066,309 +2997,309 @@ uint32_t Scanner::lex_str_chr(char quote, bool &end)
     tok = cur;
     const uint32_t l = get_cline(), c = get_column();
     
-#line 3070 "src/ast/lex.cc"
+#line 3001 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
        if ((YYLIMIT - YYCURSOR) < 10) YYFILL(10);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '\f') {
-               if (yych <= 0x00) goto yy518;
-               if (yych == '\n') goto yy522;
-               goto yy520;
+               if (yych <= 0x00) goto yy508;
+               if (yych == '\n') goto yy512;
+               goto yy510;
        } else {
-               if (yych <= '\r') goto yy524;
-               if (yych == '\\') goto yy525;
-               goto yy520;
+               if (yych <= '\r') goto yy514;
+               if (yych == '\\') goto yy515;
+               goto yy510;
        }
-yy518:
+yy508:
        ++YYCURSOR;
-#line 569 "../src/ast/lex.re"
+#line 559 "../src/ast/lex.re"
        { fail_if_eof(); return 0; }
-#line 3089 "src/ast/lex.cc"
-yy520:
+#line 3020 "src/ast/lex.cc"
+yy510:
        ++YYCURSOR;
-yy521:
-#line 575 "../src/ast/lex.re"
+yy511:
+#line 565 "../src/ast/lex.re"
        {
             end = tok[0] == quote;
             return static_cast<uint8_t>(tok[0]);
         }
-#line 3098 "src/ast/lex.cc"
-yy522:
+#line 3029 "src/ast/lex.cc"
+yy512:
        ++YYCURSOR;
-#line 570 "../src/ast/lex.re"
+#line 560 "../src/ast/lex.re"
        { fatal_lc(l, c, "newline in character string"); }
-#line 3103 "src/ast/lex.cc"
-yy524:
+#line 3034 "src/ast/lex.cc"
+yy514:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy522;
-       goto yy521;
-yy525:
+       if (yych == '\n') goto yy512;
+       goto yy511;
+yy515:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '`') {
                if (yych <= '3') {
                        if (yych <= '\n') {
-                               if (yych <= 0x00) goto yy526;
-                               if (yych <= '\t') goto yy527;
-                               goto yy522;
+                               if (yych <= 0x00) goto yy516;
+                               if (yych <= '\t') goto yy517;
+                               goto yy512;
                        } else {
-                               if (yych == '\r') goto yy529;
-                               if (yych <= '/') goto yy527;
-                               goto yy530;
+                               if (yych == '\r') goto yy519;
+                               if (yych <= '/') goto yy517;
+                               goto yy520;
                        }
                } else {
                        if (yych <= 'W') {
-                               if (yych <= '7') goto yy532;
-                               if (yych == 'U') goto yy533;
-                               goto yy527;
+                               if (yych <= '7') goto yy522;
+                               if (yych == 'U') goto yy523;
+                               goto yy517;
                        } else {
-                               if (yych <= 'X') goto yy535;
-                               if (yych == '\\') goto yy536;
-                               goto yy527;
+                               if (yych <= 'X') goto yy525;
+                               if (yych == '\\') goto yy526;
+                               goto yy517;
                        }
                }
        } else {
                if (yych <= 'q') {
                        if (yych <= 'e') {
-                               if (yych <= 'a') goto yy538;
-                               if (yych <= 'b') goto yy540;
-                               goto yy527;
+                               if (yych <= 'a') goto yy528;
+                               if (yych <= 'b') goto yy530;
+                               goto yy517;
                        } else {
-                               if (yych <= 'f') goto yy542;
-                               if (yych == 'n') goto yy544;
-                               goto yy527;
+                               if (yych <= 'f') goto yy532;
+                               if (yych == 'n') goto yy534;
+                               goto yy517;
                        }
                } else {
                        if (yych <= 'u') {
-                               if (yych <= 'r') goto yy546;
-                               if (yych <= 's') goto yy527;
-                               if (yych <= 't') goto yy548;
-                               goto yy535;
+                               if (yych <= 'r') goto yy536;
+                               if (yych <= 's') goto yy517;
+                               if (yych <= 't') goto yy538;
+                               goto yy525;
                        } else {
-                               if (yych <= 'v') goto yy550;
-                               if (yych == 'x') goto yy552;
-                               goto yy527;
+                               if (yych <= 'v') goto yy540;
+                               if (yych == 'x') goto yy542;
+                               goto yy517;
                        }
                }
        }
-yy526:
-#line 573 "../src/ast/lex.re"
+yy516:
+#line 563 "../src/ast/lex.re"
        { fatal_lc(l, c, "syntax error in escape sequence"); }
-#line 3159 "src/ast/lex.cc"
-yy527:
+#line 3090 "src/ast/lex.cc"
+yy517:
        ++YYCURSOR;
-yy528:
-#line 589 "../src/ast/lex.re"
+yy518:
+#line 579 "../src/ast/lex.re"
        {
             if (tok[1] != quote) {
                 warn.useless_escape(cline, get_column(), tok[1]);
             }
             return static_cast<uint8_t>(tok[1]);
         }
-#line 3170 "src/ast/lex.cc"
-yy529:
+#line 3101 "src/ast/lex.cc"
+yy519:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy522;
-       goto yy528;
-yy530:
+       if (yych == '\n') goto yy512;
+       goto yy518;
+yy520:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= '/') goto yy531;
-       if (yych <= '7') goto yy553;
-yy531:
-#line 572 "../src/ast/lex.re"
+       if (yych <= '/') goto yy521;
+       if (yych <= '7') goto yy543;
+yy521:
+#line 562 "../src/ast/lex.re"
        { fatal_lc(l, c, "syntax error in octal escape sequence"); }
-#line 3183 "src/ast/lex.cc"
-yy532:
+#line 3114 "src/ast/lex.cc"
+yy522:
        ++YYCURSOR;
-       goto yy531;
-yy533:
+       goto yy521;
+yy523:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
-               if (yych <= '/') goto yy534;
-               if (yych <= '9') goto yy555;
+               if (yych <= '/') goto yy524;
+               if (yych <= '9') goto yy545;
        } else {
-               if (yych <= 'F') goto yy555;
-               if (yych <= '`') goto yy534;
-               if (yych <= 'f') goto yy555;
+               if (yych <= 'F') goto yy545;
+               if (yych <= '`') goto yy524;
+               if (yych <= 'f') goto yy545;
        }
-yy534:
-#line 571 "../src/ast/lex.re"
+yy524:
+#line 561 "../src/ast/lex.re"
        { fatal_lc(l, c, "syntax error in hexadecimal escape sequence"); }
-#line 3201 "src/ast/lex.cc"
-yy535:
+#line 3132 "src/ast/lex.cc"
+yy525:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
-               if (yych <= '/') goto yy534;
-               if (yych <= '9') goto yy556;
-               goto yy534;
+               if (yych <= '/') goto yy524;
+               if (yych <= '9') goto yy546;
+               goto yy524;
        } else {
-               if (yych <= 'F') goto yy556;
-               if (yych <= '`') goto yy534;
-               if (yych <= 'f') goto yy556;
-               goto yy534;
+               if (yych <= 'F') goto yy546;
+               if (yych <= '`') goto yy524;
+               if (yych <= 'f') goto yy546;
+               goto yy524;
        }
-yy536:
+yy526:
        ++YYCURSOR;
-#line 588 "../src/ast/lex.re"
+#line 578 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\\'); }
-#line 3219 "src/ast/lex.cc"
-yy538:
+#line 3150 "src/ast/lex.cc"
+yy528:
        ++YYCURSOR;
-#line 581 "../src/ast/lex.re"
+#line 571 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\a'); }
-#line 3224 "src/ast/lex.cc"
-yy540:
+#line 3155 "src/ast/lex.cc"
+yy530:
        ++YYCURSOR;
-#line 582 "../src/ast/lex.re"
+#line 572 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\b'); }
-#line 3229 "src/ast/lex.cc"
-yy542:
+#line 3160 "src/ast/lex.cc"
+yy532:
        ++YYCURSOR;
-#line 583 "../src/ast/lex.re"
+#line 573 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\f'); }
-#line 3234 "src/ast/lex.cc"
-yy544:
+#line 3165 "src/ast/lex.cc"
+yy534:
        ++YYCURSOR;
-#line 584 "../src/ast/lex.re"
+#line 574 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\n'); }
-#line 3239 "src/ast/lex.cc"
-yy546:
+#line 3170 "src/ast/lex.cc"
+yy536:
        ++YYCURSOR;
-#line 585 "../src/ast/lex.re"
+#line 575 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\r'); }
-#line 3244 "src/ast/lex.cc"
-yy548:
+#line 3175 "src/ast/lex.cc"
+yy538:
        ++YYCURSOR;
-#line 586 "../src/ast/lex.re"
+#line 576 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\t'); }
-#line 3249 "src/ast/lex.cc"
-yy550:
+#line 3180 "src/ast/lex.cc"
+yy540:
        ++YYCURSOR;
-#line 587 "../src/ast/lex.re"
+#line 577 "../src/ast/lex.re"
        { return static_cast<uint8_t>('\v'); }
-#line 3254 "src/ast/lex.cc"
-yy552:
+#line 3185 "src/ast/lex.cc"
+yy542:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
-               if (yych <= '/') goto yy534;
-               if (yych <= '9') goto yy557;
-               goto yy534;
+               if (yych <= '/') goto yy524;
+               if (yych <= '9') goto yy547;
+               goto yy524;
        } else {
-               if (yych <= 'F') goto yy557;
-               if (yych <= '`') goto yy534;
-               if (yych <= 'f') goto yy557;
-               goto yy534;
+               if (yych <= 'F') goto yy547;
+               if (yych <= '`') goto yy524;
+               if (yych <= 'f') goto yy547;
+               goto yy524;
        }
-yy553:
+yy543:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '/') goto yy554;
-       if (yych <= '7') goto yy558;
-yy554:
+       if (yych <= '/') goto yy544;
+       if (yych <= '7') goto yy548;
+yy544:
        YYCURSOR = YYMARKER;
        if (yyaccept == 0) {
-               goto yy531;
+               goto yy521;
        } else {
-               goto yy534;
+               goto yy524;
        }
-yy555:
+yy545:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy554;
-               if (yych <= '9') goto yy560;
-               goto yy554;
+               if (yych <= '/') goto yy544;
+               if (yych <= '9') goto yy550;
+               goto yy544;
        } else {
-               if (yych <= 'F') goto yy560;
-               if (yych <= '`') goto yy554;
-               if (yych <= 'f') goto yy560;
-               goto yy554;
+               if (yych <= 'F') goto yy550;
+               if (yych <= '`') goto yy544;
+               if (yych <= 'f') goto yy550;
+               goto yy544;
        }
-yy556:
+yy546:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy554;
-               if (yych <= '9') goto yy561;
-               goto yy554;
+               if (yych <= '/') goto yy544;
+               if (yych <= '9') goto yy551;
+               goto yy544;
        } else {
-               if (yych <= 'F') goto yy561;
-               if (yych <= '`') goto yy554;
-               if (yych <= 'f') goto yy561;
-               goto yy554;
+               if (yych <= 'F') goto yy551;
+               if (yych <= '`') goto yy544;
+               if (yych <= 'f') goto yy551;
+               goto yy544;
        }
-yy557:
+yy547:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy554;
-               if (yych <= '9') goto yy562;
-               goto yy554;
+               if (yych <= '/') goto yy544;
+               if (yych <= '9') goto yy552;
+               goto yy544;
        } else {
-               if (yych <= 'F') goto yy562;
-               if (yych <= '`') goto yy554;
-               if (yych <= 'f') goto yy562;
-               goto yy554;
+               if (yych <= 'F') goto yy552;
+               if (yych <= '`') goto yy544;
+               if (yych <= 'f') goto yy552;
+               goto yy544;
        }
-yy558:
+yy548:
        ++YYCURSOR;
-#line 580 "../src/ast/lex.re"
+#line 570 "../src/ast/lex.re"
        { return unesc_oct(tok, cur); }
-#line 3319 "src/ast/lex.cc"
-yy560:
+#line 3250 "src/ast/lex.cc"
+yy550:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy554;
-               if (yych <= '9') goto yy564;
-               goto yy554;
+               if (yych <= '/') goto yy544;
+               if (yych <= '9') goto yy554;
+               goto yy544;
        } else {
-               if (yych <= 'F') goto yy564;
-               if (yych <= '`') goto yy554;
-               if (yych <= 'f') goto yy564;
-               goto yy554;
+               if (yych <= 'F') goto yy554;
+               if (yych <= '`') goto yy544;
+               if (yych <= 'f') goto yy554;
+               goto yy544;
        }
-yy561:
+yy551:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy554;
-               if (yych <= '9') goto yy557;
-               goto yy554;
+               if (yych <= '/') goto yy544;
+               if (yych <= '9') goto yy547;
+               goto yy544;
        } else {
-               if (yych <= 'F') goto yy557;
-               if (yych <= '`') goto yy554;
-               if (yych <= 'f') goto yy557;
-               goto yy554;
+               if (yych <= 'F') goto yy547;
+               if (yych <= '`') goto yy544;
+               if (yych <= 'f') goto yy547;
+               goto yy544;
        }
-yy562:
+yy552:
        ++YYCURSOR;
-#line 579 "../src/ast/lex.re"
+#line 569 "../src/ast/lex.re"
        { return unesc_hex(tok, cur); }
-#line 3348 "src/ast/lex.cc"
-yy564:
+#line 3279 "src/ast/lex.cc"
+yy554:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy554;
-               if (yych >= ':') goto yy554;
+               if (yych <= '/') goto yy544;
+               if (yych >= ':') goto yy544;
        } else {
-               if (yych <= 'F') goto yy565;
-               if (yych <= '`') goto yy554;
-               if (yych >= 'g') goto yy554;
+               if (yych <= 'F') goto yy555;
+               if (yych <= '`') goto yy544;
+               if (yych >= 'g') goto yy544;
        }
-yy565:
+yy555:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy554;
-               if (yych <= '9') goto yy556;
-               goto yy554;
+               if (yych <= '/') goto yy544;
+               if (yych <= '9') goto yy546;
+               goto yy544;
        } else {
-               if (yych <= 'F') goto yy556;
-               if (yych <= '`') goto yy554;
-               if (yych <= 'f') goto yy556;
-               goto yy554;
+               if (yych <= 'F') goto yy546;
+               if (yych <= '`') goto yy544;
+               if (yych <= 'f') goto yy546;
+               goto yy544;
        }
 }
-#line 595 "../src/ast/lex.re"
+#line 585 "../src/ast/lex.re"
 
 }
 
@@ -3388,7 +3319,7 @@ void Scanner::set_sourceline ()
 sourceline:
     tok = cur;
 
-#line 3392 "src/ast/lex.cc"
+#line 3323 "src/ast/lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -3429,100 +3360,100 @@ sourceline:
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '\r') {
                if (yych <= '\t') {
-                       if (yych >= 0x01) goto yy570;
+                       if (yych >= 0x01) goto yy560;
                } else {
-                       if (yych <= '\n') goto yy572;
-                       if (yych <= '\f') goto yy570;
-                       goto yy574;
+                       if (yych <= '\n') goto yy562;
+                       if (yych <= '\f') goto yy560;
+                       goto yy564;
                }
        } else {
                if (yych <= '"') {
-                       if (yych <= '!') goto yy570;
-                       goto yy575;
+                       if (yych <= '!') goto yy560;
+                       goto yy565;
                } else {
-                       if (yych <= '0') goto yy570;
-                       if (yych <= '9') goto yy576;
-                       goto yy570;
+                       if (yych <= '0') goto yy560;
+                       if (yych <= '9') goto yy566;
+                       goto yy560;
                }
        }
        ++YYCURSOR;
-#line 632 "../src/ast/lex.re"
+#line 622 "../src/ast/lex.re"
        {
         --cur;
         tok = cur;
         return;
     }
-#line 3456 "src/ast/lex.cc"
-yy570:
+#line 3387 "src/ast/lex.cc"
+yy560:
        ++YYCURSOR;
-yy571:
-#line 638 "../src/ast/lex.re"
+yy561:
+#line 628 "../src/ast/lex.re"
        { goto sourceline; }
-#line 3462 "src/ast/lex.cc"
-yy572:
+#line 3393 "src/ast/lex.cc"
+yy562:
        ++YYCURSOR;
-#line 627 "../src/ast/lex.re"
+#line 617 "../src/ast/lex.re"
        {
         tok = cur;
         return;
     }
-#line 3470 "src/ast/lex.cc"
-yy574:
+#line 3401 "src/ast/lex.cc"
+yy564:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy572;
-       goto yy571;
-yy575:
+       if (yych == '\n') goto yy562;
+       goto yy561;
+yy565:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= 0x00) goto yy571;
-       if (yych == '\n') goto yy571;
-       goto yy580;
-yy576:
+       if (yych <= 0x00) goto yy561;
+       if (yych == '\n') goto yy561;
+       goto yy570;
+yy566:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 64) {
-               goto yy576;
+               goto yy566;
        }
-#line 614 "../src/ast/lex.re"
+#line 604 "../src/ast/lex.re"
        {
         if (!s_to_u32_unsafe (tok, cur, cline)) {
             fatal_lc(get_cline(), get_column(), "line number overflow");
         }
         goto sourceline;
     }
-#line 3494 "src/ast/lex.cc"
-yy579:
+#line 3425 "src/ast/lex.cc"
+yy569:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy580:
+yy570:
        if (yybm[0+yych] & 128) {
-               goto yy579;
+               goto yy569;
        }
-       if (yych <= '\n') goto yy581;
-       if (yych <= '"') goto yy582;
-       goto yy584;
-yy581:
+       if (yych <= '\n') goto yy571;
+       if (yych <= '"') goto yy572;
+       goto yy574;
+yy571:
        YYCURSOR = YYMARKER;
-       goto yy571;
-yy582:
+       goto yy561;
+yy572:
        ++YYCURSOR;
-#line 621 "../src/ast/lex.re"
+#line 611 "../src/ast/lex.re"
        {
         in.escaped_file_name = std::string (tok + 1, tok_len () - 2); // strip quotes
         strrreplace (in.escaped_file_name, "\\", "\\\\");
         goto sourceline;
     }
-#line 3517 "src/ast/lex.cc"
-yy584:
+#line 3448 "src/ast/lex.cc"
+yy574:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= 0x00) goto yy581;
-       if (yych == '\n') goto yy581;
-       goto yy579;
+       if (yych <= 0x00) goto yy571;
+       if (yych == '\n') goto yy571;
+       goto yy569;
 }
-#line 639 "../src/ast/lex.re"
+#line 629 "../src/ast/lex.re"
 
 }
 
index af6068cf3f974cdc142be037bb655a72e222bcf5..dbcbd3dc1636244eafba08ba443697962c420921 100644 (file)
@@ -240,8 +240,11 @@ scan:
     "{"  { lex_code_in_braces(); return TOKEN_CODE; }
     ":=" { lex_code_indented(); return TOKEN_CODE; }
 
-    "=>"  { lex_cgoto(); return TOKEN_CNEXT; }
-    ":=>" { lex_cgoto(); return TOKEN_CJUMP; }
+    ":"? "=>" space* @p name {
+        yylval.str = new std::string(p, static_cast<size_t>(cur - p));
+        return tok[0] == ':' ? TOKEN_CJUMP : TOKEN_CNEXT;
+    }
+
     "<"   { return lex_clist(); }
 
     "//" { lex_cpp_comment(); goto scan; }
@@ -405,19 +408,6 @@ error:
     fatal_l(get_cline(), "syntax error in condition list");
 }
 
-void Scanner::lex_cgoto()
-{
-/*!re2c
-    space* { goto name; }
-*/
-name:
-    tok = cur;
-/*!re2c
-    name   { yylval.str = new std::string (tok, tok_len ()); return; }
-    *      { fatal_l(get_cline(), "syntax error in condition goto"); }
-*/
-}
-
 void Scanner::lex_code_indented()
 {
     const uint32_t line = cline;
index 668f4e9462cd9394328b95b63e569c1f5a15c8b7..06766ecffa3e8b2bd9a4ac15849218f6cc1602cc 100644 (file)
@@ -39,7 +39,6 @@ class Scanner: private ScannerState
     bool lex_namedef_context_re2c();
     bool lex_namedef_context_flex();
     int lex_clist();
-    void lex_cgoto();
     void lex_string(char delim);
     void lex_tags(Output &out, bool mtags);
     void set_sourceline ();