Added debug option '--dump-adfa'.
authorUlya Trofimovich <skvadrik@gmail.com>
Thu, 1 Dec 2016 15:21:48 +0000 (15:21 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Thu, 1 Dec 2016 16:31:56 +0000 (16:31 +0000)
re2c/Makefile.am
re2c/bootstrap/src/conf/parse_opts.cc
re2c/src/conf/opt.cc
re2c/src/conf/opt.h
re2c/src/conf/parse_opts.re
re2c/src/ir/adfa/dump.cc [new file with mode: 0644]
re2c/src/ir/adfa/dump.h [new file with mode: 0644]
re2c/src/ir/compile.cc

index 7da7381db5daec7804847ad2530eb9a52698ccd4..a5e5028ddfee32e671107cbe805aa7c2ba5dec1a 100644 (file)
@@ -22,6 +22,7 @@ SRC_HDR = \
        src/conf/warn.h \
        src/ir/adfa/action.h \
        src/ir/adfa/adfa.h \
+       src/ir/adfa/dump.h \
        src/ir/dfa/cfg/cfg.h \
        src/ir/dfa/closure.h \
        src/ir/dfa/dfa.h \
@@ -94,6 +95,7 @@ SRC = \
        src/ir/nfa/nfa.cc \
        src/ir/nfa/regexps2nfa.cc \
        src/ir/adfa/adfa.cc \
+       src/ir/adfa/dump.cc \
        src/ir/adfa/prepare.cc \
        src/ir/dfa/cfg/cfg.cc \
        src/ir/dfa/cfg/dce.cc \
index b8f956196fea09422630a544952d426d72507418..4b8cb65854a3d7515168aec74c342d6eaba302af 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.16 on Wed Nov 30 14:43:42 2016 */
+/* Generated by re2c 0.16 on Thu Dec  1 15:18:43 2016 */
 #line 1 "../src/conf/parse_opts.re"
 #include "src/codegen/input_api.h"
 #include "src/conf/msg.h"
@@ -1545,359 +1545,360 @@ yy363:
        goto yy276;
 yy364:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy396;
+       if (yych == 'a') goto yy396;
+       if (yych == 'd') goto yy397;
        goto yy276;
 yy365:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy397;
+       if (yych == 'd') goto yy398;
        goto yy276;
 yy366:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy398;
+       if (yych == '-') goto yy399;
        goto yy276;
 yy367:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy399;
+       if (yych == 'i') goto yy400;
        goto yy276;
 yy368:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy400;
+       if (yych == 's') goto yy401;
        goto yy276;
 yy369:
        ++YYCURSOR;
 #line 133 "../src/conf/parse_opts.re"
        { usage ();   return EXIT_OK; }
-#line 1571 "src/conf/parse_opts.cc"
+#line 1572 "src/conf/parse_opts.cc"
 yy371:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy401;
+       if (yych <= 0x00) goto yy402;
        goto yy276;
 yy372:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy403;
+       if (yych == 'd') goto yy404;
        goto yy276;
 yy373:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'b') goto yy404;
+       if (yych == 'b') goto yy405;
        goto yy276;
 yy374:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy405;
+       if (yych == 'n') goto yy406;
        goto yy276;
 yy375:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy406;
+       if (yych == 'r') goto yy407;
        goto yy276;
 yy376:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy407;
+       if (yych == 't') goto yy408;
        goto yy276;
 yy377:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'b') goto yy408;
+       if (yych == 'b') goto yy409;
        goto yy276;
 yy378:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy409;
+       if (yych == 'e') goto yy410;
        goto yy276;
 yy379:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy410;
+       if (yych == 't') goto yy411;
        goto yy276;
 yy380:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy411;
+       if (yych == '-') goto yy412;
        goto yy276;
 yy381:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'b') goto yy412;
+       if (yych == 'b') goto yy413;
        goto yy276;
 yy382:
        ++YYCURSOR;
 #line 151 "../src/conf/parse_opts.re"
        { opts.set_tags (true);              goto opt; }
-#line 1620 "src/conf/parse_opts.cc"
+#line 1621 "src/conf/parse_opts.cc"
 yy384:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'h') goto yy413;
+       if (yych == 'h') goto yy414;
        goto yy276;
 yy385:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy414;
+       if (yych == 'd') goto yy415;
        goto yy276;
 yy386:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '6') goto yy415;
+       if (yych == '6') goto yy416;
        goto yy276;
 yy387:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy416;
+       if (yych <= 0x00) goto yy417;
        goto yy276;
 yy388:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'm') goto yy418;
+       if (yych == 'm') goto yy419;
        goto yy276;
 yy389:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy419;
+       if (yych == 'o') goto yy420;
        goto yy276;
 yy390:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy420;
+       if (yych == 'c') goto yy421;
        goto yy276;
 yy391:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy421;
+       if (yych == 'c') goto yy422;
        goto yy276;
 yy392:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy422;
+       if (yych == 'n') goto yy423;
        goto yy276;
 yy393:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy423;
+       if (yych == 'e') goto yy424;
        goto yy276;
 yy394:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy424;
+       if (yych == 'o') goto yy425;
        goto yy276;
 yy395:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy425;
+       if (yych == 'n') goto yy426;
        goto yy276;
 yy396:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'f') goto yy426;
+       if (yych == 'd') goto yy427;
        goto yy276;
 yy397:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy427;
+       if (yych == 'f') goto yy428;
        goto yy276;
 yy398:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy428;
+       if (yych == 'o') goto yy429;
        goto yy276;
 yy399:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy429;
+       if (yych == 'c') goto yy430;
        goto yy276;
 yy400:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'y') goto yy430;
+       if (yych == 'n') goto yy431;
        goto yy276;
 yy401:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'y') goto yy432;
+       goto yy276;
+yy402:
        ++YYCURSOR;
 #line 160 "../src/conf/parse_opts.re"
        { goto opt_input; }
-#line 1693 "src/conf/parse_opts.cc"
-yy403:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy431;
-       goto yy276;
+#line 1698 "src/conf/parse_opts.cc"
 yy404:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'u') goto yy432;
+       if (yych == '-') goto yy433;
        goto yy276;
 yy405:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy433;
+       if (yych == 'u') goto yy434;
        goto yy276;
 yy406:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy434;
+       if (yych == 'e') goto yy435;
        goto yy276;
 yy407:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy435;
+       if (yych == 's') goto yy436;
        goto yy276;
 yy408:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'l') goto yy437;
+       if (yych <= 0x00) goto yy437;
        goto yy276;
 yy409:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy438;
+       if (yych == 'l') goto yy439;
        goto yy276;
 yy410:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy439;
+       if (yych == '-') goto yy440;
        goto yy276;
 yy411:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy440;
+       if (yych == 'o') goto yy441;
        goto yy276;
 yy412:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'l') goto yy441;
+       if (yych == 'c') goto yy442;
        goto yy276;
 yy413:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy442;
+       if (yych == 'l') goto yy443;
        goto yy276;
 yy414:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy443;
+       if (yych == 'e') goto yy444;
        goto yy276;
 yy415:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy444;
+       if (yych == 'e') goto yy445;
        goto yy276;
 yy416:
