]> granicus.if.org Git - re2c/commitdiff
Fixed bug #142 "segvault with null terminated input"
authorUlya Trofimovich <skvadrik@gmail.com>
Wed, 11 May 2016 14:47:37 +0000 (15:47 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Wed, 11 May 2016 14:47:37 +0000 (15:47 +0100)
Steps to reproduce:
    $ echo -ne "&\x00" > A
    $ re2c A
    Segmentation fault

Analyses: when re2c finds NULL in the input file, it checks for the
end of input; if indeed it has reached the end of input, it stops.
Otherwise, it's just some NULL byte in the middle of input; it should
be handled like any other character.

The first case (NULL as end of input) was handled correctly, but
in the second case (NULL in the middle of input) re2c crashed:
someone forgot to put an appropriate 'goto' statement, which caused
completely ad-hoc control flow in lexer.

re2c/bootstrap/src/parse/lex.cc
re2c/src/parse/lex.re
re2c/test/bug142.c [new file with mode: 0644]
re2c/test/bug142.re [new file with mode: 0644]

index 2a30f76d3aedd714af57153afaecf8729e444772..a6c45443410d7665aa62c50fcd1a8144be695a4a 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.16 on Tue May 10 13:05:36 2016 */
+/* Generated by re2c 0.16 on Wed May 11 15:38:08 2016 */
 #line 1 "../src/parse/lex.re"
 #include "src/util/c99_stdint.h"
 #include <stddef.h>
@@ -116,20 +116,21 @@ echo:
        ++YYCURSOR;
 #line 153 "../src/parse/lex.re"
        {
-               if (opts->target == opt_t::CODE) {
-                       out.wraw(tok, start);
-               }
                if (cur == eof) {
+                       if (opts->target == opt_t::CODE) {
+                               out.wraw(tok, start);
+                       }
                        return Stop;
                }
+               goto echo;
        }
-#line 127 "src/parse/lex.cc"
+#line 128 "src/parse/lex.cc"
 yy4:
        ++YYCURSOR;
 yy5:
-#line 173 "../src/parse/lex.re"
+#line 174 "../src/parse/lex.re"
        { goto echo; }
-#line 133 "src/parse/lex.cc"
+#line 134 "src/parse/lex.cc"
 yy6:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
@@ -138,13 +139,13 @@ yy6:
        }
        if (yych == '#') goto yy14;
 yy7:
-#line 167 "../src/parse/lex.re"
+#line 168 "../src/parse/lex.re"
        {
                cline++;
                pos = cur;
                goto echo;
        }
-#line 148 "src/parse/lex.cc"
+#line 149 "src/parse/lex.cc"
 yy8:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '\n') goto yy6;
@@ -197,7 +198,7 @@ yy16:
                }
                return Parse;
        }
-#line 201 "src/parse/lex.cc"
+#line 202 "src/parse/lex.cc"
 yy18:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '!') goto yy20;
@@ -425,12 +426,12 @@ yy64:
 yy66:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 162 "../src/parse/lex.re"
+#line 163 "../src/parse/lex.re"
        {
                set_sourceline();
                goto echo;
        }
-#line 434 "src/parse/lex.cc"
+#line 435 "src/parse/lex.cc"
 yy68:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '\n') goto yy66;
@@ -531,7 +532,7 @@ yy89:
                lex_end_of_comment();
                goto echo;
        }
-#line 535 "src/parse/lex.cc"
+#line 536 "src/parse/lex.cc"
 yy91:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '2') goto yy98;
@@ -557,7 +558,7 @@ yy94:
                reuse();
                return Reuse;
        }
-#line 561 "src/parse/lex.cc"
+#line 562 "src/parse/lex.cc"
 yy96:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'r') goto yy102;
@@ -580,7 +581,7 @@ yy99:
                lex_tags();
                goto echo;
        }
-#line 584 "src/parse/lex.cc"
+#line 585 "src/parse/lex.cc"
 yy101:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'c') goto yy106;
@@ -606,7 +607,7 @@ yy104:
                opts.reset_mapCodeName ();
                return Rules;
        }
-#line 610 "src/parse/lex.cc"
+#line 611 "src/parse/lex.cc"
 yy106:
        ++YYCURSOR;
 #line 134 "../src/parse/lex.re"
@@ -620,7 +621,7 @@ yy106:
                lex_end_of_comment();
                goto echo;
        }
-#line 624 "src/parse/lex.cc"
+#line 625 "src/parse/lex.cc"
 yy108:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '2') goto yy111;
@@ -635,7 +636,7 @@ yy109:
                lex_end_of_comment();
                goto echo;
        }
-#line 639 "src/parse/lex.cc"
+#line 640 "src/parse/lex.cc"
 yy111:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych != 'c') goto yy13;
@@ -649,9 +650,9 @@ yy111:
                lex_end_of_comment();
                goto echo;
        }
-#line 653 "src/parse/lex.cc"
+#line 654 "src/parse/lex.cc"
 }
-#line 174 "../src/parse/lex.re"
+#line 175 "../src/parse/lex.re"
 
 }
 
@@ -659,7 +660,7 @@ void Scanner::lex_end_of_comment()
 {
        uint32_t ignored = 0;
        for (;;) {
-#line 663 "src/parse/lex.cc"
+#line 664 "src/parse/lex.cc"
 {
        YYCTYPE yych;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
@@ -675,20 +676,20 @@ void Scanner::lex_end_of_comment()
        }
 yy116:
        ++YYCURSOR;
-#line 181 "../src/parse/lex.re"
+#line 182 "../src/parse/lex.re"
        { fatal("expected end of block"); }
-#line 681 "src/parse/lex.cc"
+#line 682 "src/parse/lex.cc"
 yy118:
        ++YYCURSOR;
 yy119:
-#line 183 "../src/parse/lex.re"
+#line 184 "../src/parse/lex.re"
        { continue; }
-#line 687 "src/parse/lex.cc"
+#line 688 "src/parse/lex.cc"
 yy120:
        ++YYCURSOR;
-#line 184 "../src/parse/lex.re"
+#line 185 "../src/parse/lex.re"
        { ++ignored; continue; }
-#line 692 "src/parse/lex.cc"
+#line 693 "src/parse/lex.cc"
 yy122:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '\n') goto yy120;
@@ -697,7 +698,7 @@ yy123:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych != '/') goto yy119;
        ++YYCURSOR;
