From: helly Date: Sat, 8 Apr 2006 21:21:42 +0000 (+0000) Subject: - Implemented #1187127 savable state support for multiple re2c blocks. X-Git-Tag: 0.13.6~419 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=36c130635c659ec3dfff7a721d5e4dcb829e811a;p=re2c - Implemented #1187127 savable state support for multiple re2c blocks. --- diff --git a/CHANGELOG b/CHANGELOG index 6c3de561..3bab6db3 100644 --- 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 82d541be..cc3e0b5e 100644 --- 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 vUsedLabels; extern uint nRealChars; diff --git a/main.cc b/main.cc index 98e8a481..7cc8161f 100644 --- 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 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 = ""; 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; } diff --git a/test/scanner.fs.c b/test/scanner.fs.c index 111dd695..511bed64 100755 --- a/test/scanner.fs.c +++ b/test/scanner.fs.c @@ -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 "" +#line 161 "" yy4: yych = *++YYCURSOR; if(yych == '/') goto yy10; @@ -135,7 +170,7 @@ yy5: tok = pos = cursor; cline++; goto echo; } -#line 139 "" +#line 174 "" yy7: ++YYCURSOR; #line 135 "scanner.fs.re" @@ -145,7 +180,7 @@ yy7: RETURN(0); } } -#line 149 "" +#line 184 "" yy9: yych = *++YYCURSOR; goto yy3; @@ -161,7 +196,7 @@ yy10: tok = pos = cursor; goto echo; } -#line 165 "" +#line 200 "" yy12: yych = *++YYCURSOR; if(yych == '!') goto yy14; @@ -191,7 +226,7 @@ yy16: tok = cursor; RETURN(1); } -#line 195 "" +#line 230 "" yy21: yych = *++YYCURSOR; if(yych != 'x') goto yy13; @@ -213,7 +248,7 @@ yy21: ignore_eoc = true; goto echo; } -#line 217 "" +#line 252 "" } #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 "" +{ + + 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 "" +yy33: + ++YYCURSOR; + if((yych = *YYCURSOR) == '*') goto yy92; +yy34: +#line 196 "scanner.fs.re" + { RETURN(*tok); } +#line 363 "" +yy35: + ++YYCURSOR; + if((yych = *YYCURSOR) == '/') goto yy90; +yy36: +#line 198 "scanner.fs.re" + { yylval.op = *tok; + RETURN(CLOSE); } +#line 371 "" +yy37: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if(yych != 0x0A) goto yy86; +yy38: +#line 183 "scanner.fs.re" + { fatal("unterminated string constant (missing \")"); } +#line 379 "" +yy39: + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if(yych != 0x0A) goto yy81; +yy40: +#line 184 "scanner.fs.re" + { fatal("unterminated string constant (missing ')"); } +#line 387 "" +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 "" +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 "" +yy47: + yych = *++YYCURSOR; + goto yy61; +yy48: + ++YYCURSOR; +#line 229 "scanner.fs.re" + { cur = cursor; + yylval.regexp = mkDot(); + return RANGE; + } +#line 424 "" +yy50: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy59; +yy51: +#line 234 "scanner.fs.re" + { goto scan; } +#line 432 "" +yy52: + ++YYCURSOR; +yy53: +#line 236 "scanner.fs.re" + { if(cursor == eof) RETURN(0); + pos = cursor; cline++; + goto scan; + } +#line 441 "" +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 "" +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 "" +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 "" +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 "" +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 "" +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 "" +yy90: + ++YYCURSOR; +#line 172 "scanner.fs.re" + { tok = cursor; + RETURN(0); } +#line 667 "" +yy92: + ++YYCURSOR; +#line 169 "scanner.fs.re" + { depth = 1; + goto comment; } +#line 673 "" +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 "" +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 "" +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 "" +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 "" +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 "" +} +#line 247 "scanner.fs.re" + + +code: + +#line 750 "" +{ + + 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 "" +yy115: + ++YYCURSOR; +#line 257 "scanner.fs.re" + { ++depth; + goto code; } +#line 788 "" +yy117: + ++YYCURSOR; +#line 259 "scanner.fs.re" + { if(cursor == eof) fatal("missing '}'"); + pos = cursor; cline++; + goto code; + } +#line 796 "" +yy119: + ++YYCURSOR; +yy120: +#line 263 "scanner.fs.re" + { goto code; } +#line 802 "" +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 "" +{ + + 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 "" +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 "" +yy137: + yych = *++YYCURSOR; + goto yy133; +yy138: + ++YYCURSOR; +#line 272 "scanner.fs.re" + { ++depth; + fatal("ambiguous /* found"); + goto comment; } +#line 907 "" +yy140: + ++YYCURSOR; +#line 268 "scanner.fs.re" + { if(--depth == 0) + goto scan; + else + goto comment; } +#line 915 "" +} +#line 281 "scanner.fs.re" + + +config: + +#line 922 "" +{ + + 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 "" +yy146: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy151; +yy147: +#line 286 "scanner.fs.re" + { iscfg = 2; + cur = cursor; + RETURN('='); + } +#line 954 "" +yy148: + ++YYCURSOR; +#line 290 "scanner.fs.re" + { fatal("missing '='"); } +#line 959 "" +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 "" +{ + + 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 "" +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 "" +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 +