-       ++YYCURSOR;
-#line 156 "../src/conf/parse_opts.re"
-       { if (!opts.set_encoding (Enc::UTF8))   { error_encoding (); return EXIT_FAIL; } goto opt; }
-#line 1750 "src/conf/parse_opts.cc"
-yy418:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 0x00) goto yy446;
        goto yy276;
+yy417:
+       ++YYCURSOR;
+#line 156 "../src/conf/parse_opts.re"
+       { if (!opts.set_encoding (Enc::UTF8))   { error_encoding (); return EXIT_FAIL; } goto opt; }
+#line 1755 "src/conf/parse_opts.cc"
 yy419:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy448;
+       if (yych <= 0x00) goto yy448;
        goto yy276;
 yy420:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'h') goto yy449;
+       if (yych == 'n') goto yy450;
        goto yy276;
 yy421:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy450;
+       if (yych == 'h') goto yy451;
        goto yy276;
 yy422:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy451;
-       if (yych == 'v') goto yy452;
+       if (yych == 't') goto yy452;
        goto yy276;
 yy423:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy453;
+       if (yych == 's') goto yy453;
+       if (yych == 'v') goto yy454;
        goto yy276;
 yy424:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'u') goto yy454;
+       if (yych == 'd') goto yy455;
        goto yy276;
 yy425:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy455;
+       if (yych == 'u') goto yy456;
        goto yy276;
 yy426:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy456;
+       if (yych == 'i') goto yy457;
        goto yy276;
 yy427:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy457;
+       if (yych == 'f') goto yy458;
        goto yy276;
 yy428:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'l') goto yy458;
+       if (yych == 'a') goto yy459;
        goto yy276;
 yy429:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'g') goto yy459;
+       if (yych == 't') goto yy460;
        goto yy276;
 yy430:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy460;
+       if (yych == 'l') goto yy461;
        goto yy276;
 yy431:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy461;
+       if (yych == 'g') goto yy462;
        goto yy276;
 yy432:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'g') goto yy462;
+       if (yych == 'n') goto yy463;
        goto yy276;
 yy433:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy463;
+       if (yych == 'i') goto yy464;
        goto yy276;
 yy434:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy464;
+       if (yych == 'g') goto yy465;
        goto yy276;
 yy435:
-       ++YYCURSOR;
-#line 157 "../src/conf/parse_opts.re"
-       { if (!next (YYCURSOR, argv)) { error_arg ("-o, --output"); return EXIT_FAIL; } goto opt_output; }
-#line 1824 "src/conf/parse_opts.cc"
-yy437:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy465;
+       if (yych == 'r') goto yy466;
        goto yy276;
-yy438:
+yy436:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'p') goto yy466;
+       if (yych == 'i') goto yy467;
        goto yy276;
+yy437:
+       ++YYCURSOR;
+#line 157 "../src/conf/parse_opts.re"
+       { if (!next (YYCURSOR, argv)) { error_arg ("-o, --output"); return EXIT_FAIL; } goto opt_output; }
+#line 1833 "src/conf/parse_opts.cc"
 yy439:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy467;
+       if (yych == 'e') goto yy468;
        goto yy276;
 yy440:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy468;
+       if (yych == 'p') goto yy469;
        goto yy276;
 yy441:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy469;
+       if (yych == 'n') goto yy470;
        goto yy276;
 yy442:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy470;
+       if (yych == 'o') goto yy471;
        goto yy276;
 yy443:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy471;
+       if (yych == 'e') goto yy472;
        goto yy276;
 yy444:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'a') goto yy473;
+       goto yy276;
+yy445:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy474;
+       goto yy276;
+yy446:
        ++YYCURSOR;
 #line 155 "../src/conf/parse_opts.re"
        { if (!opts.set_encoding (Enc::UTF16))  { error_encoding (); return EXIT_FAIL; } goto opt; }
-#line 1857 "src/conf/parse_opts.cc"
-yy446:
+#line 1866 "src/conf/parse_opts.cc"
+yy448:
        ++YYCURSOR;
 #line 135 "../src/conf/parse_opts.re"
        { vernum ();  return EXIT_OK; }
-#line 1862 "src/conf/parse_opts.cc"
-yy448:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy473;
-       goto yy276;
-yy449:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy475;
-       goto yy276;
+#line 1871 "src/conf/parse_opts.cc"
 yy450:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy476;
+       if (yych <= 0x00) goto yy476;
        goto yy276;
 yy451:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy477;
+       if (yych == 'a') goto yy478;
        goto yy276;
 yy452:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy478;
+       if (yych == 'o') goto yy479;
        goto yy276;
 yy453:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy479;
+       if (yych == 'e') goto yy480;
        goto yy276;
 yy454:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy480;
+       if (yych == 'e') goto yy481;
        goto yy276;
 yy455:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'm') goto yy481;
+       if (yych == '-') goto yy482;
        goto yy276;
 yy456:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy482;
+       if (yych == 't') goto yy483;
        goto yy276;
 yy457:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy483;
+       if (yych == 'm') goto yy484;
        goto yy276;
 yy458:
        yych = (YYCTYPE)*++YYCURSOR;
@@ -1909,27 +1910,27 @@ yy459:
        goto yy276;
 yy460:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy487;
+       if (yych <= 0x00) goto yy487;
        goto yy276;
 yy461:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'f') goto yy488;
+       if (yych == 'a') goto yy489;
        goto yy276;
 yy462:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy489;
+       if (yych == '-') goto yy490;
        goto yy276;
 yy463:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy490;
+       if (yych == 't') goto yy491;
        goto yy276;
 yy464:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy491;
+       if (yych == 'f') goto yy492;
        goto yy276;
 yy465:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy492;
+       if (yych == '-') goto yy493;
        goto yy276;
 yy466:
        yych = (YYCTYPE)*++YYCURSOR;
@@ -1937,492 +1938,492 @@ yy466:
        goto yy276;
 yy467:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy495;
+       if (yych == 'o') goto yy495;
        goto yy276;
 yy468:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy497;
+       if (yych <= 0x00) goto yy496;
        goto yy276;
 yy469:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy498;
+       if (yych == 'a') goto yy498;
        goto yy276;
 yy470:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy499;
+       if (yych <= 0x00) goto yy499;
        goto yy276;
 yy471:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'n') goto yy501;
+       goto yy276;
+yy472:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == '-') goto yy502;
+       goto yy276;
+yy473:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'd') goto yy503;
+       goto yy276;
+yy474:
        ++YYCURSOR;
 #line 153 "../src/conf/parse_opts.re"
        { if (!opts.set_encoding (Enc::UTF32))  { error_encoding (); return EXIT_FAIL; } goto opt; }
-#line 1959 "src/conf/parse_opts.cc"
-yy473:
+#line 1972 "src/conf/parse_opts.cc"
+yy476:
        ++YYCURSOR;
 #line 134 "../src/conf/parse_opts.re"
        { version (); return EXIT_OK; }
-#line 1964 "src/conf/parse_opts.cc"
-yy475:
+#line 1977 "src/conf/parse_opts.cc"
+yy478:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy500;
+       if (yych == 'r') goto yy504;
        goto yy276;
-yy476:
+yy479:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy501;
+       if (yych == 'r') goto yy505;
        goto yy276;
-yy477:
+yy480:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy502;
+       if (yych == 'n') goto yy506;
        goto yy276;
-yy478:
+yy481:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy503;
+       if (yych == 'r') goto yy507;
        goto yy276;