-#line 185 "../src/parse/lex.re"
+#line 186 "../src/parse/lex.re"
        {
                        if (ignored > 0) {
                                cline += ignored;
@@ -706,9 +707,9 @@ yy123:
                        tok = pos = cur;
                        return;
                }
-#line 710 "src/parse/lex.cc"
+#line 711 "src/parse/lex.cc"
 }
-#line 193 "../src/parse/lex.re"
+#line 194 "../src/parse/lex.re"
 }
 }
 
@@ -716,7 +717,7 @@ void Scanner::lex_tags()
 {
        ConfTags conf;
        for (;;) {
-#line 720 "src/parse/lex.cc"
+#line 721 "src/parse/lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -774,9 +775,9 @@ void Scanner::lex_tags()
        }
        ++YYCURSOR;
 yy129:
-#line 200 "../src/parse/lex.re"
+#line 201 "../src/parse/lex.re"
        { fatal("unrecognized configuration"); }
-#line 780 "src/parse/lex.cc"
+#line 781 "src/parse/lex.cc"
 yy130:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -784,14 +785,14 @@ yy130:
        if (yybm[0+yych] & 128) {
                goto yy130;
        }
-#line 205 "../src/parse/lex.re"
+#line 206 "../src/parse/lex.re"
        { continue; }
-#line 790 "src/parse/lex.cc"
+#line 791 "src/parse/lex.cc"
 yy133:
        ++YYCURSOR;
-#line 206 "../src/parse/lex.re"
+#line 207 "../src/parse/lex.re"
        { ++cline; continue; }
-#line 795 "src/parse/lex.cc"
+#line 796 "src/parse/lex.cc"
 yy135:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '\n') goto yy133;
@@ -810,7 +811,7 @@ yy138:
        goto yy129;
 yy139:
        ++YYCURSOR;
-#line 207 "../src/parse/lex.re"
+#line 208 "../src/parse/lex.re"
        {
                        if (opts->target == opt_t::CODE) {
                                out.wdelay_tags(opts->topIndent,
@@ -819,7 +820,7 @@ yy139:
                        tok = pos = cur;
                        return;
                }
-#line 823 "src/parse/lex.cc"
+#line 824 "src/parse/lex.cc"
 yy141:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'n') goto yy144;
@@ -836,16 +837,16 @@ yy144:
        goto yy142;
 yy145:
        ++YYCURSOR;
-#line 203 "../src/parse/lex.re"
+#line 204 "../src/parse/lex.re"
        { conf.sep  = lex_conf_string(); continue; }
-#line 842 "src/parse/lex.cc"
+#line 843 "src/parse/lex.cc"
 yy147:
        ++YYCURSOR;
-#line 202 "../src/parse/lex.re"
+#line 203 "../src/parse/lex.re"
        { conf.line = lex_conf_string(); continue; }
-#line 847 "src/parse/lex.cc"
+#line 848 "src/parse/lex.cc"
 }
-#line 215 "../src/parse/lex.re"
+#line 216 "../src/parse/lex.re"
 }
 }
 
@@ -865,7 +866,7 @@ scan:
 
 start:
 
-#line 869 "src/parse/lex.cc"
+#line 870 "src/parse/lex.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
@@ -971,12 +972,12 @@ start:
 yy151:
        ++YYCURSOR;
 yy152:
-#line 397 "../src/parse/lex.re"
+#line 398 "../src/parse/lex.re"
        {
                                        fatalf("unexpected character: '%c'", *tok);
                                        goto scan;
                                }
-#line 980 "src/parse/lex.cc"
+#line 981 "src/parse/lex.cc"
 yy153:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -984,11 +985,11 @@ yy153:
        if (yybm[0+yych] & 16) {
                goto yy153;
        }
-#line 381 "../src/parse/lex.re"
+#line 382 "../src/parse/lex.re"
        {
                                        goto scan;
                                }
-#line 992 "src/parse/lex.cc"
+#line 993 "src/parse/lex.cc"
 yy156:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
@@ -999,65 +1000,65 @@ yy156:
                if (yych == '#') goto yy185;
        }
 yy157:
-#line 390 "../src/parse/lex.re"
+#line 391 "../src/parse/lex.re"
        {
                                        if (cur == eof) return 0;
                                        pos = cur;
                                        cline++;
                                        goto scan;
                                }
-#line 1010 "src/parse/lex.cc"
+#line 1011 "src/parse/lex.cc"
 yy158:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '\n') goto yy156;
        goto yy152;
 yy159:
        ++YYCURSOR;
-#line 264 "../src/parse/lex.re"
+#line 265 "../src/parse/lex.re"
        { yylval.regexp = lex_str('"',  opts->bCaseInsensitive ||  opts->bCaseInverted); return TOKEN_REGEXP; }
-#line 1019 "src/parse/lex.cc"
+#line 1020 "src/parse/lex.cc"
 yy161:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '}') goto yy187;
        goto yy152;
 yy162:
        ++YYCURSOR;
-#line 263 "../src/parse/lex.re"
+#line 264 "../src/parse/lex.re"
        { yylval.regexp = lex_str('\'', opts->bCaseInsensitive || !opts->bCaseInverted); return TOKEN_REGEXP; }
-#line 1028 "src/parse/lex.cc"
+#line 1029 "src/parse/lex.cc"
 yy164:
        ++YYCURSOR;
 yy165:
-#line 284 "../src/parse/lex.re"
+#line 285 "../src/parse/lex.re"
        {
                                        return *tok;
                                }
-#line 1036 "src/parse/lex.cc"
+#line 1037 "src/parse/lex.cc"
 yy166:
        ++YYCURSOR;
        if ((yych = (YYCTYPE)*YYCURSOR) == '/') goto yy187;
