]> granicus.if.org Git - re2c/commitdiff
Lexer: no need to have "{0,}" special case.
authorUlya Trofimovich <skvadrik@gmail.com>
Sun, 16 Aug 2015 19:57:29 +0000 (20:57 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Sun, 16 Aug 2015 19:57:29 +0000 (20:57 +0100)
Now "{0,}" is handled by general case for counted repetition. Had to
fix test because of swapped alternatives in construction of regexps
of the form "r*" and "r{n,".

Added some tests for counted repetition.

re2c/bootstrap/src/parse/scanner_lex.cc
re2c/src/parse/scanner_lex.re
re2c/test/bug1390174.c
re2c/test/repeater2.c [new file with mode: 0644]
re2c/test/repeater2.re [new file with mode: 0644]
re2c/test/repeater_overflow.c [new file with mode: 0644]
re2c/test/repeater_overflow.re [new file with mode: 0644]

index 612d6597c03a82478a47344f67600e1d6b79bb29..1774c20d0ecb9dbad16b72383755a3fadbb2e3d7 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.14.3 on Sun Aug 16 11:25:05 2015 */
+/* Generated by re2c 0.14.3 on Sun Aug 16 20:20:10 2015 */
 #line 1 "../src/parse/scanner_lex.re"
 #include <stdlib.h>
 #include <string.h>
@@ -708,7 +708,7 @@ start:
 yy112:
        ++YYCURSOR;
 yy113:
-#line 441 "../src/parse/scanner_lex.re"
+#line 436 "../src/parse/scanner_lex.re"
        {
                                        fatalf("unexpected character: '%c'", *tok);
                                        goto scan;
@@ -717,9 +717,9 @@ yy113:
 yy114:
        ++YYCURSOR;
        yych = (YYCTYPE)*YYCURSOR;
-       goto yy248;
+       goto yy244;
 yy115:
-#line 425 "../src/parse/scanner_lex.re"
+#line 420 "../src/parse/scanner_lex.re"
        {
                                        goto scan;
                                }
@@ -728,13 +728,13 @@ yy116:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy226;
+               if (yych == '\t') goto yy222;
        } else {
-               if (yych <= ' ') goto yy226;
-               if (yych == '#') goto yy228;
+               if (yych <= ' ') goto yy222;
+               if (yych == '#') goto yy224;
        }
 yy117:
-#line 434 "../src/parse/scanner_lex.re"
+#line 429 "../src/parse/scanner_lex.re"
        {
                                        if (cur == eof) return 0;
                                        pos = cur;
@@ -744,12 +744,12 @@ yy117:
 #line 745 "src/parse/scanner_lex.cc"
 yy118:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy225;
+       if (yych == '\n') goto yy221;
        goto yy113;
 yy119:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych != '\n') goto yy221;
+       if (yych != '\n') goto yy217;
 yy120:
 #line 286 "../src/parse/scanner_lex.re"
        {
@@ -758,12 +758,12 @@ yy120:
 #line 759 "src/parse/scanner_lex.cc"
 yy121:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '}') goto yy213;
+       if (yych == '}') goto yy209;
        goto yy113;
 yy122:
        yyaccept = 2;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych != '\n') goto yy216;
+       if (yych != '\n') goto yy212;
 yy123:
 #line 289 "../src/parse/scanner_lex.re"
        {
@@ -780,7 +780,7 @@ yy125:
 #line 781 "src/parse/scanner_lex.cc"
 yy126:
        ++YYCURSOR;
-       if ((yych = (YYCTYPE)*YYCURSOR) == '/') goto yy213;
+       if ((yych = (YYCTYPE)*YYCURSOR) == '/') goto yy209;
 #line 319 "../src/parse/scanner_lex.re"
        {
                                        yylval.op = *tok;
@@ -797,7 +797,7 @@ yy128:
 #line 798 "src/parse/scanner_lex.cc"
 yy130:
        ++YYCURSOR;
-#line 420 "../src/parse/scanner_lex.re"
+#line 415 "../src/parse/scanner_lex.re"
        {
                                        yylval.regexp = mkDot();
                                        return RANGE;
@@ -805,30 +805,30 @@ yy130:
 #line 806 "src/parse/scanner_lex.cc"
 yy132:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '*') goto yy209;
-       if (yych == '/') goto yy211;
+       if (yych == '*') goto yy205;
+       if (yych == '/') goto yy207;
        goto yy125;
 yy133:
        YYCTXMARKER = YYCURSOR + 1;
        yych = (YYCTYPE)*++YYCURSOR;
-       goto yy169;
+       goto yy165;
 yy134:
        YYCTXMARKER = YYCURSOR + 1;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '=') goto yy205;
+       if (yych == '=') goto yy201;
        goto yy113;
 yy135:
        yyaccept = 3;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == '!') goto yy196;
-       if (yych == '>') goto yy198;
+       if (yych == '!') goto yy192;
+       if (yych == '>') goto yy194;
        goto yy125;
 yy136:
        yyaccept = 4;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych == '\n') goto yy137;
-       if (yych == '^') goto yy188;
-       goto yy187;
+       if (yych == '^') goto yy184;
+       goto yy183;
 yy137:
 #line 305 "../src/parse/scanner_lex.re"
        {
@@ -838,25 +838,23 @@ yy137:
 yy138:
        YYCTXMARKER = YYCURSOR + 1;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy170;
-       goto yy169;
+       if (yych == 'e') goto yy166;
+       goto yy165;
 yy139:
        yyaccept = 5;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= '@') {
-               if (yych <= '/') {
-                       if (yych == ',') goto yy147;
-               } else {
-                       if (yych <= '0') goto yy141;
-                       if (yych <= '9') goto yy143;
-               }
+       if (yybm[0+yych] & 4) {
+               goto yy141;
+       }
+       if (yych <= 'Z') {
+               if (yych == ',') goto yy146;
+               if (yych >= 'A') goto yy144;
        } else {
                if (yych <= '_') {
-                       if (yych <= 'Z') goto yy145;
-                       if (yych >= '_') goto yy145;
+                       if (yych >= '_') goto yy144;
                } else {
                        if (yych <= '`') goto yy140;
-                       if (yych <= 'z') goto yy145;
+                       if (yych <= 'z') goto yy144;
                }
        }
 yy140:
@@ -865,12 +863,29 @@ yy140:
                                        depth = 1;
                                        goto code;
                                }
-#line 869 "src/parse/scanner_lex.cc"
+#line 867 "src/parse/scanner_lex.cc"
 yy141:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == ',') goto yy160;
-       goto yy144;
-yy142:
+       ++YYCURSOR;
+       if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+       yych = (YYCTYPE)*YYCURSOR;
+       if (yybm[0+yych] & 4) {
+               goto yy141;
+       }
+       if (yych <= '^') {
+               if (yych <= ',') {
+                       if (yych >= ',') goto yy152;
+               } else {
+                       if (yych <= '@') goto yy143;
+                       if (yych <= 'Z') goto yy144;
+               }
+       } else {
+               if (yych <= 'z') {
+                       if (yych != '`') goto yy144;
+               } else {
+                       if (yych == '}') goto yy150;
+               }
+       }
+yy143:
        YYCURSOR = YYMARKER;
        if (yyaccept <= 3) {
                if (yyaccept <= 1) {
@@ -895,56 +910,32 @@ yy142:
                        }
                } else {
                        if (yyaccept == 6) {
-                               goto yy148;
+                               goto yy147;
                        } else {
-                               goto yy176;
+                               goto yy172;
                        }
                }
        }
-yy143:
-       ++YYCURSOR;
-       if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
-       yych = (YYCTYPE)*YYCURSOR;
 yy144:
-       if (yybm[0+yych] & 4) {
-               goto yy143;
-       }
-       if (yych <= '^') {
-               if (yych <= ',') {
-                       if (yych <= '+') goto yy142;
-                       goto yy153;
-               } else {
-                       if (yych <= '@') goto yy142;
-                       if (yych >= '[') goto yy142;
-               }
-       } else {
-               if (yych <= 'z') {
-                       if (yych == '`') goto yy142;
-               } else {
-                       if (yych == '}') goto yy151;
-                       goto yy142;
-               }
-       }
-yy145:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 8) {
-               goto yy145;
+               goto yy144;
        }
-       if (yych == '}') goto yy149;
-       goto yy142;
-yy147:
+       if (yych == '}') goto yy148;
+       goto yy143;
+yy146:
        ++YYCURSOR;
-yy148:
-#line 364 "../src/parse/scanner_lex.re"
+yy147:
+#line 359 "../src/parse/scanner_lex.re"
        {
                                        fatal("illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers");
                                }
-#line 945 "src/parse/scanner_lex.cc"
-yy149:
+#line 936 "src/parse/scanner_lex.cc"
+yy148:
        ++YYCURSOR;
