]> granicus.if.org Git - re2c/commitdiff
Track uninitialized tags and set them to default value.
authorUlya Trofimovich <skvadrik@gmail.com>
Fri, 18 Nov 2016 15:54:40 +0000 (15:54 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Fri, 18 Nov 2016 16:23:04 +0000 (16:23 +0000)
Uninitialized tags come from alternative and iteration:
    ... @t ... | ...
    (... @t ...)*

Tags under alternative preserve their initial value (given to them
before entering DFA) -- they don't have to be explicitely set to
default value (but it is convenient, otherwise we'd have to initialize
all tags every time before entering DFA).

Tags enclosed in iteration might be assigned positional values on
some iterarions, but not on the last one -- their default value must
be restored explicitely before each iteration.

This commit adds specail kind of 'save' commands that set the given
tag to default value (instead of current input position). We insert
these 'save default' commands for tags in alternatives: all tags that
are present on left alternative get default values at the end of right
alternative.

Later on (during DFA construction and optimizations) we treat default
value just like normal positional value: save it to a variable, copy
values between variables, etc. This way DFA gets additional commands,
but the number of states does not grow much.

Another way would be to treat default value as a special bottom value:
instead of saving it to variable, keep a dedicated bottom tag version
and forbid mixing bottom version with other versions. This way default
values would be encoded in the structure of DFA, so there would be no
need to explicitely save them. DFA would gain no additional default
commands, but new states would appear.

Test changes have been verified with '--skeleton'.
Test 'tags/interference.i--tags.re' have been completely rewritten --
the old version no longer captures what it should (see comment in the
test). The old vesion has been moved to 'tags/fallback6.i--tags.re'.

28 files changed:
re2c/bootstrap/src/parse/lex_conf.cc
re2c/src/codegen/emit_action.cc
re2c/src/conf/opt.cc
re2c/src/conf/opt.h
re2c/src/ir/dfa/cfg/interfere.cc
re2c/src/ir/dfa/closure.cc
re2c/src/ir/dfa/fallback_tags.cc
re2c/src/ir/nfa/counters.cc
re2c/src/ir/nfa/nfa.h
re2c/src/ir/nfa/regexps2nfa.cc
re2c/src/ir/skeleton/generate_data.cc
re2c/src/ir/skeleton/skeleton.cc
re2c/src/ir/skeleton/skeleton.h
re2c/src/ir/tag.h
re2c/src/ir/tcmd.cc
re2c/src/ir/tcmd.h
re2c/src/parse/lex_conf.re
re2c/test/tags/copy_coalescing1.i--tags.c
re2c/test/tags/dedup5.i--tags.c
re2c/test/tags/fallback2.i--tags.c
re2c/test/tags/fallback5.i--tags.c
re2c/test/tags/fallback5.i--tags.re
re2c/test/tags/fallback6.i--tags.c [new file with mode: 0644]
re2c/test/tags/fallback6.i--tags.re [new file with mode: 0644]
re2c/test/tags/interference.i--tags.c
re2c/test/tags/interference.i--tags.re
re2c/test/tags/minimization.i.c
re2c/test/tags/nondet_iter.--tags.c

index d679e8335dd08317ff43531c890a2ece27bb229f..9f705b68071742ad004b367b4702cc7398851de2 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.16 on Thu Oct  6 18:44:38 2016 */
+/* Generated by re2c 0.16 on Tue Nov 15 17:31:03 2016 */
 #line 1 "../src/parse/lex_conf.re"
 #include "src/util/c99_stdint.h"
 #include <string>
@@ -137,42 +137,42 @@ yy14:
                                        if (yyaccept == 0) {
                                                goto yy3;
                                        } else {
-                                               goto yy100;
+                                               goto yy101;
                                        }
                                } else {
-                                       goto yy102;
+                                       goto yy103;
                                }
                        } else {
                                if (yyaccept <= 4) {
                                        if (yyaccept == 3) {
-                                               goto yy104;
+                                               goto yy105;
                                        } else {
-                                               goto yy106;
+                                               goto yy107;
                                        }
                                } else {
-                                       goto yy108;
+                                       goto yy109;
                                }
                        }
                } else {
                        if (yyaccept <= 8) {
                                if (yyaccept <= 7) {
                                        if (yyaccept == 6) {
-                                               goto yy112;
+                                               goto yy113;
                                        } else {
-                                               goto yy115;
+                                               goto yy116;
                                        }
                                } else {
-                                       goto yy117;
+                                       goto yy118;
                                }
                        } else {
                                if (yyaccept <= 10) {
                                        if (yyaccept == 9) {
-                                               goto yy119;
+                                               goto yy120;
                                        } else {
-                                               goto yy121;
+                                               goto yy122;
                                        }
                                } else {
-                                       goto yy123;
+                                       goto yy124;
                                }
                        }
                }
@@ -181,40 +181,40 @@ yy14:
                        if (yyaccept <= 14) {
                                if (yyaccept <= 13) {
                                        if (yyaccept == 12) {
-                                               goto yy125;
+                                               goto yy126;
                                        } else {
-                                               goto yy188;
+                                               goto yy191;
                                        }
                                } else {
-                                       goto yy278;
+                                       goto yy282;
                                }
                        } else {
                                if (yyaccept <= 16) {
                                        if (yyaccept == 15) {
-                                               goto yy352;
+                                               goto yy358;
                                        } else {
-                                               goto yy425;
+                                               goto yy433;
                                        }
                                } else {
-                                       goto yy532;
+                                       goto yy540;
                                }
                        }
                } else {
                        if (yyaccept <= 20) {
                                if (yyaccept <= 19) {
                                        if (yyaccept == 18) {
-                                               goto yy590;
+                                               goto yy598;
                                        } else {
-                                               goto yy630;
+                                               goto yy638;
                                        }
                                } else {
-                                       goto yy637;
+                                       goto yy645;
                                }
                        } else {
                                if (yyaccept == 21) {
-                                       goto yy719;
+                                       goto yy727;
                                } else {
-                                       goto yy722;
+                                       goto yy730;
                                }
                        }
                }
@@ -412,791 +412,795 @@ yy58:
        goto yy14;
 yy59:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy76;
-       if (yych == 'p') goto yy77;
-       goto yy14;
+       if (yych <= 'e') {
+               if (yych <= 'c') goto yy14;
+               if (yych <= 'd') goto yy76;
+               goto yy77;
+       } else {
+               if (yych == 'p') goto yy78;
+               goto yy14;
+       }
 yy60:
        yych = (unsigned char)*++cur;
-       if (yych == 'b') goto yy78;
+       if (yych == 'b') goto yy79;
        goto yy14;
 yy61:
        yych = (unsigned char)*++cur;
-       if (yych == 'h') goto yy79;
+       if (yych == 'h') goto yy80;
        goto yy14;
 yy62:
        yych = (unsigned char)*++cur;
-       if (yych == 'c') goto yy80;
-       if (yych == 'e') goto yy81;
+       if (yych == 'c') goto yy81;
+       if (yych == 'e') goto yy82;
        goto yy14;
 yy63:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy82;
+       if (yych == 'l') goto yy83;
        goto yy14;
 yy64:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy83;
+       if (yych == 't') goto yy84;
        goto yy14;
 yy65:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy84;
+       if (yych == 'i') goto yy85;
        goto yy14;
 yy66:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy85;
+       if (yych == 'o') goto yy86;
        goto yy14;
 yy67:
        yych = (unsigned char)*++cur;
-       if (yych == 'u') goto yy86;
+       if (yych == 'u') goto yy87;
        goto yy14;
 yy68:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy87;
+       if (yych == 'e') goto yy88;
        goto yy14;
 yy69:
        yych = (unsigned char)*++cur;
-       if (yych == ':') goto yy88;
+       if (yych == ':') goto yy89;
        goto yy14;
 yy70:
        yych = (unsigned char)*++cur;
        switch (yych) {
-       case '8':       goto yy89;
-       case 'D':       goto yy91;
-       case 'F':       goto yy93;
-       case 'S':       goto yy95;
-       case 'T':       goto yy97;
-       case 'b':       goto yy99;
-       case 'c':       goto yy101;
-       case 'd':       goto yy103;
-       case 'e':       goto yy105;
-       case 'f':       goto yy107;
-       case 'g':       goto yy109;
-       case 'i':       goto yy111;
-       case 'n':       goto yy113;
-       case 'o':       goto yy114;
-       case 'r':       goto yy116;
-       case 's':       goto yy118;
-       case 't':       goto yy120;
-       case 'u':       goto yy122;
-       case 'w':       goto yy124;
-       case 'x':       goto yy126;
+       case '8':       goto yy90;
+       case 'D':       goto yy92;
+       case 'F':       goto yy94;
+       case 'S':       goto yy96;
+       case 'T':       goto yy98;
+       case 'b':       goto yy100;
+       case 'c':       goto yy102;
+       case 'd':       goto yy104;
+       case 'e':       goto yy106;
+       case 'f':       goto yy108;
+       case 'g':       goto yy110;
+       case 'i':       goto yy112;
+       case 'n':       goto yy114;
+       case 'o':       goto yy115;
+       case 'r':       goto yy117;
+       case 's':       goto yy119;
+       case 't':       goto yy121;
+       case 'u':       goto yy123;
+       case 'w':       goto yy125;
+       case 'x':       goto yy127;
        default:        goto yy14;
        }
 yy71:
        yych = (unsigned char)*++cur;
-       if (yych == ':') goto yy128;
+       if (yych == ':') goto yy129;
        goto yy14;
 yy72:
        yych = (unsigned char)*++cur;
-       if (yych == 'y') goto yy129;
+       if (yych == 'y') goto yy130;
        goto yy14;
 yy73:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy130;
+       if (yych == 'r') goto yy131;
        goto yy14;
 yy74:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy131;
+       if (yych == 'a') goto yy132;
        goto yy14;
 yy75:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy132;
-       if (yych == 'n') goto yy133;
+       if (yych == 'a') goto yy133;
+       if (yych == 'n') goto yy134;
        goto yy14;
 yy76:
        yych = (unsigned char)*++cur;
-       if (yych == 'x') goto yy134;
+       if (yych == 'e') goto yy135;
        goto yy14;
 yy77:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy135;
+       if (yych == 'x') goto yy136;
        goto yy14;
 yy78:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy136;
+       if (yych == 'r') goto yy137;
        goto yy14;
 yy79:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy137;
+       if (yych == 'l') goto yy138;
        goto yy14;
 yy80:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy138;
+       if (yych == 'e') goto yy139;
        goto yy14;
 yy81:
        yych = (unsigned char)*++cur;
-       if (yych == 'm') goto yy139;
+       if (yych == 'o') goto yy140;
        goto yy14;
 yy82:
        yych = (unsigned char)*++cur;
-       if (yych == ':') goto yy140;
+       if (yych == 'm') goto yy141;
        goto yy14;
 yy83:
        yych = (unsigned char)*++cur;
-       if (yych == 'h') goto yy141;
+       if (yych == ':') goto yy142;
        goto yy14;
 yy84:
        yych = (unsigned char)*++cur;
-       if (yych == 'v') goto yy142;
+       if (yych == 'h') goto yy143;
        goto yy14;
 yy85:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy143;
+       if (yych == 'v') goto yy144;
        goto yy14;
 yy86:
        yych = (unsigned char)*++cur;
-       if (yych == 'm') goto yy144;
+       if (yych == 't') goto yy145;
        goto yy14;
 yy87:
        yych = (unsigned char)*++cur;
-       if (yych == 'f') goto yy145;
+       if (yych == 'm') goto yy146;
        goto yy14;
 yy88:
        yych = (unsigned char)*++cur;
-       if (yych == 'Y') goto yy146;
+       if (yych == 'f') goto yy147;
        goto yy14;
 yy89:
+       yych = (unsigned char)*++cur;
+       if (yych == 'Y') goto yy148;
+       goto yy14;
+yy90:
        ++cur;
 #line 66 "../src/parse/lex_conf.re"
        { lex_conf_enc(Enc::UTF8);   return; }
-#line 562 "src/parse/lex_conf.cc"
-yy91:
+#line 571 "src/parse/lex_conf.cc"
+yy92:
        ++cur;
 #line 44 "../src/parse/lex_conf.re"
        { opts.set_target(opt_t::DOT);      lex_conf_semicolon(); return; }
-#line 567 "src/parse/lex_conf.cc"
-yy93:
+#line 576 "src/parse/lex_conf.cc"
+yy94:
        ++cur;
 #line 51 "../src/parse/lex_conf.re"
        { opts.set_FFlag(lex_conf_bool());             return; }
-#line 572 "src/parse/lex_conf.cc"
-yy95:
+#line 581 "src/parse/lex_conf.cc"
+yy96:
        ++cur;
 #line 45 "../src/parse/lex_conf.re"
        { opts.set_target(opt_t::SKELETON); lex_conf_semicolon(); return; }
-#line 577 "src/parse/lex_conf.cc"
-yy97:
+#line 586 "src/parse/lex_conf.cc"
+yy98:
        ++cur;
 #line 56 "../src/parse/lex_conf.re"
        { opts.set_tags(lex_conf_bool());              return; }
-#line 582 "src/parse/lex_conf.cc"
-yy99:
+#line 591 "src/parse/lex_conf.cc"
+yy100:
        yyaccept = 1;
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'i') goto yy147;
-yy100:
+       if (yych == 'i') goto yy149;
+yy101:
 #line 47 "../src/parse/lex_conf.re"
        { opts.set_bFlag(lex_conf_bool());             return; }
-#line 590 "src/parse/lex_conf.cc"
-yy101:
+#line 599 "src/parse/lex_conf.cc"
+yy102:
        yyaccept = 2;
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'a') goto yy148;
-       if (yych == 'o') goto yy149;
-yy102:
+       if (yych == 'a') goto yy150;
+       if (yych == 'o') goto yy151;
+yy103:
 #line 48 "../src/parse/lex_conf.re"
        { opts.set_cFlag(lex_conf_bool());             return; }
-#line 599 "src/parse/lex_conf.cc"
-yy103:
+#line 608 "src/parse/lex_conf.cc"
+yy104:
        yyaccept = 3;
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych <= 'd') goto yy104;
-       if (yych <= 'e') goto yy150;
-       if (yych <= 'f') goto yy151;
-yy104:
+       if (yych <= 'd') goto yy105;
+       if (yych <= 'e') goto yy152;
+       if (yych <= 'f') goto yy153;
+yy105:
 #line 49 "../src/parse/lex_conf.re"
        { opts.set_dFlag(lex_conf_bool());             return; }
-#line 609 "src/parse/lex_conf.cc"
-yy105:
+#line 618 "src/parse/lex_conf.cc"
+yy106:
        yyaccept = 4;
        yych = (unsigned char)*(ptr = ++cur);
        if (yych <= 'l') {
-               if (yych == 'c') goto yy152;
+               if (yych == 'c') goto yy154;
        } else {
-               if (yych <= 'm') goto yy153;
-               if (yych <= 'n') goto yy154;
+               if (yych <= 'm') goto yy155;
+               if (yych <= 'n') goto yy156;
        }
-yy106:
+yy107:
 #line 62 "../src/parse/lex_conf.re"
        { lex_conf_enc(Enc::EBCDIC); return; }
-#line 622 "src/parse/lex_conf.cc"
-yy107:
+#line 631 "src/parse/lex_conf.cc"
+yy108:
        yyaccept = 5;
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'l') goto yy155;
-yy108:
+       if (yych == 'l') goto yy157;
+yy109:
 #line 50 "../src/parse/lex_conf.re"
        { opts.set_fFlag(lex_conf_bool());             return; }
-#line 630 "src/parse/lex_conf.cc"
-yy109:
+#line 639 "src/parse/lex_conf.cc"
+yy110:
        ++cur;
 #line 52 "../src/parse/lex_conf.re"
        { opts.set_gFlag(lex_conf_bool());             return; }
-#line 635 "src/parse/lex_conf.cc"
-yy111:
+#line 644 "src/parse/lex_conf.cc"
+yy112:
        yyaccept = 6;
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'n') goto yy156;
-yy112:
+       if (yych == 'n') goto yy158;
+yy113:
 #line 53 "../src/parse/lex_conf.re"
        { opts.set_iFlag(lex_conf_bool());             return; }
-#line 643 "src/parse/lex_conf.cc"
-yy113:
+#line 652 "src/parse/lex_conf.cc"
+yy114:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy157;
-       if (yych == 'o') goto yy158;
+       if (yych == 'e') goto yy159;
+       if (yych == 'o') goto yy160;
        goto yy14;
-yy114:
+yy115:
        yyaccept = 7;
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'u') goto yy159;
-yy115:
+       if (yych == 'u') goto yy161;
+yy116:
 #line 68 "../src/parse/lex_conf.re"
        { opts.set_output_file(lex_conf_string()); return; }
-#line 656 "src/parse/lex_conf.cc"
-yy116:
+#line 665 "src/parse/lex_conf.cc"
+yy117:
        yyaccept = 8;
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'e') goto yy160;
-yy117:
+       if (yych == 'e') goto yy162;
+yy118:
 #line 54 "../src/parse/lex_conf.re"
        { opts.set_rFlag(lex_conf_bool());             return; }
-#line 664 "src/parse/lex_conf.cc"
-yy118:
+#line 673 "src/parse/lex_conf.cc"
+yy119:
        yyaccept = 9;
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'k') goto yy161;
-       if (yych == 't') goto yy162;
-yy119:
+       if (yych == 'k') goto yy163;
+       if (yych == 't') goto yy164;
+yy120:
 #line 55 "../src/parse/lex_conf.re"
        { opts.set_sFlag(lex_conf_bool());             return; }
-#line 673 "src/parse/lex_conf.cc"
-yy120:
+#line 682 "src/parse/lex_conf.cc"
+yy121:
        yyaccept = 10;
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'a') goto yy163;
-       if (yych == 'y') goto yy164;
-yy121:
+       if (yych == 'a') goto yy165;
+       if (yych == 'y') goto yy166;
+yy122:
 #line 69 "../src/parse/lex_conf.re"
        { opts.set_header_file(lex_conf_string()); return; }
-#line 682 "src/parse/lex_conf.cc"
-yy122:
+#line 691 "src/parse/lex_conf.cc"
+yy123:
        yyaccept = 11;
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'n') goto yy165;
-       if (yych == 't') goto yy166;
-yy123:
+       if (yych == 'n') goto yy167;
+       if (yych == 't') goto yy168;
+yy124:
 #line 63 "../src/parse/lex_conf.re"
        { lex_conf_enc(Enc::UTF32);  return; }
-#line 691 "src/parse/lex_conf.cc"
-yy124:
+#line 700 "src/parse/lex_conf.cc"
+yy125:
        yyaccept = 12;
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'i') goto yy167;
-yy125:
+       if (yych == 'i') goto yy169;
+yy126:
 #line 64 "../src/parse/lex_conf.re"
        { lex_conf_enc(Enc::UCS2);   return; }
-#line 699 "src/parse/lex_conf.cc"
-yy126:
+#line 708 "src/parse/lex_conf.cc"
+yy127:
        ++cur;
 #line 65 "../src/parse/lex_conf.re"
        { lex_conf_enc(Enc::UTF16);  return; }
-#line 704 "src/parse/lex_conf.cc"
-yy128:
-       yych = (unsigned char)*++cur;
-       if (yych <= 'r') goto yy14;
-       if (yych <= 's') goto yy168;
-       if (yych <= 't') goto yy169;
-       goto yy14;
+#line 713 "src/parse/lex_conf.cc"
 yy129:
        yych = (unsigned char)*++cur;
-       if (yych == 'y') goto yy170;
+       if (yych <= 'r') goto yy14;
+       if (yych <= 's') goto yy170;
+       if (yych <= 't') goto yy171;
        goto yy14;
 yy130:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy171;
+       if (yych == 'y') goto yy172;
        goto yy14;
 yy131:
        yych = (unsigned char)*++cur;
-       if (yych == 'b') goto yy172;
+       if (yych == 'e') goto yy173;
        goto yy14;
 yy132:
        yych = (unsigned char)*++cur;
-       if (yych == 'b') goto yy173;
+       if (yych == 'b') goto yy174;
        goto yy14;
 yy133:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy174;
+       if (yych == 'b') goto yy175;
        goto yy14;
 yy134:
        yych = (unsigned char)*++cur;
-       if (yych == 'p') goto yy175;
+       if (yych == 'e') goto yy176;
        goto yy14;
 yy135:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy176;
+       if (yych == 'f') goto yy177;
        goto yy14;
 yy136:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy177;
+       if (yych == 'p') goto yy178;
        goto yy14;
 yy137:
        yych = (unsigned char)*++cur;
-       if (yych == 'x') goto yy178;
+       if (yych == 'e') goto yy179;
        goto yy14;
 yy138:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy180;
+       if (yych == 'e') goto yy180;
        goto yy14;
 yy139:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy181;
+       if (yych == 'x') goto yy181;
        goto yy14;
 yy140:
        yych = (unsigned char)*++cur;
-       if (yych <= 'd') {
-               if (yych == 'c') goto yy182;
-               goto yy14;
-       } else {
-               if (yych <= 'e') goto yy183;
-               if (yych == 'p') goto yy184;
-               goto yy14;
-       }
+       if (yych == 'n') goto yy183;
+       goto yy14;
 yy141:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy185;
+       if (yych == 'i') goto yy184;
        goto yy14;
 yy142:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy186;
-       goto yy14;
+       if (yych <= 'd') {
+               if (yych == 'c') goto yy185;
+               goto yy14;
+       } else {
+               if (yych <= 'e') goto yy186;
+               if (yych == 'p') goto yy187;
+               goto yy14;
+       }
 yy143:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy187;
+       if (yych == 'r') goto yy188;
        goto yy14;
 yy144:
        yych = (unsigned char)*++cur;
-       if (yych == 'p') goto yy189;
+       if (yych == 'i') goto yy189;
        goto yy14;
 yy145:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy190;
+       if (yych == 'o') goto yy190;
        goto yy14;
 yy146:
        yych = (unsigned char)*++cur;
-       if (yych == 'Y') goto yy191;
+       if (yych == 'p') goto yy192;
        goto yy14;
 yy147:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy192;
+       if (yych == 'i') goto yy193;
        goto yy14;
 yy148:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy193;
+       if (yych == 'Y') goto yy194;
        goto yy14;
 yy149:
        yych = (unsigned char)*++cur;
-       if (yych == 'm') goto yy194;
+       if (yych == 't') goto yy195;
        goto yy14;
 yy150:
        yych = (unsigned char)*++cur;
