]> granicus.if.org Git - re2c/commitdiff
- Implemented #1187127 savable state support for multiple re2c blocks.
authorhelly <helly@642ea486-5414-0410-9d7f-a0204ed87703>
Sat, 8 Apr 2006 21:21:42 +0000 (21:21 +0000)
committerhelly <helly@642ea486-5414-0410-9d7f-a0204ed87703>
Sat, 8 Apr 2006 21:21:42 +0000 (21:21 +0000)
CHANGELOG
code.cc
globals.h
main.cc
test/scanner.fs.c

index 6c3de5610c916b8ad70354fed0d1b6a3706caa8b..3bab6db337ffbac715dfbb32cf0cec0ee824c50e 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -2,8 +2,9 @@ Version 0.10.2 (????-??-??)
 ---------------------------
 - Change to not generate yyaccept code unless needed.
 - Change to use if- instead of switch-expression when yyaccpt has only one case.
-- Fixed #1463639 Missing forward declaration
 - Added docu, examples and tests to .src.zip package (0.10.1 zip was repackaged).
+- Fixed #1463639 Missing forward declaration.
+- Implemented #1187127 savable state support for multiple re2c blocks.
 
 Version 0.10.1 (2006-02-28)
 ---------------------------
diff --git a/code.cc b/code.cc
index 82d541bed7b39fa8d69edadb5c870c28bec1dd8b..cc3e0b5edbded6f965d46cb526190c3a86e37d10 100644 (file)
--- a/code.cc
+++ b/code.cc
@@ -293,12 +293,11 @@ void genIf(std::ostream &o, uint ind, const char *cmp, uint v, bool &readCh)
 
 static void need(std::ostream &o, uint ind, uint n, bool & readCh)
 {
-       uint fillIndex = vFillIndexes;
-       bool hasFillIndex = (0<=vFillIndexes);
+       uint fillIndex = next_fill_index;
 
-       if (hasFillIndex)
+       if (fFlag)
        {
-               vFillIndexes++;
+               next_fill_index++;
                o << indent(ind) << "YYSETSTATE(" << fillIndex << ");\n";
        }
 
@@ -311,7 +310,7 @@ static void need(std::ostream &o, uint ind, uint n, bool & readCh)
                o << indent(ind) << "if((YYLIMIT - YYCURSOR) < " << n << ") YYFILL(" << n << ");\n";
        }
 
-       if ( hasFillIndex == true )
+       if (fFlag)
        {
                o << "yyFillLabel" << fillIndex << ":\n";
        }