-yy479:
+yy482:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'g') goto yy504;
+       if (yych == 'g') goto yy508;
        goto yy276;
-yy480:
+yy483:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'p') goto yy505;
+       if (yych == 'p') goto yy509;
        goto yy276;
-yy481:
+yy484:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy506;
+       if (yych == 'i') goto yy510;
        goto yy276;
-yy482:
+yy485:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy511;
+       goto yy276;
+yy486:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 'l') {
-               if (yych == 'd') goto yy507;
+               if (yych == 'd') goto yy513;
                goto yy276;
        } else {
-               if (yych <= 'm') goto yy508;
-               if (yych == 't') goto yy509;
+               if (yych <= 'm') goto yy514;
+               if (yych == 't') goto yy515;
                goto yy276;
        }
-yy483:
+yy487:
        ++YYCURSOR;
 #line 139 "../src/conf/parse_opts.re"
        { opts.set_target (opt_t::DOT);      goto opt; }
-#line 2007 "src/conf/parse_opts.cc"
-yy485:
+#line 2024 "src/conf/parse_opts.cc"
+yy489:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy510;
+       if (yych == 's') goto yy516;
        goto yy276;
-yy486:
+yy490:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'p') goto yy511;
+       if (yych == 'p') goto yy517;
        goto yy276;
-yy487:
+yy491:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy512;
+       if (yych == 'a') goto yy518;
        goto yy276;
-yy488:
+yy492:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy513;
+       if (yych == 's') goto yy519;
        goto yy276;
-yy489:
+yy493:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy514;
+       if (yych == 'i') goto yy520;
        goto yy276;
-yy490:
+yy494:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy515;
+       if (yych == 't') goto yy521;
        goto yy276;
-yy491:
+yy495:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy516;
+       if (yych == 'n') goto yy522;
        goto yy276;
-yy492:
+yy496:
        ++YYCURSOR;
 #line 144 "../src/conf/parse_opts.re"
        { opts.set_rFlag (true);             goto opt; }
-#line 2040 "src/conf/parse_opts.cc"
-yy494:
+#line 2057 "src/conf/parse_opts.cc"
+yy498:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy517;
+       if (yych == 's') goto yy523;
        goto yy276;
-yy495:
+yy499:
        ++YYCURSOR;
 #line 150 "../src/conf/parse_opts.re"
        { opts.set_target (opt_t::SKELETON); goto opt; }
-#line 2049 "src/conf/parse_opts.cc"
-yy497:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy518;
-       goto yy276;
-yy498:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy519;
-       goto yy276;
-yy499:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy520;
-       goto yy276;
-yy500:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy521;
-       goto yy276;
+#line 2066 "src/conf/parse_opts.cc"
 yy501:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy522;
+       if (yych == 'd') goto yy524;
        goto yy276;
 yy502:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy523;
+       if (yych == 's') goto yy525;
        goto yy276;
 yy503:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy524;
+       if (yych == 'e') goto yy526;
        goto yy276;
 yy504:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy525;
+       if (yych == 's') goto yy527;
        goto yy276;
 yy505:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'u') goto yy526;
+       if (yych == 's') goto yy528;
        goto yy276;
 yy506:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'z') goto yy527;
+       if (yych == 's') goto yy529;
        goto yy276;
 yy507:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy528;
+       if (yych == 't') goto yy530;
        goto yy276;
 yy508:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy529;
+       if (yych == 'o') goto yy531;
        goto yy276;
 yy509:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy530;
+       if (yych == 'u') goto yy532;
        goto yy276;
 yy510:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy531;
+       if (yych == 'z') goto yy533;
        goto yy276;
 yy511:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy532;
-       goto yy276;
-yy512:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'x') goto yy533;
-       goto yy276;
+       ++YYCURSOR;
+#line 168 "../src/conf/parse_opts.re"
+       { opts.set_dump_adfa(true);       goto opt; }
+#line 2111 "src/conf/parse_opts.cc"
 yy513:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy534;
+       if (yych == 'e') goto yy534;
        goto yy276;
 yy514:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy536;
+       if (yych == 'i') goto yy535;
        goto yy276;
 yy515:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy537;
+       if (yych == 'a') goto yy536;
        goto yy276;
 yy516:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy538;
+       if (yych == 's') goto yy537;
        goto yy276;
 yy517:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy540;
+       if (yych == 'o') goto yy538;
        goto yy276;
 yy518:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy541;
+       if (yych == 'x') goto yy539;
        goto yy276;
 yy519:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy542;
+       if (yych <= 0x00) goto yy540;
        goto yy276;
 yy520:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy543;
+       if (yych == 'n') goto yy542;
        goto yy276;
 yy521:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy544;
+       if (yych == 'i') goto yy543;
        goto yy276;
 yy522:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy546;
+       if (yych <= 0x00) goto yy544;
        goto yy276;
 yy523:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy548;
+       if (yych == 's') goto yy546;
        goto yy276;
 yy524:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy549;
+       if (yych == 'i') goto yy547;
        goto yy276;
 yy525:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy550;
+       if (yych == 't') goto yy548;
        goto yy276;
 yy526:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy551;
+       if (yych == 'r') goto yy549;
        goto yy276;
 yy527:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy552;
+       if (yych <= 0x00) goto yy550;
        goto yy276;
 yy528:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy553;
+       if (yych <= 0x00) goto yy552;
        goto yy276;
 yy529:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy554;
+       if (yych == 'i') goto yy554;
        goto yy276;
 yy530:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'g') goto yy555;
+       if (yych == 'e') goto yy555;
        goto yy276;
 yy531:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy556;
+       if (yych == 't') goto yy556;
        goto yy276;
 yy532:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'l') goto yy558;
+       if (yych == 't') goto yy557;
        goto yy276;
 yy533:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy559;
+       if (yych == 'a') goto yy558;
        goto yy276;
 yy534:
-       ++YYCURSOR;
-#line 145 "../src/conf/parse_opts.re"
-       { opts.set_sFlag (true);             goto opt; }
-#line 2202 "src/conf/parse_opts.cc"
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 't') goto yy559;
+       goto yy276;
+yy535:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'n') goto yy560;
+       goto yy276;
 yy536:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'f') goto yy561;
+       if (yych == 'g') goto yy561;
        goto yy276;
 yy537:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy562;
+       if (yych <= 0x00) goto yy562;
        goto yy276;
 yy538:
-       ++YYCURSOR;
-#line 147 "../src/conf/parse_opts.re"
-       { opts.set_version (false);          goto opt; }
-#line 2215 "src/conf/parse_opts.cc"
-yy540:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy563;
+       if (yych == 'l') goto yy564;
        goto yy276;
-yy541:
+yy539:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy565;
+       if (yych <= 0x00) goto yy565;
        goto yy276;
+yy540:
+       ++YYCURSOR;
+#line 145 "../src/conf/parse_opts.re"
+       { opts.set_sFlag (true);             goto opt; }
+#line 2224 "src/conf/parse_opts.cc"
 yy542:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy566;
+       if (yych == 'f') goto yy567;
        goto yy276;
 yy543:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy567;
+       if (yych == 'o') goto yy568;
        goto yy276;
 yy544:
        ++YYCURSOR;