-       if (yych == 'b') goto yy195;
+       if (yych == 's') goto yy196;
        goto yy14;
 yy151:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy196;
+       if (yych == 'm') goto yy197;
        goto yy14;
 yy152:
        yych = (unsigned char)*++cur;
-       if (yych == 'b') goto yy197;
+       if (yych == 'b') goto yy198;
        goto yy14;
 yy153:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy198;
-       if (yych == 'p') goto yy199;
+       if (yych == 'a') goto yy199;
        goto yy14;
 yy154:
        yych = (unsigned char)*++cur;
-       if (yych == 'c') goto yy200;
+       if (yych == 'b') goto yy200;
        goto yy14;
 yy155:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy201;
+       if (yych == 'i') goto yy201;
+       if (yych == 'p') goto yy202;
        goto yy14;
 yy156:
        yych = (unsigned char)*++cur;
-       if (yych == 'p') goto yy202;
+       if (yych == 'c') goto yy203;
        goto yy14;
 yy157:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy203;
+       if (yych == 'e') goto yy204;
        goto yy14;
 yy158:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy204;
+       if (yych == 'p') goto yy205;
        goto yy14;
 yy159:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy205;
+       if (yych == 's') goto yy206;
        goto yy14;
 yy160:
        yych = (unsigned char)*++cur;
-       if (yych == 'u') goto yy206;
+       if (yych == '-') goto yy207;
        goto yy14;
 yy161:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy207;
+       if (yych == 't') goto yy208;
        goto yy14;
 yy162:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy208;
-       if (yych == 'o') goto yy209;
+       if (yych == 'u') goto yy209;
        goto yy14;
 yy163:
        yych = (unsigned char)*++cur;
-       if (yych == 'g') goto yy210;
+       if (yych == 'e') goto yy210;
        goto yy14;
 yy164:
        yych = (unsigned char)*++cur;
-       if (yych == 'p') goto yy211;
+       if (yych == 'a') goto yy211;
+       if (yych == 'o') goto yy212;
        goto yy14;
 yy165:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy212;
+       if (yych == 'g') goto yy213;
        goto yy14;
 yy166:
        yych = (unsigned char)*++cur;
-       if (yych == 'f') goto yy213;
+       if (yych == 'p') goto yy214;
        goto yy14;
 yy167:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy214;
+       if (yych == 'i') goto yy215;
        goto yy14;
 yy168:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy215;
+       if (yych == 'f') goto yy216;
        goto yy14;
 yy169:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy216;
+       if (yych == 'd') goto yy217;
        goto yy14;
 yy170:
        yych = (unsigned char)*++cur;
-       if (yych == 'F') goto yy217;
-       if (yych == 'N') goto yy218;
+       if (yych == 't') goto yy218;
        goto yy14;
 yy171:
        yych = (unsigned char)*++cur;
-       if (yych == 'f') goto yy219;
+       if (yych == 'o') goto yy219;
        goto yy14;
 yy172:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy220;
+       if (yych == 'F') goto yy220;
+       if (yych == 'N') goto yy221;
        goto yy14;
 yy173:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy221;
+       if (yych == 'f') goto yy222;
        goto yy14;
 yy174:
        yych = (unsigned char)*++cur;
-       if (yych == 'x') goto yy222;
+       if (yych == 'e') goto yy223;
        goto yy14;
 yy175:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy223;
+       if (yych == 'o') goto yy224;
        goto yy14;
 yy176:
        yych = (unsigned char)*++cur;
-       if (yych == 'f') goto yy224;
+       if (yych == 'x') goto yy225;
        goto yy14;
 yy177:
        yych = (unsigned char)*++cur;
-       if (yych == ':') goto yy225;
+       if (yych == 'a') goto yy226;
        goto yy14;
 yy178:
-       ++cur;
-#line 102 "../src/parse/lex_conf.re"
-       { opts.set_yybmHexTable (lex_conf_bool()); return; }
-#line 920 "src/parse/lex_conf.cc"
-yy180:
        yych = (unsigned char)*++cur;
-       if (yych == 'v') goto yy226;
+       if (yych == 'r') goto yy227;
        goto yy14;
-yy181:
+yy179:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy227;
+       if (yych == 'f') goto yy228;
        goto yy14;
-yy182:
+yy180:
        yych = (unsigned char)*++cur;
-       if (yych == 'h') goto yy229;
+       if (yych == ':') goto yy229;
        goto yy14;
+yy181:
+       ++cur;
+#line 102 "../src/parse/lex_conf.re"
+       { opts.set_yybmHexTable (lex_conf_bool()); return; }
+#line 937 "src/parse/lex_conf.cc"
 yy183:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy230;
+       if (yych == 'v') goto yy230;
        goto yy14;
 yy184:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy231;
+       if (yych == 't') goto yy231;
        goto yy14;
 yy185:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy232;
+       if (yych == 'h') goto yy233;
        goto yy14;
 yy186:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy233;
+       if (yych == 'n') goto yy234;
        goto yy14;
 yy187:
-       yyaccept = 13;
-       yych = (unsigned char)*(ptr = ++cur);
-       if (yych == '@') goto yy234;
+       yych = (unsigned char)*++cur;
+       if (yych == 'a') goto yy235;
+       goto yy14;
 yy188:
-#line 86 "../src/parse/lex_conf.re"
-       { opts.set_condGoto         (lex_conf_string ()); return; }
-#line 956 "src/parse/lex_conf.cc"
-yy189:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy235;
+       if (yych == 'e') goto yy236;
        goto yy14;
-yy190:
+yy189:
        yych = (unsigned char)*++cur;
-       if (yych == 'x') goto yy236;
+       if (yych == 'd') goto yy237;
        goto yy14;
+yy190:
+       yyaccept = 13;
+       yych = (unsigned char)*(ptr = ++cur);
+       if (yych == '@') goto yy238;
 yy191:
-       yych = (unsigned char)*++cur;
-       switch (yych) {
-       case 'B':       goto yy238;
-       case 'C':       goto yy239;
-       case 'D':       goto yy240;
-       case 'F':       goto yy241;
-       case 'G':       goto yy242;
-       case 'L':       goto yy243;
-       case 'M':       goto yy244;
-       case 'P':       goto yy245;
-       case 'R':       goto yy246;
-       case 'S':       goto yy247;
-       default:        goto yy14;
-       }
+#line 86 "../src/parse/lex_conf.re"
+       { opts.set_condGoto         (lex_conf_string ()); return; }
+#line 973 "src/parse/lex_conf.cc"
 yy192:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy248;
+       if (yych == 'r') goto yy239;
        goto yy14;
 yy193:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy249;
+       if (yych == 'x') goto yy240;
        goto yy14;
 yy194:
        yych = (unsigned char)*++cur;
-       if (yych == 'p') goto yy250;
-       goto yy14;
+       switch (yych) {
+       case 'B':       goto yy242;
+       case 'C':       goto yy243;
+       case 'D':       goto yy244;
+       case 'F':       goto yy245;
+       case 'G':       goto yy246;
+       case 'L':       goto yy247;
+       case 'M':       goto yy248;
+       case 'P':       goto yy249;
+       case 'R':       goto yy250;
+       case 'S':       goto yy251;
+       default:        goto yy14;
+       }
 yy195:
        yych = (unsigned char)*++cur;
-       if (yych == 'u') goto yy251;
+       if (yych == '-') goto yy252;
        goto yy14;
 yy196:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy252;
+       if (yych == 'e') goto yy253;
        goto yy14;
 yy197:
        yych = (unsigned char)*++cur;
-       goto yy106;
+       if (yych == 'p') goto yy254;
+       goto yy14;
 yy198:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy253;
+       if (yych == 'u') goto yy255;
        goto yy14;
 yy199:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy254;
+       if (yych == '-') goto yy256;
        goto yy14;
 yy200:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy255;
-       goto yy14;
+       goto yy107;
 yy201:
        yych = (unsigned char)*++cur;
-       if (yych == 'x') goto yy256;
+       if (yych == 't') goto yy257;
        goto yy14;
 yy202:
        yych = (unsigned char)*++cur;
-       if (yych == 'u') goto yy257;
+       if (yych == 't') goto yy258;
        goto yy14;
 yy203:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy258;
+       if (yych == 'o') goto yy259;
        goto yy14;
 yy204:
        yych = (unsigned char)*++cur;
-       if (yych <= 'f') {
-               if (yych == 'd') goto yy259;
-               goto yy14;
-       } else {
-               if (yych <= 'g') goto yy260;
-               if (yych == 'v') goto yy261;
-               goto yy14;
-       }
+       if (yych == 'x') goto yy260;
+       goto yy14;
 yy205:
        yych = (unsigned char)*++cur;
-       if (yych == 'p') goto yy262;
+       if (yych == 'u') goto yy261;
        goto yy14;
 yy206:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy263;
+       if (yych == 't') goto yy262;
        goto yy14;
 yy207:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy264;
-       goto yy14;
+       if (yych <= 'f') {
+               if (yych == 'd') goto yy263;
+               goto yy14;
+       } else {
+               if (yych <= 'g') goto yy264;
+               if (yych == 'v') goto yy265;
+               goto yy14;
+       }
 yy208:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy265;
+       if (yych == 'p') goto yy266;
        goto yy14;
 yy209:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy266;
+       if (yych == 's') goto yy267;
        goto yy14;
 yy210:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy97;
+       if (yych == 'l') goto yy268;
        goto yy14;
 yy211:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy267;
+       if (yych == 'r') goto yy269;
        goto yy14;
 yy212:
        yych = (unsigned char)*++cur;
-       if (yych == 'c') goto yy268;
+       if (yych == 'r') goto yy270;
        goto yy14;
 yy213:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy269;
+       if (yych == 's') goto yy98;
        goto yy14;
 yy214:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy270;
+       if (yych == 'e') goto yy271;
        goto yy14;
 yy215:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy271;
+       if (yych == 'c') goto yy272;
        goto yy14;
 yy216:
        yych = (unsigned char)*++cur;
-       if (yych == 'p') goto yy272;
+       if (yych == '-') goto yy273;
        goto yy14;
 yy217:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy274;
+       if (yych == 'e') goto yy274;
        goto yy14;
 yy218:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy275;
+       if (yych == 'r') goto yy275;
        goto yy14;
 yy219:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy276;
+       if (yych == 'p') goto yy276;
        goto yy14;
 yy220:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy277;
+       if (yych == 'i') goto yy278;
        goto yy14;
 yy221:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy279;
+       if (yych == 'e') goto yy279;
        goto yy14;
 yy222:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy280;
+       if (yych == 'i') goto yy280;
        goto yy14;
 yy223:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy281;
+       if (yych == 'l') goto yy281;
        goto yy14;
 yy224:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy282;
+       if (yych == 'r') goto yy283;
        goto yy14;
 yy225:
        yych = (unsigned char)*++cur;
-       if (yych == 'y') goto yy283;
+       if (yych == 't') goto yy284;
        goto yy14;
 yy226:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy284;
+       if (yych == 'u') goto yy285;
        goto yy14;
 yy227:
-       ++cur;
-#line 151 "../src/parse/lex_conf.re"
-       { opts.set_bEmitYYCh      (lex_conf_bool()); return; }
-#line 1129 "src/parse/lex_conf.cc"
-yy229:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy285;
+       if (yych == 'e') goto yy286;
        goto yy14;
-yy230:
+yy228:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy286;
+       if (yych == 'i') goto yy287;
        goto yy14;
-yy231:
+yy229:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy287;
+       if (yych == 'y') goto yy288;
        goto yy14;
-yy232:
+yy230:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy288;
+       if (yych == 'e') goto yy289;
        goto yy14;
+yy231:
+       ++cur;
+#line 152 "../src/parse/lex_conf.re"
+       { opts.set_bEmitYYCh      (lex_conf_bool()); return; }
+#line 1150 "src/parse/lex_conf.cc"
 yy233:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy289;
+       if (yych == 'e') goto yy290;
        goto yy14;
 yy234:
        yych = (unsigned char)*++cur;
-       if (yych == 'c') goto yy290;
+       if (yych == 'a') goto yy291;
        goto yy14;
 yy235:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy291;
+       if (yych == 'r') goto yy292;
        goto yy14;
 yy236:
-       ++cur;
-#line 82 "../src/parse/lex_conf.re"
-       { opts.set_condPrefix       (lex_conf_string ()); return; }
-#line 1162 "src/parse/lex_conf.cc"
-yy238:
        yych = (unsigned char)*++cur;
-       if (yych == 'A') goto yy292;
+       if (yych == 's') goto yy293;
        goto yy14;
-yy239:
+yy237:
        yych = (unsigned char)*++cur;
-       if (yych <= 'S') {
-               if (yych == 'O') goto yy293;
-               goto yy14;
-       } else {
-               if (yych <= 'T') goto yy294;
-               if (yych <= 'U') goto yy295;
-               goto yy14;
-       }
-yy240:
+       if (yych == 'e') goto yy294;
+       goto yy14;
+yy238:
        yych = (unsigned char)*++cur;
-       if (yych == 'E') goto yy296;
+       if (yych == 'c') goto yy295;
        goto yy14;
-yy241:
+yy239:
        yych = (unsigned char)*++cur;
-       if (yych == 'I') goto yy297;
+       if (yych == 'e') goto yy296;
        goto yy14;
+yy240:
+       ++cur;
+#line 82 "../src/parse/lex_conf.re"
+       { opts.set_condPrefix       (lex_conf_string ()); return; }
+#line 1183 "src/parse/lex_conf.cc"
 yy242:
        yych = (unsigned char)*++cur;
-       if (yych == 'E') goto yy298;
+       if (yych == 'A') goto yy297;
        goto yy14;
 yy243:
        yych = (unsigned char)*++cur;
-       if (yych == 'E') goto yy299;
-       if (yych == 'I') goto yy300;
-       goto yy14;
+       if (yych <= 'S') {
+               if (yych == 'O') goto yy298;
+               goto yy14;
+       } else {
+               if (yych <= 'T') goto yy299;
+               if (yych <= 'U') goto yy300;
+               goto yy14;
+       }
 yy244:
        yych = (unsigned char)*++cur;
-       if (yych == 'A') goto yy301;
+       if (yych == 'E') goto yy301;
        goto yy14;
 yy245:
        yych = (unsigned char)*++cur;
-       if (yych == 'E') goto yy302;
+       if (yych == 'I') goto yy302;
        goto yy14;
 yy246:
        yych = (unsigned char)*++cur;
@@ -1205,108 +1209,125 @@ yy246:
 yy247:
        yych = (unsigned char)*++cur;
        if (yych == 'E') goto yy304;
-       if (yych == 'K') goto yy305;
+       if (yych == 'I') goto yy305;
        goto yy14;
 yy248:
        yych = (unsigned char)*++cur;
-       if (yych == 'v') goto yy306;
+       if (yych == 'A') goto yy306;
        goto yy14;
 yy249:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy307;
+       if (yych == 'E') goto yy307;
        goto yy14;
 yy250:
        yych = (unsigned char)*++cur;
-       if (yych == 'u') goto yy308;
+       if (yych == 'E') goto yy308;
        goto yy14;
 yy251:
        yych = (unsigned char)*++cur;
-       if (yych == 'g') goto yy309;
+       if (yych == 'E') goto yy309;
+       if (yych == 'K') goto yy310;
        goto yy14;
 yy252:
        yych = (unsigned char)*++cur;
-       if (yych == 'm') goto yy310;
+       if (yych == 'v') goto yy311;
        goto yy14;
 yy253:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy311;
+       if (yych == '-') goto yy312;
        goto yy14;
 yy254:
        yych = (unsigned char)*++cur;
-       if (yych == 'y') goto yy312;
+       if (yych == 'u') goto yy313;
        goto yy14;
 yy255:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy313;
+       if (yych == 'g') goto yy314;
        goto yy14;
 yy256:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy314;
+       if (yych == 'm') goto yy315;
        goto yy14;
 yy257:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy315;
+       if (yych == '-') goto yy316;
        goto yy14;
 yy258:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy317;
+       if (yych == 'y') goto yy317;
        goto yy14;
 yy259:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy318;
+       if (yych == 'd') goto yy318;
        goto yy14;
 yy260:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy319;
+       if (yych == '-') goto yy319;
        goto yy14;
 yy261:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy320;
+       if (yych == 't') goto yy320;
        goto yy14;
 yy262:
        yych = (unsigned char)*++cur;
-       if (yych == 'u') goto yy321;
+       if (yych == 'e') goto yy322;
        goto yy14;
 yy263:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy322;
+       if (yych == 'e') goto yy323;
        goto yy14;
 yy264:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy323;
+       if (yych == 'e') goto yy324;
        goto yy14;
 yy265:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy324;
+       if (yych == 'e') goto yy325;
        goto yy14;
 yy266:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy325;
+       if (yych == 'u') goto yy326;
        goto yy14;
 yy267:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy326;
+       if (yych == 'a') goto yy327;
        goto yy14;
 yy268:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy327;
+       if (yych == 'e') goto yy328;
        goto yy14;
 yy269:
        yych = (unsigned char)*++cur;
-       if (yych == '1') goto yy328;
-       if (yych == '8') goto yy89;
+       if (yych == 't') goto yy329;
        goto yy14;
 yy270:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy329;
+       if (yych == 'a') goto yy330;
        goto yy14;
 yy271:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy330;
+       if (yych == '-') goto yy331;
        goto yy14;
 yy272:
+       yych = (unsigned char)*++cur;
+       if (yych == 'o') goto yy332;
+       goto yy14;
+yy273:
+       yych = (unsigned char)*++cur;
+       if (yych == '1') goto yy333;
+       if (yych == '8') goto yy90;
+       goto yy14;
+yy274:
+       yych = (unsigned char)*++cur;
+       if (yych == '-') goto yy334;
+       goto yy14;
+yy275:
+       yych = (unsigned char)*++cur;
+       if (yych == 'i') goto yy335;
+       goto yy14;
+yy276:
        ++cur;
-#line 136 "../src/parse/lex_conf.re"
+#line 137 "../src/parse/lex_conf.re"
        {
                const int32_t n = lex_conf_number ();
                if (n < 0)
@@ -1316,415 +1337,398 @@ yy272:
                opts.set_topIndent (static_cast<uint32_t> (n));
                return;
        }
-#line 1320 "src/parse/lex_conf.cc"
-yy274:
+#line 1341 "src/parse/lex_conf.cc"
+yy278:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy331;
+       if (yych == 'l') goto yy336;
        goto yy14;
-yy275:
+yy279:
        yych = (unsigned char)*++cur;
-       if (yych == 'x') goto yy332;
+       if (yych == 'x') goto yy337;
        goto yy14;
-yy276:
+yy280:
        yych = (unsigned char)*++cur;
-       if (yych == 'x') goto yy333;
+       if (yych == 'x') goto yy338;
        goto yy14;
-yy277:
+yy281:
        yyaccept = 14;
        yych = (unsigned char)*(ptr = ++cur);
        if (yych <= 0x1F) {
                if (yych == '\t') {
                        ctx = cur;
-                       goto yy335;
+                       goto yy340;
                }
        } else {
                if (yych <= ' ') {
                        ctx = cur;
-                       goto yy335;
+                       goto yy340;
                }
                if (yych == '=') {
                        ctx = cur;
-                       goto yy337;
+                       goto yy342;
                }
        }
-yy278:
-#line 164 "../src/parse/lex_conf.re"
-       { out.block().user_start_label = lex_conf_string(); return; }
-#line 1354 "src/parse/lex_conf.cc"
-yy279:
-       yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy339;
-       goto yy14;
-yy280:
-       yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy341;
-       goto yy14;
-yy281:
-       yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy342;
-       goto yy14;
 yy282:
-       yych = (unsigned char)*++cur;
-       if (yych == 'x') goto yy343;
-       goto yy14;
+#line 165 "../src/parse/lex_conf.re"
+       { out.block().user_start_label = lex_conf_string(); return; }
+#line 1375 "src/parse/lex_conf.cc"
 yy283:
        yych = (unsigned char)*++cur;
-       if (yych == 'y') goto yy345;
+       if (yych == 't') goto yy344;
        goto yy14;
 yy284:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy346;
+       if (yych == 'l') goto yy346;
        goto yy14;
 yy285:
        yych = (unsigned char)*++cur;
-       if (yych == 'c') goto yy347;
+       if (yych == 'l') goto yy347;
        goto yy14;
 yy286:
        yych = (unsigned char)*++cur;
-       if (yych == 'b') goto yy348;
+       if (yych == 's') goto yy348;
        goto yy14;
 yy287:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy349;
+       if (yych == 'x') goto yy349;
        goto yy14;
 yy288:
        yych = (unsigned char)*++cur;
-       if (yych == 'h') goto yy350;
+       if (yych == 'y') goto yy351;
        goto yy14;
 yy289:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy351;
+       if (yych == 'r') goto yy352;
        goto yy14;
 yy290:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy353;
+       if (yych == 'c') goto yy353;
        goto yy14;
 yy291:
        yych = (unsigned char)*++cur;
-       if (yych == 'f') goto yy354;
+       if (yych == 'b') goto yy354;
        goto yy14;
 yy292:
        yych = (unsigned char)*++cur;
-       if (yych == 'C') goto yy355;
+       if (yych == 'a') goto yy355;
        goto yy14;
 yy293:
        yych = (unsigned char)*++cur;
-       if (yych == 'N') goto yy356;
-       if (yych == 'P') goto yy357;
+       if (yych == 'h') goto yy356;
        goto yy14;
 yy294:
        yych = (unsigned char)*++cur;
-       if (yych <= 'W') goto yy14;
-       if (yych <= 'X') goto yy358;
-       if (yych <= 'Y') goto yy359;
+       if (yych == 'r') goto yy357;
        goto yy14;
 yy295:
        yych = (unsigned char)*++cur;
-       if (yych == 'R') goto yy360;
+       if (yych == 'o') goto yy359;
        goto yy14;
 yy296:
        yych = (unsigned char)*++cur;
-       if (yych == 'B') goto yy361;
+       if (yych == 'f') goto yy360;
        goto yy14;
 yy297:
        yych = (unsigned char)*++cur;
-       if (yych == 'L') goto yy362;
+       if (yych == 'C') goto yy361;
        goto yy14;
 yy298:
        yych = (unsigned char)*++cur;
-       if (yych == 'T') goto yy363;
+       if (yych == 'N') goto yy362;
+       if (yych == 'P') goto yy363;
        goto yy14;
 yy299:
        yych = (unsigned char)*++cur;
-       if (yych == 'S') goto yy364;
+       if (yych <= 'W') goto yy14;
+       if (yych <= 'X') goto yy364;
+       if (yych <= 'Y') goto yy365;
        goto yy14;
 yy300:
        yych = (unsigned char)*++cur;
