]> granicus.if.org Git - re2c/commitdiff
Added option --input-encoding <ascii | utf8> that allows to use UTF-8 literals in...
authorUlya Trofimovich <skvadrik@gmail.com>
Fri, 24 May 2019 12:15:07 +0000 (13:15 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Fri, 24 May 2019 12:15:07 +0000 (13:15 +0100)
14 files changed:
Makefile.am
bootstrap/src/options/parse_opts.cc
bootstrap/src/parse/lex.cc
bootstrap/src/parse/lex.h
src/encoding/utf8/utf8.cc
src/encoding/utf8/utf8.h
src/msg/warn.cc
src/msg/warn.h
src/options/opt.h
src/options/parse_opts.re
src/parse/lex.re
src/parse/scanner.h
test/encodings/utf8_literals.i8--input-encoding(utf8).c [new file with mode: 0644]
test/encodings/utf8_literals.i8--input-encoding(utf8).re [new file with mode: 0644]

index e4049e461a0bd7b9e45783c216acf7adfafcb530..0214c1863bb8841ce563025314c72001ccdcd4b9 100644 (file)
@@ -4,7 +4,7 @@ AM_CXXFLAGS = $(CXXFLAGSDEFAULT)
 if DEBUG
 AM_CXXFLAGS += -DRE2C_DEBUG
 endif
-RE2CFLAGS = -b -W
+RE2CFLAGS = -br -W
 
 # binary
 bin_PROGRAMS = re2c
index 081e68a81539f55a7e3cbe280015f5863e811165..77971543bb2a5d21252d0f329a6a72d0cea3e81b 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 1.1.1 on Wed Feb 13 15:25:28 2019 */
+/* Generated by re2c 1.1.1 on Fri May 24 12:13:11 2019 */
 #line 1 "../src/options/parse_opts.re"
 #include "src/codegen/input_api.h"
 #include "src/options/opt.h"
@@ -1687,471 +1687,472 @@ yy393:
 yy395:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= 0x00) goto yy436;
+       if (yych == '-') goto yy438;
        goto yy284;
 yy396:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy438;
+       if (yych == 'i') goto yy439;
        goto yy284;
 yy397:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy439;
+       if (yych == 'd') goto yy440;
        goto yy284;
 yy398:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'b') goto yy440;
+       if (yych == 'b') goto yy441;
        goto yy284;
 yy399:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy441;
+       if (yych == 'n') goto yy442;
        goto yy284;
 yy400:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy442;
+       if (yych == 'o') goto yy443;
        goto yy284;
 yy401:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy443;
+       if (yych == 't') goto yy444;
        goto yy284;
 yy402:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy444;
+       if (yych == 'r') goto yy445;
        goto yy284;
 yy403:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy445;
+       if (yych == 't') goto yy446;
        goto yy284;
 yy404:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy446;
+       if (yych == '-') goto yy447;
        goto yy284;
 yy405:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'b') goto yy447;
+       if (yych == 'b') goto yy448;
        goto yy284;
 yy406:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy448;
+       if (yych == 'e') goto yy449;
        goto yy284;
 yy407:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy449;
+       if (yych == 't') goto yy450;
        goto yy284;
 yy408:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy450;
+       if (yych == '-') goto yy451;
        goto yy284;
 yy409:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'b') goto yy451;
+       if (yych == 'b') goto yy452;
        goto yy284;
 yy410:
        ++YYCURSOR;
 #line 159 "../src/options/parse_opts.re"
        { opts.set_tags (true);              goto opt; }
-#line 1752 "src/options/parse_opts.cc"
+#line 1753 "src/options/parse_opts.cc"
 yy412:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'h') goto yy452;
+       if (yych == 'h') goto yy453;
        goto yy284;
 yy413:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy453;
+       if (yych == 'd') goto yy454;
        goto yy284;
 yy414:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '6') goto yy454;
+       if (yych == '6') goto yy455;
        goto yy284;
 yy415:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy455;
+       if (yych <= 0x00) goto yy456;
        goto yy284;
 yy416:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy457;
+       if (yych == 's') goto yy458;
        goto yy284;
 yy417:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'm') goto yy458;
+       if (yych == 'm') goto yy459;
        goto yy284;
 yy418:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy459;
+       if (yych == 'o') goto yy460;
        goto yy284;
 yy419:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy460;
+       if (yych == 'c') goto yy461;
        goto yy284;
 yy420:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy461;
+       if (yych == 'c') goto yy462;
        goto yy284;
 yy421:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy462;
+       if (yych == 'n') goto yy463;
        goto yy284;
 yy422:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy463;
+       if (yych == 'e') goto yy464;
        goto yy284;
 yy423:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy464;
+       if (yych == 'i') goto yy465;
        goto yy284;
 yy424:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy465;
+       if (yych == 'o') goto yy466;
        goto yy284;
 yy425:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy466;
+       if (yych == 'n') goto yy467;
        goto yy284;
 yy426:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy467;
+       if (yych == 'd') goto yy468;
        goto yy284;
 yy427:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'f') goto yy468;
-       if (yych == 'l') goto yy469;
+       if (yych == 'f') goto yy469;
+       if (yych == 'l') goto yy470;
        goto yy284;
 yy428:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'f') goto yy470;
+       if (yych == 'f') goto yy471;
        goto yy284;
 yy429:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy471;
+       if (yych == 'n') goto yy472;
        goto yy284;
 yy430:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'f') goto yy472;
+       if (yych == 'f') goto yy473;
        goto yy284;
 yy431:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy473;
+       if (yych == 's') goto yy474;
        goto yy284;
 yy432:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy474;
+       if (yych == 'o') goto yy475;
        goto yy284;
 yy433:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy475;
+       if (yych == 'c') goto yy476;
        goto yy284;
 yy434:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy476;
+       if (yych == 'n') goto yy477;
        goto yy284;
 yy435:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'y') goto yy477;
+       if (yych == 'y') goto yy478;
        goto yy284;
 yy436:
        ++YYCURSOR;
 #line 175 "../src/options/parse_opts.re"
        { NEXT_ARG("--input",            opt_input); }
-#line 1854 "src/options/parse_opts.cc"
+#line 1855 "src/options/parse_opts.cc"
 yy438:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy478;
+       if (yych == 'e') goto yy479;
        goto yy284;
 yy439:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy479;
+       if (yych == 'o') goto yy480;
        goto yy284;
 yy440:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'u') goto yy480;
+       if (yych == '-') goto yy481;
        goto yy284;
 yy441:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy481;
+       if (yych == 'u') goto yy482;
        goto yy284;
 yy442:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'k') goto yy482;
+       if (yych == 'e') goto yy483;
        goto yy284;
 yy443:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy483;
+       if (yych == 'k') goto yy484;
        goto yy284;
 yy444:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy484;
+       if (yych == 'i') goto yy485;
        goto yy284;
 yy445:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy485;
+       if (yych == 's') goto yy486;
        goto yy284;
 yy446:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy487;
+       if (yych <= 0x00) goto yy487;
        goto yy284;
 yy447:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'l') goto yy488;
+       if (yych == 'c') goto yy489;
        goto yy284;
 yy448:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy489;
+       if (yych == 'l') goto yy490;
        goto yy284;
 yy449:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy490;
+       if (yych == '-') goto yy491;
        goto yy284;
 yy450:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy491;
+       if (yych == 'o') goto yy492;
        goto yy284;
 yy451:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'l') goto yy492;
+       if (yych == 'c') goto yy493;
        goto yy284;
 yy452:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy493;
+       if (yych == 'l') goto yy494;
        goto yy284;
 yy453:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy494;
+       if (yych == 'e') goto yy495;
        goto yy284;
 yy454:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy495;
+       if (yych == 'e') goto yy496;
        goto yy284;
 yy455:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy497;
+       goto yy284;
+yy456:
        ++YYCURSOR;
 #line 164 "../src/options/parse_opts.re"
        { opts.set_encoding(Enc::UTF8);      goto opt; }
-#line 1927 "src/options/parse_opts.cc"
-yy457:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy497;
-       goto yy284;
+#line 1932 "src/options/parse_opts.cc"
 yy458:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy498;
+       if (yych == 'e') goto yy499;
        goto yy284;
 yy459:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy500;
+       if (yych <= 0x00) goto yy500;
        goto yy284;
 yy460:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'h') goto yy501;
+       if (yych == 'n') goto yy502;
        goto yy284;
 yy461:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy502;
+       if (yych == 'h') goto yy503;
        goto yy284;
 yy462:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy503;
-       if (yych == 'v') goto yy504;
+       if (yych == 't') goto yy504;
        goto yy284;
 yy463:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy505;
+       if (yych == 's') goto yy505;
+       if (yych == 'v') goto yy506;
        goto yy284;
 yy464:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy506;
+       if (yych == 'd') goto yy507;
        goto yy284;
 yy465:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'u') goto yy507;
+       if (yych == 'o') goto yy508;
        goto yy284;
 yy466:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy508;
+       if (yych == 'u') goto yy509;
        goto yy284;
 yy467:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'f') goto yy509;
+       if (yych == 'i') goto yy510;
        goto yy284;
 yy468:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'g') goto yy510;
+       if (yych == 'f') goto yy511;
        goto yy284;
 yy469:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy511;
+       if (yych == 'g') goto yy512;
        goto yy284;
 yy470:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy512;
+       if (yych == 'o') goto yy513;
        goto yy284;
 yy471:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy513;
+       if (yych == 'a') goto yy514;
        goto yy284;
 yy472:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy514;
+       if (yych == 't') goto yy515;
        goto yy284;
 yy473:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'k') goto yy515;
+       if (yych == 'a') goto yy516;
        goto yy284;
 yy474:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy516;
+       if (yych == 'k') goto yy517;
        goto yy284;
 yy475:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'l') goto yy517;
+       if (yych == 't') goto yy518;
        goto yy284;
 yy476:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'g') goto yy518;
+       if (yych == 'l') goto yy519;
        goto yy284;
 yy477:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy519;
+       if (yych == 'g') goto yy520;
        goto yy284;
 yy478:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy520;
+       if (yych == 'n') goto yy521;
        goto yy284;
 yy479:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy521;
+       if (yych == 'n') goto yy522;
        goto yy284;
 yy480:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'g') goto yy522;
+       if (yych == 'n') goto yy523;
        goto yy284;
 yy481:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy523;
+       if (yych == 'i') goto yy524;
        goto yy284;
 yy482:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy524;
+       if (yych == 'g') goto yy525;
        goto yy284;
 yy483:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'm') goto yy525;
+       if (yych == 'r') goto yy526;
        goto yy284;
 yy484:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy526;
+       if (yych == 'a') goto yy527;
        goto yy284;
 yy485:
-       ++YYCURSOR;
-#line 172 "../src/options/parse_opts.re"
-       { NEXT_ARG("-o, --output",       opt_output); }
-#line 2045 "src/options/parse_opts.cc"
-yy487:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy527;
-       if (yych == 'l') goto yy528;
+       if (yych == 'm') goto yy528;
        goto yy284;
-yy488:
+yy486:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy529;
+       if (yych == 'i') goto yy529;
        goto yy284;
+yy487:
+       ++YYCURSOR;
+#line 172 "../src/options/parse_opts.re"
+       { NEXT_ARG("-o, --output",       opt_output); }
+#line 2054 "src/options/parse_opts.cc"
 yy489:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'p') goto yy530;
+       if (yych == 'a') goto yy530;
+       if (yych == 'l') goto yy531;
        goto yy284;
 yy490:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy531;
+       if (yych == 'e') goto yy532;
        goto yy284;
 yy491:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy532;
+       if (yych == 'p') goto yy533;
        goto yy284;
 yy492:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy533;
+       if (yych == 'n') goto yy534;
        goto yy284;
 yy493:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy534;
+       if (yych == 'o') goto yy535;
        goto yy284;
 yy494:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy535;
+       if (yych == 'e') goto yy536;
        goto yy284;
 yy495:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'a') goto yy537;
+       goto yy284;
+yy496:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy538;
+       goto yy284;
+yy497:
        ++YYCURSOR;
 #line 163 "../src/options/parse_opts.re"
        { opts.set_encoding(Enc::UTF16);     goto opt; }
-#line 2083 "src/options/parse_opts.cc"
-yy497:
+#line 2092 "src/options/parse_opts.cc"
+yy499:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy537;
+       if (yych <= 0x00) goto yy540;
        goto yy284;
-yy498:
+yy500:
        ++YYCURSOR;
 #line 140 "../src/options/parse_opts.re"
        { vernum ();  return EXIT_OK; }
-#line 2092 "src/options/parse_opts.cc"
-yy500:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy539;
-       goto yy284;
-yy501:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy541;
-       goto yy284;
+#line 2101 "src/options/parse_opts.cc"
 yy502:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy542;
+       if (yych <= 0x00) goto yy542;
        goto yy284;
 yy503:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy543;
+       if (yych == 'a') goto yy544;
        goto yy284;
 yy504:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy544;
+       if (yych == 'o') goto yy545;
        goto yy284;
 yy505:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy545;
+       if (yych == 'e') goto yy546;
        goto yy284;
 yy506:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy546;
+       if (yych == 'e') goto yy547;
        goto yy284;
 yy507:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy547;
+       if (yych == '-') goto yy548;
        goto yy284;
 yy508:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'm') goto yy548;
+       if (yych == 'n') goto yy549;
        goto yy284;
 yy509:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy549;
+       if (yych == 't') goto yy550;
        goto yy284;
 yy510:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy550;
+       if (yych == 'm') goto yy551;
        goto yy284;
 yy511:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy552;
+       if (yych == 'a') goto yy552;
        goto yy284;
 yy512:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy553;
+       if (yych <= 0x00) goto yy553;
        goto yy284;
 yy513:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy554;
+       if (yych == 's') goto yy555;
        goto yy284;
 yy514:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy555;
+       if (yych == '-') goto yy556;
        goto yy284;
 yy515:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy557;
+       if (yych == 'e') goto yy557;
        goto yy284;
 yy516:
        yych = (YYCTYPE)*++YYCURSOR;
@@ -2159,333 +2160,333 @@ yy516:
        goto yy284;
 yy517:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy560;
+       if (yych == 'i') goto yy560;
        goto yy284;
 yy518:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy561;
+       if (yych <= 0x00) goto yy561;
        goto yy284;
 yy519:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy562;
+       if (yych == 'a') goto yy563;
        goto yy284;
 yy520:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy563;
+       if (yych == '-') goto yy564;
        goto yy284;
 yy521:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'f') goto yy564;
+       if (yych == 't') goto yy565;
        goto yy284;
 yy522:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy565;
+       if (yych == 'c') goto yy566;
        goto yy284;
 yy523:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy566;
+       if (yych == '-') goto yy567;
        goto yy284;
 yy524:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'h') goto yy567;
+       if (yych == 'f') goto yy568;
        goto yy284;
 yy525:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy568;
+       if (yych == '-') goto yy569;
        goto yy284;
 yy526:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy569;
+       if (yych == 'a') goto yy570;
        goto yy284;
 yy527:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'p') goto yy570;
+       if (yych == 'h') goto yy571;
        goto yy284;
 yy528:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy571;
+       if (yych == 'i') goto yy572;
        goto yy284;
 yy529:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy572;
+       if (yych == 'o') goto yy573;
        goto yy284;
 yy530:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy574;
+       if (yych == 'p') goto yy574;
        goto yy284;
 yy531:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy575;
+       if (yych == 'o') goto yy575;
        goto yy284;
 yy532:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy315;
+       if (yych <= 0x00) goto yy576;
        goto yy284;
 yy533:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy577;
+       if (yych == 'a') goto yy578;
        goto yy284;
 yy534:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy578;
+       if (yych <= 0x00) goto yy579;
        goto yy284;
 yy535:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'n') goto yy315;
+       goto yy284;
+yy536:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == '-') goto yy581;
+       goto yy284;
+yy537:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'd') goto yy582;
+       goto yy284;
+yy538:
        ++YYCURSOR;
 #line 161 "../src/options/parse_opts.re"
        { opts.set_encoding(Enc::UTF32);     goto opt; }
-#line 2237 "src/options/parse_opts.cc"
-yy537:
+#line 2250 "src/options/parse_opts.cc"
+yy540:
        ++YYCURSOR;
 #line 147 "../src/options/parse_opts.re"
        { globopts.verbose = true;           goto opt; }
-#line 2242 "src/options/parse_opts.cc"
-yy539:
+#line 2255 "src/options/parse_opts.cc"
+yy542:
        ++YYCURSOR;
 #line 139 "../src/options/parse_opts.re"
        { version (); return EXIT_OK; }
-#line 2247 "src/options/parse_opts.cc"
-yy541:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy579;
-       goto yy284;
-yy542:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy580;
-       goto yy284;
-yy543:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy581;
-       goto yy284;
+#line 2260 "src/options/parse_opts.cc"
 yy544:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy582;
+       if (yych == 'r') goto yy583;
        goto yy284;
 yy545:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'g') goto yy583;
+       if (yych == 'r') goto yy584;
        goto yy284;
 yy546:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy584;
+       if (yych == 'n') goto yy585;
        goto yy284;
 yy547:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'p') goto yy585;
+       if (yych == 'r') goto yy586;
        goto yy284;
 yy548:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy586;
+       if (yych == 'g') goto yy587;
        goto yy284;
 yy549:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy587;
+       if (yych == 's') goto yy588;
        goto yy284;
 yy550:
-       ++YYCURSOR;
-#line 195 "../src/options/parse_opts.re"
-       { globopts.dump_cfg = true;           goto opt; }
-#line 2288 "src/options/parse_opts.cc"
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'p') goto yy589;
+       goto yy284;
+yy551:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'i') goto yy590;
+       goto yy284;
 yy552:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'u') goto yy589;
+       if (yych <= 0x00) goto yy591;
        goto yy284;
 yy553:
+       ++YYCURSOR;
+#line 196 "../src/options/parse_opts.re"
+       { globopts.dump_cfg = true;           goto opt; }
+#line 2301 "src/options/parse_opts.cc"
+yy555:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'u') goto yy593;
+       goto yy284;
+yy556:
        yych = (YYCTYPE)*++YYCURSOR;
        switch (yych) {
-       case 'd':       goto yy590;
-       case 'm':       goto yy591;
-       case 'r':       goto yy592;
-       case 't':       goto yy593;
+       case 'd':       goto yy594;
+       case 'm':       goto yy595;
+       case 'r':       goto yy596;
+       case 't':       goto yy597;
        default:        goto yy284;
        }