+#line 147 "../src/conf/parse_opts.re"
+       { opts.set_version (false);          goto opt; }
+#line 2237 "src/conf/parse_opts.cc"
+yy546:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy569;
+       goto yy276;
+yy547:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 't') goto yy571;
+       goto yy276;
+yy548:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'a') goto yy572;
+       goto yy276;
+yy549:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy573;
+       goto yy276;
+yy550:
+       ++YYCURSOR;
 #line 154 "../src/conf/parse_opts.re"
        { if (!opts.set_encoding (Enc::UCS2))   { error_encoding (); return EXIT_FAIL; } goto opt; }
-#line 2236 "src/conf/parse_opts.cc"
-yy546:
+#line 2258 "src/conf/parse_opts.cc"
+yy552:
        ++YYCURSOR;
 #line 136 "../src/conf/parse_opts.re"
        { opts.set_bFlag (true);             goto opt; }
-#line 2241 "src/conf/parse_opts.cc"
-yy548:
+#line 2263 "src/conf/parse_opts.cc"
+yy554:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy569;
+       if (yych == 't') goto yy575;
        goto yy276;
-yy549:
+yy555:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy570;
+       if (yych == 'd') goto yy576;
        goto yy276;
-yy550:
+yy556:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy571;
+       if (yych == 'o') goto yy577;
        goto yy276;
-yy551:
+yy557:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy572;
+       if (yych <= 0x00) goto yy578;
        goto yy276;
-yy552:
+yy558:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy574;
+       if (yych == 't') goto yy580;
        goto yy276;
-yy553:
+yy559:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy575;
+       if (yych <= 0x00) goto yy581;
        goto yy276;
-yy554:
+yy560:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy577;
+       if (yych <= 0x00) goto yy583;
        goto yy276;
-yy555:
+yy561:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy579;
+       if (yych == 'o') goto yy585;
        goto yy276;
-yy556:
+yy562:
        ++YYCURSOR;
 #line 161 "../src/conf/parse_opts.re"
        { goto opt_empty_class; }
-#line 2278 "src/conf/parse_opts.cc"
-yy558:
+#line 2300 "src/conf/parse_opts.cc"
+yy564:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy580;
+       if (yych == 'i') goto yy586;
        goto yy276;
-yy559:
+yy565:
        ++YYCURSOR;
 #line 141 "../src/conf/parse_opts.re"
        { opts.set_FFlag (true);             goto opt; }
-#line 2287 "src/conf/parse_opts.cc"
-yy561:
+#line 2309 "src/conf/parse_opts.cc"
+yy567:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy581;
+       if (yych == 'o') goto yy587;
        goto yy276;
-yy562:
+yy568:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy582;
+       if (yych == 'n') goto yy588;
        goto yy276;
-yy563:
+yy569:
        ++YYCURSOR;
 #line 163 "../src/conf/parse_opts.re"
        { goto opt; }
-#line 2300 "src/conf/parse_opts.cc"
-yy565:
+#line 2322 "src/conf/parse_opts.cc"
+yy571:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy583;
+       if (yych == 'i') goto yy589;
        goto yy276;
-yy566:
+yy572:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy584;
+       if (yych == 't') goto yy590;
        goto yy276;
-yy567:
+yy573:
        ++YYCURSOR;
 #line 158 "../src/conf/parse_opts.re"
        { if (!next (YYCURSOR, argv)) { error_arg ("-t, --type-header"); return EXIT_FAIL; } goto opt_header; }
-#line 2313 "src/conf/parse_opts.cc"
-yy569:
+#line 2335 "src/conf/parse_opts.cc"
+yy575:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy585;
+       if (yych == 'i') goto yy591;
        goto yy276;
-yy570:
+yy576:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy586;
+       if (yych <= 0x00) goto yy592;
        goto yy276;
-yy571:
+yy577:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy588;
+       if (yych == 's') goto yy594;
        goto yy276;
-yy572:
+yy578:
        ++YYCURSOR;
 #line 138 "../src/conf/parse_opts.re"
        { opts.set_dFlag (true);             goto opt; }
-#line 2330 "src/conf/parse_opts.cc"
-yy574:
+#line 2352 "src/conf/parse_opts.cc"
+yy580:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy589;
+       if (yych == 'i') goto yy595;
        goto yy276;
-yy575:
+yy581:
        ++YYCURSOR;
 #line 165 "../src/conf/parse_opts.re"
        { opts.set_dump_dfa_det(true);    goto opt; }
-#line 2339 "src/conf/parse_opts.cc"
-yy577:
+#line 2361 "src/conf/parse_opts.cc"
+yy583:
        ++YYCURSOR;
 #line 167 "../src/conf/parse_opts.re"
        { opts.set_dump_dfa_min(true);    goto opt; }
-#line 2344 "src/conf/parse_opts.cc"
-yy579:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'p') goto yy590;
-       goto yy276;
-yy580:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy591;
-       goto yy276;
-yy581:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy592;
-       goto yy276;
-yy582:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy594;
-       goto yy276;
-yy583:
+#line 2366 "src/conf/parse_opts.cc"
+yy585:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy595;
+       if (yych == 'p') goto yy596;
        goto yy276;
-yy584:
+yy586:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy596;
+       if (yych == 'c') goto yy597;
        goto yy276;
-yy585:
+yy587:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'v') goto yy597;
+       if (yych <= 0x00) goto yy598;
        goto yy276;
-yy586:
-       ++YYCURSOR;
-#line 149 "../src/conf/parse_opts.re"
-       { opts.set_bCaseInverted (true);     goto opt; }
-#line 2377 "src/conf/parse_opts.cc"
 yy588:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy598;
+       if (yych == '-') goto yy600;
        goto yy276;
 yy589:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy600;
+       if (yych == 'o') goto yy601;
        goto yy276;
 yy590:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy601;
+       if (yych == 'e') goto yy602;
        goto yy276;
 yy591:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'y') goto yy602;
+       if (yych == 'v') goto yy603;
        goto yy276;
 yy592:
        ++YYCURSOR;
-#line 143 "../src/conf/parse_opts.re"
-       { opts.set_iFlag (true);             goto opt; }
-#line 2398 "src/conf/parse_opts.cc"
+#line 149 "../src/conf/parse_opts.re"
+       { opts.set_bCaseInverted (true);     goto opt; }
+#line 2399 "src/conf/parse_opts.cc"
 yy594:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy603;
+       if (yych <= 0x00) goto yy604;
        goto yy276;
 yy595:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy604;
+       if (yych == 'o') goto yy606;
        goto yy276;
 yy596:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy605;
+       if (yych == 't') goto yy607;
        goto yy276;
 yy597:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy607;
+       if (yych == 'y') goto yy608;
        goto yy276;
 yy598:
        ++YYCURSOR;
-#line 142 "../src/conf/parse_opts.re"
-       { opts.set_gFlag (true);             goto opt; }
-#line 2419 "src/conf/parse_opts.cc"
+#line 143 "../src/conf/parse_opts.re"
+       { opts.set_iFlag (true);             goto opt; }
+#line 2420 "src/conf/parse_opts.cc"
 yy600:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy608;
+       if (yych == 'd') goto yy609;
        goto yy276;
 yy601:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy609;
+       if (yych == 'n') goto yy610;
        goto yy276;
 yy602:
        yych = (YYCTYPE)*++YYCURSOR;