-#line 288 "../src/parse/lex.re"
+#line 289 "../src/parse/lex.re"
        {
                                        yylval.op = *tok;
                                        return TOKEN_STAR;
                                }
-#line 1045 "src/parse/lex.cc"
+#line 1046 "src/parse/lex.cc"
 yy168:
        ++YYCURSOR;
-#line 292 "../src/parse/lex.re"
+#line 293 "../src/parse/lex.re"
        {
                                        yylval.op = *tok;
                                        return TOKEN_CLOSE;
                                }
-#line 1053 "src/parse/lex.cc"
+#line 1054 "src/parse/lex.cc"
 yy170:
        ++YYCURSOR;
-#line 376 "../src/parse/lex.re"
+#line 377 "../src/parse/lex.re"
        {
                                        yylval.regexp = mkDot();
                                        return TOKEN_REGEXP;
                                }
-#line 1061 "src/parse/lex.cc"
+#line 1062 "src/parse/lex.cc"
 yy172:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '*') goto yy189;
@@ -1096,9 +1097,9 @@ yy176:
 yy177:
        ++YYCURSOR;
        if ((yych = (YYCTYPE)*YYCURSOR) == '^') goto yy208;
-#line 265 "../src/parse/lex.re"
+#line 266 "../src/parse/lex.re"
        { yylval.regexp = lex_cls(false); return TOKEN_REGEXP; }
-#line 1102 "src/parse/lex.cc"
+#line 1103 "src/parse/lex.cc"
 yy179:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'e') goto yy210;
@@ -1121,12 +1122,12 @@ yy180:
                }
        }
 yy181:
-#line 234 "../src/parse/lex.re"
+#line 235 "../src/parse/lex.re"
        {
                                        depth = 1;
                                        goto code;
                                }
-#line 1130 "src/parse/lex.cc"
+#line 1131 "src/parse/lex.cc"
 yy182:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -1166,31 +1167,31 @@ yy185:
        }
 yy187:
        ++YYCURSOR;
-#line 258 "../src/parse/lex.re"
+#line 259 "../src/parse/lex.re"
        {
                                        tok = cur;
                                        return 0;
                                }
-#line 1175 "src/parse/lex.cc"
+#line 1176 "src/parse/lex.cc"
 yy189:
        ++YYCURSOR;
-#line 252 "../src/parse/lex.re"
+#line 253 "../src/parse/lex.re"
        {
                                        depth = 1;
                                        goto comment;
                                }
-#line 1183 "src/parse/lex.cc"
+#line 1184 "src/parse/lex.cc"
 yy191:
        ++YYCURSOR;
-#line 249 "../src/parse/lex.re"
+#line 250 "../src/parse/lex.re"
        {
                                goto nextLine;
                        }
-#line 1190 "src/parse/lex.cc"
+#line 1191 "src/parse/lex.cc"
 yy193:
        ++YYCURSOR;
        YYCURSOR -= 1;
-#line 360 "../src/parse/lex.re"
+#line 361 "../src/parse/lex.re"
        {
                                        if (!opts->FFlag) {
                                                yylval.str = new std::string (tok, tok_len());
@@ -1206,19 +1207,19 @@ yy193:
                                                return TOKEN_REGEXP;
                                        }
                                }
-#line 1210 "src/parse/lex.cc"
+#line 1211 "src/parse/lex.cc"
 yy195:
        yych = (YYCTYPE)*++YYCURSOR;
        goto yy221;
 yy196:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 355 "../src/parse/lex.re"
+#line 356 "../src/parse/lex.re"
        {
                                        yylval.str = new std::string (tok, tok_len ());
                                        return TOKEN_ID;
                                }
-#line 1222 "src/parse/lex.cc"
+#line 1223 "src/parse/lex.cc"
 yy198:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
@@ -1252,20 +1253,20 @@ yy199:
 yy200:
        ++YYCURSOR;
        if ((yych = (YYCTYPE)*YYCURSOR) == '>') goto yy222;
-#line 243 "../src/parse/lex.re"
+#line 244 "../src/parse/lex.re"
        {
                                        tok += 2; /* skip ":=" */
                                        depth = 0;
                                        goto code;
                                }
-#line 1262 "src/parse/lex.cc"
+#line 1263 "src/parse/lex.cc"
 yy202:
        ++YYCURSOR;
-#line 271 "../src/parse/lex.re"
+#line 272 "../src/parse/lex.re"
        {
                                        return TOKEN_SETUP;
                                }
-#line 1269 "src/parse/lex.cc"
+#line 1270 "src/parse/lex.cc"
 yy204:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '9') {
@@ -1314,7 +1315,7 @@ yy205:
                }
        }
 yy207:
-#line 275 "../src/parse/lex.re"
+#line 276 "../src/parse/lex.re"
        {
                if (!opts->tags) {
                        fatal("tags are only allowed with '-T, --tags' option");
@@ -1323,12 +1324,12 @@ yy207:
                yylval.regexp = RegExp::make_tag(name);
                return TOKEN_REGEXP;
        }
-#line 1327 "src/parse/lex.cc"
+#line 1328 "src/parse/lex.cc"
 yy208:
        ++YYCURSOR;
-#line 266 "../src/parse/lex.re"
+#line 267 "../src/parse/lex.re"
        { yylval.regexp = lex_cls(true);  return TOKEN_REGEXP; }
-#line 1332 "src/parse/lex.cc"
+#line 1333 "src/parse/lex.cc"
 yy210:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '2') goto yy230;
@@ -1336,11 +1337,11 @@ yy210:
 yy211:
        ++YYCURSOR;
 yy212:
-#line 328 "../src/parse/lex.re"
+#line 329 "../src/parse/lex.re"
        {
                                        fatal("illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers");
                                }
-#line 1344 "src/parse/lex.cc"
+#line 1345 "src/parse/lex.cc"
 yy213:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
@@ -1393,7 +1394,7 @@ yy217:
 yy218:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 342 "../src/parse/lex.re"
