From cbca08db92708bb5f06d15defc075e98c9f56c1b Mon Sep 17 00:00:00 2001 From: helly Date: Sun, 9 Apr 2006 00:47:37 +0000 Subject: [PATCH] - Added /*!getstate:re2c */ which triggers generation of the YYGETSTATE() block. --- CHANGELOG | 1 + bootstrap/scanner.cc | 975 ++++++++++++++++++++++--------------------- htdocs/manual.html | 8 +- re2c.1.in | 13 +- scanner.re | 6 + test/config4f.f.c | 83 ++++ test/config4f.f.re | 24 ++ 7 files changed, 632 insertions(+), 478 deletions(-) create mode 100755 test/config4f.f.c create mode 100755 test/config4f.f.re diff --git a/CHANGELOG b/CHANGELOG index 2145f756..69343d4b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ Version 0.10.2 (????-??-??) --------------------------- +- Added /*!getstate:re2c */ which triggers generation of the YYGETSTATE() block. - Added configuration 'state:abort'. - Changed to not generate yyNext unless configuration 'state:nextlabel' is used. - Changed to not generate yyaccept code unless needed. diff --git a/bootstrap/scanner.cc b/bootstrap/scanner.cc index 9759502b..a0490f9e 100644 --- a/bootstrap/scanner.cc +++ b/bootstrap/scanner.cc @@ -1,4 +1,4 @@ -/* Generated by re2c 0.10.1.dev on Sat Feb 25 13:38:57 2006 */ +/* Generated by re2c 0.10.2.dev on Sat Apr 8 20:31:13 2006 */ #line 1 "scanner.re" /* $Id$ */ #include @@ -95,9 +95,8 @@ echo: #line 96 "scanner.cc" { YYCTYPE yych; - unsigned int yyaccept = 0; - if((YYLIMIT - YYCURSOR) < 11) YYFILL(11); + if((YYLIMIT - YYCURSOR) < 16) YYFILL(16); yych = *YYCURSOR; if(yych <= ')') { if(yych <= 0x00) goto yy7; @@ -107,44 +106,43 @@ echo: if(yych <= '*') goto yy4; if(yych != '/') goto yy9; } - yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if(yych == '*') goto yy12; yy3: -#line 141 "scanner.re" +#line 147 "scanner.re" { goto echo; } -#line 119 "scanner.cc" +#line 117 "scanner.cc" yy4: yych = *++YYCURSOR; if(yych == '/') goto yy10; goto yy3; yy5: ++YYCURSOR; -#line 130 "scanner.re" +#line 136 "scanner.re" { out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok)); tok = pos = cursor; cline++; goto echo; } -#line 132 "scanner.cc" +#line 130 "scanner.cc" yy7: ++YYCURSOR; -#line 135 "scanner.re" +#line 141 "scanner.re" { out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok) - 1); // -1 so we don't write out the \0 if(cursor == eof) { RETURN(0); } } -#line 142 "scanner.cc" +#line 140 "scanner.cc" yy9: yych = *++YYCURSOR; goto yy3; yy10: ++YYCURSOR; -#line 121 "scanner.re" +#line 127 "scanner.re" { if (ignore_eoc) { ignore_eoc = false; @@ -154,25 +152,30 @@ yy10: tok = pos = cursor; goto echo; } -#line 158 "scanner.cc" +#line 156 "scanner.cc" yy12: yych = *++YYCURSOR; if(yych == '!') goto yy14; yy13: YYCURSOR = YYMARKER; - switch(yyaccept){ - case 0: goto yy3; - } + goto yy3; yy14: yych = *++YYCURSOR; - if(yych == 'm') goto yy15; - if(yych == 'r') goto yy16; - goto yy13; -yy15: + if(yych <= 'l') { + if(yych != 'g') goto yy13; + } else { + if(yych <= 'm') goto yy16; + if(yych == 'r') goto yy17; + goto yy13; + } yych = *++YYCURSOR; - if(yych == 'a') goto yy21; + if(yych == 'e') goto yy30; goto yy13; yy16: + yych = *++YYCURSOR; + if(yych == 'a') goto yy22; + goto yy13; +yy17: yych = *++YYCURSOR; if(yych != 'e') goto yy13; yych = *++YYCURSOR; @@ -186,8 +189,8 @@ yy16: tok = cursor; RETURN(1); } -#line 190 "scanner.cc" -yy21: +#line 193 "scanner.cc" +yy22: yych = *++YYCURSOR; if(yych != 'x') goto yy13; yych = *++YYCURSOR; @@ -208,9 +211,41 @@ yy21: ignore_eoc = true; goto echo; } -#line 212 "scanner.cc" +#line 215 "scanner.cc" +yy30: + yych = *++YYCURSOR; + if(yych != 't') goto yy13; + yych = *++YYCURSOR; + if(yych != 's') goto yy13; + yych = *++YYCURSOR; + if(yych != 't') goto yy13; + yych = *++YYCURSOR; + if(yych != 'a') goto yy13; + yych = *++YYCURSOR; + if(yych != 't') goto yy13; + yych = *++YYCURSOR; + if(yych != 'e') goto yy13; + yych = *++YYCURSOR; + if(yych != ':') goto yy13; + yych = *++YYCURSOR; + if(yych != 'r') goto yy13; + yych = *++YYCURSOR; + if(yych != 'e') goto yy13; + yych = *++YYCURSOR; + if(yych != '2') goto yy13; + yych = *++YYCURSOR; + if(yych != 'c') goto yy13; + ++YYCURSOR; +#line 121 "scanner.re" + { + tok = pos = cursor; + genGetState(out, topIndent, 0); + ignore_eoc = true; + goto echo; + } +#line 247 "scanner.cc" } -#line 144 "scanner.re" +#line 150 "scanner.re" } @@ -233,7 +268,7 @@ scan: goto value; } -#line 237 "scanner.cc" +#line 272 "scanner.cc" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -242,906 +277,894 @@ scan: if(yych <= '/') { if(yych <= '!') { if(yych <= 0x0C) { - if(yych <= 0x08) goto yy56; - if(yych <= 0x09) goto yy50; - if(yych <= 0x0A) goto yy52; - goto yy56; + if(yych <= 0x08) goto yy70; + if(yych <= 0x09) goto yy64; + if(yych <= 0x0A) goto yy66; + goto yy70; } else { - if(yych <= 0x0D) goto yy54; - if(yych == ' ') goto yy50; - goto yy56; + if(yych <= 0x0D) goto yy68; + if(yych == ' ') goto yy64; + goto yy70; } } else { if(yych <= ')') { - if(yych <= '"') goto yy37; - if(yych <= '&') goto yy56; - if(yych <= '\'') goto yy39; - goto yy43; + if(yych <= '"') goto yy51; + if(yych <= '&') goto yy70; + if(yych <= '\'') goto yy53; + goto yy57; } else { if(yych <= '+') { - if(yych <= '*') goto yy35; - goto yy44; + if(yych <= '*') goto yy49; + goto yy58; } else { - if(yych <= '-') goto yy56; - if(yych <= '.') goto yy48; - goto yy33; + if(yych <= '-') goto yy70; + if(yych <= '.') goto yy62; + goto yy47; } } } } else { if(yych <= 'Z') { if(yych <= '=') { - if(yych == ';') goto yy43; - if(yych <= '<') goto yy56; - goto yy43; + if(yych == ';') goto yy57; + if(yych <= '<') goto yy70; + goto yy57; } else { - if(yych == '?') goto yy44; - if(yych <= '@') goto yy56; - goto yy47; + if(yych == '?') goto yy58; + if(yych <= '@') goto yy70; + goto yy61; } } else { if(yych <= 'q') { - if(yych <= '[') goto yy41; - if(yych <= '\\') goto yy43; - if(yych <= '`') goto yy56; - goto yy47; + if(yych <= '[') goto yy55; + if(yych <= '\\') goto yy57; + if(yych <= '`') goto yy70; + goto yy61; } else { if(yych <= 'z') { - if(yych <= 'r') goto yy45; - goto yy47; + if(yych <= 'r') goto yy59; + goto yy61; } else { - if(yych <= '{') goto yy31; - if(yych <= '|') goto yy43; - goto yy56; + if(yych <= '{') goto yy45; + if(yych <= '|') goto yy57; + goto yy70; } } } } -yy31: +yy45: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if(yych <= '/') { - if(yych == ',') goto yy97; + if(yych == ',') goto yy111; } else { - if(yych <= '0') goto yy94; - if(yych <= '9') goto yy95; + if(yych <= '0') goto yy108; + if(yych <= '9') goto yy109; } -yy32: -#line 166 "scanner.re" +yy46: +#line 172 "scanner.re" { depth = 1; goto code; } -#line 315 "scanner.cc" -yy33: +#line 350 "scanner.cc" +yy47: ++YYCURSOR; - if((yych = *YYCURSOR) == '*') goto yy92; -yy34: -#line 196 "scanner.re" + if((yych = *YYCURSOR) == '*') goto yy106; +yy48: +#line 202 "scanner.re" { RETURN(*tok); } -#line 322 "scanner.cc" -yy35: +#line 357 "scanner.cc" +yy49: ++YYCURSOR; - if((yych = *YYCURSOR) == '/') goto yy90; -yy36: -#line 198 "scanner.re" + if((yych = *YYCURSOR) == '/') goto yy104; +yy50: +#line 204 "scanner.re" { yylval.op = *tok; RETURN(CLOSE); } -#line 330 "scanner.cc" -yy37: +#line 365 "scanner.cc" +yy51: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if(yych != 0x0A) goto yy86; -yy38: -#line 183 "scanner.re" + if(yych != 0x0A) goto yy100; +yy52: +#line 189 "scanner.re" { fatal("unterminated string constant (missing \")"); } -#line 338 "scanner.cc" -yy39: +#line 373 "scanner.cc" +yy53: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); - if(yych != 0x0A) goto yy81; -yy40: -#line 184 "scanner.re" + if(yych != 0x0A) goto yy95; +yy54: +#line 190 "scanner.re" { fatal("unterminated string constant (missing ')"); } -#line 346 "scanner.cc" -yy41: +#line 381 "scanner.cc" +yy55: yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); - if(yych == 0x0A) goto yy42; - if(yych == '^') goto yy72; - goto yy71; -yy42: -#line 194 "scanner.re" + if(yych == 0x0A) goto yy56; + if(yych == '^') goto yy86; + goto yy85; +yy56: +#line 200 "scanner.re" { fatal("unterminated range (missing ])"); } -#line 356 "scanner.cc" -yy43: +#line 391 "scanner.cc" +yy57: yych = *++YYCURSOR; - goto yy34; -yy44: + goto yy48; +yy58: yych = *++YYCURSOR; - goto yy36; -yy45: + goto yy50; +yy59: ++YYCURSOR; - if((yych = *YYCURSOR) == 'e') goto yy62; - goto yy61; -yy46: -#line 225 "scanner.re" + if((yych = *YYCURSOR) == 'e') goto yy76; + goto yy75; +yy60: +#line 231 "scanner.re" { cur = cursor; yylval.symbol = Symbol::find(token()); return ID; } -#line 372 "scanner.cc" -yy47: +#line 407 "scanner.cc" +yy61: yych = *++YYCURSOR; - goto yy61; -yy48: + goto yy75; +yy62: ++YYCURSOR; -#line 229 "scanner.re" +#line 235 "scanner.re" { cur = cursor; yylval.regexp = mkDot(); return RANGE; } -#line 383 "scanner.cc" -yy50: +#line 418 "scanner.cc" +yy64: ++YYCURSOR; yych = *YYCURSOR; - goto yy59; -yy51: -#line 234 "scanner.re" + goto yy73; +yy65: +#line 240 "scanner.re" { goto scan; } -#line 391 "scanner.cc" -yy52: +#line 426 "scanner.cc" +yy66: ++YYCURSOR; -yy53: -#line 236 "scanner.re" +yy67: +#line 242 "scanner.re" { if(cursor == eof) RETURN(0); pos = cursor; cline++; goto scan; } -#line 400 "scanner.cc" -yy54: +#line 435 "scanner.cc" +yy68: ++YYCURSOR; - if((yych = *YYCURSOR) == 0x0A) goto yy57; -yy55: -#line 241 "scanner.re" + if((yych = *YYCURSOR) == 0x0A) goto yy71; +yy69: +#line 247 "scanner.re" { std::ostringstream msg; msg << "unexpected character: "; prtChOrHex(msg, *tok); fatal(msg.str().c_str()); goto scan; } -#line 412 "scanner.cc" -yy56: +#line 447 "scanner.cc" +yy70: yych = *++YYCURSOR; - goto yy55; -yy57: + goto yy69; +yy71: yych = *++YYCURSOR; - goto yy53; -yy58: + goto yy67; +yy72: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy59: - if(yych == 0x09) goto yy58; - if(yych == ' ') goto yy58; - goto yy51; -yy60: +yy73: + if(yych == 0x09) goto yy72; + if(yych == ' ') goto yy72; + goto yy65; +yy74: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy61: +yy75: if(yych <= '@') { - if(yych <= '/') goto yy46; - if(yych <= '9') goto yy60; - goto yy46; + if(yych <= '/') goto yy60; + if(yych <= '9') goto yy74; + goto yy60; } else { - if(yych <= 'Z') goto yy60; - if(yych <= '`') goto yy46; - if(yych <= 'z') goto yy60; - goto yy46; + if(yych <= 'Z') goto yy74; + if(yych <= '`') goto yy60; + if(yych <= 'z') goto yy74; + goto yy60; } -yy62: +yy76: yych = *++YYCURSOR; - if(yych != '2') goto yy61; + if(yych != '2') goto yy75; yych = *++YYCURSOR; - if(yych != 'c') goto yy61; + if(yych != 'c') goto yy75; yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); - if(yych != ':') goto yy61; -yy65: + if(yych != ':') goto yy75; +yy79: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych <= '@') goto yy66; - if(yych <= 'Z') goto yy67; - if(yych <= '`') goto yy66; - if(yych <= 'z') goto yy67; -yy66: + if(yych <= '@') goto yy80; + if(yych <= 'Z') goto yy81; + if(yych <= '`') goto yy80; + if(yych <= 'z') goto yy81; +yy80: 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; + switch(yyaccept) { + case 0: goto yy46; + case 1: goto yy52; + case 2: goto yy54; + case 3: goto yy56; + case 6: goto yy112; + case 5: goto yy83; + case 4: goto yy60; } -yy67: +yy81: yyaccept = 5; YYMARKER = ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= 'Z') { if(yych <= '9') { - if(yych >= '0') goto yy67; + if(yych >= '0') goto yy81; } else { - if(yych <= ':') goto yy65; - if(yych >= 'A') goto yy67; + if(yych <= ':') goto yy79; + if(yych >= 'A') goto yy81; } } else { if(yych <= '_') { - if(yych >= '_') goto yy67; + if(yych >= '_') goto yy81; } else { - if(yych <= '`') goto yy69; - if(yych <= 'z') goto yy67; + if(yych <= '`') goto yy83; + if(yych <= 'z') goto yy81; } } -yy69: -#line 218 "scanner.re" +yy83: +#line 224 "scanner.re" { cur = cursor; tok+= 5; /* skip "re2c:" */ iscfg = 1; yylval.str = new Str(token()); return CONFIG; } -#line 497 "scanner.cc" -yy70: +#line 532 "scanner.cc" +yy84: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy71: +yy85: if(yych <= '[') { - if(yych == 0x0A) goto yy66; - goto yy70; + if(yych == 0x0A) goto yy80; + goto yy84; } else { - if(yych <= '\\') goto yy74; - if(yych <= ']') goto yy75; - goto yy70; + if(yych <= '\\') goto yy88; + if(yych <= ']') goto yy89; + goto yy84; } -yy72: +yy86: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= '[') { - if(yych == 0x0A) goto yy66; - goto yy72; + if(yych == 0x0A) goto yy80; + goto yy86; } else { - if(yych <= '\\') goto yy77; - if(yych <= ']') goto yy78; - goto yy72; + if(yych <= '\\') goto yy91; + if(yych <= ']') goto yy92; + goto yy86; } -yy74: +yy88: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy66; - goto yy70; -yy75: + if(yych == 0x0A) goto yy80; + goto yy84; +yy89: ++YYCURSOR; -#line 190 "scanner.re" +#line 196 "scanner.re" { cur = cursor; yylval.regexp = ranToRE(token()); return RANGE; } -#line 535 "scanner.cc" -yy77: +#line 570 "scanner.cc" +yy91: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy66; - goto yy72; -yy78: + if(yych == 0x0A) goto yy80; + goto yy86; +yy92: ++YYCURSOR; -#line 186 "scanner.re" +#line 192 "scanner.re" { cur = cursor; yylval.regexp = invToRE(token()); return RANGE; } -#line 548 "scanner.cc" -yy80: +#line 583 "scanner.cc" +yy94: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy81: +yy95: if(yych <= '&') { - if(yych == 0x0A) goto yy66; - goto yy80; + if(yych == 0x0A) goto yy80; + goto yy94; } else { - if(yych <= '\'') goto yy83; - if(yych != '\\') goto yy80; + if(yych <= '\'') goto yy97; + if(yych != '\\') goto yy94; } ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy66; - goto yy80; -yy83: + if(yych == 0x0A) goto yy80; + goto yy94; +yy97: ++YYCURSOR; -#line 179 "scanner.re" +#line 185 "scanner.re" { cur = cursor; yylval.regexp = strToCaseInsensitiveRE(token()); return STRING; } -#line 572 "scanner.cc" -yy85: +#line 607 "scanner.cc" +yy99: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy86: +yy100: if(yych <= '!') { - if(yych == 0x0A) goto yy66; - goto yy85; + if(yych == 0x0A) goto yy80; + goto yy99; } else { - if(yych <= '"') goto yy88; - if(yych != '\\') goto yy85; + if(yych <= '"') goto yy102; + if(yych != '\\') goto yy99; } ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy66; - goto yy85; -yy88: + if(yych == 0x0A) goto yy80; + goto yy99; +yy102: ++YYCURSOR; -#line 175 "scanner.re" +#line 181 "scanner.re" { cur = cursor; yylval.regexp = strToRE(token()); return STRING; } -#line 596 "scanner.cc" -yy90: +#line 631 "scanner.cc" +yy104: ++YYCURSOR; -#line 172 "scanner.re" +#line 178 "scanner.re" { tok = cursor; RETURN(0); } -#line 602 "scanner.cc" -yy92: +#line 637 "scanner.cc" +yy106: ++YYCURSOR; -#line 169 "scanner.re" +#line 175 "scanner.re" { depth = 1; goto comment; } -#line 608 "scanner.cc" -yy94: +#line 643 "scanner.cc" +yy108: yych = *++YYCURSOR; - if(yych == ',') goto yy108; - goto yy96; -yy95: + if(yych == ',') goto yy122; + goto yy110; +yy109: ++YYCURSOR; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; -yy96: +yy110: if(yych <= '/') { - if(yych == ',') goto yy101; - goto yy66; + if(yych == ',') goto yy115; + goto yy80; } else { - if(yych <= '9') goto yy95; - if(yych == '}') goto yy99; - goto yy66; + if(yych <= '9') goto yy109; + if(yych == '}') goto yy113; + goto yy80; } -yy97: +yy111: ++YYCURSOR; -yy98: -#line 216 "scanner.re" +yy112: +#line 222 "scanner.re" { fatal("illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers"); } -#line 631 "scanner.cc" -yy99: +#line 666 "scanner.cc" +yy113: ++YYCURSOR; -#line 204 "scanner.re" +#line 210 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = atoi((char *)tok+1); RETURN(CLOSESIZE); } -#line 638 "scanner.cc" -yy101: +#line 673 "scanner.cc" +yy115: yyaccept = 6; yych = *(YYMARKER = ++YYCURSOR); - if(yych <= '/') goto yy98; - if(yych <= '9') goto yy104; - if(yych != '}') goto yy98; + if(yych <= '/') goto yy112; + if(yych <= '9') goto yy118; + if(yych != '}') goto yy112; ++YYCURSOR; -#line 212 "scanner.re" +#line 218 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = -1; RETURN(CLOSESIZE); } -#line 650 "scanner.cc" -yy104: +#line 685 "scanner.cc" +yy118: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych <= '/') goto yy66; - if(yych <= '9') goto yy104; - if(yych != '}') goto yy66; + if(yych <= '/') goto yy80; + if(yych <= '9') goto yy118; + if(yych != '}') goto yy80; ++YYCURSOR; -#line 208 "scanner.re" +#line 214 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)tok, ',')+1)); RETURN(CLOSESIZE); } -#line 663 "scanner.cc" -yy108: +#line 698 "scanner.cc" +yy122: yyaccept = 6; yych = *(YYMARKER = ++YYCURSOR); - if(yych <= '/') goto yy98; - if(yych <= '9') goto yy104; - if(yych != '}') goto yy98; + if(yych <= '/') goto yy112; + if(yych <= '9') goto yy118; + if(yych != '}') goto yy112; ++YYCURSOR; -#line 201 "scanner.re" +#line 207 "scanner.re" { yylval.op = '*'; RETURN(CLOSE); } -#line 674 "scanner.cc" +#line 709 "scanner.cc" } -#line 247 "scanner.re" +#line 253 "scanner.re" code: -#line 681 "scanner.cc" +#line 716 "scanner.cc" { YYCTYPE yych; - unsigned int yyaccept = 0; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= '&') { if(yych <= 0x0A) { - if(yych <= 0x09) goto yy119; - goto yy117; + if(yych <= 0x09) goto yy133; + goto yy131; } else { - if(yych == '"') goto yy121; - goto yy119; + if(yych == '"') goto yy135; + goto yy133; } } else { if(yych <= '{') { - if(yych <= '\'') goto yy122; - if(yych <= 'z') goto yy119; - goto yy115; + if(yych <= '\'') goto yy136; + if(yych <= 'z') goto yy133; + goto yy129; } else { - if(yych != '}') goto yy119; + if(yych != '}') goto yy133; } } ++YYCURSOR; -#line 251 "scanner.re" +#line 257 "scanner.re" { if(--depth == 0){ cur = cursor; yylval.token = new Token(token(), tline); return CODE; } goto code; } -#line 712 "scanner.cc" -yy115: +#line 746 "scanner.cc" +yy129: ++YYCURSOR; -#line 257 "scanner.re" +#line 263 "scanner.re" { ++depth; goto code; } -#line 718 "scanner.cc" -yy117: +#line 752 "scanner.cc" +yy131: ++YYCURSOR; -#line 259 "scanner.re" +#line 265 "scanner.re" { if(cursor == eof) fatal("missing '}'"); pos = cursor; cline++; goto code; } -#line 726 "scanner.cc" -yy119: +#line 760 "scanner.cc" +yy133: ++YYCURSOR; -yy120: -#line 263 "scanner.re" +yy134: +#line 269 "scanner.re" { goto code; } -#line 732 "scanner.cc" -yy121: - yyaccept = 0; +#line 766 "scanner.cc" +yy135: yych = *(YYMARKER = ++YYCURSOR); - if(yych == 0x0A) goto yy120; - goto yy128; -yy122: - yyaccept = 0; + if(yych == 0x0A) goto yy134; + goto yy142; +yy136: yych = *(YYMARKER = ++YYCURSOR); - if(yych == 0x0A) goto yy120; - goto yy124; -yy123: + if(yych == 0x0A) goto yy134; + goto yy138; +yy137: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy124: +yy138: if(yych <= '&') { - if(yych != 0x0A) goto yy123; + if(yych != 0x0A) goto yy137; } else { - if(yych <= '\'') goto yy119; - if(yych == '\\') goto yy126; - goto yy123; + if(yych <= '\'') goto yy133; + if(yych == '\\') goto yy140; + goto yy137; } -yy125: +yy139: YYCURSOR = YYMARKER; - switch(yyaccept){ - case 0: goto yy120; - } -yy126: + goto yy134; +yy140: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy125; - goto yy123; -yy127: + if(yych == 0x0A) goto yy139; + goto yy137; +yy141: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy128: +yy142: if(yych <= '!') { - if(yych == 0x0A) goto yy125; - goto yy127; + if(yych == 0x0A) goto yy139; + goto yy141; } else { - if(yych <= '"') goto yy119; - if(yych != '\\') goto yy127; + if(yych <= '"') goto yy133; + if(yych != '\\') goto yy141; } ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy125; - goto yy127; + if(yych == 0x0A) goto yy139; + goto yy141; } -#line 264 "scanner.re" +#line 270 "scanner.re" comment: -#line 789 "scanner.cc" +#line 819 "scanner.cc" { YYCTYPE yych; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= ')') { - if(yych == 0x0A) goto yy135; - goto yy137; + if(yych == 0x0A) goto yy149; + goto yy151; } else { - if(yych <= '*') goto yy132; - if(yych == '/') goto yy134; - goto yy137; + if(yych <= '*') goto yy146; + if(yych == '/') goto yy148; + goto yy151; } -yy132: +yy146: ++YYCURSOR; - if((yych = *YYCURSOR) == '/') goto yy140; -yy133: -#line 279 "scanner.re" + if((yych = *YYCURSOR) == '/') goto yy154; +yy147: +#line 285 "scanner.re" { if(cursor == eof) RETURN(0); goto comment; } -#line 809 "scanner.cc" -yy134: +#line 839 "scanner.cc" +yy148: yych = *++YYCURSOR; - if(yych == '*') goto yy138; - goto yy133; -yy135: + if(yych == '*') goto yy152; + goto yy147; +yy149: ++YYCURSOR; -#line 275 "scanner.re" +#line 281 "scanner.re" { if(cursor == eof) RETURN(0); tok = pos = cursor; cline++; goto comment; } -#line 821 "scanner.cc" -yy137: +#line 851 "scanner.cc" +yy151: yych = *++YYCURSOR; - goto yy133; -yy138: + goto yy147; +yy152: ++YYCURSOR; -#line 272 "scanner.re" +#line 278 "scanner.re" { ++depth; fatal("ambiguous /* found"); goto comment; } -#line 831 "scanner.cc" -yy140: +#line 861 "scanner.cc" +yy154: ++YYCURSOR; -#line 268 "scanner.re" +#line 274 "scanner.re" { if(--depth == 0) goto scan; else goto comment; } -#line 839 "scanner.cc" +#line 869 "scanner.cc" } -#line 281 "scanner.re" +#line 287 "scanner.re" config: -#line 846 "scanner.cc" +#line 876 "scanner.cc" { YYCTYPE yych; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= 0x1F) { - if(yych != 0x09) goto yy148; + if(yych != 0x09) goto yy162; } else { - if(yych <= ' ') goto yy144; - if(yych == '=') goto yy146; - goto yy148; + if(yych <= ' ') goto yy158; + if(yych == '=') goto yy160; + goto yy162; } -yy144: +yy158: ++YYCURSOR; yych = *YYCURSOR; - goto yy153; -yy145: -#line 285 "scanner.re" + goto yy167; +yy159: +#line 291 "scanner.re" { goto config; } -#line 865 "scanner.cc" -yy146: +#line 895 "scanner.cc" +yy160: ++YYCURSOR; yych = *YYCURSOR; - goto yy151; -yy147: -#line 286 "scanner.re" + goto yy165; +yy161: +#line 292 "scanner.re" { iscfg = 2; cur = cursor; RETURN('='); } -#line 876 "scanner.cc" -yy148: +#line 906 "scanner.cc" +yy162: ++YYCURSOR; -#line 290 "scanner.re" +#line 296 "scanner.re" { fatal("missing '='"); } -#line 881 "scanner.cc" -yy150: +#line 911 "scanner.cc" +yy164: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy151: - if(yych == 0x09) goto yy150; - if(yych == ' ') goto yy150; - goto yy147; -yy152: +yy165: + if(yych == 0x09) goto yy164; + if(yych == ' ') goto yy164; + goto yy161; +yy166: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy153: - if(yych == 0x09) goto yy152; - if(yych == ' ') goto yy152; - goto yy145; +yy167: + if(yych == 0x09) goto yy166; + if(yych == ' ') goto yy166; + goto yy159; } -#line 291 "scanner.re" +#line 297 "scanner.re" value: -#line 904 "scanner.cc" +#line 934 "scanner.cc" { YYCTYPE yych; - unsigned int yyaccept = 0; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= '&') { if(yych <= 0x0D) { - if(yych <= 0x08) goto yy162; - if(yych <= 0x0A) goto yy156; - if(yych <= 0x0C) goto yy162; + if(yych <= 0x08) goto yy176; + if(yych <= 0x0A) goto yy170; + if(yych <= 0x0C) goto yy176; } else { if(yych <= ' ') { - if(yych <= 0x1F) goto yy162; + if(yych <= 0x1F) goto yy176; } else { - if(yych == '"') goto yy164; - goto yy162; + if(yych == '"') goto yy178; + goto yy176; } } } else { if(yych <= '/') { - if(yych <= '\'') goto yy166; - if(yych == '-') goto yy159; - goto yy162; + if(yych <= '\'') goto yy180; + if(yych == '-') goto yy173; + goto yy176; } else { if(yych <= '9') { - if(yych <= '0') goto yy157; - goto yy160; + if(yych <= '0') goto yy171; + goto yy174; } else { - if(yych != ';') goto yy162; + if(yych != ';') goto yy176; } } } -yy156: -#line 300 "scanner.re" +yy170: +#line 306 "scanner.re" { cur = cursor; yylval.str = new Str(token()); iscfg = 0; return VALUE; } -#line 944 "scanner.cc" -yy157: +#line 973 "scanner.cc" +yy171: ++YYCURSOR; if((yych = *YYCURSOR) <= 0x0D) { - if(yych <= 0x08) goto yy162; - if(yych <= 0x0A) goto yy158; - if(yych <= 0x0C) goto yy162; + if(yych <= 0x08) goto yy176; + if(yych <= 0x0A) goto yy172; + if(yych <= 0x0C) goto yy176; } else { if(yych <= ' ') { - if(yych <= 0x1F) goto yy162; + if(yych <= 0x1F) goto yy176; } else { - if(yych != ';') goto yy162; + if(yych != ';') goto yy176; } } -yy158: -#line 295 "scanner.re" +yy172: +#line 301 "scanner.re" { cur = cursor; yylval.number = atoi(token().to_string().c_str()); iscfg = 0; return NUMBER; } -#line 965 "scanner.cc" -yy159: +#line 994 "scanner.cc" +yy173: yych = *++YYCURSOR; - if(yych <= '0') goto yy163; - if(yych >= ':') goto yy163; -yy160: + if(yych <= '0') goto yy177; + if(yych >= ':') goto yy177; +yy174: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= 0x1F) { if(yych <= 0x0A) { - if(yych >= 0x09) goto yy158; + if(yych >= 0x09) goto yy172; } else { - if(yych == 0x0D) goto yy158; + if(yych == 0x0D) goto yy172; } } else { if(yych <= '9') { - if(yych <= ' ') goto yy158; - if(yych >= '0') goto yy160; + if(yych <= ' ') goto yy172; + if(yych >= '0') goto yy174; } else { - if(yych == ';') goto yy158; + if(yych == ';') goto yy172; } } -yy162: +yy176: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy163: +yy177: if(yych <= 0x0D) { - if(yych <= 0x08) goto yy162; - if(yych <= 0x0A) goto yy156; - if(yych <= 0x0C) goto yy162; - goto yy156; + if(yych <= 0x08) goto yy176; + if(yych <= 0x0A) goto yy170; + if(yych <= 0x0C) goto yy176; + goto yy170; } else { if(yych <= ' ') { - if(yych <= 0x1F) goto yy162; - goto yy156; + if(yych <= 0x1F) goto yy176; + goto yy170; } else { - if(yych == ';') goto yy156; - goto yy162; + if(yych == ';') goto yy170; + goto yy176; } } -yy164: - yyaccept = 0; +yy178: YYMARKER = ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= ' ') { if(yych <= 0x0A) { - if(yych <= 0x08) goto yy164; - if(yych <= 0x09) goto yy174; - goto yy156; + if(yych <= 0x08) goto yy178; + if(yych <= 0x09) goto yy188; + goto yy170; } else { - if(yych == 0x0D) goto yy174; - if(yych <= 0x1F) goto yy164; - goto yy174; + if(yych == 0x0D) goto yy188; + if(yych <= 0x1F) goto yy178; + goto yy188; } } else { if(yych <= ':') { - if(yych == '"') goto yy162; - goto yy164; + if(yych == '"') goto yy176; + goto yy178; } else { - if(yych <= ';') goto yy174; - if(yych == '\\') goto yy176; - goto yy164; + if(yych <= ';') goto yy188; + if(yych == '\\') goto yy190; + goto yy178; } } -yy166: - yyaccept = 0; +yy180: YYMARKER = ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= ' ') { if(yych <= 0x0A) { - if(yych <= 0x08) goto yy166; - if(yych >= 0x0A) goto yy156; + if(yych <= 0x08) goto yy180; + if(yych >= 0x0A) goto yy170; } else { - if(yych == 0x0D) goto yy168; - if(yych <= 0x1F) goto yy166; + if(yych == 0x0D) goto yy182; + if(yych <= 0x1F) goto yy180; } } else { if(yych <= ':') { - if(yych == '\'') goto yy162; - goto yy166; + if(yych == '\'') goto yy176; + goto yy180; } else { - if(yych <= ';') goto yy168; - if(yych == '\\') goto yy171; - goto yy166; + if(yych <= ';') goto yy182; + if(yych == '\\') goto yy185; + goto yy180; } } -yy168: +yy182: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= '&') { - if(yych != 0x0A) goto yy168; + if(yych != 0x0A) goto yy182; } else { - if(yych <= '\'') goto yy172; - if(yych == '\\') goto yy173; - goto yy168; + if(yych <= '\'') goto yy186; + if(yych == '\\') goto yy187; + goto yy182; } -yy170: +yy184: YYCURSOR = YYMARKER; - switch(yyaccept){ - case 0: goto yy156; - } -yy171: - yyaccept = 0; + goto yy170; +yy185: YYMARKER = ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= 0x0D) { if(yych <= 0x09) { - if(yych <= 0x08) goto yy166; - goto yy168; + if(yych <= 0x08) goto yy180; + goto yy182; } else { - if(yych <= 0x0A) goto yy156; - if(yych <= 0x0C) goto yy166; - goto yy168; + if(yych <= 0x0A) goto yy170; + if(yych <= 0x0C) goto yy180; + goto yy182; } } else { if(yych <= ' ') { - if(yych <= 0x1F) goto yy166; - goto yy168; + if(yych <= 0x1F) goto yy180; + goto yy182; } else { - if(yych == ';') goto yy168; - goto yy166; + if(yych == ';') goto yy182; + goto yy180; } } -yy172: +yy186: yych = *++YYCURSOR; - goto yy156; -yy173: + goto yy170; +yy187: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy170; - goto yy168; -yy174: + if(yych == 0x0A) goto yy184; + goto yy182; +yy188: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= '!') { - if(yych == 0x0A) goto yy170; - goto yy174; + if(yych == 0x0A) goto yy184; + goto yy188; } else { - if(yych <= '"') goto yy172; - if(yych == '\\') goto yy177; - goto yy174; + if(yych <= '"') goto yy186; + if(yych == '\\') goto yy191; + goto yy188; } -yy176: - yyaccept = 0; +yy190: YYMARKER = ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych <= 0x0D) { if(yych <= 0x09) { - if(yych <= 0x08) goto yy164; - goto yy174; + if(yych <= 0x08) goto yy178; + goto yy188; } else { - if(yych <= 0x0A) goto yy156; - if(yych <= 0x0C) goto yy164; - goto yy174; + if(yych <= 0x0A) goto yy170; + if(yych <= 0x0C) goto yy178; + goto yy188; } } else { if(yych <= ' ') { - if(yych <= 0x1F) goto yy164; - goto yy174; + if(yych <= 0x1F) goto yy178; + goto yy188; } else { - if(yych == ';') goto yy174; - goto yy164; + if(yych == ';') goto yy188; + goto yy178; } } -yy177: +yy191: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy170; - goto yy174; + if(yych == 0x0A) goto yy184; + goto yy188; } -#line 305 "scanner.re" +#line 311 "scanner.re" } diff --git a/htdocs/manual.html b/htdocs/manual.html index 2cfe3e01..6d756647 100755 --- a/htdocs/manual.html +++ b/htdocs/manual.html @@ -211,7 +211,7 @@ full generation process twice which means it has to read the input twice. That means re2c would fail in case it cannot open the input twice or reading the input for the first time influences the second read attempt.