-       if (yych == 'M') goto yy365;
+       if (yych == 'R') goto yy366;
        goto yy14;
 yy301:
        yych = (unsigned char)*++cur;
-       if (yych == 'R') goto yy366;
+       if (yych == 'B') goto yy367;
        goto yy14;
 yy302:
        yych = (unsigned char)*++cur;
-       if (yych == 'E') goto yy367;
+       if (yych == 'L') goto yy368;
        goto yy14;
 yy303:
        yych = (unsigned char)*++cur;
-       if (yych == 'S') goto yy368;
+       if (yych == 'T') goto yy369;
        goto yy14;
 yy304:
        yych = (unsigned char)*++cur;
-       if (yych == 'T') goto yy369;
+       if (yych == 'S') goto yy370;
        goto yy14;
 yy305:
        yych = (unsigned char)*++cur;
-       if (yych == 'I') goto yy370;
+       if (yych == 'M') goto yy371;
        goto yy14;
 yy306:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy371;
+       if (yych == 'R') goto yy372;
        goto yy14;
 yy307:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy372;
+       if (yych == 'E') goto yy373;
        goto yy14;
 yy308:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy373;
+       if (yych == 'S') goto yy374;
        goto yy14;
 yy309:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy374;
+       if (yych == 'T') goto yy375;
        goto yy14;
 yy310:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy375;
+       if (yych == 'I') goto yy376;
        goto yy14;
 yy311:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy376;
+       if (yych == 'e') goto yy377;
        goto yy14;
 yy312:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy377;
+       if (yych == 'i') goto yy378;
        goto yy14;
 yy313:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy378;
+       if (yych == 't') goto yy379;
        goto yy14;
 yy314:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy379;
+       if (yych == '-') goto yy380;
        goto yy14;
 yy315:
-       ++cur;
-#line 72 "../src/parse/lex_conf.re"
-       { lex_conf_input();            return; }
-#line 1506 "src/parse/lex_conf.cc"
-yy317:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy380;
+       if (yych == 'i') goto yy381;
        goto yy14;
-yy318:
+yy316:
        yych = (unsigned char)*++cur;
-       if (yych == 'b') goto yy381;
+       if (yych == 'd') goto yy382;
        goto yy14;
-yy319:
+yy317:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy382;
+       if (yych == '-') goto yy383;
        goto yy14;
-yy320:
+yy318:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy383;
+       if (yych == 'i') goto yy384;
        goto yy14;
-yy321:
+yy319:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy384;
+       if (yych == 's') goto yy385;
        goto yy14;
+yy320:
+       ++cur;
+#line 72 "../src/parse/lex_conf.re"
+       { lex_conf_input();            return; }
+#line 1531 "src/parse/lex_conf.cc"
 yy322:
        yych = (unsigned char)*++cur;
-       if (yych == 'b') goto yy385;
+       if (yych == 'd') goto yy386;
        goto yy14;
 yy323:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy386;
+       if (yych == 'b') goto yy387;
        goto yy14;
 yy324:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy387;
+       if (yych == 'n') goto yy388;
        goto yy14;
 yy325:
        yych = (unsigned char)*++cur;
-       if (yych == 'b') goto yy388;
+       if (yych == 'r') goto yy389;
        goto yy14;
 yy326:
        yych = (unsigned char)*++cur;
-       if (yych == 'h') goto yy389;
+       if (yych == 't') goto yy390;
        goto yy14;
 yy327:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy390;
+       if (yych == 'b') goto yy391;
        goto yy14;
 yy328:
        yych = (unsigned char)*++cur;
-       if (yych == '6') goto yy126;
+       if (yych == 't') goto yy392;
        goto yy14;
 yy329:
        yych = (unsigned char)*++cur;
-       if (yych == 'c') goto yy391;
+       if (yych == '-') goto yy393;
        goto yy14;
 yy330:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy392;
+       if (yych == 'b') goto yy394;
        goto yy14;
 yy331:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy393;
+       if (yych == 'h') goto yy395;
        goto yy14;
 yy332:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy394;
+       if (yych == 'd') goto yy396;
        goto yy14;
 yy333:
+       yych = (unsigned char)*++cur;
+       if (yych == '6') goto yy127;
+       goto yy14;
+yy334:
+       yych = (unsigned char)*++cur;
+       if (yych == 'c') goto yy397;
+       goto yy14;
+yy335:
+       yych = (unsigned char)*++cur;
+       if (yych == 'n') goto yy398;
+       goto yy14;
+yy336:
+       yych = (unsigned char)*++cur;
+       if (yych == 'l') goto yy399;
+       goto yy14;
+yy337:
+       yych = (unsigned char)*++cur;
+       if (yych == 't') goto yy400;
+       goto yy14;
+yy338:
        ++cur;
-#line 160 "../src/parse/lex_conf.re"
+#line 161 "../src/parse/lex_conf.re"
        { opts.set_labelPrefix (lex_conf_string ()); return; }
-#line 1575 "src/parse/lex_conf.cc"
-yy335:
+#line 1600 "src/parse/lex_conf.cc"
+yy340:
        ++cur;
        if (lim <= cur) fill(1);
        yych = (unsigned char)*cur;
        if (yybm[0+yych] & 64) {
-               goto yy335;
+               goto yy340;
        }
        if (yych != '=') goto yy14;
-yy337:
+yy342:
        ++cur;
        if ((lim - cur) < 2) fill(2);
        yych = (unsigned char)*cur;
        if (yych <= ',') {
                if (yych <= '\t') {
                        if (yych <= 0x08) goto yy14;
-                       goto yy337;
+                       goto yy342;
                } else {
-                       if (yych == ' ') goto yy337;
+                       if (yych == ' ') goto yy342;
                        goto yy14;
                }
        } else {
                if (yych <= '/') {
-                       if (yych <= '-') goto yy396;
+                       if (yych <= '-') goto yy402;
                        goto yy14;
                } else {
-                       if (yych <= '0') goto yy397;
-                       if (yych <= '9') goto yy399;
+                       if (yych <= '0') goto yy403;
+                       if (yych <= '9') goto yy405;
                        goto yy14;
                }
        }
-yy339:
+yy344:
        ++cur;
 #line 97 "../src/parse/lex_conf.re"
        { opts.set_bUseStateAbort  (lex_conf_bool()); return; }
-#line 1610 "src/parse/lex_conf.cc"
-yy341:
+#line 1635 "src/parse/lex_conf.cc"
+yy346:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy401;
+       if (yych == 'a') goto yy407;
        goto yy14;
-yy342:
+yy347:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy402;
+       if (yych == 't') goto yy408;
        goto yy14;
-yy343:
+yy348:
+       yych = (unsigned char)*++cur;
+       if (yych == 's') goto yy410;
+       goto yy14;
+yy349:
        ++cur;
-#line 131 "../src/parse/lex_conf.re"
+#line 132 "../src/parse/lex_conf.re"
        { opts.set_tags_prefix    (lex_conf_string ()); return; }
-#line 1623 "src/parse/lex_conf.cc"
-yy345:
+#line 1652 "src/parse/lex_conf.cc"
+yy351:
        yych = (unsigned char)*++cur;
        if (yych <= 'c') {
                if (yych <= '`') goto yy14;
-               if (yych <= 'a') goto yy403;
-               if (yych <= 'b') goto yy404;
-               goto yy405;
+               if (yych <= 'a') goto yy411;
+               if (yych <= 'b') goto yy412;
+               goto yy413;
        } else {
                if (yych <= 'r') goto yy14;
-               if (yych <= 's') goto yy406;
-               if (yych <= 't') goto yy407;
+               if (yych <= 's') goto yy414;
+               if (yych <= 't') goto yy415;
                goto yy14;
        }
-yy346:
-       yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy408;
-       goto yy14;
-yy347:
-       yych = (unsigned char)*++cur;
-       if (yych == 'k') goto yy409;
-       goto yy14;
-yy348:
-       yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy411;
-       goto yy14;
-yy349:
-       yych = (unsigned char)*++cur;
-       if (yych == 'm') goto yy412;
-       goto yy14;
-yy350:
+yy352:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy413;
+       if (yych == 's') goto yy416;
        goto yy14;
-yy351:
-       yyaccept = 15;
-       yych = (unsigned char)*(ptr = ++cur);
-       if (yych == '@') goto yy414;
-yy352:
-#line 84 "../src/parse/lex_conf.re"
-       { opts.set_condDivider      (lex_conf_string ()); return; }
-#line 1664 "src/parse/lex_conf.cc"
 yy353:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy415;
+       if (yych == 'k') goto yy417;
        goto yy14;
 yy354:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy416;
+       if (yych == 'l') goto yy419;
        goto yy14;
 yy355:
        yych = (unsigned char)*++cur;
-       if (yych == 'K') goto yy417;
+       if (yych == 'm') goto yy420;
        goto yy14;
 yy356:
        yych = (unsigned char)*++cur;
-       if (yych == 'D') goto yy418;
+       if (yych == 'o') goto yy421;
        goto yy14;
 yy357:
-       yych = (unsigned char)*++cur;
-       if (yych == 'Y') goto yy419;
-       goto yy14;
+       yyaccept = 15;
+       yych = (unsigned char)*(ptr = ++cur);
+       if (yych == '@') goto yy422;
 yy358:
-       yych = (unsigned char)*++cur;
-       if (yych == 'M') goto yy420;
-       goto yy14;
+#line 84 "../src/parse/lex_conf.re"
+       { opts.set_condDivider      (lex_conf_string ()); return; }
+#line 1693 "src/parse/lex_conf.cc"
 yy359:
        yych = (unsigned char)*++cur;
-       if (yych == 'P') goto yy421;
+       if (yych == 'n') goto yy423;
        goto yy14;
 yy360:
        yych = (unsigned char)*++cur;
-       if (yych == 'S') goto yy422;
+       if (yych == 'i') goto yy424;
        goto yy14;
 yy361:
        yych = (unsigned char)*++cur;
-       if (yych == 'U') goto yy423;
+       if (yych == 'K') goto yy425;
        goto yy14;
 yy362:
        yych = (unsigned char)*++cur;
-       if (yych == 'L') goto yy424;
+       if (yych == 'D') goto yy426;
        goto yy14;
 yy363:
        yych = (unsigned char)*++cur;
-       if (yych == 'C') goto yy426;
-       if (yych == 'S') goto yy427;
+       if (yych == 'Y') goto yy427;
        goto yy14;
 yy364:
        yych = (unsigned char)*++cur;
-       if (yych == 'S') goto yy428;
+       if (yych == 'M') goto yy428;
        goto yy14;
 yy365:
        yych = (unsigned char)*++cur;
-       if (yych == 'I') goto yy429;
+       if (yych == 'P') goto yy429;
        goto yy14;
 yy366:
        yych = (unsigned char)*++cur;
-       if (yych == 'K') goto yy430;
+       if (yych == 'S') goto yy430;
        goto yy14;
 yy367:
        yych = (unsigned char)*++cur;
-       if (yych == 'K') goto yy431;
+       if (yych == 'U') goto yy431;
        goto yy14;
 yy368:
        yych = (unsigned char)*++cur;
-       if (yych == 'T') goto yy433;
+       if (yych == 'L') goto yy432;
        goto yy14;
 yy369:
        yych = (unsigned char)*++cur;
@@ -1733,1459 +1737,1489 @@ yy369:
        goto yy14;
 yy370:
        yych = (unsigned char)*++cur;
-       if (yych == 'P') goto yy436;
+       if (yych == 'S') goto yy436;
        goto yy14;
 yy371:
        yych = (unsigned char)*++cur;
-       if (yych == 'c') goto yy438;
+       if (yych == 'I') goto yy437;
        goto yy14;
 yy372:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy439;
+       if (yych == 'K') goto yy438;
        goto yy14;
 yy373:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy440;
+       if (yych == 'K') goto yy439;
        goto yy14;
 yy374:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy441;
+       if (yych == 'T') goto yy441;
        goto yy14;
 yy375:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy442;
+       if (yych == 'C') goto yy442;
+       if (yych == 'S') goto yy443;
        goto yy14;
 yy376:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy443;
+       if (yych == 'P') goto yy444;
        goto yy14;
 yy377:
        yych = (unsigned char)*++cur;
-       if (yych == 'c') goto yy444;
+       if (yych == 'c') goto yy446;
        goto yy14;
 yy378:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy445;
+       if (yych == 'n') goto yy447;
        goto yy14;
 yy379:
        yych = (unsigned char)*++cur;
-       if (yych == 'y') goto yy446;
+       if (yych == 'e') goto yy448;
        goto yy14;
 yy380:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy447;
+       if (yych == 'o') goto yy449;
        goto yy14;
 yy381:
        yych = (unsigned char)*++cur;
-       if (yych == 'u') goto yy448;
+       if (yych == 'n') goto yy450;
        goto yy14;
 yy382:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy449;
+       if (yych == 'o') goto yy451;
        goto yy14;
 yy383:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy450;
+       if (yych == 'c') goto yy452;
        goto yy14;
 yy384:
        yych = (unsigned char)*++cur;
-       goto yy115;
+       if (yych == 'n') goto yy453;
+       goto yy14;
 yy385:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy451;
+       if (yych == 'y') goto yy454;
        goto yy14;
 yy386:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy452;
+       if (yych == '-') goto yy455;
        goto yy14;
 yy387:
        yych = (unsigned char)*++cur;
-       if (yych == 'c') goto yy453;
+       if (yych == 'u') goto yy456;
        goto yy14;
 yy388:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy454;
+       if (yych == 'e') goto yy457;
        goto yy14;
 yy389:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy455;
+       if (yych == 's') goto yy458;
        goto yy14;
 yy390:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy456;
-       goto yy14;
+       goto yy116;
 yy391:
        yych = (unsigned char)*++cur;
-       if (yych == 'h') goto yy457;
+       if (yych == 'l') goto yy459;
        goto yy14;
 yy392:
        yych = (unsigned char)*++cur;
-       if (yych == 'g') goto yy458;
+       if (yych == 'o') goto yy460;
        goto yy14;
 yy393:
        yych = (unsigned char)*++cur;
-       if (yych == 'L') goto yy460;
+       if (yych == 'c') goto yy461;
        goto yy14;
 yy394:
-       ++cur;
-#line 96 "../src/parse/lex_conf.re"
-       { opts.set_yynext          (lex_conf_string ()); return; }
-#line 1834 "src/parse/lex_conf.cc"
-yy396:
        yych = (unsigned char)*++cur;
-       if (yych <= '0') goto yy14;
-       if (yych <= '9') goto yy399;
+       if (yych == 'l') goto yy462;
        goto yy14;
-yy397:
-       ++cur;
-yy398:
-       cur = ctx;
-#line 163 "../src/parse/lex_conf.re"
-       { out.block().force_start_label = lex_conf_bool(); return; }
-#line 1846 "src/parse/lex_conf.cc"
-yy399:
-       ++cur;
-       if (lim <= cur) fill(1);
-       yych = (unsigned char)*cur;
-       if (yybm[0+yych] & 128) {
-               goto yy399;
-       }
-       goto yy398;
-yy401:
+yy395:
        yych = (unsigned char)*++cur;
-       if (yych == 'b') goto yy461;
+       if (yych == 'e') goto yy463;
        goto yy14;
-yy402:
+yy396:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy462;
+       if (yych == 'e') goto yy464;
        goto yy14;
-yy403:
+yy397:
        yych = (unsigned char)*++cur;
-       if (yych == 'c') goto yy463;
+       if (yych == 'h') goto yy465;
        goto yy14;
-yy404:
+yy398:
        yych = (unsigned char)*++cur;
-       if (yych == 'm') goto yy464;
+       if (yych == 'g') goto yy466;
        goto yy14;
-yy405:
+yy399:
        yych = (unsigned char)*++cur;
-       if (yych == 'h') goto yy466;
-       if (yych == 't') goto yy468;
+       if (yych == 'L') goto yy468;
        goto yy14;
-yy406:
+yy400:
+       ++cur;
+#line 96 "../src/parse/lex_conf.re"
+       { opts.set_yynext          (lex_conf_string ()); return; }
+#line 1863 "src/parse/lex_conf.cc"
+yy402:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy469;
+       if (yych <= '0') goto yy14;
+       if (yych <= '9') goto yy405;
        goto yy14;
+yy403:
+       ++cur;
+yy404:
+       cur = ctx;
+#line 164 "../src/parse/lex_conf.re"
+       { out.block().force_start_label = lex_conf_bool(); return; }
+#line 1875 "src/parse/lex_conf.cc"
+yy405:
+       ++cur;
+       if (lim <= cur) fill(1);
+       yych = (unsigned char)*cur;
+       if (yybm[0+yych] & 128) {
+               goto yy405;
+       }
+       goto yy404;
 yy407:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy470;
+       if (yych == 'b') goto yy469;
        goto yy14;
 yy408:
-       yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy471;
-       goto yy14;
-yy409:
        ++cur;
-#line 158 "../src/parse/lex_conf.re"
-       { opts.set_fill_check   (lex_conf_bool()); return; }
+#line 131 "../src/parse/lex_conf.re"
+       { opts.set_tags_default   (lex_conf_string ()); return; }
 #line 1892 "src/parse/lex_conf.cc"
+yy410:
+       yych = (unsigned char)*++cur;
+       if (yych == 'i') goto yy470;
+       goto yy14;
 yy411:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy472;
+       if (yych == 'c') goto yy471;
        goto yy14;
 yy412:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy474;
+       if (yych == 'm') goto yy472;
        goto yy14;
 yy413:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy475;
+       if (yych == 'h') goto yy474;
+       if (yych == 't') goto yy476;
        goto yy14;
 yy414:
        yych = (unsigned char)*++cur;
-       if (yych == 'c') goto yy476;
+       if (yych == 't') goto yy477;
        goto yy14;
 yy415:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy477;
+       if (yych == 'a') goto yy478;
        goto yy14;
 yy416:
        yych = (unsigned char)*++cur;
-       if (yych == 'x') goto yy479;
+       if (yych == 'i') goto yy479;
        goto yy14;
 yy417:
-       yych = (unsigned char)*++cur;
-       if (yych == 'U') goto yy481;
-       goto yy14;
-yy418:
-       yych = (unsigned char)*++cur;
-       if (yych == 'T') goto yy482;
-       goto yy14;
+       ++cur;
+#line 159 "../src/parse/lex_conf.re"
+       { opts.set_fill_check   (lex_conf_bool()); return; }
+#line 1926 "src/parse/lex_conf.cc"
 yy419:
        yych = (unsigned char)*++cur;
-       if (yych == 'T') goto yy483;
+       if (yych == 'e') goto yy480;
        goto yy14;
 yy420:
        yych = (unsigned char)*++cur;
-       if (yych == 'A') goto yy484;
+       if (yych == 'e') goto yy482;
        goto yy14;
 yy421:
        yych = (unsigned char)*++cur;
-       if (yych == 'E') goto yy485;
+       if (yych == 'l') goto yy483;
        goto yy14;
 yy422:
        yych = (unsigned char)*++cur;
-       if (yych == 'O') goto yy487;
+       if (yych == 'c') goto yy484;
        goto yy14;
 yy423:
        yych = (unsigned char)*++cur;
-       if (yych == 'G') goto yy488;
+       if (yych == 'd') goto yy485;
        goto yy14;
 yy424:
-       yyaccept = 16;
-       yych = (unsigned char)*(ptr = ++cur);
-       if (yych == ':') goto yy490;
-       if (yych == '@') goto yy491;
+       yych = (unsigned char)*++cur;
+       if (yych == 'x') goto yy487;
+       goto yy14;
 yy425:
-#line 153 "../src/parse/lex_conf.re"
-       { opts.set_fill         (lex_conf_string ()); return; }
-#line 1953 "src/parse/lex_conf.cc"
+       yych = (unsigned char)*++cur;
+       if (yych == 'U') goto yy489;
+       goto yy14;
 yy426:
        yych = (unsigned char)*++cur;
-       if (yych == 'O') goto yy492;
+       if (yych == 'T') goto yy490;
        goto yy14;
 yy427:
        yych = (unsigned char)*++cur;
-       if (yych == 'T') goto yy493;
+       if (yych == 'T') goto yy491;
        goto yy14;
 yy428:
        yych = (unsigned char)*++cur;
-       if (yych == 'T') goto yy494;
+       if (yych == 'A') goto yy492;
        goto yy14;
 yy429:
        yych = (unsigned char)*++cur;
-       if (yych == 'T') goto yy495;
+       if (yych == 'E') goto yy493;
        goto yy14;
 yy430:
        yych = (unsigned char)*++cur;
-       if (yych == 'E') goto yy497;
+       if (yych == 'O') goto yy495;
        goto yy14;
 yy431:
-       ++cur;
-#line 120 "../src/parse/lex_conf.re"
-       { opts.set_yypeek       (lex_conf_string ()); return; }
-#line 1978 "src/parse/lex_conf.cc"
-yy433:
        yych = (unsigned char)*++cur;
-       if (yych == 'O') goto yy498;
+       if (yych == 'G') goto yy496;
        goto yy14;
+yy432:
+       yyaccept = 16;
+       yych = (unsigned char)*(ptr = ++cur);
+       if (yych == ':') goto yy498;
+       if (yych == '@') goto yy499;
+yy433:
+#line 154 "../src/parse/lex_conf.re"
+       { opts.set_fill         (lex_conf_string ()); return; }
+#line 1987 "src/parse/lex_conf.cc"
 yy434:
        yych = (unsigned char)*++cur;
-       if (yych == 'O') goto yy499;
+       if (yych == 'O') goto yy500;
        goto yy14;
 yy435:
        yych = (unsigned char)*++cur;
-       if (yych == 'T') goto yy500;
+       if (yych == 'T') goto yy501;
        goto yy14;
 yy436:
-       ++cur;
-#line 121 "../src/parse/lex_conf.re"
-       { opts.set_yyskip       (lex_conf_string ()); return; }
-#line 1995 "src/parse/lex_conf.cc"
-yy438:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy501;
+       if (yych == 'T') goto yy502;
        goto yy14;
-yy439:
+yy437:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy502;
-       if (yych == 'v') goto yy503;
+       if (yych == 'T') goto yy503;
        goto yy14;
-yy440:
+yy438:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy504;
+       if (yych == 'E') goto yy505;
        goto yy14;
+yy439:
+       ++cur;
+#line 120 "../src/parse/lex_conf.re"
+       { opts.set_yypeek       (lex_conf_string ()); return; }
+#line 2012 "src/parse/lex_conf.cc"
 yy441:
        yych = (unsigned char)*++cur;
