From: helly Date: Fri, 8 Apr 2005 18:42:45 +0000 (+0000) Subject: - Add /*!max:re2c */ which emits a '#define YYMAXFILL \n' line X-Git-Tag: 0.13.6~669 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6e14b6b633514318edf150e21b832c0a8505414d;p=re2c - Add /*!max:re2c */ which emits a '#define YYMAXFILL \n' line This allows to define buffers of the minimum required length. Occurence must follow '/*re2c */ and cannot preceed it. --- diff --git a/bootstrap/scanner.cc b/bootstrap/scanner.cc index 878286ad..450e9828 100644 --- a/bootstrap/scanner.cc +++ b/bootstrap/scanner.cc @@ -1,4 +1,4 @@ -/* Generated by re2c 0.9.4 on Sun Oct 31 23:17:13 2004 */ +/* Generated by re2c 0.9.5.dev on Fri Apr 8 20:22:23 2005 */ #line 1 "scanner.re" /* $Id$ */ #include @@ -7,6 +7,7 @@ #include "scanner.h" #include "parser.h" #include "y.tab.h" +#include "globals.h" extern YYSTYPE yylval; @@ -64,11 +65,12 @@ char *Scanner::fill(char *cursor){ return cursor; } -#line 75 "scanner.re" +#line 76 "scanner.re" int Scanner::echo(std::ostream &out){ char *cursor = cur; + bool ignore_eoc = false; // Catch EOF if (eof && cursor == eof) @@ -84,72 +86,133 @@ echo: YYCTYPE yych; unsigned int yyaccept; goto yy0; -yy1: ++YYCURSOR; + ++YYCURSOR; yy0: - if((YYLIMIT - YYCURSOR) < 7) YYFILL(7); + if((YYLIMIT - YYCURSOR) < 11) YYFILL(11); yych = *YYCURSOR; - if(yych <= 0x0A){ - if(yych <= 0x00) goto yy6; - if(yych <= 0x09) goto yy8; - goto yy4; + if(yych <= ')'){ + if(yych <= 0x00) goto yy7; + if(yych == 0x0A) goto yy5; + goto yy9; } else { - if(yych != '/') goto yy8; + if(yych <= '*') goto yy4; + if(yych != '/') goto yy9; goto yy2; } yy2: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == '*') goto yy9; + if(yych == '*') goto yy12; goto yy3; yy3: -#line 97 "scanner.re" -{ goto echo; } -#line 31 "scanner.cc" -yy4: ++YYCURSOR; - goto yy5; -yy5: -#line 92 "scanner.re" -{ out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok)); - tok = pos = cursor; cline++; - goto echo; } -#line 39 "scanner.cc" -yy6: ++YYCURSOR; - goto yy7; -yy7: -#line 95 "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 46 "scanner.cc" -yy8: yych = *++YYCURSOR; +#line 122 "scanner.re" +{ + goto echo; + } +#line 34 "scanner.cc" +yy4: yych = *++YYCURSOR; + if(yych == '/') goto yy10; goto yy3; +yy5: ++YYCURSOR; + goto yy6; +yy6: +#line 111 "scanner.re" +{ + out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok)); + tok = pos = cursor; cline++; + goto echo; + } +#line 47 "scanner.cc" +yy7: ++YYCURSOR; + goto yy8; +yy8: +#line 116 "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 58 "scanner.cc" yy9: yych = *++YYCURSOR; - if(yych == '!') goto yy11; - goto yy10; -yy10: YYCURSOR = YYMARKER; + goto yy3; +yy10: ++YYCURSOR; + goto yy11; +yy11: +#line 102 "scanner.re" +{ + if (ignore_eoc) { + ignore_eoc = false; + } else { + out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok)); + } + tok = pos = cursor; + goto echo; + } +#line 74 "scanner.cc" +yy12: yych = *++YYCURSOR; + if(yych == '!') goto yy14; + goto yy13; +yy13: YYCURSOR = YYMARKER; switch(yyaccept){ case 0: goto yy3; } -yy11: yych = *++YYCURSOR; - if(yych != 'r') goto yy10; - goto yy12; -yy12: yych = *++YYCURSOR; - if(yych != 'e') goto yy10; - goto yy13; -yy13: yych = *++YYCURSOR; - if(yych != '2') goto yy10; - goto yy14; yy14: yych = *++YYCURSOR; - if(yych != 'c') goto yy10; - goto yy15; -yy15: ++YYCURSOR; - goto yy16; -yy16: -#line 89 "scanner.re" -{ out.write((const char*)(tok), (const char*)(&cursor[-7]) - (const char*)(tok)); - tok = cursor; - RETURN(1); } -#line 75 "scanner.cc" + if(yych == 'm') goto yy15; + if(yych == 'r') goto yy16; + goto yy13; +yy15: yych = *++YYCURSOR; + if(yych == 'a') goto yy21; + goto yy13; +yy16: yych = *++YYCURSOR; + if(yych != 'e') goto yy13; + goto yy17; +yy17: yych = *++YYCURSOR; + if(yych != '2') goto yy13; + goto yy18; +yy18: yych = *++YYCURSOR; + if(yych != 'c') goto yy13; + goto yy19; +yy19: ++YYCURSOR; + goto yy20; +yy20: +#line 91 "scanner.re" +{ + out.write((const char*)(tok), (const char*)(&cursor[-7]) - (const char*)(tok)); + tok = cursor; + RETURN(1); + } +#line 107 "scanner.cc" +yy21: yych = *++YYCURSOR; + if(yych != 'x') goto yy13; + goto yy22; +yy22: yych = *++YYCURSOR; + if(yych != ':') goto yy13; + goto yy23; +yy23: yych = *++YYCURSOR; + if(yych != 'r') goto yy13; + goto yy24; +yy24: yych = *++YYCURSOR; + if(yych != 'e') goto yy13; + goto yy25; +yy25: yych = *++YYCURSOR; + if(yych != '2') goto yy13; + goto yy26; +yy26: yych = *++YYCURSOR; + if(yych != 'c') goto yy13; + goto yy27; +yy27: ++YYCURSOR; + goto yy28; +yy28: +#line 96 "scanner.re" +{ + out << "#define YYMAXFILL " << maxFill << std::endl; + tok = pos = cursor; + ignore_eoc = true; + goto echo; + } +#line 136 "scanner.cc" } -#line 98 "scanner.re" +#line 125 "scanner.re" } @@ -163,487 +226,487 @@ scan: tline = cline; tok = cursor; -#line 79 "scanner.cc" +#line 140 "scanner.cc" { YYCTYPE yych; unsigned int yyaccept; - goto yy17; -yy18: ++YYCURSOR; -yy17: + goto yy29; + ++YYCURSOR; +yy29: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= '/'){ if(yych <= '"'){ if(yych <= 0x0A){ - if(yych <= 0x08) goto yy39; - if(yych <= 0x09) goto yy35; - goto yy37; + if(yych <= 0x08) goto yy51; + if(yych <= 0x09) goto yy47; + goto yy49; } else { - if(yych == ' ') goto yy35; - if(yych <= '!') goto yy39; - goto yy25; + if(yych == ' ') goto yy47; + if(yych <= '!') goto yy51; + goto yy37; } } else { if(yych <= ')'){ - if(yych <= '&') goto yy39; - if(yych <= '\'') goto yy27; - goto yy31; + if(yych <= '&') goto yy51; + if(yych <= '\'') goto yy39; + goto yy43; } else { - if(yych <= '*') goto yy23; - if(yych <= '+') goto yy32; - if(yych <= '.') goto yy39; - goto yy21; + if(yych <= '*') goto yy35; + if(yych <= '+') goto yy44; + if(yych <= '.') goto yy51; + goto yy33; } } } else { if(yych <= '@'){ if(yych <= '<'){ - if(yych == ';') goto yy31; - goto yy39; + if(yych == ';') goto yy43; + goto yy51; } else { - if(yych <= '=') goto yy31; - if(yych == '?') goto yy32; - goto yy39; + if(yych <= '=') goto yy43; + if(yych == '?') goto yy44; + goto yy51; } } else { if(yych <= '`'){ - if(yych <= 'Z') goto yy33; - if(yych <= '[') goto yy29; - if(yych <= '\\') goto yy31; - goto yy39; + if(yych <= 'Z') goto yy45; + if(yych <= '[') goto yy41; + if(yych <= '\\') goto yy43; + goto yy51; } else { - if(yych <= 'z') goto yy33; - if(yych <= '{') goto yy19; - if(yych <= '|') goto yy31; - goto yy39; + if(yych <= 'z') goto yy45; + if(yych <= '{') goto yy31; + if(yych <= '|') goto yy43; + goto yy51; } } } -yy19: yyaccept = 0; +yy31: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych <= '/') goto yy20; - if(yych <= '9') goto yy65; - goto yy20; -yy20: -#line 111 "scanner.re" + if(yych <= '/') goto yy32; + if(yych <= '9') goto yy77; + goto yy32; +yy32: +#line 138 "scanner.re" { depth = 1; goto code; } -#line 145 "scanner.cc" -yy21: ++YYCURSOR; - if((yych = *YYCURSOR) == '*') goto yy63; - goto yy22; -yy22: -#line 137 "scanner.re" +#line 206 "scanner.cc" +yy33: ++YYCURSOR; + if((yych = *YYCURSOR) == '*') goto yy75; + goto yy34; +yy34: +#line 164 "scanner.re" { RETURN(*tok); } -#line 152 "scanner.cc" -yy23: ++YYCURSOR; - if((yych = *YYCURSOR) == '/') goto yy61; - goto yy24; -yy24: -#line 139 "scanner.re" +#line 213 "scanner.cc" +yy35: ++YYCURSOR; + if((yych = *YYCURSOR) == '/') goto yy73; + goto yy36; +yy36: +#line 166 "scanner.re" { yylval.op = *tok; RETURN(CLOSE); } -#line 160 "scanner.cc" -yy25: yyaccept = 1; +#line 221 "scanner.cc" +yy37: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if(yych != 0x0A) goto yy57; - goto yy26; -yy26: -#line 128 "scanner.re" + if(yych != 0x0A) goto yy69; + goto yy38; +yy38: +#line 155 "scanner.re" { fatal("unterminated string constant (missing \")"); } -#line 168 "scanner.cc" -yy27: yyaccept = 2; +#line 229 "scanner.cc" +yy39: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); - if(yych != 0x0A) goto yy52; - goto yy28; -yy28: -#line 129 "scanner.re" + if(yych != 0x0A) goto yy64; + goto yy40; +yy40: +#line 156 "scanner.re" { fatal("unterminated string constant (missing ')"); } -#line 176 "scanner.cc" -yy29: yyaccept = 3; +#line 237 "scanner.cc" +yy41: yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); - if(yych != 0x0A) goto yy46; - goto yy30; -yy30: -#line 135 "scanner.re" + if(yych != 0x0A) goto yy58; + goto yy42; +yy42: +#line 162 "scanner.re" { fatal("unterminated range (missing ])"); } -#line 184 "scanner.cc" -yy31: yych = *++YYCURSOR; - goto yy22; -yy32: yych = *++YYCURSOR; - goto yy24; -yy33: ++YYCURSOR; +#line 245 "scanner.cc" +yy43: yych = *++YYCURSOR; + goto yy34; +yy44: yych = *++YYCURSOR; + goto yy36; +yy45: ++YYCURSOR; yych = *YYCURSOR; - goto yy44; -yy34: -#line 154 "scanner.re" + goto yy56; +yy46: +#line 181 "scanner.re" { cur = cursor; yylval.symbol = Symbol::find(token()); return ID; } -#line 196 "scanner.cc" -yy35: ++YYCURSOR; +#line 257 "scanner.cc" +yy47: ++YYCURSOR; yych = *YYCURSOR; - goto yy42; -yy36: -#line 158 "scanner.re" + goto yy54; +yy48: +#line 185 "scanner.re" { goto scan; } -#line 202 "scanner.cc" -yy37: ++YYCURSOR; - goto yy38; -yy38: -#line 160 "scanner.re" +#line 263 "scanner.cc" +yy49: ++YYCURSOR; + goto yy50; +yy50: +#line 187 "scanner.re" { if(cursor == eof) RETURN(0); pos = cursor; cline++; goto scan; } -#line 211 "scanner.cc" -yy39: ++YYCURSOR; - goto yy40; -yy40: -#line 165 "scanner.re" +#line 272 "scanner.cc" +yy51: ++YYCURSOR; + goto yy52; +yy52: +#line 192 "scanner.re" { std::cerr << "unexpected character: " << *tok << std::endl; goto scan; } -#line 219 "scanner.cc" -yy41: ++YYCURSOR; +#line 280 "scanner.cc" +yy53: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy42; -yy42: if(yych == 0x09) goto yy41; - if(yych == ' ') goto yy41; - goto yy36; -yy43: ++YYCURSOR; + goto yy54; +yy54: if(yych == 0x09) goto yy53; + if(yych == ' ') goto yy53; + goto yy48; +yy55: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy44; -yy44: if(yych <= '@'){ - if(yych <= '/') goto yy34; - if(yych <= '9') goto yy43; - goto yy34; + goto yy56; +yy56: if(yych <= '@'){ + if(yych <= '/') goto yy46; + if(yych <= '9') goto yy55; + goto yy46; } else { - if(yych <= 'Z') goto yy43; - if(yych <= '`') goto yy34; - if(yych <= 'z') goto yy43; - goto yy34; + if(yych <= 'Z') goto yy55; + if(yych <= '`') goto yy46; + if(yych <= 'z') goto yy55; + goto yy46; } -yy45: ++YYCURSOR; +yy57: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy46; -yy46: if(yych <= '['){ - if(yych != 0x0A) goto yy45; - goto yy47; + goto yy58; +yy58: if(yych <= '['){ + if(yych != 0x0A) goto yy57; + goto yy59; } else { - if(yych <= '\\') goto yy48; - if(yych <= ']') goto yy49; - goto yy45; + if(yych <= '\\') goto yy60; + if(yych <= ']') goto yy61; + goto yy57; } -yy47: YYCURSOR = YYMARKER; +yy59: YYCURSOR = YYMARKER; switch(yyaccept){ - case 0: goto yy20; - case 1: goto yy26; - case 2: goto yy28; - case 3: goto yy30; + case 0: goto yy32; + case 1: goto yy38; + case 2: goto yy40; + case 3: goto yy42; } -yy48: ++YYCURSOR; +yy60: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy47; - goto yy45; -yy49: ++YYCURSOR; - goto yy50; -yy50: -#line 131 "scanner.re" + if(yych == 0x0A) goto yy59; + goto yy57; +yy61: ++YYCURSOR; + goto yy62; +yy62: +#line 158 "scanner.re" { cur = cursor; yylval.regexp = ranToRE(token()); return RANGE; } -#line 276 "scanner.cc" -yy51: ++YYCURSOR; +#line 337 "scanner.cc" +yy63: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy52; -yy52: if(yych <= '&'){ - if(yych == 0x0A) goto yy47; - goto yy51; + goto yy64; +yy64: if(yych <= '&'){ + if(yych == 0x0A) goto yy59; + goto yy63; } else { - if(yych <= '\'') goto yy54; - if(yych != '\\') goto yy51; - goto yy53; + if(yych <= '\'') goto yy66; + if(yych != '\\') goto yy63; + goto yy65; } -yy53: ++YYCURSOR; +yy65: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy47; - goto yy51; -yy54: ++YYCURSOR; - goto yy55; -yy55: -#line 124 "scanner.re" + if(yych == 0x0A) goto yy59; + goto yy63; +yy66: ++YYCURSOR; + goto yy67; +yy67: +#line 151 "scanner.re" { cur = cursor; yylval.regexp = strToCaseInsensitiveRE(token()); return STRING; } -#line 303 "scanner.cc" -yy56: ++YYCURSOR; +#line 364 "scanner.cc" +yy68: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy57; -yy57: if(yych <= '!'){ - if(yych == 0x0A) goto yy47; - goto yy56; + goto yy69; +yy69: if(yych <= '!'){ + if(yych == 0x0A) goto yy59; + goto yy68; } else { - if(yych <= '"') goto yy59; - if(yych != '\\') goto yy56; - goto yy58; + if(yych <= '"') goto yy71; + if(yych != '\\') goto yy68; + goto yy70; } -yy58: ++YYCURSOR; +yy70: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy47; - goto yy56; -yy59: ++YYCURSOR; - goto yy60; -yy60: -#line 120 "scanner.re" + if(yych == 0x0A) goto yy59; + goto yy68; +yy71: ++YYCURSOR; + goto yy72; +yy72: +#line 147 "scanner.re" { cur = cursor; yylval.regexp = strToRE(token()); return STRING; } -#line 330 "scanner.cc" -yy61: ++YYCURSOR; - goto yy62; -yy62: -#line 117 "scanner.re" +#line 391 "scanner.cc" +yy73: ++YYCURSOR; + goto yy74; +yy74: +#line 144 "scanner.re" { tok = cursor; RETURN(0); } -#line 337 "scanner.cc" -yy63: ++YYCURSOR; - goto yy64; -yy64: -#line 114 "scanner.re" +#line 398 "scanner.cc" +yy75: ++YYCURSOR; + goto yy76; +yy76: +#line 141 "scanner.re" { depth = 1; goto comment; } -#line 344 "scanner.cc" -yy65: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); +#line 405 "scanner.cc" +yy77: ++YYCURSOR; + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; - goto yy66; -yy66: if(yych <= '/'){ - if(yych == ',') goto yy69; - goto yy47; + goto yy78; +yy78: if(yych <= '/'){ + if(yych == ',') goto yy81; + goto yy59; } else { - if(yych <= '9') goto yy65; - if(yych != '}') goto yy47; - goto yy67; + if(yych <= '9') goto yy77; + if(yych != '}') goto yy59; + goto yy79; } -yy67: ++YYCURSOR; - goto yy68; -yy68: -#line 142 "scanner.re" +yy79: ++YYCURSOR; + goto yy80; +yy80: +#line 169 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = atoi((char *)tok+1); RETURN(CLOSESIZE); } -#line 365 "scanner.cc" -yy69: yych = *++YYCURSOR; - if(yych != '}') goto yy73; - goto yy70; -yy70: ++YYCURSOR; - goto yy71; -yy71: -#line 150 "scanner.re" +#line 426 "scanner.cc" +yy81: yych = *++YYCURSOR; + if(yych != '}') goto yy85; + goto yy82; +yy82: ++YYCURSOR; + goto yy83; +yy83: +#line 177 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = -1; RETURN(CLOSESIZE); } -#line 376 "scanner.cc" -yy72: ++YYCURSOR; +#line 437 "scanner.cc" +yy84: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy73; -yy73: if(yych <= '/') goto yy47; - if(yych <= '9') goto yy72; - if(yych != '}') goto yy47; - goto yy74; -yy74: ++YYCURSOR; - goto yy75; -yy75: -#line 146 "scanner.re" + goto yy85; +yy85: if(yych <= '/') goto yy59; + if(yych <= '9') goto yy84; + if(yych != '}') goto yy59; + goto yy86; +yy86: ++YYCURSOR; + goto yy87; +yy87: +#line 173 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)tok, ',')+1)); RETURN(CLOSESIZE); } -#line 393 "scanner.cc" +#line 454 "scanner.cc" } -#line 168 "scanner.re" +#line 195 "scanner.re" code: -#line 397 "scanner.cc" +#line 458 "scanner.cc" { YYCTYPE yych; unsigned int yyaccept; - goto yy76; -yy77: ++YYCURSOR; -yy76: + goto yy88; + ++YYCURSOR; +yy88: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= '&'){ if(yych <= 0x0A){ - if(yych <= 0x09) goto yy84; - goto yy82; + if(yych <= 0x09) goto yy96; + goto yy94; } else { - if(yych == '"') goto yy86; - goto yy84; + if(yych == '"') goto yy98; + goto yy96; } } else { if(yych <= '{'){ - if(yych <= '\'') goto yy87; - if(yych <= 'z') goto yy84; - goto yy80; + if(yych <= '\'') goto yy99; + if(yych <= 'z') goto yy96; + goto yy92; } else { - if(yych != '}') goto yy84; - goto yy78; + if(yych != '}') goto yy96; + goto yy90; } } -yy78: ++YYCURSOR; - goto yy79; -yy79: -#line 172 "scanner.re" +yy90: ++YYCURSOR; + goto yy91; +yy91: +#line 199 "scanner.re" { if(--depth == 0){ cur = cursor; yylval.token = new Token(token(), tline); return CODE; } goto code; } -#line 434 "scanner.cc" -yy80: ++YYCURSOR; - goto yy81; -yy81: -#line 178 "scanner.re" +#line 495 "scanner.cc" +yy92: ++YYCURSOR; + goto yy93; +yy93: +#line 205 "scanner.re" { ++depth; goto code; } -#line 441 "scanner.cc" -yy82: ++YYCURSOR; - goto yy83; -yy83: -#line 180 "scanner.re" +#line 502 "scanner.cc" +yy94: ++YYCURSOR; + goto yy95; +yy95: +#line 207 "scanner.re" { if(cursor == eof) fatal("missing '}'"); pos = cursor; cline++; goto code; } -#line 450 "scanner.cc" -yy84: ++YYCURSOR; - goto yy85; -yy85: -#line 184 "scanner.re" +#line 511 "scanner.cc" +yy96: ++YYCURSOR; + goto yy97; +yy97: +#line 211 "scanner.re" { goto code; } -#line 456 "scanner.cc" -yy86: yyaccept = 0; +#line 517 "scanner.cc" +yy98: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == 0x0A) goto yy85; - goto yy93; -yy87: yyaccept = 0; + if(yych == 0x0A) goto yy97; + goto yy105; +yy99: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == 0x0A) goto yy85; - goto yy89; -yy88: ++YYCURSOR; + if(yych == 0x0A) goto yy97; + goto yy101; +yy100: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy89; -yy89: if(yych <= '&'){ - if(yych != 0x0A) goto yy88; - goto yy90; + goto yy101; +yy101: if(yych <= '&'){ + if(yych != 0x0A) goto yy100; + goto yy102; } else { - if(yych <= '\'') goto yy84; - if(yych == '\\') goto yy91; - goto yy88; + if(yych <= '\'') goto yy96; + if(yych == '\\') goto yy103; + goto yy100; } -yy90: YYCURSOR = YYMARKER; +yy102: YYCURSOR = YYMARKER; switch(yyaccept){ - case 0: goto yy85; + case 0: goto yy97; } -yy91: ++YYCURSOR; +yy103: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy90; - goto yy88; -yy92: ++YYCURSOR; + if(yych == 0x0A) goto yy102; + goto yy100; +yy104: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy93; -yy93: if(yych <= '!'){ - if(yych == 0x0A) goto yy90; - goto yy92; + goto yy105; +yy105: if(yych <= '!'){ + if(yych == 0x0A) goto yy102; + goto yy104; } else { - if(yych <= '"') goto yy84; - if(yych != '\\') goto yy92; - goto yy94; + if(yych <= '"') goto yy96; + if(yych != '\\') goto yy104; + goto yy106; } -yy94: ++YYCURSOR; +yy106: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy90; - goto yy92; + if(yych == 0x0A) goto yy102; + goto yy104; } -#line 185 "scanner.re" +#line 212 "scanner.re" comment: -#line 510 "scanner.cc" +#line 571 "scanner.cc" { YYCTYPE yych; unsigned int yyaccept; - goto yy95; -yy96: ++YYCURSOR; -yy95: + goto yy107; + ++YYCURSOR; +yy107: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= ')'){ - if(yych == 0x0A) goto yy100; - goto yy102; + if(yych == 0x0A) goto yy112; + goto yy114; } else { - if(yych <= '*') goto yy97; - if(yych == '/') goto yy99; - goto yy102; + if(yych <= '*') goto yy109; + if(yych == '/') goto yy111; + goto yy114; } -yy97: ++YYCURSOR; - if((yych = *YYCURSOR) == '/') goto yy105; - goto yy98; -yy98: -#line 199 "scanner.re" +yy109: ++YYCURSOR; + if((yych = *YYCURSOR) == '/') goto yy117; + goto yy110; +yy110: +#line 226 "scanner.re" { goto comment; } -#line 533 "scanner.cc" -yy99: yych = *++YYCURSOR; - if(yych == '*') goto yy103; - goto yy98; -yy100: ++YYCURSOR; - goto yy101; -yy101: -#line 195 "scanner.re" +#line 594 "scanner.cc" +yy111: yych = *++YYCURSOR; + if(yych == '*') goto yy115; + goto yy110; +yy112: ++YYCURSOR; + goto yy113; +yy113: +#line 222 "scanner.re" { if(cursor == eof) RETURN(0); tok = pos = cursor; cline++; goto comment; } -#line 545 "scanner.cc" -yy102: yych = *++YYCURSOR; - goto yy98; -yy103: ++YYCURSOR; - goto yy104; -yy104: -#line 193 "scanner.re" +#line 606 "scanner.cc" +yy114: yych = *++YYCURSOR; + goto yy110; +yy115: ++YYCURSOR; + goto yy116; +yy116: +#line 220 "scanner.re" { ++depth; goto comment; } -#line 554 "scanner.cc" -yy105: ++YYCURSOR; - goto yy106; -yy106: -#line 189 "scanner.re" +#line 615 "scanner.cc" +yy117: ++YYCURSOR; + goto yy118; +yy118: +#line 216 "scanner.re" { if(--depth == 0) goto scan; else goto comment; } -#line 563 "scanner.cc" +#line 624 "scanner.cc" } -#line 200 "scanner.re" +#line 227 "scanner.re" } diff --git a/code.cc b/code.cc index fbf1229f..95a90312 100644 --- a/code.cc +++ b/code.cc @@ -997,9 +997,14 @@ void DFA::emit(std::ostream &o) uint nRules = 0; + maxFill = 1; for (s = head; s; s = s->next) { s->depth = maxDist(s); + if (maxFill < s->depth) + { + maxFill = s->depth; + } if (s->rule && s->rule->accept >= nRules) { nRules = s->rule->accept + 1; @@ -1145,7 +1150,6 @@ void DFA::emit(std::ostream &o) o << "{\n\tYYCTYPE yych;\n\tunsigned int yyaccept;\n"; oline += 3; - if (bFlag) { BitMap::gen(o, lbChar, ubChar); diff --git a/globals.h b/globals.h index 39f6f1db..0a610ef7 100644 --- a/globals.h +++ b/globals.h @@ -36,6 +36,7 @@ extern char *outputFileName; extern bool sFlag; extern bool bFlag; extern unsigned int oline; +extern uint maxFill; extern uchar asc2ebc[256]; extern uchar ebc2asc[256]; diff --git a/main.cc b/main.cc index 77c7747a..42901c29 100644 --- a/main.cc +++ b/main.cc @@ -21,6 +21,7 @@ char *outputFileName = 0; bool sFlag = false; bool bFlag = false; unsigned int oline = 1; +uint maxFill = 1; label_list vUsedLabels; using namespace std; @@ -115,7 +116,7 @@ int main(int argc, char *argv[]) cout << version << "\n"; return 2; } - + case 'h': case '?': diff --git a/scanner.re b/scanner.re index 12f265ae..9795426e 100644 --- a/scanner.re +++ b/scanner.re @@ -5,6 +5,7 @@ #include "scanner.h" #include "parser.h" #include "y.tab.h" +#include "globals.h" extern YYSTYPE yylval; @@ -76,6 +77,7 @@ digit = [0-9]; int Scanner::echo(std::ostream &out){ char *cursor = cur; + bool ignore_eoc = false; // Catch EOF if (eof && cursor == eof) @@ -86,15 +88,40 @@ int Scanner::echo(std::ostream &out){ tok = cursor; echo: /*!re2c - "/*!re2c" { out.write((const char*)(tok), (const char*)(&cursor[-7]) - (const char*)(tok)); - tok = cursor; - RETURN(1); } - "\n" { out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok)); - tok = pos = cursor; cline++; - goto echo; } - zero { 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); } } - any { goto echo; } + "/*!re2c" { + out.write((const char*)(tok), (const char*)(&cursor[-7]) - (const char*)(tok)); + tok = cursor; + RETURN(1); + } + "/*!max:re2c" { + out << "#define YYMAXFILL " << maxFill << std::endl; + tok = pos = cursor; + ignore_eoc = true; + goto echo; + } + "*" "/" { + if (ignore_eoc) { + ignore_eoc = false; + } else { + out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok)); + } + tok = pos = cursor; + goto echo; + } + "\n" { + out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok)); + tok = pos = cursor; cline++; + goto echo; + } + zero { + 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); + } + } + any { + goto echo; + } */ } diff --git a/test/bug1054496.c b/test/bug1054496.c new file mode 100755 index 00000000..73c5588c --- /dev/null +++ b/test/bug1054496.c @@ -0,0 +1,234 @@ + +#line 1 "bug1054496.re" +#include +#include +#include + +#define RET(n) printf("%d\n", n); return n +#define TAG_EOI 0 +#define TAG_A 1 +#define TAG_TAG 2 + +int scan(char *s, int l) +{ + char *p = s; + char *q; +#define YYCTYPE char +#define YYCURSOR p +#define YYLIMIT (s+l) +#define YYMARKER q +#define YYFILL(n) +cont: + +#line 6 "" +{ + YYCTYPE yych; + unsigned int yyaccept; + goto yy0; + ++YYCURSOR; +yy0: + if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = *YYCURSOR; + switch(yych){ + case 0x00: goto yy4; + case '<': goto yy2; + default: goto yy6; + } +yy2: ++YYCURSOR; + switch((yych = *YYCURSOR)) { + case 'A': case 'a': goto yy7; + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy9; + default: goto yy3; + } +yy3: +#line 25 "bug1054496.re" +{ goto cont; } +#line 77 "" +yy4: ++YYCURSOR; + goto yy5; +yy5: +#line 24 "bug1054496.re" +{ RET(TAG_EOI); } +#line 83 "" +yy6: yych = *++YYCURSOR; + goto yy3; +yy7: ++YYCURSOR; + switch((yych = *YYCURSOR)) { + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy9; + default: goto yy8; + } +yy8: +#line 22 "bug1054496.re" +{ RET(TAG_A); } +#line 144 "" +yy9: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy10; +yy10: switch(yych){ + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy9; + default: goto yy11; + } +yy11: +#line 23 "bug1054496.re" +{ RET(TAG_TAG); } +#line 207 "" +} +#line 26 "bug1054496.re" + +} + +#define do_scan(str) scan(str, strlen(str)) + +main() +{ + do_scan("0"); +} diff --git a/test/bug1054496.re b/test/bug1054496.re new file mode 100755 index 00000000..ccfb3201 --- /dev/null +++ b/test/bug1054496.re @@ -0,0 +1,34 @@ +#include +#include +#include + +#define RET(n) printf("%d\n", n); return n +#define TAG_EOI 0 +#define TAG_A 1 +#define TAG_TAG 2 + +int scan(char *s, int l) +{ + char *p = s; + char *q; +#define YYCTYPE char +#define YYCURSOR p +#define YYLIMIT (s+l) +#define YYMARKER q +#define YYFILL(n) +cont: +/*!re2c +any = [\001-\377]; +'