-#line 368 "../src/parse/scanner_lex.re"
+#line 363 "../src/parse/scanner_lex.re"
        {
                                        if (!FFlag) {
                                                fatal("curly braces for names only allowed with -F switch");
@@ -952,10 +943,10 @@ yy149:
                                        yylval.str = new std::string (tok + 1, tok_len () - 2); // -2 to omit braces
                                        return ID;
                                }
-#line 956 "src/parse/scanner_lex.cc"
-yy151:
+#line 947 "src/parse/scanner_lex.cc"
+yy150:
        ++YYCURSOR;
-#line 333 "../src/parse/scanner_lex.re"
+#line 328 "../src/parse/scanner_lex.re"
        {
                                        if (!s_to_u32_unsafe (tok + 1, cur - 1, yylval.extop.min))
                                        {
@@ -964,15 +955,15 @@ yy151:
                                        yylval.extop.max = yylval.extop.min;
                                        return CLOSESIZE;
                                }
-#line 968 "src/parse/scanner_lex.cc"
-yy153:
+#line 959 "src/parse/scanner_lex.cc"
+yy152:
        yyaccept = 6;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= '/') goto yy148;
-       if (yych <= '9') goto yy156;
-       if (yych != '}') goto yy148;
+       if (yych <= '/') goto yy147;
+       if (yych <= '9') goto yy155;
+       if (yych != '}') goto yy147;
        ++YYCURSOR;
-#line 355 "../src/parse/scanner_lex.re"
+#line 350 "../src/parse/scanner_lex.re"
        {
                                        if (!s_to_u32_unsafe (tok + 1, cur - 2, yylval.extop.min))
                                        {
@@ -981,16 +972,16 @@ yy153:
                                        yylval.extop.max = UINT32_MAX;
                                        return CLOSESIZE;
                                }
-#line 985 "src/parse/scanner_lex.cc"
-yy156:
+#line 976 "src/parse/scanner_lex.cc"
+yy155:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= '/') goto yy142;
-       if (yych <= '9') goto yy156;
-       if (yych != '}') goto yy142;
+       if (yych <= '/') goto yy143;
+       if (yych <= '9') goto yy155;
+       if (yych != '}') goto yy143;
        ++YYCURSOR;
-#line 342 "../src/parse/scanner_lex.re"
+#line 337 "../src/parse/scanner_lex.re"
        {
                                        const char * p = strchr (tok, ',');
                                        if (!s_to_u32_unsafe (tok + 1, p, yylval.extop.min))
@@ -1003,25 +994,12 @@ yy156:
                                        }
                                        return CLOSESIZE;
                                }
-#line 1007 "src/parse/scanner_lex.cc"
-yy160:
-       yyaccept = 6;
-       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= '/') goto yy148;
-       if (yych <= '9') goto yy156;
-       if (yych != '}') goto yy148;
-       ++YYCURSOR;
-#line 328 "../src/parse/scanner_lex.re"
-       {
-                                       yylval.op = '*';
-                                       return CLOSE;
-                               }
-#line 1020 "src/parse/scanner_lex.cc"
-yy163:
+#line 998 "src/parse/scanner_lex.cc"
+yy159:
        ++YYCURSOR;
-yy164:
+yy160:
        YYCURSOR = YYCTXMARKER;
-#line 401 "../src/parse/scanner_lex.re"
+#line 396 "../src/parse/scanner_lex.re"
        {
                                        if (!FFlag) {
                                                yylval.str = new std::string (tok, tok_len ());
@@ -1040,165 +1018,165 @@ yy164:
                                                return STRING;
                                        }
                                }
-#line 1044 "src/parse/scanner_lex.cc"
-yy165:
+#line 1022 "src/parse/scanner_lex.cc"
+yy161:
        yych = (YYCTYPE)*++YYCURSOR;
-       goto yy184;
-yy166:
+       goto yy180;
+yy162:
        ++YYCURSOR;
-yy167:
+yy163:
        YYCURSOR = YYCTXMARKER;
-#line 396 "../src/parse/scanner_lex.re"
+#line 391 "../src/parse/scanner_lex.re"
        {
                                        yylval.str = new std::string (tok, tok_len ());
                                        return ID;
                                }
-#line 1057 "src/parse/scanner_lex.cc"
-yy168:
+#line 1035 "src/parse/scanner_lex.cc"
+yy164:
        YYCTXMARKER = YYCURSOR + 1;
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
-yy169:
+yy165:
        if (yych <= '9') {
                if (yych <= ' ') {
-                       if (yych == '\t') goto yy165;
-                       if (yych <= 0x1F) goto yy163;
-                       goto yy165;
+                       if (yych == '\t') goto yy161;
+                       if (yych <= 0x1F) goto yy159;
+                       goto yy161;
                } else {
-                       if (yych == ',') goto yy166;
-                       if (yych <= '/') goto yy163;
-                       goto yy168;
+                       if (yych == ',') goto yy162;
+                       if (yych <= '/') goto yy159;
+                       goto yy164;
                }
        } else {
                if (yych <= 'Z') {
-                       if (yych <= '<') goto yy163;
-                       if (yych <= '>') goto yy166;
-                       if (yych <= '@') goto yy163;
-                       goto yy168;
+                       if (yych <= '<') goto yy159;
+                       if (yych <= '>') goto yy162;
+                       if (yych <= '@') goto yy159;
+                       goto yy164;
                } else {
                        if (yych <= '_') {
-                               if (yych <= '^') goto yy163;
-                               goto yy168;
+                               if (yych <= '^') goto yy159;
+                               goto yy164;
                        } else {
-                               if (yych <= '`') goto yy163;
-                               if (yych <= 'z') goto yy168;
-                               goto yy163;
+                               if (yych <= '`') goto yy159;
+                               if (yych <= 'z') goto yy164;
+                               goto yy159;
                        }
                }
        }
-yy170:
+yy166:
        YYCTXMARKER = YYCURSOR + 1;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != '2') goto yy169;
+       if (yych != '2') goto yy165;
        YYCTXMARKER = YYCURSOR + 1;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'c') goto yy169;
+       if (yych != 'c') goto yy165;
        YYCTXMARKER = YYCURSOR + 1;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != ':') goto yy169;
+       if (yych != ':') goto yy165;
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 'Z') {
-               if (yych <= '/') goto yy164;
-               if (yych <= '9') goto yy174;
-               if (yych <= '@') goto yy164;
+               if (yych <= '/') goto yy160;
+               if (yych <= '9') goto yy170;
+               if (yych <= '@') goto yy160;
        } else {
                if (yych <= '_') {
-                       if (yych <= '^') goto yy164;
+                       if (yych <= '^') goto yy160;
                } else {
-                       if (yych <= '`') goto yy164;
-                       if (yych >= '{') goto yy164;
+                       if (yych <= '`') goto yy160;
+                       if (yych >= '{') goto yy160;
                }
        }
-yy174:
+yy170:
        yyaccept = 7;
        YYMARKER = ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '@') {
                if (yych <= '9') {
-                       if (yych >= '0') goto yy174;
+                       if (yych >= '0') goto yy170;
                } else {
-                       if (yych <= ':') goto yy178;
-                       if (yych >= '@') goto yy177;
+                       if (yych <= ':') goto yy174;
+                       if (yych >= '@') goto yy173;
                }
        } else {
                if (yych <= '_') {
-                       if (yych <= 'Z') goto yy174;
-                       if (yych >= '_') goto yy174;
+                       if (yych <= 'Z') goto yy170;
+                       if (yych >= '_') goto yy170;
                } else {
-                       if (yych <= '`') goto yy176;
-                       if (yych <= 'z') goto yy174;
+                       if (yych <= '`') goto yy172;
+                       if (yych <= 'z') goto yy170;
                }
        }
-yy176:
-#line 376 "../src/parse/scanner_lex.re"
+yy172:
+#line 371 "../src/parse/scanner_lex.re"
        {
                                        tok += 5; /* skip "re2c:" */
                                        lexer_state = LEX_CONFIG;
                                        yylval.str = new std::string (tok, tok_len ());
                                        return CONFIG;
                                }
-#line 1143 "src/parse/scanner_lex.cc"
-yy177:
+#line 1121 "src/parse/scanner_lex.cc"
+yy173:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 'Z') {
-               if (yych <= '/') goto yy142;
-               if (yych <= '9') goto yy179;
-               if (yych <= '@') goto yy142;
-               goto yy179;
+               if (yych <= '/') goto yy143;
+               if (yych <= '9') goto yy175;
+               if (yych <= '@') goto yy143;
+               goto yy175;
        } else {
                if (yych <= '_') {
-                       if (yych <= '^') goto yy142;
-                       goto yy179;
+                       if (yych <= '^') goto yy143;
+                       goto yy175;
                } else {
-                       if (yych <= '`') goto yy142;
-                       if (yych <= 'z') goto yy179;
-                       goto yy142;
+                       if (yych <= '`') goto yy143;
+                       if (yych <= 'z') goto yy175;
+                       goto yy143;
                }
        }
-yy178:
+yy174:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 'Z') {
-               if (yych <= '/') goto yy142;
-               if (yych <= '9') goto yy174;
-               if (yych <= '@') goto yy142;
-               goto yy174;
+               if (yych <= '/') goto yy143;
+               if (yych <= '9') goto yy170;
+               if (yych <= '@') goto yy143;
+               goto yy170;
        } else {
                if (yych <= '_') {
-                       if (yych <= '^') goto yy142;
-                       goto yy174;
+                       if (yych <= '^') goto yy143;
+                       goto yy170;
                } else {
-                       if (yych <= '`') goto yy142;
-                       if (yych <= 'z') goto yy174;
-                       goto yy142;
+                       if (yych <= '`') goto yy143;
+                       if (yych <= 'z') goto yy170;
+                       goto yy143;
                }
        }