+#line 343 "../src/parse/lex.re"
        {
                                        yylval.str = new std::string (tok, tok_len ());
                                        if (opts->FFlag)
@@ -1406,7 +1407,7 @@ yy218:
                                                return TOKEN_ID;
                                        }
                                }
-#line 1410 "src/parse/lex.cc"
+#line 1411 "src/parse/lex.cc"
 yy220:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -1429,11 +1430,11 @@ yy221:
 yy222:
        ++YYCURSOR;
        YYCURSOR -= 2;
-#line 239 "../src/parse/lex.re"
+#line 240 "../src/parse/lex.re"
        {
                                        return *tok;
                                }
-#line 1437 "src/parse/lex.cc"
+#line 1438 "src/parse/lex.cc"
 yy224:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
@@ -1466,11 +1467,11 @@ yy227:
 yy228:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 268 "../src/parse/lex.re"
+#line 269 "../src/parse/lex.re"
        {
                                        return TOKEN_NOCOND;
                                }
-#line 1474 "src/parse/lex.cc"
+#line 1475 "src/parse/lex.cc"
 yy230:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'c') goto yy237;
@@ -1484,7 +1485,7 @@ yy231:
        goto yy212;
 yy232:
        ++YYCURSOR;
-#line 297 "../src/parse/lex.re"
+#line 298 "../src/parse/lex.re"
        {
                                        if (!s_to_u32_unsafe (tok + 1, cur - 1, yylval.extop.min))
                                        {
@@ -1493,10 +1494,10 @@ yy232:
                                        yylval.extop.max = yylval.extop.min;
                                        return TOKEN_CLOSESIZE;
                                }
-#line 1497 "src/parse/lex.cc"
+#line 1498 "src/parse/lex.cc"
 yy234:
        ++YYCURSOR;
-#line 332 "../src/parse/lex.re"
+#line 333 "../src/parse/lex.re"
        {
                                        if (!opts->FFlag) {
                                                fatal("curly braces for names only allowed with -F switch");
@@ -1504,7 +1505,7 @@ yy234:
                                        yylval.str = new std::string (tok + 1, tok_len () - 2); // -2 to omit braces
                                        return TOKEN_ID;
                                }
-#line 1508 "src/parse/lex.cc"
+#line 1509 "src/parse/lex.cc"
 yy236:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'n') goto yy242;
@@ -1523,7 +1524,7 @@ yy238:
        goto yy184;
 yy240:
        ++YYCURSOR;
-#line 319 "../src/parse/lex.re"
+#line 320 "../src/parse/lex.re"
        {
                                        if (!s_to_u32_unsafe (tok + 1, cur - 2, yylval.extop.min))
                                        {
@@ -1532,19 +1533,19 @@ yy240:
                                        yylval.extop.max = std::numeric_limits<uint32_t>::max();
                                        return TOKEN_CLOSESIZE;
                                }
-#line 1536 "src/parse/lex.cc"
+#line 1537 "src/parse/lex.cc"
 yy242:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == 'e') goto yy247;
        goto yy184;
 yy243:
        ++YYCURSOR;
-#line 340 "../src/parse/lex.re"
+#line 341 "../src/parse/lex.re"
        { lex_conf (); return TOKEN_CONF; }
-#line 1545 "src/parse/lex.cc"
+#line 1546 "src/parse/lex.cc"
 yy245:
        ++YYCURSOR;
-#line 306 "../src/parse/lex.re"
+#line 307 "../src/parse/lex.re"
        {
                                        const char * p = strchr (tok, ',');
                                        if (!s_to_u32_unsafe (tok + 1, p, yylval.extop.min))
@@ -1557,7 +1558,7 @@ yy245:
                                        }
                                        return TOKEN_CLOSESIZE;
                                }
-#line 1561 "src/parse/lex.cc"
+#line 1562 "src/parse/lex.cc"
 yy247:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '0') goto yy249;
@@ -1613,12 +1614,12 @@ yy252:
 yy254:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 385 "../src/parse/lex.re"
+#line 386 "../src/parse/lex.re"
        {
                                        set_sourceline ();
                                        goto scan;
                                }
-#line 1622 "src/parse/lex.cc"
+#line 1623 "src/parse/lex.cc"
 yy256:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '\n') goto yy254;
@@ -1643,12 +1644,12 @@ yy260:
        if (yych == '\n') goto yy184;
        goto yy257;
 }
-#line 401 "../src/parse/lex.re"
+#line 402 "../src/parse/lex.re"
 
 
 flex_name:
 
-#line 1652 "src/parse/lex.cc"
+#line 1653 "src/parse/lex.cc"
 {
        YYCTYPE yych;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
@@ -1657,32 +1658,32 @@ flex_name:
        if (yych == '\r') goto yy267;
        ++YYCURSOR;
 yy264:
-#line 412 "../src/parse/lex.re"
+#line 413 "../src/parse/lex.re"
        {
                YYCURSOR = tok;
                goto start;
        }
-#line 1666 "src/parse/lex.cc"
+#line 1667 "src/parse/lex.cc"
 yy265:
        ++YYCURSOR;
-#line 406 "../src/parse/lex.re"
+#line 407 "../src/parse/lex.re"
        {
                YYCURSOR = tok;
                lexer_state = LEX_NORMAL;
                return TOKEN_FID_END;
        }
-#line 1675 "src/parse/lex.cc"
+#line 1676 "src/parse/lex.cc"
 yy267:
        ++YYCURSOR;
        if ((yych = (YYCTYPE)*YYCURSOR) == '\n') goto yy265;
        goto yy264;
 }
-#line 416 "../src/parse/lex.re"
+#line 417 "../src/parse/lex.re"
 
 
 code:
 
-#line 1686 "src/parse/lex.cc"
+#line 1687 "src/parse/lex.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
@@ -1743,7 +1744,7 @@ code:
        }
 yy270:
        ++YYCURSOR;
-#line 479 "../src/parse/lex.re"
+#line 480 "../src/parse/lex.re"
        {
                                        if (cur == eof)
                                        {
@@ -1755,15 +1756,15 @@ yy270:
                                        }
                                        goto code;
                                }