-yy554:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy594;
-       goto yy284;
-yy555:
-       ++YYCURSOR;
-#line 189 "../src/options/parse_opts.re"
-       { globopts.dump_nfa = true;           goto opt; }
-#line 2310 "src/options/parse_opts.cc"
 yy557:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'p') goto yy595;
+       if (yych == 'r') goto yy598;
        goto yy284;
 yy558:
        ++YYCURSOR;
-#line 143 "../src/options/parse_opts.re"
-       { globopts.target = TARGET_DOT;      goto opt; }
-#line 2319 "src/options/parse_opts.cc"
+#line 190 "../src/options/parse_opts.re"
+       { globopts.dump_nfa = true;           goto opt; }
+#line 2323 "src/options/parse_opts.cc"
 yy560:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy596;
+       if (yych == 'p') goto yy599;
        goto yy284;
 yy561:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'p') goto yy597;
-       goto yy284;
-yy562:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy598;
-       goto yy284;
+       ++YYCURSOR;
+#line 143 "../src/options/parse_opts.re"
+       { globopts.target = TARGET_DOT;      goto opt; }
+#line 2332 "src/options/parse_opts.cc"
 yy563:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'f') goto yy599;
+       if (yych == 's') goto yy600;
        goto yy284;
 yy564:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy600;
+       if (yych == 'p') goto yy601;
        goto yy284;
 yy565:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy601;
+       if (yych == 'a') goto yy602;
        goto yy284;
 yy566:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy602;
+       if (yych == 'o') goto yy603;
        goto yy284;
 yy567:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy603;
+       if (yych == 'f') goto yy604;
        goto yy284;
 yy568:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'z') goto yy604;
+       if (yych == 's') goto yy605;
        goto yy284;
 yy569:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy605;
+       if (yych == 'i') goto yy606;
        goto yy284;
 yy570:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy606;
+       if (yych == 't') goto yy607;
        goto yy284;
 yy571:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy607;
+       if (yych == 'e') goto yy608;
        goto yy284;
 yy572:
-       ++YYCURSOR;
-#line 146 "../src/options/parse_opts.re"
-       { globopts.rFlag = true;             goto opt; }
-#line 2372 "src/options/parse_opts.cc"
-yy574:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy608;
+       if (yych == 'z') goto yy609;
        goto yy284;
-yy575:
-       ++YYCURSOR;
-#line 150 "../src/options/parse_opts.re"
-       { globopts.target = TARGET_SKELETON; goto opt; }
-#line 2381 "src/options/parse_opts.cc"
-yy577:
+yy573:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy609;
+       if (yych == 'n') goto yy610;
        goto yy284;
-yy578:
+yy574:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy610;
+       if (yych == 't') goto yy611;
        goto yy284;
-yy579:
+yy575:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy611;
+       if (yych == 's') goto yy612;
        goto yy284;
-yy580:
+yy576:
+       ++YYCURSOR;
+#line 146 "../src/options/parse_opts.re"
+       { globopts.rFlag = true;             goto opt; }
+#line 2389 "src/options/parse_opts.cc"
+yy578:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy612;
+       if (yych == 's') goto yy613;
        goto yy284;
+yy579:
+       ++YYCURSOR;
+#line 150 "../src/options/parse_opts.re"
+       { globopts.target = TARGET_SKELETON; goto opt; }
+#line 2398 "src/options/parse_opts.cc"
 yy581:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy613;
+       if (yych == 's') goto yy614;
        goto yy284;
 yy582:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy614;
+       if (yych == 'e') goto yy615;
        goto yy284;
 yy583:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy615;
+       if (yych == 's') goto yy616;
        goto yy284;
 yy584:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy616;
+       if (yych == 's') goto yy617;
        goto yy284;
 yy585:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'u') goto yy618;
+       if (yych == 's') goto yy618;
        goto yy284;
 yy586:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'z') goto yy619;
+       if (yych == 't') goto yy619;
        goto yy284;
 yy587:
-       ++YYCURSOR;
-#line 194 "../src/options/parse_opts.re"
-       { globopts.dump_adfa = true;          goto opt; }
-#line 2426 "src/options/parse_opts.cc"
-yy589:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy620;
+       if (yych == 'o') goto yy620;
        goto yy284;
-yy590:
+yy588:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy621;
+       if (yych <= 0x00) goto yy621;
        goto yy284;
-yy591:
+yy589:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy622;
+       if (yych == 'u') goto yy623;
        goto yy284;
-yy592:
+yy590:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy623;
+       if (yych == 'z') goto yy624;
        goto yy284;
+yy591:
+       ++YYCURSOR;
+#line 195 "../src/options/parse_opts.re"
+       { globopts.dump_adfa = true;          goto opt; }
+#line 2443 "src/options/parse_opts.cc"
 yy593:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy624;
+       if (yych == 'r') goto yy625;
        goto yy284;
 yy594:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'f') goto yy625;
+       if (yych == 'e') goto yy626;
        goto yy284;
 yy595:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy626;
+       if (yych == 'i') goto yy627;
        goto yy284;
 yy596:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy628;
+       if (yych == 'a') goto yy628;
        goto yy284;
 yy597:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy629;
+       if (yych == 'a') goto yy629;
        goto yy284;
 yy598:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'x') goto yy630;
+       if (yych == 'f') goto yy630;
        goto yy284;
 yy599:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy631;
+       if (yych <= 0x00) goto yy631;
        goto yy284;
 yy600:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy632;
+       if (yych == 's') goto yy633;
        goto yy284;
 yy601:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy634;
+       if (yych == 'o') goto yy634;
        goto yy284;
 yy602:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy635;
+       if (yych == 'x') goto yy635;
        goto yy284;
 yy603:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy636;
+       if (yych == 'd') goto yy636;
        goto yy284;
 yy604:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy637;
+       if (yych == 'o') goto yy637;
        goto yy284;
 yy605:
        yych = (YYCTYPE)*++YYCURSOR;
@@ -2493,437 +2494,478 @@ yy605:
        goto yy284;
 yy606:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'u') goto yy640;
+       if (yych == 'n') goto yy640;
        goto yy284;
 yy607:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'u') goto yy641;
+       if (yych == 'i') goto yy641;
        goto yy284;
 yy608:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy642;
+       if (yych == 'a') goto yy642;
        goto yy284;
 yy609:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy643;
+       if (yych == 'e') goto yy643;
        goto yy284;
 yy610:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy644;
+       if (yych <= 0x00) goto yy644;
        goto yy284;
 yy611:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy645;
+       if (yych == 'u') goto yy646;
        goto yy284;
 yy612:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy647;
+       if (yych == 'u') goto yy647;
        goto yy284;
 yy613:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy649;
+       if (yych == 's') goto yy648;
        goto yy284;
 yy614:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy650;
+       if (yych == 't') goto yy649;
        goto yy284;
 yy615:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy651;
+       if (yych == 'r') goto yy650;
        goto yy284;
 yy616:
-       ++YYCURSOR;
-#line 142 "../src/options/parse_opts.re"
-       { globopts.cFlag = true;             goto opt; }
-#line 2539 "src/options/parse_opts.cc"
-yy618:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy652;
+       if (yych <= 0x00) goto yy651;
        goto yy284;
-yy619:
+yy617:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy653;
+       if (yych <= 0x00) goto yy653;
        goto yy284;
-yy620:
+yy618:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy654;
+       if (yych == 'i') goto yy655;
        goto yy284;
-yy621:
+yy619:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy655;
+       if (yych == 'e') goto yy656;
        goto yy284;
-yy622:
+yy620:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy656;
+       if (yych == 't') goto yy657;
        goto yy284;
+yy621:
+       ++YYCURSOR;
+#line 142 "../src/options/parse_opts.re"
+       { globopts.cFlag = true;             goto opt; }
+#line 2560 "src/options/parse_opts.cc"
 yy623:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'w') goto yy657;
+       if (yych == 't') goto yy658;
        goto yy284;
 yy624:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'g') goto yy658;
+       if (yych == 'a') goto yy659;
        goto yy284;
 yy625:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy659;
+       if (yych == 'e') goto yy660;
        goto yy284;
 yy626:
-       ++YYCURSOR;
-#line 186 "../src/options/parse_opts.re"
-       { globopts.eager_skip = true;     goto opt; }
-#line 2576 "src/options/parse_opts.cc"
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 't') goto yy661;
+       goto yy284;
+yy627:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'n') goto yy662;
+       goto yy284;
 yy628:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy661;
+       if (yych == 'w') goto yy663;
        goto yy284;
 yy629:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'l') goto yy663;
+       if (yych == 'g') goto yy664;
        goto yy284;
 yy630:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy664;
+       if (yych <= 0x00) goto yy665;
        goto yy284;
 yy631:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy666;
-       goto yy284;
-yy632:
        ++YYCURSOR;
-#line 156 "../src/options/parse_opts.re"
-       { opts.set_sFlag (true);             goto opt; }
+#line 187 "../src/options/parse_opts.re"
+       { globopts.eager_skip = true;     goto opt; }
 #line 2597 "src/options/parse_opts.cc"
+yy633:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy667;
+       goto yy284;
 yy634:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'f') goto yy667;
+       if (yych == 'l') goto yy669;
        goto yy284;
 yy635:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy668;
+       if (yych <= 0x00) goto yy670;
        goto yy284;
 yy636:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy669;
+       if (yych == 'i') goto yy672;
        goto yy284;
 yy637:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy670;
+       if (yych == 'r') goto yy673;
        goto yy284;
 yy638:
        ++YYCURSOR;
-#line 149 "../src/options/parse_opts.re"
-       { globopts.version = false;          goto opt; }
-#line 2618 "src/options/parse_opts.cc"
+#line 156 "../src/options/parse_opts.re"
+       { opts.set_sFlag (true);             goto opt; }
+#line 2622 "src/options/parse_opts.cc"
 yy640:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy671;
+       if (yych == 'f') goto yy674;
        goto yy284;
 yy641:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy672;
+       if (yych == 'o') goto yy675;
        goto yy284;
 yy642:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy673;
+       if (yych == 'd') goto yy676;
        goto yy284;
 yy643:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy675;
+       if (yych == '-') goto yy677;
        goto yy284;
 yy644:
+       ++YYCURSOR;
+#line 149 "../src/options/parse_opts.re"
+       { globopts.version = false;          goto opt; }
+#line 2643 "src/options/parse_opts.cc"
+yy646:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'r') goto yy678;
+       goto yy284;
+yy647:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'r') goto yy679;
+       goto yy284;
+yy648:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy680;
+       goto yy284;
+yy649:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'a') goto yy682;
+       goto yy284;
+yy650:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy676;
+       if (yych <= 0x00) goto yy683;
        goto yy284;
-yy645:
+yy651:
        ++YYCURSOR;
 #line 162 "../src/options/parse_opts.re"
        { opts.set_encoding(Enc::UCS2);      goto opt; }
-#line 2643 "src/options/parse_opts.cc"
-yy647:
+#line 2668 "src/options/parse_opts.cc"
+yy653:
        ++YYCURSOR;
 #line 152 "../src/options/parse_opts.re"
        { opts.set_bFlag (true);             goto opt; }
-#line 2648 "src/options/parse_opts.cc"
-yy649:
+#line 2673 "src/options/parse_opts.cc"
+yy655:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy678;
+       if (yych == 't') goto yy685;
        goto yy284;
-yy650:
+yy656:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy679;
+       if (yych == 'd') goto yy686;
        goto yy284;
-yy651:
+yy657:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy680;
+       if (yych == 'o') goto yy687;
        goto yy284;
-yy652:
+yy658:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy681;
+       if (yych <= 0x00) goto yy688;
        goto yy284;
-yy653:
+yy659:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy683;
+       if (yych == 't') goto yy690;
        goto yy284;
-yy654:
+yy660:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy684;
+       if (yych == '-') goto yy691;
        goto yy284;
-yy655:
+yy661:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy685;
+       if (yych <= 0x00) goto yy692;
        goto yy284;
-yy656:
+yy662:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy687;
+       if (yych <= 0x00) goto yy694;
        goto yy284;
-yy657:
+yy663:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy689;
+       if (yych <= 0x00) goto yy696;
        goto yy284;
-yy658:
+yy664:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy691;
+       if (yych == 'o') goto yy698;
        goto yy284;
-yy659:
+yy665:
        ++YYCURSOR;
-#line 196 "../src/options/parse_opts.re"
+#line 197 "../src/options/parse_opts.re"
        { globopts.dump_interf = true;        goto opt; }
-#line 2693 "src/options/parse_opts.cc"
-yy661:
+#line 2718 "src/options/parse_opts.cc"
+yy667:
        ++YYCURSOR;
 #line 176 "../src/options/parse_opts.re"
        { NEXT_ARG("--empty-class",      opt_empty_class); }
-#line 2698 "src/options/parse_opts.cc"
-yy663:
+#line 2723 "src/options/parse_opts.cc"
+yy669:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy692;
+       if (yych == 'i') goto yy699;
        goto yy284;
-yy664:
+yy670:
        ++YYCURSOR;
 #line 145 "../src/options/parse_opts.re"
        { globopts.FFlag = true;             goto opt; }
-#line 2707 "src/options/parse_opts.cc"
-yy666:
+#line 2732 "src/options/parse_opts.cc"
+yy672:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'm') goto yy693;
+       if (yych == 'n') goto yy700;
        goto yy284;
-yy667:
+yy673:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy694;
+       if (yych == 'm') goto yy701;
        goto yy284;
-yy668:
+yy674:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy695;
+       if (yych == 'o') goto yy702;
        goto yy284;
-yy669:
+yy675:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy696;
+       if (yych == 'n') goto yy703;
        goto yy284;
-yy670:
+yy676:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy698;
+       if (yych <= 0x00) goto yy704;
        goto yy284;
-yy671:
+yy677:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy699;
+       if (yych == 't') goto yy706;
        goto yy284;
-yy672:
+yy678:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy700;
+       if (yych == 'e') goto yy707;
        goto yy284;
-yy673:
+yy679:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'e') goto yy708;
+       goto yy284;
+yy680:
        ++YYCURSOR;
-#line 179 "../src/options/parse_opts.re"
+#line 180 "../src/options/parse_opts.re"
        { goto opt; }
-#line 2740 "src/options/parse_opts.cc"
-yy675:
+#line 2769 "src/options/parse_opts.cc"
+yy682:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy701;
+       if (yych == 't') goto yy709;
        goto yy284;
-yy676:
+yy683:
        ++YYCURSOR;
 #line 173 "../src/options/parse_opts.re"
        { NEXT_ARG("-t, --type-header",  opt_header); }
-#line 2749 "src/options/parse_opts.cc"
-yy678:
+#line 2778 "src/options/parse_opts.cc"
+yy685:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy702;
+       if (yych == 'i') goto yy710;
        goto yy284;
-yy679:
+yy686:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy703;
+       if (yych <= 0x00) goto yy711;
        goto yy284;
-yy680:
+yy687:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy705;
+       if (yych == 's') goto yy713;
        goto yy284;
-yy681:
+yy688:
        ++YYCURSOR;
 #line 153 "../src/options/parse_opts.re"
        { opts.set_dFlag (true);             goto opt; }
-#line 2766 "src/options/parse_opts.cc"
-yy683:
+#line 2795 "src/options/parse_opts.cc"
+yy690:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy706;
+       if (yych == 'i') goto yy714;
        goto yy284;
-yy684:
+yy691:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy707;
+       if (yych == 's') goto yy715;
        goto yy284;
-yy685:
+yy692:
        ++YYCURSOR;
-#line 191 "../src/options/parse_opts.re"
+#line 192 "../src/options/parse_opts.re"
        { globopts.dump_dfa_det = true;       goto opt; }
-#line 2779 "src/options/parse_opts.cc"
-yy687:
+#line 2808 "src/options/parse_opts.cc"
+yy694:
        ++YYCURSOR;
-#line 193 "../src/options/parse_opts.re"
+#line 194 "../src/options/parse_opts.re"
        { globopts.dump_dfa_min = true;       goto opt; }
-#line 2784 "src/options/parse_opts.cc"
-yy689:
-       ++YYCURSOR;
-#line 190 "../src/options/parse_opts.re"
-       { globopts.dump_dfa_raw = true;       goto opt; }
-#line 2789 "src/options/parse_opts.cc"
-yy691:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'p') goto yy708;
-       goto yy284;
-yy692:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy709;
-       goto yy284;
-yy693:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy710;
-       goto yy284;
-yy694:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy711;
-       goto yy284;
-yy695:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy713;
-       goto yy284;
+#line 2813 "src/options/parse_opts.cc"
 yy696:
        ++YYCURSOR;
-#line 184 "../src/options/parse_opts.re"
-       { globopts.lookahead = false;     goto opt; }
-#line 2814 "src/options/parse_opts.cc"
+#line 191 "../src/options/parse_opts.re"
+       { globopts.dump_dfa_raw = true;       goto opt; }
+#line 2818 "src/options/parse_opts.cc"
 yy698:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy714;
+       if (yych == 'p') goto yy716;
        goto yy284;
 yy699:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy715;
+       if (yych == 'c') goto yy717;
        goto yy284;
 yy700:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy716;
+       if (yych == 'g') goto yy718;
        goto yy284;
 yy701:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy718;
+       if (yych == 'a') goto yy719;
        goto yy284;
 yy702:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'v') goto yy719;
+       if (yych <= 0x00) goto yy720;
        goto yy284;
 yy703:
-       ++YYCURSOR;
-#line 158 "../src/options/parse_opts.re"
-       { opts.set_bCaseInverted (true);     goto opt; }
-#line 2839 "src/options/parse_opts.cc"
-yy705:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy720;
+       if (yych == '-') goto yy722;
        goto yy284;
+yy704:
+       ++YYCURSOR;
+#line 185 "../src/options/parse_opts.re"
+       { globopts.lookahead = false;     goto opt; }
+#line 2847 "src/options/parse_opts.cc"
 yy706:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy722;
+       if (yych == 'a') goto yy723;
        goto yy284;
 yy707:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy723;