-yy179:
+yy175:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 'Z') {
-               if (yych <= '/') goto yy176;
-               if (yych <= '9') goto yy179;
-               if (yych <= '@') goto yy176;
-               goto yy179;
+               if (yych <= '/') goto yy172;
+               if (yych <= '9') goto yy175;
+               if (yych <= '@') goto yy172;
+               goto yy175;
        } else {
                if (yych <= '_') {
-                       if (yych <= '^') goto yy176;
-                       goto yy179;
+                       if (yych <= '^') goto yy172;
+                       goto yy175;
                } else {
-                       if (yych <= '`') goto yy176;
-                       if (yych <= 'z') goto yy179;
-                       goto yy176;
+                       if (yych <= '`') goto yy172;
+                       if (yych <= 'z') goto yy175;
+                       goto yy172;
                }
        }
-yy181:
+yy177:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 383 "../src/parse/scanner_lex.re"
+#line 378 "../src/parse/scanner_lex.re"
        {
                                        yylval.str = new std::string (tok, tok_len ());
                                        if (FFlag)
@@ -1211,51 +1189,51 @@ yy181:
                                                return ID;
                                        }
                                }
-#line 1215 "src/parse/scanner_lex.cc"
-yy183:
+#line 1193 "src/parse/scanner_lex.cc"
+yy179:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy184:
+yy180:
        if (yybm[0+yych] & 16) {
-               goto yy183;
+               goto yy179;
        }
-       if (yych == ',') goto yy185;
-       if (yych <= '<') goto yy181;
-       if (yych >= '?') goto yy181;
-yy185:
+       if (yych == ',') goto yy181;
+       if (yych <= '<') goto yy177;
+       if (yych >= '?') goto yy177;
+yy181:
        yych = (YYCTYPE)*++YYCURSOR;
-       goto yy167;
-yy186:
+       goto yy163;
+yy182:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy187:
+yy183:
        if (yybm[0+yych] & 32) {
-               goto yy186;
+               goto yy182;
        }
-       if (yych <= '\n') goto yy142;
-       if (yych <= '\\') goto yy190;
-       goto yy191;
-yy188:
+       if (yych <= '\n') goto yy143;
+       if (yych <= '\\') goto yy186;
+       goto yy187;
+yy184:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '[') {
-               if (yych == '\n') goto yy142;
-               goto yy188;
+               if (yych == '\n') goto yy143;
+               goto yy184;
        } else {
-               if (yych <= '\\') goto yy193;
-               if (yych <= ']') goto yy194;
-               goto yy188;
+               if (yych <= '\\') goto yy189;
+               if (yych <= ']') goto yy190;
+               goto yy184;
        }
-yy190:
+yy186:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy142;
-       goto yy186;
-yy191:
+       if (yych == '\n') goto yy143;
+       goto yy182;
+yy187:
        ++YYCURSOR;
 #line 299 "../src/parse/scanner_lex.re"
        {
@@ -1263,14 +1241,14 @@ yy191:
                                        yylval.regexp = ranToRE (s);
                                        return RANGE;
                                }
-#line 1267 "src/parse/scanner_lex.cc"
-yy193:
+#line 1245 "src/parse/scanner_lex.cc"
+yy189:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy142;
-       goto yy188;
-yy194:
+       if (yych == '\n') goto yy143;
+       goto yy184;
+yy190:
        ++YYCURSOR;
 #line 293 "../src/parse/scanner_lex.re"
        {
@@ -1278,113 +1256,113 @@ yy194:
                                        yylval.regexp = invToRE (s);
                                        return RANGE;
                                }
-#line 1282 "src/parse/scanner_lex.cc"
-yy196:
+#line 1260 "src/parse/scanner_lex.cc"
+yy192:
        ++YYCURSOR;
 #line 312 "../src/parse/scanner_lex.re"
        {
                                        return SETUP;
                                }
-#line 1289 "src/parse/scanner_lex.cc"
-yy198:
+#line 1267 "src/parse/scanner_lex.cc"
+yy194:
        YYCTXMARKER = YYCURSOR + 1;
        yych = (YYCTYPE)*++YYCURSOR;
-       goto yy200;
-yy199:
+       goto yy196;
+yy195:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
-yy200:
+yy196:
        if (yych <= '9') {
                if (yych <= '\t') {
-                       if (yych <= 0x08) goto yy142;
-                       goto yy199;
+                       if (yych <= 0x08) goto yy143;
+                       goto yy195;
                } else {
-                       if (yych == ' ') goto yy199;
-                       goto yy142;
+                       if (yych == ' ') goto yy195;
+                       goto yy143;
                }
        } else {
                if (yych <= '=') {
-                       if (yych <= ':') goto yy204;
-                       if (yych <= '<') goto yy142;
-                       goto yy203;
+                       if (yych <= ':') goto yy200;
+                       if (yych <= '<') goto yy143;
+                       goto yy199;
                } else {
-                       if (yych != '{') goto yy142;
+                       if (yych != '{') goto yy143;
                }
        }
-yy201:
+yy197:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
 #line 309 "../src/parse/scanner_lex.re"
        {
                                        return NOCOND;
                                }
-#line 1323 "src/parse/scanner_lex.cc"
-yy203:
+#line 1301 "src/parse/scanner_lex.cc"
+yy199:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '>') goto yy201;
-       goto yy142;
-yy204:
+       if (yych == '>') goto yy197;
+       goto yy143;
+yy200:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '=') goto yy201;
-       goto yy142;
-yy205:
+       if (yych == '=') goto yy197;
+       goto yy143;
+yy201:
        ++YYCURSOR;
-       if ((yych = (YYCTYPE)*YYCURSOR) == '>') goto yy207;
+       if ((yych = (YYCTYPE)*YYCURSOR) == '>') goto yy203;
 #line 240 "../src/parse/scanner_lex.re"
        {
                                        tok += 2; /* skip ":=" */
                                        depth = 0;
                                        goto code;
                                }
-#line 1341 "src/parse/scanner_lex.cc"
-yy207:
+#line 1319 "src/parse/scanner_lex.cc"
+yy203:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
 #line 236 "../src/parse/scanner_lex.re"
        {
                                        return *tok;
                                }
-#line 1349 "src/parse/scanner_lex.cc"
-yy209:
+#line 1327 "src/parse/scanner_lex.cc"
+yy205:
        ++YYCURSOR;
 #line 249 "../src/parse/scanner_lex.re"
        {
                                        depth = 1;
                                        goto comment;
                                }
-#line 1357 "src/parse/scanner_lex.cc"
-yy211:
+#line 1335 "src/parse/scanner_lex.cc"
+yy207:
        ++YYCURSOR;
 #line 246 "../src/parse/scanner_lex.re"
        {
                                goto nextLine;
                        }
-#line 1364 "src/parse/scanner_lex.cc"
-yy213:
+#line 1342 "src/parse/scanner_lex.cc"
+yy209:
        ++YYCURSOR;
 #line 255 "../src/parse/scanner_lex.re"
        {
                                        tok = cur;
                                        return 0;
                                }
-#line 1372 "src/parse/scanner_lex.cc"
-yy215:
+#line 1350 "src/parse/scanner_lex.cc"
+yy211:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy216:
+yy212:
        if (yybm[0+yych] & 64) {
-               goto yy215;
+               goto yy211;
        }
-       if (yych <= '\n') goto yy142;
-       if (yych <= '\'') goto yy218;
+       if (yych <= '\n') goto yy143;
+       if (yych <= '\'') goto yy214;
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy142;
-       goto yy215;
-yy218:
+       if (yych == '\n') goto yy143;
+       goto yy211;
+yy214:
        ++YYCURSOR;
 #line 273 "../src/parse/scanner_lex.re"
        {
@@ -1399,23 +1377,23 @@ yy218:
                                        }
                                        return STRING;
                                }
-#line 1403 "src/parse/scanner_lex.cc"
-yy220:
+#line 1381 "src/parse/scanner_lex.cc"
+yy216:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy221:
+yy217:
        if (yybm[0+yych] & 128) {
-               goto yy220;
+               goto yy216;
        }
-       if (yych <= '\n') goto yy142;
-       if (yych <= '"') goto yy223;
+       if (yych <= '\n') goto yy143;
+       if (yych <= '"') goto yy219;
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy142;
-       goto yy220;
-yy223:
+       if (yych == '\n') goto yy143;
+       goto yy216;
+yy219:
        ++YYCURSOR;
 #line 260 "../src/parse/scanner_lex.re"
        {
@@ -1430,182 +1408,182 @@ yy223:
                                        }
                                        return STRING;
                                }
-#line 1434 "src/parse/scanner_lex.cc"
-yy225:
+#line 1412 "src/parse/scanner_lex.cc"
+yy221:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= 0x1F) {
                if (yych != '\t') goto yy117;
        } else {
-               if (yych <= ' ') goto yy226;
-               if (yych == '#') goto yy228;
+               if (yych <= ' ') goto yy222;
+               if (yych == '#') goto yy224;
                goto yy117;
        }
-yy226:
+yy222:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy226;
-               goto yy142;
+               if (yych == '\t') goto yy222;
+               goto yy143;
        } else {
-               if (yych <= ' ') goto yy226;
-               if (yych != '#') goto yy142;
+               if (yych <= ' ') goto yy222;
+               if (yych != '#') goto yy143;
        }