-#line 1759 "src/parse/lex.cc"
+#line 1760 "src/parse/lex.cc"
 yy272:
        ++YYCURSOR;
 yy273:
-#line 493 "../src/parse/lex.re"
+#line 494 "../src/parse/lex.re"
        {
                                        goto code;
                                }
-#line 1767 "src/parse/lex.cc"
+#line 1768 "src/parse/lex.cc"
 yy274:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
@@ -1782,7 +1783,7 @@ yy274:
                }
        }
 yy275:
-#line 460 "../src/parse/lex.re"
+#line 461 "../src/parse/lex.re"
        {
                                        if (depth == 0)
                                        {
@@ -1802,7 +1803,7 @@ yy275:
                                        cline++;
                                        goto code;
                                }
-#line 1806 "src/parse/lex.cc"
+#line 1807 "src/parse/lex.cc"
 yy276:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
@@ -1815,7 +1816,7 @@ yy277:
        goto yy294;
 yy278:
        ++YYCURSOR;
-#line 432 "../src/parse/lex.re"
+#line 433 "../src/parse/lex.re"
        {
                                        if (depth == 0)
                                        {
@@ -1827,10 +1828,10 @@ yy278:
                                        }
                                        goto code;
                                }
-#line 1831 "src/parse/lex.cc"
+#line 1832 "src/parse/lex.cc"
 yy280:
        ++YYCURSOR;
-#line 420 "../src/parse/lex.re"
+#line 421 "../src/parse/lex.re"
        {
                                        if (depth == 0)
                                        {
@@ -1843,7 +1844,7 @@ yy280:
                                        }
                                        goto code;
                                }
-#line 1847 "src/parse/lex.cc"
+#line 1848 "src/parse/lex.cc"
 yy282:
        yyaccept = 2;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
@@ -1855,7 +1856,7 @@ yy282:
        }
 yy283:
        YYCURSOR -= 1;
-#line 447 "../src/parse/lex.re"
+#line 448 "../src/parse/lex.re"
        {
                                        if (depth == 0)
                                        {
@@ -1869,7 +1870,7 @@ yy283:
                                        cline++;
                                        goto code;
                                }
-#line 1873 "src/parse/lex.cc"
+#line 1874 "src/parse/lex.cc"
 yy284:
        yych = (YYCTYPE)*++YYCURSOR;
        goto yy283;
@@ -1904,11 +1905,11 @@ yy289:
        if (yych >= '#') goto yy292;
 yy290:
        ++YYCURSOR;
-#line 490 "../src/parse/lex.re"
+#line 491 "../src/parse/lex.re"
        {
                                        goto code;
                                }
-#line 1912 "src/parse/lex.cc"
+#line 1913 "src/parse/lex.cc"
 yy292:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -1998,12 +1999,12 @@ yy306:
 yy308:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 443 "../src/parse/lex.re"
+#line 444 "../src/parse/lex.re"
        {
                                        set_sourceline ();
                                        goto code;
                                }
-#line 2007 "src/parse/lex.cc"
+#line 2008 "src/parse/lex.cc"
 yy310:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '\n') goto yy308;
@@ -2032,12 +2033,12 @@ yy314:
        if (yych == '\n') goto yy287;
        goto yy311;
 }
-#line 496 "../src/parse/lex.re"
+#line 497 "../src/parse/lex.re"
 
 
 comment:
 
-#line 2041 "src/parse/lex.cc"
+#line 2042 "src/parse/lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -2084,7 +2085,7 @@ comment:
        }
        ++YYCURSOR;
 yy318:
-#line 528 "../src/parse/lex.re"
+#line 529 "../src/parse/lex.re"
        {
                                        if (cur == eof)
                                        {
@@ -2092,7 +2093,7 @@ yy318:
                                        }
                                        goto comment;
                                }
-#line 2096 "src/parse/lex.cc"
+#line 2097 "src/parse/lex.cc"
 yy319:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yybm[0+yych] & 32) {
@@ -2100,7 +2101,7 @@ yy319:
        }
        if (yych == '#') goto yy326;
 yy320:
-#line 519 "../src/parse/lex.re"
+#line 520 "../src/parse/lex.re"
        {
                                        if (cur == eof)
                                        {
@@ -2110,7 +2111,7 @@ yy320:
                                        cline++;
                                        goto comment;
                                }
-#line 2114 "src/parse/lex.cc"
+#line 2115 "src/parse/lex.cc"
 yy321:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '/') goto yy328;
@@ -2144,7 +2145,7 @@ yy326:
        }
 yy328:
        ++YYCURSOR;
-#line 500 "../src/parse/lex.re"
+#line 501 "../src/parse/lex.re"
        {
                                        if (--depth == 0)
                                        {
@@ -2155,16 +2156,16 @@ yy328:
                                                goto comment;
                                        }
                                }
-#line 2159 "src/parse/lex.cc"
+#line 2160 "src/parse/lex.cc"
 yy330:
        ++YYCURSOR;
-#line 510 "../src/parse/lex.re"
+#line 511 "../src/parse/lex.re"
        {
                                        ++depth;
                                        fatal("ambiguous /* found");
                                        goto comment;
                                }
-#line 2168 "src/parse/lex.cc"
+#line 2169 "src/parse/lex.cc"
 yy332:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych != 'i') goto yy325;
@@ -2221,12 +2222,12 @@ yy340:
 yy342:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 515 "../src/parse/lex.re"
+#line 516 "../src/parse/lex.re"
        {
                                        set_sourceline ();
                                        goto comment;
                                }
-#line 2230 "src/parse/lex.cc"
+#line 2231 "src/parse/lex.cc"
 yy344:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '\n') goto yy342;
@@ -2251,28 +2252,28 @@ yy348:
        if (yych == '\n') goto yy325;
        goto yy345;
 }
-#line 535 "../src/parse/lex.re"
+#line 536 "../src/parse/lex.re"
 
 
 nextLine:
 
-#line 2260 "src/parse/lex.cc"
+#line 2261 "src/parse/lex.cc"
 {
        YYCTYPE yych;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych == '\n') goto yy353;
        ++YYCURSOR;