Changes needed compared to the "pull" model.

-

1. User has to supply macros YYSETSTATE() YYGETSTATE(state)

+

1. User has to supply macros YYSETSTATE() and YYGETSTATE(state)

2. The -f option inhibits declaration of yych and yyaccept. So the user has to declare these. Also the user has to save and restore these. In the example examples/push.re these are declared as @@ -232,6 +232,12 @@ variable by YYSETSTATE(state).

the function calling it) if more input is needed.

4. Modify caller to recognise "more input is needed" and respond appropriately.

+

5.The generated code will contain a switch block that is used to restores +the last state by jumping behind the corrspoding YYFILL() call. This code is +automatically generated in the epilog of the first "/*!re2c */" block. +It is possible to trigger generation of the YYGETSTATE() block by placing +a "/*!getstate:re2c */" comment earlier. This is especially usefull when +the scanner code should be wrapped inside a loop.

Please see examples/push.re for push-model scanner. The generated code can be tweaked using configurations "state:abort" and "state:nextlabel".

diff --git a/re2c.1.in b/re2c.1.in index e25da57a..6b14f57f 100644 --- a/re2c.1.in +++ b/re2c.1.in @@ -7,6 +7,10 @@ .ds rx regular expression .ds lx \fIl\fP-expression \"$Log$ +\"Revision 1.45 2006/04/09 00:47:37 helly +\"- Added /*!getstate:re2c */ which triggers generation of the YYGETSTATE() +\" block. +\" \"Revision 1.44 2006/04/09 00:17:30 helly \"- Update docu \" @@ -386,7 +390,7 @@ input for the first time influences the second read attempt. Changes needed compared to the "pull" model. -1. User has to supply macros YYSETSTATE() YYGETSTATE(state) +1. User has to supply macros YYSETSTATE() and YYGETSTATE(state) 2. The \fB-f\fP option inhibits declaration of \fIyych\fP and \fIyyaccept\fP. So the user has to declare these. Also the user has @@ -408,6 +412,13 @@ input is needed. 4. Modify caller to recognise "more input is needed" and respond appropriately. +5. The generated code will contain a switch block that is used to restores +the last state by jumping behind the corrspoding YYFILL() call. This code is +automatically generated in the epilog of the first "\fC/*!re2c */\fP" block. +It is possible to trigger generation of the YYGETSTATE() block by placing +a "\fC/*!getstate:re2c */\fP" comment earlier. This is especially usefull when +the scanner code should be wrapped inside a loop. + Please see examples/push.re for push-model scanner. The generated code can be tweaked using configurations "\fBstate:abort\fP" and "\fBstate:nextlabel\fP". diff --git a/scanner.re b/scanner.re index aaf376ae..cb1bec73 100644 --- a/scanner.re +++ b/scanner.re @@ -118,6 +118,12 @@ echo: ignore_eoc = true; goto echo; } + "/*!getstate:re2c" { + tok = pos = cursor; + genGetState(out, topIndent, 0); + ignore_eoc = true; + goto echo; + } "*" "/" { if (ignore_eoc) { ignore_eoc = false; diff --git a/test/config4f.f.c b/test/config4f.f.c new file mode 100755 index 00000000..c221c33f --- /dev/null +++ b/test/config4f.f.c @@ -0,0 +1,83 @@ +/* Generated by re2c */ +#line 1 "config4f.f.re" +#define NULL ((char*) 0) +#define YYCTYPE char +#define YYCURSOR p +#define YYLIMIT p +#define YYMARKER q +#define YYFILL(n) + +char *scan(char *p) +{ + char *q; +#line 13 "config4f.f.re" + + switch(YYGETSTATE()) + { + default: goto yy0; + case 0: goto yyFillLabel0; + case 1: goto yyFillLabel1; + } + + + // after getstate + + +#line 27 "" + { + +yy0: + YYSETSTATE(0); + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); +yyFillLabel0: + yych = *YYCURSOR; + switch(yych){ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy2; + default: goto yy4; + } +yy2: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy7; +yy3: +#line 21 "config4f.f.re" + { return YYCURSOR; } +#line 55 "" +yy4: + ++YYCURSOR; +#line 22 "config4f.f.re" + { return NULL; } +#line 60 "" +yy6: + ++YYCURSOR; + YYSETSTATE(1); + if(YYLIMIT == YYCURSOR) YYFILL(1); +yyFillLabel1: + yych = *YYCURSOR; +yy7: + switch(yych){ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy6; + default: goto yy3; + } + } +#line 23 "config4f.f.re" + +} diff --git a/test/config4f.f.re b/test/config4f.f.re new file mode 100755 index 00000000..7e0cb78f --- /dev/null +++ b/test/config4f.f.re @@ -0,0 +1,24 @@ +#define NULL ((char*) 0) +#define YYCTYPE char +#define YYCURSOR p +#define YYLIMIT p +#define YYMARKER q +#define YYFILL(n) + +char *scan(char *p) +{ + char *q; +/*!re2c + re2c:indent:top = 1; +*/ +/*!getstate:re2c */ + + // after getstate + +/*!re2c + re2c:state:abort = 0; + re2c:state:nextlabel = 0; + [0-9]+ { return YYCURSOR; } + [\000-\377] { return NULL; } +*/ +} -- 2.40.0