-       if (yych == 'u') goto yy505;
+       if (yych == 'O') goto yy506;
        goto yy14;
 yy442:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy506;
+       if (yych == 'O') goto yy507;
        goto yy14;
 yy443:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy91;
+       if (yych == 'T') goto yy508;
        goto yy14;
 yy444:
-       yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy507;
-       goto yy14;
-yy445:
-       yych = (unsigned char)*++cur;
-       if (yych == 'g') goto yy508;
-       goto yy14;
+       ++cur;
+#line 121 "../src/parse/lex_conf.re"
+       { opts.set_yyskip       (lex_conf_string ()); return; }
+#line 2029 "src/parse/lex_conf.cc"
 yy446:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy509;
+       if (yych == 't') goto yy509;
        goto yy14;
 yy447:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy510;
+       if (yych == 's') goto yy510;
+       if (yych == 'v') goto yy511;
        goto yy14;
 yy448:
        yych = (unsigned char)*++cur;
-       if (yych == 'g') goto yy511;
+       if (yych == 'd') goto yy512;
        goto yy14;
 yy449:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy512;
+       if (yych == 'u') goto yy513;
        goto yy14;
 yy450:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy513;
+       if (yych == 'i') goto yy514;
        goto yy14;
 yy451:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy514;
+       if (yych == 't') goto yy92;
        goto yy14;
 yy452:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy95;
+       if (yych == 'l') goto yy515;
        goto yy14;
 yy453:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy515;
+       if (yych == 'g') goto yy516;
        goto yy14;
 yy454:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy516;
+       if (yych == 'n') goto yy517;
        goto yy14;
 yy455:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy517;
+       if (yych == 'i') goto yy518;
        goto yy14;
 yy456:
        yych = (unsigned char)*++cur;
-       goto yy123;
+       if (yych == 'g') goto yy519;
+       goto yy14;
 yy457:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy518;
+       if (yych == 'r') goto yy520;
        goto yy14;
 yy458:
-       ++cur;
-#line 134 "../src/parse/lex_conf.re"
-       { opts.set_indString (lex_conf_string ()); return; }
-#line 2080 "src/parse/lex_conf.cc"
+       yych = (unsigned char)*++cur;
+       if (yych == 'i') goto yy521;
+       goto yy14;
+yy459:
+       yych = (unsigned char)*++cur;
+       if (yych == 'e') goto yy522;
+       goto yy14;
 yy460:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy519;
+       if (yych == 'n') goto yy96;
        goto yy14;
 yy461:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy520;
+       if (yych == 'o') goto yy523;
        goto yy14;
 yy462:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy521;
+       if (yych == 'e') goto yy524;
        goto yy14;
 yy463:
        yych = (unsigned char)*++cur;
-       if (yych == 'c') goto yy522;
+       if (yych == 'a') goto yy525;
        goto yy14;
 yy464:
-       ++cur;
-#line 101 "../src/parse/lex_conf.re"
-       { opts.set_yybm         (lex_conf_string ()); return; }
-#line 2101 "src/parse/lex_conf.cc"
+       yych = (unsigned char)*++cur;
+       goto yy124;
+yy465:
+       yych = (unsigned char)*++cur;
+       if (yych == 'a') goto yy526;
+       goto yy14;
 yy466:
        ++cur;
-#line 149 "../src/parse/lex_conf.re"
-       { opts.set_yych           (lex_conf_string ()); return; }
-#line 2106 "src/parse/lex_conf.cc"
+#line 135 "../src/parse/lex_conf.re"
+       { opts.set_indString (lex_conf_string ()); return; }
+#line 2114 "src/parse/lex_conf.cc"
 yy468:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy523;
+       if (yych == 'a') goto yy527;
        goto yy14;
 yy469:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy524;
+       if (yych == 'e') goto yy528;
        goto yy14;
 yy470:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy525;
+       if (yych == 'o') goto yy529;
        goto yy14;
 yy471:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy526;
+       if (yych == 'c') goto yy530;
        goto yy14;
 yy472:
        ++cur;
-#line 154 "../src/parse/lex_conf.re"
-       { opts.set_fill_use     (lex_conf_bool()); return; }
-#line 2127 "src/parse/lex_conf.cc"
+#line 101 "../src/parse/lex_conf.re"
+       { opts.set_yybm         (lex_conf_string ()); return; }
+#line 2135 "src/parse/lex_conf.cc"
 yy474:
+       ++cur;
+#line 150 "../src/parse/lex_conf.re"
+       { opts.set_yych           (lex_conf_string ()); return; }
+#line 2140 "src/parse/lex_conf.cc"
+yy476:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy527;
+       if (yych == 'a') goto yy531;
        goto yy14;
-yy475:
+yy477:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy528;
+       if (yych == 'a') goto yy532;
        goto yy14;
-yy476:
+yy478:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy530;
+       if (yych == 'r') goto yy533;
        goto yy14;
-yy477:
-       ++cur;
-#line 87 "../src/parse/lex_conf.re"
-       { opts.set_condGotoParam    (lex_conf_string ()); return; }
-#line 2144 "src/parse/lex_conf.cc"
 yy479:
-       ++cur;
-#line 83 "../src/parse/lex_conf.re"
-       { opts.set_condEnumPrefix   (lex_conf_string ()); return; }
-#line 2149 "src/parse/lex_conf.cc"
-yy481:
        yych = (unsigned char)*++cur;
-       if (yych == 'P') goto yy531;
+       if (yych == 'o') goto yy534;
        goto yy14;
+yy480:
+       ++cur;
+#line 155 "../src/parse/lex_conf.re"
+       { opts.set_fill_use     (lex_conf_bool()); return; }
+#line 2161 "src/parse/lex_conf.cc"
 yy482:
        yych = (unsigned char)*++cur;
-       if (yych == 'Y') goto yy533;
+       if (yych == 't') goto yy535;
        goto yy14;
 yy483:
        yych = (unsigned char)*++cur;
-       if (yych == 'A') goto yy534;
+       if (yych == 'd') goto yy536;
        goto yy14;
 yy484:
        yych = (unsigned char)*++cur;
-       if (yych == 'R') goto yy535;
+       if (yych == 'o') goto yy538;
        goto yy14;
 yy485:
        ++cur;
-#line 148 "../src/parse/lex_conf.re"
-       { opts.set_yyctype        (lex_conf_string ()); return; }
-#line 2170 "src/parse/lex_conf.cc"
+#line 87 "../src/parse/lex_conf.re"
+       { opts.set_condGotoParam    (lex_conf_string ()); return; }
+#line 2178 "src/parse/lex_conf.cc"
 yy487:
+       ++cur;
+#line 83 "../src/parse/lex_conf.re"
+       { opts.set_condEnumPrefix   (lex_conf_string ()); return; }
+#line 2183 "src/parse/lex_conf.cc"
+yy489:
        yych = (unsigned char)*++cur;
-       if (yych == 'R') goto yy536;
+       if (yych == 'P') goto yy539;
        goto yy14;
-yy488:
-       ++cur;
-#line 146 "../src/parse/lex_conf.re"
-       { opts.set_yydebug (lex_conf_string ()); return; }
-#line 2179 "src/parse/lex_conf.cc"
 yy490:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy538;
+       if (yych == 'Y') goto yy541;
        goto yy14;
 yy491:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy539;
+       if (yych == 'A') goto yy542;
        goto yy14;
 yy492:
        yych = (unsigned char)*++cur;
-       if (yych == 'N') goto yy540;
+       if (yych == 'R') goto yy543;
        goto yy14;
 yy493:
-       yych = (unsigned char)*++cur;
-       if (yych == 'A') goto yy541;
-       goto yy14;
-yy494:
-       yych = (unsigned char)*++cur;
-       if (yych == 'H') goto yy542;
-       goto yy14;
-yy495:
        ++cur;
-#line 118 "../src/parse/lex_conf.re"
-       { opts.set_yylimit     (lex_conf_string ()); return; }
+#line 149 "../src/parse/lex_conf.re"
+       { opts.set_yyctype        (lex_conf_string ()); return; }
 #line 2204 "src/parse/lex_conf.cc"
-yy497:
+yy495:
        yych = (unsigned char)*++cur;
-       if (yych == 'R') goto yy543;
+       if (yych == 'R') goto yy544;
        goto yy14;
+yy496:
+       ++cur;
+#line 147 "../src/parse/lex_conf.re"
+       { opts.set_yydebug (lex_conf_string ()); return; }
+#line 2213 "src/parse/lex_conf.cc"
 yy498:
        yych = (unsigned char)*++cur;
-       if (yych == 'R') goto yy545;
+       if (yych == 'n') goto yy546;
        goto yy14;
 yy499:
        yych = (unsigned char)*++cur;
-       if (yych == 'N') goto yy546;
+       if (yych == 'l') goto yy547;
        goto yy14;
 yy500:
        yych = (unsigned char)*++cur;
-       if (yych == 'A') goto yy547;
+       if (yych == 'N') goto yy548;
        goto yy14;
 yy501:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy548;
+       if (yych == 'A') goto yy549;
        goto yy14;
 yy502:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy549;
+       if (yych == 'H') goto yy550;
        goto yy14;
 yy503:
-       yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy550;
-       goto yy14;
-yy504:
-       yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy551;
-       goto yy14;
+       ++cur;
+#line 118 "../src/parse/lex_conf.re"
+       { opts.set_yylimit     (lex_conf_string ()); return; }
+#line 2238 "src/parse/lex_conf.cc"
 yy505:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy552;
+       if (yych == 'R') goto yy551;
        goto yy14;
 yy506:
        yych = (unsigned char)*++cur;
-       if (yych == 'm') goto yy553;
+       if (yych == 'R') goto yy553;
        goto yy14;
 yy507:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy554;
+       if (yych == 'N') goto yy554;
        goto yy14;
 yy508:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy555;
+       if (yych == 'A') goto yy555;
        goto yy14;
 yy509:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy556;
+       if (yych == 'o') goto yy556;
        goto yy14;
 yy510:
        yych = (unsigned char)*++cur;
-       if (yych == 'f') goto yy557;
+       if (yych == 'e') goto yy557;
        goto yy14;
 yy511:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy558;
+       if (yych == 'e') goto yy558;
        goto yy14;
 yy512:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy559;
+       if (yych == '-') goto yy559;
        goto yy14;
 yy513:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy560;
+       if (yych == 't') goto yy560;
        goto yy14;
 yy514:
        yych = (unsigned char)*++cur;
-       goto yy117;
+       if (yych == 'm') goto yy561;
+       goto yy14;
 yy515:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy561;
+       if (yych == 'a') goto yy562;
        goto yy14;
 yy516:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy562;
+       if (yych == '-') goto yy563;
        goto yy14;
 yy517:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy563;
+       if (yych == 't') goto yy564;
        goto yy14;
 yy518:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy564;
+       if (yych == 'f') goto yy565;
        goto yy14;
 yy519:
        yych = (unsigned char)*++cur;
-       if (yych == 'b') goto yy565;
+       if (yych == '-') goto yy566;
        goto yy14;
 yy520:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy566;
+       if (yych == 'a') goto yy567;
        goto yy14;
 yy521:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy568;
+       if (yych == 'o') goto yy568;
        goto yy14;
 yy522:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy570;
-       goto yy14;
+       goto yy118;
 yy523:
        yych = (unsigned char)*++cur;
-       if (yych == 'b') goto yy571;
+       if (yych == 'n') goto yy569;
        goto yy14;
 yy524:
        yych = (unsigned char)*++cur;
-       if (yych == 'b') goto yy572;
+       if (yych == '-') goto yy570;
        goto yy14;
 yy525:
        yych = (unsigned char)*++cur;
-       if (yych == 'g') goto yy573;
+       if (yych == 'd') goto yy571;
        goto yy14;
 yy526:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy574;
+       if (yych == 'r') goto yy572;
        goto yy14;
 yy527:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy576;
+       if (yych == 'b') goto yy573;
        goto yy14;
 yy528:
-       ++cur;
-#line 104 "../src/parse/lex_conf.re"
-       {
-               const int32_t n = lex_conf_number ();
-               if (n < 0)
-               {
-                       fatal ("configuration 'cgoto:threshold' must be nonnegative");
-               }
-               opts.set_cGotoThreshold (static_cast<uint32_t> (n));
-               return;
-       }
-#line 2340 "src/parse/lex_conf.cc"
+       yych = (unsigned char)*++cur;
+       if (yych == 'l') goto yy574;
+       goto yy14;
+yy529:
+       yych = (unsigned char)*++cur;
+       if (yych == 'n') goto yy576;
+       goto yy14;
 yy530:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy577;
+       if (yych == 'e') goto yy578;
        goto yy14;
 yy531:
-       yyaccept = 17;
-       yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'C') goto yy578;
-       if (yych == 'T') goto yy579;
+       yych = (unsigned char)*++cur;
+       if (yych == 'b') goto yy579;
+       goto yy14;
 yy532:
-#line 122 "../src/parse/lex_conf.re"
-       { opts.set_yybackup     (lex_conf_string ()); return; }
-#line 2353 "src/parse/lex_conf.cc"
+       yych = (unsigned char)*++cur;
+       if (yych == 'b') goto yy580;
+       goto yy14;
 yy533:
        yych = (unsigned char)*++cur;
-       if (yych == 'P') goto yy580;
+       if (yych == 'g') goto yy581;
        goto yy14;
 yy534:
        yych = (unsigned char)*++cur;
-       if (yych == 'G') goto yy581;
+       if (yych == 'n') goto yy582;
        goto yy14;
 yy535:
        yych = (unsigned char)*++cur;
-       if (yych == 'K') goto yy583;
+       if (yych == 'e') goto yy584;
        goto yy14;
 yy536:
        ++cur;
-#line 115 "../src/parse/lex_conf.re"
-       { opts.set_yycursor    (lex_conf_string ()); return; }
-#line 2370 "src/parse/lex_conf.cc"
+#line 104 "../src/parse/lex_conf.re"
+       {
+               const int32_t n = lex_conf_number ();
+               if (n < 0)
+               {
+                       fatal ("configuration 'cgoto:threshold' must be nonnegative");
+               }
+               opts.set_cGotoThreshold (static_cast<uint32_t> (n));
+               return;
+       }
+#line 2374 "src/parse/lex_conf.cc"
 yy538:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy584;
+       if (yych == 'n') goto yy585;
        goto yy14;
 yy539:
-       yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy585;
-       goto yy14;
+       yyaccept = 17;
+       yych = (unsigned char)*(ptr = ++cur);
+       if (yych == 'C') goto yy586;
+       if (yych == 'T') goto yy587;
 yy540:
-       yych = (unsigned char)*++cur;
-       if (yych == 'D') goto yy586;
-       goto yy14;
+#line 122 "../src/parse/lex_conf.re"
+       { opts.set_yybackup     (lex_conf_string ()); return; }
+#line 2387 "src/parse/lex_conf.cc"
 yy541:
        yych = (unsigned char)*++cur;
-       if (yych == 'T') goto yy587;
+       if (yych == 'P') goto yy588;
        goto yy14;
 yy542:
        yych = (unsigned char)*++cur;
-       if (yych == 'A') goto yy588;
+       if (yych == 'G') goto yy589;
        goto yy14;
 yy543:
-       ++cur;
-#line 116 "../src/parse/lex_conf.re"
-       { opts.set_yymarker    (lex_conf_string ()); return; }
-#line 2395 "src/parse/lex_conf.cc"
-yy545:
        yych = (unsigned char)*++cur;
-       if (yych == 'E') goto yy589;
+       if (yych == 'K') goto yy591;
        goto yy14;
+yy544:
+       ++cur;
+#line 115 "../src/parse/lex_conf.re"
+       { opts.set_yycursor    (lex_conf_string ()); return; }
+#line 2404 "src/parse/lex_conf.cc"
 yy546:
        yych = (unsigned char)*++cur;
-       if (yych == 'D') goto yy591;
+       if (yych == 'a') goto yy592;
        goto yy14;
 yy547:
        yych = (unsigned char)*++cur;
-       if (yych == 'T') goto yy592;
+       if (yych == 'e') goto yy593;
        goto yy14;
 yy548:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy593;
+       if (yych == 'D') goto yy594;
        goto yy14;
 yy549:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy594;
+       if (yych == 'T') goto yy595;
        goto yy14;
 yy550:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy595;
+       if (yych == 'A') goto yy596;
        goto yy14;
 yy551:
-       yych = (unsigned char)*++cur;
-       if (yych == 'g') goto yy596;
-       goto yy14;
-yy552:
-       yych = (unsigned char)*++cur;
-       if (yych == 'p') goto yy597;
-       goto yy14;
+       ++cur;
+#line 116 "../src/parse/lex_conf.re"
+       { opts.set_yymarker    (lex_conf_string ()); return; }
+#line 2429 "src/parse/lex_conf.cc"
 yy553:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy598;
+       if (yych == 'E') goto yy597;
        goto yy14;
 yy554:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy599;
+       if (yych == 'D') goto yy599;
        goto yy14;
 yy555:
        yych = (unsigned char)*++cur;
-       if (yych == 'p') goto yy600;
+       if (yych == 'T') goto yy600;
        goto yy14;
 yy556:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy601;
+       if (yych == 'r') goto yy601;
        goto yy14;
 yy557:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy602;
+       if (yych == 'n') goto yy602;
        goto yy14;
 yy558:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy603;
+       if (yych == 'r') goto yy603;
        goto yy14;
 yy559:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy604;
+       if (yych == 'g') goto yy604;
        goto yy14;
 yy560:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy605;
+       if (yych == 'p') goto yy605;
        goto yy14;
 yy561:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy607;
+       if (yych == 'i') goto yy606;
        goto yy14;
 yy562:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy608;
+       if (yych == 's') goto yy607;
        goto yy14;
 yy563:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy609;
+       if (yych == 'p') goto yy608;
        goto yy14;
 yy564:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy610;
+       if (yych == 'a') goto yy609;
        goto yy14;
 yy565:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy611;
+       if (yych == 's') goto yy610;
        goto yy14;
 yy566:
-       ++cur;
-#line 98 "../src/parse/lex_conf.re"
-       { opts.set_bUseStateNext   (lex_conf_bool()); return; }
-#line 2484 "src/parse/lex_conf.cc"
+       yych = (unsigned char)*++cur;
+       if (yych == 'i') goto yy611;
+       goto yy14;
+yy567:
+       yych = (unsigned char)*++cur;
+       if (yych == 't') goto yy612;
+       goto yy14;
 yy568:
-       ++cur;
-#line 132 "../src/parse/lex_conf.re"
-       { opts.set_tags_expression(lex_conf_string ()); return; }
-#line 2489 "src/parse/lex_conf.cc"
+       yych = (unsigned char)*++cur;
+       if (yych == 'n') goto yy613;
+       goto yy14;
+yy569:
+       yych = (unsigned char)*++cur;
+       if (yych == 'd') goto yy615;
+       goto yy14;
 yy570:
        yych = (unsigned char)*++cur;
-       if (yych == 'p') goto yy612;
+       if (yych == 's') goto yy616;
        goto yy14;
 yy571:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy613;
+       if (yych == 'e') goto yy617;
        goto yy14;
 yy572:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy614;
+       if (yych == 's') goto yy618;
        goto yy14;
 yy573:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy615;
+       if (yych == 'e') goto yy619;
        goto yy14;
 yy574:
        ++cur;
-#line 150 "../src/parse/lex_conf.re"
-       { opts.set_yychConversion (lex_conf_bool()); return; }
-#line 2510 "src/parse/lex_conf.cc"
+#line 98 "../src/parse/lex_conf.re"
+       { opts.set_bUseStateNext   (lex_conf_bool()); return; }
+#line 2518 "src/parse/lex_conf.cc"
 yy576:
-       yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy616;
-       goto yy14;
-yy577:
-       yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy618;
-       goto yy14;
+       ++cur;
+#line 133 "../src/parse/lex_conf.re"
+       { opts.set_tags_expression(lex_conf_string ()); return; }
+#line 2523 "src/parse/lex_conf.cc"
 yy578:
        yych = (unsigned char)*++cur;
-       if (yych == 'T') goto yy620;
+       if (yych == 'p') goto yy620;
        goto yy14;
 yy579:
        yych = (unsigned char)*++cur;
-       if (yych == 'A') goto yy621;
+       if (yych == 'l') goto yy621;
        goto yy14;
 yy580:
        yych = (unsigned char)*++cur;
-       if (yych == 'E') goto yy622;
+       if (yych == 'l') goto yy622;
        goto yy14;
 yy581:
-       ++cur;
-#line 128 "../src/parse/lex_conf.re"
-       { opts.set_yycopytag    (lex_conf_string ()); return; }
-#line 2535 "src/parse/lex_conf.cc"
-yy583:
        yych = (unsigned char)*++cur;
-       if (yych == 'E') goto yy624;
+       if (yych == 'e') goto yy623;
        goto yy14;
+yy582:
+       ++cur;
+#line 151 "../src/parse/lex_conf.re"
+       { opts.set_yychConversion (lex_conf_bool()); return; }
+#line 2544 "src/parse/lex_conf.cc"
 yy584:
        yych = (unsigned char)*++cur;
-       if (yych == 'k') goto yy625;
+       if (yych == 'r') goto yy624;
        goto yy14;
 yy585:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy626;
+       if (yych == 'd') goto yy626;
        goto yy14;
 yy586:
        yych = (unsigned char)*++cur;
-       if (yych == 'I') goto yy628;
+       if (yych == 'T') goto yy628;
        goto yy14;
 yy587:
        yych = (unsigned char)*++cur;
-       if (yych == 'E') goto yy629;
+       if (yych == 'A') goto yy629;
        goto yy14;
 yy588:
        yych = (unsigned char)*++cur;
-       if (yych == 'N') goto yy631;
+       if (yych == 'E') goto yy630;
        goto yy14;
 yy589:
-       yyaccept = 18;
-       yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'C') goto yy633;
-       if (yych == 'T') goto yy634;
-yy590:
-#line 125 "../src/parse/lex_conf.re"
-       { opts.set_yyrestore    (lex_conf_string ()); return; }
-#line 2568 "src/parse/lex_conf.cc"
+       ++cur;
+#line 128 "../src/parse/lex_conf.re"
+       { opts.set_yycopytag    (lex_conf_string ()); return; }
+#line 2569 "src/parse/lex_conf.cc"
 yy591:
        yych = (unsigned char)*++cur;
-       if (yych == 'I') goto yy635;
+       if (yych == 'E') goto yy632;
        goto yy14;
 yy592:
        yych = (unsigned char)*++cur;