-#line 546 "../src/parse/lex.re"
+#line 547 "../src/parse/lex.re"
        {  if(cur == eof) {
                   return 0;
                }
                goto nextLine;
             }
-#line 2273 "src/parse/lex.cc"
+#line 2274 "src/parse/lex.cc"
 yy353:
        ++YYCURSOR;
-#line 539 "../src/parse/lex.re"
+#line 540 "../src/parse/lex.re"
        { if(cur == eof) {
                   return 0;
                }
@@ -2280,9 +2281,9 @@ yy353:
                cline++;
                goto scan;
             }
-#line 2284 "src/parse/lex.cc"
+#line 2285 "src/parse/lex.cc"
 }
-#line 551 "../src/parse/lex.re"
+#line 552 "../src/parse/lex.re"
 
 }
 
@@ -2306,35 +2307,35 @@ const RegExp *Scanner::lex_cls(bool neg)
        uint32_t u, l;
 fst:
        
-#line 2310 "src/parse/lex.cc"
+#line 2311 "src/parse/lex.cc"
 {
        YYCTYPE yych;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych == ']') goto yy358;
-#line 575 "../src/parse/lex.re"
+#line 576 "../src/parse/lex.re"
        { l = lex_cls_chr(); goto snd; }
-#line 2318 "src/parse/lex.cc"
+#line 2319 "src/parse/lex.cc"
 yy358:
        ++YYCURSOR;
-#line 574 "../src/parse/lex.re"
+#line 575 "../src/parse/lex.re"
        { goto end; }
-#line 2323 "src/parse/lex.cc"
+#line 2324 "src/parse/lex.cc"
 }
-#line 576 "../src/parse/lex.re"
+#line 577 "../src/parse/lex.re"
 
 snd:
        
-#line 2329 "src/parse/lex.cc"
+#line 2330 "src/parse/lex.cc"
 {
        YYCTYPE yych;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*(YYMARKER = YYCURSOR);
        if (yych == '-') goto yy363;
 yy362:
-#line 579 "../src/parse/lex.re"
+#line 580 "../src/parse/lex.re"
        { u = l; goto add; }
-#line 2338 "src/parse/lex.cc"
+#line 2339 "src/parse/lex.cc"
 yy363:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych != ']') goto yy365;
@@ -2343,7 +2344,7 @@ yy363:
 yy365:
        ++YYCURSOR;
        YYCURSOR -= 1;
-#line 580 "../src/parse/lex.re"
+#line 581 "../src/parse/lex.re"
        {
                        u = lex_cls_chr();
                        if (l > u) {
@@ -2352,9 +2353,9 @@ yy365:
                        }
                        goto add;
                }
-#line 2356 "src/parse/lex.cc"
+#line 2357 "src/parse/lex.cc"
 }
-#line 588 "../src/parse/lex.re"
+#line 589 "../src/parse/lex.re"
 
 add:
        if (!(s = opts->encoding.encodeRange(l, u))) {
@@ -2373,7 +2374,7 @@ uint32_t Scanner::lex_cls_chr()
 {
        tok = cur;
        
-#line 2377 "src/parse/lex.cc"
+#line 2378 "src/parse/lex.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
@@ -2382,14 +2383,14 @@ uint32_t Scanner::lex_cls_chr()
        if (yych == '\n') goto yy371;
        if (yych == '\\') goto yy373;
        ++YYCURSOR;
-#line 611 "../src/parse/lex.re"
+#line 612 "../src/parse/lex.re"
        { return static_cast<uint8_t>(tok[0]); }
-#line 2388 "src/parse/lex.cc"
+#line 2389 "src/parse/lex.cc"
 yy371:
        ++YYCURSOR;
-#line 606 "../src/parse/lex.re"
+#line 607 "../src/parse/lex.re"
        { fatal ((tok - pos) - tchar, "syntax error"); }
-#line 2393 "src/parse/lex.cc"
+#line 2394 "src/parse/lex.cc"
 yy373:
        ++YYCURSOR;
        if ((yych = (YYCTYPE)*YYCURSOR) <= '`') {
@@ -2438,31 +2439,31 @@ yy373:
                        }
                }
        }
-#line 609 "../src/parse/lex.re"
+#line 610 "../src/parse/lex.re"
        { fatal ((tok - pos) - tchar, "syntax error in escape sequence"); }
-#line 2444 "src/parse/lex.cc"
+#line 2445 "src/parse/lex.cc"
 yy375:
        ++YYCURSOR;
-#line 624 "../src/parse/lex.re"
+#line 625 "../src/parse/lex.re"
        {
                        warn.useless_escape(tline, tok - pos, tok[1]);
                        return static_cast<uint8_t>(tok[1]);
                }
-#line 2452 "src/parse/lex.cc"
+#line 2453 "src/parse/lex.cc"
 yy377:
        ++YYCURSOR;
-#line 622 "../src/parse/lex.re"
+#line 623 "../src/parse/lex.re"
        { return static_cast<uint8_t>('-'); }
-#line 2457 "src/parse/lex.cc"
+#line 2458 "src/parse/lex.cc"
 yy379:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '/') goto yy380;
        if (yych <= '7') goto yy404;
 yy380:
-#line 608 "../src/parse/lex.re"
+#line 609 "../src/parse/lex.re"
        { fatal ((tok - pos) - tchar, "syntax error in octal escape sequence"); }
-#line 2466 "src/parse/lex.cc"
+#line 2467 "src/parse/lex.cc"
 yy381:
        yych = (YYCTYPE)*++YYCURSOR;
        goto yy380;
@@ -2478,9 +2479,9 @@ yy382:
                if (yych <= 'f') goto yy406;
        }
 yy383:
-#line 607 "../src/parse/lex.re"
+#line 608 "../src/parse/lex.re"
        { fatal ((tok - pos) - tchar, "syntax error in hexadecimal escape sequence"); }
-#line 2484 "src/parse/lex.cc"
+#line 2485 "src/parse/lex.cc"
 yy384:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