-yy228:
+yy224:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy228;
-               goto yy142;
+               if (yych == '\t') goto yy224;
+               goto yy143;
        } else {
-               if (yych <= ' ') goto yy228;
-               if (yych != 'l') goto yy142;
+               if (yych <= ' ') goto yy224;
+               if (yych != 'l') goto yy143;
        }
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy142;
+       if (yych != 'i') goto yy143;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy142;
+       if (yych != 'n') goto yy143;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy142;
+       if (yych != 'e') goto yy143;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '0') goto yy235;
-       if (yych <= '9') goto yy142;
-       goto yy235;
-yy234:
+       if (yych <= '0') goto yy231;
+       if (yych <= '9') goto yy143;
+       goto yy231;
+yy230:
        YYCTXMARKER = YYCURSOR + 1;
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy235:
+yy231:
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy234;
-               goto yy142;
+               if (yych == '\t') goto yy230;
+               goto yy143;
        } else {
-               if (yych <= ' ') goto yy234;
-               if (yych <= '0') goto yy142;
-               if (yych >= ':') goto yy142;
+               if (yych <= ' ') goto yy230;
+               if (yych <= '0') goto yy143;
+               if (yych >= ':') goto yy143;
        }
-yy236:
+yy232:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '\r') {
                if (yych <= '\t') {
-                       if (yych <= 0x08) goto yy142;
+                       if (yych <= 0x08) goto yy143;
                } else {
-                       if (yych <= '\n') goto yy240;
-                       if (yych <= '\f') goto yy142;
-                       goto yy242;
+                       if (yych <= '\n') goto yy236;
+                       if (yych <= '\f') goto yy143;
+                       goto yy238;
                }
        } else {
                if (yych <= ' ') {
-                       if (yych <= 0x1F) goto yy142;
+                       if (yych <= 0x1F) goto yy143;
                } else {
-                       if (yych <= '/') goto yy142;
-                       if (yych <= '9') goto yy236;
-                       goto yy142;
+                       if (yych <= '/') goto yy143;
+                       if (yych <= '9') goto yy232;
+                       goto yy143;
                }
        }
-yy238:
+yy234:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy238;
-               goto yy142;
+               if (yych == '\t') goto yy234;
+               goto yy143;
        } else {
-               if (yych <= ' ') goto yy238;
-               if (yych == '"') goto yy243;
-               goto yy142;
+               if (yych <= ' ') goto yy234;
+               if (yych == '"') goto yy239;
+               goto yy143;
        }
-yy240:
+yy236:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 429 "../src/parse/scanner_lex.re"
+#line 424 "../src/parse/scanner_lex.re"
        {
                                        set_sourceline ();
                                        goto scan;
                                }
-#line 1532 "src/parse/scanner_lex.cc"
-yy242:
+#line 1510 "src/parse/scanner_lex.cc"
+yy238:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy240;
-       goto yy142;
-yy243:
+       if (yych == '\n') goto yy236;
+       goto yy143;
+yy239:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '!') {
-               if (yych == '\n') goto yy142;
-               goto yy243;
+               if (yych == '\n') goto yy143;
+               goto yy239;
        } else {
-               if (yych <= '"') goto yy246;
-               if (yych != '\\') goto yy243;
+               if (yych <= '"') goto yy242;
+               if (yych != '\\') goto yy239;
        }
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy142;
-       goto yy243;
-yy246:
+       if (yych == '\n') goto yy143;
+       goto yy239;
+yy242:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy240;
-       if (yych == '\r') goto yy242;
-       goto yy142;
-yy247:
+       if (yych == '\n') goto yy236;
+       if (yych == '\r') goto yy238;
+       goto yy143;
+yy243:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy248:
-       if (yych == '\t') goto yy247;
-       if (yych == ' ') goto yy247;
+yy244:
+       if (yych == '\t') goto yy243;
+       if (yych == ' ') goto yy243;
        goto yy115;
 }
-#line 445 "../src/parse/scanner_lex.re"
+#line 440 "../src/parse/scanner_lex.re"
 
 
 flex_name:
 
-#line 1572 "src/parse/scanner_lex.cc"
+#line 1550 "src/parse/scanner_lex.cc"
 {
        YYCTYPE yych;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy253;
-       if (yych == '\r') goto yy255;
+       if (yych == '\n') goto yy249;
+       if (yych == '\r') goto yy251;
        ++YYCURSOR;
-yy252:
-#line 456 "../src/parse/scanner_lex.re"
+yy248:
+#line 451 "../src/parse/scanner_lex.re"
        {
                YYCURSOR = tok;
                goto start;
        }
-#line 1586 "src/parse/scanner_lex.cc"
-yy253:
+#line 1564 "src/parse/scanner_lex.cc"
+yy249:
        ++YYCURSOR;
-yy254:
-#line 450 "../src/parse/scanner_lex.re"
+yy250:
+#line 445 "../src/parse/scanner_lex.re"
        {
                YYCURSOR = tok;
                lexer_state = LEX_NORMAL;
                return FID_END;
        }
-#line 1596 "src/parse/scanner_lex.cc"
-yy255:
+#line 1574 "src/parse/scanner_lex.cc"
+yy251:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != '\n') goto yy252;
+       if (yych != '\n') goto yy248;
        ++YYCURSOR;
        yych = (YYCTYPE)*YYCURSOR;
-       goto yy254;
+       goto yy250;
 }
-#line 460 "../src/parse/scanner_lex.re"
+#line 455 "../src/parse/scanner_lex.re"
 
 
 code:
 
-#line 1609 "src/parse/scanner_lex.cc"
+#line 1587 "src/parse/scanner_lex.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
@@ -1647,26 +1625,26 @@ code:
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '&') {
                if (yych <= '\n') {
-                       if (yych <= 0x00) goto yy259;
-                       if (yych <= '\t') goto yy261;
-                       goto yy263;
+                       if (yych <= 0x00) goto yy255;
+                       if (yych <= '\t') goto yy257;
+                       goto yy259;
                } else {
-                       if (yych == '"') goto yy265;
-                       goto yy261;
+                       if (yych == '"') goto yy261;
+                       goto yy257;
                }
        } else {
                if (yych <= '{') {
-                       if (yych <= '\'') goto yy266;
-                       if (yych <= 'z') goto yy261;
-                       goto yy267;
+                       if (yych <= '\'') goto yy262;
+                       if (yych <= 'z') goto yy257;
+                       goto yy263;
                } else {
-                       if (yych == '}') goto yy269;
-                       goto yy261;
+                       if (yych == '}') goto yy265;
+                       goto yy257;
                }
        }
-yy259:
+yy255:
        ++YYCURSOR;
-#line 523 "../src/parse/scanner_lex.re"
+#line 518 "../src/parse/scanner_lex.re"
        {
                                        if (cur == eof)
                                        {
@@ -1678,35 +1656,35 @@ yy259:
                                        }
                                        goto code;
                                }
-#line 1682 "src/parse/scanner_lex.cc"
-yy261:
+#line 1660 "src/parse/scanner_lex.cc"
+yy257:
        ++YYCURSOR;
-yy262:
-#line 537 "../src/parse/scanner_lex.re"
+yy258:
+#line 532 "../src/parse/scanner_lex.re"
        {
                                        goto code;
                                }
-#line 1690 "src/parse/scanner_lex.cc"
-yy263:
+#line 1668 "src/parse/scanner_lex.cc"
+yy259:
        YYCTXMARKER = YYCURSOR + 1;
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '\r') {
                if (yych <= '\t') {
-                       if (yych >= '\t') goto yy280;
+                       if (yych >= '\t') goto yy276;
                } else {
-                       if (yych <= '\n') goto yy282;
-                       if (yych >= '\r') goto yy282;
+                       if (yych <= '\n') goto yy278;
+                       if (yych >= '\r') goto yy278;
                }
        } else {
                if (yych <= ' ') {
-                       if (yych >= ' ') goto yy280;
+                       if (yych >= ' ') goto yy276;
                } else {
-                       if (yych == '#') goto yy283;
+                       if (yych == '#') goto yy279;
                }
        }
-yy264:
-#line 504 "../src/parse/scanner_lex.re"
+yy260:
+#line 499 "../src/parse/scanner_lex.re"
        {
                                        if (depth == 0)
                                        {
@@ -1726,20 +1704,20 @@ yy264:
                                        cline++;
                                        goto code;
                                }
-#line 1730 "src/parse/scanner_lex.cc"
-yy265:
+#line 1708 "src/parse/scanner_lex.cc"
+yy261:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == '\n') goto yy262;
-       goto yy278;
-yy266:
+       if (yych == '\n') goto yy258;
+       goto yy274;
+yy262:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == '\n') goto yy262;
-       goto yy272;
-yy267:
+       if (yych == '\n') goto yy258;
+       goto yy268;
+yy263:
        ++YYCURSOR;
-#line 476 "../src/parse/scanner_lex.re"
+#line 471 "../src/parse/scanner_lex.re"
        {
                                        if (depth == 0)
                                        {
@@ -1751,10 +1729,10 @@ yy267:
                                        }
                                        goto code;
                                }
-#line 1755 "src/parse/scanner_lex.cc"
-yy269:
+#line 1733 "src/parse/scanner_lex.cc"
+yy265:
        ++YYCURSOR;
-#line 464 "../src/parse/scanner_lex.re"
+#line 459 "../src/parse/scanner_lex.re"
        {
                                        if (depth == 0)
                                        {
@@ -1767,69 +1745,69 @@ yy269:
                                        }
                                        goto code;
                                }
-#line 1771 "src/parse/scanner_lex.cc"
-yy271:
+#line 1749 "src/parse/scanner_lex.cc"
+yy267:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy272:
+yy268:
        if (yybm[0+yych] & 16) {
-               goto yy271;
+               goto yy267;
        }