-       if (yych == 'E') goto yy636;
+       if (yych == 'k') goto yy633;
        goto yy14;
 yy593:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy638;
+       if (yych == 'n') goto yy634;
        goto yy14;
 yy594:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy639;
+       if (yych == 'I') goto yy636;
        goto yy14;
 yy595:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy640;
+       if (yych == 'E') goto yy637;
        goto yy14;
 yy596:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy641;
+       if (yych == 'N') goto yy639;
        goto yy14;
 yy597:
-       yych = (unsigned char)*++cur;
-       if (yych == 'u') goto yy642;
-       goto yy14;
+       yyaccept = 18;
+       yych = (unsigned char)*(ptr = ++cur);
+       if (yych == 'C') goto yy641;
+       if (yych == 'T') goto yy642;
 yy598:
-       yych = (unsigned char)*++cur;
-       if (yych == 'z') goto yy643;
-       goto yy14;
+#line 125 "../src/parse/lex_conf.re"
+       { opts.set_yyrestore    (lex_conf_string ()); return; }
+#line 2602 "src/parse/lex_conf.cc"
 yy599:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy644;
+       if (yych == 'I') goto yy643;
        goto yy14;
 yy600:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy646;
+       if (yych == 'E') goto yy644;
        goto yy14;
 yy601:
        yych = (unsigned char)*++cur;
-       if (yych == 'x') goto yy93;
+       if (yych == 's') goto yy646;
        goto yy14;
 yy602:
        yych = (unsigned char)*++cur;
-       goto yy119;
+       if (yych == 's') goto yy647;
+       goto yy14;
 yy603:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy647;
+       if (yych == 't') goto yy648;
        goto yy14;
 yy604:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy648;
+       if (yych == 'o') goto yy649;
        goto yy14;
 yy605:
-       ++cur;
-#line 58 "../src/parse/lex_conf.re"
-       { opts.set_version(!lex_conf_bool());          return; }
-#line 2628 "src/parse/lex_conf.cc"
+       yych = (unsigned char)*++cur;
+       if (yych == 'u') goto yy650;
+       goto yy14;
+yy606:
+       yych = (unsigned char)*++cur;
+       if (yych == 'z') goto yy651;
+       goto yy14;
 yy607:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy649;
+       if (yych == 's') goto yy652;
        goto yy14;
 yy608:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy650;
+       if (yych == 'o') goto yy654;
        goto yy14;
 yy609:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy651;
+       if (yych == 'x') goto yy94;
        goto yy14;
 yy610:
        yych = (unsigned char)*++cur;
-       goto yy125;
+       goto yy120;
 yy611:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy652;
+       if (yych == 'n') goto yy655;
        goto yy14;
 yy612:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy654;
+       if (yych == 'i') goto yy656;
        goto yy14;
 yy613:
+       ++cur;
+#line 58 "../src/parse/lex_conf.re"
+       { opts.set_version(!lex_conf_bool());          return; }
+#line 2662 "src/parse/lex_conf.cc"
+yy615:
+       yych = (unsigned char)*++cur;
+       if (yych == 'i') goto yy657;
+       goto yy14;
+yy616:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy656;
+       if (yych == 't') goto yy658;
        goto yy14;
-yy614:
+yy617:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy658;
+       if (yych == 'r') goto yy659;
        goto yy14;
-yy615:
+yy618:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy660;
+       goto yy126;
+yy619:
+       yych = (unsigned char)*++cur;
+       if (yych == 'l') goto yy660;
        goto yy14;
-yy616:
+yy620:
+       yych = (unsigned char)*++cur;
+       if (yych == 't') goto yy662;
+       goto yy14;
+yy621:
+       yych = (unsigned char)*++cur;
+       if (yych == 'e') goto yy664;
+       goto yy14;
+yy622:
+       yych = (unsigned char)*++cur;
+       if (yych == 'e') goto yy666;
+       goto yy14;
+yy623:
+       yych = (unsigned char)*++cur;
+       if (yych == 't') goto yy668;
+       goto yy14;
+yy624:
        ++cur;
-#line 156 "../src/parse/lex_conf.re"
+#line 157 "../src/parse/lex_conf.re"
        { opts.set_fill_arg_use (lex_conf_bool()); return; }
-#line 2668 "src/parse/lex_conf.cc"
-yy618:
+#line 2702 "src/parse/lex_conf.cc"
+yy626:
        ++cur;
 #line 85 "../src/parse/lex_conf.re"
        { opts.set_condDividerParam (lex_conf_string ()); return; }
-#line 2673 "src/parse/lex_conf.cc"
-yy620:
+#line 2707 "src/parse/lex_conf.cc"
+yy628:
        yych = (unsigned char)*++cur;
-       if (yych == 'X') goto yy662;
+       if (yych == 'X') goto yy670;
        goto yy14;
-yy621:
+yy629:
        yych = (unsigned char)*++cur;
-       if (yych == 'G') goto yy664;
+       if (yych == 'G') goto yy672;
        goto yy14;
-yy622:
+yy630:
        ++cur;
 #line 76 "../src/parse/lex_conf.re"
        { opts.set_yycondtype       (lex_conf_string ()); return; }
-#line 2686 "src/parse/lex_conf.cc"
-yy624:
+#line 2720 "src/parse/lex_conf.cc"
+yy632:
        yych = (unsigned char)*++cur;
-       if (yych == 'R') goto yy666;
+       if (yych == 'R') goto yy674;
        goto yy14;
-yy625:
+yy633:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy668;
+       if (yych == 'e') goto yy676;
        goto yy14;
-yy626:
+yy634:
        ++cur;
-#line 155 "../src/parse/lex_conf.re"
+#line 156 "../src/parse/lex_conf.re"
        { opts.set_fill_arg     (lex_conf_string ()); return; }
-#line 2699 "src/parse/lex_conf.cc"
-yy628:
+#line 2733 "src/parse/lex_conf.cc"
+yy636:
        yych = (unsigned char)*++cur;
-       if (yych == 'T') goto yy669;
+       if (yych == 'T') goto yy677;
        goto yy14;
-yy629:
+yy637:
        yyaccept = 19;
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == ':') goto yy670;
-yy630:
+       if (yych == ':') goto yy678;
+yy638:
 #line 90 "../src/parse/lex_conf.re"
        { opts.set_state_get       (lex_conf_string ()); return; }
-#line 2711 "src/parse/lex_conf.cc"
-yy631:
+#line 2745 "src/parse/lex_conf.cc"
+yy639:
        ++cur;
 #line 129 "../src/parse/lex_conf.re"
        { opts.set_yylessthan   (lex_conf_string ()); return; }
-#line 2716 "src/parse/lex_conf.cc"
-yy633:
+#line 2750 "src/parse/lex_conf.cc"
+yy641:
        yych = (unsigned char)*++cur;
-       if (yych == 'T') goto yy671;
+       if (yych == 'T') goto yy679;
        goto yy14;
-yy634:
+yy642:
        yych = (unsigned char)*++cur;
-       if (yych == 'A') goto yy672;
+       if (yych == 'A') goto yy680;
        goto yy14;
-yy635:
+yy643:
        yych = (unsigned char)*++cur;
-       if (yych == 'T') goto yy673;
+       if (yych == 'T') goto yy681;
        goto yy14;
-yy636:
+yy644:
        yyaccept = 20;
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == ':') goto yy674;
-       if (yych == '@') goto yy675;
-yy637:
+       if (yych == ':') goto yy682;
+       if (yych == '@') goto yy683;
+yy645:
 #line 92 "../src/parse/lex_conf.re"
        { opts.set_state_set       (lex_conf_string ()); return; }
-#line 2737 "src/parse/lex_conf.cc"
-yy638:
+#line 2771 "src/parse/lex_conf.cc"
+yy646:
        yych = (unsigned char)*++cur;
-       goto yy100;
-yy639:
+       goto yy101;
+yy647:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy676;
+       if (yych == 'i') goto yy684;
        goto yy14;
-yy640:
+yy648:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy677;
+       if (yych == 'e') goto yy685;
        goto yy14;
-yy641:
+yy649:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy678;
+       if (yych == 't') goto yy686;
        goto yy14;
-yy642:
+yy650:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy679;
+       if (yych == 't') goto yy687;
        goto yy14;
-yy643:
+yy651:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy680;
+       if (yych == 'a') goto yy688;
        goto yy14;
-yy644:
+yy652:
        ++cur;
 #line 73 "../src/parse/lex_conf.re"
        { lex_conf_empty_class();      return; }
-#line 2765 "src/parse/lex_conf.cc"
-yy646:
+#line 2799 "src/parse/lex_conf.cc"
+yy654:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy681;
+       if (yych == 'l') goto yy689;
        goto yy14;
-yy647:
+yy655:
        yych = (unsigned char)*++cur;
-       if (yych == 'f') goto yy682;
+       if (yych == 'f') goto yy690;
        goto yy14;
-yy648:
+yy656:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy683;
+       if (yych == 'o') goto yy691;
        goto yy14;
-yy649:
+yy657:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy684;
+       if (yych == 't') goto yy692;
        goto yy14;
-yy650:
+yy658:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy685;
+       if (yych == 'a') goto yy693;
        goto yy14;
-yy651:
+yy659:
        yych = (unsigned char)*++cur;
-       goto yy121;
-yy652:
+       goto yy122;
+yy660:
        ++cur;
 #line 95 "../src/parse/lex_conf.re"
        { opts.set_yyfilllabel     (lex_conf_string ()); return; }
-#line 2793 "src/parse/lex_conf.cc"
-yy654:
+#line 2827 "src/parse/lex_conf.cc"
+yy662:
        ++cur;
 #line 99 "../src/parse/lex_conf.re"
        { opts.set_yyaccept        (lex_conf_string ()); return; }
-#line 2798 "src/parse/lex_conf.cc"
-yy656:
+#line 2832 "src/parse/lex_conf.cc"
+yy664:
        ++cur;
 #line 88 "../src/parse/lex_conf.re"
        { opts.set_yyctable         (lex_conf_string ()); return; }
-#line 2803 "src/parse/lex_conf.cc"
-yy658:
+#line 2837 "src/parse/lex_conf.cc"
+yy666:
        ++cur;
-#line 167 "../src/parse/lex_conf.re"
+#line 168 "../src/parse/lex_conf.re"
        { lex_conf_string (); return; }
-#line 2808 "src/parse/lex_conf.cc"
-yy660:
+#line 2842 "src/parse/lex_conf.cc"
+yy668:
        ++cur;
 #line 113 "../src/parse/lex_conf.re"
        { opts.set_yytarget (lex_conf_string ()); return; }
-#line 2813 "src/parse/lex_conf.cc"
-yy662:
+#line 2847 "src/parse/lex_conf.cc"
+yy670:
        ++cur;
 #line 123 "../src/parse/lex_conf.re"
        { opts.set_yybackupctx  (lex_conf_string ()); return; }
-#line 2818 "src/parse/lex_conf.cc"
-yy664:
+#line 2852 "src/parse/lex_conf.cc"
+yy672:
        ++cur;
 #line 124 "../src/parse/lex_conf.re"
        { opts.set_yybackuptag  (lex_conf_string ()); return; }
-#line 2823 "src/parse/lex_conf.cc"
-yy666:
+#line 2857 "src/parse/lex_conf.cc"
+yy674:
        ++cur;
 #line 117 "../src/parse/lex_conf.re"
        { opts.set_yyctxmarker (lex_conf_string ()); return; }
-#line 2828 "src/parse/lex_conf.cc"
-yy668:
+#line 2862 "src/parse/lex_conf.cc"
+yy676:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy686;
+       if (yych == 'd') goto yy694;
        goto yy14;
-yy669:
+yy677:
        yych = (unsigned char)*++cur;
-       if (yych == 'I') goto yy688;
+       if (yych == 'I') goto yy696;
        goto yy14;
-yy670:
+yy678:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy689;
+       if (yych == 'n') goto yy697;
        goto yy14;
-yy671:
+yy679:
        yych = (unsigned char)*++cur;
-       if (yych == 'X') goto yy690;
+       if (yych == 'X') goto yy698;
        goto yy14;
-yy672:
+yy680:
        yych = (unsigned char)*++cur;
-       if (yych == 'G') goto yy692;
+       if (yych == 'G') goto yy700;
        goto yy14;
-yy673:
+yy681:
        yych = (unsigned char)*++cur;
-       if (yych == 'I') goto yy694;
+       if (yych == 'I') goto yy702;
        goto yy14;
-yy674:
+yy682:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy695;
+       if (yych == 'n') goto yy703;
        goto yy14;
-yy675:
+yy683:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy696;
+       if (yych == 's') goto yy704;
        goto yy14;
-yy676:
+yy684:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy697;
+       if (yych == 't') goto yy705;
        goto yy14;
-yy677:
+yy685:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy698;
+       if (yych == 'd') goto yy706;
        goto yy14;
-yy678:
+yy686:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy700;
+       if (yych == 'o') goto yy708;
        goto yy14;
-yy679:
+yy687:
        yych = (unsigned char)*++cur;
-       goto yy104;
-yy680:
+       goto yy105;
+yy688:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy701;
+       if (yych == 't') goto yy709;
        goto yy14;
-yy681:
+yy689:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy702;
+       if (yych == 'i') goto yy710;
        goto yy14;
-yy682:
+yy690:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy703;
+       if (yych == 'o') goto yy711;
        goto yy14;
-yy683:
+yy691:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy704;
+       if (yych == 'n') goto yy712;
        goto yy14;
-yy684:
+yy692:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy705;
+       if (yych == 'i') goto yy713;
        goto yy14;
-yy685:
+yy693:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy706;
+       if (yych == 't') goto yy714;
        goto yy14;
-yy686:
+yy694:
        ++cur;
-#line 157 "../src/parse/lex_conf.re"
+#line 158 "../src/parse/lex_conf.re"
        { opts.set_fill_naked   (lex_conf_bool()); return; }
-#line 2904 "src/parse/lex_conf.cc"
-yy688:
+#line 2938 "src/parse/lex_conf.cc"
+yy696:
        yych = (unsigned char)*++cur;
-       if (yych == 'O') goto yy707;
+       if (yych == 'O') goto yy715;
        goto yy14;
-yy689:
+yy697:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy708;
+       if (yych == 'a') goto yy716;
        goto yy14;
-yy690:
+yy698:
        ++cur;
 #line 126 "../src/parse/lex_conf.re"
        { opts.set_yyrestorectx (lex_conf_string ()); return; }
-#line 2917 "src/parse/lex_conf.cc"
-yy692:
+#line 2951 "src/parse/lex_conf.cc"
+yy700:
        ++cur;
 #line 127 "../src/parse/lex_conf.re"
        { opts.set_yyrestoretag (lex_conf_string ()); return; }
-#line 2922 "src/parse/lex_conf.cc"
-yy694:
+#line 2956 "src/parse/lex_conf.cc"
+yy702:
        yych = (unsigned char)*++cur;
-       if (yych == 'O') goto yy709;
+       if (yych == 'O') goto yy717;
        goto yy14;
-yy695:
+yy703:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy710;
+       if (yych == 'a') goto yy718;
        goto yy14;
-yy696:
+yy704:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy711;
+       if (yych == 't') goto yy719;
        goto yy14;
-yy697:
+yy705:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy712;
+       if (yych == 'i') goto yy720;
        goto yy14;
-yy698:
+yy706:
        ++cur;
 #line 60 "../src/parse/lex_conf.re"
        { opts.set_bCaseInverted(lex_conf_bool());     return; }
-#line 2943 "src/parse/lex_conf.cc"
-yy700:
+#line 2977 "src/parse/lex_conf.cc"
+yy708:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy109;
+       if (yych == 's') goto yy110;
        goto yy14;
-yy701:
+yy709:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy713;
+       if (yych == 'i') goto yy721;
        goto yy14;
-yy702:
+yy710:
        yych = (unsigned char)*++cur;
-       if (yych == 'c') goto yy714;
+       if (yych == 'c') goto yy722;
        goto yy14;
-yy703:
+yy711:
        yych = (unsigned char)*++cur;
-       goto yy112;
-yy704:
+       goto yy113;
+yy712:
        yych = (unsigned char)*++cur;
-       if (yych == '-') goto yy715;
+       if (yych == '-') goto yy723;
        goto yy14;
-yy705:
+yy713:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy716;
+       if (yych == 'o') goto yy724;
        goto yy14;
-yy706:
+yy714:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy717;
+       if (yych == 'e') goto yy725;
        goto yy14;
-yy707:
+yy715:
        yych = (unsigned char)*++cur;
-       if (yych == 'N') goto yy718;
+       if (yych == 'N') goto yy726;
        goto yy14;
-yy708:
+yy716:
        yych = (unsigned char)*++cur;
-       if (yych == 'k') goto yy720;
+       if (yych == 'k') goto yy728;
        goto yy14;
-yy709:
+yy717:
        yych = (unsigned char)*++cur;
-       if (yych == 'N') goto yy721;
+       if (yych == 'N') goto yy729;
        goto yy14;
-yy710:
+yy718:
        yych = (unsigned char)*++cur;
-       if (yych == 'k') goto yy723;
+       if (yych == 'k') goto yy731;
        goto yy14;
-yy711:
+yy719:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy724;
+       if (yych == 'a') goto yy732;
        goto yy14;
-yy712:
+yy720:
        yych = (unsigned char)*++cur;
-       if (yych == 'v') goto yy725;
+       if (yych == 'v') goto yy733;
        goto yy14;
-yy713:
+yy721:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy726;
+       if (yych == 'o') goto yy734;
        goto yy14;
-yy714:
+yy722:
        yych = (unsigned char)*++cur;
-       if (yych == 'y') goto yy727;
+       if (yych == 'y') goto yy735;
        goto yy14;
-yy715:
+yy723:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy729;
+       if (yych == 'd') goto yy737;
        goto yy14;
-yy716:
+yy724:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy730;
+       if (yych == 'n') goto yy738;
        goto yy14;
-yy717:
+yy725:
        yych = (unsigned char)*++cur;
-       goto yy108;
-yy718:
+       goto yy109;
+yy726:
        yyaccept = 21;
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == ':') goto yy731;
-yy719:
+       if (yych == ':') goto yy739;
+yy727:
 #line 77 "../src/parse/lex_conf.re"
        { opts.set_cond_get         (lex_conf_string ()); return; }
-#line 3021 "src/parse/lex_conf.cc"
-yy720:
+#line 3055 "src/parse/lex_conf.cc"
+yy728:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy732;
+       if (yych == 'e') goto yy740;
        goto yy14;
-yy721:
+yy729:
        yyaccept = 22;
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == ':') goto yy733;
-       if (yych == '@') goto yy734;
-yy722:
+       if (yych == ':') goto yy741;
+       if (yych == '@') goto yy742;
+yy730:
 #line 79 "../src/parse/lex_conf.re"
        { opts.set_cond_set         (lex_conf_string ()); return; }
-#line 3034 "src/parse/lex_conf.cc"
-yy723:
+#line 3068 "src/parse/lex_conf.cc"
+yy731:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy735;
+       if (yych == 'e') goto yy743;
        goto yy14;
-yy724:
+yy732:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy736;
+       if (yych == 't') goto yy744;
        goto yy14;
-yy725:
+yy733:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy737;
+       if (yych == 'e') goto yy745;
        goto yy14;
-yy726:
+yy734:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy739;
+       if (yych == 'n') goto yy747;
        goto yy14;
-yy727:
+yy735:
        ++cur;
 #line 71 "../src/parse/lex_conf.re"
        { lex_conf_encoding_policy();  return; }
-#line 3055 "src/parse/lex_conf.cc"
-yy729:
+#line 3089 "src/parse/lex_conf.cc"
+yy737:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy741;
+       if (yych == 'a') goto yy749;
        goto yy14;
-yy730:
+yy738:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy742;
+       if (yych == 's') goto yy750;
        goto yy14;
-yy731:
+yy739:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy743;
+       if (yych == 'n') goto yy751;
        goto yy14;
-yy732:
+yy740:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy744;
+       if (yych == 'd') goto yy752;
        goto yy14;
-yy733:
+yy741:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy746;
+       if (yych == 'n') goto yy754;
        goto yy14;
-yy734:
+yy742:
        yych = (unsigned char)*++cur;
-       if (yych == 'c') goto yy747;
+       if (yych == 'c') goto yy755;
        goto yy14;
-yy735:
+yy743:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy748;
+       if (yych == 'd') goto yy756;
        goto yy14;
-yy736:
+yy744:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy750;
+       if (yych == 'e') goto yy758;
        goto yy14;
-yy737:
+yy745:
        ++cur;
 #line 59 "../src/parse/lex_conf.re"
        { opts.set_bCaseInsensitive(lex_conf_bool());  return; }
-#line 3092 "src/parse/lex_conf.cc"
-yy739:
+#line 3126 "src/parse/lex_conf.cc"
+yy747:
        ++cur;
 #line 74 "../src/parse/lex_conf.re"
        { lex_conf_dfa_minimization(); return; }
-#line 3097 "src/parse/lex_conf.cc"
-yy741:
+#line 3131 "src/parse/lex_conf.cc"
+yy749:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy752;
+       if (yych == 't') goto yy760;
        goto yy14;
-yy742:
+yy750:
        yych = (unsigned char)*++cur;
-       goto yy102;
-yy743:
+       goto yy103;
+yy751:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy753;
+       if (yych == 'a') goto yy761;
        goto yy14;
-yy744:
+yy752:
        ++cur;
 #line 91 "../src/parse/lex_conf.re"
        { opts.set_state_get_naked (lex_conf_bool()); return; }
-#line 3113 "src/parse/lex_conf.cc"
-yy746:
+#line 3147 "src/parse/lex_conf.cc"
+yy754:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy754;
+       if (yych == 'a') goto yy762;
        goto yy14;
-yy747:
+yy755:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy755;
+       if (yych == 'o') goto yy763;
        goto yy14;
-yy748:
+yy756:
        ++cur;
 #line 93 "../src/parse/lex_conf.re"
        { opts.set_state_set_naked (lex_conf_bool()); return; }
-#line 3126 "src/parse/lex_conf.cc"
-yy750:
+#line 3160 "src/parse/lex_conf.cc"
+yy758:
        ++cur;
 #line 94 "../src/parse/lex_conf.re"
        { opts.set_state_set_arg   (lex_conf_string ()); return; }
-#line 3131 "src/parse/lex_conf.cc"
-yy752:
+#line 3165 "src/parse/lex_conf.cc"
+yy760:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy756;
+       if (yych == 'e') goto yy764;
        goto yy14;
-yy753:
+yy761:
        yych = (unsigned char)*++cur;