@@ -2496,49 +2497,49 @@ yy384:
        }
 yy385:
        ++YYCURSOR;
-#line 621 "../src/parse/lex.re"
+#line 622 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\\'); }
-#line 2502 "src/parse/lex.cc"
+#line 2503 "src/parse/lex.cc"
 yy387:
        ++YYCURSOR;
-#line 623 "../src/parse/lex.re"
+#line 624 "../src/parse/lex.re"
        { return static_cast<uint8_t>(']'); }
-#line 2507 "src/parse/lex.cc"
+#line 2508 "src/parse/lex.cc"
 yy389:
        ++YYCURSOR;
-#line 614 "../src/parse/lex.re"
+#line 615 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\a'); }
-#line 2512 "src/parse/lex.cc"
+#line 2513 "src/parse/lex.cc"
 yy391:
        ++YYCURSOR;
-#line 615 "../src/parse/lex.re"
+#line 616 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\b'); }
-#line 2517 "src/parse/lex.cc"
+#line 2518 "src/parse/lex.cc"
 yy393:
        ++YYCURSOR;
-#line 616 "../src/parse/lex.re"
+#line 617 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\f'); }
-#line 2522 "src/parse/lex.cc"
+#line 2523 "src/parse/lex.cc"
 yy395:
        ++YYCURSOR;
-#line 617 "../src/parse/lex.re"
+#line 618 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\n'); }
-#line 2527 "src/parse/lex.cc"
+#line 2528 "src/parse/lex.cc"
 yy397:
        ++YYCURSOR;
-#line 618 "../src/parse/lex.re"
+#line 619 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\r'); }
-#line 2532 "src/parse/lex.cc"
+#line 2533 "src/parse/lex.cc"
 yy399:
        ++YYCURSOR;
-#line 619 "../src/parse/lex.re"
+#line 620 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\t'); }
-#line 2537 "src/parse/lex.cc"
+#line 2538 "src/parse/lex.cc"
 yy401:
        ++YYCURSOR;
-#line 620 "../src/parse/lex.re"
+#line 621 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\v'); }
-#line 2542 "src/parse/lex.cc"
+#line 2543 "src/parse/lex.cc"
 yy403:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
@@ -2601,9 +2602,9 @@ yy408:
        }
 yy409:
        ++YYCURSOR;
-#line 613 "../src/parse/lex.re"
+#line 614 "../src/parse/lex.re"
        { return unesc_oct(tok, cur); }
-#line 2607 "src/parse/lex.cc"
+#line 2608 "src/parse/lex.cc"
 yy411:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
@@ -2630,9 +2631,9 @@ yy412:
        }
 yy413:
        ++YYCURSOR;
-#line 612 "../src/parse/lex.re"
+#line 613 "../src/parse/lex.re"
        { return unesc_hex(tok, cur); }
-#line 2636 "src/parse/lex.cc"
+#line 2637 "src/parse/lex.cc"
 yy415:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
@@ -2656,7 +2657,7 @@ yy416:
                goto yy405;
        }
 }
-#line 628 "../src/parse/lex.re"
+#line 629 "../src/parse/lex.re"
 
 }
 
@@ -2665,7 +2666,7 @@ uint32_t Scanner::lex_str_chr(char quote, bool &end)
        end = false;
        tok = cur;
        
-#line 2669 "src/parse/lex.cc"
+#line 2670 "src/parse/lex.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
@@ -2674,17 +2675,17 @@ uint32_t Scanner::lex_str_chr(char quote, bool &end)
        if (yych == '\n') goto yy421;
        if (yych == '\\') goto yy423;
        ++YYCURSOR;
-#line 641 "../src/parse/lex.re"
+#line 642 "../src/parse/lex.re"
        {
                        end = tok[0] == quote;
                        return static_cast<uint8_t>(tok[0]);
                }
-#line 2683 "src/parse/lex.cc"
+#line 2684 "src/parse/lex.cc"
 yy421:
        ++YYCURSOR;
-#line 636 "../src/parse/lex.re"
+#line 637 "../src/parse/lex.re"
        { fatal ((tok - pos) - tchar, "syntax error"); }
-#line 2688 "src/parse/lex.cc"
+#line 2689 "src/parse/lex.cc"
 yy423:
        ++YYCURSOR;
        if ((yych = (YYCTYPE)*YYCURSOR) <= 'a') {
@@ -2730,28 +2731,28 @@ yy423:
                        }
                }
        }
-#line 639 "../src/parse/lex.re"
+#line 640 "../src/parse/lex.re"
        { fatal ((tok - pos) - tchar, "syntax error in escape sequence"); }
-#line 2736 "src/parse/lex.cc"
+#line 2737 "src/parse/lex.cc"
 yy425:
        ++YYCURSOR;
-#line 655 "../src/parse/lex.re"
+#line 656 "../src/parse/lex.re"
        {
                        if (tok[1] != quote) {
                                warn.useless_escape(tline, tok - pos, tok[1]);
                        }
                        return static_cast<uint8_t>(tok[1]);
                }
-#line 2746 "src/parse/lex.cc"
+#line 2747 "src/parse/lex.cc"
 yy427:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '/') goto yy428;
        if (yych <= '7') goto yy450;
 yy428:
-#line 638 "../src/parse/lex.re"
+#line 639 "../src/parse/lex.re"
        { fatal ((tok - pos) - tchar, "syntax error in octal escape sequence"); }
-#line 2755 "src/parse/lex.cc"
+#line 2756 "src/parse/lex.cc"
 yy429:
        yych = (YYCTYPE)*++YYCURSOR;
        goto yy428;
@@ -2767,9 +2768,9 @@ yy430:
                if (yych <= 'f') goto yy452;
        }
 yy431:
-#line 637 "../src/parse/lex.re"
+#line 638 "../src/parse/lex.re"
        { fatal ((tok - pos) - tchar, "syntax error in hexadecimal escape sequence"); }
-#line 2773 "src/parse/lex.cc"
+#line 2774 "src/parse/lex.cc"
 yy432:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