-       if (yych <= '\n') goto yy273;
-       if (yych <= '\'') goto yy275;
-       goto yy274;
-yy273:
+       if (yych <= '\n') goto yy269;
+       if (yych <= '\'') goto yy271;
+       goto yy270;
+yy269:
        YYCURSOR = YYMARKER;
        if (yyaccept <= 1) {
                if (yyaccept == 0) {
-                       goto yy264;
+                       goto yy260;
                } else {
-                       goto yy262;
+                       goto yy258;
                }
        } else {
-               goto yy281;
+               goto yy277;
        }
-yy274:
+yy270:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy273;
-       goto yy271;
-yy275:
+       if (yych == '\n') goto yy269;
+       goto yy267;
+yy271:
        ++YYCURSOR;
-#line 534 "../src/parse/scanner_lex.re"
+#line 529 "../src/parse/scanner_lex.re"
        {
                                        goto code;
                                }
-#line 1806 "src/parse/scanner_lex.cc"
-yy277:
+#line 1784 "src/parse/scanner_lex.cc"
+yy273:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy278:
+yy274:
        if (yybm[0+yych] & 32) {
-               goto yy277;
+               goto yy273;
        }
-       if (yych <= '\n') goto yy273;
-       if (yych <= '"') goto yy275;
+       if (yych <= '\n') goto yy269;
+       if (yych <= '"') goto yy271;
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy273;
-       goto yy277;
-yy280:
+       if (yych == '\n') goto yy269;
+       goto yy273;
+yy276:
        yyaccept = 2;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy302;
+               if (yych == '\t') goto yy298;
        } else {
-               if (yych <= ' ') goto yy302;
-               if (yych == '#') goto yy283;
+               if (yych <= ' ') goto yy298;
+               if (yych == '#') goto yy279;
        }
-yy281:
+yy277:
        YYCURSOR = YYCTXMARKER;
-#line 491 "../src/parse/scanner_lex.re"
+#line 486 "../src/parse/scanner_lex.re"
        {
                                        if (depth == 0)
                                        {
@@ -1843,123 +1821,123 @@ yy281:
                                        cline++;
                                        goto code;
                                }
-#line 1847 "src/parse/scanner_lex.cc"
-yy282:
+#line 1825 "src/parse/scanner_lex.cc"
+yy278:
        yych = (YYCTYPE)*++YYCURSOR;
-       goto yy281;
-yy283:
+       goto yy277;
+yy279:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 64) {
-               goto yy283;
+               goto yy279;
        }
-       if (yych != 'l') goto yy273;
+       if (yych != 'l') goto yy269;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy273;
+       if (yych != 'i') goto yy269;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy273;
+       if (yych != 'n') goto yy269;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy273;
+       if (yych != 'e') goto yy269;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '0') goto yy290;
-       if (yych <= '9') goto yy273;
-       goto yy290;
-yy289:
+       if (yych <= '0') goto yy286;
+       if (yych <= '9') goto yy269;
+       goto yy286;
+yy285:
        YYCTXMARKER = YYCURSOR + 1;
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy290:
+yy286:
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy289;
-               goto yy273;
+               if (yych == '\t') goto yy285;
+               goto yy269;
        } else {
-               if (yych <= ' ') goto yy289;
-               if (yych <= '0') goto yy273;
-               if (yych >= ':') goto yy273;
+               if (yych <= ' ') goto yy285;
+               if (yych <= '0') goto yy269;
+               if (yych >= ':') goto yy269;
        }
-yy291:
+yy287:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy291;
+               goto yy287;
        }
        if (yych <= '\f') {
-               if (yych <= 0x08) goto yy273;
-               if (yych <= '\t') goto yy293;
-               if (yych <= '\n') goto yy295;
-               goto yy273;
+               if (yych <= 0x08) goto yy269;
+               if (yych <= '\t') goto yy289;
+               if (yych <= '\n') goto yy291;
+               goto yy269;
        } else {
-               if (yych <= '\r') goto yy297;
-               if (yych != ' ') goto yy273;
+               if (yych <= '\r') goto yy293;
+               if (yych != ' ') goto yy269;
        }
-yy293:
+yy289:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy293;
-               goto yy273;
+               if (yych == '\t') goto yy289;
+               goto yy269;
        } else {
-               if (yych <= ' ') goto yy293;
-               if (yych == '"') goto yy298;
-               goto yy273;
+               if (yych <= ' ') goto yy289;
+               if (yych == '"') goto yy294;
+               goto yy269;
        }
-yy295:
+yy291:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 487 "../src/parse/scanner_lex.re"
+#line 482 "../src/parse/scanner_lex.re"
        {
                                        set_sourceline ();
                                        goto code;
                                }
-#line 1919 "src/parse/scanner_lex.cc"
-yy297:
+#line 1897 "src/parse/scanner_lex.cc"
+yy293:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy295;
-       goto yy273;
-yy298:
+       if (yych == '\n') goto yy291;
+       goto yy269;
+yy294:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '!') {
-               if (yych == '\n') goto yy273;
-               goto yy298;
+               if (yych == '\n') goto yy269;
+               goto yy294;
        } else {
-               if (yych <= '"') goto yy301;
-               if (yych != '\\') goto yy298;
+               if (yych <= '"') goto yy297;
+               if (yych != '\\') goto yy294;
        }
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy273;
-       goto yy298;
-yy301:
+       if (yych == '\n') goto yy269;
+       goto yy294;
+yy297:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy295;
-       if (yych == '\r') goto yy297;
-       goto yy273;
-yy302:
+       if (yych == '\n') goto yy291;
+       if (yych == '\r') goto yy293;
+       goto yy269;
+yy298:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy302;
-               goto yy273;
+               if (yych == '\t') goto yy298;
+               goto yy269;
        } else {
-               if (yych <= ' ') goto yy302;
-               if (yych == '#') goto yy283;
-               goto yy273;
+               if (yych <= ' ') goto yy298;
+               if (yych == '#') goto yy279;
+               goto yy269;
        }
 }
-#line 540 "../src/parse/scanner_lex.re"
+#line 535 "../src/parse/scanner_lex.re"
 
 
 comment:
 
-#line 1963 "src/parse/scanner_lex.cc"
+#line 1941 "src/parse/scanner_lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -1999,14 +1977,14 @@ comment:
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= ')') {
-               if (yych == '\n') goto yy308;
+               if (yych == '\n') goto yy304;
        } else {
-               if (yych <= '*') goto yy310;
-               if (yych == '/') goto yy311;
+               if (yych <= '*') goto yy306;
+               if (yych == '/') goto yy307;
        }
        ++YYCURSOR;
-yy307:
-#line 572 "../src/parse/scanner_lex.re"
+yy303:
+#line 567 "../src/parse/scanner_lex.re"
        {
                                        if (cur == eof)
                                        {
@@ -2014,15 +1992,15 @@ yy307:
                                        }
                                        goto comment;
                                }
-#line 2018 "src/parse/scanner_lex.cc"
-yy308:
+#line 1996 "src/parse/scanner_lex.cc"
+yy304:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yybm[0+yych] & 32) {
-               goto yy316;
+               goto yy312;
        }
-       if (yych == '#') goto yy319;
-yy309:
-#line 563 "../src/parse/scanner_lex.re"
+       if (yych == '#') goto yy315;
+yy305:
+#line 558 "../src/parse/scanner_lex.re"
        {
                                        if (cur == eof)
                                        {
@@ -2032,25 +2010,25 @@ yy309:
                                        cline++;
                                        goto comment;
                                }
-#line 2036 "src/parse/scanner_lex.cc"
-yy310:
+#line 2014 "src/parse/scanner_lex.cc"
+yy306:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '/') goto yy314;
-       goto yy307;
-yy311:
+       if (yych == '/') goto yy310;
+       goto yy303;
+yy307:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != '*') goto yy307;
+       if (yych != '*') goto yy303;
        ++YYCURSOR;
-#line 554 "../src/parse/scanner_lex.re"
+#line 549 "../src/parse/scanner_lex.re"
        {
                                        ++depth;
                                        fatal("ambiguous /* found");
                                        goto comment;
                                }
-#line 2051 "src/parse/scanner_lex.cc"
-yy314:
+#line 2029 "src/parse/scanner_lex.cc"
+yy310:
        ++YYCURSOR;
-#line 544 "../src/parse/scanner_lex.re"
+#line 539 "../src/parse/scanner_lex.re"
        {
                                        if (--depth == 0)
                                        {
@@ -2061,136 +2039,136 @@ yy314:
                                                goto comment;
                                        }
                                }
-#line 2065 "src/parse/scanner_lex.cc"
-yy316:
+#line 2043 "src/parse/scanner_lex.cc"
+yy312:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 32) {
-               goto yy316;
+               goto yy312;
        }
-       if (yych == '#') goto yy319;
-yy318:
+       if (yych == '#') goto yy315;
+yy314:
        YYCURSOR = YYMARKER;