-       if (yych == 'k') goto yy758;
+       if (yych == 'k') goto yy766;
        goto yy14;
-yy754:
+yy762:
        yych = (unsigned char)*++cur;
-       if (yych == 'k') goto yy759;
+       if (yych == 'k') goto yy767;
        goto yy14;
-yy755:
+yy763:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy760;
+       if (yych == 'n') goto yy768;
        goto yy14;
-yy756:
+yy764:
        ++cur;
 #line 57 "../src/parse/lex_conf.re"
        { opts.set_bNoGenerationDate(lex_conf_bool()); return; }
-#line 3152 "src/parse/lex_conf.cc"
-yy758:
+#line 3186 "src/parse/lex_conf.cc"
+yy766:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy761;
+       if (yych == 'e') goto yy769;
        goto yy14;
-yy759:
+yy767:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy762;
+       if (yych == 'e') goto yy770;
        goto yy14;
-yy760:
+yy768:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy763;
+       if (yych == 'd') goto yy771;
        goto yy14;
-yy761:
+yy769:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy765;
+       if (yych == 'd') goto yy773;
        goto yy14;
-yy762:
+yy770:
        yych = (unsigned char)*++cur;
-       if (yych == 'd') goto yy767;
+       if (yych == 'd') goto yy775;
        goto yy14;
-yy763:
+yy771:
        ++cur;
 #line 80 "../src/parse/lex_conf.re"
        { opts.set_cond_set_arg     (lex_conf_string ()); return; }
-#line 3177 "src/parse/lex_conf.cc"
-yy765:
+#line 3211 "src/parse/lex_conf.cc"
+yy773:
        ++cur;
 #line 78 "../src/parse/lex_conf.re"
        { opts.set_cond_get_naked   (lex_conf_bool()); return; }
-#line 3182 "src/parse/lex_conf.cc"
-yy767:
+#line 3216 "src/parse/lex_conf.cc"
+yy775:
        ++cur;
 #line 81 "../src/parse/lex_conf.re"
        { opts.set_cond_set_naked   (lex_conf_bool()); return; }
-#line 3187 "src/parse/lex_conf.cc"
+#line 3221 "src/parse/lex_conf.cc"
 }
-#line 168 "../src/parse/lex_conf.re"
+#line 169 "../src/parse/lex_conf.re"
 
 }
 
@@ -3193,102 +3227,102 @@ void Scanner::lex_conf_encoding_policy()
 {
        lex_conf_assign ();
 
-#line 3197 "src/parse/lex_conf.cc"
+#line 3231 "src/parse/lex_conf.cc"
 {
        unsigned char yych;
        if ((lim - cur) < 10) fill(10);
        yych = (unsigned char)*cur;
        if (yych <= 'h') {
-               if (yych == 'f') goto yy773;
+               if (yych == 'f') goto yy781;
        } else {
-               if (yych <= 'i') goto yy774;
-               if (yych == 's') goto yy775;
+               if (yych <= 'i') goto yy782;
+               if (yych == 's') goto yy783;
        }
        ++cur;
-yy772:
-#line 175 "../src/parse/lex_conf.re"
+yy780:
+#line 176 "../src/parse/lex_conf.re"
        { fatal("bad configuration value"
                " (expected: 'ignore', 'substitute', 'fail')"); }
-#line 3213 "src/parse/lex_conf.cc"
-yy773:
+#line 3247 "src/parse/lex_conf.cc"
+yy781:
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'a') goto yy776;
-       goto yy772;
-yy774:
+       if (yych == 'a') goto yy784;
+       goto yy780;
+yy782:
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'g') goto yy778;
-       goto yy772;
-yy775:
+       if (yych == 'g') goto yy786;
+       goto yy780;
+yy783:
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'u') goto yy779;
-       goto yy772;
-yy776:
+       if (yych == 'u') goto yy787;
+       goto yy780;
+yy784:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy780;
-yy777:
+       if (yych == 'i') goto yy788;
+yy785:
        cur = ptr;
-       goto yy772;
-yy778:
+       goto yy780;
+yy786:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy781;
-       goto yy777;
-yy779:
+       if (yych == 'n') goto yy789;
+       goto yy785;
+yy787:
        yych = (unsigned char)*++cur;
-       if (yych == 'b') goto yy782;
-       goto yy777;
-yy780:
+       if (yych == 'b') goto yy790;
+       goto yy785;
+yy788:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy783;
-       goto yy777;
-yy781:
+       if (yych == 'l') goto yy791;
+       goto yy785;
+yy789:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy785;
-       goto yy777;
-yy782:
+       if (yych == 'o') goto yy793;
+       goto yy785;
+yy790:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy786;
-       goto yy777;
-yy783:
+       if (yych == 's') goto yy794;
+       goto yy785;
+yy791:
        ++cur;
-#line 179 "../src/parse/lex_conf.re"
+#line 180 "../src/parse/lex_conf.re"
        { opts.set_encoding_policy(Enc::POLICY_FAIL);       goto end; }
-#line 3256 "src/parse/lex_conf.cc"
-yy785:
+#line 3290 "src/parse/lex_conf.cc"
+yy793:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy787;
-       goto yy777;
-yy786:
+       if (yych == 'r') goto yy795;
+       goto yy785;
+yy794:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy788;
-       goto yy777;
-yy787:
+       if (yych == 't') goto yy796;
+       goto yy785;
+yy795:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy789;
-       goto yy777;
-yy788:
+       if (yych == 'e') goto yy797;
+       goto yy785;
+yy796:
        yych = (unsigned char)*++cur;
-       if (yych == 'i') goto yy791;
-       goto yy777;
-yy789:
+       if (yych == 'i') goto yy799;
+       goto yy785;
+yy797:
        ++cur;
-#line 177 "../src/parse/lex_conf.re"
+#line 178 "../src/parse/lex_conf.re"
        { opts.set_encoding_policy(Enc::POLICY_IGNORE);     goto end; }
-#line 3277 "src/parse/lex_conf.cc"
-yy791:
+#line 3311 "src/parse/lex_conf.cc"
+yy799:
        yych = (unsigned char)*++cur;
-       if (yych != 't') goto yy777;
+       if (yych != 't') goto yy785;
        yych = (unsigned char)*++cur;
-       if (yych != 'u') goto yy777;
+       if (yych != 'u') goto yy785;
        yych = (unsigned char)*++cur;
-       if (yych != 't') goto yy777;
+       if (yych != 't') goto yy785;
        yych = (unsigned char)*++cur;
-       if (yych != 'e') goto yy777;
+       if (yych != 'e') goto yy785;
        ++cur;
-#line 178 "../src/parse/lex_conf.re"
+#line 179 "../src/parse/lex_conf.re"
        { opts.set_encoding_policy(Enc::POLICY_SUBSTITUTE); goto end; }
-#line 3290 "src/parse/lex_conf.cc"
+#line 3324 "src/parse/lex_conf.cc"
 }
-#line 180 "../src/parse/lex_conf.re"
+#line 181 "../src/parse/lex_conf.re"
 
 end:
        lex_conf_semicolon();
@@ -3298,77 +3332,77 @@ void Scanner::lex_conf_input()
 {
        lex_conf_assign ();
 
-#line 3302 "src/parse/lex_conf.cc"
+#line 3336 "src/parse/lex_conf.cc"
 {
        unsigned char yych;
        if ((lim - cur) < 7) fill(7);
        yych = (unsigned char)*cur;
-       if (yych <= 'b') goto yy799;
-       if (yych <= 'c') goto yy801;
-       if (yych <= 'd') goto yy802;
-yy799:
+       if (yych <= 'b') goto yy807;
+       if (yych <= 'c') goto yy809;
+       if (yych <= 'd') goto yy810;
+yy807:
        ++cur;
-yy800:
-#line 189 "../src/parse/lex_conf.re"
+yy808:
+#line 190 "../src/parse/lex_conf.re"
        { fatal("bad configuration value"
                " (expected: 'default', 'custom')"); }
-#line 3316 "src/parse/lex_conf.cc"
-yy801:
+#line 3350 "src/parse/lex_conf.cc"
+yy809:
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'u') goto yy803;
-       goto yy800;
-yy802:
+       if (yych == 'u') goto yy811;
+       goto yy808;
+yy810:
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'e') goto yy805;
-       goto yy800;
-yy803:
+       if (yych == 'e') goto yy813;
+       goto yy808;
+yy811:
        yych = (unsigned char)*++cur;
-       if (yych == 's') goto yy806;
-yy804:
+       if (yych == 's') goto yy814;
+yy812:
        cur = ptr;
-       goto yy800;
-yy805:
+       goto yy808;
+yy813:
        yych = (unsigned char)*++cur;
-       if (yych == 'f') goto yy807;
-       goto yy804;
-yy806:
+       if (yych == 'f') goto yy815;
+       goto yy812;
+yy814:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy808;
-       goto yy804;
-yy807:
+       if (yych == 't') goto yy816;
+       goto yy812;
+yy815:
        yych = (unsigned char)*++cur;
-       if (yych == 'a') goto yy809;
-       goto yy804;
-yy808:
+       if (yych == 'a') goto yy817;
+       goto yy812;
+yy816:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy810;
-       goto yy804;
-yy809:
+       if (yych == 'o') goto yy818;
+       goto yy812;
+yy817:
        yych = (unsigned char)*++cur;
-       if (yych == 'u') goto yy811;
-       goto yy804;
-yy810:
+       if (yych == 'u') goto yy819;
+       goto yy812;
+yy818:
        yych = (unsigned char)*++cur;
-       if (yych == 'm') goto yy812;
-       goto yy804;
-yy811:
+       if (yych == 'm') goto yy820;
+       goto yy812;
+yy819:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy814;
-       goto yy804;
-yy812:
+       if (yych == 'l') goto yy822;
+       goto yy812;
+yy820:
        ++cur;
-#line 192 "../src/parse/lex_conf.re"
+#line 193 "../src/parse/lex_conf.re"
        { opts.set_input_api(InputAPI::CUSTOM);  goto end; }
-#line 3363 "src/parse/lex_conf.cc"
-yy814:
+#line 3397 "src/parse/lex_conf.cc"
+yy822:
        yych = (unsigned char)*++cur;
-       if (yych != 't') goto yy804;
+       if (yych != 't') goto yy812;
        ++cur;
-#line 191 "../src/parse/lex_conf.re"
+#line 192 "../src/parse/lex_conf.re"
        { opts.set_input_api(InputAPI::DEFAULT); goto end; }
-#line 3370 "src/parse/lex_conf.cc"
+#line 3404 "src/parse/lex_conf.cc"
 }
-#line 193 "../src/parse/lex_conf.re"
+#line 194 "../src/parse/lex_conf.re"
 
 end:
        lex_conf_semicolon();
@@ -3378,105 +3412,105 @@ void Scanner::lex_conf_empty_class()
 {
        lex_conf_assign ();
 
-#line 3382 "src/parse/lex_conf.cc"
+#line 3416 "src/parse/lex_conf.cc"
 {
        unsigned char yych;
        if ((lim - cur) < 11) fill(11);
        yych = (unsigned char)*cur;
-       if (yych == 'e') goto yy821;
-       if (yych == 'm') goto yy822;
+       if (yych == 'e') goto yy829;
+       if (yych == 'm') goto yy830;
        ++cur;
-yy820:
-#line 202 "../src/parse/lex_conf.re"
+yy828:
+#line 203 "../src/parse/lex_conf.re"
        { fatal("bad configuration value"
                " (expected: 'match-empty', 'match-none', 'error')"); }
-#line 3394 "src/parse/lex_conf.cc"
-yy821:
+#line 3428 "src/parse/lex_conf.cc"
+yy829:
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'r') goto yy823;
-       goto yy820;
-yy822:
+       if (yych == 'r') goto yy831;
+       goto yy828;
+yy830:
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'a') goto yy825;
-       goto yy820;
-yy823:
+       if (yych == 'a') goto yy833;
+       goto yy828;
+yy831:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy826;
-yy824:
+       if (yych == 'r') goto yy834;
+yy832:
        cur = ptr;
-       goto yy820;
-yy825:
+       goto yy828;
+yy833:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy827;
-       goto yy824;
-yy826:
+       if (yych == 't') goto yy835;
+       goto yy832;
+yy834:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy828;
-       goto yy824;
-yy827:
+       if (yych == 'o') goto yy836;
+       goto yy832;
+yy835:
        yych = (unsigned char)*++cur;
-       if (yych == 'c') goto yy829;
-       goto yy824;
-yy828:
+       if (yych == 'c') goto yy837;
+       goto yy832;
+yy836:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy830;
-       goto yy824;
-yy829:
+       if (yych == 'r') goto yy838;
+       goto yy832;
+yy837:
        yych = (unsigned char)*++cur;
-       if (yych == 'h') goto yy832;
-       goto yy824;
-yy830:
+       if (yych == 'h') goto yy840;
+       goto yy832;
+yy838:
        ++cur;
-#line 206 "../src/parse/lex_conf.re"
+#line 207 "../src/parse/lex_conf.re"
        { opts.set_empty_class_policy(EMPTY_CLASS_ERROR);       goto end; }
-#line 3433 "src/parse/lex_conf.cc"
-yy832:
+#line 3467 "src/parse/lex_conf.cc"
+yy840:
        yych = (unsigned char)*++cur;
-       if (yych != '-') goto yy824;
+       if (yych != '-') goto yy832;
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy834;
-       if (yych == 'n') goto yy835;
-       goto yy824;
-yy834:
+       if (yych == 'e') goto yy842;
+       if (yych == 'n') goto yy843;
+       goto yy832;
+yy842:
        yych = (unsigned char)*++cur;
-       if (yych == 'm') goto yy836;
-       goto yy824;
-yy835:
+       if (yych == 'm') goto yy844;
+       goto yy832;
+yy843:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy837;
-       goto yy824;
-yy836:
+       if (yych == 'o') goto yy845;
+       goto yy832;
+yy844:
        yych = (unsigned char)*++cur;
-       if (yych == 'p') goto yy838;
-       goto yy824;
-yy837:
+       if (yych == 'p') goto yy846;
+       goto yy832;
+yy845:
        yych = (unsigned char)*++cur;
-       if (yych == 'n') goto yy839;
-       goto yy824;
-yy838:
+       if (yych == 'n') goto yy847;
+       goto yy832;
+yy846:
        yych = (unsigned char)*++cur;
-       if (yych == 't') goto yy840;
-       goto yy824;
-yy839:
+       if (yych == 't') goto yy848;
+       goto yy832;
+yy847:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy841;
-       goto yy824;
-yy840:
+       if (yych == 'e') goto yy849;
+       goto yy832;
+yy848:
        yych = (unsigned char)*++cur;
-       if (yych == 'y') goto yy843;
-       goto yy824;
-yy841:
+       if (yych == 'y') goto yy851;
+       goto yy832;
+yy849:
        ++cur;
-#line 205 "../src/parse/lex_conf.re"
+#line 206 "../src/parse/lex_conf.re"
        { opts.set_empty_class_policy(EMPTY_CLASS_MATCH_NONE);  goto end; }
-#line 3473 "src/parse/lex_conf.cc"
-yy843:
+#line 3507 "src/parse/lex_conf.cc"
+yy851:
        ++cur;
-#line 204 "../src/parse/lex_conf.re"
+#line 205 "../src/parse/lex_conf.re"
        { opts.set_empty_class_policy(EMPTY_CLASS_MATCH_EMPTY); goto end; }
-#line 3478 "src/parse/lex_conf.cc"
+#line 3512 "src/parse/lex_conf.cc"
 }
-#line 207 "../src/parse/lex_conf.re"
+#line 208 "../src/parse/lex_conf.re"
 
 end:
        lex_conf_semicolon();
@@ -3486,65 +3520,65 @@ void Scanner::lex_conf_dfa_minimization()
 {
        lex_conf_assign ();
 
-#line 3490 "src/parse/lex_conf.cc"
+#line 3524 "src/parse/lex_conf.cc"
 {
        unsigned char yych;
        if ((lim - cur) < 5) fill(5);
        yych = (unsigned char)*cur;
-       if (yych == 'm') goto yy849;
-       if (yych == 't') goto yy850;
+       if (yych == 'm') goto yy857;
+       if (yych == 't') goto yy858;
        ++cur;
-yy848:
-#line 216 "../src/parse/lex_conf.re"
+yy856:
+#line 217 "../src/parse/lex_conf.re"
        { fatal("bad configuration value"
                " (expected: 'table', 'moore')"); }
-#line 3502 "src/parse/lex_conf.cc"
-yy849:
+#line 3536 "src/parse/lex_conf.cc"
+yy857:
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'o') goto yy851;
-       goto yy848;
-yy850:
+       if (yych == 'o') goto yy859;
+       goto yy856;
+yy858:
        yych = (unsigned char)*(ptr = ++cur);
-       if (yych == 'a') goto yy853;
-       goto yy848;
-yy851:
+       if (yych == 'a') goto yy861;
+       goto yy856;
+yy859:
        yych = (unsigned char)*++cur;
-       if (yych == 'o') goto yy854;
-yy852:
+       if (yych == 'o') goto yy862;
+yy860:
        cur = ptr;
-       goto yy848;
-yy853:
+       goto yy856;
+yy861:
        yych = (unsigned char)*++cur;
-       if (yych == 'b') goto yy855;
-       goto yy852;
-yy854:
+       if (yych == 'b') goto yy863;
+       goto yy860;
+yy862:
        yych = (unsigned char)*++cur;
-       if (yych == 'r') goto yy856;
-       goto yy852;
-yy855:
+       if (yych == 'r') goto yy864;
+       goto yy860;
+yy863:
        yych = (unsigned char)*++cur;
-       if (yych == 'l') goto yy857;
-       goto yy852;
-yy856:
+       if (yych == 'l') goto yy865;
+       goto yy860;
+yy864:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy858;
-       goto yy852;
-yy857:
+       if (yych == 'e') goto yy866;
+       goto yy860;
+yy865:
        yych = (unsigned char)*++cur;
-       if (yych == 'e') goto yy860;
-       goto yy852;
-yy858:
+       if (yych == 'e') goto yy868;
+       goto yy860;
+yy866:
        ++cur;
-#line 219 "../src/parse/lex_conf.re"
+#line 220 "../src/parse/lex_conf.re"
        { opts.set_dfa_minimization(DFA_MINIMIZATION_MOORE); goto end; }
-#line 3541 "src/parse/lex_conf.cc"
-yy860:
+#line 3575 "src/parse/lex_conf.cc"
+yy868:
        ++cur;
-#line 218 "../src/parse/lex_conf.re"
+#line 219 "../src/parse/lex_conf.re"
        { opts.set_dfa_minimization(DFA_MINIMIZATION_TABLE); goto end; }
-#line 3546 "src/parse/lex_conf.cc"
+#line 3580 "src/parse/lex_conf.cc"
 }
-#line 220 "../src/parse/lex_conf.re"
+#line 221 "../src/parse/lex_conf.re"
 
 end:
        lex_conf_semicolon();
@@ -3565,7 +3599,7 @@ void Scanner::lex_conf_enc(Enc::type_t enc)
 void Scanner::lex_conf_assign ()
 {
 
-#line 3569 "src/parse/lex_conf.cc"
+#line 3603 "src/parse/lex_conf.cc"
 {
        unsigned char yych;
        static const unsigned char yybm[] = {
@@ -3605,56 +3639,56 @@ void Scanner::lex_conf_assign ()
        if ((lim - cur) < 2) fill(2);
        yych = (unsigned char)*cur;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy866;
+               if (yych == '\t') goto yy874;
        } else {
-               if (yych <= ' ') goto yy866;
-               if (yych == '=') goto yy867;
+               if (yych <= ' ') goto yy874;
+               if (yych == '=') goto yy875;
        }
        ++cur;
-yy865:
-#line 240 "../src/parse/lex_conf.re"
+yy873:
+#line 241 "../src/parse/lex_conf.re"
        { fatal ("missing '=' in configuration"); }
-#line 3618 "src/parse/lex_conf.cc"
-yy866:
+#line 3652 "src/parse/lex_conf.cc"
+yy874:
        yych = (unsigned char)*(ptr = ++cur);
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy870;
-               goto yy865;
+               if (yych == '\t') goto yy878;
+               goto yy873;
        } else {
-               if (yych <= ' ') goto yy870;
-               if (yych != '=') goto yy865;
+               if (yych <= ' ') goto yy878;
+               if (yych != '=') goto yy873;
        }
-yy867:
+yy875:
        ++cur;
        if (lim <= cur) fill(1);
        yych = (unsigned char)*cur;
        if (yybm[0+yych] & 128) {
-               goto yy867;
+               goto yy875;
        }
-#line 241 "../src/parse/lex_conf.re"
+#line 242 "../src/parse/lex_conf.re"
        { return; }
-#line 3637 "src/parse/lex_conf.cc"
-yy870:
+#line 3671 "src/parse/lex_conf.cc"
+yy878:
        ++cur;
        if (lim <= cur) fill(1);
        yych = (unsigned char)*cur;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy870;
+               if (yych == '\t') goto yy878;
        } else {
-               if (yych <= ' ') goto yy870;
-               if (yych == '=') goto yy867;
+               if (yych <= ' ') goto yy878;
+               if (yych == '=') goto yy875;
        }
        cur = ptr;
-       goto yy865;
+       goto yy873;
 }