@@ -1198,19 +1197,9 @@ void DFA::findBaseState()
 
 void DFA::emit(std::ostream &o, uint ind)
 {
-       static uint label = 0;
        State *s;
        uint i, bitmap_brace = 0;
 
-       bool hasFillLabels = (0<=vFillIndexes);
-       if (hasFillLabels==true && label!=0)
-       {
-               o.flush();
-               std::cerr << "re2c: error: multiple /*!re2c blocks aren't supported when -f is specified\n";
-               exit(1);
-       }
-
-
        findSCCs();
        head->link = head;
 
@@ -1342,9 +1331,9 @@ void DFA::emit(std::ostream &o, uint ind)
 
        bUsedYYAccept = false;
        
-       uint start_label = label;
+       uint start_label = next_label;
 
-       (void) new Initial(head, label++);
+       (void) new Initial(head, next_label++);
 
        if (bUseStartLabel)
        {
@@ -1356,12 +1345,12 @@ void DFA::emit(std::ostream &o, uint ind)
 
        for (s = head; s; s = s->next)
        {
-               s->label = label++;
+               s->label = next_label++;
        }
 
-       // Save 'vFillIndexes' and compute information about code generation
+       // Save 'next_fill_index' and compute information about code generation
        // while writing to null device.
-       uint orgVFillIndexes = vFillIndexes;
+       uint save_fill_index = next_fill_index;
        null_stream  null_dev;
 
        for (s = head; s; s = s->next)
@@ -1370,13 +1359,16 @@ void DFA::emit(std::ostream &o, uint ind)
                s->emit(null_dev, ind, readCh);
                s->go.genGoto(null_dev, ind, s, s->next, readCh);
        }
-       uint maxFillIndexes = vFillIndexes;
-       vFillIndexes = orgVFillIndexes;
+       if (last_fill_index < next_fill_index)
+       {
+               last_fill_index = next_fill_index;
+       }
+       next_fill_index = save_fill_index;
 
        // Generate prolog
        o << "\n" << outputFileInfo;
 
-       if (hasFillLabels == false)
+       if (!fFlag)
        {
                o << indent(ind++) << "{\n";
                o << indent(ind) << "YYCTYPE yych;\n";
@@ -1390,14 +1382,14 @@ void DFA::emit(std::ostream &o, uint ind)
                o << indent(ind++) << "{\n\n";
        }
 
-       if (hasFillLabels == true)
+       if (fFlag && start_label == 0)
        {
                vUsedLabels.insert(start_label);
                o << indent(ind) << "switch(YYGETSTATE())\n";
                o << indent(ind) << "{\n";
                o << indent(ind) << "case -1: goto yy" << start_label << ";\n";
 
-               for (size_t i=0; i<maxFillIndexes; ++i)
+               for (size_t i=0; i<last_fill_index; ++i)
                {
                        o << indent(ind) << "case " << i << ": goto yyFillLabel" << i << ";\n";
                }
index d77b7babb6d45ead0a83f4a46bd609e1d51b283f..bc35c255e67d18d032959ee87a7bbe5931f56dbb 100644 (file)
--- a/globals.h
+++ b/globals.h
@@ -17,6 +17,7 @@ extern file_info outputFileInfo;
 extern bool bFlag;
 extern bool dFlag;
 extern bool eFlag;
+extern bool fFlag;
 extern bool iFlag;
 extern bool sFlag;
 extern bool wFlag;
@@ -25,6 +26,7 @@ extern bool bUsedYYAccept;
 extern bool bUseStartLabel;
 extern std::string startLabelName;
 extern uint maxFill;
+extern uint next_label;
 
 /* configurations */
 extern uint topIndent;
@@ -36,7 +38,8 @@ extern uint ebc2asc[256];
 
 extern uint *xlat, *talx;
 
-extern int vFillIndexes;
+extern uint next_fill_index;
+extern uint last_fill_index;
 extern std::set<uint> vUsedLabels;
 
 extern uint nRealChars;
diff --git a/main.cc b/main.cc
index 98e8a481eb90a214febc03f59979a1a50c2a11d5..7cc8161ffa9b21ea1ff116f6e7626e1044a42c6c 100644 (file)
--- a/main.cc
+++ b/main.cc
@@ -24,6 +24,7 @@ file_info outputFileInfo;
 bool bFlag = false;
 bool dFlag = false;
 bool eFlag = false;
+bool fFlag = false;
 bool iFlag = false;
 bool sFlag = false;
 bool wFlag = false;
@@ -32,6 +33,7 @@ bool bUsedYYAccept = false;
 bool bUseStartLabel= false;
 std::string startLabelName;
 uint maxFill = 1;
+uint next_label = 0;
 
 uint topIndent = 0;
 std::string indString("\t");
@@ -39,7 +41,8 @@ bool yybmHexTable = false;
 
 uint nRealChars = 256;
 
-int vFillIndexes = -1;
+uint next_fill_index = 0;
+uint last_fill_index = 0;
 std::set<uint> vUsedLabels;
 
 using namespace std;
@@ -141,7 +144,7 @@ int main(int argc, char *argv[])
                        break;
 
                        case 'f':
-                       vFillIndexes = 0;
+                       fFlag = true;
                        break;
 
                        case 'i':
@@ -212,6 +215,11 @@ int main(int argc, char *argv[])
 
        if (sourceFileName[0] == '-' && sourceFileName[1] == '\0')
        {
+               if (fFlag)
+               {
+                       std::cerr << "re2c: error: multiple /*!re2c stdin is not acceptable when -f is specified\n";
+                       return 1;
+               }
                sourceFileName = "<stdin>";
                source.open(stdin);
        }
@@ -238,6 +246,24 @@ int main(int argc, char *argv[])
        sourceFileInfo = file_info(sourceFileName, &scanner);
        outputFileInfo = file_info(outputFileName, &output);
 
+       if (fFlag)
+       {
+               re2c::ifstream_lc null_source;
+
+               if (!null_source.open(sourceFileName).is_open())
+               {
+                       cerr << "re2c: error: cannot re-open " << sourceFileName << "\n";
+                       return 1;
+               }
+
+               null_stream  null_dev;
+               Scanner null_scanner(null_source, null_dev);
+               parse(null_scanner, null_dev);
+               next_label = 0;
+               next_fill_index = 0;
+               Symbol::ClearTable();
+       }
+
        parse(scanner, output);
        return 0;
 }
index 111dd695ebebc8d8d9579288ee0dd4b8f8343b88..511bed64b013efadcb1feef88a13ca4f1c6a131f 100755 (executable)
@@ -99,6 +99,41 @@ echo:
        {
        case -1: goto yy0;
        case 0: goto yyFillLabel0;
+       case 1: goto yyFillLabel1;
+       case 2: goto yyFillLabel2;
+       case 3: goto yyFillLabel3;
+       case 4: goto yyFillLabel4;
+       case 5: goto yyFillLabel5;
+       case 6: goto yyFillLabel6;
+       case 7: goto yyFillLabel7;
+       case 8: goto yyFillLabel8;
+       case 9: goto yyFillLabel9;
+       case 10: goto yyFillLabel10;
+       case 11: goto yyFillLabel11;
+       case 12: goto yyFillLabel12;
+       case 13: goto yyFillLabel13;
+       case 14: goto yyFillLabel14;
+       case 15: goto yyFillLabel15;
+       case 16: goto yyFillLabel16;
+       case 17: goto yyFillLabel17;
+       case 18: goto yyFillLabel18;
+       case 19: goto yyFillLabel19;
+       case 20: goto yyFillLabel20;
+       case 21: goto yyFillLabel21;
+       case 22: goto yyFillLabel22;
+       case 23: goto yyFillLabel23;
+       case 24: goto yyFillLabel24;
+       case 25: goto yyFillLabel25;
+       case 26: goto yyFillLabel26;
+       case 27: goto yyFillLabel27;
+       case 28: goto yyFillLabel28;
+       case 29: goto yyFillLabel29;
+       case 30: goto yyFillLabel30;
+       case 31: goto yyFillLabel31;
+       case 32: goto yyFillLabel32;
+       case 33: goto yyFillLabel33;
+       case 34: goto yyFillLabel34;
+       case 35: goto yyFillLabel35;
        default: /* abort() */;
        }
 yyNext:
@@ -122,7 +157,7 @@ yy3:
        {
                                        goto echo;
                                }
-#line 126 "<stdout>"
+#line 161 "<stdout>"
 yy4:
        yych = *++YYCURSOR;
        if(yych == '/') goto yy10;
@@ -135,7 +170,7 @@ yy5:
                                        tok = pos = cursor; cline++;
                                        goto echo;
                                }
