]> granicus.if.org Git - re2c/commitdiff
Parse configuration strings in the same way as character strings and classes.
authorUlya Trofimovich <skvadrik@gmail.com>
Sun, 23 Aug 2015 10:34:13 +0000 (11:34 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Sun, 23 Aug 2015 10:34:13 +0000 (11:34 +0100)
re2c allows configuration strings to contain escape sequencs as long
as the escaped code points fit into 1-byte range.

Finally both 'Scanner::unescape' functions can be removed along with
a whole bunch of [-Wsign-conversion] warnings. :)

re2c/Makefile.am
re2c/bootstrap/src/parse/scanner_lex.cc
re2c/src/ir/regexp/regexp.cc
re2c/src/parse/parser.ypp
re2c/src/parse/scanner.h
re2c/src/parse/scanner_lex.re
re2c/src/parse/unescape.cc
re2c/src/util/substr.h [deleted file]
re2c/test/condition_01a.c.c

index a561c74d87c5b0a27632544cc483e837ceccfe2b..347d0e90cf41202bcdb8227aa3919625165dfcd3 100644 (file)
@@ -67,7 +67,6 @@ SRC_HDR = \
        src/util/s_to_n32_unsafe.h \
        src/util/smart_ptr.h \
        src/util/static_assert.h \
-       src/util/substr.h \
        src/util/u32lim.h \
        src/util/uniq_vector.h \
        src/util/wrap_iterator.h
index 2c0a351b925e71215fbc8af1b06cac34ceabf0c5..c3fe41757d526d206184ca9d205ead5663d2175e 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.14.3 on Sat Aug 22 15:45:34 2015 */
+/* Generated by re2c 0.14.3 on Sun Aug 23 10:47:18 2015 */
 #line 1 "../src/parse/scanner_lex.re"
 #include <stdlib.h>
 #include <string.h>
@@ -32,7 +32,7 @@ namespace re2c
 #line 32 "../src/parse/scanner_lex.re"
 
 
-#line 53 "../src/parse/scanner_lex.re"
+#line 56 "../src/parse/scanner_lex.re"
 
 
 Scanner::ParseMode Scanner::echo()
@@ -107,7 +107,7 @@ echo:
                }
        }
        ++YYCURSOR;
-#line 196 "../src/parse/scanner_lex.re"
+#line 199 "../src/parse/scanner_lex.re"
        {
                                        if (!(ignore_eoc || DFlag || flag_skeleton))
                                        {
@@ -123,7 +123,7 @@ echo:
 yy4:
        ++YYCURSOR;
 yy5:
-#line 207 "../src/parse/scanner_lex.re"
+#line 210 "../src/parse/scanner_lex.re"
        {
                                        goto echo;
                                }
@@ -136,7 +136,7 @@ yy6:
        }
        if (yych == '#') goto yy91;
 yy7:
-#line 183 "../src/parse/scanner_lex.re"
+#line 186 "../src/parse/scanner_lex.re"
        {
                                        if (ignore_eoc)
                                        {
@@ -234,7 +234,7 @@ yy21:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych != 'c') goto yy12;
        ++YYCURSOR;
-#line 84 "../src/parse/scanner_lex.re"
+#line 87 "../src/parse/scanner_lex.re"
        {
                                        if (rFlag)
                                        {
@@ -253,7 +253,7 @@ yy31:
        if (yych != 'c') goto yy12;
 yy32:
        ++YYCURSOR;
-#line 69 "../src/parse/scanner_lex.re"
+#line 72 "../src/parse/scanner_lex.re"
        {
                                        if (rFlag)
                                        {
@@ -284,7 +284,7 @@ yy34:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych != 'c') goto yy12;
        ++YYCURSOR;
-#line 96 "../src/parse/scanner_lex.re"
+#line 99 "../src/parse/scanner_lex.re"
        {
                                        if (!rFlag)
                                        {
@@ -314,7 +314,7 @@ yy42:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych != 'c') goto yy12;
        ++YYCURSOR;
-#line 110 "../src/parse/scanner_lex.re"
+#line 113 "../src/parse/scanner_lex.re"
        {
                                        if (!DFlag)
                                        {
@@ -349,7 +349,7 @@ yy50:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych != 'c') goto yy12;
        ++YYCURSOR;
-#line 119 "../src/parse/scanner_lex.re"
+#line 122 "../src/parse/scanner_lex.re"
        {
                                        tok = pos = cur;
                                        out.insert_state_goto (topIndent);
@@ -377,7 +377,7 @@ yy63:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych != 'c') goto yy12;
        ++YYCURSOR;
-#line 125 "../src/parse/scanner_lex.re"
+#line 128 "../src/parse/scanner_lex.re"
        {
                                        tok = pos = cur;
                                        ignore_eoc = true;
@@ -402,7 +402,7 @@ yy74:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych != 'c') goto yy12;
        ++YYCURSOR;
-#line 130 "../src/parse/scanner_lex.re"
+#line 133 "../src/parse/scanner_lex.re"
        {
                                        tok = pos = cur;
                                        ignore_eoc = true;
@@ -423,7 +423,7 @@ yy84:
        if (yych == '\n') goto yy87;
        if (yych == '\r') goto yy86;
 yy85:
-#line 161 "../src/parse/scanner_lex.re"
+#line 164 "../src/parse/scanner_lex.re"
        {
                                        if (ignore_eoc)
                                        {
@@ -448,7 +448,7 @@ yy86:
        if (yych != '\n') goto yy12;
 yy87:
        ++YYCURSOR;
-#line 143 "../src/parse/scanner_lex.re"
+#line 146 "../src/parse/scanner_lex.re"
        {
                                        cline++;
                                        if (ignore_eoc)
@@ -542,7 +542,7 @@ yy101:
 yy103:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 179 "../src/parse/scanner_lex.re"
+#line 182 "../src/parse/scanner_lex.re"
        {
                                        set_sourceline ();
                                        goto echo;
@@ -572,7 +572,7 @@ yy109:
        if (yych == '\r') goto yy105;
        goto yy12;
 }
-#line 210 "../src/parse/scanner_lex.re"
+#line 213 "../src/parse/scanner_lex.re"
 
 }
 
@@ -580,9 +580,6 @@ int Scanner::scan()
 {
        uint32_t depth;
 
-       char quote;
-       bool negated_class = false;
-       std::vector<uint32_t> cpoints;
 scan:
        tchar = cur - pos;
        tline = cline;
@@ -596,7 +593,7 @@ scan:
 
 start:
 
-#line 600 "src/parse/scanner_lex.cc"
+#line 597 "src/parse/scanner_lex.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
@@ -656,16 +653,16 @@ start:
                                        if (yych >= '%') goto yy121;
                                } else {
                                        if (yych <= '&') goto yy112;
-                                       if (yych <= '\'') goto yy119;
-                                       goto yy122;
+                                       if (yych <= '\'') goto yy122;
+                                       goto yy124;
                                }
                        } else {
                                if (yych <= '+') {
-                                       if (yych <= '*') goto yy124;
-                                       goto yy126;
+                                       if (yych <= '*') goto yy126;
+                                       goto yy128;
                                } else {
-                                       if (yych <= ',') goto yy122;
-                                       if (yych >= '.') goto yy128;
+                                       if (yych <= ',') goto yy124;
+                                       if (yych >= '.') goto yy130;
                                }
                        }
                }
@@ -673,37 +670,37 @@ start:
                if (yych <= '[') {
                        if (yych <= '<') {
                                if (yych <= '9') {
-                                       if (yych <= '/') goto yy130;
-                                       goto yy131;
-                               } else {
-                                       if (yych <= ':') goto yy132;
-                                       if (yych <= ';') goto yy122;
+                                       if (yych <= '/') goto yy132;
                                        goto yy133;
+                               } else {
+                                       if (yych <= ':') goto yy134;
+                                       if (yych <= ';') goto yy124;
+                                       goto yy135;
                                }
                        } else {
                                if (yych <= '?') {
-                                       if (yych <= '>') goto yy122;
-                                       goto yy126;
+                                       if (yych <= '>') goto yy124;
+                                       goto yy128;
                                } else {
                                        if (yych <= '@') goto yy112;
-                                       if (yych <= 'Z') goto yy131;
-                                       goto yy134;
+                                       if (yych <= 'Z') goto yy133;
+                                       goto yy136;
                                }
                        }
                } else {
                        if (yych <= 'q') {
                                if (yych <= '^') {
-                                       if (yych <= '\\') goto yy122;
+                                       if (yych <= '\\') goto yy124;
                                } else {
-                                       if (yych != '`') goto yy131;
+                                       if (yych != '`') goto yy133;
                                }
                        } else {
                                if (yych <= 'z') {
-                                       if (yych <= 'r') goto yy136;
-                                       goto yy131;
+                                       if (yych <= 'r') goto yy138;
+                                       goto yy133;
                                } else {
-                                       if (yych <= '{') goto yy137;
-                                       if (yych <= '|') goto yy122;
+                                       if (yych <= '{') goto yy139;
+                                       if (yych <= '|') goto yy124;
                                }
                        }
                }
@@ -711,197 +708,217 @@ start:
 yy112:
        ++YYCURSOR;
 yy113:
-#line 383 "../src/parse/scanner_lex.re"
+#line 409 "../src/parse/scanner_lex.re"
        {
                                        fatalf("unexpected character: '%c'", *tok);
                                        goto scan;
                                }
-#line 720 "src/parse/scanner_lex.cc"
+#line 717 "src/parse/scanner_lex.cc"
 yy114:
        ++YYCURSOR;
        yych = (YYCTYPE)*YYCURSOR;
-       goto yy218;
+       goto yy220;
 yy115:
-#line 367 "../src/parse/scanner_lex.re"
+#line 393 "../src/parse/scanner_lex.re"
        {
                                        goto scan;
                                }
-#line 730 "src/parse/scanner_lex.cc"
+#line 727 "src/parse/scanner_lex.cc"
 yy116:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy196;
+               if (yych == '\t') goto yy198;
        } else {
-               if (yych <= ' ') goto yy196;
-               if (yych == '#') goto yy198;
+               if (yych <= ' ') goto yy198;
+               if (yych == '#') goto yy200;
        }
 yy117:
-#line 376 "../src/parse/scanner_lex.re"
+#line 402 "../src/parse/scanner_lex.re"
        {
                                        if (cur == eof) return 0;
                                        pos = cur;
                                        cline++;
                                        goto scan;
                                }
-#line 748 "src/parse/scanner_lex.cc"
+#line 745 "src/parse/scanner_lex.cc"
 yy118:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy195;
+       if (yych == '\n') goto yy197;
        goto yy113;
 yy119:
        ++YYCURSOR;
-#line 262 "../src/parse/scanner_lex.re"
-       { quote = tok[0];                    goto cpoints; }
-#line 757 "src/parse/scanner_lex.cc"
+#line 270 "../src/parse/scanner_lex.re"
+       {
+               std::vector<uint32_t> cpoints;
+               lex_cpoints ('"', cpoints);
+               yylval.regexp = cpoint_string (cpoints, bCaseInsensitive || bCaseInverted);
+               return REGEXP;
+       }
+#line 759 "src/parse/scanner_lex.cc"
 yy121:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '}') goto yy193;
+       if (yych == '}') goto yy195;
        goto yy113;
 yy122:
        ++YYCURSOR;
-yy123:
-#line 272 "../src/parse/scanner_lex.re"
+#line 263 "../src/parse/scanner_lex.re"
+       {
+               std::vector<uint32_t> cpoints;
+               lex_cpoints ('\'', cpoints);
+               yylval.regexp = cpoint_string (cpoints, bCaseInsensitive || !bCaseInverted);
+               return REGEXP;
+       }
+#line 773 "src/parse/scanner_lex.cc"
+yy124:
+       ++YYCURSOR;
+yy125:
+#line 297 "../src/parse/scanner_lex.re"
        {
                                        return *tok;
                                }
-#line 769 "src/parse/scanner_lex.cc"
-yy124:
+#line 781 "src/parse/scanner_lex.cc"
+yy126:
        ++YYCURSOR;
-       if ((yych = (YYCTYPE)*YYCURSOR) == '/') goto yy193;
-#line 276 "../src/parse/scanner_lex.re"
+       if ((yych = (YYCTYPE)*YYCURSOR) == '/') goto yy195;
+#line 301 "../src/parse/scanner_lex.re"
        {
                                        yylval.op = *tok;
                                        return STAR;
                                }
-#line 778 "src/parse/scanner_lex.cc"
-yy126:
+#line 790 "src/parse/scanner_lex.cc"
+yy128:
        ++YYCURSOR;
-#line 280 "../src/parse/scanner_lex.re"
+#line 305 "../src/parse/scanner_lex.re"
        {
                                        yylval.op = *tok;
                                        return CLOSE;
                                }
-#line 786 "src/parse/scanner_lex.cc"
-yy128:
+#line 798 "src/parse/scanner_lex.cc"
+yy130:
        ++YYCURSOR;
-#line 362 "../src/parse/scanner_lex.re"
+#line 388 "../src/parse/scanner_lex.re"
        {
                                        yylval.regexp = mkDot();
-                                       return RANGE;
+                                       return REGEXP;
                                }
-#line 794 "src/parse/scanner_lex.cc"
-yy130:
+#line 806 "src/parse/scanner_lex.cc"
+yy132:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '*') goto yy189;
-       if (yych == '/') goto yy191;
-       goto yy123;
-yy131:
+       if (yych == '*') goto yy191;
+       if (yych == '/') goto yy193;
+       goto yy125;
+yy133:
        YYCTXMARKER = YYCURSOR + 1;
        yych = (YYCTYPE)*++YYCURSOR;
-       goto yy163;
-yy132:
+       goto yy165;
+yy134:
        YYCTXMARKER = YYCURSOR + 1;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '=') goto yy185;
+       if (yych == '=') goto yy187;
        goto yy113;
-yy133:
+yy135:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == '!') goto yy176;
-       if (yych == '>') goto yy178;
-       goto yy123;
-yy134:
-       ++YYCURSOR;
-       if ((yych = (YYCTYPE)*YYCURSOR) == '^') goto yy174;
-#line 263 "../src/parse/scanner_lex.re"
-       { quote = ']';                       goto cpoints; }
-#line 820 "src/parse/scanner_lex.cc"
+       if (yych == '!') goto yy178;
+       if (yych == '>') goto yy180;
+       goto yy125;
 yy136:
+       ++YYCURSOR;
+       if ((yych = (YYCTYPE)*YYCURSOR) == '^') goto yy176;
+#line 277 "../src/parse/scanner_lex.re"
+       {
+               std::vector<uint32_t> cpoints;
+               lex_cpoints (']', cpoints);
+               yylval.regexp = cpoint_class (cpoints, false);
+               return REGEXP;
+       }
+#line 837 "src/parse/scanner_lex.cc"
+yy138:
        YYCTXMARKER = YYCURSOR + 1;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy164;
-       goto yy163;
-yy137:
+       if (yych == 'e') goto yy166;
+       goto yy165;
+yy139:
        yyaccept = 2;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yybm[0+yych] & 16) {
-               goto yy139;
+               goto yy141;
        }
        if (yych <= 'Z') {
-               if (yych == ',') goto yy144;
-               if (yych >= 'A') goto yy142;
+               if (yych == ',') goto yy146;
+               if (yych >= 'A') goto yy144;
        } else {
                if (yych <= '_') {
-                       if (yych >= '_') goto yy142;
+                       if (yych >= '_') goto yy144;
                } else {
-                       if (yych <= '`') goto yy138;
-                       if (yych <= 'z') goto yy142;
+                       if (yych <= '`') goto yy140;
+                       if (yych <= 'z') goto yy144;
                }
        }
-yy138:
+yy140:
 #line 233 "../src/parse/scanner_lex.re"
        {
                                        depth = 1;
                                        goto code;
                                }
-#line 849 "src/parse/scanner_lex.cc"
-yy139:
+#line 866 "src/parse/scanner_lex.cc"
+yy141:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 16) {
-               goto yy139;
+               goto yy141;
        }
        if (yych <= '^') {
                if (yych <= ',') {
-                       if (yych >= ',') goto yy150;
+                       if (yych >= ',') goto yy152;
                } else {
-                       if (yych <= '@') goto yy141;
-                       if (yych <= 'Z') goto yy142;
+                       if (yych <= '@') goto yy143;
+                       if (yych <= 'Z') goto yy144;
                }
        } else {
                if (yych <= 'z') {
-                       if (yych != '`') goto yy142;
+                       if (yych != '`') goto yy144;
                } else {
-                       if (yych == '}') goto yy148;
+                       if (yych == '}') goto yy150;
                }
        }
-yy141:
+yy143:
        YYCURSOR = YYMARKER;
        if (yyaccept <= 1) {
                if (yyaccept == 0) {
                        goto yy117;
                } else {
-                       goto yy123;
+                       goto yy125;
                }
        } else {
                if (yyaccept == 2) {
-                       goto yy138;
+                       goto yy140;
                } else {
-                       goto yy145;
+                       goto yy147;
                }
        }
-yy142:
+yy144:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 32) {
-               goto yy142;
+               goto yy144;
        }
-       if (yych == '}') goto yy146;
-       goto yy141;
-yy144:
+       if (yych == '}') goto yy148;
+       goto yy143;
+yy146:
        ++YYCURSOR;
-yy145:
-#line 316 "../src/parse/scanner_lex.re"
+yy147:
+#line 341 "../src/parse/scanner_lex.re"
        {
                                        fatal("illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers");
                                }
-#line 902 "src/parse/scanner_lex.cc"
-yy146:
+#line 919 "src/parse/scanner_lex.cc"
+yy148:
        ++YYCURSOR;