+       if (yych == 's') goto yy724;
        goto yy284;
 yy708:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy724;
+       if (yych <= 0x00) goto yy725;
        goto yy284;
 yy709:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'y') goto yy725;
+       if (yych == 'e') goto yy727;
        goto yy284;
 yy710:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy726;
+       if (yych == 'v') goto yy728;
        goto yy284;
 yy711:
        ++YYCURSOR;
-#line 155 "../src/options/parse_opts.re"
-       { opts.set_iFlag (true);             goto opt; }
-#line 2868 "src/options/parse_opts.cc"
+#line 158 "../src/options/parse_opts.re"
+       { opts.set_bCaseInverted (true);     goto opt; }
+#line 2872 "src/options/parse_opts.cc"
 yy713:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'd') goto yy727;
+       if (yych <= 0x00) goto yy729;
        goto yy284;
 yy714:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'g') goto yy728;
+       if (yych == 'o') goto yy731;
        goto yy284;
 yy715:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy729;
+       if (yych == 't') goto yy732;
        goto yy284;
 yy716:
-       ++YYCURSOR;
-#line 183 "../src/options/parse_opts.re"
-       { NEXT_ARG("--posix-closure",    opt_posix_closure); }
-#line 2885 "src/options/parse_opts.cc"
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 't') goto yy733;
+       goto yy284;
+yy717:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'y') goto yy734;
+       goto yy284;
 yy718:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy731;
+       if (yych <= 0x00) goto yy735;
        goto yy284;
 yy719:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy733;
+       if (yych == 't') goto yy737;
        goto yy284;
 yy720:
        ++YYCURSOR;
-#line 154 "../src/options/parse_opts.re"
-       { opts.set_gFlag (true);             goto opt; }
-#line 2898 "src/options/parse_opts.cc"
+#line 155 "../src/options/parse_opts.re"
+       { opts.set_iFlag (true);             goto opt; }
+#line 2905 "src/options/parse_opts.cc"
 yy722:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy734;
+       if (yych == 'd') goto yy738;
        goto yy284;
 yy723:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy735;
+       if (yych == 'g') goto yy739;
        goto yy284;
 yy724:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy736;
+       if (yych <= 0x00) goto yy740;
        goto yy284;
 yy725:
+       ++YYCURSOR;
+#line 184 "../src/options/parse_opts.re"
+       { NEXT_ARG("--posix-closure",    opt_posix_closure); }
+#line 2922 "src/options/parse_opts.cc"
+yy727:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy738;
+       if (yych <= 0x00) goto yy742;
        goto yy284;
-yy726:
+yy728:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy740;
+       if (yych == 'e') goto yy744;
        goto yy284;
-yy727:
+yy729:
+       ++YYCURSOR;
+#line 154 "../src/options/parse_opts.re"
+       { opts.set_gFlag (true);             goto opt; }
+#line 2935 "src/options/parse_opts.cc"
+yy731:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy742;
+       if (yych == 'n') goto yy745;
        goto yy284;
-yy728:
+yy732:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy743;
+       if (yych == 'a') goto yy746;
        goto yy284;
-yy729:
+yy733:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy747;
+       goto yy284;
+yy734:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy749;
+       goto yy284;
+yy735:
+       ++YYCURSOR;
+#line 178 "../src/options/parse_opts.re"
+       { NEXT_ARG("--input-encoding",   opt_input_encoding); }
+#line 2956 "src/options/parse_opts.cc"
+yy737:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy751;
+       goto yy284;
+yy738:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'a') goto yy753;
+       goto yy284;
+yy739:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 's') goto yy754;
+       goto yy284;
+yy740:
        ++YYCURSOR;
 #line 166 "../src/options/parse_opts.re"
        {
@@ -2931,95 +2973,95 @@ yy729:
         opts.set_posix_semantics(true);
         goto opt;
     }
-#line 2935 "src/options/parse_opts.cc"
-yy731:
+#line 2977 "src/options/parse_opts.cc"
+yy742:
        ++YYCURSOR;
 #line 144 "../src/options/parse_opts.re"
        { globopts.fFlag = true;             goto opt; }
-#line 2940 "src/options/parse_opts.cc"
-yy733:
+#line 2982 "src/options/parse_opts.cc"
+yy744:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy744;
+       if (yych <= 0x00) goto yy755;
        goto yy284;
-yy734:
+yy745:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy746;
+       if (yych <= 0x00) goto yy757;
        goto yy284;
-yy735:
+yy746:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy748;
+       if (yych == 't') goto yy759;
        goto yy284;
-yy736:
+yy747:
        ++YYCURSOR;
-#line 192 "../src/options/parse_opts.re"
+#line 193 "../src/options/parse_opts.re"
        { globopts.dump_dfa_tagopt = true;    goto opt; }
-#line 2957 "src/options/parse_opts.cc"
-yy738:
+#line 2999 "src/options/parse_opts.cc"
+yy749:
        ++YYCURSOR;
 #line 174 "../src/options/parse_opts.re"
        { NEXT_ARG("--encoding-policy",  opt_encoding_policy); }
-#line 2962 "src/options/parse_opts.cc"
-yy740:
+#line 3004 "src/options/parse_opts.cc"
+yy751:
        ++YYCURSOR;
 #line 177 "../src/options/parse_opts.re"
        { NEXT_ARG("--location-format",  opt_location_format); }
-#line 2967 "src/options/parse_opts.cc"
-yy742:
+#line 3009 "src/options/parse_opts.cc"
+yy753:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy749;
+       if (yych == 't') goto yy760;
        goto yy284;
-yy743:
+yy754:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy750;
+       if (yych <= 0x00) goto yy761;
        goto yy284;
-yy744:
+yy755:
        ++YYCURSOR;
 #line 157 "../src/options/parse_opts.re"
        { opts.set_bCaseInsensitive (true);  goto opt; }
-#line 2980 "src/options/parse_opts.cc"
-yy746:
+#line 3022 "src/options/parse_opts.cc"
+yy757:
        ++YYCURSOR;
-#line 182 "../src/options/parse_opts.re"
+#line 183 "../src/options/parse_opts.re"
        { NEXT_ARG("--dfa-minimization", opt_dfa_minimization); }
-#line 2985 "src/options/parse_opts.cc"
-yy748:
+#line 3027 "src/options/parse_opts.cc"
+yy759:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy752;
+       if (yych == 's') goto yy763;
        goto yy284;
-yy749:
+yy760:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy753;
+       if (yych == 'e') goto yy764;
        goto yy284;
-yy750:
+yy761:
        ++YYCURSOR;
-#line 185 "../src/options/parse_opts.re"
+#line 186 "../src/options/parse_opts.re"
        { globopts.optimize_tags = false; goto opt; }
-#line 2998 "src/options/parse_opts.cc"
-yy752:
+#line 3040 "src/options/parse_opts.cc"
+yy763:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy754;
+       if (yych <= 0x00) goto yy765;
        goto yy284;
-yy753:
+yy764:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy756;
+       if (yych <= 0x00) goto yy767;
        goto yy284;
-yy754:
+yy765:
        ++YYCURSOR;
-#line 197 "../src/options/parse_opts.re"
+#line 198 "../src/options/parse_opts.re"
        { globopts.dump_closure_stats = true; goto opt; }
-#line 3011 "src/options/parse_opts.cc"
-yy756:
+#line 3053 "src/options/parse_opts.cc"
+yy767:
        ++YYCURSOR;
 #line 148 "../src/options/parse_opts.re"
        { globopts.bNoGenerationDate = true; goto opt; }
-#line 3016 "src/options/parse_opts.cc"
+#line 3058 "src/options/parse_opts.cc"
 }
-#line 198 "../src/options/parse_opts.re"
+#line 199 "../src/options/parse_opts.re"
 
 
 opt_output:
 
-#line 3023 "src/options/parse_opts.cc"
+#line 3065 "src/options/parse_opts.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -3057,29 +3099,29 @@ opt_output:
                128, 128, 128, 128, 128, 128, 128, 128, 
        };
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= 0x00) goto yy760;
-       if (yych != '-') goto yy762;
-yy760:
+       if (yych <= 0x00) goto yy771;
+       if (yych != '-') goto yy773;
+yy771:
        ++YYCURSOR;
-#line 202 "../src/options/parse_opts.re"
+#line 203 "../src/options/parse_opts.re"
        { ERRARG("-o, --output", "filename", *argv); }
-#line 3067 "src/options/parse_opts.cc"
-yy762:
+#line 3109 "src/options/parse_opts.cc"
+yy773:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy762;
+               goto yy773;
        }
        ++YYCURSOR;
-#line 203 "../src/options/parse_opts.re"
+#line 204 "../src/options/parse_opts.re"
        { opts.set_output_file (*argv); goto opt; }
-#line 3076 "src/options/parse_opts.cc"
+#line 3118 "src/options/parse_opts.cc"
 }
-#line 204 "../src/options/parse_opts.re"
+#line 205 "../src/options/parse_opts.re"
 
 
 opt_header:
 
-#line 3083 "src/options/parse_opts.cc"
+#line 3125 "src/options/parse_opts.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -3117,29 +3159,29 @@ opt_header:
                128, 128, 128, 128, 128, 128, 128, 128, 
        };
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= 0x00) goto yy768;
-       if (yych != '-') goto yy770;
-yy768:
+       if (yych <= 0x00) goto yy779;
+       if (yych != '-') goto yy781;
+yy779:
        ++YYCURSOR;
-#line 208 "../src/options/parse_opts.re"
+#line 209 "../src/options/parse_opts.re"
        { ERRARG("-t, --type-header", "filename", *argv); }
-#line 3127 "src/options/parse_opts.cc"
-yy770:
+#line 3169 "src/options/parse_opts.cc"
+yy781:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy770;
+               goto yy781;
        }
        ++YYCURSOR;
-#line 209 "../src/options/parse_opts.re"
+#line 210 "../src/options/parse_opts.re"
        { opts.set_header_file (*argv); goto opt; }
-#line 3136 "src/options/parse_opts.cc"
+#line 3178 "src/options/parse_opts.cc"
 }
-#line 210 "../src/options/parse_opts.re"
+#line 211 "../src/options/parse_opts.re"
 
 
 opt_incpath:
 
-#line 3143 "src/options/parse_opts.cc"
+#line 3185 "src/options/parse_opts.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -3177,511 +3219,576 @@ opt_incpath:
                128, 128, 128, 128, 128, 128, 128, 128, 
        };
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= 0x00) goto yy776;
-       if (yych != '-') goto yy778;
-yy776:
+       if (yych <= 0x00) goto yy787;
+       if (yych != '-') goto yy789;
+yy787:
        ++YYCURSOR;
-#line 214 "../src/options/parse_opts.re"
+#line 215 "../src/options/parse_opts.re"
        { ERRARG("-I", "filename", *argv); }
-#line 3187 "src/options/parse_opts.cc"
-yy778:
+#line 3229 "src/options/parse_opts.cc"
+yy789:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yybm[0+yych] & 128) {
-               goto yy778;
+               goto yy789;
        }
        ++YYCURSOR;
-#line 215 "../src/options/parse_opts.re"
+#line 216 "../src/options/parse_opts.re"
        { globopts.incpaths.push_back(*argv); goto opt; }
-#line 3196 "src/options/parse_opts.cc"
+#line 3238 "src/options/parse_opts.cc"
 }
-#line 216 "../src/options/parse_opts.re"
+#line 217 "../src/options/parse_opts.re"
 
 
 opt_encoding_policy:
 
-#line 3203 "src/options/parse_opts.cc"
+#line 3245 "src/options/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= 'h') {
-               if (yych == 'f') goto yy786;
+               if (yych == 'f') goto yy797;
        } else {
-               if (yych <= 'i') goto yy787;
-               if (yych == 's') goto yy788;
+               if (yych <= 'i') goto yy798;
+               if (yych == 's') goto yy799;
        }
        ++YYCURSOR;
-yy785:
-#line 220 "../src/options/parse_opts.re"
+yy796:
+#line 221 "../src/options/parse_opts.re"
        { ERRARG("--encoding-policy", "ignore | substitute | fail", *argv); }
-#line 3217 "src/options/parse_opts.cc"
-yy786:
+#line 3259 "src/options/parse_opts.cc"
+yy797:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'a') goto yy789;
-       goto yy785;
-yy787:
+       if (yych == 'a') goto yy800;
+       goto yy796;
+yy798:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'g') goto yy791;
-       goto yy785;
-yy788:
+       if (yych == 'g') goto yy802;
+       goto yy796;
+yy799:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'u') goto yy792;
-       goto yy785;
-yy789:
+       if (yych == 'u') goto yy803;
+       goto yy796;
+yy800:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy793;
-yy790:
+       if (yych == 'i') goto yy804;
+yy801:
        YYCURSOR = YYMARKER;
-       goto yy785;
-yy791:
+       goto yy796;
+yy802:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy794;
-       goto yy790;
-yy792:
+       if (yych == 'n') goto yy805;
+       goto yy801;
+yy803:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'b') goto yy795;
-       goto yy790;
-yy793:
+       if (yych == 'b') goto yy806;
+       goto yy801;
+yy804:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'l') goto yy796;
-       goto yy790;
-yy794:
+       if (yych == 'l') goto yy807;
+       goto yy801;
+yy805:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy797;
-       goto yy790;
-yy795:
+       if (yych == 'o') goto yy808;
+       goto yy801;
+yy806:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy798;
-       goto yy790;
-yy796:
+       if (yych == 's') goto yy809;
+       goto yy801;
+yy807:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy799;
-       goto yy790;
-yy797:
+       if (yych <= 0x00) goto yy810;
+       goto yy801;
+yy808:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy801;
-       goto yy790;
-yy798:
+       if (yych == 'r') goto yy812;
+       goto yy801;
+yy809:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy802;
-       goto yy790;
-yy799:
+       if (yych == 't') goto yy813;
+       goto yy801;
+yy810:
        ++YYCURSOR;
-#line 223 "../src/options/parse_opts.re"
+#line 224 "../src/options/parse_opts.re"
        { opts.set_encoding_policy (Enc::POLICY_FAIL);       goto opt; }
-#line 3272 "src/options/parse_opts.cc"
-yy801:
+#line 3314 "src/options/parse_opts.cc"
+yy812:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy803;
-       goto yy790;
-yy802:
+       if (yych == 'e') goto yy814;
+       goto yy801;
+yy813:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'i') goto yy804;
-       goto yy790;
-yy803:
+       if (yych == 'i') goto yy815;
+       goto yy801;
+yy814:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy805;
-       goto yy790;
-yy804:
+       if (yych <= 0x00) goto yy816;
+       goto yy801;
+yy815:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy807;
-       goto yy790;
-yy805:
+       if (yych == 't') goto yy818;
+       goto yy801;
+yy816:
        ++YYCURSOR;
-#line 221 "../src/options/parse_opts.re"
+#line 222 "../src/options/parse_opts.re"
        { opts.set_encoding_policy (Enc::POLICY_IGNORE);     goto opt; }
-#line 3293 "src/options/parse_opts.cc"
-yy807:
+#line 3335 "src/options/parse_opts.cc"
+yy818:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'u') goto yy790;
+       if (yych != 'u') goto yy801;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 't') goto yy790;
+       if (yych != 't') goto yy801;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych != 'e') goto yy790;
+       if (yych != 'e') goto yy801;
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych >= 0x01) goto yy790;
+       if (yych >= 0x01) goto yy801;
        ++YYCURSOR;
-#line 222 "../src/options/parse_opts.re"
+#line 223 "../src/options/parse_opts.re"
        { opts.set_encoding_policy (Enc::POLICY_SUBSTITUTE); goto opt; }
-#line 3306 "src/options/parse_opts.cc"
+#line 3348 "src/options/parse_opts.cc"
 }
-#line 224 "../src/options/parse_opts.re"
+#line 225 "../src/options/parse_opts.re"
 
 
 opt_input:
 
-#line 3313 "src/options/parse_opts.cc"
+#line 3355 "src/options/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= 'b') goto yy815;
-       if (yych <= 'c') goto yy817;
-       if (yych <= 'd') goto yy818;
-yy815:
+       if (yych <= 'b') goto yy826;
+       if (yych <= 'c') goto yy828;
+       if (yych <= 'd') goto yy829;
+yy826:
        ++YYCURSOR;
-yy816:
-#line 228 "../src/options/parse_opts.re"
+yy827:
+#line 229 "../src/options/parse_opts.re"
        { ERRARG("--input", "default | custom", *argv); }
-#line 3325 "src/options/parse_opts.cc"
-yy817:
+#line 3367 "src/options/parse_opts.cc"
+yy828:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'u') goto yy819;
-       goto yy816;
-yy818:
+       if (yych == 'u') goto yy830;
+       goto yy827;
+yy829:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'e') goto yy821;
-       goto yy816;
-yy819:
+       if (yych == 'e') goto yy832;
+       goto yy827;
+yy830:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 's') goto yy822;
-yy820:
+       if (yych == 's') goto yy833;
+yy831:
        YYCURSOR = YYMARKER;
-       goto yy816;
-yy821:
+       goto yy827;
+yy832:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'f') goto yy823;
-       goto yy820;
-yy822:
+       if (yych == 'f') goto yy834;
+       goto yy831;
+yy833:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy824;
-       goto yy820;
-yy823:
+       if (yych == 't') goto yy835;
+       goto yy831;
+yy834:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'a') goto yy825;
-       goto yy820;
-yy824:
+       if (yych == 'a') goto yy836;
+       goto yy831;
+yy835:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy826;
-       goto yy820;
-yy825:
+       if (yych == 'o') goto yy837;
+       goto yy831;
+yy836:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'u') goto yy827;
-       goto yy820;
-yy826:
+       if (yych == 'u') goto yy838;
+       goto yy831;
+yy837:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'm') goto yy828;
-       goto yy820;
-yy827:
+       if (yych == 'm') goto yy839;
+       goto yy831;
+yy838:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'l') goto yy829;
-       goto yy820;
-yy828:
+       if (yych == 'l') goto yy840;
+       goto yy831;
+yy839:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy830;
-       goto yy820;
-yy829:
+       if (yych <= 0x00) goto yy841;
+       goto yy831;
+yy840:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy832;
-       goto yy820;
-yy830:
+       if (yych == 't') goto yy843;
+       goto yy831;
+yy841:
        ++YYCURSOR;