-#line 139 "<stdout>"
+#line 174 "<stdout>"
 yy7:
        ++YYCURSOR;
 #line 135 "scanner.fs.re"
@@ -145,7 +180,7 @@ yy7:
                                                RETURN(0);
                                        }
                                }
-#line 149 "<stdout>"
+#line 184 "<stdout>"
 yy9:
        yych = *++YYCURSOR;
        goto yy3;
@@ -161,7 +196,7 @@ yy10:
                                        tok = pos = cursor;
                                        goto echo;
                                }
-#line 165 "<stdout>"
+#line 200 "<stdout>"
 yy12:
        yych = *++YYCURSOR;
        if(yych == '!') goto yy14;
@@ -191,7 +226,7 @@ yy16:
                                        tok = cursor;
                                        RETURN(1);
                                }
-#line 195 "<stdout>"
+#line 230 "<stdout>"
 yy21:
        yych = *++YYCURSOR;
        if(yych != 'x') goto yy13;
@@ -213,7 +248,7 @@ yy21:
                                        ignore_eoc = true;
                                        goto echo;
                                }
-#line 217 "<stdout>"
+#line 252 "<stdout>"
 }
 #line 144 "scanner.fs.re"
 
@@ -237,4 +272,984 @@ scan:
        {
                goto value;
     }