-#line 320 "../src/parse/scanner_lex.re"
+#line 345 "../src/parse/scanner_lex.re"
        {
                                        if (!FFlag) {
                                                fatal("curly braces for names only allowed with -F switch");
@@ -909,10 +926,10 @@ yy146:
                                        yylval.str = new std::string (tok + 1, tok_len () - 2); // -2 to omit braces
                                        return ID;
                                }
-#line 913 "src/parse/scanner_lex.cc"
-yy148:
+#line 930 "src/parse/scanner_lex.cc"
+yy150:
        ++YYCURSOR;
-#line 285 "../src/parse/scanner_lex.re"
+#line 310 "../src/parse/scanner_lex.re"
        {
                                        if (!s_to_u32_unsafe (tok + 1, cur - 1, yylval.extop.min))
                                        {
@@ -921,15 +938,15 @@ yy148:
                                        yylval.extop.max = yylval.extop.min;
                                        return CLOSESIZE;
                                }
-#line 925 "src/parse/scanner_lex.cc"
-yy150:
+#line 942 "src/parse/scanner_lex.cc"
+yy152:
        yyaccept = 3;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= '/') goto yy145;
-       if (yych <= '9') goto yy153;
-       if (yych != '}') goto yy145;
+       if (yych <= '/') goto yy147;
+       if (yych <= '9') goto yy155;
+       if (yych != '}') goto yy147;
        ++YYCURSOR;
-#line 307 "../src/parse/scanner_lex.re"
+#line 332 "../src/parse/scanner_lex.re"
        {
                                        if (!s_to_u32_unsafe (tok + 1, cur - 2, yylval.extop.min))
                                        {
@@ -938,16 +955,16 @@ yy150:
                                        yylval.extop.max = UINT32_MAX;
                                        return CLOSESIZE;
                                }
-#line 942 "src/parse/scanner_lex.cc"
-yy153:
+#line 959 "src/parse/scanner_lex.cc"
+yy155:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= '/') goto yy141;
-       if (yych <= '9') goto yy153;
-       if (yych != '}') goto yy141;
+       if (yych <= '/') goto yy143;
+       if (yych <= '9') goto yy155;
+       if (yych != '}') goto yy143;
        ++YYCURSOR;
-#line 294 "../src/parse/scanner_lex.re"
+#line 319 "../src/parse/scanner_lex.re"
        {
                                        const char * p = strchr (tok, ',');
                                        if (!s_to_u32_unsafe (tok + 1, p, yylval.extop.min))
@@ -960,89 +977,90 @@ yy153:
                                        }
                                        return CLOSESIZE;
                                }
-#line 964 "src/parse/scanner_lex.cc"
-yy157:
+#line 981 "src/parse/scanner_lex.cc"
+yy159:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 348 "../src/parse/scanner_lex.re"
+#line 373 "../src/parse/scanner_lex.re"
        {
                                        if (!FFlag) {
                                                yylval.str = new std::string (tok, tok_len ());
                                                return ID;
                                        } else {
+                                               std::vector<uint32_t> cpoints;
                                                for (char * p = tok; p < cur; ++p)
                                                {
                                                        cpoints.push_back (static_cast<uint8_t> (*p));
                                                }
                                                yylval.regexp = cpoint_string (cpoints, bCaseInsensitive || bCaseInverted);
-                                               return STRING;
+                                               return REGEXP;
                                        }
                                }
-#line 982 "src/parse/scanner_lex.cc"
-yy159:
+#line 1000 "src/parse/scanner_lex.cc"
+yy161:
        yych = (YYCTYPE)*++YYCURSOR;
-       goto yy172;
-yy160:
+       goto yy174;
+yy162:
        ++YYCURSOR;
-yy161:
+yy163:
        YYCURSOR = YYCTXMARKER;
-#line 343 "../src/parse/scanner_lex.re"
+#line 368 "../src/parse/scanner_lex.re"
        {
                                        yylval.str = new std::string (tok, tok_len ());
                                        return ID;
                                }
-#line 995 "src/parse/scanner_lex.cc"
-yy162:
+#line 1013 "src/parse/scanner_lex.cc"
+yy164:
        YYCTXMARKER = YYCURSOR + 1;
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
-yy163:
+yy165:
        if (yych <= '9') {
                if (yych <= ' ') {
-                       if (yych == '\t') goto yy159;
-                       if (yych <= 0x1F) goto yy157;
-                       goto yy159;
+                       if (yych == '\t') goto yy161;
+                       if (yych <= 0x1F) goto yy159;
+                       goto yy161;
                } else {
-                       if (yych == ',') goto yy160;
-                       if (yych <= '/') goto yy157;
-                       goto yy162;
+                       if (yych == ',') goto yy162;
+                       if (yych <= '/') goto yy159;
+                       goto yy164;
                }
        } else {
                if (yych <= 'Z') {
-                       if (yych <= '<') goto yy157;
-                       if (yych <= '>') goto yy160;
-                       if (yych <= '@') goto yy157;
-                       goto yy162;
+                       if (yych <= '<') goto yy159;
+                       if (yych <= '>') goto yy162;
+                       if (yych <= '@') goto yy159;
+                       goto yy164;
                } else {
                        if (yych <= '_') {
-                               if (yych <= '^') goto yy157;
-                               goto yy162;
+                               if (yych <= '^') goto yy159;
+                               goto yy164;
                        } else {
-                               if (yych <= '`') goto yy157;
-                               if (yych <= 'z') goto yy162;
-                               goto yy157;
+                               if (yych <= '`') goto yy159;
+                               if (yych <= 'z') goto yy164;
+                               goto yy159;
                        }
                }
        }
-yy164:
+yy166:
        YYCTXMARKER = YYCURSOR + 1;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != '2') goto yy163;
+       if (yych != '2') goto yy165;
        YYCTXMARKER = YYCURSOR + 1;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'c') goto yy163;
+       if (yych != 'c') goto yy165;
        YYCTXMARKER = YYCURSOR + 1;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != ':') goto yy163;
+       if (yych != ':') goto yy165;
        ++YYCURSOR;
-#line 328 "../src/parse/scanner_lex.re"
+#line 353 "../src/parse/scanner_lex.re"
        { goto conf; }
-#line 1042 "src/parse/scanner_lex.cc"
-yy169:
+#line 1060 "src/parse/scanner_lex.cc"
+yy171:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 330 "../src/parse/scanner_lex.re"
+#line 355 "../src/parse/scanner_lex.re"
        {
                                        yylval.str = new std::string (tok, tok_len ());
                                        if (FFlag)
@@ -1055,719 +1073,428 @@ yy169:
                                                return ID;
                                        }
                                }
-#line 1059 "src/parse/scanner_lex.cc"
-yy171:
+#line 1077 "src/parse/scanner_lex.cc"
+yy173:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy172:
+yy174:
        if (yybm[0+yych] & 64) {
-               goto yy171;
+               goto yy173;
        }
-       if (yych == ',') goto yy173;
-       if (yych <= '<') goto yy169;
-       if (yych >= '?') goto yy169;
-yy173:
+       if (yych == ',') goto yy175;
+       if (yych <= '<') goto yy171;
+       if (yych >= '?') goto yy171;
+yy175:
        yych = (YYCTYPE)*++YYCURSOR;
-       goto yy161;
-yy174:
-       ++YYCURSOR;
-#line 264 "../src/parse/scanner_lex.re"
-       { quote = ']'; negated_class = true; goto cpoints; }
-#line 1078 "src/parse/scanner_lex.cc"
+       goto yy163;
 yy176:
        ++YYCURSOR;
-#line 269 "../src/parse/scanner_lex.re"
+#line 284 "../src/parse/scanner_lex.re"
+       {
+               std::vector<uint32_t> cpoints;
+               lex_cpoints (']', cpoints);
+               yylval.regexp = cpoint_class (cpoints, true);
+               return REGEXP;
+       }
+#line 1101 "src/parse/scanner_lex.cc"
+yy178:
+       ++YYCURSOR;
+#line 294 "../src/parse/scanner_lex.re"
        {
                                        return SETUP;
                                }
-#line 1085 "src/parse/scanner_lex.cc"
-yy178:
+#line 1108 "src/parse/scanner_lex.cc"
+yy180:
        YYCTXMARKER = YYCURSOR + 1;
        yych = (YYCTYPE)*++YYCURSOR;
-       goto yy180;
-yy179:
+       goto yy182;
+yy181:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
-yy180:
+yy182:
        if (yych <= '9') {
                if (yych <= '\t') {
-                       if (yych <= 0x08) goto yy141;
-                       goto yy179;
+                       if (yych <= 0x08) goto yy143;
+                       goto yy181;
                } else {
-                       if (yych == ' ') goto yy179;
-                       goto yy141;
+                       if (yych == ' ') goto yy181;
+                       goto yy143;
                }
        } else {
                if (yych <= '=') {
-                       if (yych <= ':') goto yy184;
-                       if (yych <= '<') goto yy141;
-                       goto yy183;
+                       if (yych <= ':') goto yy186;
+                       if (yych <= '<') goto yy143;
+                       goto yy185;
                } else {
-                       if (yych != '{') goto yy141;
+                       if (yych != '{') goto yy143;
                }
        }
-yy181:
+yy183:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 266 "../src/parse/scanner_lex.re"
+#line 291 "../src/parse/scanner_lex.re"
        {
                                        return NOCOND;
                                }
-#line 1119 "src/parse/scanner_lex.cc"
-yy183:
+#line 1142 "src/parse/scanner_lex.cc"
+yy185:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '>') goto yy181;
-       goto yy141;
-yy184:
+       if (yych == '>') goto yy183;
+       goto yy143;
+yy186:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '=') goto yy181;
-       goto yy141;
-yy185:
+       if (yych == '=') goto yy183;
+       goto yy143;
+yy187:
        ++YYCURSOR;
-       if ((yych = (YYCTYPE)*YYCURSOR) == '>') goto yy187;
+       if ((yych = (YYCTYPE)*YYCURSOR) == '>') goto yy189;
 #line 242 "../src/parse/scanner_lex.re"
        {
                                        tok += 2; /* skip ":=" */
                                        depth = 0;
                                        goto code;
                                }
-#line 1137 "src/parse/scanner_lex.cc"
-yy187:
+#line 1160 "src/parse/scanner_lex.cc"
+yy189:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
 #line 238 "../src/parse/scanner_lex.re"
        {
                                        return *tok;
                                }
-#line 1145 "src/parse/scanner_lex.cc"
-yy189:
+#line 1168 "src/parse/scanner_lex.cc"
+yy191:
        ++YYCURSOR;
 #line 251 "../src/parse/scanner_lex.re"
        {
                                        depth = 1;
                                        goto comment;
                                }
-#line 1153 "src/parse/scanner_lex.cc"
-yy191:
+#line 1176 "src/parse/scanner_lex.cc"
+yy193:
        ++YYCURSOR;
 #line 248 "../src/parse/scanner_lex.re"
        {
                                goto nextLine;
                        }
-#line 1160 "src/parse/scanner_lex.cc"
-yy193:
+#line 1183 "src/parse/scanner_lex.cc"
+yy195:
        ++YYCURSOR;
 #line 257 "../src/parse/scanner_lex.re"
        {
                                        tok = cur;
                                        return 0;
                                }
-#line 1168 "src/parse/scanner_lex.cc"
-yy195:
+#line 1191 "src/parse/scanner_lex.cc"
+yy197:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= 0x1F) {
                if (yych != '\t') goto yy117;
        } else {
-               if (yych <= ' ') goto yy196;
-               if (yych == '#') goto yy198;
+               if (yych <= ' ') goto yy198;
+               if (yych == '#') goto yy200;
                goto yy117;
        }
-yy196:
+yy198:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy196;
-               goto yy141;
+               if (yych == '\t') goto yy198;
+               goto yy143;
        } else {
-               if (yych <= ' ') goto yy196;
-               if (yych != '#') goto yy141;
+               if (yych <= ' ') goto yy198;
+               if (yych != '#') goto yy143;
        }
-yy198:
+yy200:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy198;
-               goto yy141;
+               if (yych == '\t') goto yy200;
+               goto yy143;
        } else {
-               if (yych <= ' ') goto yy198;
-               if (yych != 'l') goto yy141;
+               if (yych <= ' ') goto yy200;
+               if (yych != 'l') goto yy143;
        }
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy141;
+       if (yych != 'i') goto yy143;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy141;
+       if (yych != 'n') goto yy143;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy141;
+       if (yych != 'e') goto yy143;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '0') goto yy205;
-       if (yych <= '9') goto yy141;
-       goto yy205;
-yy204:
+       if (yych <= '0') goto yy207;
+       if (yych <= '9') goto yy143;
+       goto yy207;
+yy206:
        YYCTXMARKER = YYCURSOR + 1;
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy205:
+yy207:
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy204;
-               goto yy141;
+               if (yych == '\t') goto yy206;
+               goto yy143;
        } else {
-               if (yych <= ' ') goto yy204;
-               if (yych <= '0') goto yy141;
-               if (yych >= ':') goto yy141;
+               if (yych <= ' ') goto yy206;
+               if (yych <= '0') goto yy143;
+               if (yych >= ':') goto yy143;
        }
-yy206:
+yy208:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '\r') {
                if (yych <= '\t') {
-                       if (yych <= 0x08) goto yy141;
+                       if (yych <= 0x08) goto yy143;
                } else {
-                       if (yych <= '\n') goto yy210;
-                       if (yych <= '\f') goto yy141;
-                       goto yy212;
+                       if (yych <= '\n') goto yy212;
+                       if (yych <= '\f') goto yy143;
+                       goto yy214;
                }
        } else {
                if (yych <= ' ') {
-                       if (yych <= 0x1F) goto yy141;
+                       if (yych <= 0x1F) goto yy143;
                } else {
-                       if (yych <= '/') goto yy141;
-                       if (yych <= '9') goto yy206;
-                       goto yy141;
+                       if (yych <= '/') goto yy143;
+                       if (yych <= '9') goto yy208;
+                       goto yy143;
                }
        }
-yy208:
+yy210:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy208;
-               goto yy141;
+               if (yych == '\t') goto yy210;
+               goto yy143;
        } else {
-               if (yych <= ' ') goto yy208;
-               if (yych == '"') goto yy213;
-               goto yy141;
+               if (yych <= ' ') goto yy210;
+               if (yych == '"') goto yy215;
+               goto yy143;
        }
-yy210:
+yy212:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 371 "../src/parse/scanner_lex.re"
+#line 397 "../src/parse/scanner_lex.re"
        {
                                        set_sourceline ();
                                        goto scan;
                                }
-#line 1266 "src/parse/scanner_lex.cc"
-yy212:
+#line 1289 "src/parse/scanner_lex.cc"
+yy214:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy210;
-       goto yy141;
-yy213:
+       if (yych == '\n') goto yy212;
+       goto yy143;
+yy215:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy213;
+               goto yy215;
        }
-       if (yych <= '\n') goto yy141;
-       if (yych <= '"') goto yy216;
+       if (yych <= '\n') goto yy143;
+       if (yych <= '"') goto yy218;
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy141;
-       goto yy213;
-yy216:
+       if (yych == '\n') goto yy143;
+       goto yy215;
+yy218:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy210;
-       if (yych == '\r') goto yy212;
-       goto yy141;
-yy217:
+       if (yych == '\n') goto yy212;
+       if (yych == '\r') goto yy214;
+       goto yy143;
+yy219:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy218:
-       if (yych == '\t') goto yy217;
-       if (yych == ' ') goto yy217;
+yy220:
+       if (yych == '\t') goto yy219;
+       if (yych == ' ') goto yy219;
        goto yy115;
 }
-#line 387 "../src/parse/scanner_lex.re"
+#line 413 "../src/parse/scanner_lex.re"
 
 
 flex_name:
 
-#line 1304 "src/parse/scanner_lex.cc"
+#line 1327 "src/parse/scanner_lex.cc"
 {
        YYCTYPE yych;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy223;
-       if (yych == '\r') goto yy225;
+       if (yych == '\n') goto yy225;
+       if (yych == '\r') goto yy227;
        ++YYCURSOR;
-yy222:
-#line 398 "../src/parse/scanner_lex.re"
+yy224:
+#line 424 "../src/parse/scanner_lex.re"
        {
                YYCURSOR = tok;
                goto start;
        }
-#line 1318 "src/parse/scanner_lex.cc"
-yy223:
+#line 1341 "src/parse/scanner_lex.cc"
+yy225:
        ++YYCURSOR;
-yy224:
-#line 392 "../src/parse/scanner_lex.re"
+yy226:
+#line 418 "../src/parse/scanner_lex.re"
        {
                YYCURSOR = tok;
                lexer_state = LEX_NORMAL;
                return FID_END;
        }
-#line 1328 "src/parse/scanner_lex.cc"
-yy225:
+#line 1351 "src/parse/scanner_lex.cc"
+yy227:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != '\n') goto yy222;
+       if (yych != '\n') goto yy224;
        ++YYCURSOR;
        yych = (YYCTYPE)*YYCURSOR;
-       goto yy224;
+       goto yy226;
 }
-#line 402 "../src/parse/scanner_lex.re"
+#line 428 "../src/parse/scanner_lex.re"
 
 
-cpoints:
-       tok = cur;
+code:
 