@@ -2430,17 +2431,17 @@ yy602:
        goto yy276;
 yy603:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy613;
+       if (yych == 'e') goto yy613;
        goto yy276;
 yy604:
+       ++YYCURSOR;
+#line 142 "../src/conf/parse_opts.re"
+       { opts.set_gFlag (true);             goto opt; }
+#line 2441 "src/conf/parse_opts.cc"
+yy606:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy614;
+       if (yych == 'n') goto yy614;
        goto yy276;
-yy605:
-       ++YYCURSOR;
-#line 140 "../src/conf/parse_opts.re"
-       { opts.set_fFlag (true);             goto opt; }
-#line 2444 "src/conf/parse_opts.cc"
 yy607:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 0x00) goto yy615;
@@ -2450,56 +2451,77 @@ yy608:
        if (yych <= 0x00) goto yy617;
        goto yy276;
 yy609:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'a') goto yy619;
+       goto yy276;
+yy610:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 's') goto yy620;
+       goto yy276;
+yy611:
+       ++YYCURSOR;
+#line 140 "../src/conf/parse_opts.re"
+       { opts.set_fFlag (true);             goto opt; }
+#line 2466 "src/conf/parse_opts.cc"
+yy613:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy621;
+       goto yy276;
+yy614:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy623;
+       goto yy276;
+yy615:
        ++YYCURSOR;
 #line 166 "../src/conf/parse_opts.re"
        { opts.set_dump_dfa_tagopt(true); goto opt; }
-#line 2457 "src/conf/parse_opts.cc"
-yy611:
+#line 2479 "src/conf/parse_opts.cc"
+yy617:
        ++YYCURSOR;
 #line 159 "../src/conf/parse_opts.re"
        { goto opt_encoding_policy; }
-#line 2462 "src/conf/parse_opts.cc"
-yy613:
+#line 2484 "src/conf/parse_opts.cc"
+yy619:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy619;
+       if (yych == 't') goto yy625;
        goto yy276;
-yy614:
+yy620:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy620;
+       if (yych <= 0x00) goto yy626;
        goto yy276;
-yy615:
+yy621:
        ++YYCURSOR;
 #line 148 "../src/conf/parse_opts.re"
        { opts.set_bCaseInsensitive (true);  goto opt; }
-#line 2475 "src/conf/parse_opts.cc"
-yy617:
+#line 2497 "src/conf/parse_opts.cc"
+yy623:
        ++YYCURSOR;
 #line 162 "../src/conf/parse_opts.re"
        { goto opt_dfa_minimization; }
-#line 2480 "src/conf/parse_opts.cc"
-yy619:
+#line 2502 "src/conf/parse_opts.cc"
+yy625:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy622;
+       if (yych == 'e') goto yy628;
        goto yy276;
-yy620:
+yy626:
        ++YYCURSOR;
 #line 137 "../src/conf/parse_opts.re"
        { opts.set_cFlag (true);             goto opt; }
-#line 2489 "src/conf/parse_opts.cc"
-yy622:
+#line 2511 "src/conf/parse_opts.cc"
+yy628:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych >= 0x01) goto yy276;
        ++YYCURSOR;
 #line 146 "../src/conf/parse_opts.re"
        { opts.set_bNoGenerationDate (true); goto opt; }
-#line 2496 "src/conf/parse_opts.cc"
+#line 2518 "src/conf/parse_opts.cc"
 }
-#line 168 "../src/conf/parse_opts.re"
+#line 169 "../src/conf/parse_opts.re"
 
 
 opt_output:
 
-#line 2503 "src/conf/parse_opts.cc"
+#line 2525 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -2537,33 +2559,33 @@ opt_output:
                128, 128, 128, 128, 128, 128, 128, 128, 
        };
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= 0x00) goto yy627;
-       if (yych != '-') goto yy629;
-yy627:
+       if (yych <= 0x00) goto yy633;
+       if (yych != '-') goto yy635;
+yy633:
        ++YYCURSOR;
-#line 173 "../src/conf/parse_opts.re"
+#line 174 "../src/conf/parse_opts.re"
        {
                error ("bad argument to option -o, --output: %s", *argv);
                return EXIT_FAIL;
        }
-#line 2550 "src/conf/parse_opts.cc"
-yy629:
+#line 2572 "src/conf/parse_opts.cc"
+yy635:
        ++YYCURSOR;
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy629;
+               goto yy635;
        }
        ++YYCURSOR;
-#line 177 "../src/conf/parse_opts.re"
+#line 178 "../src/conf/parse_opts.re"
        { opts.set_output_file(*argv); goto opt; }
-#line 2560 "src/conf/parse_opts.cc"
+#line 2582 "src/conf/parse_opts.cc"
 }
-#line 178 "../src/conf/parse_opts.re"
+#line 179 "../src/conf/parse_opts.re"
 
 
 opt_header:
 
-#line 2567 "src/conf/parse_opts.cc"
+#line 2589 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -2601,28 +2623,28 @@ opt_header:
                128, 128, 128, 128, 128, 128, 128, 128, 
        };
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= 0x00) goto yy635;
-       if (yych != '-') goto yy637;
-yy635:
+       if (yych <= 0x00) goto yy641;
+       if (yych != '-') goto yy643;
+yy641:
        ++YYCURSOR;
-#line 183 "../src/conf/parse_opts.re"
+#line 184 "../src/conf/parse_opts.re"
        {
                error ("bad argument to option -t, --type-header: %s", *argv);
                return EXIT_FAIL;
        }
-#line 2614 "src/conf/parse_opts.cc"
-yy637:
+#line 2636 "src/conf/parse_opts.cc"
+yy643:
        ++YYCURSOR;
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy637;
+               goto yy643;
        }
        ++YYCURSOR;
-#line 187 "../src/conf/parse_opts.re"
+#line 188 "../src/conf/parse_opts.re"
        { opts.set_header_file (*argv); goto opt; }
-#line 2624 "src/conf/parse_opts.cc"
+#line 2646 "src/conf/parse_opts.cc"
 }
-#line 188 "../src/conf/parse_opts.re"
+#line 189 "../src/conf/parse_opts.re"
 
 
 opt_encoding_policy:
@@ -2632,115 +2654,115 @@ opt_encoding_policy:
                return EXIT_FAIL;
        }
 
-#line 2636 "src/conf/parse_opts.cc"
+#line 2658 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 'h') {
-               if (yych == 'f') goto yy645;
+               if (yych == 'f') goto yy651;
        } else {
-               if (yych <= 'i') goto yy646;
-               if (yych == 's') goto yy647;
+               if (yych <= 'i') goto yy652;
+               if (yych == 's') goto yy653;
        }
        ++YYCURSOR;
-yy644:
-#line 198 "../src/conf/parse_opts.re"
+yy650:
+#line 199 "../src/conf/parse_opts.re"
        {
                error ("bad argument to option --encoding-policy (expected: ignore | substitute | fail): %s", *argv);
                return EXIT_FAIL;
        }
-#line 2653 "src/conf/parse_opts.cc"
-yy645:
-       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'a') goto yy648;
-       goto yy644;
-yy646:
-       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'g') goto yy650;
-       goto yy644;
-yy647:
-       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'u') goto yy651;
-       goto yy644;
-yy648:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy652;
-yy649:
-       YYCURSOR = YYMARKER;
-       goto yy644;
-yy650:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy653;
-       goto yy649;
+#line 2675 "src/conf/parse_opts.cc"
 yy651:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'b') goto yy654;