-#line 230 "../src/options/parse_opts.re"
+#line 231 "../src/options/parse_opts.re"
        { opts.set_input_api(INPUT_CUSTOM);  goto opt; }
-#line 3380 "src/options/parse_opts.cc"
-yy832:
+#line 3422 "src/options/parse_opts.cc"
+yy843:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych >= 0x01) goto yy820;
+       if (yych >= 0x01) goto yy831;
        ++YYCURSOR;
-#line 229 "../src/options/parse_opts.re"
+#line 230 "../src/options/parse_opts.re"
        { opts.set_input_api(INPUT_DEFAULT); goto opt; }
-#line 3387 "src/options/parse_opts.cc"
+#line 3429 "src/options/parse_opts.cc"
 }
-#line 231 "../src/options/parse_opts.re"
+#line 232 "../src/options/parse_opts.re"
 
 
 opt_empty_class:
 
-#line 3394 "src/options/parse_opts.cc"
+#line 3436 "src/options/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == 'e') goto yy839;
-       if (yych == 'm') goto yy840;
+       if (yych == 'e') goto yy850;
+       if (yych == 'm') goto yy851;
        ++YYCURSOR;
-yy838:
-#line 235 "../src/options/parse_opts.re"
+yy849:
+#line 236 "../src/options/parse_opts.re"
        { ERRARG("--empty-class", "match-empty | match-none | error", *argv); }
-#line 3404 "src/options/parse_opts.cc"
-yy839:
+#line 3446 "src/options/parse_opts.cc"
+yy850:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'r') goto yy841;
-       goto yy838;
-yy840:
+       if (yych == 'r') goto yy852;
+       goto yy849;
+yy851:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'a') goto yy843;
-       goto yy838;
-yy841:
+       if (yych == 'a') goto yy854;
+       goto yy849;
+yy852:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy844;
-yy842:
+       if (yych == 'r') goto yy855;
+yy853:
        YYCURSOR = YYMARKER;
-       goto yy838;
-yy843:
+       goto yy849;
+yy854:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy845;
-       goto yy842;
-yy844:
+       if (yych == 't') goto yy856;
+       goto yy853;
+yy855:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy846;
-       goto yy842;
-yy845:
+       if (yych == 'o') goto yy857;
+       goto yy853;
+yy856:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy847;
-       goto yy842;
-yy846:
+       if (yych == 'c') goto yy858;
+       goto yy853;
+yy857:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy848;
-       goto yy842;
-yy847:
+       if (yych == 'r') goto yy859;
+       goto yy853;
+yy858:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'h') goto yy849;
-       goto yy842;
-yy848:
+       if (yych == 'h') goto yy860;
+       goto yy853;
+yy859:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy850;
-       goto yy842;
-yy849:
+       if (yych <= 0x00) goto yy861;
+       goto yy853;
+yy860:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '-') goto yy852;
-       goto yy842;
-yy850:
+       if (yych == '-') goto yy863;
+       goto yy853;
+yy861:
        ++YYCURSOR;
-#line 238 "../src/options/parse_opts.re"
+#line 239 "../src/options/parse_opts.re"
        { opts.set_empty_class_policy (EMPTY_CLASS_ERROR);       goto opt; }
-#line 3451 "src/options/parse_opts.cc"
-yy852:
+#line 3493 "src/options/parse_opts.cc"
+yy863:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy853;
-       if (yych == 'n') goto yy854;
-       goto yy842;
-yy853:
+       if (yych == 'e') goto yy864;
+       if (yych == 'n') goto yy865;
+       goto yy853;
+yy864:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'm') goto yy855;
-       goto yy842;
-yy854:
+       if (yych == 'm') goto yy866;
+       goto yy853;
+yy865:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy856;
-       goto yy842;
-yy855:
+       if (yych == 'o') goto yy867;
+       goto yy853;
+yy866:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'p') goto yy857;
-       goto yy842;
-yy856:
+       if (yych == 'p') goto yy868;
+       goto yy853;
+yy867:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'n') goto yy858;
-       goto yy842;
-yy857:
+       if (yych == 'n') goto yy869;
+       goto yy853;
+yy868:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 't') goto yy859;
-       goto yy842;
-yy858:
+       if (yych == 't') goto yy870;
+       goto yy853;
+yy869:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy860;
-       goto yy842;
-yy859:
+       if (yych == 'e') goto yy871;
+       goto yy853;
+yy870:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'y') goto yy861;
-       goto yy842;
-yy860:
+       if (yych == 'y') goto yy872;
+       goto yy853;
+yy871:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy862;
-       goto yy842;
-yy861:
+       if (yych <= 0x00) goto yy873;
+       goto yy853;
+yy872:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy864;
-       goto yy842;
-yy862:
+       if (yych <= 0x00) goto yy875;
+       goto yy853;
+yy873:
        ++YYCURSOR;
-#line 237 "../src/options/parse_opts.re"
+#line 238 "../src/options/parse_opts.re"
        { opts.set_empty_class_policy (EMPTY_CLASS_MATCH_NONE);  goto opt; }
-#line 3497 "src/options/parse_opts.cc"
-yy864:
+#line 3539 "src/options/parse_opts.cc"
+yy875:
        ++YYCURSOR;
-#line 236 "../src/options/parse_opts.re"
+#line 237 "../src/options/parse_opts.re"
        { opts.set_empty_class_policy (EMPTY_CLASS_MATCH_EMPTY); goto opt; }
-#line 3502 "src/options/parse_opts.cc"
+#line 3544 "src/options/parse_opts.cc"
 }
-#line 239 "../src/options/parse_opts.re"
+#line 240 "../src/options/parse_opts.re"
 
 
 opt_location_format:
 
-#line 3509 "src/options/parse_opts.cc"
+#line 3551 "src/options/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == 'g') goto yy870;
-       if (yych == 'm') goto yy871;
+       if (yych == 'g') goto yy881;
+       if (yych == 'm') goto yy882;
        ++YYCURSOR;
-yy869:
-#line 243 "../src/options/parse_opts.re"
+yy880:
+#line 244 "../src/options/parse_opts.re"
        { ERRARG("--location-format", "gnu | msvc", *argv); }
-#line 3519 "src/options/parse_opts.cc"
-yy870:
+#line 3561 "src/options/parse_opts.cc"
+yy881:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'n') goto yy872;
-       goto yy869;
-yy871:
+       if (yych == 'n') goto yy883;
+       goto yy880;
+yy882:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 's') goto yy874;
-       goto yy869;
-yy872:
+       if (yych == 's') goto yy885;
+       goto yy880;
+yy883:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'u') goto yy875;
-yy873:
+       if (yych == 'u') goto yy886;
+yy884:
        YYCURSOR = YYMARKER;
-       goto yy869;
-yy874:
+       goto yy880;
+yy885:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'v') goto yy876;
-       goto yy873;
-yy875:
+       if (yych == 'v') goto yy887;
+       goto yy884;
+yy886:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy877;
-       goto yy873;
-yy876:
+       if (yych <= 0x00) goto yy888;
+       goto yy884;
+yy887:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'c') goto yy879;
-       goto yy873;
-yy877:
+       if (yych == 'c') goto yy890;
+       goto yy884;
+yy888:
        ++YYCURSOR;
-#line 244 "../src/options/parse_opts.re"
+#line 245 "../src/options/parse_opts.re"
        { msg.locfmt = LOCFMT_GNU;  goto opt; }
-#line 3550 "src/options/parse_opts.cc"
-yy879:
+#line 3592 "src/options/parse_opts.cc"
+yy890:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych >= 0x01) goto yy873;
+       if (yych >= 0x01) goto yy884;
        ++YYCURSOR;
-#line 245 "../src/options/parse_opts.re"
+#line 246 "../src/options/parse_opts.re"
        { msg.locfmt = LOCFMT_MSVC; goto opt; }
-#line 3557 "src/options/parse_opts.cc"
+#line 3599 "src/options/parse_opts.cc"
 }
-#line 246 "../src/options/parse_opts.re"
+#line 247 "../src/options/parse_opts.re"
+
+
+opt_input_encoding:
+
+#line 3606 "src/options/parse_opts.cc"
+{
+       YYCTYPE yych;
+       yych = (YYCTYPE)*YYCURSOR;
+       if (yych == 'a') goto yy897;
+       if (yych == 'u') goto yy898;
+       ++YYCURSOR;
+yy896:
+#line 251 "../src/options/parse_opts.re"
+       { ERRARG("--input-encoding", "ascii | utf8", *argv); }
+#line 3616 "src/options/parse_opts.cc"
+yy897:
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych == 's') goto yy899;
+       goto yy896;
+yy898:
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych == 't') goto yy901;
+       goto yy896;
+yy899:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'c') goto yy902;
+yy900:
+       YYCURSOR = YYMARKER;
+       goto yy896;
+yy901:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'f') goto yy903;
+       goto yy900;
+yy902:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'i') goto yy904;
+       goto yy900;
+yy903:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == '8') goto yy905;
+       goto yy900;
+yy904:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == 'i') goto yy906;
+       goto yy900;
+yy905:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy907;
+       goto yy900;
+yy906:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x00) goto yy909;
+       goto yy900;
+yy907:
+       ++YYCURSOR;
+#line 253 "../src/options/parse_opts.re"
+       { globopts.input_encoding = Enc::UTF8;  goto opt; }
+#line 3659 "src/options/parse_opts.cc"
+yy909:
+       ++YYCURSOR;
+#line 252 "../src/options/parse_opts.re"
+       { globopts.input_encoding = Enc::ASCII; goto opt; }
+#line 3664 "src/options/parse_opts.cc"
+}
+#line 254 "../src/options/parse_opts.re"
 
 
 opt_dfa_minimization:
 
-#line 3564 "src/options/parse_opts.cc"
+#line 3671 "src/options/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == 'm') goto yy886;
-       if (yych == 't') goto yy887;
+       if (yych == 'm') goto yy915;
+       if (yych == 't') goto yy916;
        ++YYCURSOR;
-yy885:
-#line 250 "../src/options/parse_opts.re"
+yy914:
+#line 258 "../src/options/parse_opts.re"
        { ERRARG("--dfa-minimization", "table | moore", *argv); }
-#line 3574 "src/options/parse_opts.cc"
-yy886:
+#line 3681 "src/options/parse_opts.cc"
+yy915:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'o') goto yy888;
-       goto yy885;
-yy887:
+       if (yych == 'o') goto yy917;
+       goto yy914;
+yy916:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'a') goto yy890;
-       goto yy885;
-yy888:
+       if (yych == 'a') goto yy919;
+       goto yy914;
+yy917:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy891;
-yy889:
+       if (yych == 'o') goto yy920;
+yy918:
        YYCURSOR = YYMARKER;
-       goto yy885;
-yy890:
+       goto yy914;
+yy919:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'b') goto yy892;
-       goto yy889;
-yy891:
+       if (yych == 'b') goto yy921;
+       goto yy918;
+yy920:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy893;
-       goto yy889;
-yy892:
+       if (yych == 'r') goto yy922;
+       goto yy918;
+yy921:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'l') goto yy894;
-       goto yy889;
-yy893:
+       if (yych == 'l') goto yy923;
+       goto yy918;
+yy922:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy895;
-       goto yy889;
-yy894:
+       if (yych == 'e') goto yy924;
+       goto yy918;
+yy923:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'e') goto yy896;
-       goto yy889;
-yy895:
+       if (yych == 'e') goto yy925;
+       goto yy918;
+yy924:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy897;
-       goto yy889;
-yy896:
+       if (yych <= 0x00) goto yy926;
+       goto yy918;
+yy925:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy899;
-       goto yy889;
-yy897:
+       if (yych <= 0x00) goto yy928;
+       goto yy918;
+yy926:
        ++YYCURSOR;
-#line 252 "../src/options/parse_opts.re"
+#line 260 "../src/options/parse_opts.re"
        { globopts.dfa_minimization = DFA_MINIMIZATION_MOORE; goto opt; }
-#line 3621 "src/options/parse_opts.cc"
-yy899:
+#line 3728 "src/options/parse_opts.cc"
+yy928:
        ++YYCURSOR;
-#line 251 "../src/options/parse_opts.re"
+#line 259 "../src/options/parse_opts.re"
        { globopts.dfa_minimization = DFA_MINIMIZATION_TABLE; goto opt; }
-#line 3626 "src/options/parse_opts.cc"
+#line 3733 "src/options/parse_opts.cc"
 }
-#line 253 "../src/options/parse_opts.re"
+#line 261 "../src/options/parse_opts.re"
 
 
 opt_posix_closure:
 
-#line 3633 "src/options/parse_opts.cc"
+#line 3740 "src/options/parse_opts.cc"
 {
        YYCTYPE yych;
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych == 'g') goto yy905;
+       if (yych == 'g') goto yy934;
        ++YYCURSOR;
-yy904:
-#line 257 "../src/options/parse_opts.re"
+yy933:
+#line 265 "../src/options/parse_opts.re"
        { ERRARG("--posix-closure", "gor1 | gtop", *argv); }
-#line 3642 "src/options/parse_opts.cc"
-yy905:
+#line 3749 "src/options/parse_opts.cc"
+yy934:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych == 'o') goto yy906;
-       if (yych == 't') goto yy908;
-       goto yy904;
-yy906:
+       if (yych == 'o') goto yy935;
+       if (yych == 't') goto yy937;
+       goto yy933;
+yy935:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'r') goto yy909;
-yy907:
+       if (yych == 'r') goto yy938;
+yy936:
        YYCURSOR = YYMARKER;
-       goto yy904;
-yy908:
+       goto yy933;
+yy937:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'o') goto yy910;
-       goto yy907;
-yy909:
+       if (yych == 'o') goto yy939;
+       goto yy936;
+yy938:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '1') goto yy911;
-       goto yy907;
-yy910:
+       if (yych == '1') goto yy940;
+       goto yy936;
+yy939:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == 'p') goto yy912;
-       goto yy907;
-yy911:
+       if (yych == 'p') goto yy941;
+       goto yy936;
+yy940:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy913;
-       goto yy907;
-yy912:
+       if (yych <= 0x00) goto yy942;
+       goto yy936;
+yy941:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= 0x00) goto yy915;
-       goto yy907;
-yy913:
+       if (yych <= 0x00) goto yy944;
+       goto yy936;
+yy942:
        ++YYCURSOR;
-#line 258 "../src/options/parse_opts.re"
+#line 266 "../src/options/parse_opts.re"
        { globopts.posix_closure = POSIX_CLOSURE_GOR1; goto opt; }
-#line 3678 "src/options/parse_opts.cc"
-yy915:
+#line 3785 "src/options/parse_opts.cc"
+yy944:
        ++YYCURSOR;
-#line 259 "../src/options/parse_opts.re"
+#line 267 "../src/options/parse_opts.re"
        { globopts.posix_closure = POSIX_CLOSURE_GTOP; goto opt; }
-#line 3683 "src/options/parse_opts.cc"
+#line 3790 "src/options/parse_opts.cc"
 }
-#line 260 "../src/options/parse_opts.re"
+#line 268 "../src/options/parse_opts.re"
 
 
 end:
index 309871d071f5a556392f511f507343e29b6d45f1..f36829dc23578e39db28cba95cdc7ee10d74f751 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 1.1.1 on Tue Feb 19 16:29:01 2019 */
+/* Generated by re2c 1.1.1 on Fri May 24 12:40:10 2019 */
 #line 1 "../src/parse/lex.re"
 #include "src/util/c99_stdint.h"
 #include <stddef.h>
@@ -2817,8 +2817,11 @@ uint32_t Scanner::lex_cls_chr()
 {
     tok = cur;
     const loc_t &loc = cur_loc();
+    #line 599 "../src/parse/lex.re"
 
-#line 2822 "src/parse/lex.cc"
+    if (globopts->input_encoding == Enc::ASCII) {
+        
+#line 2825 "src/parse/lex.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
@@ -2835,20 +2838,20 @@ uint32_t Scanner::lex_cls_chr()
        }
 yy476:
        ++YYCURSOR;
-#line 575 "../src/parse/lex.re"
+#line 580 "../src/parse/lex.re"
        { fail_if_eof(); return 0; }
-#line 2841 "src/parse/lex.cc"
+#line 2844 "src/parse/lex.cc"
 yy478:
        ++YYCURSOR;
 yy479:
-#line 581 "../src/parse/lex.re"
-       { return static_cast<uint8_t>(tok[0]); }
-#line 2847 "src/parse/lex.cc"
+#line 582 "../src/parse/lex.re"
+       { return decode(tok); }
+#line 2850 "src/parse/lex.cc"
 yy480:
        ++YYCURSOR;
-#line 576 "../src/parse/lex.re"
+#line 574 "../src/parse/lex.re"
        { msg.fatal(loc, "newline in character class"); }
-#line 2852 "src/parse/lex.cc"
+#line 2855 "src/parse/lex.cc"
 yy482:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '\n') goto yy480;
@@ -2907,36 +2910,36 @@ yy483:
                }
        }
 yy484:
-#line 579 "../src/parse/lex.re"
+#line 577 "../src/parse/lex.re"
        { msg.fatal(loc, "syntax error in escape sequence"); }
-#line 2913 "src/parse/lex.cc"
+#line 2916 "src/parse/lex.cc"
 yy485:
        ++YYCURSOR;
 yy486:
-#line 594 "../src/parse/lex.re"
+#line 595 "../src/parse/lex.re"
        {
-        msg.warn.useless_escape(loc, tok[1]);
-        return static_cast<uint8_t>(tok[1]);
+        msg.warn.useless_escape(loc, tok, cur);
+        return decode(tok + 1);
     }
-#line 2922 "src/parse/lex.cc"
+#line 2925 "src/parse/lex.cc"
 yy487:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '\n') goto yy480;
        goto yy486;
 yy488:
        ++YYCURSOR;
-#line 592 "../src/parse/lex.re"
+#line 593 "../src/parse/lex.re"
        { return static_cast<uint8_t>('-'); }
-#line 2931 "src/parse/lex.cc"
+#line 2934 "src/parse/lex.cc"
 yy490:
        yyaccept = 0;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '/') goto yy491;
        if (yych <= '7') goto yy515;
 yy491:
-#line 578 "../src/parse/lex.re"
+#line 576 "../src/parse/lex.re"
        { msg.fatal(loc, "syntax error in octal escape sequence"); }
-#line 2940 "src/parse/lex.cc"
+#line 2943 "src/parse/lex.cc"
 yy492:
        ++YYCURSOR;
        goto yy491;
@@ -2952,9 +2955,9 @@ yy493:
                if (yych <= 'f') goto yy517;
        }
 yy494:
-#line 577 "../src/parse/lex.re"
+#line 575 "../src/parse/lex.re"
        { msg.fatal(loc, "syntax error in hexadecimal escape sequence"); }
-#line 2958 "src/parse/lex.cc"
+#line 2961 "src/parse/lex.cc"
 yy495:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
@@ -2970,49 +2973,49 @@ yy495:
        }
 yy496:
        ++YYCURSOR;
-#line 591 "../src/parse/lex.re"
+#line 592 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\\'); }
-#line 2976 "src/parse/lex.cc"
+#line 2979 "src/parse/lex.cc"
 yy498:
        ++YYCURSOR;
-#line 593 "../src/parse/lex.re"
+#line 594 "../src/parse/lex.re"
        { return static_cast<uint8_t>(']'); }
-#line 2981 "src/parse/lex.cc"
+#line 2984 "src/parse/lex.cc"
 yy500:
        ++YYCURSOR;
-#line 584 "../src/parse/lex.re"
+#line 585 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\a'); }
-#line 2986 "src/parse/lex.cc"
+#line 2989 "src/parse/lex.cc"
 yy502:
        ++YYCURSOR;
-#line 585 "../src/parse/lex.re"
+#line 586 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\b'); }
-#line 2991 "src/parse/lex.cc"
+#line 2994 "src/parse/lex.cc"
 yy504:
        ++YYCURSOR;
-#line 586 "../src/parse/lex.re"
+#line 587 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\f'); }
-#line 2996 "src/parse/lex.cc"
+#line 2999 "src/parse/lex.cc"
 yy506:
        ++YYCURSOR;
-#line 587 "../src/parse/lex.re"
+#line 588 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\n'); }
-#line 3001 "src/parse/lex.cc"
+#line 3004 "src/parse/lex.cc"
 yy508:
        ++YYCURSOR;
-#line 588 "../src/parse/lex.re"
+#line 589 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\r'); }
-#line 3006 "src/parse/lex.cc"
+#line 3009 "src/parse/lex.cc"
 yy510:
        ++YYCURSOR;
-#line 589 "../src/parse/lex.re"
+#line 590 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\t'); }
-#line 3011 "src/parse/lex.cc"
+#line 3014 "src/parse/lex.cc"
 yy512:
        ++YYCURSOR;
-#line 590 "../src/parse/lex.re"
+#line 591 "../src/parse/lex.re"
        { return static_cast<uint8_t>('\v'); }
-#line 3016 "src/parse/lex.cc"
+#line 3019 "src/parse/lex.cc"
 yy514:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
@@ -3075,9 +3078,9 @@ yy519:
        }
 yy520:
        ++YYCURSOR;
-#line 583 "../src/parse/lex.re"
+#line 584 "../src/parse/lex.re"
        { return unesc_oct(tok, cur); }
-#line 3081 "src/parse/lex.cc"
+#line 3084 "src/parse/lex.cc"
 yy522:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
@@ -3104,9 +3107,9 @@ yy523:
        }
 yy524:
        ++YYCURSOR;
-#line 582 "../src/parse/lex.re"
+#line 583 "../src/parse/lex.re"
        { return unesc_hex(tok, cur); }
-#line 3110 "src/parse/lex.cc"
+#line 3113 "src/parse/lex.cc"
 yy526:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
@@ -3130,322 +3133,1209 @@ yy527:
                goto yy516;
        }
 }
-#line 598 "../src/parse/lex.re"
-
-}
+#line 601 "../src/parse/lex.re"
 
-bool Scanner::lex_str_chr(char quote, ASTChar &ast)
-{
-    tok = cur;
-    ast.loc = cur_loc();
-    const loc_t &loc = ast.loc;
-    bool ok = true;
-
-#line 3145 "src/parse/lex.cc"
+    }
+    else {
+        
+#line 3142 "src/parse/lex.cc"
 {
        YYCTYPE yych;
        unsigned int yyaccept = 0;
        if ((YYLIMIT - YYCURSOR) < 10) YYFILL(10);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= '\f') {
-               if (yych <= 0x00) goto yy530;
-               if (yych == '\n') goto yy534;
-               goto yy532;
+       if (yych <= 0x7F) {
+               if (yych <= '\f') {
+                       if (yych <= 0x00) goto yy530;
+                       if (yych == '\n') goto yy534;
+                       goto yy532;
+               } else {
+                       if (yych <= '\r') goto yy536;
+                       if (yych == '\\') goto yy537;
+                       goto yy532;
+               }
        } else {
-               if (yych <= '\r') goto yy536;
-               if (yych == '\\') goto yy537;
-               goto yy532;
+               if (yych <= 0xEF) {
+                       if (yych <= 0xC1) goto yy539;
+                       if (yych <= 0xDF) goto yy541;
+                       if (yych <= 0xE0) goto yy542;
+                       goto yy543;
+               } else {
+                       if (yych <= 0xF0) goto yy544;
+                       if (yych <= 0xF3) goto yy545;
+                       if (yych <= 0xF4) goto yy546;
+                       goto yy539;
+               }
        }
 yy530:
        ++YYCURSOR;
-#line 614 "../src/parse/lex.re"
-       { fail_if_eof(); ast.chr = 0; goto end; }
-#line 3164 "src/parse/lex.cc"
+#line 580 "../src/parse/lex.re"
+       { fail_if_eof(); return 0; }
+#line 3175 "src/parse/lex.cc"
 yy532:
        ++YYCURSOR;
 yy533:
-#line 616 "../src/parse/lex.re"
-       { ok = tok[0] != quote; ast.chr = static_cast<uint8_t>(tok[0]); goto end; }
-#line 3170 "src/parse/lex.cc"
+#line 582 "../src/parse/lex.re"
+       { return decode(tok); }
+#line 3181 "src/parse/lex.cc"
 yy534:
        ++YYCURSOR;
-#line 609 "../src/parse/lex.re"
-       { msg.fatal(loc, "newline in character string"); }
-#line 3175 "src/parse/lex.cc"
+#line 574 "../src/parse/lex.re"
+       { msg.fatal(loc, "newline in character class"); }
+#line 3186 "src/parse/lex.cc"
 yy536:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych == '\n') goto yy534;
        goto yy533;
 yy537:
-       yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '`') {
-               if (yych <= '3') {
-                       if (yych <= '\n') {
-                               if (yych <= 0x00) goto yy538;
-                               if (yych <= '\t') goto yy539;
-                               goto yy534;
+       yyaccept = 0;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= 'b') {
+               if (yych <= '7') {
+                       if (yych <= '\r') {
+                               if (yych <= '\t') {
+                                       if (yych >= 0x01) goto yy547;
+                               } else {
+                                       if (yych <= '\n') goto yy534;
+                                       if (yych <= '\f') goto yy547;
+                                       goto yy549;
+                               }
                        } else {
-                               if (yych == '\r') goto yy541;
-                               if (yych <= '/') goto yy539;
-                               goto yy542;
+                               if (yych <= '-') {
+                                       if (yych <= ',') goto yy547;
+                                       goto yy550;
+                               } else {
+                                       if (yych <= '/') goto yy547;
+                                       if (yych <= '3') goto yy552;
+                                       goto yy554;
+                               }
                        }
                } else {
-                       if (yych <= 'W') {
-                               if (yych <= '7') goto yy544;
-                               if (yych == 'U') goto yy545;
-                               goto yy539;
+                       if (yych <= '[') {
+                               if (yych <= 'U') {
+                                       if (yych <= 'T') goto yy547;
+                                       goto yy555;
+                               } else {
+                                       if (yych == 'X') goto yy557;
+                                       goto yy547;
+                               }
                        } else {
-                               if (yych <= 'X') goto yy547;
-                               if (yych == '\\') goto yy548;
-                               goto yy539;
+                               if (yych <= ']') {
+                                       if (yych <= '\\') goto yy558;
+                                       goto yy560;
+                               } else {
+                                       if (yych <= '`') goto yy547;
+                                       if (yych <= 'a') goto yy562;
+                                       goto yy564;
+                               }
                        }
                }
        } else {
-               if (yych <= 'q') {
-                       if (yych <= 'e') {
-                               if (yych <= 'a') goto yy550;
-                               if (yych <= 'b') goto yy552;
-                               goto yy539;
+               if (yych <= 'v') {
+                       if (yych <= 'q') {
+                               if (yych <= 'f') {
+                                       if (yych <= 'e') goto yy547;
+                                       goto yy566;
+                               } else {
+                                       if (yych == 'n') goto yy568;
+                                       goto yy547;
+                               }
                        } else {
-                               if (yych <= 'f') goto yy554;
-                               if (yych == 'n') goto yy556;
-                               goto yy539;
+                               if (yych <= 's') {
+                                       if (yych <= 'r') goto yy570;
+                                       goto yy547;
+                               } else {
+                                       if (yych <= 't') goto yy572;
+                                       if (yych <= 'u') goto yy557;
+                                       goto yy574;
+                               }
                        }
                } else {
-                       if (yych <= 'u') {
-                               if (yych <= 'r') goto yy558;
-                               if (yych <= 's') goto yy539;
-                               if (yych <= 't') goto yy560;
-                               goto yy547;
+                       if (yych <= 0xDF) {
+                               if (yych <= 'x') {
+                                       if (yych <= 'w') goto yy547;
+                                       goto yy576;
+                               } else {
+                                       if (yych <= 0x7F) goto yy547;
+                                       if (yych >= 0xC2) goto yy577;
+                               }
                        } else {
-                               if (yych <= 'v') goto yy562;
-                               if (yych == 'x') goto yy564;
-                               goto yy539;
+                               if (yych <= 0xF0) {
+                                       if (yych <= 0xE0) goto yy579;
+                                       if (yych <= 0xEF) goto yy580;
+                                       goto yy581;
+                               } else {
+                                       if (yych <= 0xF3) goto yy582;
+                                       if (yych <= 0xF4) goto yy583;
+                               }
                        }
                }
        }
 yy538:
-#line 612 "../src/parse/lex.re"
+#line 577 "../src/parse/lex.re"
        { msg.fatal(loc, "syntax error in escape sequence"); }
-#line 3231 "src/parse/lex.cc"
+#line 3278 "src/parse/lex.cc"
 yy539:
        ++YYCURSOR;
 yy540:
-#line 627 "../src/parse/lex.re"
-       {
-        const char c = tok[1];
-        ast.chr = static_cast<uint8_t>(c);
-        if (tok[1] != quote) {
-            msg.warn.useless_escape(loc, c);
-        }
-        goto end;
-    }
-#line 3244 "src/parse/lex.cc"
+#line 578 "../src/parse/lex.re"
+       { msg.fatal(loc, "syntax error"); }
+#line 3284 "src/parse/lex.cc"
 yy541:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy534;
+       if (yych <= 0x7F) goto yy540;
+       if (yych <= 0xBF) goto yy532;
        goto yy540;
 yy542:
-       yyaccept = 0;
+       yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= '/') goto yy543;
-       if (yych <= '7') goto yy565;
+       if (yych <= 0x9F) goto yy540;
+       if (yych <= 0xBF) goto yy584;
+       goto yy540;
 yy543:
-#line 611 "../src/parse/lex.re"
-       { msg.fatal(loc, "syntax error in octal escape sequence"); }
-#line 3257 "src/parse/lex.cc"
+       yyaccept = 1;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= 0x7F) goto yy540;
+       if (yych <= 0xBF) goto yy584;
+       goto yy540;
 yy544:
-       ++YYCURSOR;
-       goto yy543;
+       yyaccept = 1;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= 0x8F) goto yy540;
+       if (yych <= 0xBF) goto yy585;
+       goto yy540;
 yy545:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= 0x7F) goto yy540;
+       if (yych <= 0xBF) goto yy585;
+       goto yy540;
+yy546:
+       yyaccept = 1;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= 0x7F) goto yy540;
+       if (yych <= 0x8F) goto yy585;
+       goto yy540;
+yy547:
+       ++YYCURSOR;
+yy548:
+#line 595 "../src/parse/lex.re"
+       {
+        msg.warn.useless_escape(loc, tok, cur);
+        return decode(tok + 1);
+    }
+#line 3328 "src/parse/lex.cc"
+yy549:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == '\n') goto yy534;
+       goto yy548;
+yy550:
+       ++YYCURSOR;
+#line 593 "../src/parse/lex.re"
+       { return static_cast<uint8_t>('-'); }
+#line 3337 "src/parse/lex.cc"
+yy552:
+       yyaccept = 2;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= '/') goto yy553;
+       if (yych <= '7') goto yy586;
+yy553:
+#line 576 "../src/parse/lex.re"
+       { msg.fatal(loc, "syntax error in octal escape sequence"); }
+#line 3346 "src/parse/lex.cc"
+yy554:
+       ++YYCURSOR;
+       goto yy553;
+yy555:
+       yyaccept = 3;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
-               if (yych <= '/') goto yy546;
-               if (yych <= '9') goto yy567;
+               if (yych <= '/') goto yy556;
+               if (yych <= '9') goto yy587;
        } else {
-               if (yych <= 'F') goto yy567;
-               if (yych <= '`') goto yy546;
-               if (yych <= 'f') goto yy567;
+               if (yych <= 'F') goto yy587;
+               if (yych <= '`') goto yy556;
+               if (yych <= 'f') goto yy587;
        }
-yy546:
-#line 610 "../src/parse/lex.re"
+yy556:
+#line 575 "../src/parse/lex.re"
        { msg.fatal(loc, "syntax error in hexadecimal escape sequence"); }
-#line 3275 "src/parse/lex.cc"
-yy547:
-       yyaccept = 1;
+#line 3364 "src/parse/lex.cc"
+yy557:
+       yyaccept = 3;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
-               if (yych <= '/') goto yy546;
-               if (yych <= '9') goto yy568;
-               goto yy546;
+               if (yych <= '/') goto yy556;
+               if (yych <= '9') goto yy588;
+               goto yy556;
        } else {
-               if (yych <= 'F') goto yy568;
-               if (yych <= '`') goto yy546;
-               if (yych <= 'f') goto yy568;
-               goto yy546;
+               if (yych <= 'F') goto yy588;
+               if (yych <= '`') goto yy556;
+               if (yych <= 'f') goto yy588;
+               goto yy556;
        }
-yy548:
+yy558:
        ++YYCURSOR;
-#line 626 "../src/parse/lex.re"
-       { ast.chr = static_cast<uint8_t>('\\'); goto end; }
-#line 3293 "src/parse/lex.cc"
-yy550:
+#line 592 "../src/parse/lex.re"
+       { return static_cast<uint8_t>('\\'); }
+#line 3382 "src/parse/lex.cc"
+yy560:
        ++YYCURSOR;
-#line 619 "../src/parse/lex.re"
-       { ast.chr = static_cast<uint8_t>('\a'); goto end; }
-#line 3298 "src/parse/lex.cc"
-yy552:
+#line 594 "../src/parse/lex.re"
+       { return static_cast<uint8_t>(']'); }
+#line 3387 "src/parse/lex.cc"
+yy562:
        ++YYCURSOR;
-#line 620 "../src/parse/lex.re"
-       { ast.chr = static_cast<uint8_t>('\b'); goto end; }
-#line 3303 "src/parse/lex.cc"
-yy554:
+#line 585 "../src/parse/lex.re"
+       { return static_cast<uint8_t>('\a'); }
+#line 3392 "src/parse/lex.cc"
+yy564:
        ++YYCURSOR;
-#line 621 "../src/parse/lex.re"
-       { ast.chr = static_cast<uint8_t>('\f'); goto end; }
-#line 3308 "src/parse/lex.cc"
-yy556:
+#line 586 "../src/parse/lex.re"
+       { return static_cast<uint8_t>('\b'); }
+#line 3397 "src/parse/lex.cc"
+yy566:
+       ++YYCURSOR;
+#line 587 "../src/parse/lex.re"
+       { return static_cast<uint8_t>('\f'); }
+#line 3402 "src/parse/lex.cc"
+yy568:
+       ++YYCURSOR;
+#line 588 "../src/parse/lex.re"
+       { return static_cast<uint8_t>('\n'); }
+#line 3407 "src/parse/lex.cc"
+yy570:
+       ++YYCURSOR;
+#line 589 "../src/parse/lex.re"
+       { return static_cast<uint8_t>('\r'); }
+#line 3412 "src/parse/lex.cc"
+yy572:
+       ++YYCURSOR;
+#line 590 "../src/parse/lex.re"
+       { return static_cast<uint8_t>('\t'); }
+#line 3417 "src/parse/lex.cc"
+yy574:
+       ++YYCURSOR;
+#line 591 "../src/parse/lex.re"
+       { return static_cast<uint8_t>('\v'); }
+#line 3422 "src/parse/lex.cc"
+yy576:
+       yyaccept = 3;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= '@') {
+               if (yych <= '/') goto yy556;
+               if (yych <= '9') goto yy589;
+               goto yy556;
+       } else {
+               if (yych <= 'F') goto yy589;
+               if (yych <= '`') goto yy556;
+               if (yych <= 'f') goto yy589;
+               goto yy556;
+       }
+yy577:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x7F) goto yy578;
+       if (yych <= 0xBF) goto yy547;
+yy578:
+       YYCURSOR = YYMARKER;
+       if (yyaccept <= 1) {
+               if (yyaccept == 0) {
+                       goto yy538;
+               } else {
+                       goto yy540;
+               }
+       } else {
+               if (yyaccept == 2) {
+                       goto yy553;
+               } else {
+                       goto yy556;
+               }
+       }
+yy579:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x9F) goto yy578;
+       if (yych <= 0xBF) goto yy577;
+       goto yy578;
+yy580:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x7F) goto yy578;
+       if (yych <= 0xBF) goto yy577;
+       goto yy578;
+yy581:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x8F) goto yy578;
+       if (yych <= 0xBF) goto yy580;
+       goto yy578;
+yy582:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x7F) goto yy578;
+       if (yych <= 0xBF) goto yy580;
+       goto yy578;
+yy583:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x7F) goto yy578;
+       if (yych <= 0x8F) goto yy580;
+       goto yy578;
+yy584:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x7F) goto yy578;
+       if (yych <= 0xBF) goto yy532;
+       goto yy578;
+yy585:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x7F) goto yy578;
+       if (yych <= 0xBF) goto yy584;
+       goto yy578;
+yy586:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '/') goto yy578;
+       if (yych <= '7') goto yy590;
+       goto yy578;
+yy587:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy578;
+               if (yych <= '9') goto yy592;
+               goto yy578;
+       } else {
+               if (yych <= 'F') goto yy592;
+               if (yych <= '`') goto yy578;
+               if (yych <= 'f') goto yy592;
+               goto yy578;
+       }
+yy588:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy578;
+               if (yych <= '9') goto yy593;
+               goto yy578;
+       } else {
+               if (yych <= 'F') goto yy593;
+               if (yych <= '`') goto yy578;
+               if (yych <= 'f') goto yy593;
+               goto yy578;
+       }
+yy589:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy578;
+               if (yych <= '9') goto yy594;
+               goto yy578;
+       } else {
+               if (yych <= 'F') goto yy594;
+               if (yych <= '`') goto yy578;
+               if (yych <= 'f') goto yy594;
+               goto yy578;
+       }
+yy590:
        ++YYCURSOR;