-#line 1342 "src/parse/scanner_lex.cc"
+#line 1364 "src/parse/scanner_lex.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
-       if ((YYLIMIT - YYCURSOR) < 10) YYFILL(10);
+       static const unsigned char yybm[] = {
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48, 112,   0,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+               112,  48,  16,  48,  48,  48,  48,  32, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+               176, 176, 176, 176, 176, 176, 176, 176, 
+               176, 176,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,   0,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+                48,  48,  48,  48,  48,  48,  48,  48, 
+       };
+       if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy231;
-       if (yych == '\\') goto yy233;
-       ++YYCURSOR;
-#line 426 "../src/parse/scanner_lex.re"
-       {
-               const char c = tok[0];
-               if (c == quote)
-               {
-                       switch (quote)
-                       {
-                               case ']':
-                                       yylval.regexp = cpoint_class (cpoints, negated_class);
-                                       return RANGE;
-                               case '\'':
-                                       yylval.regexp = cpoint_string (cpoints, bCaseInsensitive || !bCaseInverted);
-                                       return STRING;
-                               case '"':
-                                       yylval.regexp = cpoint_string (cpoints, bCaseInsensitive || bCaseInverted);
-                                       return STRING;
-                       }
+       if (yych <= '&') {
+               if (yych <= '\n') {
+                       if (yych <= 0x00) goto yy231;
+                       if (yych <= '\t') goto yy233;
+                       goto yy235;
+               } else {
+                       if (yych == '"') goto yy237;
+                       goto yy233;
                }
-               else
-               {
-                       cpoints.push_back (static_cast<uint8_t> (c));
-                       goto cpoints;
+       } else {
+               if (yych <= '{') {
+                       if (yych <= '\'') goto yy238;
+                       if (yych <= 'z') goto yy233;
+                       goto yy239;
+               } else {
+                       if (yych == '}') goto yy241;
+                       goto yy233;
                }
        }
-#line 1375 "src/parse/scanner_lex.cc"
 yy231:
        ++YYCURSOR;
-#line 407 "../src/parse/scanner_lex.re"
-       { fatal ((tok - pos) - tchar, "syntax error"); }
-#line 1380 "src/parse/scanner_lex.cc"
+#line 491 "../src/parse/scanner_lex.re"
+       {
+                                       if (cur == eof)
+                                       {
+                                               if (depth)
+                                               {
+                                                       fatal("missing '}'");
+                                               }
+                                               return 0;
+                                       }
+                                       goto code;
+                               }
+#line 1437 "src/parse/scanner_lex.cc"
 yy233:
        ++YYCURSOR;
-       if ((yych = (YYCTYPE)*YYCURSOR) <= 'b') {
-               if (yych <= 'T') {
-                       if (yych <= '/') {
-                               if (yych != '\n') goto yy235;
-                       } else {
-                               if (yych <= '3') goto yy237;
-                               if (yych <= '7') goto yy239;
-                               goto yy235;
-                       }
+yy234:
+#line 505 "../src/parse/scanner_lex.re"
+       {
+                                       goto code;
+                               }
+#line 1445 "src/parse/scanner_lex.cc"
+yy235:
+       YYCTXMARKER = YYCURSOR + 1;
+       yyaccept = 0;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= '\r') {
+               if (yych <= '\t') {
+                       if (yych >= '\t') goto yy252;
                } else {
-                       if (yych <= 'X') {
-                               if (yych <= 'U') goto yy240;
-                               if (yych <= 'W') goto yy235;
-                               goto yy242;
-                       } else {
-                               if (yych == '\\') goto yy243;
-                               if (yych <= '`') goto yy235;
-                               goto yy243;
-                       }
+                       if (yych <= '\n') goto yy254;
+                       if (yych >= '\r') goto yy254;
                }
        } else {
-               if (yych <= 'r') {
-                       if (yych <= 'm') {
-                               if (yych == 'f') goto yy243;
-                               goto yy235;
-                       } else {
-                               if (yych <= 'n') goto yy243;
-                               if (yych <= 'q') goto yy235;
-                               goto yy243;
-                       }
+               if (yych <= ' ') {
+                       if (yych >= ' ') goto yy252;
                } else {
-                       if (yych <= 'u') {
-                               if (yych <= 's') goto yy235;
-                               if (yych <= 't') goto yy243;
-                               goto yy242;
-                       } else {
-                               if (yych <= 'v') goto yy243;
-                               if (yych == 'x') goto yy245;
-                               goto yy235;
-                       }
+                       if (yych == '#') goto yy255;
                }
        }
-#line 410 "../src/parse/scanner_lex.re"
-       { fatal ((tok - pos) - tchar, "syntax error in escape sequence"); }
-#line 1427 "src/parse/scanner_lex.cc"
-yy235:
-       ++YYCURSOR;
-#line 416 "../src/parse/scanner_lex.re"
+yy236:
+#line 472 "../src/parse/scanner_lex.re"
        {
-               const char c = tok[1];
-               if (c != quote)
-               {
-                       warn.useless_escape (tline, tok - pos, c);
-               }
-               cpoints.push_back (static_cast<uint8_t> (c));
-               goto cpoints;
-       }
-#line 1440 "src/parse/scanner_lex.cc"
+                                       if (depth == 0)
+                                       {
+                                               tok += strspn(tok, " \t\r\n");
+                                               while (cur > tok && strchr(" \t\r\n", cur[-1]))
+                                               {
+                                                       --cur;
+                                               }
+                                               yylval.code = new Code (tok, tok_len (), get_fname (), tline);
+                                               return CODE;
+                                       }
+                                       else if (cur == eof)
+                                       {
+                                               fatal("missing '}'");
+                                       }
+                                       pos = cur;
+                                       cline++;
+                                       goto code;
+                               }
+#line 1485 "src/parse/scanner_lex.cc"
 yy237:
-       yyaccept = 0;
-       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= '/') goto yy238;
-       if (yych <= '7') goto yy260;
-yy238:
-#line 409 "../src/parse/scanner_lex.re"
-       { fatal ((tok - pos) - tchar, "syntax error in octal escape sequence"); }
-#line 1449 "src/parse/scanner_lex.cc"
-yy239:
-       yych = (YYCTYPE)*++YYCURSOR;
-       goto yy238;
-yy240:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= '@') {
-               if (yych <= '/') goto yy241;
-               if (yych <= '9') goto yy253;
-       } else {
-               if (yych <= 'F') goto yy253;
-               if (yych <= '`') goto yy241;
-               if (yych <= 'f') goto yy253;
-       }
-yy241:
-#line 408 "../src/parse/scanner_lex.re"
-       { fatal ((tok - pos) - tchar, "syntax error in hexadecimal escape sequence"); }
-#line 1467 "src/parse/scanner_lex.cc"
-yy242:
+       if (yych == '\n') goto yy234;
+       goto yy250;
+yy238:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= '@') {
-               if (yych <= '/') goto yy241;
-               if (yych <= '9') goto yy250;
-               goto yy241;
-       } else {
-               if (yych <= 'F') goto yy250;
-               if (yych <= '`') goto yy241;
-               if (yych <= 'f') goto yy250;
-               goto yy241;
-       }
-yy243:
-       ++YYCURSOR;
-#line 414 "../src/parse/scanner_lex.re"
-       { cpoints.push_back (unesc_simple (tok));   goto cpoints; }
-#line 1485 "src/parse/scanner_lex.cc"
-yy245:
-       yyaccept = 1;
-       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= '@') {
-               if (yych <= '/') goto yy241;
-               if (yych >= ':') goto yy241;
-       } else {
-               if (yych <= 'F') goto yy246;
-               if (yych <= '`') goto yy241;
-               if (yych >= 'g') goto yy241;
-       }
-yy246:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '@') {
-               if (yych <= '/') goto yy247;
-               if (yych <= '9') goto yy248;
-       } else {
-               if (yych <= 'F') goto yy248;
-               if (yych <= '`') goto yy247;
-               if (yych <= 'f') goto yy248;
-       }
-yy247:
-       YYCURSOR = YYMARKER;
-       if (yyaccept == 0) {
-               goto yy238;
-       } else {
-               goto yy241;
-       }
-yy248:
-       ++YYCURSOR;
-#line 412 "../src/parse/scanner_lex.re"
-       { cpoints.push_back (unesc_hex (tok, cur)); goto cpoints; }
-#line 1518 "src/parse/scanner_lex.cc"
-yy250:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '@') {
-               if (yych <= '/') goto yy247;
-               if (yych >= ':') goto yy247;
-       } else {
-               if (yych <= 'F') goto yy251;
-               if (yych <= '`') goto yy247;
-               if (yych >= 'g') goto yy247;
-       }
-yy251:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '@') {
-               if (yych <= '/') goto yy247;
-               if (yych >= ':') goto yy247;
-       } else {
-               if (yych <= 'F') goto yy252;
-               if (yych <= '`') goto yy247;
-               if (yych >= 'g') goto yy247;
-       }
-yy252:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '@') {
-               if (yych <= '/') goto yy247;
-               if (yych <= '9') goto yy248;
-               goto yy247;
-       } else {
-               if (yych <= 'F') goto yy248;
-               if (yych <= '`') goto yy247;
-               if (yych <= 'f') goto yy248;
-               goto yy247;
-       }
-yy253:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '@') {
-               if (yych <= '/') goto yy247;
-               if (yych >= ':') goto yy247;
-       } else {
-               if (yych <= 'F') goto yy254;
-               if (yych <= '`') goto yy247;
-               if (yych >= 'g') goto yy247;
-       }
-yy254:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '@') {
-               if (yych <= '/') goto yy247;
-               if (yych >= ':') goto yy247;
-       } else {
-               if (yych <= 'F') goto yy255;
-               if (yych <= '`') goto yy247;
-               if (yych >= 'g') goto yy247;
-       }
-yy255:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '@') {
-               if (yych <= '/') goto yy247;
-               if (yych >= ':') goto yy247;
-       } else {
-               if (yych <= 'F') goto yy256;
-               if (yych <= '`') goto yy247;
-               if (yych >= 'g') goto yy247;
-       }
-yy256:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '@') {
-               if (yych <= '/') goto yy247;
-               if (yych >= ':') goto yy247;
-       } else {
-               if (yych <= 'F') goto yy257;
-               if (yych <= '`') goto yy247;
-               if (yych >= 'g') goto yy247;
-       }
-yy257:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '@') {
-               if (yych <= '/') goto yy247;
-               if (yych >= ':') goto yy247;
-       } else {
-               if (yych <= 'F') goto yy258;
-               if (yych <= '`') goto yy247;
-               if (yych >= 'g') goto yy247;
-       }
-yy258:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '@') {
-               if (yych <= '/') goto yy247;
-               if (yych >= ':') goto yy247;
-       } else {
-               if (yych <= 'F') goto yy259;
-               if (yych <= '`') goto yy247;
-               if (yych >= 'g') goto yy247;
-       }
-yy259:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '@') {
-               if (yych <= '/') goto yy247;
-               if (yych <= '9') goto yy248;
-               goto yy247;
-       } else {
-               if (yych <= 'F') goto yy248;
-               if (yych <= '`') goto yy247;
-               if (yych <= 'f') goto yy248;
-               goto yy247;
-       }
-yy260:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '/') goto yy247;
-       if (yych >= '8') goto yy247;
-       ++YYCURSOR;
-#line 413 "../src/parse/scanner_lex.re"
-       { cpoints.push_back (unesc_oct (tok, cur)); goto cpoints; }
-#line 1630 "src/parse/scanner_lex.cc"
-}
-#line 449 "../src/parse/scanner_lex.re"
-
-
-code:
-
-#line 1637 "src/parse/scanner_lex.cc"
-{
-       YYCTYPE yych;
-       unsigned int yyaccept = 0;
-       static const unsigned char yybm[] = {
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48, 112,   0,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-               112,  48,  16,  48,  48,  48,  48,  32, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-               176, 176, 176, 176, 176, 176, 176, 176, 
-               176, 176,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,   0,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-                48,  48,  48,  48,  48,  48,  48,  48, 
-       };
-       if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
-       yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= '&') {
-               if (yych <= '\n') {
-                       if (yych <= 0x00) goto yy265;
-                       if (yych <= '\t') goto yy267;
-                       goto yy269;
-               } else {
-                       if (yych == '"') goto yy271;
-                       goto yy267;
-               }
-       } else {
-               if (yych <= '{') {
-                       if (yych <= '\'') goto yy272;
-                       if (yych <= 'z') goto yy267;
-                       goto yy273;
-               } else {
-                       if (yych == '}') goto yy275;
-                       goto yy267;
-               }
-       }
-yy265:
-       ++YYCURSOR;
-#line 512 "../src/parse/scanner_lex.re"
-       {
-                                       if (cur == eof)
-                                       {
-                                               if (depth)
-                                               {
-                                                       fatal("missing '}'");
-                                               }
-                                               return 0;
-                                       }
-                                       goto code;
-                               }
-#line 1710 "src/parse/scanner_lex.cc"
-yy267:
-       ++YYCURSOR;
-yy268:
-#line 526 "../src/parse/scanner_lex.re"
-       {
-                                       goto code;
-                               }
-#line 1718 "src/parse/scanner_lex.cc"
-yy269:
-       YYCTXMARKER = YYCURSOR + 1;
-       yyaccept = 0;
-       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= '\r') {
-               if (yych <= '\t') {
-                       if (yych >= '\t') goto yy286;
-               } else {
-                       if (yych <= '\n') goto yy288;
-                       if (yych >= '\r') goto yy288;
-               }
-       } else {
-               if (yych <= ' ') {
-                       if (yych >= ' ') goto yy286;
-               } else {
-                       if (yych == '#') goto yy289;
-               }
-       }
-yy270:
-#line 493 "../src/parse/scanner_lex.re"
-       {
-                                       if (depth == 0)
-                                       {
-                                               tok += strspn(tok, " \t\r\n");
-                                               while (cur > tok && strchr(" \t\r\n", cur[-1]))
-                                               {
-                                                       --cur;
-                                               }
-                                               yylval.code = new Code (tok, tok_len (), get_fname (), tline);
-                                               return CODE;
-                                       }
-                                       else if (cur == eof)
-                                       {
-                                               fatal("missing '}'");
-                                       }
-                                       pos = cur;
-                                       cline++;
-                                       goto code;
-                               }
-#line 1758 "src/parse/scanner_lex.cc"
-yy271:
-       yyaccept = 1;
-       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == '\n') goto yy268;
-       goto yy284;
-yy272:
-       yyaccept = 1;
-       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == '\n') goto yy268;
-       goto yy278;
-yy273:
+       if (yych == '\n') goto yy234;
+       goto yy244;
+yy239:
        ++YYCURSOR;
-#line 465 "../src/parse/scanner_lex.re"
+#line 444 "../src/parse/scanner_lex.re"
        {
                                        if (depth == 0)
                                        {
@@ -1779,10 +1506,10 @@ yy273:
                                        }
                                        goto code;
                                }
-#line 1783 "src/parse/scanner_lex.cc"
-yy275:
+#line 1510 "src/parse/scanner_lex.cc"
+yy241:
        ++YYCURSOR;
-#line 453 "../src/parse/scanner_lex.re"
+#line 432 "../src/parse/scanner_lex.re"
        {
                                        if (depth == 0)
                                        {
@@ -1795,69 +1522,69 @@ yy275:
                                        }
                                        goto code;
                                }
-#line 1799 "src/parse/scanner_lex.cc"
-yy277:
+#line 1526 "src/parse/scanner_lex.cc"
+yy243:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy278:
+yy244:
        if (yybm[0+yych] & 16) {
-               goto yy277;
+               goto yy243;
        }
-       if (yych <= '\n') goto yy279;
-       if (yych <= '\'') goto yy281;
-       goto yy280;
-yy279:
+       if (yych <= '\n') goto yy245;
+       if (yych <= '\'') goto yy247;
+       goto yy246;
+yy245:
        YYCURSOR = YYMARKER;
        if (yyaccept <= 1) {
                if (yyaccept == 0) {
-                       goto yy270;
+                       goto yy236;
                } else {
-                       goto yy268;
+                       goto yy234;
                }
        } else {
-               goto yy287;
+               goto yy253;
        }
-yy280:
+yy246:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy279;
-       goto yy277;
-yy281:
+       if (yych == '\n') goto yy245;
+       goto yy243;
+yy247:
        ++YYCURSOR;
-#line 523 "../src/parse/scanner_lex.re"
+#line 502 "../src/parse/scanner_lex.re"
        {
                                        goto code;
                                }
-#line 1834 "src/parse/scanner_lex.cc"
-yy283:
+#line 1561 "src/parse/scanner_lex.cc"
+yy249:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy284:
+yy250:
        if (yybm[0+yych] & 32) {
-               goto yy283;
+               goto yy249;
        }
-       if (yych <= '\n') goto yy279;
-       if (yych <= '"') goto yy281;
+       if (yych <= '\n') goto yy245;
+       if (yych <= '"') goto yy247;
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy279;
-       goto yy283;
-yy286:
+       if (yych == '\n') goto yy245;
+       goto yy249;
+yy252:
        yyaccept = 2;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy308;
+               if (yych == '\t') goto yy274;
        } else {
-               if (yych <= ' ') goto yy308;
-               if (yych == '#') goto yy289;
+               if (yych <= ' ') goto yy274;
+               if (yych == '#') goto yy255;
        }
-yy287:
+yy253:
        YYCURSOR = YYCTXMARKER;
-#line 480 "../src/parse/scanner_lex.re"
+#line 459 "../src/parse/scanner_lex.re"
        {
                                        if (depth == 0)
                                        {
@@ -1871,123 +1598,123 @@ yy287:
                                        cline++;
                                        goto code;
                                }
-#line 1875 "src/parse/scanner_lex.cc"
-yy288:
+#line 1602 "src/parse/scanner_lex.cc"
+yy254:
        yych = (YYCTYPE)*++YYCURSOR;
-       goto yy287;
-yy289:
+       goto yy253;
+yy255:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 64) {
-               goto yy289;
+               goto yy255;
        }
-       if (yych != 'l') goto yy279;
+       if (yych != 'l') goto yy245;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy279;
+       if (yych != 'i') goto yy245;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy279;
+       if (yych != 'n') goto yy245;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy279;
+       if (yych != 'e') goto yy245;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '0') goto yy296;
-       if (yych <= '9') goto yy279;
-       goto yy296;
-yy295:
+       if (yych <= '0') goto yy262;
+       if (yych <= '9') goto yy245;
+       goto yy262;
+yy261:
        YYCTXMARKER = YYCURSOR + 1;
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy296:
+yy262:
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy295;
-               goto yy279;
+               if (yych == '\t') goto yy261;
+               goto yy245;
        } else {
-               if (yych <= ' ') goto yy295;
-               if (yych <= '0') goto yy279;
-               if (yych >= ':') goto yy279;
+               if (yych <= ' ') goto yy261;
+               if (yych <= '0') goto yy245;
+               if (yych >= ':') goto yy245;
        }
-yy297:
+yy263:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy297;
+               goto yy263;
        }
        if (yych <= '\f') {
-               if (yych <= 0x08) goto yy279;
-               if (yych <= '\t') goto yy299;
-               if (yych <= '\n') goto yy301;
-               goto yy279;
+               if (yych <= 0x08) goto yy245;
+               if (yych <= '\t') goto yy265;
+               if (yych <= '\n') goto yy267;
+               goto yy245;
        } else {
-               if (yych <= '\r') goto yy303;
-               if (yych != ' ') goto yy279;
+               if (yych <= '\r') goto yy269;
+               if (yych != ' ') goto yy245;
        }
-yy299:
+yy265:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy299;
-               goto yy279;
+               if (yych == '\t') goto yy265;
+               goto yy245;
        } else {
-               if (yych <= ' ') goto yy299;
-               if (yych == '"') goto yy304;
-               goto yy279;
+               if (yych <= ' ') goto yy265;
+               if (yych == '"') goto yy270;
+               goto yy245;
        }
-yy301:
+yy267:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 476 "../src/parse/scanner_lex.re"
+#line 455 "../src/parse/scanner_lex.re"
        {
                                        set_sourceline ();
                                        goto code;
                                }
-#line 1947 "src/parse/scanner_lex.cc"
-yy303:
+#line 1674 "src/parse/scanner_lex.cc"
+yy269:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy301;
-       goto yy279;
-yy304:
+       if (yych == '\n') goto yy267;
+       goto yy245;
+yy270:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '!') {
-               if (yych == '\n') goto yy279;
-               goto yy304;
+               if (yych == '\n') goto yy245;
+               goto yy270;
        } else {
-               if (yych <= '"') goto yy307;
-               if (yych != '\\') goto yy304;
+               if (yych <= '"') goto yy273;
+               if (yych != '\\') goto yy270;
        }
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy279;
-       goto yy304;
-yy307:
+       if (yych == '\n') goto yy245;
+       goto yy270;
+yy273:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy301;
-       if (yych == '\r') goto yy303;
-       goto yy279;
-yy308:
+       if (yych == '\n') goto yy267;
+       if (yych == '\r') goto yy269;
+       goto yy245;
+yy274:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy308;
-               goto yy279;
+               if (yych == '\t') goto yy274;
+               goto yy245;
        } else {
-               if (yych <= ' ') goto yy308;
-               if (yych == '#') goto yy289;
-               goto yy279;
+               if (yych <= ' ') goto yy274;
+               if (yych == '#') goto yy255;
+               goto yy245;
        }
 }