-       goto yy649;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych == 'a') goto yy654;
+       goto yy650;
 yy652:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'l') goto yy655;
-       goto yy649;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych == 'g') goto yy656;
+       goto yy650;
 yy653:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy656;
-       goto yy649;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych == 'u') goto yy657;
+       goto yy650;
 yy654:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy657;
-       goto yy649;
+       if (yych == 'i') goto yy658;
 yy655:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy658;
-       goto yy649;
+       YYCURSOR = YYMARKER;
+       goto yy650;
 yy656:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy660;
-       goto yy649;
+       if (yych == 'n') goto yy659;
+       goto yy655;
 yy657:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy661;
-       goto yy649;
+       if (yych == 'b') goto yy660;
+       goto yy655;
 yy658:
-       ++YYCURSOR;
-#line 204 "../src/conf/parse_opts.re"
-       { opts.set_encoding_policy (Enc::POLICY_FAIL);       goto opt; }
-#line 2708 "src/conf/parse_opts.cc"
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'l') goto yy661;
+       goto yy655;
+yy659:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'o') goto yy662;
+       goto yy655;
 yy660:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy662;
-       goto yy649;
+       if (yych == 's') goto yy663;
+       goto yy655;
 yy661:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy663;
-       goto yy649;
+       if (yych <= 0x00) goto yy664;
+       goto yy655;
 yy662:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy664;
-       goto yy649;
+       if (yych == 'r') goto yy666;
+       goto yy655;
 yy663:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy666;
-       goto yy649;
+       if (yych == 't') goto yy667;
+       goto yy655;
 yy664:
        ++YYCURSOR;
-#line 202 "../src/conf/parse_opts.re"
-       { opts.set_encoding_policy (Enc::POLICY_IGNORE);     goto opt; }
-#line 2729 "src/conf/parse_opts.cc"
+#line 205 "../src/conf/parse_opts.re"
+       { opts.set_encoding_policy (Enc::POLICY_FAIL);       goto opt; }
+#line 2730 "src/conf/parse_opts.cc"
 yy666:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'u') goto yy649;
+       if (yych == 'e') goto yy668;
+       goto yy655;
+yy667:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 't') goto yy649;
+       if (yych == 'i') goto yy669;
+       goto yy655;
+yy668:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy649;
+       if (yych <= 0x00) goto yy670;
+       goto yy655;
+yy669:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych >= 0x01) goto yy649;
+       if (yych == 't') goto yy672;
+       goto yy655;
+yy670:
        ++YYCURSOR;
 #line 203 "../src/conf/parse_opts.re"
+       { opts.set_encoding_policy (Enc::POLICY_IGNORE);     goto opt; }
+#line 2751 "src/conf/parse_opts.cc"
+yy672:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych != 'u') goto yy655;
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych != 't') goto yy655;
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych != 'e') goto yy655;
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych >= 0x01) goto yy655;
+       ++YYCURSOR;
+#line 204 "../src/conf/parse_opts.re"
        { opts.set_encoding_policy (Enc::POLICY_SUBSTITUTE); goto opt; }
-#line 2742 "src/conf/parse_opts.cc"
+#line 2764 "src/conf/parse_opts.cc"
 }
-#line 205 "../src/conf/parse_opts.re"
+#line 206 "../src/conf/parse_opts.re"
 
 
 opt_input:
@@ -2750,86 +2772,86 @@ opt_input:
                return EXIT_FAIL;
        }
 
-#line 2754 "src/conf/parse_opts.cc"
+#line 2776 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= 'b') goto yy674;
-       if (yych <= 'c') goto yy676;
-       if (yych <= 'd') goto yy677;
-yy674:
+       if (yych <= 'b') goto yy680;
+       if (yych <= 'c') goto yy682;
+       if (yych <= 'd') goto yy683;
+yy680:
        ++YYCURSOR;
-yy675:
-#line 215 "../src/conf/parse_opts.re"
+yy681:
+#line 216 "../src/conf/parse_opts.re"
        {
                error ("bad argument to option --input (expected: default | custom): %s", *argv);
                return EXIT_FAIL;
        }
-#line 2769 "src/conf/parse_opts.cc"
-yy676:
+#line 2791 "src/conf/parse_opts.cc"
+yy682:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'u') goto yy678;
-       goto yy675;
-yy677:
+       if (yych == 'u') goto yy684;
+       goto yy681;
+yy683:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'e') goto yy680;
-       goto yy675;
-yy678:
+       if (yych == 'e') goto yy686;
+       goto yy681;
+yy684:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy681;
-yy679:
+       if (yych == 's') goto yy687;
+yy685:
        YYCURSOR = YYMARKER;
-       goto yy675;
-yy680:
+       goto yy681;
+yy686:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'f') goto yy682;
-       goto yy679;
-yy681:
+       if (yych == 'f') goto yy688;
+       goto yy685;
+yy687:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy683;
-       goto yy679;
-yy682:
+       if (yych == 't') goto yy689;
+       goto yy685;
+yy688:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy684;
-       goto yy679;
-yy683:
+       if (yych == 'a') goto yy690;
+       goto yy685;
+yy689:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy685;
-       goto yy679;
-yy684:
+       if (yych == 'o') goto yy691;
+       goto yy685;
+yy690:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'u') goto yy686;
-       goto yy679;
-yy685:
+       if (yych == 'u') goto yy692;
+       goto yy685;
+yy691:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'm') goto yy687;
-       goto yy679;
-yy686:
+       if (yych == 'm') goto yy693;
+       goto yy685;
+yy692:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'l') goto yy688;
-       goto yy679;
-yy687:
+       if (yych == 'l') goto yy694;
+       goto yy685;
+yy693:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy689;
-       goto yy679;
-yy688:
+       if (yych <= 0x00) goto yy695;
+       goto yy685;
+yy694:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy691;
-       goto yy679;
-yy689:
+       if (yych == 't') goto yy697;
+       goto yy685;
+yy695:
        ++YYCURSOR;
-#line 220 "../src/conf/parse_opts.re"
+#line 221 "../src/conf/parse_opts.re"
        { opts.set_input_api (InputAPI::CUSTOM);  goto opt; }
-#line 2824 "src/conf/parse_opts.cc"
-yy691:
+#line 2846 "src/conf/parse_opts.cc"
+yy697:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych >= 0x01) goto yy679;
+       if (yych >= 0x01) goto yy685;
        ++YYCURSOR;
-#line 219 "../src/conf/parse_opts.re"
+#line 220 "../src/conf/parse_opts.re"
        { opts.set_input_api (InputAPI::DEFAULT); goto opt; }
-#line 2831 "src/conf/parse_opts.cc"
+#line 2853 "src/conf/parse_opts.cc"
 }
-#line 221 "../src/conf/parse_opts.re"
+#line 222 "../src/conf/parse_opts.re"
 
 
 opt_empty_class:
@@ -2839,120 +2861,120 @@ opt_empty_class:
                return EXIT_FAIL;
        }
 
-#line 2843 "src/conf/parse_opts.cc"
+#line 2865 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == 'e') goto yy698;
-       if (yych == 'm') goto yy699;
+       if (yych == 'e') goto yy704;
+       if (yych == 'm') goto yy705;
        ++YYCURSOR;