-       goto yy309;
-yy319:
+       goto yy305;
+yy315:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy319;
-               goto yy318;
+               if (yych == '\t') goto yy315;
+               goto yy314;
        } else {
-               if (yych <= ' ') goto yy319;
-               if (yych != 'l') goto yy318;
+               if (yych <= ' ') goto yy315;
+               if (yych != 'l') goto yy314;
        }
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy318;
+       if (yych != 'i') goto yy314;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy318;
+       if (yych != 'n') goto yy314;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy318;
+       if (yych != 'e') goto yy314;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '0') goto yy326;
-       if (yych <= '9') goto yy318;
-       goto yy326;
-yy325:
+       if (yych <= '0') goto yy322;
+       if (yych <= '9') goto yy314;
+       goto yy322;
+yy321:
        YYCTXMARKER = YYCURSOR + 1;
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy326:
+yy322:
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy325;
-               goto yy318;
+               if (yych == '\t') goto yy321;
+               goto yy314;
        } else {
-               if (yych <= ' ') goto yy325;
-               if (yych <= '0') goto yy318;
-               if (yych >= ':') goto yy318;
+               if (yych <= ' ') goto yy321;
+               if (yych <= '0') goto yy314;
+               if (yych >= ':') goto yy314;
        }
-yy327:
+yy323:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 64) {
-               goto yy327;
+               goto yy323;
        }
        if (yych <= '\f') {
-               if (yych <= 0x08) goto yy318;
-               if (yych <= '\t') goto yy329;
-               if (yych <= '\n') goto yy331;
-               goto yy318;
+               if (yych <= 0x08) goto yy314;
+               if (yych <= '\t') goto yy325;
+               if (yych <= '\n') goto yy327;
+               goto yy314;
        } else {
-               if (yych <= '\r') goto yy333;
-               if (yych != ' ') goto yy318;
+               if (yych <= '\r') goto yy329;
+               if (yych != ' ') goto yy314;
        }
-yy329:
+yy325:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy329;
-               goto yy318;
+               if (yych == '\t') goto yy325;
+               goto yy314;
        } else {
-               if (yych <= ' ') goto yy329;
-               if (yych == '"') goto yy334;
-               goto yy318;
+               if (yych <= ' ') goto yy325;
+               if (yych == '"') goto yy330;
+               goto yy314;
        }
-yy331:
+yy327:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 559 "../src/parse/scanner_lex.re"
+#line 554 "../src/parse/scanner_lex.re"
        {
                                        set_sourceline ();
                                        goto comment;
                                }
-#line 2148 "src/parse/scanner_lex.cc"
-yy333:
+#line 2126 "src/parse/scanner_lex.cc"
+yy329:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy331;
-       goto yy318;
-yy334:
+       if (yych == '\n') goto yy327;
+       goto yy314;
+yy330:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy334;
+               goto yy330;
        }
-       if (yych <= '\n') goto yy318;
-       if (yych <= '"') goto yy337;
+       if (yych <= '\n') goto yy314;
+       if (yych <= '"') goto yy333;
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy318;
-       goto yy334;
-yy337:
+       if (yych == '\n') goto yy314;
+       goto yy330;
+yy333:
        ++YYCURSOR;
-       if ((yych = (YYCTYPE)*YYCURSOR) == '\n') goto yy331;
-       if (yych == '\r') goto yy333;
-       goto yy318;
+       if ((yych = (YYCTYPE)*YYCURSOR) == '\n') goto yy327;
+       if (yych == '\r') goto yy329;
+       goto yy314;
 }
-#line 579 "../src/parse/scanner_lex.re"
+#line 574 "../src/parse/scanner_lex.re"
 
 
 nextLine:
 
-#line 2178 "src/parse/scanner_lex.cc"
+#line 2156 "src/parse/scanner_lex.cc"
 {
        YYCTYPE yych;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy342;
+       if (yych == '\n') goto yy338;
        ++YYCURSOR;
-#line 590 "../src/parse/scanner_lex.re"
+#line 585 "../src/parse/scanner_lex.re"
        {  if(cur == eof) {
                   return 0;
                }
                goto nextLine;
             }
-#line 2191 "src/parse/scanner_lex.cc"
-yy342:
+#line 2169 "src/parse/scanner_lex.cc"
+yy338:
        ++YYCURSOR;
-#line 583 "../src/parse/scanner_lex.re"
+#line 578 "../src/parse/scanner_lex.re"
        { if(cur == eof) {
                   return 0;
                }
@@ -2198,14 +2176,14 @@ yy342:
                cline++;
                goto scan;
             }
-#line 2202 "src/parse/scanner_lex.cc"
+#line 2180 "src/parse/scanner_lex.cc"
 }
-#line 595 "../src/parse/scanner_lex.re"
+#line 590 "../src/parse/scanner_lex.re"
 
 
 config:
 
-#line 2209 "src/parse/scanner_lex.cc"
+#line 2187 "src/parse/scanner_lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -2245,62 +2223,62 @@ config:
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy348;
+               if (yych == '\t') goto yy344;
        } else {
-               if (yych <= ' ') goto yy348;
-               if (yych == '=') goto yy350;
+               if (yych <= ' ') goto yy344;
+               if (yych == '=') goto yy346;
        }
        ++YYCURSOR;
-#line 606 "../src/parse/scanner_lex.re"
+#line 601 "../src/parse/scanner_lex.re"
        {
                                        fatal("missing '='");
                                }
-#line 2259 "src/parse/scanner_lex.cc"
-yy348:
+#line 2237 "src/parse/scanner_lex.cc"
+yy344:
        ++YYCURSOR;
        yych = (YYCTYPE)*YYCURSOR;
-       goto yy355;
-yy349:
-#line 599 "../src/parse/scanner_lex.re"
+       goto yy351;
+yy345:
+#line 594 "../src/parse/scanner_lex.re"
        {
                                        goto config;
                                }
-#line 2269 "src/parse/scanner_lex.cc"
-yy350:
+#line 2247 "src/parse/scanner_lex.cc"
+yy346:
        ++YYCURSOR;
        yych = (YYCTYPE)*YYCURSOR;
-       goto yy353;
-yy351:
-#line 602 "../src/parse/scanner_lex.re"
+       goto yy349;
+yy347:
+#line 597 "../src/parse/scanner_lex.re"
        {
                                        lexer_state = LEX_CONFIG_VALUE;
                                        return '=';
                                }
-#line 2280 "src/parse/scanner_lex.cc"
-yy352:
+#line 2258 "src/parse/scanner_lex.cc"
+yy348:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy353:
+yy349:
        if (yybm[0+yych] & 128) {
-               goto yy352;
+               goto yy348;
        }
-       goto yy351;
-yy354:
+       goto yy347;
+yy350:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy355:
-       if (yych == '\t') goto yy354;
-       if (yych == ' ') goto yy354;
-       goto yy349;
+yy351:
+       if (yych == '\t') goto yy350;
+       if (yych == ' ') goto yy350;
+       goto yy345;
 }
-#line 609 "../src/parse/scanner_lex.re"
+#line 604 "../src/parse/scanner_lex.re"
 
 
 value:
 
-#line 2304 "src/parse/scanner_lex.cc"
+#line 2282 "src/parse/scanner_lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -2341,46 +2319,46 @@ value:
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '&') {
                if (yych <= '\r') {
-                       if (yych <= 0x08) goto yy364;
-                       if (yych <= '\n') goto yy358;
-                       if (yych <= '\f') goto yy364;
+                       if (yych <= 0x08) goto yy360;
+                       if (yych <= '\n') goto yy354;
+                       if (yych <= '\f') goto yy360;
                } else {
                        if (yych <= ' ') {
-                               if (yych <= 0x1F) goto yy364;
+                               if (yych <= 0x1F) goto yy360;
                        } else {
-                               if (yych == '"') goto yy366;
-                               goto yy364;
+                               if (yych == '"') goto yy362;
+                               goto yy360;
                        }
                }
        } else {
                if (yych <= '/') {
-                       if (yych <= '\'') goto yy368;
-                       if (yych == '-') goto yy361;
-                       goto yy364;
+                       if (yych <= '\'') goto yy364;
+                       if (yych == '-') goto yy357;
+                       goto yy360;
                } else {
                        if (yych <= '9') {
-                               if (yych <= '0') goto yy359;
-                               goto yy362;
+                               if (yych <= '0') goto yy355;
+                               goto yy358;
                        } else {
-                               if (yych != ';') goto yy364;
+                               if (yych != ';') goto yy360;
                        }
                }
        }
-yy358:
-#line 621 "../src/parse/scanner_lex.re"
+yy354:
+#line 616 "../src/parse/scanner_lex.re"
        {
                                        yylval.str = new std::string (tok, tok_len ());
                                        lexer_state = LEX_NORMAL;
                                        return VALUE;
                                }
-#line 2377 "src/parse/scanner_lex.cc"
-yy359:
+#line 2355 "src/parse/scanner_lex.cc"
+yy355:
        ++YYCURSOR;
        if (yybm[0+(yych = (YYCTYPE)*YYCURSOR)] & 8) {
-               goto yy364;
+               goto yy360;
        }
-yy360:
-#line 613 "../src/parse/scanner_lex.re"
+yy356:
+#line 608 "../src/parse/scanner_lex.re"
        {
                                        if (!s_to_i32_unsafe (tok, cur, yylval.number))
                                        {
@@ -2389,150 +2367,150 @@ yy360:
                                        lexer_state = LEX_NORMAL;
                                        return NUMBER;
                                }
-#line 2393 "src/parse/scanner_lex.cc"
-yy361:
+#line 2371 "src/parse/scanner_lex.cc"
+yy357:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '0') goto yy365;
-       if (yych >= ':') goto yy365;
-yy362:
+       if (yych <= '0') goto yy361;
+       if (yych >= ':') goto yy361;
+yy358:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 4) {
-               goto yy362;
+               goto yy358;
        }
        if (yych <= '\r') {
-               if (yych <= 0x08) goto yy364;
-               if (yych <= '\n') goto yy360;
-               if (yych >= '\r') goto yy360;
+               if (yych <= 0x08) goto yy360;
+               if (yych <= '\n') goto yy356;
+               if (yych >= '\r') goto yy356;
        } else {
                if (yych <= ' ') {
-                       if (yych >= ' ') goto yy360;
+                       if (yych >= ' ') goto yy356;
                } else {
-                       if (yych == ';') goto yy360;
+                       if (yych == ';') goto yy356;
                }
        }