-#line 529 "../src/parse/scanner_lex.re"
+#line 508 "../src/parse/scanner_lex.re"
 
 
 comment:
 
-#line 1991 "src/parse/scanner_lex.cc"
+#line 1718 "src/parse/scanner_lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -2027,14 +1754,14 @@ comment:
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= ')') {
-               if (yych == '\n') goto yy314;
+               if (yych == '\n') goto yy280;
        } else {
-               if (yych <= '*') goto yy316;
-               if (yych == '/') goto yy317;
+               if (yych <= '*') goto yy282;
+               if (yych == '/') goto yy283;
        }
        ++YYCURSOR;
-yy313:
-#line 561 "../src/parse/scanner_lex.re"
+yy279:
+#line 540 "../src/parse/scanner_lex.re"
        {
                                        if (cur == eof)
                                        {
@@ -2042,15 +1769,15 @@ yy313:
                                        }
                                        goto comment;
                                }
-#line 2046 "src/parse/scanner_lex.cc"
-yy314:
+#line 1773 "src/parse/scanner_lex.cc"
+yy280:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yybm[0+yych] & 32) {
-               goto yy322;
+               goto yy288;
        }
-       if (yych == '#') goto yy325;
-yy315:
-#line 552 "../src/parse/scanner_lex.re"
+       if (yych == '#') goto yy291;
+yy281:
+#line 531 "../src/parse/scanner_lex.re"
        {
                                        if (cur == eof)
                                        {
@@ -2060,25 +1787,25 @@ yy315:
                                        cline++;
                                        goto comment;
                                }
-#line 2064 "src/parse/scanner_lex.cc"
-yy316:
+#line 1791 "src/parse/scanner_lex.cc"
+yy282:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '/') goto yy320;
-       goto yy313;
-yy317:
+       if (yych == '/') goto yy286;
+       goto yy279;
+yy283:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != '*') goto yy313;
+       if (yych != '*') goto yy279;
        ++YYCURSOR;
-#line 543 "../src/parse/scanner_lex.re"
+#line 522 "../src/parse/scanner_lex.re"
        {
                                        ++depth;
                                        fatal("ambiguous /* found");
                                        goto comment;
                                }
-#line 2079 "src/parse/scanner_lex.cc"
-yy320:
+#line 1806 "src/parse/scanner_lex.cc"
+yy286:
        ++YYCURSOR;
-#line 533 "../src/parse/scanner_lex.re"
+#line 512 "../src/parse/scanner_lex.re"
        {
                                        if (--depth == 0)
                                        {
@@ -2089,136 +1816,136 @@ yy320:
                                                goto comment;
                                        }
                                }
-#line 2093 "src/parse/scanner_lex.cc"
-yy322:
+#line 1820 "src/parse/scanner_lex.cc"
+yy288:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 32) {
-               goto yy322;
+               goto yy288;
        }
-       if (yych == '#') goto yy325;
-yy324:
+       if (yych == '#') goto yy291;
+yy290:
        YYCURSOR = YYMARKER;
-       goto yy315;
-yy325:
+       goto yy281;
+yy291:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy325;
-               goto yy324;
+               if (yych == '\t') goto yy291;
+               goto yy290;
        } else {
-               if (yych <= ' ') goto yy325;
-               if (yych != 'l') goto yy324;
+               if (yych <= ' ') goto yy291;
+               if (yych != 'l') goto yy290;
        }
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy324;
+       if (yych != 'i') goto yy290;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy324;
+       if (yych != 'n') goto yy290;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy324;
+       if (yych != 'e') goto yy290;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '0') goto yy332;
-       if (yych <= '9') goto yy324;
-       goto yy332;
-yy331:
+       if (yych <= '0') goto yy298;
+       if (yych <= '9') goto yy290;
+       goto yy298;
+yy297:
        YYCTXMARKER = YYCURSOR + 1;
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy332:
+yy298:
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy331;
-               goto yy324;
+               if (yych == '\t') goto yy297;
+               goto yy290;
        } else {
-               if (yych <= ' ') goto yy331;
-               if (yych <= '0') goto yy324;
-               if (yych >= ':') goto yy324;
+               if (yych <= ' ') goto yy297;
+               if (yych <= '0') goto yy290;
+               if (yych >= ':') goto yy290;
        }
-yy333:
+yy299:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 64) {
-               goto yy333;
+               goto yy299;
        }
        if (yych <= '\f') {
-               if (yych <= 0x08) goto yy324;
-               if (yych <= '\t') goto yy335;
-               if (yych <= '\n') goto yy337;
-               goto yy324;
+               if (yych <= 0x08) goto yy290;
+               if (yych <= '\t') goto yy301;
+               if (yych <= '\n') goto yy303;
+               goto yy290;
        } else {
-               if (yych <= '\r') goto yy339;
-               if (yych != ' ') goto yy324;
+               if (yych <= '\r') goto yy305;
+               if (yych != ' ') goto yy290;
        }
-yy335:
+yy301:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy335;
-               goto yy324;
+               if (yych == '\t') goto yy301;
+               goto yy290;
        } else {
-               if (yych <= ' ') goto yy335;
-               if (yych == '"') goto yy340;
-               goto yy324;
+               if (yych <= ' ') goto yy301;
+               if (yych == '"') goto yy306;
+               goto yy290;
        }
-yy337:
+yy303:
        ++YYCURSOR;
        YYCURSOR = YYCTXMARKER;
-#line 548 "../src/parse/scanner_lex.re"
+#line 527 "../src/parse/scanner_lex.re"
        {
                                        set_sourceline ();
                                        goto comment;
                                }
-#line 2176 "src/parse/scanner_lex.cc"
-yy339:
+#line 1903 "src/parse/scanner_lex.cc"
+yy305:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy337;
-       goto yy324;
-yy340:
+       if (yych == '\n') goto yy303;
+       goto yy290;
+yy306:
        ++YYCURSOR;
        if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy340;
+               goto yy306;
        }
-       if (yych <= '\n') goto yy324;
-       if (yych <= '"') goto yy343;
+       if (yych <= '\n') goto yy290;
+       if (yych <= '"') goto yy309;
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy324;
-       goto yy340;
-yy343:
+       if (yych == '\n') goto yy290;
+       goto yy306;
+yy309:
        ++YYCURSOR;
-       if ((yych = (YYCTYPE)*YYCURSOR) == '\n') goto yy337;
-       if (yych == '\r') goto yy339;
-       goto yy324;
+       if ((yych = (YYCTYPE)*YYCURSOR) == '\n') goto yy303;
+       if (yych == '\r') goto yy305;
+       goto yy290;
 }
-#line 568 "../src/parse/scanner_lex.re"
+#line 547 "../src/parse/scanner_lex.re"
 
 
 nextLine:
 
-#line 2206 "src/parse/scanner_lex.cc"
+#line 1933 "src/parse/scanner_lex.cc"
 {
        YYCTYPE yych;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy348;
+       if (yych == '\n') goto yy314;
        ++YYCURSOR;
-#line 579 "../src/parse/scanner_lex.re"
+#line 558 "../src/parse/scanner_lex.re"
        {  if(cur == eof) {
                   return 0;
                }
                goto nextLine;
             }
-#line 2219 "src/parse/scanner_lex.cc"
-yy348:
+#line 1946 "src/parse/scanner_lex.cc"
+yy314:
        ++YYCURSOR;
-#line 572 "../src/parse/scanner_lex.re"
+#line 551 "../src/parse/scanner_lex.re"
        { if(cur == eof) {
                   return 0;
                }
@@ -2226,534 +1953,534 @@ yy348:
                cline++;
                goto scan;
             }
-#line 2230 "src/parse/scanner_lex.cc"
+#line 1957 "src/parse/scanner_lex.cc"
 }
-#line 584 "../src/parse/scanner_lex.re"
+#line 563 "../src/parse/scanner_lex.re"
 
 
 conf:
        tok = cur;
        lexer_state = LEX_CONF;
 
-#line 2239 "src/parse/scanner_lex.cc"
+#line 1966 "src/parse/scanner_lex.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
        if ((YYLIMIT - YYCURSOR) < 27) YYFILL(27);
        yych = (YYCTYPE)*YYCURSOR;
        switch (yych) {
-       case 'c':       goto yy354;
-       case 'd':       goto yy355;
-       case 'f':       goto yy356;
-       case 'i':       goto yy357;
-       case 'l':       goto yy358;
-       case 's':       goto yy359;
-       case 'v':       goto yy360;
-       case 'y':       goto yy361;
-       default:        goto yy352;
-       }
-yy352:
-       ++YYCURSOR;
-yy353:
-#line 590 "../src/parse/scanner_lex.re"
+       case 'c':       goto yy320;
+       case 'd':       goto yy321;
+       case 'f':       goto yy322;
+       case 'i':       goto yy323;
+       case 'l':       goto yy324;
+       case 's':       goto yy325;
+       case 'v':       goto yy326;
+       case 'y':       goto yy327;
+       default:        goto yy318;
+       }
+yy318:
+       ++YYCURSOR;
+yy319:
+#line 569 "../src/parse/scanner_lex.re"
        { fatal ((tok - pos) - tchar, "unrecognized configuration"); }
-#line 2261 "src/parse/scanner_lex.cc"
-yy354:
+#line 1988 "src/parse/scanner_lex.cc"
+yy320:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'g') goto yy686;
-       if (yych == 'o') goto yy687;
-       goto yy353;
-yy355:
+       if (yych == 'g') goto yy652;
+       if (yych == 'o') goto yy653;
+       goto yy319;
+yy321:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'e') goto yy531;
-       goto yy353;
-yy356:
+       if (yych == 'e') goto yy497;
+       goto yy319;
+yy322:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'l') goto yy524;
-       goto yy353;
-yy357:
+       if (yych == 'l') goto yy490;
+       goto yy319;
+yy323:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'n') goto yy507;
-       goto yy353;
-yy358:
+       if (yych == 'n') goto yy473;
+       goto yy319;
+yy324:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'a') goto yy480;
-       goto yy353;
-yy359:
+       if (yych == 'a') goto yy446;
+       goto yy319;
+yy325:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 't') goto yy451;
-       goto yy353;
-yy360:
+       if (yych == 't') goto yy417;
+       goto yy319;
+yy326:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'a') goto yy418;
-       goto yy353;
-yy361:
+       if (yych == 'a') goto yy384;
+       goto yy319;
+yy327:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych != 'y') goto yy353;
+       if (yych != 'y') goto yy319;
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 'c') {
-               if (yych <= 'a') goto yy363;
-               if (yych <= 'b') goto yy364;
-               goto yy365;
+               if (yych <= 'a') goto yy329;
+               if (yych <= 'b') goto yy330;
+               goto yy331;
        } else {
-               if (yych == 'f') goto yy366;
+               if (yych == 'f') goto yy332;
        }
-yy363:
+yy329:
        YYCURSOR = YYMARKER;
        if (yyaccept <= 1) {
                if (yyaccept == 0) {
-                       goto yy353;
+                       goto yy319;
                } else {
-                       goto yy555;
+                       goto yy521;
                }
        } else {
                if (yyaccept == 2) {
-                       goto yy701;
+                       goto yy667;
                } else {
-                       goto yy711;
+                       goto yy677;
                }
        }
-yy364:
+yy330:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'm') goto yy412;
-       goto yy363;
-yy365:
+       if (yych == 'm') goto yy378;
+       goto yy329;
+yy331:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'h') goto yy394;
-       goto yy363;
-yy366:
+       if (yych == 'h') goto yy360;
+       goto yy329;
+yy332:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy363;
+       if (yych != 'i') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'l') goto yy363;
+       if (yych != 'l') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'l') goto yy363;
+       if (yych != 'l') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != ':') goto yy363;
+       if (yych != ':') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 'd') {
-               if (yych == 'c') goto yy373;
-               goto yy363;
+               if (yych == 'c') goto yy339;
+               goto yy329;
        } else {
-               if (yych <= 'e') goto yy372;
-               if (yych != 'p') goto yy363;
+               if (yych <= 'e') goto yy338;
+               if (yych != 'p') goto yy329;
        }
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy385;
-       goto yy363;
-yy372:
+       if (yych == 'a') goto yy351;
+       goto yy329;
+yy338:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy379;
-       goto yy363;
-yy373:
+       if (yych == 'n') goto yy345;
+       goto yy329;
+yy339:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'h') goto yy363;
+       if (yych != 'h') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'c') goto yy363;
+       if (yych != 'c') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'k') goto yy363;
+       if (yych != 'k') goto yy329;
        ++YYCURSOR;
-#line 678 "../src/parse/scanner_lex.re"
+#line 657 "../src/parse/scanner_lex.re"
        { return CONF_YYFILL_CHECK; }
-#line 2369 "src/parse/scanner_lex.cc"
-yy379:
+#line 2096 "src/parse/scanner_lex.cc"
+yy345:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'a') goto yy363;
+       if (yych != 'a') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'b') goto yy363;
+       if (yych != 'b') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'l') goto yy363;
+       if (yych != 'l') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        ++YYCURSOR;
-#line 679 "../src/parse/scanner_lex.re"
+#line 658 "../src/parse/scanner_lex.re"
        { return CONF_YYFILL_ENABLE; }
-#line 2382 "src/parse/scanner_lex.cc"
-yy385:
+#line 2109 "src/parse/scanner_lex.cc"
+yy351:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'r') goto yy363;
+       if (yych != 'r') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'a') goto yy363;
+       if (yych != 'a') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'm') goto yy363;
+       if (yych != 'm') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 't') goto yy363;
+       if (yych != 't') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'r') goto yy363;
+       if (yych != 'r') goto yy329;
        ++YYCURSOR;
-#line 680 "../src/parse/scanner_lex.re"
+#line 659 "../src/parse/scanner_lex.re"
        { return CONF_YYFILL_PARAMETER; }
-#line 2401 "src/parse/scanner_lex.cc"
-yy394:
+#line 2128 "src/parse/scanner_lex.cc"
+yy360:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != ':') goto yy363;
+       if (yych != ':') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy397;
-       if (yych != 'e') goto yy363;
+       if (yych == 'c') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'm') goto yy408;
-       goto yy363;
-yy397:
+       if (yych == 'm') goto yy374;
+       goto yy329;
+yy363:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'o') goto yy363;
+       if (yych != 'o') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy363;
+       if (yych != 'n') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'v') goto yy363;
+       if (yych != 'v') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'r') goto yy363;
+       if (yych != 'r') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 's') goto yy363;
+       if (yych != 's') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy363;
+       if (yych != 'i') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'o') goto yy363;
+       if (yych != 'o') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy363;
+       if (yych != 'n') goto yy329;
        ++YYCURSOR;
-#line 676 "../src/parse/scanner_lex.re"
+#line 655 "../src/parse/scanner_lex.re"
        { return CONF_YYCH_CONVERSION; }
-#line 2433 "src/parse/scanner_lex.cc"
-yy408:
+#line 2160 "src/parse/scanner_lex.cc"
+yy374:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy363;
+       if (yych != 'i') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 't') goto yy363;
+       if (yych != 't') goto yy329;
        ++YYCURSOR;
-#line 677 "../src/parse/scanner_lex.re"
+#line 656 "../src/parse/scanner_lex.re"
        { return CONF_YYCH_EMIT; }
-#line 2442 "src/parse/scanner_lex.cc"
-yy412:
+#line 2169 "src/parse/scanner_lex.cc"
+yy378:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != ':') goto yy363;
+       if (yych != ':') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'h') goto yy363;
+       if (yych != 'h') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'x') goto yy363;
+       if (yych != 'x') goto yy329;
        ++YYCURSOR;
-#line 675 "../src/parse/scanner_lex.re"
+#line 654 "../src/parse/scanner_lex.re"
        { return CONF_YYBM_HEX; }
-#line 2455 "src/parse/scanner_lex.cc"
-yy418:
+#line 2182 "src/parse/scanner_lex.cc"
+yy384:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'r') goto yy363;
+       if (yych != 'r') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy363;
+       if (yych != 'i') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'a') goto yy363;
+       if (yych != 'a') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'b') goto yy363;
+       if (yych != 'b') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'l') goto yy363;
+       if (yych != 'l') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != ':') goto yy363;
+       if (yych != ':') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'y') goto yy363;
+       if (yych != 'y') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'y') goto yy363;
+       if (yych != 'y') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 'c') {
-               if (yych <= '`') goto yy363;
-               if (yych <= 'a') goto yy428;
-               if (yych <= 'b') goto yy429;
-               goto yy430;
+               if (yych <= '`') goto yy329;
+               if (yych <= 'a') goto yy394;
+               if (yych <= 'b') goto yy395;
+               goto yy396;
        } else {
-               if (yych <= 'r') goto yy363;
-               if (yych <= 's') goto yy431;
-               if (yych <= 't') goto yy432;
-               goto yy363;
+               if (yych <= 'r') goto yy329;
+               if (yych <= 's') goto yy397;
+               if (yych <= 't') goto yy398;
+               goto yy329;
        }
-yy428:
+yy394:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy447;
-       goto yy363;
-yy429:
+       if (yych == 'c') goto yy413;
+       goto yy329;
+yy395:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'm') goto yy437;
-       goto yy363;
-yy430:
+       if (yych == 'm') goto yy403;
+       goto yy329;
+yy396:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'h') goto yy437;
-       if (yych == 't') goto yy443;
-       goto yy363;
-yy431:
+       if (yych == 'h') goto yy403;
+       if (yych == 't') goto yy409;
+       goto yy329;
+yy397:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy439;
-       goto yy363;
-yy432:
+       if (yych == 't') goto yy405;
+       goto yy329;
+yy398:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'a') goto yy363;
+       if (yych != 'a') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'r') goto yy363;
+       if (yych != 'r') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'g') goto yy363;
+       if (yych != 'g') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 't') goto yy363;
-yy437:
+       if (yych != 't') goto yy329;
+yy403:
        ++YYCURSOR;
-#line 637 "../src/parse/scanner_lex.re"
+#line 616 "../src/parse/scanner_lex.re"
        {
                tok += sizeof "variable:" - 1;
                yylval.str = new std::string (tok, tok_len ());
                return CONF;
        }