-yy697:
-#line 231 "../src/conf/parse_opts.re"
+yy703:
+#line 232 "../src/conf/parse_opts.re"
        {
                error ("bad argument to option --empty-class (expected: match-empty | match-none | error): %s", *argv);
                return EXIT_FAIL;
        }
-#line 2856 "src/conf/parse_opts.cc"
-yy698:
-       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'r') goto yy700;
-       goto yy697;
-yy699:
-       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'a') goto yy702;
-       goto yy697;
-yy700:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy703;
-yy701:
-       YYCURSOR = YYMARKER;
-       goto yy697;
-yy702:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy704;
-       goto yy701;
-yy703:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy705;
-       goto yy701;
+#line 2878 "src/conf/parse_opts.cc"
 yy704:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy706;
-       goto yy701;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych == 'r') goto yy706;
+       goto yy703;
 yy705:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy707;
-       goto yy701;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych == 'a') goto yy708;
+       goto yy703;
 yy706:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'h') goto yy708;
-       goto yy701;
+       if (yych == 'r') goto yy709;
 yy707:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy709;
-       goto yy701;
+       YYCURSOR = YYMARKER;
+       goto yy703;
 yy708:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy711;
-       goto yy701;
+       if (yych == 't') goto yy710;
+       goto yy707;
 yy709:
-       ++YYCURSOR;
-#line 237 "../src/conf/parse_opts.re"
-       { opts.set_empty_class_policy (EMPTY_CLASS_ERROR);       goto opt; }
-#line 2903 "src/conf/parse_opts.cc"
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'o') goto yy711;
+       goto yy707;
+yy710:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'c') goto yy712;
+       goto yy707;
 yy711:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy712;
-       if (yych == 'n') goto yy713;
-       goto yy701;
+       if (yych == 'r') goto yy713;
+       goto yy707;
 yy712:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'm') goto yy714;
-       goto yy701;
+       if (yych == 'h') goto yy714;
+       goto yy707;
 yy713:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy715;
-       goto yy701;
+       if (yych <= 0x00) goto yy715;
+       goto yy707;
 yy714:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'p') goto yy716;
-       goto yy701;
+       if (yych == '-') goto yy717;
+       goto yy707;
 yy715:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy717;
-       goto yy701;
-yy716:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy718;
-       goto yy701;
+       ++YYCURSOR;
+#line 238 "../src/conf/parse_opts.re"
+       { opts.set_empty_class_policy (EMPTY_CLASS_ERROR);       goto opt; }
+#line 2925 "src/conf/parse_opts.cc"
 yy717:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy719;
-       goto yy701;
+       if (yych == 'e') goto yy718;
+       if (yych == 'n') goto yy719;
+       goto yy707;
 yy718:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'y') goto yy720;
-       goto yy701;
+       if (yych == 'm') goto yy720;
+       goto yy707;
 yy719:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy721;
-       goto yy701;
+       if (yych == 'o') goto yy721;
+       goto yy707;
 yy720:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy723;
-       goto yy701;
+       if (yych == 'p') goto yy722;
+       goto yy707;
 yy721:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'n') goto yy723;
+       goto yy707;
+yy722:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 't') goto yy724;
+       goto yy707;
+yy723:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'e') goto yy725;
+       goto yy707;
+yy724:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'y') goto yy726;
+       goto yy707;
+yy725:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy727;
+       goto yy707;
+yy726:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy729;
+       goto yy707;
+yy727:
        ++YYCURSOR;
-#line 236 "../src/conf/parse_opts.re"
+#line 237 "../src/conf/parse_opts.re"
        { opts.set_empty_class_policy (EMPTY_CLASS_MATCH_NONE);  goto opt; }
-#line 2949 "src/conf/parse_opts.cc"
-yy723:
+#line 2971 "src/conf/parse_opts.cc"
+yy729:
        ++YYCURSOR;
-#line 235 "../src/conf/parse_opts.re"
+#line 236 "../src/conf/parse_opts.re"
        { opts.set_empty_class_policy (EMPTY_CLASS_MATCH_EMPTY); goto opt; }
-#line 2954 "src/conf/parse_opts.cc"
+#line 2976 "src/conf/parse_opts.cc"
 }
-#line 238 "../src/conf/parse_opts.re"
+#line 239 "../src/conf/parse_opts.re"
 
 
 opt_dfa_minimization:
@@ -2962,74 +2984,74 @@ opt_dfa_minimization:
                return EXIT_FAIL;
        }
 
-#line 2966 "src/conf/parse_opts.cc"
+#line 2988 "src/conf/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == 'm') goto yy729;
-       if (yych == 't') goto yy730;
+       if (yych == 'm') goto yy735;
+       if (yych == 't') goto yy736;
        ++YYCURSOR;
-yy728:
-#line 248 "../src/conf/parse_opts.re"
+yy734:
+#line 249 "../src/conf/parse_opts.re"
        {
                error ("bad argument to option --dfa-minimization (expected: table | moore): %s", *argv);
                return EXIT_FAIL;
        }
-#line 2979 "src/conf/parse_opts.cc"
-yy729:
+#line 3001 "src/conf/parse_opts.cc"
+yy735:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'o') goto yy731;
-       goto yy728;
-yy730:
+       if (yych == 'o') goto yy737;
+       goto yy734;
+yy736:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'a') goto yy733;
-       goto yy728;
-yy731:
+       if (yych == 'a') goto yy739;
+       goto yy734;
+yy737:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy734;
-yy732:
+       if (yych == 'o') goto yy740;
+yy738:
        YYCURSOR = YYMARKER;
-       goto yy728;
-yy733:
+       goto yy734;
+yy739:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'b') goto yy735;
-       goto yy732;
-yy734:
+       if (yych == 'b') goto yy741;
+       goto yy738;
+yy740:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy736;
-       goto yy732;
-yy735:
+       if (yych == 'r') goto yy742;
+       goto yy738;
+yy741:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'l') goto yy737;
-       goto yy732;
-yy736:
+       if (yych == 'l') goto yy743;
+       goto yy738;
+yy742:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy738;
-       goto yy732;
-yy737:
+       if (yych == 'e') goto yy744;
+       goto yy738;
+yy743:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy739;
-       goto yy732;
-yy738:
+       if (yych == 'e') goto yy745;
+       goto yy738;
+yy744:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy740;
-       goto yy732;
-yy739:
+       if (yych <= 0x00) goto yy746;
+       goto yy738;
+yy745:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy742;
-       goto yy732;
-yy740:
+       if (yych <= 0x00) goto yy748;
+       goto yy738;
+yy746:
        ++YYCURSOR;
-#line 253 "../src/conf/parse_opts.re"
+#line 254 "../src/conf/parse_opts.re"
        { opts.set_dfa_minimization (DFA_MINIMIZATION_MOORE); goto opt; }
-#line 3026 "src/conf/parse_opts.cc"
-yy742:
+#line 3048 "src/conf/parse_opts.cc"
+yy748:
        ++YYCURSOR;
-#line 252 "../src/conf/parse_opts.re"
+#line 253 "../src/conf/parse_opts.re"
        { opts.set_dfa_minimization (DFA_MINIMIZATION_TABLE); goto opt; }