-yy364:
+yy360:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy365:
+yy361:
        if (yybm[0+yych] & 8) {
-               goto yy364;
+               goto yy360;
        }
-       goto yy358;
-yy366:
+       goto yy354;
+yy362:
        YYMARKER = ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 16) {
-               goto yy366;
+               goto yy362;
        }
        if (yych <= ' ') {
-               if (yych == '\n') goto yy358;
-               goto yy376;
+               if (yych == '\n') goto yy354;
+               goto yy372;
        } else {
-               if (yych <= '"') goto yy364;
-               if (yych <= ';') goto yy376;
-               goto yy378;
+               if (yych <= '"') goto yy360;
+               if (yych <= ';') goto yy372;
+               goto yy374;
        }
-yy368:
+yy364:
        YYMARKER = ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 32) {
-               goto yy368;
+               goto yy364;
        }
        if (yych <= ' ') {
-               if (yych == '\n') goto yy358;
+               if (yych == '\n') goto yy354;
        } else {
-               if (yych <= '\'') goto yy364;
-               if (yych >= '<') goto yy373;
+               if (yych <= '\'') goto yy360;
+               if (yych >= '<') goto yy369;
        }
-yy370:
+yy366:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 64) {
-               goto yy370;
+               goto yy366;
        }
-       if (yych <= '\n') goto yy372;
-       if (yych <= '\'') goto yy374;
-       goto yy375;
-yy372:
+       if (yych <= '\n') goto yy368;
+       if (yych <= '\'') goto yy370;
+       goto yy371;
+yy368:
        YYCURSOR = YYMARKER;
-       goto yy358;
-yy373:
+       goto yy354;
+yy369:
        YYMARKER = ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '\r') {
                if (yych <= '\t') {
-                       if (yych <= 0x08) goto yy368;
-                       goto yy370;
+                       if (yych <= 0x08) goto yy364;
+                       goto yy366;
                } else {
-                       if (yych <= '\n') goto yy358;
-                       if (yych <= '\f') goto yy368;
-                       goto yy370;
+                       if (yych <= '\n') goto yy354;
+                       if (yych <= '\f') goto yy364;
+                       goto yy366;
                }
        } else {
                if (yych <= ' ') {
-                       if (yych <= 0x1F) goto yy368;
-                       goto yy370;
+                       if (yych <= 0x1F) goto yy364;
+                       goto yy366;
                } else {
-                       if (yych == ';') goto yy370;
-                       goto yy368;
+                       if (yych == ';') goto yy366;
+                       goto yy364;
                }
        }
-yy374:
+yy370:
        yych = (YYCTYPE)*++YYCURSOR;
-       goto yy358;
-yy375:
+       goto yy354;
+yy371:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy372;
-       goto yy370;
-yy376:
+       if (yych == '\n') goto yy368;
+       goto yy366;
+yy372:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy376;
+               goto yy372;
        }
-       if (yych <= '\n') goto yy372;
-       if (yych <= '"') goto yy374;
-       goto yy379;
-yy378:
+       if (yych <= '\n') goto yy368;
+       if (yych <= '"') goto yy370;
+       goto yy375;
+yy374:
        YYMARKER = ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '\r') {
                if (yych <= '\t') {
-                       if (yych <= 0x08) goto yy366;
-                       goto yy376;
+                       if (yych <= 0x08) goto yy362;
+                       goto yy372;
                } else {
-                       if (yych <= '\n') goto yy358;
-                       if (yych <= '\f') goto yy366;
-                       goto yy376;
+                       if (yych <= '\n') goto yy354;
+                       if (yych <= '\f') goto yy362;
+                       goto yy372;
                }
        } else {
                if (yych <= ' ') {
-                       if (yych <= 0x1F) goto yy366;
-                       goto yy376;
+                       if (yych <= 0x1F) goto yy362;
+                       goto yy372;
                } else {
-                       if (yych == ';') goto yy376;
-                       goto yy366;
+                       if (yych == ';') goto yy372;
+                       goto yy362;
                }
        }
-yy379:
+yy375:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy372;
-       goto yy376;
+       if (yych == '\n') goto yy368;
+       goto yy372;
 }
-#line 626 "../src/parse/scanner_lex.re"
+#line 621 "../src/parse/scanner_lex.re"
 
 }
 
@@ -2555,7 +2533,7 @@ void Scanner::set_sourceline ()
 sourceline:
        tok = cur;
 
-#line 2559 "src/parse/scanner_lex.cc"
+#line 2537 "src/parse/scanner_lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -2595,23 +2573,23 @@ sourceline:
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '!') {
-               if (yych == '\n') goto yy384;
+               if (yych == '\n') goto yy380;
        } else {
-               if (yych <= '"') goto yy386;
-               if (yych <= '0') goto yy382;
-               if (yych <= '9') goto yy387;
+               if (yych <= '"') goto yy382;
+               if (yych <= '0') goto yy378;
+               if (yych <= '9') goto yy383;
        }
-yy382:
+yy378:
        ++YYCURSOR;
-yy383:
-#line 671 "../src/parse/scanner_lex.re"
+yy379:
+#line 666 "../src/parse/scanner_lex.re"
        {
                                        goto sourceline;
                                }
-#line 2612 "src/parse/scanner_lex.cc"
-yy384:
+#line 2590 "src/parse/scanner_lex.cc"
+yy380:
        ++YYCURSOR;
-#line 659 "../src/parse/scanner_lex.re"
+#line 654 "../src/parse/scanner_lex.re"
        {
                                        if (cur == eof)
                                        {
@@ -2624,17 +2602,17 @@ yy384:
                                        tok = cur;
                                        return; 
                                }
-#line 2628 "src/parse/scanner_lex.cc"
-yy386:
+#line 2606 "src/parse/scanner_lex.cc"
+yy382:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == '\n') goto yy383;
-       goto yy392;
-yy387:
+       if (yych == '\n') goto yy379;
+       goto yy388;
+yy383:
        ++YYCURSOR;
        yych = (YYCTYPE)*YYCURSOR;
-       goto yy390;
-yy388:
-#line 648 "../src/parse/scanner_lex.re"
+       goto yy386;
+yy384:
+#line 643 "../src/parse/scanner_lex.re"
        {
                                        if (!s_to_u32_unsafe (tok, cur, cline))
                                        {
@@ -2642,46 +2620,46 @@ yy388:
                                        }
                                        goto sourceline; 
                                }
-#line 2646 "src/parse/scanner_lex.cc"
-yy389:
+#line 2624 "src/parse/scanner_lex.cc"
+yy385:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy390:
+yy386:
        if (yybm[0+yych] & 64) {
-               goto yy389;
+               goto yy385;
        }
-       goto yy388;
-yy391:
+       goto yy384;
+yy387:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy392:
+yy388:
        if (yybm[0+yych] & 128) {
-               goto yy391;
+               goto yy387;
        }
-       if (yych <= '\n') goto yy393;
-       if (yych <= '"') goto yy395;
-       goto yy394;
-yy393:
+       if (yych <= '\n') goto yy389;
+       if (yych <= '"') goto yy391;
+       goto yy390;
+yy389:
        YYCURSOR = YYMARKER;
-       goto yy383;
-yy394:
+       goto yy379;
+yy390:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy393;
-       goto yy391;
-yy395:
+       if (yych == '\n') goto yy389;
+       goto yy387;
+yy391:
        ++YYCURSOR;
-#line 655 "../src/parse/scanner_lex.re"
+#line 650 "../src/parse/scanner_lex.re"
        {
                                        escape (in.file_name, std::string (tok + 1, tok_len () - 2)); // -2 to omit quotes
                                        goto sourceline; 
                                }
-#line 2683 "src/parse/scanner_lex.cc"
+#line 2661 "src/parse/scanner_lex.cc"
 }
-#line 674 "../src/parse/scanner_lex.re"
+#line 669 "../src/parse/scanner_lex.re"
 
 }
 
index 91bb7bba542524a3c1e2063557f31f1b63987c22..fed503ce98ae6cac52ed96511f9058d8932e19dd 100644 (file)
@@ -325,11 +325,6 @@ start:
                                        return CLOSE;
                                }
 