-#line 2523 "src/parse/scanner_lex.cc"
-yy439:
+#line 2250 "src/parse/scanner_lex.cc"
+yy405:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'a') goto yy363;
+       if (yych != 'a') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'b') goto yy363;
+       if (yych != 'b') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'l') goto yy363;
+       if (yych != 'l') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy437;
-       goto yy363;
-yy443:
+       if (yych == 'e') goto yy403;
+       goto yy329;
+yy409:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'a') goto yy363;
+       if (yych != 'a') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'b') goto yy363;
+       if (yych != 'b') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'l') goto yy363;
+       if (yych != 'l') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy437;
-       goto yy363;
-yy447:
+       if (yych == 'e') goto yy403;
+       goto yy329;
+yy413:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'c') goto yy363;
+       if (yych != 'c') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'p') goto yy363;
+       if (yych != 'p') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy437;
-       goto yy363;
-yy451:
+       if (yych == 't') goto yy403;
+       goto yy329;
+yy417:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'a') goto yy363;
+       if (yych != 'a') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy454;
-       if (yych != 't') goto yy363;
+       if (yych == 'r') goto yy420;
+       if (yych != 't') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy462;
-       goto yy363;
-yy454:
+       if (yych == 'e') goto yy428;
+       goto yy329;
+yy420:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 't') goto yy363;
+       if (yych != 't') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'l') goto yy363;
+       if (yych != 'l') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'a') goto yy363;
+       if (yych != 'a') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'b') goto yy363;
+       if (yych != 'b') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'l') goto yy363;
+       if (yych != 'l') goto yy329;
        ++YYCURSOR;
-#line 672 "../src/parse/scanner_lex.re"
+#line 651 "../src/parse/scanner_lex.re"
        { return CONF_STARTLABEL; }
-#line 2579 "src/parse/scanner_lex.cc"
-yy462:
+#line 2306 "src/parse/scanner_lex.cc"
+yy428:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != ':') goto yy363;
+       if (yych != ':') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy464;
-       if (yych == 'n') goto yy465;
-       goto yy363;
-yy464:
+       if (yych == 'a') goto yy430;
+       if (yych == 'n') goto yy431;
+       goto yy329;
+yy430:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'b') goto yy475;
-       goto yy363;
-yy465:
+       if (yych == 'b') goto yy441;
+       goto yy329;
+yy431:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'x') goto yy363;
+       if (yych != 'x') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 't') goto yy363;
+       if (yych != 't') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'l') goto yy363;
+       if (yych != 'l') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'a') goto yy363;
+       if (yych != 'a') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'b') goto yy363;
+       if (yych != 'b') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'l') goto yy363;
+       if (yych != 'l') goto yy329;
        ++YYCURSOR;
-#line 674 "../src/parse/scanner_lex.re"
+#line 653 "../src/parse/scanner_lex.re"
        { return CONF_STATE_NEXTLABEL; }
-#line 2611 "src/parse/scanner_lex.cc"
-yy475:
+#line 2338 "src/parse/scanner_lex.cc"
+yy441:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'o') goto yy363;
+       if (yych != 'o') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'r') goto yy363;
+       if (yych != 'r') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 't') goto yy363;
+       if (yych != 't') goto yy329;
        ++YYCURSOR;
-#line 673 "../src/parse/scanner_lex.re"
+#line 652 "../src/parse/scanner_lex.re"
        { return CONF_STATE_ABORT; }
-#line 2622 "src/parse/scanner_lex.cc"
-yy480:
+#line 2349 "src/parse/scanner_lex.cc"
+yy446:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'b') goto yy363;
+       if (yych != 'b') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'l') goto yy363;
+       if (yych != 'l') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == ':') goto yy485;
-       if (yych != 'p') goto yy363;
+       if (yych == ':') goto yy451;
+       if (yych != 'p') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy501;
-       goto yy363;
-yy485:
+       if (yych == 'r') goto yy467;
+       goto yy329;
+yy451:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'y') goto yy363;
+       if (yych != 'y') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'y') goto yy363;
+       if (yych != 'y') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'F') goto yy488;
-       if (yych == 'N') goto yy489;
-       goto yy363;
-yy488:
+       if (yych == 'F') goto yy454;
+       if (yych == 'N') goto yy455;
+       goto yy329;
+yy454:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy494;
-       goto yy363;
-yy489:
+       if (yych == 'i') goto yy460;
+       goto yy329;
+yy455:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'x') goto yy363;
+       if (yych != 'x') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 't') goto yy363;
-yy492:
+       if (yych != 't') goto yy329;
+yy458:
        ++YYCURSOR;
-#line 623 "../src/parse/scanner_lex.re"
+#line 602 "../src/parse/scanner_lex.re"
        {
                tok += sizeof "label:" - 1;
                yylval.str = new std::string (tok, tok_len ());
                return CONF;
        }
-#line 2664 "src/parse/scanner_lex.cc"
-yy494:
+#line 2391 "src/parse/scanner_lex.cc"
+yy460:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'l') goto yy363;
+       if (yych != 'l') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'l') goto yy363;
+       if (yych != 'l') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'L') goto yy363;
+       if (yych != 'L') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'a') goto yy363;
+       if (yych != 'a') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'b') goto yy363;
+       if (yych != 'b') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'l') goto yy492;
-       goto yy363;
-yy501:
+       if (yych == 'l') goto yy458;
+       goto yy329;
+yy467:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'f') goto yy363;
+       if (yych != 'f') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy363;
+       if (yych != 'i') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'x') goto yy363;
+       if (yych != 'x') goto yy329;
        ++YYCURSOR;
-#line 671 "../src/parse/scanner_lex.re"
+#line 650 "../src/parse/scanner_lex.re"
        { return CONF_LABELPREFIX; }
-#line 2693 "src/parse/scanner_lex.cc"
-yy507:
+#line 2420 "src/parse/scanner_lex.cc"
+yy473:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'd') goto yy363;
+       if (yych != 'd') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy363;
+       if (yych != 'n') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 't') goto yy363;
+       if (yych != 't') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != ':') goto yy363;
+       if (yych != ':') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 'r') goto yy363;
-       if (yych <= 's') goto yy514;
-       if (yych >= 'u') goto yy363;
+       if (yych <= 'r') goto yy329;
+       if (yych <= 's') goto yy480;
+       if (yych >= 'u') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy521;
-       goto yy363;
-yy514:
+       if (yych == 'o') goto yy487;
+       goto yy329;
+yy480:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 't') goto yy363;
+       if (yych != 't') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'r') goto yy363;
+       if (yych != 'r') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy363;
+       if (yych != 'i') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy363;
+       if (yych != 'n') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'g') goto yy363;
+       if (yych != 'g') goto yy329;
        ++YYCURSOR;
-#line 669 "../src/parse/scanner_lex.re"
+#line 648 "../src/parse/scanner_lex.re"
        { return CONF_INDENT_STRING; }
-#line 2726 "src/parse/scanner_lex.cc"
-yy521:
+#line 2453 "src/parse/scanner_lex.cc"
+yy487:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'p') goto yy363;
+       if (yych != 'p') goto yy329;
        ++YYCURSOR;
-#line 670 "../src/parse/scanner_lex.re"
+#line 649 "../src/parse/scanner_lex.re"
        { return CONF_INDENT_TOP; }
-#line 2733 "src/parse/scanner_lex.cc"
-yy524:
+#line 2460 "src/parse/scanner_lex.cc"
+yy490:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'a') goto yy363;
+       if (yych != 'a') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'g') goto yy363;
+       if (yych != 'g') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 's') goto yy363;
+       if (yych != 's') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != ':') goto yy363;
+       if (yych != ':') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 'e') {
-               if (yych == '8') goto yy529;
-               if (yych <= 'd') goto yy363;
+               if (yych == '8') goto yy495;
+               if (yych <= 'd') goto yy329;
        } else {
                if (yych <= 'u') {
-                       if (yych <= 't') goto yy363;
+                       if (yych <= 't') goto yy329;
                } else {
-                       if (yych <= 'v') goto yy363;
-                       if (yych >= 'y') goto yy363;
+                       if (yych <= 'v') goto yy329;
+                       if (yych >= 'y') goto yy329;
                }
        }
-yy529:
+yy495:
        ++YYCURSOR;
-#line 658 "../src/parse/scanner_lex.re"
+#line 637 "../src/parse/scanner_lex.re"
        {
                switch (YYCURSOR[-1])
                {
@@ -2765,584 +2492,584 @@ yy529:
                }
                return CONF_FLAGS;
        }
-#line 2769 "src/parse/scanner_lex.cc"
-yy531:
+#line 2496 "src/parse/scanner_lex.cc"
+yy497:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'f') goto yy363;
+       if (yych != 'f') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy363;
+       if (yych != 'i') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy363;
+       if (yych != 'n') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != ':') goto yy363;
+       if (yych != ':') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'Y') goto yy363;
+       if (yych != 'Y') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'Y') goto yy363;
+       if (yych != 'Y') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
        switch (yych) {
-       case 'B':       goto yy542;
-       case 'C':       goto yy543;
-       case 'D':       goto yy544;
-       case 'F':       goto yy541;
-       case 'G':       goto yy540;
-       case 'L':       goto yy545;
-       case 'M':       goto yy546;
-       case 'P':       goto yy547;
-       case 'R':       goto yy548;
-       case 'S':       goto yy539;
-       default:        goto yy363;
-       }
-yy539:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'E') goto yy649;
-       if (yych == 'K') goto yy648;
-       goto yy363;
-yy540:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'E') goto yy618;
-       goto yy363;
-yy541:
+       case 'B':       goto yy508;
+       case 'C':       goto yy509;
+       case 'D':       goto yy510;
+       case 'F':       goto yy507;
+       case 'G':       goto yy506;
+       case 'L':       goto yy511;
+       case 'M':       goto yy512;
+       case 'P':       goto yy513;
+       case 'R':       goto yy514;
+       case 'S':       goto yy505;
+       default:        goto yy329;
+       }
+yy505:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'E') goto yy615;
+       if (yych == 'K') goto yy614;
+       goto yy329;
+yy506:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'E') goto yy584;
+       goto yy329;
+yy507:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'I') goto yy603;
-       goto yy363;
-yy542:
+       if (yych == 'I') goto yy569;
+       goto yy329;
+yy508:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'A') goto yy596;
-       goto yy363;
-yy543:
+       if (yych == 'A') goto yy562;
+       goto yy329;
+yy509:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 'S') {
-               if (yych == 'O') goto yy579;
-               goto yy363;
+               if (yych == 'O') goto yy545;
+               goto yy329;
        } else {
-               if (yych <= 'T') goto yy578;
-               if (yych <= 'U') goto yy577;
-               goto yy363;
+               if (yych <= 'T') goto yy544;
+               if (yych <= 'U') goto yy543;
+               goto yy329;
        }
-yy544:
+yy510:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'E') goto yy574;
-       goto yy363;
-yy545:
+       if (yych == 'E') goto yy540;
+       goto yy329;
+yy511:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'E') goto yy566;
-       if (yych == 'I') goto yy565;
-       goto yy363;
-yy546:
+       if (yych == 'E') goto yy532;
+       if (yych == 'I') goto yy531;
+       goto yy329;
+yy512:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'A') goto yy561;
-       goto yy363;
-yy547:
+       if (yych == 'A') goto yy527;
+       goto yy329;
+yy513:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'E') goto yy559;
-       goto yy363;
-yy548:
+       if (yych == 'E') goto yy525;
+       goto yy329;
+yy514:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'E') goto yy363;
+       if (yych != 'E') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'S') goto yy363;
+       if (yych != 'S') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'T') goto yy363;
+       if (yych != 'T') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'O') goto yy363;
+       if (yych != 'O') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'R') goto yy363;
+       if (yych != 'R') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'E') goto yy363;
+       if (yych != 'E') goto yy329;
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'C') goto yy556;
-yy555:
-#line 613 "../src/parse/scanner_lex.re"
+       if (yych == 'C') goto yy522;
+yy521:
+#line 592 "../src/parse/scanner_lex.re"
        {
                tok += sizeof "define:" - 1;
                yylval.str = new std::string (tok, tok_len ());
                return CONF;
        }
-#line 2866 "src/parse/scanner_lex.cc"
-yy556:
+#line 2593 "src/parse/scanner_lex.cc"
+yy522:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'T') goto yy363;
+       if (yych != 'T') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'X') goto yy363;
-yy558:
+       if (yych != 'X') goto yy329;
+yy524:
        yych = (YYCTYPE)*++YYCURSOR;
-       goto yy555;
-yy559:
+       goto yy521;
+yy525:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'E') goto yy363;
+       if (yych != 'E') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'K') goto yy558;
-       goto yy363;
-yy561:
+       if (yych == 'K') goto yy524;
+       goto yy329;
+yy527:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'R') goto yy363;
+       if (yych != 'R') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'K') goto yy363;
+       if (yych != 'K') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'E') goto yy363;
+       if (yych != 'E') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'R') goto yy558;
-       goto yy363;
-yy565:
+       if (yych == 'R') goto yy524;
+       goto yy329;
+yy531:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'M') goto yy572;
-       goto yy363;
-yy566:
+       if (yych == 'M') goto yy538;
+       goto yy329;
+yy532:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'S') goto yy363;
+       if (yych != 'S') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'S') goto yy363;
+       if (yych != 'S') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'T') goto yy363;
+       if (yych != 'T') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'H') goto yy363;
+       if (yych != 'H') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'A') goto yy363;
+       if (yych != 'A') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'N') goto yy558;
-       goto yy363;
-yy572:
+       if (yych == 'N') goto yy524;
+       goto yy329;
+yy538:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'I') goto yy363;
+       if (yych != 'I') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'T') goto yy558;
-       goto yy363;
-yy574:
+       if (yych == 'T') goto yy524;
+       goto yy329;
+yy540:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'B') goto yy363;
+       if (yych != 'B') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'U') goto yy363;
+       if (yych != 'U') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'G') goto yy558;
-       goto yy363;
-yy577:
+       if (yych == 'G') goto yy524;
+       goto yy329;
+yy543:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'R') goto yy593;
-       goto yy363;
-yy578:
+       if (yych == 'R') goto yy559;
+       goto yy329;
+yy544:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 'W') goto yy363;
-       if (yych <= 'X') goto yy585;
-       if (yych <= 'Y') goto yy586;
-       goto yy363;
-yy579:
+       if (yych <= 'W') goto yy329;
+       if (yych <= 'X') goto yy551;
+       if (yych <= 'Y') goto yy552;
+       goto yy329;
+yy545:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'N') goto yy363;
+       if (yych != 'N') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'D') goto yy363;
+       if (yych != 'D') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'T') goto yy363;
+       if (yych != 'T') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'Y') goto yy363;
+       if (yych != 'Y') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'P') goto yy363;
+       if (yych != 'P') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'E') goto yy558;
-       goto yy363;
-yy585:
+       if (yych == 'E') goto yy524;
+       goto yy329;
+yy551:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'M') goto yy588;
-       goto yy363;
-yy586:
+       if (yych == 'M') goto yy554;
+       goto yy329;
+yy552:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'P') goto yy363;
+       if (yych != 'P') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'E') goto yy558;
-       goto yy363;
-yy588:
+       if (yych == 'E') goto yy524;
+       goto yy329;
+yy554:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'A') goto yy363;
+       if (yych != 'A') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'R') goto yy363;
+       if (yych != 'R') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'K') goto yy363;
+       if (yych != 'K') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'E') goto yy363;
+       if (yych != 'E') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'R') goto yy558;
-       goto yy363;
-yy593:
+       if (yych == 'R') goto yy524;
+       goto yy329;
+yy559:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'S') goto yy363;
+       if (yych != 'S') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'O') goto yy363;
+       if (yych != 'O') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'R') goto yy558;
-       goto yy363;
-yy596:
+       if (yych == 'R') goto yy524;
+       goto yy329;
+yy562:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'C') goto yy363;
+       if (yych != 'C') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'K') goto yy363;
+       if (yych != 'K') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'U') goto yy363;
+       if (yych != 'U') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'P') goto yy363;
+       if (yych != 'P') goto yy329;
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych != 'C') goto yy555;
+       if (yych != 'C') goto yy521;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'T') goto yy363;
+       if (yych != 'T') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'X') goto yy558;
-       goto yy363;
-yy603:
+       if (yych == 'X') goto yy524;
+       goto yy329;
+yy569:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'L') goto yy363;
+       if (yych != 'L') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'L') goto yy363;
+       if (yych != 'L') goto yy329;
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == ':') goto yy607;
-       if (yych != '@') goto yy555;
+       if (yych == ':') goto yy573;
+       if (yych != '@') goto yy521;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'l') goto yy614;
-       goto yy363;
-yy607:
+       if (yych == 'l') goto yy580;
+       goto yy329;
+yy573:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy363;
+       if (yych != 'n') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'a') goto yy363;
+       if (yych != 'a') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'k') goto yy363;
+       if (yych != 'k') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'd') goto yy363;
+       if (yych != 'd') goto yy329;
        ++YYCURSOR;
-#line 650 "../src/parse/scanner_lex.re"
+#line 629 "../src/parse/scanner_lex.re"
        { return CONF_DEFINE_YYFILL_NAKED; }
-#line 3020 "src/parse/scanner_lex.cc"
-yy614:
+#line 2747 "src/parse/scanner_lex.cc"
+yy580:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy363;
+       if (yych != 'n') goto yy329;
        ++YYCURSOR;
-#line 651 "../src/parse/scanner_lex.re"
+#line 630 "../src/parse/scanner_lex.re"
        { return CONF_DEFINE_YYFILL_LEN; }
-#line 3029 "src/parse/scanner_lex.cc"
-yy618:
+#line 2756 "src/parse/scanner_lex.cc"
+yy584:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'T') goto yy363;
+       if (yych != 'T') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'C') goto yy621;
-       if (yych != 'S') goto yy363;
+       if (yych == 'C') goto yy587;
+       if (yych != 'S') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'T') goto yy637;
-       goto yy363;
-yy621:
+       if (yych == 'T') goto yy603;
+       goto yy329;
+yy587:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'O') goto yy363;
+       if (yych != 'O') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'N') goto yy363;
+       if (yych != 'N') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'D') goto yy363;
+       if (yych != 'D') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'I') goto yy363;
+       if (yych != 'I') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'T') goto yy363;
+       if (yych != 'T') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'I') goto yy363;
+       if (yych != 'I') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'O') goto yy363;
+       if (yych != 'O') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'N') goto yy363;
+       if (yych != 'N') goto yy329;
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych != ':') goto yy555;
+       if (yych != ':') goto yy521;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy363;
+       if (yych != 'n') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'a') goto yy363;
+       if (yych != 'a') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'k') goto yy363;
+       if (yych != 'k') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'd') goto yy363;
+       if (yych != 'd') goto yy329;
        ++YYCURSOR;