-#line 3031 "src/conf/parse_opts.cc"
+#line 3053 "src/conf/parse_opts.cc"
 }
-#line 254 "../src/conf/parse_opts.re"
+#line 255 "../src/conf/parse_opts.re"
 
 
 end:
index a1bd46f5ebef2d4c5feff424a21cf099cdc6a4c7..a05127d8bb075b421ca61152d5e93e42bd9399fd 100644 (file)
@@ -117,6 +117,7 @@ void opt_t::fix ()
                        dump_dfa_det = Opt::baseopt.dump_dfa_det;
                        dump_dfa_tagopt = Opt::baseopt.dump_dfa_tagopt;
                        dump_dfa_min = Opt::baseopt.dump_dfa_min;
+                       dump_adfa = Opt::baseopt.dump_adfa;
                        break;
                default:
                        break;
index b8797035cd5b770bf30b639ba569e94c90b06cf8..e255f42a17cab466438bd8128865e37c7bb19a01 100644 (file)
@@ -116,7 +116,8 @@ namespace re2c
        /* dump */ \
        OPT (bool, dump_dfa_det, false) \
        OPT (bool, dump_dfa_tagopt, false) \
-       OPT (bool, dump_dfa_min, false)
+       OPT (bool, dump_dfa_min, false) \
+       OPT (bool, dump_adfa, false)
 
 struct opt_t
 {
index cab8f8933431ad4d3a8a5f767b181ec01c583ee7..164744f59a158ec2096bf173b2875da551d9a7f3 100644 (file)
@@ -165,6 +165,7 @@ opt_long:
        "dump-dfa-det"       end { opts.set_dump_dfa_det(true);    goto opt; }
        "dump-dfa-tagopt"    end { opts.set_dump_dfa_tagopt(true); goto opt; }
        "dump-dfa-min"       end { opts.set_dump_dfa_min(true);    goto opt; }
+       "dump-adfa"          end { opts.set_dump_adfa(true);       goto opt; }
 */
 
 opt_output:
diff --git a/re2c/src/ir/adfa/dump.cc b/re2c/src/ir/adfa/dump.cc
new file mode 100644 (file)
index 0000000..3c219fb
--- /dev/null
@@ -0,0 +1,101 @@
+#include <stdio.h>
+
+#include "src/ir/adfa/dump.h"
+
+namespace re2c
+{
+
+static void dump_adfa_tcmd(const tccmd_t &cmd)
+{
+       const tagsave_t *s = cmd.save;
+       const tagcopy_t *c = cmd.copy;
+       if (!s && !c) return;
+
+       fprintf(stderr, "/");
+       for (; c; c = c->next) {
+               fprintf(stderr, "%d=%d ", c->lhs, c->rhs);
+       }
+       for (; s; s = s->next) {
+               fprintf(stderr, "%d%s ", s->ver, s->bottom ? "?" : "");
+       }
+}
+
+static void dump_adfa_range(uint32_t lower, uint32_t upper)
+{
+       fprintf(stderr, "%u", lower);
+       if (--upper > lower) {
+               fprintf(stderr, "-%u", upper);
+       }
+}
+
+void dump_adfa(const DFA &dfa)
+{
+       fprintf(stderr,
+               "digraph DFA {\n"
+               "  rankdir=LR\n"
+               "  node[shape=Mrecord fontname=fixed]\n"
+               "  edge[arrowhead=vee fontname=fixed]\n\n");
+
+       for (const State *s = dfa.head; s; s = s->next) {
+               const char *attr;
+               Action::type_t action = s->action.type;
+
+               switch (action) {
+                       case Action::ACCEPT: attr = "style=filled fillcolor=gray"; break;
+                       case Action::RULE:   attr = "style=filled fillcolor=lightgray"; break;
+                       default:             attr = ""; break;
+               }
+               fprintf(stderr, "  n%p [height=0.2 width=0.2 label=\"", (void*)s);
+               if (s->fill) {
+                       fprintf(stderr, "F(%u) ", (uint32_t)s->fill);
+               }
+               if (action == Action::RULE) {
+                       const Rule &r = dfa.rules[s->action.info.rule];
+                       for (size_t t = r.lvar; t < r.hvar; ++t) {
+                               if (t > r.lvar) fprintf(stderr, " ");
+                               const std::string *name = dfa.vartags[t].name;
+                               fprintf(stderr, "%s(%d)",
+                                       name ? name->c_str() : "/", dfa.finvers[t]);
+                       }
+               }
+               dump_adfa_tcmd(dfa.tcpool[s->go.tags]);
+               fprintf(stderr, "\" %s]\n", attr);
+
+               if (action == Action::ACCEPT) {
+                       const accept_t &accept = *s->action.info.accepts;
+                       for (uint32_t i = 0; i < accept.size(); ++i) {
+                               fprintf(stderr, "  n%p -> n%p [label=\"",
+                                       (void*)s, (void*)accept[i].first);
+                               dump_adfa_tcmd(dfa.tcpool[accept[i].second]);
+                               fprintf(stderr, "\" style=dotted]\n");
+                       }
+               }
+
+               const Span *x = s->go.span, *e = x + s->go.nSpans;
+               for (uint32_t lb = 0; x < e; ++x) {
+                       if (!x->to) continue;
+
+                       bool eat = true;
+                       switch (x->to->action.type) {
+                               case Action::MOVE:
+                               case Action::RULE:
+                                       attr = "style=dotted";
+                                       eat = false;
+                                       break;
+                               default:
+                                       attr = "";
+                                       break;
+                       }
+                       fprintf(stderr, "  n%p -> n%p [label=\"", (void*)s, (void*)x->to);
+                       if (eat) dump_adfa_range(lb, x->ub);
+                       dump_adfa_tcmd(dfa.tcpool[x->tags]);
+                       fprintf(stderr, "\" %s]\n", attr);
+
+                       lb = x->ub;
+               }
+       }
+
+       fprintf(stderr, "}\n");
+}
+
+} // namespace re2c
diff --git a/re2c/src/ir/adfa/dump.h b/re2c/src/ir/adfa/dump.h
new file mode 100644 (file)
index 0000000..c48bda1
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef _RE2C_IR_ADFA_DUMP_
+#define _RE2C_IR_ADFA_DUMP_
+
+#include "src/ir/adfa/adfa.h"
+
+namespace re2c
+{
+
+void dump_adfa(const DFA &dfa);
+
+} // namespace re2c
+
+#endif // _RE2C_IR_ADFA_DUMP_
index 600fd4372fb09a069a33e6b4a27655a576f8afde..cb33e5ece2a37c57d977446d98c05a1371b16de0 100644 (file)
@@ -6,6 +6,7 @@
 #include "src/conf/opt.h"
 #include "src/ir/compile.h"
 #include "src/ir/adfa/adfa.h"
+#include "src/ir/adfa/dump.h"
 #include "src/ir/dfa/dfa.h"
 #include "src/ir/dfa/dump.h"
 #include "src/ir/nfa/nfa.h"
@@ -93,6 +94,7 @@ static smart_ptr<DFA> compile_rules(
 
        // skeleton is constructed, do further DFA transformations
        adfa->prepare();
+       if (opts->dump_adfa) dump_adfa(*adfa);
 
        // finally gather overall DFA statistics
        adfa->calc_stats(line);