-re2c: error: multiple /*!re2c blocks aren't supported when -f is specified
+
+#line 277 "<stdout>"
+{
+
+       YYSETSTATE(1);
+       if((YYLIMIT - YYCURSOR) < 5) YYFILL(5);
+yyFillLabel1:
+       yych = *YYCURSOR;
+       if(yych <= '/') {
+               if(yych <= '!') {
+                       if(yych <= 0x0C) {
+                               if(yych <= 0x08) goto yy56;
+                               if(yych <= 0x09) goto yy50;
+                               if(yych <= 0x0A) goto yy52;
+                               goto yy56;
+                       } else {
+                               if(yych <= 0x0D) goto yy54;
+                               if(yych == ' ') goto yy50;
+                               goto yy56;
+                       }
+               } else {
+                       if(yych <= ')') {
+                               if(yych <= '"') goto yy37;
+                               if(yych <= '&') goto yy56;
+                               if(yych <= '\'') goto yy39;
+                               goto yy43;
+                       } else {
+                               if(yych <= '+') {
+                                       if(yych <= '*') goto yy35;
+                                       goto yy44;
+                               } else {
+                                       if(yych <= '-') goto yy56;
+                                       if(yych <= '.') goto yy48;
+                                       goto yy33;
+                               }
+                       }
+               }
+       } else {
+               if(yych <= 'Z') {
+                       if(yych <= '=') {
+                               if(yych == ';') goto yy43;
+                               if(yych <= '<') goto yy56;
+                               goto yy43;
+                       } else {
+                               if(yych == '?') goto yy44;
+                               if(yych <= '@') goto yy56;
+                               goto yy47;
+                       }
+               } else {
+                       if(yych <= 'q') {
+                               if(yych <= '[') goto yy41;
+                               if(yych <= '\\') goto yy43;
+                               if(yych <= '`') goto yy56;
+                               goto yy47;
+                       } else {
+                               if(yych <= 'z') {
+                                       if(yych <= 'r') goto yy45;
+                                       goto yy47;
+                               } else {
+                                       if(yych <= '{') goto yy31;
+                                       if(yych <= '|') goto yy43;
+                                       goto yy56;
+                               }
+                       }
+               }
+       }
+yy31:
+       yyaccept = 0;
+       yych = *(YYMARKER = ++YYCURSOR);
+       if(yych <= '/') {
+               if(yych == ',') goto yy97;
+       } else {
+               if(yych <= '0') goto yy94;
+               if(yych <= '9') goto yy95;
+       }
+yy32:
+#line 166 "scanner.fs.re"
+       { depth = 1;
+                                 goto code;
+                               }
+#line 356 "<stdout>"
+yy33:
+       ++YYCURSOR;
+       if((yych = *YYCURSOR) == '*') goto yy92;
+yy34:
+#line 196 "scanner.fs.re"
+       { RETURN(*tok); }
+#line 363 "<stdout>"
+yy35:
+       ++YYCURSOR;
+       if((yych = *YYCURSOR) == '/') goto yy90;
+yy36:
+#line 198 "scanner.fs.re"
+       { yylval.op = *tok;
+                                 RETURN(CLOSE); }
+#line 371 "<stdout>"
+yy37:
+       yyaccept = 1;
+       yych = *(YYMARKER = ++YYCURSOR);
+       if(yych != 0x0A) goto yy86;
+yy38:
+#line 183 "scanner.fs.re"
+       { fatal("unterminated string constant (missing \")"); }
+#line 379 "<stdout>"
+yy39:
+       yyaccept = 2;
+       yych = *(YYMARKER = ++YYCURSOR);
+       if(yych != 0x0A) goto yy81;
+yy40:
+#line 184 "scanner.fs.re"
+       { fatal("unterminated string constant (missing ')"); }
+#line 387 "<stdout>"
+yy41:
+       yyaccept = 3;
+       yych = *(YYMARKER = ++YYCURSOR);
+       if(yych == 0x0A) goto yy42;
+       if(yych == '^') goto yy72;
+       goto yy71;
+yy42:
+#line 194 "scanner.fs.re"
+       { fatal("unterminated range (missing ])"); }
+#line 397 "<stdout>"
+yy43:
+       yych = *++YYCURSOR;
+       goto yy34;
+yy44:
+       yych = *++YYCURSOR;
+       goto yy36;
+yy45:
+       ++YYCURSOR;
+       if((yych = *YYCURSOR) == 'e') goto yy62;
+       goto yy61;
+yy46:
+#line 225 "scanner.fs.re"
+       { cur = cursor;
+                                 yylval.symbol = Symbol::find(token());
+                                 return ID; }
+#line 413 "<stdout>"
+yy47:
+       yych = *++YYCURSOR;
+       goto yy61;
+yy48:
+       ++YYCURSOR;
+#line 229 "scanner.fs.re"
+       { cur = cursor;
+                                 yylval.regexp = mkDot();
+                                 return RANGE;
+                               }
+#line 424 "<stdout>"
+yy50:
+       ++YYCURSOR;
+       yych = *YYCURSOR;
+       goto yy59;
+yy51:
+#line 234 "scanner.fs.re"
+       { goto scan; }
+#line 432 "<stdout>"
+yy52:
+       ++YYCURSOR;
+yy53:
+#line 236 "scanner.fs.re"
+       { if(cursor == eof) RETURN(0);
+                                 pos = cursor; cline++;
+                                 goto scan;
+                               }
+#line 441 "<stdout>"
+yy54:
+       ++YYCURSOR;
+       if((yych = *YYCURSOR) == 0x0A) goto yy57;
+yy55:
+#line 241 "scanner.fs.re"
+       { std::ostringstream msg;
+                                 msg << "unexpected character: ";
+                                 prtChOrHex(msg, *tok);
+                                 fatal(msg.str().c_str());
+                                 goto scan;
+                               }
+#line 453 "<stdout>"
+yy56:
+       yych = *++YYCURSOR;
+       goto yy55;
+yy57:
+       yych = *++YYCURSOR;
+       goto yy53;
+yy58:
+       ++YYCURSOR;
+       YYSETSTATE(2);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel2:
+       yych = *YYCURSOR;
+yy59:
+       if(yych == 0x09) goto yy58;
+       if(yych == ' ') goto yy58;
+       goto yy51;
+yy60:
+       ++YYCURSOR;
+       YYSETSTATE(3);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel3:
+       yych = *YYCURSOR;
+yy61:
+       if(yych <= '@') {
+               if(yych <= '/') goto yy46;
+               if(yych <= '9') goto yy60;
+               goto yy46;
+       } else {
+               if(yych <= 'Z') goto yy60;
+               if(yych <= '`') goto yy46;
+               if(yych <= 'z') goto yy60;
+               goto yy46;
+       }
+yy62:
+       yych = *++YYCURSOR;
+       if(yych != '2') goto yy61;
+       yych = *++YYCURSOR;
+       if(yych != 'c') goto yy61;
+       yyaccept = 4;
+       yych = *(YYMARKER = ++YYCURSOR);
+       if(yych != ':') goto yy61;
+yy65:
+       ++YYCURSOR;
+       YYSETSTATE(4);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel4:
+       yych = *YYCURSOR;
+       if(yych <= '@') goto yy66;
+       if(yych <= 'Z') goto yy67;
+       if(yych <= '`') goto yy66;
+       if(yych <= 'z') goto yy67;
+yy66:
+       YYCURSOR = YYMARKER;
+       switch(yyaccept) {
+       case 0: goto yy32;
+       case 1: goto yy38;
+       case 2: goto yy40;
+       case 3: goto yy42;
+       case 6: goto yy98;
+       case 5: goto yy69;
+       case 4: goto yy46;
+       }
+yy67:
+       yyaccept = 5;
+       YYMARKER = ++YYCURSOR;
+       YYSETSTATE(5);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel5:
+       yych = *YYCURSOR;
+       if(yych <= 'Z') {
+               if(yych <= '9') {
+                       if(yych >= '0') goto yy67;
+               } else {
+                       if(yych <= ':') goto yy65;
+                       if(yych >= 'A') goto yy67;
+               }
+       } else {
+               if(yych <= '_') {
+                       if(yych >= '_') goto yy67;
+               } else {
+                       if(yych <= '`') goto yy69;
+                       if(yych <= 'z') goto yy67;
+               }
+       }
+yy69:
+#line 218 "scanner.fs.re"
+       { cur = cursor;
+                                 tok+= 5; /* skip "re2c:" */
+                                 iscfg = 1;
+                                 yylval.str = new Str(token());
+                                 return CONFIG;
+                               }
+#line 546 "<stdout>"
+yy70:
+       ++YYCURSOR;
+       YYSETSTATE(6);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel6:
+       yych = *YYCURSOR;
+yy71:
+       if(yych <= '[') {
+               if(yych == 0x0A) goto yy66;
+               goto yy70;
+       } else {
+               if(yych <= '\\') goto yy74;
+               if(yych <= ']') goto yy75;
+               goto yy70;
+       }
+yy72:
+       ++YYCURSOR;
+       YYSETSTATE(7);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel7:
+       yych = *YYCURSOR;
+       if(yych <= '[') {
+               if(yych == 0x0A) goto yy66;
+               goto yy72;
+       } else {
+               if(yych <= '\\') goto yy77;
+               if(yych <= ']') goto yy78;
+               goto yy72;
+       }
+yy74:
+       ++YYCURSOR;
+       YYSETSTATE(8);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel8:
+       yych = *YYCURSOR;
+       if(yych == 0x0A) goto yy66;
+       goto yy70;
+yy75:
+       ++YYCURSOR;
+#line 190 "scanner.fs.re"
+       { cur = cursor;
+                                 yylval.regexp = ranToRE(token());
+                                 return RANGE; }
+#line 590 "<stdout>"
+yy77:
+       ++YYCURSOR;
+       YYSETSTATE(9);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel9:
+       yych = *YYCURSOR;
+       if(yych == 0x0A) goto yy66;
+       goto yy72;
+yy78:
+       ++YYCURSOR;
+#line 186 "scanner.fs.re"
+       { cur = cursor;
+                                 yylval.regexp = invToRE(token());
+                                 return RANGE; }
+#line 605 "<stdout>"
+yy80:
+       ++YYCURSOR;
+       YYSETSTATE(10);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel10:
+       yych = *YYCURSOR;
+yy81:
+       if(yych <= '&') {
+               if(yych == 0x0A) goto yy66;
+               goto yy80;
+       } else {
+               if(yych <= '\'') goto yy83;
+               if(yych != '\\') goto yy80;
+       }
+       ++YYCURSOR;
+       YYSETSTATE(11);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel11:
+       yych = *YYCURSOR;
+       if(yych == 0x0A) goto yy66;
+       goto yy80;
+yy83:
+       ++YYCURSOR;
+#line 179 "scanner.fs.re"
+       { cur = cursor;
+                                 yylval.regexp = strToCaseInsensitiveRE(token());
+                                 return STRING; }
+#line 633 "<stdout>"
+yy85:
+       ++YYCURSOR;
+       YYSETSTATE(12);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel12:
+       yych = *YYCURSOR;
+yy86:
+       if(yych <= '!') {
+               if(yych == 0x0A) goto yy66;
+               goto yy85;
+       } else {
+               if(yych <= '"') goto yy88;
+               if(yych != '\\') goto yy85;
+       }
+       ++YYCURSOR;
+       YYSETSTATE(13);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel13:
+       yych = *YYCURSOR;
+       if(yych == 0x0A) goto yy66;
+       goto yy85;
+yy88:
+       ++YYCURSOR;
+#line 175 "scanner.fs.re"
+       { cur = cursor;
+                                 yylval.regexp = strToRE(token());
+                                 return STRING; }
+#line 661 "<stdout>"
+yy90:
+       ++YYCURSOR;
+#line 172 "scanner.fs.re"
+       { tok = cursor;
+                                 RETURN(0); }
+#line 667 "<stdout>"
+yy92:
+       ++YYCURSOR;
+#line 169 "scanner.fs.re"
+       { depth = 1;
+                                 goto comment; }
+#line 673 "<stdout>"
+yy94:
+       yych = *++YYCURSOR;
+       if(yych == ',') goto yy108;
+       goto yy96;
+yy95:
+       ++YYCURSOR;
+       YYSETSTATE(14);
+       if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+yyFillLabel14:
+       yych = *YYCURSOR;
+yy96:
+       if(yych <= '/') {
+               if(yych == ',') goto yy101;
+               goto yy66;
+       } else {
+               if(yych <= '9') goto yy95;
+               if(yych == '}') goto yy99;
+               goto yy66;
+       }
+yy97:
+       ++YYCURSOR;
+yy98:
+#line 216 "scanner.fs.re"
+       { fatal("illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers"); }
+#line 698 "<stdout>"
+yy99:
+       ++YYCURSOR;
+#line 204 "scanner.fs.re"
+       { yylval.extop.minsize = atoi((char *)tok+1);
+                                 yylval.extop.maxsize = atoi((char *)tok+1);
+                                 RETURN(CLOSESIZE); }
+#line 705 "<stdout>"
+yy101:
+       yyaccept = 6;
+       yych = *(YYMARKER = ++YYCURSOR);
+       if(yych <= '/') goto yy98;
+       if(yych <= '9') goto yy104;
+       if(yych != '}') goto yy98;
+       ++YYCURSOR;
+#line 212 "scanner.fs.re"
+       { yylval.extop.minsize = atoi((char *)tok+1);
+                                 yylval.extop.maxsize = -1;
+                                 RETURN(CLOSESIZE); }
+#line 717 "<stdout>"
+yy104:
+       ++YYCURSOR;
+       YYSETSTATE(15);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel15:
+       yych = *YYCURSOR;
+       if(yych <= '/') goto yy66;
+       if(yych <= '9') goto yy104;
+       if(yych != '}') goto yy66;
+       ++YYCURSOR;
+#line 208 "scanner.fs.re"
+       { yylval.extop.minsize = atoi((char *)tok+1);
+                                 yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)tok, ',')+1));
+                                 RETURN(CLOSESIZE); }
+#line 732 "<stdout>"
+yy108:
+       yyaccept = 6;
+       yych = *(YYMARKER = ++YYCURSOR);
+       if(yych <= '/') goto yy98;
+       if(yych <= '9') goto yy104;
+       if(yych != '}') goto yy98;
+       ++YYCURSOR;
+#line 201 "scanner.fs.re"
+       { yylval.op = '*';
+                                 RETURN(CLOSE); }
+#line 743 "<stdout>"
+}
+#line 247 "scanner.fs.re"
+
+
+code:
+
+#line 750 "<stdout>"
+{
+
+       YYSETSTATE(16);
+       if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+yyFillLabel16:
+       yych = *YYCURSOR;
+       if(yych <= '&') {
+               if(yych <= 0x0A) {
+                       if(yych <= 0x09) goto yy119;
+                       goto yy117;
+               } else {
+                       if(yych == '"') goto yy121;
+                       goto yy119;
+               }
+       } else {
+               if(yych <= '{') {
+                       if(yych <= '\'') goto yy122;
+                       if(yych <= 'z') goto yy119;
+                       goto yy115;
+               } else {
+                       if(yych != '}') goto yy119;
+               }
+       }
+       ++YYCURSOR;
+#line 251 "scanner.fs.re"
+       { if(--depth == 0){
+                                       cur = cursor;
+                                       yylval.token = new Token(token(), tline);
+                                       return CODE;
+                                 }
+                                 goto code; }
+#line 782 "<stdout>"
+yy115:
+       ++YYCURSOR;
+#line 257 "scanner.fs.re"
+       { ++depth;
+                                 goto code; }
+#line 788 "<stdout>"
+yy117:
+       ++YYCURSOR;
+#line 259 "scanner.fs.re"
+       { if(cursor == eof) fatal("missing '}'");
+                                 pos = cursor; cline++;
+                                 goto code;
+                               }
+#line 796 "<stdout>"
+yy119:
+       ++YYCURSOR;
+yy120:
+#line 263 "scanner.fs.re"
+       { goto code; }
+#line 802 "<stdout>"
+yy121:
+       yych = *(YYMARKER = ++YYCURSOR);
+       if(yych == 0x0A) goto yy120;
+       goto yy128;
+yy122:
+       yych = *(YYMARKER = ++YYCURSOR);
+       if(yych == 0x0A) goto yy120;
+       goto yy124;
+yy123:
+       ++YYCURSOR;
+       YYSETSTATE(17);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel17:
+       yych = *YYCURSOR;
+yy124:
+       if(yych <= '&') {
+               if(yych != 0x0A) goto yy123;
+       } else {
+               if(yych <= '\'') goto yy119;
+               if(yych == '\\') goto yy126;
+               goto yy123;
+       }
+yy125:
+       YYCURSOR = YYMARKER;
+       goto yy120;
+yy126:
+       ++YYCURSOR;
+       YYSETSTATE(18);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel18:
+       yych = *YYCURSOR;
+       if(yych == 0x0A) goto yy125;
+       goto yy123;
+yy127:
+       ++YYCURSOR;
+       YYSETSTATE(19);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel19:
+       yych = *YYCURSOR;
+yy128:
+       if(yych <= '!') {
+               if(yych == 0x0A) goto yy125;
+               goto yy127;
+       } else {
+               if(yych <= '"') goto yy119;
+               if(yych != '\\') goto yy127;
+       }
+       ++YYCURSOR;
+       YYSETSTATE(20);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel20:
+       yych = *YYCURSOR;
+       if(yych == 0x0A) goto yy125;
+       goto yy127;
+}
+#line 264 "scanner.fs.re"
+
+
+comment:
+
+#line 863 "<stdout>"
+{
+
+       YYSETSTATE(21);
+       if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+yyFillLabel21:
+       yych = *YYCURSOR;
+       if(yych <= ')') {
+               if(yych == 0x0A) goto yy135;
+               goto yy137;
+       } else {
+               if(yych <= '*') goto yy132;
+               if(yych == '/') goto yy134;
+               goto yy137;
+       }
+yy132:
+       ++YYCURSOR;
+       if((yych = *YYCURSOR) == '/') goto yy140;
+yy133:
+#line 279 "scanner.fs.re"
+       { if(cursor == eof) RETURN(0);
+                                 goto comment; }
+#line 885 "<stdout>"
+yy134:
+       yych = *++YYCURSOR;
+       if(yych == '*') goto yy138;
+       goto yy133;
+yy135:
+       ++YYCURSOR;
+#line 275 "scanner.fs.re"
+       { if(cursor == eof) RETURN(0);
+                                 tok = pos = cursor; cline++;
+                                 goto comment;
+                               }
+#line 897 "<stdout>"
+yy137:
+       yych = *++YYCURSOR;
+       goto yy133;
+yy138:
+       ++YYCURSOR;
+#line 272 "scanner.fs.re"
+       { ++depth;
+                                 fatal("ambiguous /* found");
+                                 goto comment; }
+#line 907 "<stdout>"
+yy140:
+       ++YYCURSOR;
+#line 268 "scanner.fs.re"
+       { if(--depth == 0)
+                                       goto scan;
+                                   else
+                                       goto comment; }
+#line 915 "<stdout>"
+}
+#line 281 "scanner.fs.re"
+
+
+config:
+
+#line 922 "<stdout>"
+{
+
+       YYSETSTATE(22);
+       if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+yyFillLabel22:
+       yych = *YYCURSOR;
+       if(yych <= 0x1F) {
+               if(yych != 0x09) goto yy148;
+       } else {
+               if(yych <= ' ') goto yy144;
+               if(yych == '=') goto yy146;
+               goto yy148;
+       }
+yy144:
+       ++YYCURSOR;
+       yych = *YYCURSOR;
+       goto yy153;
+yy145:
+#line 285 "scanner.fs.re"
+       { goto config; }
+#line 943 "<stdout>"
+yy146:
+       ++YYCURSOR;
+       yych = *YYCURSOR;
+       goto yy151;
+yy147:
+#line 286 "scanner.fs.re"
+       { iscfg = 2;
+                                 cur = cursor;
+                                 RETURN('='); 
+                               }
+#line 954 "<stdout>"
+yy148:
+       ++YYCURSOR;
+#line 290 "scanner.fs.re"
+       { fatal("missing '='"); }
+#line 959 "<stdout>"
+yy150:
+       ++YYCURSOR;
+       YYSETSTATE(23);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel23:
+       yych = *YYCURSOR;
+yy151:
+       if(yych == 0x09) goto yy150;
+       if(yych == ' ') goto yy150;
+       goto yy147;
+yy152:
+       ++YYCURSOR;
+       YYSETSTATE(24);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel24:
+       yych = *YYCURSOR;
+yy153:
+       if(yych == 0x09) goto yy152;
+       if(yych == ' ') goto yy152;
+       goto yy145;
+}
+#line 291 "scanner.fs.re"
+
+
+value:
+
+#line 986 "<stdout>"
+{
+
+       YYSETSTATE(25);
+       if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+yyFillLabel25:
+       yych = *YYCURSOR;
+       if(yych <= '&') {
+               if(yych <= 0x0D) {
+                       if(yych <= 0x08) goto yy162;
+                       if(yych <= 0x0A) goto yy156;
+                       if(yych <= 0x0C) goto yy162;
+               } else {
+                       if(yych <= ' ') {
+                               if(yych <= 0x1F) goto yy162;
+                       } else {
+                               if(yych == '"') goto yy164;
+                               goto yy162;
+                       }
+               }
+       } else {
+               if(yych <= '/') {
+                       if(yych <= '\'') goto yy166;
+                       if(yych == '-') goto yy159;
+                       goto yy162;
+               } else {
+                       if(yych <= '9') {
+                               if(yych <= '0') goto yy157;
+                               goto yy160;
+                       } else {
+                               if(yych != ';') goto yy162;
+                       }
+               }
+       }
+yy156:
+#line 300 "scanner.fs.re"
+       { cur = cursor;
+                                 yylval.str = new Str(token());
+                                 iscfg = 0;
+                                 return VALUE;
+                               }
+#line 1027 "<stdout>"
+yy157:
+       ++YYCURSOR;
+       if((yych = *YYCURSOR) <= 0x0D) {
+               if(yych <= 0x08) goto yy162;
+               if(yych <= 0x0A) goto yy158;
+               if(yych <= 0x0C) goto yy162;
+       } else {
+               if(yych <= ' ') {
+                       if(yych <= 0x1F) goto yy162;
+               } else {
+                       if(yych != ';') goto yy162;
+               }
+       }
+yy158:
+#line 295 "scanner.fs.re"
+       { cur = cursor;
+                                 yylval.number = atoi(token().to_string().c_str());
+                                 iscfg = 0;
+                                 return NUMBER;
+                               }
+#line 1048 "<stdout>"
+yy159:
+       yych = *++YYCURSOR;
+       if(yych <= '0') goto yy163;
+       if(yych >= ':') goto yy163;
+yy160:
+       ++YYCURSOR;
+       YYSETSTATE(26);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel26:
+       yych = *YYCURSOR;
+       if(yych <= 0x1F) {
+               if(yych <= 0x0A) {
+                       if(yych >= 0x09) goto yy158;
+               } else {
+                       if(yych == 0x0D) goto yy158;
+               }
+       } else {
+               if(yych <= '9') {
+                       if(yych <= ' ') goto yy158;
+                       if(yych >= '0') goto yy160;
+               } else {
+                       if(yych == ';') goto yy158;
+               }
+       }
+yy162:
+       ++YYCURSOR;
+       YYSETSTATE(27);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel27:
+       yych = *YYCURSOR;
+yy163:
+       if(yych <= 0x0D) {
+               if(yych <= 0x08) goto yy162;
+               if(yych <= 0x0A) goto yy156;
+               if(yych <= 0x0C) goto yy162;
+               goto yy156;
+       } else {
+               if(yych <= ' ') {
+                       if(yych <= 0x1F) goto yy162;
+                       goto yy156;
+               } else {
+                       if(yych == ';') goto yy156;
+                       goto yy162;
+               }
+       }
+yy164:
+       YYMARKER = ++YYCURSOR;
+       YYSETSTATE(28);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel28:
+       yych = *YYCURSOR;
+       if(yych <= ' ') {
+               if(yych <= 0x0A) {
+                       if(yych <= 0x08) goto yy164;
+                       if(yych <= 0x09) goto yy174;
+                       goto yy156;
+               } else {
+                       if(yych == 0x0D) goto yy174;
+                       if(yych <= 0x1F) goto yy164;
+                       goto yy174;
+               }
+       } else {
+               if(yych <= ':') {
+                       if(yych == '"') goto yy162;
+                       goto yy164;
+               } else {
+                       if(yych <= ';') goto yy174;
+                       if(yych == '\\') goto yy176;
+                       goto yy164;
+               }
+       }
+yy166:
+       YYMARKER = ++YYCURSOR;
+       YYSETSTATE(29);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel29:
+       yych = *YYCURSOR;
+       if(yych <= ' ') {
+               if(yych <= 0x0A) {
+                       if(yych <= 0x08) goto yy166;
+                       if(yych >= 0x0A) goto yy156;
+               } else {
+                       if(yych == 0x0D) goto yy168;
+                       if(yych <= 0x1F) goto yy166;
+               }
+       } else {
+               if(yych <= ':') {
+                       if(yych == '\'') goto yy162;
+                       goto yy166;
+               } else {
+                       if(yych <= ';') goto yy168;
+                       if(yych == '\\') goto yy171;
+                       goto yy166;
+               }
+       }
+yy168:
+       ++YYCURSOR;
+       YYSETSTATE(30);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel30:
+       yych = *YYCURSOR;
+       if(yych <= '&') {
+               if(yych != 0x0A) goto yy168;
+       } else {
+               if(yych <= '\'') goto yy172;
+               if(yych == '\\') goto yy173;
+               goto yy168;
+       }
+yy170:
+       YYCURSOR = YYMARKER;
+       goto yy156;
+yy171:
+       YYMARKER = ++YYCURSOR;
+       YYSETSTATE(31);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel31:
+       yych = *YYCURSOR;
+       if(yych <= 0x0D) {
+               if(yych <= 0x09) {
+                       if(yych <= 0x08) goto yy166;
+                       goto yy168;
+               } else {
+                       if(yych <= 0x0A) goto yy156;
+                       if(yych <= 0x0C) goto yy166;
+                       goto yy168;
+               }
+       } else {
+               if(yych <= ' ') {
+                       if(yych <= 0x1F) goto yy166;
+                       goto yy168;
+               } else {
+                       if(yych == ';') goto yy168;
+                       goto yy166;
+               }
+       }
+yy172:
+       yych = *++YYCURSOR;
+       goto yy156;
+yy173:
+       ++YYCURSOR;
+       YYSETSTATE(32);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel32:
+       yych = *YYCURSOR;
+       if(yych == 0x0A) goto yy170;
+       goto yy168;
+yy174:
+       ++YYCURSOR;
+       YYSETSTATE(33);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel33:
+       yych = *YYCURSOR;
+       if(yych <= '!') {
+               if(yych == 0x0A) goto yy170;
+               goto yy174;
+       } else {
+               if(yych <= '"') goto yy172;
+               if(yych == '\\') goto yy177;
+               goto yy174;
+       }
+yy176:
+       YYMARKER = ++YYCURSOR;
+       YYSETSTATE(34);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel34:
+       yych = *YYCURSOR;
+       if(yych <= 0x0D) {
+               if(yych <= 0x09) {
+                       if(yych <= 0x08) goto yy164;
+                       goto yy174;
+               } else {
+                       if(yych <= 0x0A) goto yy156;
+                       if(yych <= 0x0C) goto yy164;
+                       goto yy174;
+               }
+       } else {
+               if(yych <= ' ') {
+                       if(yych <= 0x1F) goto yy164;
+                       goto yy174;
+               } else {
+                       if(yych == ';') goto yy174;
+                       goto yy164;
+               }
+       }
+yy177:
+       ++YYCURSOR;
+       YYSETSTATE(35);
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+yyFillLabel35:
+       yych = *YYCURSOR;
+       if(yych == 0x0A) goto yy170;
+       goto yy174;
+}
+#line 305 "scanner.fs.re"
+
+}
+
+void Scanner::fatal(uint ofs, const char *msg) const
+{
+       out.flush();
+       std::cerr << "re2c: error: "
+               << "line " << tline << ", column " << (tchar + ofs + 1) << ": "
+               << msg << std::endl;
+       exit(1);
+}
+
+} // end namespace re2c
+