-#line 652 "../src/parse/scanner_lex.re"
+#line 631 "../src/parse/scanner_lex.re"
        { return CONF_DEFINE_YYGETCONDITION_NAKED; }
-#line 3072 "src/parse/scanner_lex.cc"
-yy637:
+#line 2799 "src/parse/scanner_lex.cc"
+yy603:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'A') goto yy363;
+       if (yych != 'A') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'T') goto yy363;
+       if (yych != 'T') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'E') goto yy363;
+       if (yych != 'E') goto yy329;
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych != ':') goto yy555;
+       if (yych != ':') goto yy521;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy363;
+       if (yych != 'n') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'a') goto yy363;
+       if (yych != 'a') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'k') goto yy363;
+       if (yych != 'k') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'd') goto yy363;
+       if (yych != 'd') goto yy329;
        ++YYCURSOR;
-#line 653 "../src/parse/scanner_lex.re"
+#line 632 "../src/parse/scanner_lex.re"
        { return CONF_DEFINE_YYGETSTATE_NAKED; }
-#line 3096 "src/parse/scanner_lex.cc"
-yy648:
+#line 2823 "src/parse/scanner_lex.cc"
+yy614:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'I') goto yy685;
-       goto yy363;
-yy649:
+       if (yych == 'I') goto yy651;
+       goto yy329;
+yy615:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'T') goto yy363;
+       if (yych != 'T') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'C') goto yy652;
-       if (yych != 'S') goto yy363;
+       if (yych == 'C') goto yy618;
+       if (yych != 'S') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'T') goto yy667;
-       goto yy363;
-yy652:
+       if (yych == 'T') goto yy633;
+       goto yy329;
+yy618:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'O') goto yy363;
+       if (yych != 'O') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'N') goto yy363;
+       if (yych != 'N') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'D') goto yy363;
+       if (yych != 'D') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'I') goto yy363;
+       if (yych != 'I') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'T') goto yy363;
+       if (yych != 'T') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'I') goto yy363;
+       if (yych != 'I') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'O') goto yy363;
+       if (yych != 'O') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'N') goto yy363;
+       if (yych != 'N') goto yy329;
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych != '@') goto yy555;
+       if (yych != '@') goto yy521;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'c') goto yy363;
+       if (yych != 'c') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'o') goto yy363;
+       if (yych != 'o') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy363;
+       if (yych != 'n') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'd') goto yy363;
+       if (yych != 'd') goto yy329;
        ++YYCURSOR;
-#line 654 "../src/parse/scanner_lex.re"
+#line 633 "../src/parse/scanner_lex.re"
        { return CONF_DEFINE_YYSETCONDITION_COND; }
-#line 3141 "src/parse/scanner_lex.cc"
-yy667:
+#line 2868 "src/parse/scanner_lex.cc"
+yy633:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'A') goto yy363;
+       if (yych != 'A') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'T') goto yy363;
+       if (yych != 'T') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'E') goto yy363;
+       if (yych != 'E') goto yy329;
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == ':') goto yy672;
-       if (yych != '@') goto yy555;
+       if (yych == ':') goto yy638;
+       if (yych != '@') goto yy521;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy679;
-       goto yy363;
-yy672:
+       if (yych == 's') goto yy645;
+       goto yy329;
+yy638:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy363;
+       if (yych != 'n') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'a') goto yy363;
+       if (yych != 'a') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'k') goto yy363;
+       if (yych != 'k') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'd') goto yy363;
+       if (yych != 'd') goto yy329;
        ++YYCURSOR;
-#line 655 "../src/parse/scanner_lex.re"
+#line 634 "../src/parse/scanner_lex.re"
        { return CONF_DEFINE_YYSETSTATE_NAKED; }
-#line 3170 "src/parse/scanner_lex.cc"
-yy679:
+#line 2897 "src/parse/scanner_lex.cc"
+yy645:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 't') goto yy363;
+       if (yych != 't') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'a') goto yy363;
+       if (yych != 'a') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 't') goto yy363;
+       if (yych != 't') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        ++YYCURSOR;
-#line 656 "../src/parse/scanner_lex.re"
+#line 635 "../src/parse/scanner_lex.re"
        { return CONF_DEFINE_YYSETSTATE_STATE; }
-#line 3183 "src/parse/scanner_lex.cc"
-yy685:
+#line 2910 "src/parse/scanner_lex.cc"
+yy651:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'P') goto yy558;
-       goto yy363;
-yy686:
+       if (yych == 'P') goto yy524;
+       goto yy329;
+yy652:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy734;
-       goto yy363;
-yy687:
+       if (yych == 'o') goto yy700;
+       goto yy329;
+yy653:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy363;
+       if (yych != 'n') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'd') goto yy363;
+       if (yych != 'd') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 'd') {
-               if (yych == ':') goto yy692;
-               goto yy363;
+               if (yych == ':') goto yy658;
+               goto yy329;
        } else {
-               if (yych <= 'e') goto yy691;
-               if (yych != 'p') goto yy363;
+               if (yych <= 'e') goto yy657;
+               if (yych != 'p') goto yy329;
        }
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy728;
-       goto yy363;
-yy691:
+       if (yych == 'r') goto yy694;
+       goto yy329;
+yy657:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy718;
-       goto yy363;
-yy692:
+       if (yych == 'n') goto yy684;
+       goto yy329;
+yy658:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy694;
-       if (yych != 'g') goto yy363;
+       if (yych == 'd') goto yy660;
+       if (yych != 'g') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy708;
-       goto yy363;
-yy694:
+       if (yych == 'o') goto yy674;
+       goto yy329;
+yy660:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy363;
+       if (yych != 'i') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'v') goto yy363;
+       if (yych != 'v') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy363;
+       if (yych != 'i') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'd') goto yy363;
+       if (yych != 'd') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'r') goto yy363;
+       if (yych != 'r') goto yy329;
        yyaccept = 2;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == '@') goto yy702;
-yy701:
-#line 645 "../src/parse/scanner_lex.re"
+       if (yych == '@') goto yy668;
+yy667:
+#line 624 "../src/parse/scanner_lex.re"
        { return CONF_COND_DIVIDER; }
-#line 3238 "src/parse/scanner_lex.cc"
-yy702:
+#line 2965 "src/parse/scanner_lex.cc"
+yy668:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'c') goto yy363;
+       if (yych != 'c') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'o') goto yy363;
+       if (yych != 'o') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy363;
+       if (yych != 'n') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'd') goto yy363;
+       if (yych != 'd') goto yy329;
        ++YYCURSOR;
-#line 646 "../src/parse/scanner_lex.re"
+#line 625 "../src/parse/scanner_lex.re"
        { return CONF_COND_DIVIDER_COND; }
-#line 3251 "src/parse/scanner_lex.cc"
-yy708:
+#line 2978 "src/parse/scanner_lex.cc"
+yy674:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 't') goto yy363;
+       if (yych != 't') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'o') goto yy363;
+       if (yych != 'o') goto yy329;
        yyaccept = 3;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == '@') goto yy712;
-yy711:
-#line 647 "../src/parse/scanner_lex.re"
+       if (yych == '@') goto yy678;
+yy677:
+#line 626 "../src/parse/scanner_lex.re"
        { return CONF_COND_GOTO; }
-#line 3263 "src/parse/scanner_lex.cc"
-yy712:
+#line 2990 "src/parse/scanner_lex.cc"
+yy678:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'c') goto yy363;
+       if (yych != 'c') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'o') goto yy363;
+       if (yych != 'o') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'n') goto yy363;
+       if (yych != 'n') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'd') goto yy363;
+       if (yych != 'd') goto yy329;
        ++YYCURSOR;
-#line 648 "../src/parse/scanner_lex.re"
+#line 627 "../src/parse/scanner_lex.re"
        { return CONF_COND_GOTO_COND; }
-#line 3276 "src/parse/scanner_lex.cc"
-yy718:
+#line 3003 "src/parse/scanner_lex.cc"
+yy684:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'u') goto yy363;
+       if (yych != 'u') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'm') goto yy363;
+       if (yych != 'm') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'p') goto yy363;
+       if (yych != 'p') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'r') goto yy363;
+       if (yych != 'r') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'f') goto yy363;
+       if (yych != 'f') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy363;
+       if (yych != 'i') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'x') goto yy363;
+       if (yych != 'x') goto yy329;
        ++YYCURSOR;
-#line 644 "../src/parse/scanner_lex.re"
+#line 623 "../src/parse/scanner_lex.re"
        { return CONF_CONDENUMPREFIX; }
-#line 3297 "src/parse/scanner_lex.cc"
-yy728:
+#line 3024 "src/parse/scanner_lex.cc"
+yy694:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'f') goto yy363;
+       if (yych != 'f') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'i') goto yy363;
+       if (yych != 'i') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'x') goto yy363;
+       if (yych != 'x') goto yy329;
        ++YYCURSOR;
-#line 643 "../src/parse/scanner_lex.re"
+#line 622 "../src/parse/scanner_lex.re"
        { return CONF_CONDPREFIX; }
-#line 3310 "src/parse/scanner_lex.cc"
-yy734:
+#line 3037 "src/parse/scanner_lex.cc"
+yy700:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 't') goto yy363;
+       if (yych != 't') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'o') goto yy363;
+       if (yych != 'o') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != ':') goto yy363;
+       if (yych != ':') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 't') goto yy363;
+       if (yych != 't') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'h') goto yy363;
+       if (yych != 'h') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'r') goto yy363;
+       if (yych != 'r') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy363;
+       if (yych != 'e') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 's') goto yy363;
+       if (yych != 's') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'h') goto yy363;
+       if (yych != 'h') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'o') goto yy363;
+       if (yych != 'o') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'l') goto yy363;
+       if (yych != 'l') goto yy329;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'd') goto yy363;
+       if (yych != 'd') goto yy329;
        ++YYCURSOR;
-#line 649 "../src/parse/scanner_lex.re"
+#line 628 "../src/parse/scanner_lex.re"
        { return CONF_CGOTO_THRESHOLD; }
-#line 3339 "src/parse/scanner_lex.cc"
+#line 3066 "src/parse/scanner_lex.cc"
 }
-#line 681 "../src/parse/scanner_lex.re"
+#line 660 "../src/parse/scanner_lex.re"
 
 
 conf_eq:
 
-#line 3346 "src/parse/scanner_lex.cc"
+#line 3073 "src/parse/scanner_lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -3382,143 +3109,136 @@ conf_eq:
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy752;
+               if (yych == '\t') goto yy718;
        } else {
-               if (yych <= ' ') goto yy752;
-               if (yych == '=') goto yy753;
+               if (yych <= ' ') goto yy718;
+               if (yych == '=') goto yy719;
        }
        ++YYCURSOR;
-yy751:
-#line 685 "../src/parse/scanner_lex.re"
+yy717:
+#line 664 "../src/parse/scanner_lex.re"
        { fatal ("missing '=' in configuration"); }
-#line 3395 "src/parse/scanner_lex.cc"
-yy752:
+#line 3122 "src/parse/scanner_lex.cc"
+yy718:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy757;
-               goto yy751;
+               if (yych == '\t') goto yy723;
+               goto yy717;
        } else {
-               if (yych <= ' ') goto yy757;
-               if (yych == '=') goto yy755;
-               goto yy751;
+               if (yych <= ' ') goto yy723;
+               if (yych == '=') goto yy721;
+               goto yy717;
        }
-yy753:
+yy719:
        ++YYCURSOR;
        yych = (YYCTYPE)*YYCURSOR;
-       goto yy756;
-yy754:
-#line 686 "../src/parse/scanner_lex.re"
+       goto yy722;
+yy720:
+#line 665 "../src/parse/scanner_lex.re"
        { goto conf_val; }
-#line 3413 "src/parse/scanner_lex.cc"
-yy755:
+#line 3140 "src/parse/scanner_lex.cc"
+yy721:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy756:
+yy722:
        if (yybm[0+yych] & 128) {
-               goto yy755;
+               goto yy721;
        }
-       goto yy754;
-yy757:
+       goto yy720;
+yy723:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy757;
+               if (yych == '\t') goto yy723;
        } else {
-               if (yych <= ' ') goto yy757;
-               if (yych == '=') goto yy755;
+               if (yych <= ' ') goto yy723;
+               if (yych == '=') goto yy721;
        }
        YYCURSOR = YYMARKER;
-       goto yy751;
+       goto yy717;
 }
-#line 687 "../src/parse/scanner_lex.re"
+#line 666 "../src/parse/scanner_lex.re"
 
 
 conf_val:
        tok = cur;
        lexer_state = LEX_NORMAL;
 