-#line 242 "../src/parse/lex_conf.re"
+#line 243 "../src/parse/lex_conf.re"
 
 }
 
 void Scanner::lex_conf_semicolon ()
 {
 
-#line 3658 "src/parse/lex_conf.cc"
+#line 3692 "src/parse/lex_conf.cc"
 {
        unsigned char yych;
        static const unsigned char yybm[] = {
@@ -3694,39 +3728,39 @@ void Scanner::lex_conf_semicolon ()
        if ((lim - cur) < 2) fill(2);
        yych = (unsigned char)*cur;
        if (yych <= 0x1F) {
-               if (yych == '\t') goto yy877;
+               if (yych == '\t') goto yy885;
        } else {
-               if (yych <= ' ') goto yy877;
-               if (yych == ';') goto yy878;
+               if (yych <= ' ') goto yy885;
+               if (yych == ';') goto yy886;
        }
        ++cur;
-yy876:
-#line 248 "../src/parse/lex_conf.re"
+yy884:
+#line 249 "../src/parse/lex_conf.re"
        { fatal ("missing ending ';' in configuration"); }
-#line 3707 "src/parse/lex_conf.cc"
-yy877:
+#line 3741 "src/parse/lex_conf.cc"
+yy885:
        yych = (unsigned char)*(ptr = ++cur);
        if (yybm[0+yych] & 128) {
-               goto yy880;
+               goto yy888;
        }
-       if (yych != ';') goto yy876;
-yy878:
+       if (yych != ';') goto yy884;
+yy886:
        ++cur;
-#line 249 "../src/parse/lex_conf.re"
+#line 250 "../src/parse/lex_conf.re"
        { return; }
-#line 3718 "src/parse/lex_conf.cc"
-yy880:
+#line 3752 "src/parse/lex_conf.cc"
+yy888:
        ++cur;
        if (lim <= cur) fill(1);
        yych = (unsigned char)*cur;
        if (yybm[0+yych] & 128) {
-               goto yy880;
+               goto yy888;
        }
-       if (yych == ';') goto yy878;
+       if (yych == ';') goto yy886;
        cur = ptr;
-       goto yy876;
+       goto yy884;
 }
-#line 250 "../src/parse/lex_conf.re"
+#line 251 "../src/parse/lex_conf.re"
 
 }
 
@@ -3740,7 +3774,7 @@ int32_t Scanner::lex_conf_number ()
        lex_conf_assign ();
        tok = cur;
 
-#line 3744 "src/parse/lex_conf.cc"
+#line 3778 "src/parse/lex_conf.cc"
 {
        unsigned char yych;
        static const unsigned char yybm[] = {
@@ -3780,21 +3814,21 @@ int32_t Scanner::lex_conf_number ()
        if ((lim - cur) < 2) fill(2);
        yych = (unsigned char)*cur;
        if (yych <= '/') {
-               if (yych == '-') goto yy886;
+               if (yych == '-') goto yy894;
        } else {
-               if (yych <= '0') goto yy887;
-               if (yych <= '9') goto yy889;
+               if (yych <= '0') goto yy895;
+               if (yych <= '9') goto yy897;
        }
-yy885:
-yy886:
+yy893:
+yy894:
        yych = (unsigned char)*++cur;
-       if (yych <= '0') goto yy885;
-       if (yych <= '9') goto yy889;
-       goto yy885;
-yy887:
+       if (yych <= '0') goto yy893;
+       if (yych <= '9') goto yy897;
+       goto yy893;
+yy895:
        ++cur;
-yy888:
-#line 264 "../src/parse/lex_conf.re"
+yy896:
+#line 265 "../src/parse/lex_conf.re"
        {
                int32_t n = 0;
                if (!s_to_i32_unsafe (tok, cur, n))
@@ -3804,17 +3838,17 @@ yy888:
                lex_conf_semicolon ();
                return n;
        }
-#line 3808 "src/parse/lex_conf.cc"
-yy889:
+#line 3842 "src/parse/lex_conf.cc"
+yy897:
        ++cur;
        if (lim <= cur) fill(1);
        yych = (unsigned char)*cur;
        if (yybm[0+yych] & 128) {
-               goto yy889;
+               goto yy897;
        }
-       goto yy888;
+       goto yy896;
 }
-#line 273 "../src/parse/lex_conf.re"
+#line 274 "../src/parse/lex_conf.re"
 
 }
 
@@ -3824,7 +3858,7 @@ std::string Scanner::lex_conf_string ()
        std::string s;
        tok = cur;
 
-#line 3828 "src/parse/lex_conf.cc"
+#line 3862 "src/parse/lex_conf.cc"
 {
        unsigned char yych;
        static const unsigned char yybm[] = {
@@ -3865,38 +3899,38 @@ std::string Scanner::lex_conf_string ()
        yych = (unsigned char)*cur;
        if (yych <= '!') {
                if (yych <= '\n') {
-                       if (yych <= 0x08) goto yy894;
+                       if (yych <= 0x08) goto yy902;
                } else {
-                       if (yych != ' ') goto yy894;
+                       if (yych != ' ') goto yy902;
                }
        } else {
                if (yych <= '\'') {
-                       if (yych <= '"') goto yy897;
-                       if (yych <= '&') goto yy894;
-                       goto yy897;
+                       if (yych <= '"') goto yy905;
+                       if (yych <= '&') goto yy902;
+                       goto yy905;
                } else {
-                       if (yych != ';') goto yy894;
+                       if (yych != ';') goto yy902;
                }
        }
-#line 300 "../src/parse/lex_conf.re"
+#line 301 "../src/parse/lex_conf.re"
        { goto end; }
-#line 3884 "src/parse/lex_conf.cc"
-yy894:
+#line 3918 "src/parse/lex_conf.cc"
+yy902:
        ++cur;
        if (lim <= cur) fill(1);
        yych = (unsigned char)*cur;
        if (yybm[0+yych] & 128) {
-               goto yy894;
+               goto yy902;
        }
-#line 296 "../src/parse/lex_conf.re"
+#line 297 "../src/parse/lex_conf.re"
        {
                s = std::string(tok, tok_len());
                goto end;
        }
-#line 3897 "src/parse/lex_conf.cc"
-yy897:
+#line 3931 "src/parse/lex_conf.cc"
+yy905:
        ++cur;
-#line 282 "../src/parse/lex_conf.re"
+#line 283 "../src/parse/lex_conf.re"
        {
                const char quote = tok[0];
                for (bool end;;) {
@@ -3911,9 +3945,9 @@ yy897:
                        }
                }
        }
-#line 3915 "src/parse/lex_conf.cc"
+#line 3949 "src/parse/lex_conf.cc"
 }
-#line 301 "../src/parse/lex_conf.re"
+#line 302 "../src/parse/lex_conf.re"
 
 end:
        lex_conf_semicolon ();
index 1f29245bc3cb566092a0653e5e8c5d3aafc52fe0..4b93a708e4fc61a6e957ab57451bf5f9757282e3 100644 (file)
@@ -393,42 +393,56 @@ void gen_settags(code_lines_t &code, const DFA &dfa, tcid_t tcid)
        const tccmd_t &cmd = dfa.tcpool[tcid];
        const tagsave_t *tsave = cmd.save;
        const tagcopy_t *tcopy = cmd.copy;
-       std::string line;
 
        // single tag YYCTXMARKER, backwards compatibility
        if (tsave && dfa.oldstyle_ctxmarker) {
                assert(tcopy == NULL);
-               line = generic
+               const std::string s = generic
                        ? opts->yybackupctx + " ();\n"
                        : opts->yyctxmarker + " = " + opts->yycursor + ";\n";
-               code.push_back(line);
+               code.push_back(s);
                return;
        }
 
        // copy commands
        for (const tagcopy_t *p = tcopy; p; p = p->next) {
-               std::string
+               const std::string
                        l = vartag_expr(p->lhs),
-                       r = vartag_expr(p->rhs);
-               line = generic
-                       ? opts->yycopytag + " (" + l + ", " + r + ");\n"
-                       : l + " = " + r + ";\n";
-               code.push_back(line);
+                       r = vartag_expr(p->rhs),
+                       s = generic
+                               ? opts->yycopytag + " (" + l + ", " + r + ");\n"
+                               : l + " = " + r + ";\n";
+               code.push_back(s);
        }
 
        // save commands
        if (generic) {
                for (const tagsave_t *p = tsave; p; p = p->next) {
-                       line = opts->yybackuptag + " (" + vartag_expr(p->ver) + ");\n";
-                       code.push_back(line);
+                       const std::string
+                               v = vartag_expr(p->ver),
+                               s = p->bottom
+                                       ? opts->yycopytag + " (" + v + ", " + opts->tags_default + ");\n"
+                                       : opts->yybackuptag + " (" + v + ");\n";
+                       code.push_back(s);
                }
        } else if (tsave) {
-               line = "";
+               std::string s1 = "", s2 = "";
                for (const tagsave_t *p = tsave; p; p = p->next) {
-                       line += vartag_expr(p->ver) + " = ";
+                       const std::string v = vartag_expr(p->ver);
+                       if (p->bottom) {
+                               s1 += v + " = ";
+                       } else {
+                               s2 += v + " = ";
+                       }
+               }
+               if (!s1.empty()) {
+                       s1 += opts->tags_default + ";\n";
+                       code.push_back(s1);
+               }
+               if (!s2.empty()) {
+                       s2 += opts->yycursor + ";\n";
+                       code.push_back(s2);
                }
-               line += opts->yycursor + ";\n";
-               code.push_back(line);
        }
 }
 
index 758031bf4517764270507bc5136c24824315fd23..1503b6bf27d9e4b96c0c510b50c16c69a4f2c85b 100644 (file)
@@ -76,6 +76,7 @@ void opt_t::fix ()
                        state_set = Opt::baseopt.state_set;
                        state_set_arg = Opt::baseopt.state_set_arg;
                        state_set_naked = Opt::baseopt.state_set_naked;
+                       tags_default = Opt::baseopt.tags_default;
                        tags_prefix = Opt::baseopt.tags_prefix;
                        tags_expression = Opt::baseopt.tags_expression;
                        yyfilllabel = Opt::baseopt.yyfilllabel;
@@ -157,6 +158,7 @@ void opt_t::fix ()
        }
        if (!tags)
        {
+               tags_default = Opt::baseopt.tags_default;
                tags_prefix = Opt::baseopt.tags_prefix;
                tags_expression = Opt::baseopt.tags_expression;
        }
index ccaee2922bb53b7107b30414ed724b299fcc64be..b404d9d470cb8e6ddc7b314dee0d2b7337a456d9 100644 (file)
@@ -58,6 +58,7 @@ namespace re2c
        OPT (bool, bUseStateNext, false) \
        /* tags */ \
        OPT (bool, tags, false) \
+       OPT (std::string, tags_default, "NULL") \
        OPT (std::string, tags_prefix, "yyt") \
        OPT (std::string, tags_expression, "@@") \
        /* reuse */ \