+#line 584 "../src/parse/lex.re"
+       { return unesc_oct(tok, cur); }
+#line 3535 "src/parse/lex.cc"
+yy592:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy578;
+               if (yych <= '9') goto yy596;
+               goto yy578;
+       } else {
+               if (yych <= 'F') goto yy596;
+               if (yych <= '`') goto yy578;
+               if (yych <= 'f') goto yy596;
+               goto yy578;
+       }
+yy593:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy578;
+               if (yych <= '9') goto yy589;
+               goto yy578;
+       } else {
+               if (yych <= 'F') goto yy589;
+               if (yych <= '`') goto yy578;
+               if (yych <= 'f') goto yy589;
+               goto yy578;
+       }
+yy594:
+       ++YYCURSOR;
+#line 583 "../src/parse/lex.re"
+       { return unesc_hex(tok, cur); }
+#line 3564 "src/parse/lex.cc"
+yy596:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy578;
+               if (yych >= ':') goto yy578;
+       } else {
+               if (yych <= 'F') goto yy597;
+               if (yych <= '`') goto yy578;
+               if (yych >= 'g') goto yy578;
+       }
+yy597:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy578;
+               if (yych <= '9') goto yy588;
+               goto yy578;
+       } else {
+               if (yych <= 'F') goto yy588;
+               if (yych <= '`') goto yy578;
+               if (yych <= 'f') goto yy588;
+               goto yy578;
+       }
+}
+#line 604 "../src/parse/lex.re"
+ #line 604 "../src/parse/lex.re"
+
+    }
+}
+
+bool Scanner::lex_str_chr(char quote, ASTChar &ast)
+{
+    tok = cur;
+    ast.loc = cur_loc();
+
+    #line 638 "../src/parse/lex.re"
+
+    if (globopts->input_encoding == Enc::ASCII) {
+        
+#line 3603 "src/parse/lex.cc"
+{
+       YYCTYPE yych;
+       unsigned int yyaccept = 0;
+       if ((YYLIMIT - YYCURSOR) < 10) YYFILL(10);
+       yych = (YYCTYPE)*YYCURSOR;
+       if (yych <= '\f') {
+               if (yych <= 0x00) goto yy600;
+               if (yych == '\n') goto yy604;
+               goto yy602;
+       } else {
+               if (yych <= '\r') goto yy606;
+               if (yych == '\\') goto yy607;
+               goto yy602;
+       }
+yy600:
+       ++YYCURSOR;
+#line 620 "../src/parse/lex.re"
+       { fail_if_eof(); ast.chr = 0; return true; }
+#line 3622 "src/parse/lex.cc"
+yy602:
+       ++YYCURSOR;
+yy603:
 #line 622 "../src/parse/lex.re"
-       { ast.chr = static_cast<uint8_t>('\n'); goto end; }
-#line 3313 "src/parse/lex.cc"
-yy558:
+       { ast.chr = decode(tok); return tok[0] != quote; }
+#line 3628 "src/parse/lex.cc"
+yy604:
        ++YYCURSOR;
-#line 623 "../src/parse/lex.re"
-       { ast.chr = static_cast<uint8_t>('\r'); goto end; }
-#line 3318 "src/parse/lex.cc"
-yy560:
+#line 614 "../src/parse/lex.re"
+       { msg.fatal(ast.loc, "newline in character string"); }
+#line 3633 "src/parse/lex.cc"
+yy606:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == '\n') goto yy604;
+       goto yy603;
+yy607:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '`') {
+               if (yych <= '3') {
+                       if (yych <= '\n') {
+                               if (yych <= 0x00) goto yy608;
+                               if (yych <= '\t') goto yy609;
+                               goto yy604;
+                       } else {
+                               if (yych == '\r') goto yy611;
+                               if (yych <= '/') goto yy609;
+                               goto yy612;
+                       }
+               } else {
+                       if (yych <= 'W') {
+                               if (yych <= '7') goto yy614;
+                               if (yych == 'U') goto yy615;
+                               goto yy609;
+                       } else {
+                               if (yych <= 'X') goto yy617;
+                               if (yych == '\\') goto yy618;
+                               goto yy609;
+                       }
+               }
+       } else {
+               if (yych <= 'q') {
+                       if (yych <= 'e') {
+                               if (yych <= 'a') goto yy620;
+                               if (yych <= 'b') goto yy622;
+                               goto yy609;
+                       } else {
+                               if (yych <= 'f') goto yy624;
+                               if (yych == 'n') goto yy626;
+                               goto yy609;
+                       }
+               } else {
+                       if (yych <= 'u') {
+                               if (yych <= 'r') goto yy628;
+                               if (yych <= 's') goto yy609;
+                               if (yych <= 't') goto yy630;
+                               goto yy617;
+                       } else {
+                               if (yych <= 'v') goto yy632;
+                               if (yych == 'x') goto yy634;
+                               goto yy609;
+                       }
+               }
+       }
+yy608:
+#line 617 "../src/parse/lex.re"
+       { msg.fatal(ast.loc, "syntax error in escape sequence"); }
+#line 3689 "src/parse/lex.cc"
+yy609:
        ++YYCURSOR;
-#line 624 "../src/parse/lex.re"
-       { ast.chr = static_cast<uint8_t>('\t'); goto end; }
-#line 3323 "src/parse/lex.cc"
-yy562:
+yy610:
+#line 633 "../src/parse/lex.re"
+       {
+        ast.chr = decode(tok + 1);
+        if (tok[1] != quote) msg.warn.useless_escape(ast.loc, tok, cur);
+        return true;
+    }
+#line 3699 "src/parse/lex.cc"
+yy611:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == '\n') goto yy604;
+       goto yy610;
+yy612:
+       yyaccept = 0;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= '/') goto yy613;
+       if (yych <= '7') goto yy635;
+yy613:
+#line 616 "../src/parse/lex.re"
+       { msg.fatal(ast.loc, "syntax error in octal escape sequence"); }
+#line 3712 "src/parse/lex.cc"
+yy614:
+       ++YYCURSOR;
+       goto yy613;
+yy615:
+       yyaccept = 1;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= '@') {
+               if (yych <= '/') goto yy616;
+               if (yych <= '9') goto yy637;
+       } else {
+               if (yych <= 'F') goto yy637;
+               if (yych <= '`') goto yy616;
+               if (yych <= 'f') goto yy637;
+       }
+yy616:
+#line 615 "../src/parse/lex.re"
+       { msg.fatal(ast.loc, "syntax error in hexadecimal escape sequence"); }
+#line 3730 "src/parse/lex.cc"
+yy617:
+       yyaccept = 1;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= '@') {
+               if (yych <= '/') goto yy616;
+               if (yych <= '9') goto yy638;
+               goto yy616;
+       } else {
+               if (yych <= 'F') goto yy638;
+               if (yych <= '`') goto yy616;
+               if (yych <= 'f') goto yy638;
+               goto yy616;
+       }
+yy618:
+       ++YYCURSOR;
+#line 632 "../src/parse/lex.re"
+       { ast.chr = static_cast<uint8_t>('\\'); return true; }
+#line 3748 "src/parse/lex.cc"
+yy620:
        ++YYCURSOR;
 #line 625 "../src/parse/lex.re"
-       { ast.chr = static_cast<uint8_t>('\v'); goto end; }
-#line 3328 "src/parse/lex.cc"
-yy564:
+       { ast.chr = static_cast<uint8_t>('\a'); return true; }
+#line 3753 "src/parse/lex.cc"
+yy622:
+       ++YYCURSOR;
+#line 626 "../src/parse/lex.re"
+       { ast.chr = static_cast<uint8_t>('\b'); return true; }
+#line 3758 "src/parse/lex.cc"
+yy624:
+       ++YYCURSOR;
+#line 627 "../src/parse/lex.re"
+       { ast.chr = static_cast<uint8_t>('\f'); return true; }
+#line 3763 "src/parse/lex.cc"
+yy626:
+       ++YYCURSOR;
+#line 628 "../src/parse/lex.re"
+       { ast.chr = static_cast<uint8_t>('\n'); return true; }
+#line 3768 "src/parse/lex.cc"
+yy628:
+       ++YYCURSOR;
+#line 629 "../src/parse/lex.re"
+       { ast.chr = static_cast<uint8_t>('\r'); return true; }
+#line 3773 "src/parse/lex.cc"
+yy630:
+       ++YYCURSOR;
+#line 630 "../src/parse/lex.re"
+       { ast.chr = static_cast<uint8_t>('\t'); return true; }
+#line 3778 "src/parse/lex.cc"
+yy632:
+       ++YYCURSOR;
+#line 631 "../src/parse/lex.re"
+       { ast.chr = static_cast<uint8_t>('\v'); return true; }
+#line 3783 "src/parse/lex.cc"
+yy634:
        yyaccept = 1;
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
-               if (yych <= '/') goto yy546;
-               if (yych <= '9') goto yy569;
-               goto yy546;
+               if (yych <= '/') goto yy616;
+               if (yych <= '9') goto yy639;
+               goto yy616;
        } else {
-               if (yych <= 'F') goto yy569;
-               if (yych <= '`') goto yy546;
-               if (yych <= 'f') goto yy569;
-               goto yy546;
+               if (yych <= 'F') goto yy639;
+               if (yych <= '`') goto yy616;
+               if (yych <= 'f') goto yy639;
+               goto yy616;
        }
-yy565:
+yy635:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych <= '/') goto yy566;
-       if (yych <= '7') goto yy570;
-yy566:
+       if (yych <= '/') goto yy636;
+       if (yych <= '7') goto yy640;
+yy636:
        YYCURSOR = YYMARKER;
        if (yyaccept == 0) {
-               goto yy543;
+               goto yy613;
        } else {
-               goto yy546;
+               goto yy616;
        }
-yy567:
+yy637:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy566;
-               if (yych <= '9') goto yy572;
-               goto yy566;
+               if (yych <= '/') goto yy636;
+               if (yych <= '9') goto yy642;
+               goto yy636;
        } else {
-               if (yych <= 'F') goto yy572;
-               if (yych <= '`') goto yy566;
-               if (yych <= 'f') goto yy572;
-               goto yy566;
+               if (yych <= 'F') goto yy642;
+               if (yych <= '`') goto yy636;
+               if (yych <= 'f') goto yy642;
+               goto yy636;
        }
-yy568:
+yy638:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy566;
-               if (yych <= '9') goto yy573;
-               goto yy566;
+               if (yych <= '/') goto yy636;
+               if (yych <= '9') goto yy643;
+               goto yy636;
        } else {
-               if (yych <= 'F') goto yy573;
-               if (yych <= '`') goto yy566;
-               if (yych <= 'f') goto yy573;
-               goto yy566;
+               if (yych <= 'F') goto yy643;
+               if (yych <= '`') goto yy636;
+               if (yych <= 'f') goto yy643;
+               goto yy636;
        }
-yy569:
+yy639:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy566;
-               if (yych <= '9') goto yy574;
-               goto yy566;
+               if (yych <= '/') goto yy636;
+               if (yych <= '9') goto yy644;
+               goto yy636;
        } else {
-               if (yych <= 'F') goto yy574;
-               if (yych <= '`') goto yy566;
-               if (yych <= 'f') goto yy574;
-               goto yy566;
+               if (yych <= 'F') goto yy644;
+               if (yych <= '`') goto yy636;
+               if (yych <= 'f') goto yy644;
+               goto yy636;
        }
-yy570:
+yy640:
        ++YYCURSOR;
-#line 618 "../src/parse/lex.re"
-       { ast.chr = unesc_oct(tok, cur); goto end; }
-#line 3393 "src/parse/lex.cc"
-yy572:
+#line 624 "../src/parse/lex.re"
+       { ast.chr = unesc_oct(tok, cur); return true; }
+#line 3848 "src/parse/lex.cc"
+yy642:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy566;
-               if (yych <= '9') goto yy576;
-               goto yy566;
+               if (yych <= '/') goto yy636;
+               if (yych <= '9') goto yy646;
+               goto yy636;
        } else {
-               if (yych <= 'F') goto yy576;
-               if (yych <= '`') goto yy566;
-               if (yych <= 'f') goto yy576;
-               goto yy566;
+               if (yych <= 'F') goto yy646;
+               if (yych <= '`') goto yy636;
+               if (yych <= 'f') goto yy646;
+               goto yy636;
        }
-yy573:
+yy643:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy566;
-               if (yych <= '9') goto yy569;
-               goto yy566;
+               if (yych <= '/') goto yy636;
+               if (yych <= '9') goto yy639;
+               goto yy636;
        } else {
-               if (yych <= 'F') goto yy569;
-               if (yych <= '`') goto yy566;
-               if (yych <= 'f') goto yy569;
-               goto yy566;
+               if (yych <= 'F') goto yy639;
+               if (yych <= '`') goto yy636;
+               if (yych <= 'f') goto yy639;
+               goto yy636;
        }
-yy574:
+yy644:
        ++YYCURSOR;
+#line 623 "../src/parse/lex.re"
+       { ast.chr = unesc_hex(tok, cur); return true; }
+#line 3877 "src/parse/lex.cc"
+yy646:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy636;
+               if (yych >= ':') goto yy636;
+       } else {
+               if (yych <= 'F') goto yy647;
+               if (yych <= '`') goto yy636;
+               if (yych >= 'g') goto yy636;
+       }
+yy647:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy636;
+               if (yych <= '9') goto yy638;
+               goto yy636;
+       } else {
+               if (yych <= 'F') goto yy638;
+               if (yych <= '`') goto yy636;
+               if (yych <= 'f') goto yy638;
+               goto yy636;
+       }
+}
+#line 640 "../src/parse/lex.re"
+
+    }
+    else {
+        
+#line 3906 "src/parse/lex.cc"
+{
+       YYCTYPE yych;
+       unsigned int yyaccept = 0;
+       if ((YYLIMIT - YYCURSOR) < 10) YYFILL(10);
+       yych = (YYCTYPE)*YYCURSOR;
+       if (yych <= 0x7F) {
+               if (yych <= '\f') {
+                       if (yych <= 0x00) goto yy650;
+                       if (yych == '\n') goto yy654;
+                       goto yy652;
+               } else {
+                       if (yych <= '\r') goto yy656;
+                       if (yych == '\\') goto yy657;
+                       goto yy652;
+               }
+       } else {
+               if (yych <= 0xEF) {
+                       if (yych <= 0xC1) goto yy659;
+                       if (yych <= 0xDF) goto yy661;
+                       if (yych <= 0xE0) goto yy662;
+                       goto yy663;
+               } else {
+                       if (yych <= 0xF0) goto yy664;
+                       if (yych <= 0xF3) goto yy665;
+                       if (yych <= 0xF4) goto yy666;
+                       goto yy659;
+               }
+       }
+yy650:
+       ++YYCURSOR;
+#line 620 "../src/parse/lex.re"
+       { fail_if_eof(); ast.chr = 0; return true; }
+#line 3939 "src/parse/lex.cc"
+yy652:
+       ++YYCURSOR;
+yy653:
+#line 622 "../src/parse/lex.re"
+       { ast.chr = decode(tok); return tok[0] != quote; }
+#line 3945 "src/parse/lex.cc"
+yy654:
+       ++YYCURSOR;
+#line 614 "../src/parse/lex.re"
+       { msg.fatal(ast.loc, "newline in character string"); }
+#line 3950 "src/parse/lex.cc"
+yy656:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == '\n') goto yy654;
+       goto yy653;
+yy657:
+       yyaccept = 0;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= 'f') {
+               if (yych <= 'T') {
+                       if (yych <= '\f') {
+                               if (yych <= 0x00) goto yy658;
+                               if (yych == '\n') goto yy654;
+                               goto yy667;
+                       } else {
+                               if (yych <= '/') {
+                                       if (yych <= '\r') goto yy669;
+                                       goto yy667;
+                               } else {
+                                       if (yych <= '3') goto yy670;
+                                       if (yych <= '7') goto yy672;
+                                       goto yy667;
+                               }
+                       }
+               } else {
+                       if (yych <= '\\') {
+                               if (yych <= 'W') {
+                                       if (yych <= 'U') goto yy673;
+                                       goto yy667;
+                               } else {
+                                       if (yych <= 'X') goto yy675;
+                                       if (yych <= '[') goto yy667;
+                                       goto yy676;
+                               }
+                       } else {
+                               if (yych <= 'a') {
+                                       if (yych <= '`') goto yy667;
+                                       goto yy678;
+                               } else {
+                                       if (yych <= 'b') goto yy680;
+                                       if (yych <= 'e') goto yy667;
+                                       goto yy682;
+                               }
+                       }
+               }
+       } else {
+               if (yych <= 'w') {
+                       if (yych <= 'r') {
+                               if (yych == 'n') goto yy684;
+                               if (yych <= 'q') goto yy667;
+                               goto yy686;
+                       } else {
+                               if (yych <= 't') {
+                                       if (yych <= 's') goto yy667;
+                                       goto yy688;
+                               } else {
+                                       if (yych <= 'u') goto yy675;
+                                       if (yych <= 'v') goto yy690;
+                                       goto yy667;
+                               }
+                       }
+               } else {
+                       if (yych <= 0xE0) {
+                               if (yych <= 0x7F) {
+                                       if (yych <= 'x') goto yy692;
+                                       goto yy667;
+                               } else {
+                                       if (yych <= 0xC1) goto yy658;
+                                       if (yych <= 0xDF) goto yy693;
+                                       goto yy695;
+                               }
+                       } else {
+                               if (yych <= 0xF0) {
+                                       if (yych <= 0xEF) goto yy696;
+                                       goto yy697;
+                               } else {
+                                       if (yych <= 0xF3) goto yy698;
+                                       if (yych <= 0xF4) goto yy699;
+                               }
+                       }
+               }
+       }
+yy658:
 #line 617 "../src/parse/lex.re"