-#line 3443 "src/parse/scanner_lex.cc"
+#line 3170 "src/parse/scanner_lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 192,   0, 248, 248, 192, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               192, 248, 112, 248, 248, 248, 248, 168, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               252, 252, 252, 252, 252, 252, 252, 252, 
-               252, 252, 248, 192, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248,  32, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
-               248, 248, 248, 248, 248, 248, 248, 248, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128,   0,   0, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+                 0, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               192, 192, 192, 192, 192, 192, 192, 192, 
+               192, 192, 128,   0, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
+               128, 128, 128, 128, 128, 128, 128, 128, 
        };
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= '&') {
-               if (yych <= '\r') {
-                       if (yych <= 0x08) goto yy772;
-                       if (yych <= '\n') goto yy762;
-                       if (yych <= '\f') goto yy772;
+       if (yych <= '\'') {
+               if (yych <= ' ') {
+                       if (yych <= 0x08) goto yy736;
+                       if (yych <= '\n') goto yy728;
+                       if (yych <= 0x1F) goto yy736;
                } else {
-                       if (yych <= ' ') {
-                               if (yych <= 0x1F) goto yy772;
-                       } else {
-                               if (yych == '"') goto yy768;
-                               goto yy772;
-                       }
+                       if (yych == '"') goto yy734;
+                       if (yych <= '&') goto yy736;
+                       goto yy734;
                }
        } else {
-               if (yych <= '/') {
-                       if (yych <= '\'') goto yy770;
-                       if (yych == '-') goto yy765;
-                       goto yy772;
+               if (yych <= '0') {
+                       if (yych == '-') goto yy731;
+                       if (yych <= '/') goto yy736;
+                       goto yy729;
                } else {
-                       if (yych <= '9') {
-                               if (yych <= '0') goto yy763;
-                               goto yy766;
-                       } else {
-                               if (yych != ';') goto yy772;
-                       }
+                       if (yych <= '9') goto yy732;
+                       if (yych != ';') goto yy736;
                }
        }
-yy762:
-#line 709 "../src/parse/scanner_lex.re"
+yy728:
+#line 688 "../src/parse/scanner_lex.re"
        {
                yylval.str = new std::string (tok, tok_len ());
-               return STR;
+               return STRING;
        }
-#line 3515 "src/parse/scanner_lex.cc"
-yy763:
+#line 3235 "src/parse/scanner_lex.cc"
+yy729:
        ++YYCURSOR;
-       if (yybm[0+(yych = (YYCTYPE)*YYCURSOR)] & 32) {
-               goto yy772;
+       if (yybm[0+(yych = (YYCTYPE)*YYCURSOR)] & 128) {
+               goto yy736;
        }
-yy764:
-#line 694 "../src/parse/scanner_lex.re"
+yy730:
+#line 673 "../src/parse/scanner_lex.re"
        {
                if (!s_to_i32_unsafe (tok, cur, yylval.num))
                {
@@ -3526,173 +3246,352 @@ yy764:
                }
                return NUM;
        }
-#line 3530 "src/parse/scanner_lex.cc"
-yy765:
+#line 3250 "src/parse/scanner_lex.cc"
+yy731:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '0') goto yy773;
-       if (yych >= ':') goto yy773;
-yy766:
+       if (yych <= '0') goto yy737;
+       if (yych >= ':') goto yy737;
+yy732:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yybm[0+yych] & 4) {
-               goto yy766;
-       }
-       if (yych <= '\r') {
-               if (yych <= 0x08) goto yy772;
-               if (yych <= '\n') goto yy764;
-               if (yych <= '\f') goto yy772;
-               goto yy764;
-       } else {
-               if (yych <= ' ') {
-                       if (yych <= 0x1F) goto yy772;
-                       goto yy764;
-               } else {
-                       if (yych == ';') goto yy764;
-                       goto yy772;
-               }
-       }
-yy768:
-       YYMARKER = ++YYCURSOR;
-       if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
-       yych = (YYCTYPE)*YYCURSOR;
-       if (yybm[0+yych] & 8) {
-               goto yy768;
+       if (yybm[0+yych] & 64) {
+               goto yy732;
        }
-       if (yych <= ' ') {
-               if (yych == '\n') goto yy762;
-               goto yy783;
+       if (yych <= 0x1F) {
+               if (yych <= 0x08) goto yy736;
+               if (yych <= '\n') goto yy730;
+               goto yy736;
        } else {
-               if (yych <= '"') goto yy774;
-               if (yych <= ';') goto yy783;
-               goto yy782;
+               if (yych <= ' ') goto yy730;
+               if (yych == ';') goto yy730;
+               goto yy736;
        }
-yy770:
-       YYMARKER = ++YYCURSOR;
-       if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
-       yych = (YYCTYPE)*YYCURSOR;
-       if (yybm[0+yych] & 16) {
-               goto yy770;
-       }
-       if (yych <= ' ') {
-               if (yych == '\n') goto yy762;
-               goto yy777;
-       } else {
-               if (yych <= '\'') goto yy774;
-               if (yych <= ';') goto yy777;
-               goto yy776;
+yy734:
+       ++YYCURSOR;
+#line 681 "../src/parse/scanner_lex.re"
+       {
+               std::vector<uint32_t> cpoints;
+               lex_cpoints (tok[0], cpoints);
+               yylval.str = cpoint_conf (cpoints);
+               return STRING;
        }
-yy772:
+#line 3280 "src/parse/scanner_lex.cc"
+yy736:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy773:
-       if (yybm[0+yych] & 32) {
-               goto yy772;
-       }
-       goto yy762;
-yy774:
-       ++YYCURSOR;
-       if (yybm[0+(yych = (YYCTYPE)*YYCURSOR)] & 32) {
-               goto yy772;
+yy737:
+       if (yybm[0+yych] & 128) {
+               goto yy736;
        }
-yy775:
-#line 702 "../src/parse/scanner_lex.re"
+       goto yy728;
+}
+#line 692 "../src/parse/scanner_lex.re"
+
+}
+
+static void escape (std::string & dest, const std::string & src)
+{
+       dest = src;
+       size_t l = dest.length();
+       for (size_t p = 0; p < l; ++p)
        {
-               yylval.str = new std::string ();
-               SubStr s (tok + 1, tok_len () - 2); // skip quotes
-               unescape (s, *(yylval.str));
-               return STR;
+               if (dest[p] == '\\')
+               {
+                       dest.insert(++p, "\\");
+                       ++l;
+               }
        }
-#line 3608 "src/parse/scanner_lex.cc"
-yy776:
-       YYMARKER = ++YYCURSOR;
-       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+}
+
+void Scanner::lex_cpoints (char quote, std::vector<uint32_t> & cs)
+{
+       for (;;)
+       {
+               tok = cur;
+       
+#line 3315 "src/parse/scanner_lex.cc"
+{
+       YYCTYPE yych;
+       unsigned int yyaccept = 0;
+       if ((YYLIMIT - YYCURSOR) < 10) YYFILL(10);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= '\r') {
-               if (yych <= '\t') {
-                       if (yych <= 0x08) goto yy770;
+       if (yych == '\n') goto yy742;
+       if (yych == '\\') goto yy744;
+       ++YYCURSOR;
+#line 734 "../src/parse/scanner_lex.re"
+       {
+                       const char c = tok[0];
+                       if (c == quote)
+                       {
+                               return;
+                       }
+                       else
+                       {
+                               cs.push_back (static_cast<uint8_t> (c));
+                               continue;
+                       }
+               }
+#line 3337 "src/parse/scanner_lex.cc"
+yy742:
+       ++YYCURSOR;
+#line 715 "../src/parse/scanner_lex.re"
+       { fatal ((tok - pos) - tchar, "syntax error"); }
+#line 3342 "src/parse/scanner_lex.cc"
+yy744:
+       ++YYCURSOR;
+       if ((yych = (YYCTYPE)*YYCURSOR) <= 'b') {
+               if (yych <= 'T') {
+                       if (yych <= '/') {
+                               if (yych != '\n') goto yy746;
+                       } else {
+                               if (yych <= '3') goto yy748;
+                               if (yych <= '7') goto yy750;
+                               goto yy746;
+                       }
                } else {
-                       if (yych <= '\n') goto yy762;
-                       if (yych <= '\f') goto yy770;
+                       if (yych <= 'X') {
+                               if (yych <= 'U') goto yy751;
+                               if (yych <= 'W') goto yy746;
+                               goto yy753;
+                       } else {
+                               if (yych == '\\') goto yy754;
+                               if (yych <= '`') goto yy746;
+                               goto yy754;
+                       }
                }
        } else {
-               if (yych <= ' ') {
-                       if (yych <= 0x1F) goto yy770;
+               if (yych <= 'r') {
+                       if (yych <= 'm') {
+                               if (yych == 'f') goto yy754;
+                               goto yy746;
+                       } else {
+                               if (yych <= 'n') goto yy754;
+                               if (yych <= 'q') goto yy746;
+                               goto yy754;
+                       }
                } else {
-                       if (yych != ';') goto yy770;
+                       if (yych <= 'u') {
+                               if (yych <= 's') goto yy746;
+                               if (yych <= 't') goto yy754;
+                               goto yy753;
+                       } else {
+                               if (yych <= 'v') goto yy754;
+                               if (yych == 'x') goto yy756;
+                               goto yy746;
+                       }
                }
        }
-yy777:
+#line 718 "../src/parse/scanner_lex.re"
+       { fatal ((tok - pos) - tchar, "syntax error in escape sequence"); }
+#line 3389 "src/parse/scanner_lex.cc"
+yy746:
        ++YYCURSOR;
-       if (YYLIMIT <= YYCURSOR) YYFILL(1);
-       yych = (YYCTYPE)*YYCURSOR;
-       if (yybm[0+yych] & 64) {
-               goto yy777;
-       }
-       if (yych <= '\n') goto yy779;
-       if (yych <= '\'') goto yy780;
-       goto yy781;
-yy779:
-       YYCURSOR = YYMARKER;
-       goto yy762;
-yy780:
+#line 724 "../src/parse/scanner_lex.re"
+       {
+                       const char c = tok[1];
+                       if (c != quote)
+                       {
+                               warn.useless_escape (tline, tok - pos, c);
+                       }
+                       cs.push_back (static_cast<uint8_t> (c));
+                       continue;
+               }
+#line 3402 "src/parse/scanner_lex.cc"
+yy748:
+       yyaccept = 0;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= '/') goto yy749;
+       if (yych <= '7') goto yy771;
+yy749:
+#line 717 "../src/parse/scanner_lex.re"
+       { fatal ((tok - pos) - tchar, "syntax error in octal escape sequence"); }
+#line 3411 "src/parse/scanner_lex.cc"
+yy750:
        yych = (YYCTYPE)*++YYCURSOR;
-       goto yy775;
-yy781:
+       goto yy749;
+yy751:
+       yyaccept = 1;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= '@') {
+               if (yych <= '/') goto yy752;
+               if (yych <= '9') goto yy764;
+       } else {
+               if (yych <= 'F') goto yy764;
+               if (yych <= '`') goto yy752;
+               if (yych <= 'f') goto yy764;
+       }
+yy752:
+#line 716 "../src/parse/scanner_lex.re"
+       { fatal ((tok - pos) - tchar, "syntax error in hexadecimal escape sequence"); }
+#line 3429 "src/parse/scanner_lex.cc"
+yy753:
+       yyaccept = 1;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= '@') {
+               if (yych <= '/') goto yy752;
+               if (yych <= '9') goto yy761;
+               goto yy752;
+       } else {
+               if (yych <= 'F') goto yy761;
+               if (yych <= '`') goto yy752;
+               if (yych <= 'f') goto yy761;
+               goto yy752;
+       }
+yy754:
        ++YYCURSOR;
-       if (YYLIMIT <= YYCURSOR) YYFILL(1);
-       yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy779;
-       goto yy777;
-yy782:
-       YYMARKER = ++YYCURSOR;
-       if (YYLIMIT <= YYCURSOR) YYFILL(1);
-       yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= '\r') {
-               if (yych <= '\t') {
-                       if (yych <= 0x08) goto yy768;
-               } else {
-                       if (yych <= '\n') goto yy762;
-                       if (yych <= '\f') goto yy768;
-               }
+#line 722 "../src/parse/scanner_lex.re"
+       { cs.push_back (unesc_simple (tok));   continue; }
+#line 3447 "src/parse/scanner_lex.cc"
+yy756:
+       yyaccept = 1;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= '@') {
+               if (yych <= '/') goto yy752;
+               if (yych >= ':') goto yy752;
        } else {
-               if (yych <= ' ') {
-                       if (yych <= 0x1F) goto yy768;
-               } else {
-                       if (yych != ';') goto yy768;
-               }
+               if (yych <= 'F') goto yy757;
+               if (yych <= '`') goto yy752;
+               if (yych >= 'g') goto yy752;
        }
-yy783:
+yy757:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy758;
+               if (yych <= '9') goto yy759;
+       } else {
+               if (yych <= 'F') goto yy759;
+               if (yych <= '`') goto yy758;
+               if (yych <= 'f') goto yy759;
+       }
+yy758:
+       YYCURSOR = YYMARKER;
+       if (yyaccept == 0) {
+               goto yy749;
+       } else {
+               goto yy752;
+       }
+yy759:
        ++YYCURSOR;
-       if (YYLIMIT <= YYCURSOR) YYFILL(1);
-       yych = (YYCTYPE)*YYCURSOR;
-       if (yybm[0+yych] & 128) {
-               goto yy783;
+#line 720 "../src/parse/scanner_lex.re"
+       { cs.push_back (unesc_hex (tok, cur)); continue; }
+#line 3480 "src/parse/scanner_lex.cc"
+yy761:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy758;
+               if (yych >= ':') goto yy758;
+       } else {
+               if (yych <= 'F') goto yy762;
+               if (yych <= '`') goto yy758;
+               if (yych >= 'g') goto yy758;
+       }
+yy762:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy758;
+               if (yych >= ':') goto yy758;
+       } else {
+               if (yych <= 'F') goto yy763;
+               if (yych <= '`') goto yy758;
+               if (yych >= 'g') goto yy758;
+       }
+yy763:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy758;
+               if (yych <= '9') goto yy759;
+               goto yy758;
+       } else {
+               if (yych <= 'F') goto yy759;
+               if (yych <= '`') goto yy758;
+               if (yych <= 'f') goto yy759;
+               goto yy758;
+       }
+yy764:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy758;
+               if (yych >= ':') goto yy758;
+       } else {
+               if (yych <= 'F') goto yy765;
+               if (yych <= '`') goto yy758;
+               if (yych >= 'g') goto yy758;
+       }
+yy765:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy758;
+               if (yych >= ':') goto yy758;
+       } else {
+               if (yych <= 'F') goto yy766;
+               if (yych <= '`') goto yy758;
+               if (yych >= 'g') goto yy758;
+       }
+yy766:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy758;
+               if (yych >= ':') goto yy758;
+       } else {
+               if (yych <= 'F') goto yy767;
+               if (yych <= '`') goto yy758;
+               if (yych >= 'g') goto yy758;
+       }
+yy767:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy758;
+               if (yych >= ':') goto yy758;
+       } else {
+               if (yych <= 'F') goto yy768;
+               if (yych <= '`') goto yy758;
+               if (yych >= 'g') goto yy758;
+       }
+yy768:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy758;
+               if (yych >= ':') goto yy758;
+       } else {
+               if (yych <= 'F') goto yy769;
+               if (yych <= '`') goto yy758;
+               if (yych >= 'g') goto yy758;
+       }
+yy769:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy758;
+               if (yych >= ':') goto yy758;
+       } else {
+               if (yych <= 'F') goto yy770;
+               if (yych <= '`') goto yy758;
+               if (yych >= 'g') goto yy758;
+       }
+yy770:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy758;
+               if (yych <= '9') goto yy759;
+               goto yy758;
+       } else {
+               if (yych <= 'F') goto yy759;
+               if (yych <= '`') goto yy758;
+               if (yych <= 'f') goto yy759;
+               goto yy758;
        }
-       if (yych <= '\n') goto yy779;
-       if (yych <= '"') goto yy780;
+yy771:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '/') goto yy758;
+       if (yych >= '8') goto yy758;
        ++YYCURSOR;
-       if (YYLIMIT <= YYCURSOR) YYFILL(1);
-       yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy779;
-       goto yy783;
-}
-#line 713 "../src/parse/scanner_lex.re"
-
+#line 721 "../src/parse/scanner_lex.re"
+       { cs.push_back (unesc_oct (tok, cur)); continue; }
+#line 3592 "src/parse/scanner_lex.cc"
 }
+#line 746 "../src/parse/scanner_lex.re"
 
-static void escape (std::string & dest, const std::string & src)
-{
-       dest = src;
-       size_t l = dest.length();
-       for (size_t p = 0; p < l; ++p)
-       {
-               if (dest[p] == '\\')
-               {
-                       dest.insert(++p, "\\");
-                       ++l;
-               }
        }
 }
 
@@ -3701,7 +3600,7 @@ void Scanner::set_sourceline ()
 sourceline:
        tok = cur;
 
-#line 3705 "src/parse/scanner_lex.cc"
+#line 3604 "src/parse/scanner_lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -3741,23 +3640,23 @@ sourceline:
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '!') {
-               if (yych == '\n') goto yy790;
+               if (yych == '\n') goto yy778;
        } else {
-               if (yych <= '"') goto yy792;
-               if (yych <= '0') goto yy788;
-               if (yych <= '9') goto yy793;
+               if (yych <= '"') goto yy780;
+               if (yych <= '0') goto yy776;
+               if (yych <= '9') goto yy781;
        }
-yy788:
+yy776:
        ++YYCURSOR;
-yy789:
-#line 758 "../src/parse/scanner_lex.re"
+yy777:
+#line 778 "../src/parse/scanner_lex.re"
        {
                                        goto sourceline;
                                }
-#line 3758 "src/parse/scanner_lex.cc"
-yy790:
+#line 3657 "src/parse/scanner_lex.cc"
+yy778:
        ++YYCURSOR;
-#line 746 "../src/parse/scanner_lex.re"
+#line 766 "../src/parse/scanner_lex.re"
        {
                                        if (cur == eof)
                                        {
@@ -3770,17 +3669,17 @@ yy790:
                                        tok = cur;
                                        return; 
                                }
-#line 3774 "src/parse/scanner_lex.cc"
-yy792:
+#line 3673 "src/parse/scanner_lex.cc"
+yy780:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == '\n') goto yy789;
-       goto yy798;
-yy793:
+       if (yych == '\n') goto yy777;
+       goto yy786;
+yy781:
        ++YYCURSOR;
        yych = (YYCTYPE)*YYCURSOR;
-       goto yy796;
-yy794:
-#line 735 "../src/parse/scanner_lex.re"
+       goto yy784;
+yy782:
+#line 755 "../src/parse/scanner_lex.re"
        {
                                        if (!s_to_u32_unsafe (tok, cur, cline))
                                        {
@@ -3788,46 +3687,46 @@ yy794:
                                        }
                                        goto sourceline; 
                                }
-#line 3792 "src/parse/scanner_lex.cc"
-yy795:
+#line 3691 "src/parse/scanner_lex.cc"
+yy783:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy796:
+yy784:
        if (yybm[0+yych] & 64) {
-               goto yy795;
+               goto yy783;
        }
-       goto yy794;
-yy797:
+       goto yy782;
+yy785:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy798:
+yy786:
        if (yybm[0+yych] & 128) {
-               goto yy797;
+               goto yy785;
        }
-       if (yych <= '\n') goto yy799;
-       if (yych <= '"') goto yy801;
-       goto yy800;
-yy799:
+       if (yych <= '\n') goto yy787;
+       if (yych <= '"') goto yy789;
+       goto yy788;
+yy787:
        YYCURSOR = YYMARKER;
-       goto yy789;
-yy800:
+       goto yy777;
+yy788:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == '\n') goto yy799;
-       goto yy797;
-yy801:
+       if (yych == '\n') goto yy787;
+       goto yy785;
+yy789:
        ++YYCURSOR;
-#line 742 "../src/parse/scanner_lex.re"
+#line 762 "../src/parse/scanner_lex.re"
        {
                                        escape (in.file_name, std::string (tok + 1, tok_len () - 2)); // -2 to omit quotes
                                        goto sourceline; 
                                }
-#line 3829 "src/parse/scanner_lex.cc"
+#line 3728 "src/parse/scanner_lex.cc"
 }
-#line 761 "../src/parse/scanner_lex.re"
+#line 781 "../src/parse/scanner_lex.re"
 
 }
 
index 2771441f02c386919b3634abf178ac8897f76ffe..00a2507696bd8e1499b7f1163bb87e7eb9acae85 100644 (file)
@@ -199,6 +199,25 @@ RegExp * Scanner::cpoint_class (const std::vector<uint32_t> & cs, bool neg) cons
        return matchSymbolRange (r);
 }
 
+std::string * Scanner::cpoint_conf (const std::vector<uint32_t> & cs) const
+{
+       const size_t n = cs.size ();
+       std::string * s = new std::string;
+       for (size_t i = 0; i < n; ++i)
+       {
+               const uint32_t c = cs[i];
+               if (c > 0xFF)
+               {
+                       fatalf ("multibyte character in configuration string: 0x%X", c);
+               }
+               else
+               {
+                       *s += static_cast<char> (c);
+               }
+       }
+       return s;
+}
+
 RegExp * Scanner::mkDiff (RegExp * e1, RegExp * e2) const
 {
        MatchOp * m1 = dynamic_cast<MatchOp *> (e1);
index 1869a633ca79d2296559fe96f0c5b8f08403d7e0..1e58d3a0b83765c2496f70c9ce48316082d35792 100644 (file)
@@ -206,21 +206,19 @@ void default_rule(CondList *clist, const Code * code)
 %token FID_END
 %token NOCOND
 %token NUM
-%token RANGE
+%token REGEXP
 %token SETUP
 %token STAR
-%token STR
 %token STRING
 
-%type <op>     CLOSE STAR SETUP close
-%type <extop>  CLOSESIZE
-%type <code>   CODE
-%type <regexp> RANGE STRING
-%type <regexp> rule look expr diff term factor primary
-%type <str>    ID FID STR CONF newcond
-%type <clist>  cond clist
-%type <num>    NUM
-%type <enc>    CONF_FLAGS
+%type <op>      CLOSE STAR SETUP close
+%type <extop>   CLOSESIZE
+%type <code>    CODE
+%type <regexp>  REGEXP rule look expr diff term factor primary
+%type <str>     ID FID CONF STRING newcond
+%type <clist>   cond clist
+%type <num>     NUM
+%type <enc>     CONF_FLAGS
 
 %%
 
@@ -262,37 +260,44 @@ decl:
                {
                        in->fatal("trailing contexts are not allowed in named definitions");
                }
-       | CONF STR ';'
+       | CONF STRING ';'
        {
                if (!mapCodeName.insert (std::make_pair (*$1, *$2)).second)
                {
                        in->fatalf ("configuration '%s' is already set and cannot be changed", $1->c_str ());
                }
                delete $1;
+               delete $2;
        }
-       | CONF_CONDPREFIX STR ';'
+       | CONF_CONDPREFIX STRING ';'
        {
                condPrefix = *$2;
+               delete $2;
        }
-       | CONF_CONDENUMPREFIX STR ';'
+       | CONF_CONDENUMPREFIX STRING ';'
        {
                condEnumPrefix = *$2;
+               delete $2;
        }
-       | CONF_COND_DIVIDER STR ';'
+       | CONF_COND_DIVIDER STRING ';'
        {
                condDivider = *$2;
+               delete $2;
        }
-       | CONF_COND_DIVIDER_COND STR ';'
+       | CONF_COND_DIVIDER_COND STRING ';'
        {
                condDividerParam = *$2;
+               delete $2;
        }
-       | CONF_COND_GOTO STR ';'
+       | CONF_COND_GOTO STRING ';'
        {
                condGoto = *$2;
+               delete $2;
        }
-       | CONF_COND_GOTO_COND STR ';'
+       | CONF_COND_GOTO_COND STRING ';'
        {
                condGotoParam = *$2;
+               delete $2;
        }
        | CONF_CGOTO_THRESHOLD NUM ';'
        {
@@ -302,10 +307,11 @@ decl:
        {
                bUseYYFillNaked = $2 != 0;
        }
-       | CONF_DEFINE_YYFILL_LEN STR ';'
+       | CONF_DEFINE_YYFILL_LEN STRING ';'
        {
                yyFillLength = *$2;
                bUseYYFillParam = false;
+               delete $2;
        }
        | CONF_DEFINE_YYGETCONDITION_NAKED NUM ';'
        {
@@ -315,19 +321,21 @@ decl:
        {
                bUseYYGetStateNaked = $2 != 0;
        }
-       | CONF_DEFINE_YYSETCONDITION_COND STR ';'
+       | CONF_DEFINE_YYSETCONDITION_COND STRING ';'
        {
                yySetConditionParam = *$2;
                bUseYYSetConditionParam = false;
+               delete $2;
        }
        | CONF_DEFINE_YYSETSTATE_NAKED NUM ';'
        {
                bUseYYSetStateNaked = $2 != 0;
        }
-       | CONF_DEFINE_YYSETSTATE_STATE STR ';'
+       | CONF_DEFINE_YYSETSTATE_STATE STRING ';'
        {
                yySetStateParam = *$2;
                bUseYYSetStateParam = false;
+               delete $2;
        }
        | CONF_FLAGS NUM ';'
        {
@@ -342,9 +350,10 @@ decl:
                                , Enc::name (encoding.type ()));
                }
        }
-       | CONF_INDENT_STRING STR ';'
+       | CONF_INDENT_STRING STRING ';'
        {
                indString = *$2;
+               delete $2;
        }
        | CONF_INDENT_TOP NUM ';'
        {
@@ -354,17 +363,19 @@ decl:
                }
                topIndent = $2;
        }