index 939d8eb40a1461abe2371e4dd336b0e0ac7f1c1b..88fc94288726e3c855bd8c4754fab5b6fe401a3c 100644 (file)
@@ -5,7 +5,7 @@
 namespace re2c
 {
 
-static void interfere(const tcmd_t &cmd, bool *interf, bool *live, bool *buf, size_t nver);
+static void interfere(const tcmd_t &cmd, const bool *live, bool *interf, bool *buf1, bool *buf2, size_t nver);
 
 void cfg_t::interference(const cfg_t &cfg, const bool *live, bool *interf)
 {
@@ -16,63 +16,72 @@ void cfg_t::interference(const cfg_t &cfg, const bool *live, bool *interf)
 
        memset(interf, 0, nver * nver * sizeof(bool));
        for (; b < e; ++b, live += nver) {
-               memcpy(buf1, live, nver * sizeof(bool));
-               interfere(*b->cmd, interf, buf1, buf2, nver);
+               interfere(*b->cmd, live, interf, buf1, buf2, nver);
        }
 
        delete[] buf1;
        delete[] buf2;
 }
 
-void interfere(const tcmd_t &cmd, bool *interf, bool *live, bool *buf,
-       size_t nver)
+void interfere(const tcmd_t &cmd, const bool *live, bool *interf,
+       bool *buf1, bool *buf2, size_t nver)
 {
-       // Each tag updated by save command interferes with all tags
-       // that are alive after this command, except those udated by
-       // other save commands (all saved tags have the same value:
-       // current input position). So the interfering set is exactly
-       // the set of tags alive before the first save command.
-
+       // Each tag updated by 'save' command interferes with all tags that
+       // are alive after this command, except tags set to the same value
+       // by other 'save' commands (all tags are set either to bottom, or
+       // to current input position).
+       memcpy(buf1, live, nver * sizeof(bool));
+       memcpy(buf2, live, nver * sizeof(bool));
        for (const tagsave_t *p = cmd.save; p; p = p->next) {
-               live[p->ver] = false;
+               if (p->bottom) {
+                       buf1[p->ver] = false;
+               } else {
+                       buf2[p->ver] = false;
+               }
        }
-
        for (const tagsave_t *p = cmd.save; p; p = p->next) {
                const size_t x = static_cast<size_t>(p->ver);
                for (size_t y = 0; y < nver; ++y) {
-                       if (!live[y]) continue;
-                       interf[x * nver + y] = interf[y * nver + x] = true;
+                       const bool
+                               i1 =  p->bottom && buf1[y],
+                               i2 = !p->bottom && buf2[y];
+                       if (i1 || i2) {
+                               interf[x * nver + y] = interf[y * nver + x] = true;
+                       }
                }
        }
 
-       // Each tag X updated by copy command X = Y interferes with
-       // all tags alive after this command except tags equal to Y.
-       // We don't track which tags are equal to Y at this point,
-       // but at least we can exclude Y itself and all tags assigned
-       // to Y by copy commands.
+       // Each tag X updated by 'copy' command X = Y interferes with all
+       // tags alive after this command except tags equal to Y. We don't
+       // track which tags are equal to Y at this point, but at least we
+       // can exclude Y itself and all tags assigned to Y by other 'copy'
+       // commands. The set of tags alive after 'copy' commands:
+       for (const tagsave_t *p = cmd.save; p; p = p->next) {
+               buf1[p->ver] = false;
+       }
        for (const tagcopy_t *p = cmd.copy; p; p = p->next) {
                const tagver_t r = p->rhs;
 
-               // alive after this command: tags used by subsequent copy
+               // alive after this command: tags used by subsequent 'copy'
                // commands plus all tags alive before the first save command
-               memcpy(buf, live, nver * sizeof(bool));
+               memcpy(buf2, buf1, nver * sizeof(bool));
                for (const tagcopy_t *q = p->next; q; q = q->next) {
                        if (q->rhs != r) {
-                               buf[q->rhs] = true;
+                               buf2[q->rhs] = true;
                        }
                }
 
                // exclude: tags equal to RHS of this command
-               buf[r] = false;
+               buf2[r] = false;
                for (const tagcopy_t *q = cmd.copy; q; q = q->next) {
                        if (q->rhs == r) {
-                               buf[q->lhs] = false;
+                               buf2[q->lhs] = false;
                        }
                }
 
                const size_t l = static_cast<size_t>(p->lhs);
                for (size_t v = 0; v < nver; ++v) {
-                       if (!buf[v]) continue;
+                       if (!buf2[v]) continue;
                        interf[l * nver + v] = interf[v * nver + l] = true;
                }
        }
index fc044c1e67670ec8b7b0e46e925c6631d4931f16..63b2a36cadbc143efcea34929782234bf40144be 100644 (file)
@@ -58,6 +58,9 @@ void closure_one(closure_t &clos, Tagpool &tagpool,
 
        ++n->loop;
        switch (n->type) {
+               case nfa_state_t::NIL:
+                       closure_one(clos, tagpool, n->nil.out, tags, badtags);
+                       break;
                case nfa_state_t::ALT:
                        closure_one(clos, tagpool, n->alt.out1, tags, badtags);
                        closure_one(clos, tagpool, n->alt.out2, tags, badtags);
@@ -65,7 +68,9 @@ void closure_one(closure_t &clos, Tagpool &tagpool,
                case nfa_state_t::TAG: {
                        const size_t t = n->tag.info;
                        const tagver_t old = tags[t];
-                       tags[t] = static_cast<tagver_t>(t + 1 + tagpool.ntags);
+                       tags[t] = n->tag.bottom
+                               ? TAGVER_BOTTOM
+                               : static_cast<tagver_t>(tagpool.ntags + t + 1);
                        closure_one(clos, tagpool, n->tag.out, tags, badtags);
                        tags[t] = old;
                        break;
index 9f109923653fcbf6187b56ff0b9aacf113a59738..3c1ccf402ea8f6879245d07097340fd9e0528e5b 100644 (file)
@@ -72,7 +72,7 @@ void insert_fallback_tags(dfa_t &dfa)
 
                // 'save' commands are the same as for final transition
                for (tagsave_t *p = f->save; p; p = p->next) {
-                       b->save = pool.make_save(b->save, p->ver);
+                       b->save = pool.make_save(b->save, p->ver, p->bottom);
                }
 
                // 'copy' commands are split
index fb5f656993bd6fd7d1b39716f0ef4260cf7db61a..48e863f13163a38b812a5a8e1ffe780dc68e1fae 100644 (file)
@@ -9,10 +9,13 @@ static size_t count(const RegExp *re, size_t &ntags)
                        return 0;
                case RegExp::SYM:
                        return 1;
-               case RegExp::ALT:
+               case RegExp::ALT: {
+                       const size_t n = ntags;
                        return count(re->alt.re1, ntags)
                                + count(re->alt.re2, ntags)
-                               + 1;
+                               + 1 /* alternative */
+                               + (ntags - n + 1); /* default tags */
+               }
                case RegExp::CAT:
                        return count(re->cat.re1, ntags)
                                + count(re->cat.re2, ntags);
index 11fdc89d52aa377fab81ac06a6d3dc76c8e499a0..187a2c9f2bcf9f7475c6f4ccaaa2b52a1df79bb0 100644 (file)
@@ -16,7 +16,7 @@ namespace re2c
 
 struct nfa_state_t
 {
-       enum type_t {ALT, RAN, TAG, FIN} type;
+       enum type_t {ALT, RAN, TAG, FIN, NIL} type;
        union
        {
                struct
@@ -33,7 +33,12 @@ struct nfa_state_t
                {
                        nfa_state_t *out;
                        size_t info;
+                       bool bottom;
                } tag;
+               struct
+               {
+                       nfa_state_t *out;
+               } nil;
        };
        size_t rule;
        uint8_t loop;
@@ -54,11 +59,12 @@ struct nfa_state_t
                rule = r;
                loop = 0;
        }
-       void make_tag(size_t r, nfa_state_t *s, size_t i)
+       void make_tag(size_t r, nfa_state_t *s, size_t i, bool bottom)
        {
                type = TAG;
                tag.out = s;
                tag.info = i;
+               tag.bottom = bottom;
                rule = r;
                loop = 0;
        }
@@ -68,6 +74,13 @@ struct nfa_state_t
                rule = r;
                loop = 0;
        }
+       void make_nil(size_t r, nfa_state_t *s)
+       {
+               type = NIL;
+               nil.out = s;
+               rule = r;
+               loop = 0;
+       }
 };
 
 struct nfa_t
index d07e4cfad42b568a2d2a2ccaf8d5867e453463a4..237192abf704dbcbad3ad6f858d26088e667eebd 100644 (file)
@@ -2,8 +2,12 @@
 
 namespace re2c {
 
+// We have to insert default tags during NFA construction: before it,
+// we have AST and which is immutable (it may be shared by different
+// regexps); after it, we have NFA where join points of alternatives
+// are lost.
 static nfa_state_t *regexp2nfa(nfa_t &nfa, size_t nrule,
-       size_t &tagidx, const RegExp *re, nfa_state_t *t)
+       bool *tbit, size_t &tidx, const RegExp *re, nfa_state_t *t)
 {
        nfa_state_t *s = NULL;
        switch (re->type) {
@@ -14,42 +18,64 @@ static nfa_state_t *regexp2nfa(nfa_t &nfa, size_t nrule,
                        s = &nfa.states[nfa.size++];
                        s->make_ran(nrule, t, re->sym);
                        break;
-               case RegExp::ALT:
+               case RegExp::ALT: {
+                       nfa_state_t *s1, *s2, *t0, *t1, *t2, *q;
+                       size_t i = tidx;
+
+                       t0 = &nfa.states[nfa.size++];
+                       s1 = regexp2nfa(nfa, nrule, tbit, tidx, re->alt.re1, t0);
+                       for (t2 = t; i < tidx; ++i) {
+                               if (tbit[i]) {
+                                       q = &nfa.states[nfa.size++];
+                                       q->make_tag(nrule, t2, i, true);
+                                       t2 = q;
+                               }
+                       }
+
+                       s2 = regexp2nfa(nfa, nrule, tbit, tidx, re->alt.re2, t2);
+                       for (t1 = t; i < tidx; ++i) {
+                               if (tbit[i]) {
+                                       q = &nfa.states[nfa.size++];
+                                       q->make_tag(nrule, t1, i, true);
+                                       t1 = q;
+                               }
+                       }
+                       t0->make_nil(nrule, t1);
+
                        s = &nfa.states[nfa.size++];
-                       s->make_alt(nrule,
-                               regexp2nfa(nfa, nrule, tagidx, re->alt.re1, t),
-                               regexp2nfa(nfa, nrule, tagidx, re->alt.re2, t));
+                       s->make_alt(nrule, s1, s2);
                        break;
+               }
                case RegExp::CAT:
-                       s = regexp2nfa(nfa, nrule, tagidx, re->cat.re2, t);
-                       s = regexp2nfa(nfa, nrule, tagidx, re->cat.re1, s);
+                       s = regexp2nfa(nfa, nrule, tbit, tidx, re->cat.re2, t);
+                       s = regexp2nfa(nfa, nrule, tbit, tidx, re->cat.re1, s);
                        break;
                case RegExp::ITER: {
                        // see note [Kleene star is expressed in terms of plus]
                        nfa_state_t *q = &nfa.states[nfa.size++];
-                       s = regexp2nfa(nfa, nrule, tagidx, re->iter, q);
+                       s = regexp2nfa(nfa, nrule, tbit, tidx, re->iter, q);
                        q->make_alt(nrule, t, s);
                        break;
                }
                case RegExp::TAG:
-                       if ((*nfa.tags)[tagidx].type == Tag::VAR) {
+                       if ((*nfa.tags)[tidx].type == Tag::VAR) {
                                s = &nfa.states[nfa.size++];
-                               s->make_tag(nrule, t, tagidx);
+                               s->make_tag(nrule, t, tidx, false);
                        } else {
                                s = t;
                        }
-                       ++tagidx;
+                       tbit[tidx++] = true;
                        break;
        }
        return s;
 }
 
 static nfa_state_t *regexp2nfa_rule(nfa_t &nfa, size_t nrule,
-       size_t &tagidx, const RegExpRule *rule)
+       bool *tbit, size_t &tidx, const RegExpRule *rule)
 {
        nfa_state_t *s = &nfa.states[nfa.size++];
        s->make_fin(nrule);
-       return regexp2nfa(nfa, nrule, tagidx, rule->re, s);
+       return regexp2nfa(nfa, nrule, tbit, tidx, rule->re, s);
 }
 
 void regexps2nfa(const std::vector<const RegExpRule*> &regexps, nfa_t &nfa)
@@ -60,14 +86,18 @@ void regexps2nfa(const std::vector<const RegExpRule*> &regexps, nfa_t &nfa)
                return;
        }
 
-       size_t tagidx = 0;
-       nfa_state_t *s = regexp2nfa_rule(nfa, 0, tagidx, regexps[0]);
+       bool *tbit = new bool[nfa.tags->size()]();
+       size_t tidx = 0;
+
+       nfa_state_t *s = regexp2nfa_rule(nfa, 0, tbit, tidx, regexps[0]);
        for (size_t i = 1; i < nregexps; ++i) {
                nfa_state_t *t = &nfa.states[nfa.size++];
-               t->make_alt(i, s, regexp2nfa_rule(nfa, i, tagidx, regexps[i]));
+               t->make_alt(i, s, regexp2nfa_rule(nfa, i, tbit, tidx, regexps[i]));
                s = t;
        }
        nfa.root = s;
+
+       delete[] tbit;
 }
 
 } // namespace re2c
index b59a51cd7bad743b2c80f2c7dd2879f06ad4d672..0b8db187a7193bd4abfbfc9a8f5ec5ec144cdfbe 100644 (file)
@@ -94,7 +94,7 @@ static void apply(size_t *tags, const tcmd_t *cmd, size_t pos)
 {
        if (!cmd) return;
        for (const tagsave_t *p = cmd->save; p; p = p->next) {
-               tags[p->ver] = pos;
+               tags[p->ver] = p->bottom ? Skeleton::DEFTAG : pos;
        }
        for (const tagcopy_t *p = cmd->copy; p; p = p->next) {
                tags[p->lhs] = tags[p->rhs];
@@ -158,10 +158,9 @@ static void write_keys(const path_t &path, const Skeleton &skel,
        // calculate tags: start with default and apply commands step by step
        const size_t
                nver = skel.ntagver,
-               ntag = width * nver,
-               NIL = std::numeric_limits<size_t>::max();
+               ntag = width * nver;
        size_t *tags = new size_t[ntag];
-       std::fill(tags, tags + ntag, NIL);
+       std::fill(tags, tags + ntag, Skeleton::DEFTAG);
        for (size_t i = 0; i < f; ++i) {
                Node::wciter_t a(path.arc(skel, i));
                for (size_t w = 0; w < width; ++a) {
@@ -193,7 +192,7 @@ static void write_keys(const path_t &path, const Skeleton &skel,
                } else {
                        assert(skel.tags[t].type == Tag::VAR);
                        matched = tags[vers[t]];
-                       assert(matched != NIL);
+                       assert(matched != Skeleton::DEFTAG);
                }
        }
 
index a9041a1c57c8200dd600ce93d44977231e1c31ff..f2af092de39aff37aa53b2c98ae63fd36d164dc1 100644 (file)
@@ -42,6 +42,8 @@ bool Node::end() const
        return arcs.size() == 0;
 }
 
+const size_t Skeleton::DEFTAG = std::numeric_limits<size_t>::max();
+
 Skeleton::Skeleton(
        const dfa_t &dfa,
        const charset_t &cs,
index 040c0369a1ba15644e8eea8e1658491e943ff0cf..e8ebc33623246898210c8225f01baa306ba3878c 100644 (file)
@@ -59,6 +59,8 @@ struct Node
 
 struct Skeleton
 {
+       static const size_t DEFTAG;
+
        const std::string name;
        const std::string cond;
        const uint32_t line;
index 90a9f8647c28cf9c3dcd1bcf2d36c1b1e1fce83f..06b6700d88e5209f8c7ffb211eff2d75ec954460 100644 (file)
@@ -11,6 +11,7 @@ namespace re2c
 
 typedef int32_t tagver_t;
 
+static const tagver_t TAGVER_BOTTOM = -1; // default value for tag
 static const tagver_t TAGVER_ZERO = 0; // absense of tag
 
 struct Tag
index e6a941dd260adf87ff7ed418d60b43c4c51a12d6..61fa2af657fa57079a5b15c3f0cdc018b6cc6271 100644 (file)
@@ -11,16 +11,18 @@ static uint32_t hash_tcmd(const tagsave_t *save, const tagcopy_t *copy);
 void tagsave_t::swap(tagsave_t &x, tagsave_t &y)
 {
        std::swap(x.ver, y.ver);
+       std::swap(x.bottom, y.bottom);
 }
 
 bool tagsave_t::less(const tagsave_t &x, const tagsave_t &y)
 {
-       return x.ver < y.ver;
+       const tagver_t xv = x.ver, yv = y.ver;
+       return xv < yv || (xv == yv && x.bottom < y.bottom);
 }
 
 bool tagsave_t::equal(const tagsave_t &x, const tagsave_t &y)
 {
-       return x.ver == y.ver;
+       return x.ver == y.ver && x.bottom == y.bottom;
 }
 
 void tagcopy_t::swap(tagcopy_t &x, tagcopy_t &y)
@@ -56,11 +58,12 @@ tcpool_t::tcpool_t()
        assert(TCID0 == insert(NULL, NULL));
 }
 
-tagsave_t *tcpool_t::make_save(tagsave_t *next, tagver_t ver)
+tagsave_t *tcpool_t::make_save(tagsave_t *next, tagver_t ver, bool bottom)
 {
        tagsave_t *p = alc.alloct<tagsave_t>(1);
        p->next = next;
        p->ver = ver;
+       p->bottom = bottom;
        return p;
 }
 
@@ -78,8 +81,10 @@ tagsave_t *tcpool_t::conv_to_save(const tagver_t *vers, size_t ntag)
        tagsave_t *s = NULL;
        for (size_t t = ntag; t-- > 0;) {
                const tagver_t v = vers[t];
-               if (v != TAGVER_ZERO) {
-                       s = make_save(s, v);
+               if (v == TAGVER_BOTTOM) {
+                       s = make_save(s, static_cast<tagver_t>(ntag + t + 1), true);
+               } else if (v != TAGVER_ZERO) {
+                       s = make_save(s, v, false);
                }
        }
        return s;
@@ -90,13 +95,13 @@ tcmd_t tcpool_t::conv_to_tcmd(const tagver_t *vers, const tagver_t *fins, size_t
        tagsave_t *s = NULL;
        tagcopy_t *c = NULL;
        for (size_t t = ntag; t-- > 0;) {
-               const tagver_t f = fins[t];
+               const tagver_t v = vers[t], f = fins[t];
                if (f == TAGVER_ZERO) continue;
 
-               if (vers[t] != TAGVER_ZERO) {
-                       s = make_save(s, f);
+               if (v != TAGVER_ZERO) {
+                       s = make_save(s, f, v == TAGVER_BOTTOM);
                } else {
-                       c = make_copy(c, f, f + ntag);
+                       c = make_copy(c, f, f + static_cast<tagver_t>(ntag));
                }
        }
        return tcmd_t(s, c);
@@ -107,6 +112,7 @@ uint32_t hash_tcmd(const tagsave_t *save, const tagcopy_t *copy)
        uint32_t h = 0;
        for (const tagsave_t *p = save; p; p = p->next) {
                h = hash32(h, &p->ver, sizeof(p->ver));
+               h = hash32(h, &p->bottom, sizeof(p->bottom));
        }
        for (const tagcopy_t *p = copy; p; p = p->next) {
                h = hash32(h, &p->lhs, sizeof(p->lhs));
index 0d50c2b7907ff79ad8e1dab428c127bb5c7a6af1..af63bcc34df7826c5eb429ec11e80c29f238e0fd 100644 (file)
@@ -14,6 +14,7 @@ struct tagsave_t
 {
        tagsave_t *next;
        tagver_t ver;
+       bool bottom;
 
        static void swap(tagsave_t &x, tagsave_t &y);
        static bool less(const tagsave_t &x, const tagsave_t &y);
@@ -66,7 +67,7 @@ class tcpool_t
 public:
        tcpool_t();
 
-       tagsave_t *make_save(tagsave_t *next, tagver_t ver);
+       tagsave_t *make_save(tagsave_t *next, tagver_t ver, bool bottom);
        tagcopy_t *make_copy(tagcopy_t *next, tagver_t lhs, tagver_t rhs);
        tagsave_t *conv_to_save(const tagver_t *vers, size_t ntag);
        tcmd_t conv_to_tcmd(const tagver_t *vers, const tagver_t *fins, size_t ntag);
index 201822273151696e328031f476f179f8ef52f518..94942bebdae50037bdaf04f03503104be49a6863 100644 (file)
@@ -128,6 +128,7 @@ void Scanner::lex_conf ()
        "define:YYCOPYTAG"    { opts.set_yycopytag    (lex_conf_string ()); return; }
        "define:YYLESSTHAN"   { opts.set_yylessthan   (lex_conf_string ()); return; }
 
+       "tags:default"    { opts.set_tags_default   (lex_conf_string ()); return; }
        "tags:prefix"     { opts.set_tags_prefix    (lex_conf_string ()); return; }
        "tags:expression" { opts.set_tags_expression(lex_conf_string ()); return; }
 
index b018ddf24e5990315804dabe23b502e231c21d4f..6ec1a8e7bbfacafbef3686ba9ebacb8cdd1e1ed3 100644 (file)
@@ -36,7 +36,7 @@ yy5:
                yyt2 = YYCURSOR;
                goto yy6;
        case 'd':
-               yyt1 = YYCURSOR;
+               yyt2 = YYCURSOR;
                goto yy7;
        default:        goto yy4;
        }
@@ -59,12 +59,12 @@ yy7:
        switch (yych) {
        case 'a':       goto yy11;
        default:
-               yyt2 = YYCURSOR;
+               yyt1 = YYCURSOR;
                goto yy8;
        }
 yy8:
-       s = yyt2;
-       r = yyt1;
+       s = yyt1;
+       r = yyt2;
        { r s }
 yy9:
        ++YYCURSOR;
@@ -82,7 +82,7 @@ yy10:
                yyt1 = YYCURSOR;
                goto yy2;
        } else {
-               yyt2 = YYCURSOR;
+               yyt1 = YYCURSOR;
                goto yy8;
        }
 yy11:
@@ -91,7 +91,7 @@ yy11:
        yych = *YYCURSOR;
        switch (yych) {
        case 'd':
-               yyt1 = YYCURSOR;
+               yyt2 = YYCURSOR;
                goto yy7;
        default:        goto yy10;
        }
index b83811d694a939514d3f86b9221a136ebb56e809..4ed7f425372d94b11a200b07bd32c41e9b005b22 100644 (file)
@@ -15,7 +15,9 @@
        case 'a':
                yyt1 = YYCURSOR;
                goto yy4;
-       case 'b':       goto yy5;
+       case 'b':
+               yyt1 = NULL;
+               goto yy5;
        default:        goto yy2;
        }
 yy2:
@@ -63,7 +65,9 @@ yy9:
        if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = *YYCURSOR;
        switch (yych) {
-       case 'a':       goto yy14;
+       case 'a':
+               yyt1 = NULL;
+               goto yy14;
        case 'b':
                yyt1 = YYCURSOR;
                goto yy16;
index 3d75dbab10710ce62fc2cd4cea5a00ef79544bd5..5294d8933d91b7fc9d9356727b00e04611651687 100644 (file)
@@ -21,7 +21,9 @@
        yych = *(YYMARKER = YYCURSOR);
        switch (yych) {
        case 'a':       goto yy3;
-       default:        goto yy2;
+       default:
+               yyt1 = NULL;
+               goto yy2;
        }
 yy2:
        p = yyt1;
@@ -37,6 +39,7 @@ yy3:
 yy4:
        YYCURSOR = YYMARKER;
        if (yyaccept == 0) {
+               yyt1 = NULL;
                goto yy2;
        } else {
                yyt1 = YYCURSOR;
index 018b85f0addee11d24e0774ca9f2532783a6bb29..1341e193a27feee1d9505b078bfd719c1ff99da8 100644 (file)
@@ -1,24 +1,16 @@
 /* Generated by re2c */
-// This example shows that fallback copy of tag, if needed, should be
-// created on all non-accepting paths from fallback state, even if they
-// don't overwrite the tag. The reason is that overwriting and
-// non-overwriting paths may join later along the way and they should
-// have the same tag version and at the join point.
-
 
 {
        YYCTYPE yych;
-       goto yy0;
-yy1:
-       ++YYCURSOR;
-yy0:
+       unsigned int yyaccept = 0;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = *(YYMARKER = YYCURSOR);
-       yyt1 = yyt2;
        switch (yych) {
        case 'a':       goto yy3;
        case 'd':       goto yy5;
-       default:        goto yy2;
+       default:
+               yyt1 = NULL;
+               goto yy2;
        }
 yy2:
        p = yyt1;
@@ -35,13 +27,20 @@ yy3:
        }
 yy4:
        YYCURSOR = YYMARKER;
-       goto yy2;
+       if (yyaccept == 0) {
+               yyt1 = NULL;
+               goto yy2;
+       } else {
+               goto yy2;
+       }
 yy5:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
        switch (yych) {
-       case 'b':       goto yy6;
+       case 'b':
+               yyt2 = NULL;
+               goto yy6;
        default:        goto yy4;
        }
 yy6:
@@ -49,9 +48,20 @@ yy6:
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
        switch (yych) {
-       case 'c':       goto yy1;
+       case 'c':       goto yy7;
        default:        goto yy4;
        }
+yy7:
+       yyaccept = 1;
+       YYMARKER = ++YYCURSOR;
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       yyt1 = yyt2;
+       switch (yych) {
+       case 'a':       goto yy3;
+       case 'd':       goto yy5;
+       default:        goto yy2;
+       }
 }
 
-re2c: warning: line 9: rule matches empty string [-Wmatch-empty-string]
+re2c: warning: line 2: rule matches empty string [-Wmatch-empty-string]
index c6de83963b766274502a9c4d0ce38be8a502c49e..6b2707002dcc2e24db71b53b200046ab5925a74d 100644 (file)
@@ -1,11 +1,3 @@
-// This example shows that fallback copy of tag, if needed, should be
-// created on all non-accepting paths from fallback state, even if they
-// don't overwrite the tag. The reason is that overwriting and
-// non-overwriting paths may join later along the way and they should
-// have the same tag version and at the join point.
-
 /*!re2c
-
-    (("a" @p | "d") "bc")* { p } // join point is "c"
-
+    (("a" @p | "d") "bc")* { p }
 */
diff --git a/re2c/test/tags/fallback6.i--tags.c b/re2c/test/tags/fallback6.i--tags.c
new file mode 100644 (file)
index 0000000..22f06d0
--- /dev/null
@@ -0,0 +1,109 @@
+/* Generated by re2c */
+yyt1
+yyt2
+
+
+{
+       YYCTYPE yych;
+       unsigned int yyaccept = 0;
+       if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'a':
+               yyt2 = YYCURSOR;
+               goto yy5;
+       case 'c':       goto yy6;
+       case 'e':
+               yyt1 = NULL;
+               goto yy7;
+       default:        goto yy3;
+       }
+yy2:
+       p = yyt1;
+       { p }
+yy3:
+       ++YYCURSOR;
+yy4:
+       {}
+yy5:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'b':       goto yy9;
+       default:        goto yy4;
+       }
+yy6:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 'd':
+               yyt1 = YYCURSOR;
+               goto yy10;
+       default:        goto yy4;
+       }
+yy7:
+       ++YYCURSOR;
+       q = yyt1;
+       { q }
+yy9:
+       yyaccept = 0;
+       YYMARKER = ++YYCURSOR;
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'a':
+               yyt1 = yyt2;
+               yyt2 = YYCURSOR;
+               goto yy11;
+       case 'c':
+               yyt1 = yyt2;
+               goto yy13;
+       case 'e':
+               yyt1 = NULL;
+               goto yy7;
+       default:
+               yyt1 = yyt2;
+               goto yy2;
+       }
+yy10:
+       yyaccept = 1;
+       YYMARKER = ++YYCURSOR;
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'a':
+               yyt2 = YYCURSOR;
+               goto yy11;
+       case 'c':       goto yy13;
+       case 'e':       goto yy7;
+       default:
+               yyt1 = NULL;
+               goto yy2;
+       }
+yy11:
+       ++YYCURSOR;
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'b':       goto yy9;
+       default:        goto yy12;
+       }
+yy12:
+       YYCURSOR = YYMARKER;
+       if (yyaccept == 0) {
+               goto yy2;
+       } else {
+               yyt1 = NULL;
+               goto yy2;
+       }
+yy13:
+       ++YYCURSOR;
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 'd':
+               yyt1 = YYCURSOR;
+               goto yy10;
+       default:        goto yy12;
+       }
+}
+
+re2c: warning: line 4: rule matches empty string [-Wmatch-empty-string]
diff --git a/re2c/test/tags/fallback6.i--tags.re b/re2c/test/tags/fallback6.i--tags.re
new file mode 100644 (file)
index 0000000..34670fd
--- /dev/null
@@ -0,0 +1,8 @@
+/*!tags:re2c format = "@@\n"; */
+/*!re2c
+
+    (@p "ab" | "c"    "d")*     { p }
+    (   "ab" | "c" @q "d")* "e" { q }
+    * {}
+
+*/
index 2c4dc6546261a50c1485d9902130fc7cfd89b807..420dc1d688da07ac07e9e06b680d9942e32fdac1 100644 (file)
@@ -1,91 +1,72 @@
 /* Generated by re2c */
-// This example shows the neccesity of tracking interference
-// induced by copy commands: fallback tag interferes with another
-// tag in a way that makes it impossible to spot interference
-// unless we examine the copy command.
-
-// On input "cdabe" 2nd rule should match with '@q' pointing to 'd'.
-
-yyt1
-yyt2
-yyt3
+// shows the neccesity of tracking interference induced by copy commands
 
 
 {
        YYCTYPE yych;
-       if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
-       yych = *YYCURSOR;
+       unsigned int yyaccept = 0;
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *(YYMARKER = YYCURSOR);
        switch (yych) {
-       case 'a':
-               yyt3 = YYCURSOR;
+       case 'a':       goto yy3;
+       case 'b':
+               yyt3 = yyt4 = YYCURSOR;
                goto yy5;
-       case 'c':       goto yy6;
-       case 'e':       goto yy7;
-       default:        goto yy3;
+       default:
+               yyt1 = yyt2 = NULL;
+               goto yy2;
        }
 yy2:
-       p = yyt1;
-       { p }
+       q = yyt1;
+       p = yyt2;
+       {}
 yy3:
        ++YYCURSOR;
-yy4:
-       {}
-yy5:
-       yych = *++YYCURSOR;
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
        switch (yych) {
-       case 'b':       goto yy9;
+       case 'b':
+               yyt4 = NULL;
+               yyt3 = YYCURSOR;
+               goto yy5;
        default:        goto yy4;
        }
-yy6:
-       yych = *++YYCURSOR;
+yy4:
+       YYCURSOR = YYMARKER;
+       if (yyaccept == 0) {
+               yyt1 = yyt2 = NULL;
+               goto yy2;
+       } else {
+               goto yy2;
+       }
+yy5:
+       ++YYCURSOR;
+       if (YYLIMIT <= YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
        switch (yych) {
-       case 'd':
-               yyt2 = YYCURSOR;
-               goto yy9;
+       case 'a':       goto yy6;
        default:        goto yy4;
        }
-yy7:
-       ++YYCURSOR;
-       q = yyt2;
-       { q }
-yy9:
+yy6:
+       yyaccept = 1;
        YYMARKER = ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
        switch (yych) {
        case 'a':
                yyt1 = yyt3;
-               yyt3 = YYCURSOR;
-               goto yy10;
-       case 'c':
+               yyt2 = yyt4;
+               goto yy3;
+       case 'b':
                yyt1 = yyt3;
-               goto yy12;
-       case 'e':       goto yy7;
+               yyt2 = yyt4;
+               yyt3 = yyt4 = YYCURSOR;
+               goto yy5;
        default:
                yyt1 = yyt3;
+               yyt2 = yyt4;
                goto yy2;
        }
-yy10:
-       ++YYCURSOR;
-       if (YYLIMIT <= YYCURSOR) YYFILL(1);
-       yych = *YYCURSOR;
-       switch (yych) {
-       case 'b':       goto yy9;
-       default:        goto yy11;
-       }
-yy11:
-       YYCURSOR = YYMARKER;
-       goto yy2;
-yy12:
-       ++YYCURSOR;
-       if (YYLIMIT <= YYCURSOR) YYFILL(1);
-       yych = *YYCURSOR;
-       switch (yych) {
-       case 'd':
-               yyt2 = YYCURSOR;
-               goto yy9;
-       default:        goto yy11;
-       }
 }
 
-re2c: warning: line 11: rule matches empty string [-Wmatch-empty-string]
+re2c: warning: line 5: rule matches empty string [-Wmatch-empty-string]
index 9e9e043638a62d3bd9e15103fd8d633f5943de4d..0e4a5b8b3c2d202c2fb4ba6a473ef98bff356045 100644 (file)
@@ -1,15 +1,7 @@
-// This example shows the neccesity of tracking interference
-// induced by copy commands: fallback tag interferes with another
-// tag in a way that makes it impossible to spot interference
-// unless we examine the copy command.
+// shows the neccesity of tracking interference induced by copy commands
 
-// On input "cdabe" 2nd rule should match with '@q' pointing to 'd'.
-
-/*!tags:re2c format = "@@\n"; */
 /*!re2c
 
-    (@p "ab" | "c"    "d")*     { p } // fallback tag for @p
-    (   "ab" | "c" @q "d")* "e" { q } // @q interferes with fallback tag
-    * {}
+(("a" | @p) @q "ba")* {}
 
 */
index ab87504529173ea2c312adaa0294d9f47be8827a..0fa941b5fb164e20e0a44c68292a93f1fab3e4fd 100644 (file)
@@ -54,12 +54,18 @@ yy11:
 yy12:
        yych = *++YYCURSOR;
        switch (yych) {
-       case 'a':       goto yy13;
+       case 'a':       goto yy15;
        default:        goto yy10;
        }
 yy13:
        ++YYCURSOR;
+yy14:
        p = yyt1;
        { p }
+yy15:
+       ++YYCURSOR;
+       yyt1 = NULL;
+       yych = *YYCURSOR;
+       goto yy14;
 }
 
index 350eb6bbcfd22c467ce90d16349444a9efc11a8a..813ece0a80da0fa1b601e4626cc784b2559fa4f8 100644 (file)
@@ -4,6 +4,8 @@ re2c: warning: line 5: rule matches empty string [-Wmatch-empty-string]
 re2c: warning: line 6: rule matches empty string [-Wmatch-empty-string]
 re2c: warning: line 8: rule matches empty string [-Wmatch-empty-string]
 re2c: warning: line 9: rule matches empty string [-Wmatch-empty-string]
+re2c: error: line 2: tag 'a' is nondeterministic
+re2c: error: line 3: tag 'd' is nondeterministic
 re2c: error: line 5: tag 'b' is nondeterministic
 re2c: error: line 6: tag 'e' is nondeterministic
 re2c: error: line 8: tag 'c' is nondeterministic