@@ -2785,44 +2786,44 @@ yy432:
        }
 yy433:
        ++YYCURSOR;
-#line 654 "../src/parse/lex.re"
+#line 655 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\\'); }
-#line 2791 "src/parse/lex.cc"
+#line 2792 "src/parse/lex.cc"
 yy435:
        ++YYCURSOR;
-#line 647 "../src/parse/lex.re"
+#line 648 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\a'); }
-#line 2796 "src/parse/lex.cc"
+#line 2797 "src/parse/lex.cc"
 yy437:
        ++YYCURSOR;
-#line 648 "../src/parse/lex.re"
+#line 649 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\b'); }
-#line 2801 "src/parse/lex.cc"
+#line 2802 "src/parse/lex.cc"
 yy439:
        ++YYCURSOR;
-#line 649 "../src/parse/lex.re"
+#line 650 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\f'); }
-#line 2806 "src/parse/lex.cc"
+#line 2807 "src/parse/lex.cc"
 yy441:
        ++YYCURSOR;
-#line 650 "../src/parse/lex.re"
+#line 651 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\n'); }
-#line 2811 "src/parse/lex.cc"
+#line 2812 "src/parse/lex.cc"
 yy443:
        ++YYCURSOR;
-#line 651 "../src/parse/lex.re"
+#line 652 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\r'); }
-#line 2816 "src/parse/lex.cc"
+#line 2817 "src/parse/lex.cc"
 yy445:
        ++YYCURSOR;
-#line 652 "../src/parse/lex.re"
+#line 653 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\t'); }
-#line 2821 "src/parse/lex.cc"
+#line 2822 "src/parse/lex.cc"
 yy447:
        ++YYCURSOR;
-#line 653 "../src/parse/lex.re"
+#line 654 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\v'); }
-#line 2826 "src/parse/lex.cc"
+#line 2827 "src/parse/lex.cc"
 yy449:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
@@ -2885,9 +2886,9 @@ yy454:
        }
 yy455:
        ++YYCURSOR;
-#line 646 "../src/parse/lex.re"
+#line 647 "../src/parse/lex.re"
        { return unesc_oct(tok, cur); }
-#line 2891 "src/parse/lex.cc"
+#line 2892 "src/parse/lex.cc"
 yy457:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
@@ -2914,9 +2915,9 @@ yy458:
        }
 yy459:
        ++YYCURSOR;
-#line 645 "../src/parse/lex.re"
+#line 646 "../src/parse/lex.re"
        { return unesc_hex(tok, cur); }
-#line 2920 "src/parse/lex.cc"
+#line 2921 "src/parse/lex.cc"
 yy461:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
@@ -2940,7 +2941,7 @@ yy462:
                goto yy451;
        }
 }
-#line 661 "../src/parse/lex.re"
+#line 662 "../src/parse/lex.re"
 
 }
 
@@ -2961,7 +2962,7 @@ void Scanner::set_sourceline ()
 sourceline:
        tok = cur;
 
-#line 2965 "src/parse/lex.cc"
+#line 2966 "src/parse/lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -3010,14 +3011,14 @@ sourceline:
 yy465:
        ++YYCURSOR;
 yy466:
-#line 704 "../src/parse/lex.re"
+#line 705 "../src/parse/lex.re"
        {
                                        goto sourceline;
                                }
-#line 3018 "src/parse/lex.cc"
+#line 3019 "src/parse/lex.cc"
 yy467:
        ++YYCURSOR;
-#line 692 "../src/parse/lex.re"
+#line 693 "../src/parse/lex.re"
        {
                                        if (cur == eof)
                                        {
@@ -3030,7 +3031,7 @@ yy467:
                                        tok = cur;
                                        return; 
                                }
-#line 3034 "src/parse/lex.cc"
+#line 3035 "src/parse/lex.cc"
 yy469:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych == '\n') goto yy466;
@@ -3042,7 +3043,7 @@ yy470:
        if (yybm[0+yych] & 64) {
                goto yy470;
        }
-#line 681 "../src/parse/lex.re"
+#line 682 "../src/parse/lex.re"
        {
                                        if (!s_to_u32_unsafe (tok, cur, cline))
                                        {
@@ -3050,7 +3051,7 @@ yy470:
                                        }
                                        goto sourceline; 
                                }
-#line 3054 "src/parse/lex.cc"
+#line 3055 "src/parse/lex.cc"
 yy473:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -3067,12 +3068,12 @@ yy475:
        goto yy466;
 yy476:
        ++YYCURSOR;
-#line 688 "../src/parse/lex.re"
+#line 689 "../src/parse/lex.re"
        {
                                        escape (in.file_name, std::string (tok + 1, tok_len () - 2)); // -2 to omit quotes
                                        goto sourceline; 
                                }
-#line 3076 "src/parse/lex.cc"
+#line 3077 "src/parse/lex.cc"
 yy478:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -3080,7 +3081,7 @@ yy478:
        if (yych == '\n') goto yy475;
        goto yy473;
 }
-#line 707 "../src/parse/lex.re"
+#line 708 "../src/parse/lex.re"
 
 }
 
index a92aac4826ecc9d96932f3509ef78960158bfc47..d2771a2752f155cf4c344bf7e31f73151caf836b 100644 (file)
@@ -151,12 +151,13 @@ echo:
        }
 
        zero {
-               if (opts->target == opt_t::CODE) {
-                       out.wraw(tok, start);
-               }
                if (cur == eof) {
+                       if (opts->target == opt_t::CODE) {
+                               out.wraw(tok, start);
+                       }
                        return Stop;
                }
+               goto echo;
        }
 
        eol space* "#" space* "line" space+ / lineinf {
diff --git a/re2c/test/bug142.c b/re2c/test/bug142.c
new file mode 100644 (file)
index 0000000..2a481bf
Binary files /dev/null and b/re2c/test/bug142.c differ
diff --git a/re2c/test/bug142.re b/re2c/test/bug142.re
new file mode 100644 (file)
index 0000000..fc045eb
Binary files /dev/null and b/re2c/test/bug142.re differ