-       | CONF_LABELPREFIX STR ';'
+       | CONF_LABELPREFIX STRING ';'
        {
                labelPrefix = *$2;
+               delete $2;
        }
        | CONF_STARTLABEL NUM ';'
        {
                in->out.set_force_start_label ($2 != 0);
        }
-       | CONF_STARTLABEL STR ';'
+       | CONF_STARTLABEL STRING ';'
        {
                in->out.set_user_start_label (*$2);
+               delete $2;
        }
        | CONF_STATE_ABORT NUM ';'
        {
@@ -661,11 +672,7 @@ primary:
                        }
                        $$ = i->second;
                }
-       |       RANGE
-               {
-                       $$ = $1;
-               }
-       |       STRING
+       |       REGEXP
                {
                        $$ = $1;
                }
index 79fe665aa5c2597f5ec6635a3d8362d191f05043..41475b712aedee4adcac9705fe99c9fcbf793dcc 100644 (file)
@@ -10,7 +10,6 @@
 #include "src/parse/input.h"
 #include "src/util/attribute.h"
 #include "src/util/forbid_copy.h"
-#include "src/util/substr.h"
 
 namespace re2c
 {
@@ -60,6 +59,7 @@ public:
 private:
        void fill (uint32_t);
        void set_sourceline ();
+       void lex_cpoints (char quote, std::vector<uint32_t> & cs);
        size_t tok_len () const;
 
 public:
@@ -90,9 +90,6 @@ public:
        void fatal(const char*) const;
        void fatal(ptrdiff_t, const char*) const;
 
-       uint32_t unescape(SubStr &s) const;
-       std::string& unescape(SubStr& str_in, std::string& str_out) const;
-
        RegExp * matchSymbol (uint32_t c) const;
        RegExp * matchSymbolRange (Range * r) const;
        RegExp * mkDiff (RegExp * e1, RegExp * e2) const;
@@ -100,6 +97,7 @@ public:
        RegExp * mkDefault () const;
        RegExp * cpoint_string (const std::vector<uint32_t> & cs, bool case_sensitive) const;
        RegExp * cpoint_class (const std::vector<uint32_t> & cs, bool neg) const;
+       std::string * cpoint_conf (const std::vector<uint32_t> & cs) const;
 
        FORBID_COPY (Scanner);
 };
index 976dcf58ca7df4a8a357f2fddf07f16f7651c8b2..290bcebfa0bb211b2b6fe59b2370bd957f07dd72 100644 (file)
@@ -50,6 +50,9 @@ lineinf = lineno (space+ dstring)? eol;
        esc_hex = esc ("x" hex_digit{2} | [uX] hex_digit{4} | "U" hex_digit{8});
        esc_oct = esc [0-3] [0-7]{2}; // max 1-byte octal value is '\377'
        esc_simple = esc [abfnrtv\\];
+
+       naked_char = . \ (space | [;]);
+       naked      = "" | (naked_char \ ['"]) naked_char*;
 */
 
 Scanner::ParseMode Scanner::echo()
@@ -214,9 +217,6 @@ int Scanner::scan()
 {
        uint32_t depth;
 
-       char quote;
-       bool negated_class = false;
-       std::vector<uint32_t> cpoints;
 scan:
        tchar = cur - pos;
        tline = cline;
@@ -259,9 +259,34 @@ start:
                                        return 0;
                                }
 
-       ['"] { quote = tok[0];                    goto cpoints; }
-       "["  { quote = ']';                       goto cpoints; }
-       "[^" { quote = ']'; negated_class = true; goto cpoints; }
+       "'"
+       {
+               std::vector<uint32_t> cpoints;
+               lex_cpoints ('\'', cpoints);
+               yylval.regexp = cpoint_string (cpoints, bCaseInsensitive || !bCaseInverted);
+               return REGEXP;
+       }
+       "\""
+       {
+               std::vector<uint32_t> cpoints;
+               lex_cpoints ('"', cpoints);
+               yylval.regexp = cpoint_string (cpoints, bCaseInsensitive || bCaseInverted);
+               return REGEXP;
+       }
+       "["
+       {
+               std::vector<uint32_t> cpoints;
+               lex_cpoints (']', cpoints);
+               yylval.regexp = cpoint_class (cpoints, false);
+               return REGEXP;
+       }
+       "[^"
+       {
+               std::vector<uint32_t> cpoints;
+               lex_cpoints (']', cpoints);
+               yylval.regexp = cpoint_class (cpoints, true);
+               return REGEXP;
+       }
 
        "<>" / (space* ("{" | "=>" | ":=")) {
                                        return NOCOND;
@@ -350,18 +375,19 @@ start:
                                                yylval.str = new std::string (tok, tok_len ());
                                                return ID;
                                        } else {
+                                               std::vector<uint32_t> cpoints;
                                                for (char * p = tok; p < cur; ++p)
                                                {
                                                        cpoints.push_back (static_cast<uint8_t> (*p));
                                                }
                                                yylval.regexp = cpoint_string (cpoints, bCaseInsensitive || bCaseInverted);
-                                               return STRING;
+                                               return REGEXP;
                                        }
                                }
 
        "."                     {
                                        yylval.regexp = mkDot();
-                                       return RANGE;
+                                       return REGEXP;
                                }
 
        space+          {
@@ -401,53 +427,6 @@ flex_name:
        }
 */
 
-cpoints:
-       tok = cur;
-/*!re2c
-       *          { fatal ((tok - pos) - tchar, "syntax error"); }
-       esc [xXuU] { fatal ((tok - pos) - tchar, "syntax error in hexadecimal escape sequence"); }
-       esc [0-7]  { fatal ((tok - pos) - tchar, "syntax error in octal escape sequence"); }
-       esc        { fatal ((tok - pos) - tchar, "syntax error in escape sequence"); }
-
-       esc_hex    { cpoints.push_back (unesc_hex (tok, cur)); goto cpoints; }
-       esc_oct    { cpoints.push_back (unesc_oct (tok, cur)); goto cpoints; }
-       esc_simple { cpoints.push_back (unesc_simple (tok));   goto cpoints; }
-       esc .
-       {
-               const char c = tok[1];
-               if (c != quote)
-               {
-                       warn.useless_escape (tline, tok - pos, c);
-               }
-               cpoints.push_back (static_cast<uint8_t> (c));
-               goto cpoints;
-       }
-       . \ esc
-       {
-               const char c = tok[0];
-               if (c == quote)
-               {
-                       switch (quote)
-                       {
-                               case ']':
-                                       yylval.regexp = cpoint_class (cpoints, negated_class);
-                                       return RANGE;
-                               case '\'':
-                                       yylval.regexp = cpoint_string (cpoints, bCaseInsensitive || !bCaseInverted);
-                                       return STRING;
-                               case '"':
-                                       yylval.regexp = cpoint_string (cpoints, bCaseInsensitive || bCaseInverted);
-                                       return STRING;
-                       }
-               }
-               else
-               {
-                       cpoints.push_back (static_cast<uint8_t> (c));
-                       goto cpoints;
-               }
-       }
-*/
-
 code:
 /*!re2c
        "}"                     {
@@ -698,17 +677,17 @@ conf_val:
                }
                return NUM;
        }
-       dstring | sstring
+       ['"]
        {
-               yylval.str = new std::string ();
-               SubStr s (tok + 1, tok_len () - 2); // skip quotes
-               unescape (s, *(yylval.str));
-               return STR;
+               std::vector<uint32_t> cpoints;
+               lex_cpoints (tok[0], cpoints);
+               yylval.str = cpoint_conf (cpoints);
+               return STRING;
        }
-       [^\r\n; \t]*
+       naked
        {
                yylval.str = new std::string (tok, tok_len ());
-               return STR;
+               return STRING;
        }
 */
 }
@@ -727,6 +706,47 @@ static void escape (std::string & dest, const std::string & src)
        }
 }
 
+void Scanner::lex_cpoints (char quote, std::vector<uint32_t> & cs)
+{
+       for (;;)
+       {
+               tok = cur;
+       /*!re2c
+               *          { fatal ((tok - pos) - tchar, "syntax error"); }
+               esc [xXuU] { fatal ((tok - pos) - tchar, "syntax error in hexadecimal escape sequence"); }
+               esc [0-7]  { fatal ((tok - pos) - tchar, "syntax error in octal escape sequence"); }
+               esc        { fatal ((tok - pos) - tchar, "syntax error in escape sequence"); }
+
+               esc_hex    { cs.push_back (unesc_hex (tok, cur)); continue; }
+               esc_oct    { cs.push_back (unesc_oct (tok, cur)); continue; }
+               esc_simple { cs.push_back (unesc_simple (tok));   continue; }
+               esc .
+               {
+                       const char c = tok[1];
+                       if (c != quote)
+                       {
+                               warn.useless_escape (tline, tok - pos, c);
+                       }
+                       cs.push_back (static_cast<uint8_t> (c));
+                       continue;
+               }
+               . \ esc
+               {
+                       const char c = tok[0];
+                       if (c == quote)
+                       {
+                               return;
+                       }
+                       else
+                       {
+                               cs.push_back (static_cast<uint8_t> (c));
+                               continue;
+                       }
+               }
+       */
+       }
+}
+
 void Scanner::set_sourceline ()
 {
 sourceline:
index 3cdf34193095d63a324b13041dc8d386b5c8a331..c2df9e0c2e1a535e583145ffbc5369c80936e4e3 100644 (file)
@@ -77,216 +77,4 @@ uint32_t unesc_oct (const char * s, const char * s_end)
        return n;
 }
 
-uint32_t Scanner::unescape(SubStr &s) const
-{
-       static const char * hex = "0123456789abcdef";
-       static const char * oct = "01234567";
-
-       s.len--;
-       uint32_t c, ucb = 0;
-
-       if ((c = *s.str++) != '\\' || s.len == 0)
-       {
-               return c;
-       }
-
-       s.len--;
-
-       switch (c = *s.str++)
-       {
-               case 'n': return '\n';
-               case 't': return '\t';
-               case 'v': return '\v';
-               case 'b': return '\b';
-               case 'r': return '\r';
-               case 'f': return '\f';
-               case 'a': return '\a';
-
-               case 'x':
-               {
-                       if (s.len < 2)
-                       {
-                               fatal(s.ofs()+s.len, "Illegal hexadecimal character code, two hexadecimal digits are required");
-                               return ~0u;
-                       }
-                       
-                       const char *p1 = strchr(hex, tolower(s.str[0]));
-                       const char *p2 = strchr(hex, tolower(s.str[1]));
-
-                       if (!p1 || !p2)
-                       {
-                               fatal(s.ofs()+(p1?1:0), "Illegal hexadecimal character code");
-                               return ~0u;
-                       }
-                       else
-                       {
-                               s.len -= 2;
-                               s.str += 2;
-                               
-                               uint32_t v = (uint32_t)((p1 - hex) << 4) 
-                                      + (uint32_t)((p2 - hex));
-       
-                               return v;
-                       }
-               }
-
-               case 'U':
-               {
-                       if (s.len < 8)
-                       {
-                               fatal(s.ofs()+s.len, "Illegal unicode character, eight hexadecimal digits are required");
-                               return ~0u;
-                       }
-
-                       uint32_t l = 0;
-                       if (s.str[0] == '0')
-                       {
-                               l++;
-                               if (s.str[1] == '0')
-                               {
-                                       l++;
-                                       if (s.str[2] == '0' || (s.str[2] == '1' && encoding.szCodePoint() == 4))
-                                       {
-                                               l++;
-                                               if (encoding.szCodePoint() == 4)
-                                               {
-                                                       const char *u3 = strchr(hex, tolower(s.str[2]));
-                                                       const char *u4 = strchr(hex, tolower(s.str[3]));
-                                                       if (u3 && u4)
-                                                       {
-                                                               ucb = (uint32_t)((u3 - hex) << 20)
-                                                               + (uint32_t)((u4 - hex) << 16);
-                                                               l++;
-                                                       }
-                                               }
-                                               else if (s.str[3] == '0')
-                                               {
-                                                       l++;
-                                               }
-                                       }
-                               }
-                       }
-
-                       if (l != 4)
-                       {
-                               fatal(s.ofs()+l, "Illegal unicode character, eight hexadecimal digits are required");
-                       }
-
-                       s.len -= 4;
-                       s.str += 4;
-                       
-                       // no break;
-               }
-               case 'X':
-               case 'u':
-               {
-                       if (s.len < 4)
-                       {
-                               fatal(s.ofs()+s.len, 
-                                       c == 'X'
-                                       ? "Illegal hexadecimal character code, four hexadecimal digits are required"
-                                       : "Illegal unicode character, four hexadecimal digits are required");
-                               return ~0u;
-                       }
-                       
-                       const char *p1 = strchr(hex, tolower(s.str[0]));
-                       const char *p2 = strchr(hex, tolower(s.str[1]));
-                       const char *p3 = strchr(hex, tolower(s.str[2]));
-                       const char *p4 = strchr(hex, tolower(s.str[3]));
-
-                       if (!p1 || !p2 || !p3 || !p4)
-                       {
-                               fatal(s.ofs()+(p1?1:0)+(p2?1:0)+(p3?1:0), 
-                                       c == 'X'
-                                       ? "Illegal hexadecimal character code, non hexxdecimal digit found"
-                                       : "Illegal unicode character, non hexadecimal digit found");
-                               return ~0u;
-                       }
-                       else
-                       {
-                               s.len -= 4;
-                               s.str += 4;
-                               
-                               uint32_t v = (uint32_t)((p1 - hex) << 12) 
-                                      + (uint32_t)((p2 - hex) <<  8)
-                                      + (uint32_t)((p3 - hex) <<  4)
-                                      + (uint32_t)((p4 - hex))
-                                      + ucb;
-       
-                               if (v >= encoding.nCodePoints())
-                               {
-                                       fatal(s.ofs(),
-                                               c == 'X'
-                                               ? "Illegal hexadecimal character code, out of range"
-                                               : "Illegal unicode character, out of range");
-                               }
-       
-                               return v;
-                       }
-               }
-
-               case '4':
-               case '5':
-               case '6':
-               case '7':
-               {
-                       fatal(s.ofs()-1, "Illegal octal character code, first digit must be 0 thru 3");
-                       return ~0u;
-               }
-
-               case '0':
-               case '1':
-               case '2':
-               case '3':
-               {
-                       if (s.len < 2)
-                       {
-                               fatal(s.ofs()+s.len, "Illegal octal character code, three octal digits are required");
-                               return ~0u;
-                       }
-
-                       const char *p0 = strchr(oct, c);
-                       const char *p1 = strchr(oct, s.str[0]);
-                       const char *p2 = strchr(oct, s.str[1]);
-
-                       if (!p0 || !p1 || !p2)
-                       {
-                               fatal(s.ofs()+(p1?1:0), "Illegal octal character code, non octal digit found");
-                               return ~0u;
-                       }
-                       else
-                       {
-                               s.len -= 2;
-                               s.str += 2;
-                               
-                               uint32_t v = (uint32_t)((p0 - oct) << 6) + (uint32_t)((p1 - oct) << 3) + (uint32_t)(p2 - oct);
-       
-                               return v;
-                       }
-               }
-
-               default:
-               return c;
-       }
-}
-
-std::string& Scanner::unescape(SubStr& str_in, std::string& str_out) const
-{
-       str_out.clear();
-
-       while(str_in.len)
-       {
-               uint32_t c = unescape(str_in);
-
-               if (c > 0xFF)
-               {
-                       fatal(str_in.ofs(), "Illegal character");
-               }
-
-               str_out += static_cast<char>(c);
-       }
-
-       return str_out;
-}
-
 } // namespace re2c
diff --git a/re2c/src/util/substr.h b/re2c/src/util/substr.h
deleted file mode 100644 (file)
index a78c704..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef _RE2C_UTIL_SUBSTR_
-#define _RE2C_UTIL_SUBSTR_
-
-#include "src/util/forbid_copy.h"
-
-namespace re2c
-{
-
-class SubStr
-{
-public:
-       const char * str;
-       const char * const org;
-       size_t len;
-
-       inline SubStr (const char * s, size_t l)
-               : str (s)
-               , org (s)
-               , len (l)
-       {}
-       inline ptrdiff_t ofs () const
-       {
-               return str - org;
-       }
-
-       FORBID_COPY (SubStr);
-};
-
-} // namespace re2c
-
-#endif // _RE2C_UTIL_SUBSTR_
index c45c4c7701b64448c87447e1f8aec021334fed5d..e296a92aa2a13bf084d52bb43492985cb2532254 100644 (file)
@@ -1,3 +1,4 @@
+re2c: warning: line 2: column 39: escape has no effect: '\/' [-Wuseless-escape]
 re2c: warning: line 5: naked default case in condition a (stray code units: [0x00-`][a][b-0xFF]), better add default rule * [-Wnaked-default]
 re2c: warning: line 5: naked default case in condition b (stray code units: [0x00-`][a][b-0xFF]), better add default rule * [-Wnaked-default]
 /* Generated by re2c */