-       "{0,}"          {
-                                       yylval.op = '*';
-                                       return CLOSE;
-                               }
-
        "{" [0-9]+ "}"  {
                                        if (!s_to_u32_unsafe (tok + 1, cur - 1, yylval.extop.min))
                                        {
index 354515c1d651740e89c7970c5d28a3adad78919d..915cdc01bd241d732d27398f35911eba2755ded8 100644 (file)
@@ -21,35 +21,35 @@ const char *q;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = *YYCURSOR;
        switch (yych) {
-       case '\n':      goto yy4;
+       case '\n':      goto yy2;
        case 'A':
-       case 'a':       goto yy2;
+       case 'a':       goto yy4;
        default:        goto yy6;
        }
 yy2:
+       ++YYCURSOR;
+yy3:
+#line 18 "bug1390174.re"
+       {RET(1);}
+#line 35 "<stdout>"
+yy4:
        yych = *(YYMARKER = ++YYCURSOR);
        switch (yych) {
        case '\n':      goto yy7;
        case 'A':
        case 'a':       goto yy8;
-       default:        goto yy3;
+       default:        goto yy5;
        }
-yy3:
+yy5:
 #line 19 "bug1390174.re"
        {RET(0);}
-#line 41 "<stdout>"
-yy4:
-       ++YYCURSOR;
-yy5:
-#line 18 "bug1390174.re"
-       {RET(1);}
 #line 47 "<stdout>"
 yy6:
        yych = *++YYCURSOR;
-       goto yy3;
+       goto yy5;
 yy7:
        yych = *++YYCURSOR;
-       goto yy5;
+       goto yy3;
 yy8:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
@@ -62,7 +62,7 @@ yy8:
        }
 yy10:
        YYCURSOR = YYMARKER;
-       goto yy3;
+       goto yy5;
 }
 #line 20 "bug1390174.re"
 
diff --git a/re2c/test/repeater2.c b/re2c/test/repeater2.c
new file mode 100644 (file)
index 0000000..4b70229
--- /dev/null
@@ -0,0 +1,373 @@
+re2c: warning: line 2: rule matches empty string [-Wmatch-empty-string]
+re2c: warning: line 7: naked default case (stray code units: [0x00-`][b-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 11: naked default case (stray code units: [0x00-`][a][b-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 14: rule matches empty string [-Wmatch-empty-string]
+re2c: warning: line 19: naked default case (stray code units: [0x00-`][b-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 23: naked default case (stray code units: [0x00-`][a][b-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 26: rule matches empty string [-Wmatch-empty-string]
+re2c: warning: line 30: rule matches empty string [-Wmatch-empty-string]
+re2c: warning: line 35: naked default case (stray code units: [0x00-`][b-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 39: naked default case (stray code units: [0x00-`][b-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 43: naked default case (stray code units: [0x00-`][a][b-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 47: naked default case (stray code units: [0x00-`][a][b-0xFF]), better add default rule * [-Wnaked-default]
+re2c: warning: line 51: naked default case (stray code units: [0x00-`][a][b-0xFF]), better add default rule * [-Wnaked-default]
+/* Generated by re2c */
+#line 1 "repeater2.re"
+
+#line 5 "<stdout>"
+{
+       YYCTYPE yych;
+#line 2 "repeater2.re"
+       {}
+#line 10 "<stdout>"
+}
+#line 3 "repeater2.re"
+
+
+
+#line 16 "<stdout>"
+{
+       YYCTYPE yych;
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy6;
+       default:        goto yy5;
+       }
+yy5:
+yy6:
+       ++YYCURSOR;
+#line 6 "repeater2.re"
+       {}
+#line 30 "<stdout>"
+}
+#line 7 "repeater2.re"
+
+
+
+#line 36 "<stdout>"
+{
+       YYCTYPE yych;
+       if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy11;
+       default:        goto yy10;
+       }
+yy10:
+yy11:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy12;
+       default:        goto yy10;
+       }
+yy12:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy13;
+       default:        goto yy10;
+       }
+yy13:
+       ++YYCURSOR;
+#line 10 "repeater2.re"
+       {}
+#line 62 "<stdout>"
+}
+#line 11 "repeater2.re"
+
+
+
+#line 68 "<stdout>"
+{
+       YYCTYPE yych;
+       goto yy15;
+yy16:
+       ++YYCURSOR;
+yy15:
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy16;
+       default:        goto yy18;
+       }
+yy18:
+#line 14 "repeater2.re"
+       {}
+#line 84 "<stdout>"
+}
+#line 15 "repeater2.re"
+
+
+
+#line 90 "<stdout>"
+{
+       YYCTYPE yych;
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy22;
+       default:        goto yy21;
+       }
+yy21:
+yy22:
+       ++YYCURSOR;
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy22;
+       default:        goto yy24;
+       }
+yy24:
+#line 18 "repeater2.re"
+       {}
+#line 111 "<stdout>"
+}
+#line 19 "repeater2.re"
+
+
+
+#line 117 "<stdout>"
+{
+       YYCTYPE yych;
+       if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy28;
+       default:        goto yy27;
+       }
+yy27:
+yy28:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy29;
+       default:        goto yy27;
+       }
+yy29:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy30;
+       default:        goto yy27;
+       }
+yy30:
+       ++YYCURSOR;
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy30;
+       default:        goto yy32;
+       }
+yy32:
+#line 22 "repeater2.re"
+       {}
+#line 150 "<stdout>"
+}
+#line 23 "repeater2.re"
+
+
+
+#line 156 "<stdout>"
+{
+       YYCTYPE yych;
+#line 26 "repeater2.re"
+       {}
+#line 161 "<stdout>"
+}
+#line 27 "repeater2.re"
+
+
+
+#line 167 "<stdout>"
+{
+       YYCTYPE yych;
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy39;
+       default:        goto yy38;
+       }
+yy38:
+#line 30 "repeater2.re"
+       {}
+#line 179 "<stdout>"
+yy39:
+       ++YYCURSOR;
+       yych = *YYCURSOR;
+       goto yy38;
+}
+#line 31 "repeater2.re"
+
+
+
+#line 189 "<stdout>"
+{
+       YYCTYPE yych;
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy43;
+       default:        goto yy42;
+       }
+yy42:
+yy43:
+       ++YYCURSOR;
+#line 34 "repeater2.re"
+       {}
+#line 203 "<stdout>"
+}
+#line 35 "repeater2.re"
+
+
+
+#line 209 "<stdout>"
+{
+       YYCTYPE yych;
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy48;
+       default:        goto yy47;
+       }
+yy47:
+yy48:
+       ++YYCURSOR;
+#line 38 "repeater2.re"
+       {}
+#line 223 "<stdout>"
+}
+#line 39 "repeater2.re"
+
+
+
+#line 229 "<stdout>"
+{
+       YYCTYPE yych;
+       if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy53;
+       default:        goto yy52;
+       }
+yy52:
+yy53:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy54;
+       default:        goto yy52;
+       }
+yy54:
+       ++YYCURSOR;
+       switch ((yych = *YYCURSOR)) {
+       case 'a':       goto yy56;
+       default:        goto yy55;
+       }
+yy55:
+#line 42 "repeater2.re"
+       {}
+#line 254 "<stdout>"
+yy56:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy57;
+       default:        goto yy55;
+       }
+yy57:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy58;
+       default:        goto yy55;
+       }
+yy58:
+       ++YYCURSOR;
+       yych = *YYCURSOR;
+       goto yy55;
+}
+#line 43 "repeater2.re"
+
+
+
+#line 276 "<stdout>"
+{
+       YYCTYPE yych;
+       if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy62;
+       default:        goto yy61;
+       }
+yy61:
+yy62:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy63;
+       default:        goto yy61;
+       }
+yy63:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy64;
+       default:        goto yy61;
+       }
+yy64:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy65;
+       default:        goto yy61;
+       }
+yy65:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy66;
+       default:        goto yy61;
+       }
+yy66:
+       ++YYCURSOR;
+#line 46 "repeater2.re"
+       {}
+#line 314 "<stdout>"
+}
+#line 47 "repeater2.re"
+
+
+
+#line 320 "<stdout>"
+{
+       YYCTYPE yych;
+       if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy71;
+       default:        goto yy70;
+       }
+yy70:
+yy71:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy72;
+       default:        goto yy70;
+       }
+yy72:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy73;
+       default:        goto yy70;
+       }
+yy73:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy74;
+       default:        goto yy70;
+       }
+yy74:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'a':       goto yy75;
+       default:        goto yy70;
+       }
+yy75:
+       ++YYCURSOR;
+#line 50 "repeater2.re"
+       {}
+#line 358 "<stdout>"
+}
+#line 51 "repeater2.re"
+
diff --git a/re2c/test/repeater2.re b/re2c/test/repeater2.re
new file mode 100644 (file)
index 0000000..fd244bd
--- /dev/null
@@ -0,0 +1,51 @@
+/*!re2c
+       "a"{0} {}
+*/
+
+/*!re2c
+       "a"{1} {}
+*/
+
+/*!re2c
+       "a"{3} {}
+*/
+
+/*!re2c
+       "a"{0,} {}
+*/
+
+/*!re2c
+       "a"{1,} {}
+*/
+
+/*!re2c
+       "a"{3,} {}
+*/
+
+/*!re2c
+       "a"{0,0} {}
+*/
+
+/*!re2c
+       "a"{0,1} {}
+*/
+
+/*!re2c
+       "a"{1,0} {}
+*/
+
+/*!re2c
+       "a"{1,1} {}
+*/
+
+/*!re2c
+       "a"{2,5} {}
+*/
+
+/*!re2c
+       "a"{5,2} {}
+*/
+
+/*!re2c
+       "a"{5,5} {}
+*/
diff --git a/re2c/test/repeater_overflow.c b/re2c/test/repeater_overflow.c
new file mode 100644 (file)
index 0000000..026ef26
--- /dev/null
@@ -0,0 +1 @@
+re2c: error: line 2, column 5: repetition count overflow
diff --git a/re2c/test/repeater_overflow.re b/re2c/test/repeater_overflow.re
new file mode 100644 (file)
index 0000000..6b8d6fc
--- /dev/null
@@ -0,0 +1,3 @@
+/*!re2c
+       "a"{12345678901} {}
+*/