-       { ast.chr = unesc_hex(tok, cur); goto end; }
-#line 3422 "src/parse/lex.cc"
-yy576:
+       { msg.fatal(ast.loc, "syntax error in escape sequence"); }
+#line 4035 "src/parse/lex.cc"
+yy659:
+       ++YYCURSOR;
+yy660:
+#line 618 "../src/parse/lex.re"
+       { msg.fatal(ast.loc, "syntax error"); }
+#line 4041 "src/parse/lex.cc"
+yy661:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x7F) goto yy660;
+       if (yych <= 0xBF) goto yy652;
+       goto yy660;
+yy662:
+       yyaccept = 1;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= 0x9F) goto yy660;
+       if (yych <= 0xBF) goto yy700;
+       goto yy660;
+yy663:
+       yyaccept = 1;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= 0x7F) goto yy660;
+       if (yych <= 0xBF) goto yy700;
+       goto yy660;
+yy664:
+       yyaccept = 1;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= 0x8F) goto yy660;
+       if (yych <= 0xBF) goto yy701;
+       goto yy660;
+yy665:
+       yyaccept = 1;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= 0x7F) goto yy660;
+       if (yych <= 0xBF) goto yy701;
+       goto yy660;
+yy666:
+       yyaccept = 1;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= 0x7F) goto yy660;
+       if (yych <= 0x8F) goto yy701;
+       goto yy660;
+yy667:
+       ++YYCURSOR;
+yy668:
+#line 633 "../src/parse/lex.re"
+       {
+        ast.chr = decode(tok + 1);
+        if (tok[1] != quote) msg.warn.useless_escape(ast.loc, tok, cur);
+        return true;
+    }
+#line 4086 "src/parse/lex.cc"
+yy669:
        yych = (YYCTYPE)*++YYCURSOR;
+       if (yych == '\n') goto yy654;
+       goto yy668;
+yy670:
+       yyaccept = 2;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= '/') goto yy671;
+       if (yych <= '7') goto yy702;
+yy671:
+#line 616 "../src/parse/lex.re"
+       { msg.fatal(ast.loc, "syntax error in octal escape sequence"); }
+#line 4099 "src/parse/lex.cc"
+yy672:
+       ++YYCURSOR;
+       goto yy671;
+yy673:
+       yyaccept = 3;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
        if (yych <= '@') {
-               if (yych <= '/') goto yy566;
-               if (yych >= ':') goto yy566;
+               if (yych <= '/') goto yy674;
+               if (yych <= '9') goto yy703;
        } else {
-               if (yych <= 'F') goto yy577;
-               if (yych <= '`') goto yy566;
-               if (yych >= 'g') goto yy566;
+               if (yych <= 'F') goto yy703;
+               if (yych <= '`') goto yy674;
+               if (yych <= 'f') goto yy703;
        }
-yy577:
+yy674:
+#line 615 "../src/parse/lex.re"
+       { msg.fatal(ast.loc, "syntax error in hexadecimal escape sequence"); }
+#line 4117 "src/parse/lex.cc"
+yy675:
+       yyaccept = 3;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= '@') {
+               if (yych <= '/') goto yy674;
+               if (yych <= '9') goto yy704;
+               goto yy674;
+       } else {
+               if (yych <= 'F') goto yy704;
+               if (yych <= '`') goto yy674;
+               if (yych <= 'f') goto yy704;
+               goto yy674;
+       }
+yy676:
+       ++YYCURSOR;
+#line 632 "../src/parse/lex.re"
+       { ast.chr = static_cast<uint8_t>('\\'); return true; }
+#line 4135 "src/parse/lex.cc"
+yy678:
+       ++YYCURSOR;
+#line 625 "../src/parse/lex.re"
+       { ast.chr = static_cast<uint8_t>('\a'); return true; }
+#line 4140 "src/parse/lex.cc"
+yy680:
+       ++YYCURSOR;
+#line 626 "../src/parse/lex.re"
+       { ast.chr = static_cast<uint8_t>('\b'); return true; }
+#line 4145 "src/parse/lex.cc"
+yy682:
+       ++YYCURSOR;
+#line 627 "../src/parse/lex.re"
+       { ast.chr = static_cast<uint8_t>('\f'); return true; }
+#line 4150 "src/parse/lex.cc"
+yy684:
+       ++YYCURSOR;
+#line 628 "../src/parse/lex.re"
+       { ast.chr = static_cast<uint8_t>('\n'); return true; }
+#line 4155 "src/parse/lex.cc"
+yy686:
+       ++YYCURSOR;
+#line 629 "../src/parse/lex.re"
+       { ast.chr = static_cast<uint8_t>('\r'); return true; }
+#line 4160 "src/parse/lex.cc"
+yy688:
+       ++YYCURSOR;
+#line 630 "../src/parse/lex.re"
+       { ast.chr = static_cast<uint8_t>('\t'); return true; }
+#line 4165 "src/parse/lex.cc"
+yy690:
+       ++YYCURSOR;
+#line 631 "../src/parse/lex.re"
+       { ast.chr = static_cast<uint8_t>('\v'); return true; }
+#line 4170 "src/parse/lex.cc"
+yy692:
+       yyaccept = 3;
+       yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
+       if (yych <= '@') {
+               if (yych <= '/') goto yy674;
+               if (yych <= '9') goto yy705;
+               goto yy674;
+       } else {
+               if (yych <= 'F') goto yy705;
+               if (yych <= '`') goto yy674;
+               if (yych <= 'f') goto yy705;
+               goto yy674;
+       }
+yy693:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x7F) goto yy694;
+       if (yych <= 0xBF) goto yy667;
+yy694:
+       YYCURSOR = YYMARKER;
+       if (yyaccept <= 1) {
+               if (yyaccept == 0) {
+                       goto yy658;
+               } else {
+                       goto yy660;
+               }
+       } else {
+               if (yyaccept == 2) {
+                       goto yy671;
+               } else {
+                       goto yy674;
+               }
+       }
+yy695:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x9F) goto yy694;
+       if (yych <= 0xBF) goto yy693;
+       goto yy694;
+yy696:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x7F) goto yy694;
+       if (yych <= 0xBF) goto yy693;
+       goto yy694;
+yy697:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x8F) goto yy694;
+       if (yych <= 0xBF) goto yy696;
+       goto yy694;
+yy698:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x7F) goto yy694;
+       if (yych <= 0xBF) goto yy696;
+       goto yy694;
+yy699:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x7F) goto yy694;
+       if (yych <= 0x8F) goto yy696;
+       goto yy694;
+yy700:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x7F) goto yy694;
+       if (yych <= 0xBF) goto yy652;
+       goto yy694;
+yy701:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= 0x7F) goto yy694;
+       if (yych <= 0xBF) goto yy700;
+       goto yy694;
+yy702:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '/') goto yy694;
+       if (yych <= '7') goto yy706;
+       goto yy694;
+yy703:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy694;
+               if (yych <= '9') goto yy708;
+               goto yy694;
+       } else {
+               if (yych <= 'F') goto yy708;
+               if (yych <= '`') goto yy694;
+               if (yych <= 'f') goto yy708;
+               goto yy694;
+       }
+yy704:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy694;
+               if (yych <= '9') goto yy709;
+               goto yy694;
+       } else {
+               if (yych <= 'F') goto yy709;
+               if (yych <= '`') goto yy694;
+               if (yych <= 'f') goto yy709;
+               goto yy694;
+       }
+yy705:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy694;
+               if (yych <= '9') goto yy710;
+               goto yy694;
+       } else {
+               if (yych <= 'F') goto yy710;
+               if (yych <= '`') goto yy694;
+               if (yych <= 'f') goto yy710;
+               goto yy694;
+       }
+yy706:
+       ++YYCURSOR;
+#line 624 "../src/parse/lex.re"
+       { ast.chr = unesc_oct(tok, cur); return true; }
+#line 4283 "src/parse/lex.cc"
+yy708:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy694;
+               if (yych <= '9') goto yy712;
+               goto yy694;
+       } else {
+               if (yych <= 'F') goto yy712;
+               if (yych <= '`') goto yy694;
+               if (yych <= 'f') goto yy712;
+               goto yy694;
+       }
+yy709:
        yych = (YYCTYPE)*++YYCURSOR;
        if (yych <= '@') {
-               if (yych <= '/') goto yy566;
-               if (yych <= '9') goto yy568;
-               goto yy566;
+               if (yych <= '/') goto yy694;
+               if (yych <= '9') goto yy705;
+               goto yy694;
        } else {
-               if (yych <= 'F') goto yy568;
-               if (yych <= '`') goto yy566;
-               if (yych <= 'f') goto yy568;
-               goto yy566;
+               if (yych <= 'F') goto yy705;
+               if (yych <= '`') goto yy694;
+               if (yych <= 'f') goto yy705;
+               goto yy694;
+       }
+yy710:
+       ++YYCURSOR;
+#line 623 "../src/parse/lex.re"
+       { ast.chr = unesc_hex(tok, cur); return true; }
+#line 4312 "src/parse/lex.cc"
+yy712:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy694;
+               if (yych >= ':') goto yy694;
+       } else {
+               if (yych <= 'F') goto yy713;
+               if (yych <= '`') goto yy694;
+               if (yych >= 'g') goto yy694;
+       }
+yy713:
+       yych = (YYCTYPE)*++YYCURSOR;
+       if (yych <= '@') {
+               if (yych <= '/') goto yy694;
+               if (yych <= '9') goto yy704;
+               goto yy694;
+       } else {
+               if (yych <= 'F') goto yy704;
+               if (yych <= '`') goto yy694;
+               if (yych <= 'f') goto yy704;
+               goto yy694;
        }
 }
-#line 635 "../src/parse/lex.re"
+#line 643 "../src/parse/lex.re"
+ #line 643 "../src/parse/lex.re"
 
-end:
-    return ok;
+    }
 }
 
 const AST *Scanner::lex_str(char quote)
@@ -3466,7 +4356,7 @@ void Scanner::set_sourceline ()
 sourceline:
     tok = cur;
 
-#line 3470 "src/parse/lex.cc"
+#line 4360 "src/parse/lex.cc"
 {
        YYCTYPE yych;
        static const unsigned char yybm[] = {
@@ -3507,54 +4397,54 @@ sourceline:
        yych = (YYCTYPE)*YYCURSOR;
        if (yych <= '\r') {
                if (yych <= '\t') {
-                       if (yych >= 0x01) goto yy582;
+                       if (yych >= 0x01) goto yy718;
                } else {
-                       if (yych <= '\n') goto yy584;
-                       if (yych <= '\f') goto yy582;
-                       goto yy586;
+                       if (yych <= '\n') goto yy720;
+                       if (yych <= '\f') goto yy718;
+                       goto yy722;
                }
        } else {
                if (yych <= '"') {
-                       if (yych <= '!') goto yy582;
-                       goto yy587;
+                       if (yych <= '!') goto yy718;
+                       goto yy723;
                } else {
-                       if (yych <= '0') goto yy582;
-                       if (yych <= '9') goto yy588;
-                       goto yy582;
+                       if (yych <= '0') goto yy718;
+                       if (yych <= '9') goto yy724;
+                       goto yy718;
                }
        }
        ++YYCURSOR;
-#line 678 "../src/parse/lex.re"
+#line 685 "../src/parse/lex.re"
        { --cur; return; }
-#line 3530 "src/parse/lex.cc"
-yy582:
+#line 4420 "src/parse/lex.cc"
+yy718:
        ++YYCURSOR;
-yy583:
-#line 679 "../src/parse/lex.re"
+yy719:
+#line 686 "../src/parse/lex.re"
        { goto sourceline; }
-#line 3536 "src/parse/lex.cc"
-yy584:
+#line 4426 "src/parse/lex.cc"
+yy720:
        ++YYCURSOR;
-#line 677 "../src/parse/lex.re"
+#line 684 "../src/parse/lex.re"
        { pos = tok = cur; return; }
-#line 3541 "src/parse/lex.cc"
-yy586:
+#line 4431 "src/parse/lex.cc"
+yy722:
        yych = (YYCTYPE)*++YYCURSOR;
-       if (yych == '\n') goto yy584;
-       goto yy583;
-yy587:
+       if (yych == '\n') goto yy720;
+       goto yy719;
+yy723:
        yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR);
-       if (yych <= 0x00) goto yy583;
-       if (yych == '\n') goto yy583;
-       goto yy592;
-yy588:
+       if (yych <= 0x00) goto yy719;
+       if (yych == '\n') goto yy719;
+       goto yy728;
+yy724:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
        if (yybm[0+yych] & 64) {
-               goto yy588;
+               goto yy724;
        }
-#line 658 "../src/parse/lex.re"
+#line 665 "../src/parse/lex.re"
        {
         uint32_t l;
         if (!s_to_u32_unsafe(tok, cur, l)) {
@@ -3563,24 +4453,24 @@ yy588:
         set_line(l);
         goto sourceline;
     }
-#line 3567 "src/parse/lex.cc"
-yy591:
+#line 4457 "src/parse/lex.cc"
+yy727:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-yy592:
+yy728:
        if (yybm[0+yych] & 128) {
-               goto yy591;
+               goto yy727;
        }
-       if (yych <= '\n') goto yy593;
-       if (yych <= '"') goto yy594;
-       goto yy596;
-yy593:
+       if (yych <= '\n') goto yy729;
+       if (yych <= '"') goto yy730;
+       goto yy732;
+yy729:
        YYCURSOR = YYMARKER;
-       goto yy583;
-yy594:
+       goto yy719;
+yy730:
        ++YYCURSOR;
-#line 667 "../src/parse/lex.re"
+#line 674 "../src/parse/lex.re"
        {
         Input &in = get_input();
         std::string &name = in.escaped_name;
@@ -3590,16 +4480,16 @@ yy594:
         msg.filenames.push_back(name);
         goto sourceline;
     }
-#line 3594 "src/parse/lex.cc"
-yy596:
+#line 4484 "src/parse/lex.cc"
+yy732:
        ++YYCURSOR;
        if (YYLIMIT <= YYCURSOR) YYFILL(1);
        yych = (YYCTYPE)*YYCURSOR;
-       if (yych <= 0x00) goto yy593;
-       if (yych == '\n') goto yy593;
-       goto yy591;
+       if (yych <= 0x00) goto yy729;
+       if (yych == '\n') goto yy729;
+       goto yy727;
 }
-#line 680 "../src/parse/lex.re"
+#line 687 "../src/parse/lex.re"
 
 }
 
index 9d8ee86b5e083f01fd61379dc3a0eb8d7d29d34b..b7fc26ea13d514e01d0fa3b1b574d25c183233c8 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 1.1.1 on Tue Feb 19 16:29:01 2019 */
+/* Generated by re2c 1.1.1 on Fri May 24 12:40:10 2019 */
 
 #include <string.h>
 #include "src/util/forbid_copy.h"
index e0bf1a7700c394fcc70b870b617a8617325c5e59..b9906d99d0ff9cb2320e5bfbbb2722c4bf71d194 100644 (file)
@@ -15,6 +15,7 @@ const uint32_t utf8::INFIX        = 0x80u; // 1000 0000
 const uint32_t utf8::PREFIX_2BYTE = 0xC0u; // 1100 0000
 const uint32_t utf8::PREFIX_3BYTE = 0xE0u; // 1110 0000
 const uint32_t utf8::PREFIX_4BYTE = 0xF0u; // 1111 0000
+const uint32_t utf8::PREFIX_5BYTE = 0xF8u; // 1111 1000
 
 const uint32_t utf8::SHIFT = 6u;
 const uint32_t utf8::MASK = 0x3Fu; // 0011 1111
@@ -61,6 +62,32 @@ uint32_t utf8::rune_to_bytes(uint32_t *str, rune c)
     return 4;
 }
 
+// this function assumes that the input has been validated
+uint32_t utf8::decode_unsafe(const char *str)
+{
+    // 1-unit sequence: 0-0x7F => 0xxxxxxx
+    const uint32_t c = (uint8_t)str[0];
+    if (c < INFIX)
+        return c;
+
+    // 2-unit sequence: 0x80-0x7FF => 110xxxxx 10xxxxxx
+    const uint32_t c1 = (uint8_t)str[1] ^ INFIX;
+    if (c < PREFIX_3BYTE)
+        return ((c << SHIFT) | c1) & MAX_2BYTE_RUNE;
+
+    // 3-unit sequence: 0x800 - 0xFFFF => 1110xxxx 10xxxxxx 10xxxxxx
+    const uint32_t c2 = (uint8_t)str[2] ^ INFIX;
+    if (c < PREFIX_4BYTE)
+        return ((((c << SHIFT) | c1) << SHIFT) | c2) & MAX_3BYTE_RUNE;
+
+    // 4-unit sequence (21-bit value): 0x10000 - 0x1FFFFF => 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+    const uint32_t c3 = (uint8_t)str[3] ^ INFIX;
+    if (c < PREFIX_5BYTE)
+        return ((((((c << SHIFT) | c1) << SHIFT) | c2) << SHIFT) | c3) & MAX_4BYTE_RUNE;
+
+    return ERROR;
+}
+
 uint32_t utf8::rune_length(rune r)
 {
     if (r <= MAX_2BYTE_RUNE)
index efb0a309b75195a55bde7b5006868efadca6b6e1..1f593e2e41cc999f790e1f62890a6bef6d53be6b 100644 (file)
@@ -29,6 +29,7 @@ public:
     static const uint32_t PREFIX_2BYTE;
     static const uint32_t PREFIX_3BYTE;
     static const uint32_t PREFIX_4BYTE;
+    static const uint32_t PREFIX_5BYTE;
 
     static const uint32_t SHIFT;
     static const uint32_t MASK;
@@ -36,6 +37,9 @@ public:
     // UTF-8 bytestring for given Unicode rune
     static uint32_t rune_to_bytes(uint32_t * s, rune r);
 
+    // read Unicode rune for the given (pre-validated) UTF-8 bytestring
+    static uint32_t decode_unsafe(const char *str);
+
     // length of UTF-8 bytestring for given Unicode rune
     static uint32_t rune_length(rune r);
 
index 83d02105a36350f33b598e263e42cf008d2d4765..5634d92f8cbdd2bdd7520b5043f54c024673640d 100644 (file)
@@ -208,13 +208,13 @@ void Warn::unreachable_rule(const std::string &cond, const Rule &rule)
     }
 }
 
-void Warn::useless_escape(const loc_t &loc, char c)
+void Warn::useless_escape(const loc_t &loc, const char *str, const char *end)
 {
     if (mask[USELESS_ESCAPE] & WARNING) {
         const bool e = mask[USELESS_ESCAPE] & ERROR;
         error_accuml |= e;
         msg.warning(names[USELESS_ESCAPE], loc, e
-            , "escape has no effect: '\\%c'", c);
+            , "escape has no effect: '%.*s'", (int)(end - str), str);
     }
 }
 
index 949bdeb233f4316b275baa9ee183880d94d316ed..90b60734d44a3fde480947d24d52dff091b32482 100644 (file)
@@ -69,7 +69,7 @@ public:
     void swapped_range(const loc_t &loc, uint32_t l, uint32_t u);
     void undefined_control_flow(const Skeleton &skel, std::vector<path_t> & paths, bool overflow);
     void unreachable_rule(const std::string & cond, const Rule &rule);
-    void useless_escape(const loc_t &loc, char c);
+    void useless_escape(const loc_t &loc, const char *str, const char *end);
 };
 
 } // namespace re2c
index 2733842b2731bc9787e5e06c662d80e1cafccf0e..a502fdce2676f91816904bd988ccc1231938945d 100644 (file)
@@ -52,6 +52,8 @@ const uint32_t NOEOF = ~0u - 1;
     CONSTOPT (bool, verbose, false) \
     /* include paths */ \
     CONSTOPT (std::vector<std::string>, incpaths, std::vector<std::string>()) \
+    /* input encoding */ \
+    CONSTOPT (Enc::type_t, input_encoding, Enc::ASCII) \
     /* internals */ \
     CONSTOPT (dfa_minimization_t, dfa_minimization, DFA_MINIMIZATION_MOORE) \
     CONSTOPT (posix_closure_t, posix_closure, POSIX_CLOSURE_GOR1) \
index db6760d563855f018a9bb7422a6fcf1c864e758c..e420536c7212b141f619d8f0944596ef71f0e692 100644 (file)
@@ -175,6 +175,7 @@ opt_long:
     "input"                 end { NEXT_ARG("--input",            opt_input); }
     "empty-class"           end { NEXT_ARG("--empty-class",      opt_empty_class); }
     "location-format"       end { NEXT_ARG("--location-format",  opt_location_format); }
+    "input-encoding"        end { NEXT_ARG("--input-encoding",   opt_input_encoding); }
 
     "single-pass"           end { goto opt; } // deprecated
 
@@ -245,6 +246,13 @@ opt_location_format:
     "msvc" end { msg.locfmt = LOCFMT_MSVC; goto opt; }
 */
 
+opt_input_encoding:
+/*!re2c
+    * { ERRARG("--input-encoding", "ascii | utf8", *argv); }
+    "ascii" end { globopts.input_encoding = Enc::ASCII; goto opt; }
+    "utf8"  end { globopts.input_encoding = Enc::UTF8;  goto opt; }
+*/
+
 opt_dfa_minimization:
 /*!re2c
     * { ERRARG("--dfa-minimization", "table | moore", *argv); }
index eb0fd56478f58c7b9c8933f5e2e941cd15de6f25..518b891ccd5414bf284fe50b7a11a17c72b31458 100644 (file)
@@ -570,15 +570,16 @@ uint32_t Scanner::lex_cls_chr()
 {
     tok = cur;
     const loc_t &loc = cur_loc();
-/*!re2c
-    *          { msg.fatal(loc, "syntax error"); }
-    eof        { fail_if_eof(); return 0; }
+    /*!rules:re2c
     esc? eol   { msg.fatal(loc, "newline in character class"); }
     esc [xXuU] { msg.fatal(loc, "syntax error in hexadecimal escape sequence"); }
     esc [0-7]  { msg.fatal(loc, "syntax error in octal escape sequence"); }
     esc        { msg.fatal(loc, "syntax error in escape sequence"); }
+    *          { msg.fatal(loc, "syntax error"); }
+
+    eof        { fail_if_eof(); return 0; }
 
-    . \ esc    { return static_cast<uint8_t>(tok[0]); }
+    . \ esc    { return decode(tok); }
     esc_hex    { return unesc_hex(tok, cur); }
     esc_oct    { return unesc_oct(tok, cur); }
     esc "a"    { return static_cast<uint8_t>('\a'); }
@@ -592,49 +593,55 @@ uint32_t Scanner::lex_cls_chr()
     esc "-"    { return static_cast<uint8_t>('-'); }
     esc "]"    { return static_cast<uint8_t>(']'); }
     esc (.\eof){
-        msg.warn.useless_escape(loc, tok[1]);
-        return static_cast<uint8_t>(tok[1]);
+        msg.warn.useless_escape(loc, tok, cur);
+        return decode(tok + 1);
+    }
+    */
+    if (globopts->input_encoding == Enc::ASCII) {
+        /*!use:re2c*/
+    }
+    else {
+        /*!use:re2c re2c:flags:8 = 1; */ /*!re2c re2c:flags:8 = 0; */
     }
-*/
 }
 
 bool Scanner::lex_str_chr(char quote, ASTChar &ast)
 {
     tok = cur;
     ast.loc = cur_loc();
-    const loc_t &loc = ast.loc;
-    bool ok = true;
-/*!re2c
-    *          { msg.fatal(loc, "syntax error"); }
-    esc? eol   { msg.fatal(loc, "newline in character string"); }
-    esc [xXuU] { msg.fatal(loc, "syntax error in hexadecimal escape sequence"); }
-    esc [0-7]  { msg.fatal(loc, "syntax error in octal escape sequence"); }
-    esc        { msg.fatal(loc, "syntax error in escape sequence"); }
 
-    eof        { fail_if_eof(); ast.chr = 0; goto end; }
-
-    . \ esc    { ok = tok[0] != quote; ast.chr = static_cast<uint8_t>(tok[0]); goto end; }
-    esc_hex    { ast.chr = unesc_hex(tok, cur); goto end; }
-    esc_oct    { ast.chr = unesc_oct(tok, cur); goto end; }
-    esc "a"    { ast.chr = static_cast<uint8_t>('\a'); goto end; }
-    esc "b"    { ast.chr = static_cast<uint8_t>('\b'); goto end; }
-    esc "f"    { ast.chr = static_cast<uint8_t>('\f'); goto end; }
-    esc "n"    { ast.chr = static_cast<uint8_t>('\n'); goto end; }
-    esc "r"    { ast.chr = static_cast<uint8_t>('\r'); goto end; }
-    esc "t"    { ast.chr = static_cast<uint8_t>('\t'); goto end; }
-    esc "v"    { ast.chr = static_cast<uint8_t>('\v'); goto end; }
-    esc "\\"   { ast.chr = static_cast<uint8_t>('\\'); goto end; }
+    /*!rules:re2c
+    esc? eol   { msg.fatal(ast.loc, "newline in character string"); }
+    esc [xXuU] { msg.fatal(ast.loc, "syntax error in hexadecimal escape sequence"); }
+    esc [0-7]  { msg.fatal(ast.loc, "syntax error in octal escape sequence"); }
+    esc        { msg.fatal(ast.loc, "syntax error in escape sequence"); }
+    *          { msg.fatal(ast.loc, "syntax error"); }
+
+    eof        { fail_if_eof(); ast.chr = 0; return true; }
+
+    . \ esc    { ast.chr = decode(tok); return tok[0] != quote; }
+    esc_hex    { ast.chr = unesc_hex(tok, cur); return true; }
+    esc_oct    { ast.chr = unesc_oct(tok, cur); return true; }
+    esc "a"    { ast.chr = static_cast<uint8_t>('\a'); return true; }
+    esc "b"    { ast.chr = static_cast<uint8_t>('\b'); return true; }
+    esc "f"    { ast.chr = static_cast<uint8_t>('\f'); return true; }
+    esc "n"    { ast.chr = static_cast<uint8_t>('\n'); return true; }
+    esc "r"    { ast.chr = static_cast<uint8_t>('\r'); return true; }
+    esc "t"    { ast.chr = static_cast<uint8_t>('\t'); return true; }
+    esc "v"    { ast.chr = static_cast<uint8_t>('\v'); return true; }
+    esc "\\"   { ast.chr = static_cast<uint8_t>('\\'); return true; }
     esc (.\eof){
-        const char c = tok[1];
-        ast.chr = static_cast<uint8_t>(c);
-        if (tok[1] != quote) {
-            msg.warn.useless_escape(loc, c);
-        }
-        goto end;
+        ast.chr = decode(tok + 1);
+        if (tok[1] != quote) msg.warn.useless_escape(ast.loc, tok, cur);
+        return true;
+    }
+    */
+    if (globopts->input_encoding == Enc::ASCII) {
+        /*!use:re2c*/
+    }
+    else {
+        /*!use:re2c re2c:flags:8 = 1; */ /*!re2c re2c:flags:8 = 0; */
     }
-*/
-end:
-    return ok;
 }
 
 const AST *Scanner::lex_str(char quote)
index edd455c32ac22a847289ea1ecb76c6f13f2ac648..051e80adbcc3752953c91b276ce92b36c5aad94f 100644 (file)
@@ -13,6 +13,7 @@
 #include "src/parse/lex.h"
 #include "src/options/opt.h"
 #include "src/encoding/enc.h"
+#include "src/encoding/utf8/utf8.h"
 #include "src/util/attribute.h"
 #include "src/util/forbid_copy.h"
 
@@ -87,6 +88,7 @@ private:
     std::string lex_conf_string();
     bool is_eof() const;
     void fail_if_eof() const;
+    uint32_t decode(const char *str) const;
 
     FORBID_COPY (Scanner);
 };
@@ -142,6 +144,13 @@ inline const Input& Scanner::get_cinput() const
     return *files[get_input_index()];
 }
 
+inline uint32_t Scanner::decode(const char *str) const
+{
+    return globopts->input_encoding == Enc::ASCII
+        ? static_cast<uint8_t>(str[0])
+        : utf8::decode_unsafe(str);
+}
+
 } // end namespace re2c
 
 #endif // _RE2C_AST_SCANNER_
diff --git a/test/encodings/utf8_literals.i8--input-encoding(utf8).c b/test/encodings/utf8_literals.i8--input-encoding(utf8).c
new file mode 100644 (file)
index 0000000..dec2a58
--- /dev/null
@@ -0,0 +1,292 @@
+/* Generated by re2c */
+#include <assert.h>
+
+int lex(const char *YYCURSOR)
+{
+#define YYCTYPE unsigned char
+    const char *YYMARKER;
+
+    
+{
+       YYCTYPE yych;
+       yych = *YYCURSOR;
+       switch (yych) {
+       case 0xD0:      goto yy4;
+       case 0xD1:      goto yy5;
+       default:        goto yy2;
+       }
+yy2:
+       ++YYCURSOR;
+yy3:
+       { return -1; }
+yy4:
+       yych = *(YYMARKER = ++YYCURSOR);
+       switch (yych) {
+       case 0x90:      goto yy6;
+       case 0x9C:      goto yy8;
+       case 0xA1:      goto yy9;
+       case 0xA3:      goto yy10;
+       default:        goto yy3;
+       }
+yy5:
+       yych = *(YYMARKER = ++YYCURSOR);
+       switch (yych) {
+       case 0x81:      goto yy9;
+       default:        goto yy3;
+       }
+yy6:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xD0:      goto yy11;
+       default:        goto yy7;
+       }
+yy7:
+       YYCURSOR = YYMARKER;
+       goto yy3;
+yy8:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xD0:      goto yy12;
+       default:        goto yy7;
+       }
+yy9:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xD0:      goto yy13;
+       default:        goto yy7;
+       }
+yy10:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xD0:      goto yy14;
+       default:        goto yy7;
+       }
+yy11:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xBD:      goto yy15;
+       default:        goto yy7;
+       }
+yy12:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xB0:      goto yy16;
+       default:        goto yy7;
+       }
+yy13:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xB5:      goto yy17;
+       default:        goto yy7;
+       }
+yy14:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xBB:      goto yy18;
+       default:        goto yy7;
+       }
+yy15:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xD1:      goto yy19;
+       default:        goto yy7;
+       }
+yy16:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xD1:      goto yy20;
+       default:        goto yy7;
+       }
+yy17:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xD1:      goto yy21;
+       default:        goto yy7;
+       }
+yy18:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xD1:      goto yy22;
+       default:        goto yy7;
+       }
+yy19:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0x8F:      goto yy23;
+       default:        goto yy7;
+       }
+yy20:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0x88:      goto yy24;
+       default:        goto yy7;
+       }
+yy21:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0x80:      goto yy25;
+       default:        goto yy7;
+       }
+yy22:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0x8F:      goto yy26;
+       default:        goto yy7;
+       }
+yy23:
+       yych = *++YYCURSOR;
+       if (yych <= 0x00) goto yy27;
+       goto yy7;
+yy24:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xD0:      goto yy29;
+       default:        goto yy7;
+       }
+yy25:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xD0:      goto yy30;
+       default:        goto yy7;
+       }
+yy26:
+       yych = *++YYCURSOR;
+       if (yych <= 0x00) goto yy31;
+       goto yy7;
+yy27:
+       ++YYCURSOR;
+       { return 3; }
+yy29:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xB0:      goto yy33;
+       default:        goto yy7;
+       }
+yy30:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xB3:      goto yy34;
+       default:        goto yy7;
+       }
+yy31:
+       ++YYCURSOR;
+       { return 2; }
+yy33:
+       yych = *++YYCURSOR;
+       if (yych <= 0x00) goto yy35;
+       goto yy7;
+yy34:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xD0:      goto yy37;
+       default:        goto yy7;
+       }
+yy35:
+       ++YYCURSOR;
+       { return 1; }
+yy37:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xB5:      goto yy38;
+       default:        goto yy7;
+       }
+yy38:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0xD0:      goto yy39;
+       case 0xD1:      goto yy40;
+       default:        goto yy7;
+       }
+yy39:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0x90:
+       case 0x91:
+       case 0x92:
+       case 0x93:
+       case 0x94:
+       case 0x95:
+       case 0x96:
+       case 0x97:
+       case 0x98:
+       case 0x99:
+       case 0x9A:
+       case 0x9B:
+       case 0x9C:
+       case 0x9D:
+       case 0x9E:
+       case 0x9F:
+       case 0xA0:
+       case 0xA1:
+       case 0xA2:
+       case 0xA3:
+       case 0xA4:
+       case 0xA5:
+       case 0xA6:
+       case 0xA7:
+       case 0xA8:
+       case 0xA9:
+       case 0xAA:
+       case 0xAB:
+       case 0xAC:
+       case 0xAD:
+       case 0xAE:
+       case 0xAF:
+       case 0xB0:
+       case 0xB1:
+       case 0xB2:
+       case 0xB3:
+       case 0xB4:
+       case 0xB5:
+       case 0xB6:
+       case 0xB7:
+       case 0xB8:
+       case 0xB9:
+       case 0xBA:
+       case 0xBB:
+       case 0xBC:
+       case 0xBD:
+       case 0xBE:
+       case 0xBF:      goto yy41;
+       default:        goto yy7;
+       }
+yy40:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case 0x80:
+       case 0x81:
+       case 0x82:
+       case 0x83:
+       case 0x84:
+       case 0x85:
+       case 0x86:
+       case 0x87:
+       case 0x88:
+       case 0x89:
+       case 0x8A:
+       case 0x8B:
+       case 0x8C:
+       case 0x8D:
+       case 0x8E:
+       case 0x8F:      goto yy41;
+       default:        goto yy7;
+       }
+yy41:
+       yych = *++YYCURSOR;
+       if (yych >= 0x01) goto yy7;
+       ++YYCURSOR;
+       { return 0; }
+}
+
+}
+
+int main()
+{
+    assert(lex("Аня") == 3);
+    assert(lex("Маша") == 1);
+    assert(lex("Уля") == 2);
+    assert(lex("Сергей") == 0);
+    assert(lex("Сергеы") == 0);
+    assert(lex("сергеЫ") == 0);
+    return 0;
+}
diff --git a/test/encodings/utf8_literals.i8--input-encoding(utf8).re b/test/encodings/utf8_literals.i8--input-encoding(utf8).re
new file mode 100644 (file)
index 0000000..d003ac8
--- /dev/null
@@ -0,0 +1,32 @@
+#include <assert.h>
+
+int lex(const char *YYCURSOR)
+{
+#define YYCTYPE unsigned char
+    const char *YYMARKER;
+
+    /*!re2c
+    re2c:yyfill:enable = 0;
+
+    end = "\x00";
+
+    "Аня"  end { return 3; }
+    "Маша" end { return 1; }
+    "Уля"  end { return 2; }
+
+    [Сс] "ерге" [а-яА-Я] end { return 0; }
+
+    * { return -1; }
+    */
+}
+
+int main()
+{
+    assert(lex("Аня") == 3);
+    assert(lex("Маша") == 1);
+    assert(lex("Уля") == 2);
+    assert(lex("Сергей") == 0);
+    assert(lex("Сергеы") == 0);
+    assert(lex("сергеЫ") == 0);
+    return 0;
+}