From 2600a28c6d3b16aa78792df3fd15092438bb0fe3 Mon Sep 17 00:00:00 2001 From: helly Date: Sat, 9 Jul 2005 11:14:41 +0000 Subject: [PATCH] - Implemented #1232777 negated char classes. --- CHANGELOG | 1 + actions.cc | 15 ++ bootstrap/scanner.cc | 418 +++++++++++++++++++++++-------------------- re.h | 1 + scanner.re | 23 ++- substr.h | 5 + test/repeater.c | 186 ++++++++++--------- test/repeater.re | 65 ++++--- 8 files changed, 399 insertions(+), 315 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 136f470b..7a42f286 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ Version 0.9.9 (????-??-??) -------------------------- +- Implemented #1232777 negated char classes. Version 0.9.8 (2005-06-26) -------------------------- diff --git a/actions.cc b/actions.cc index eacedbbd..14f787a2 100644 --- a/actions.cc +++ b/actions.cc @@ -673,6 +673,21 @@ RegExp *ranToRE(SubStr s) return new MatchOp(r); } +RegExp *invToRE(SubStr s) +{ + s.len--; + s.str++; + + RegExp * any = ranToRE(SubStr("[\\000-\\377]")); + RegExp * ran = ranToRE(s); + RegExp * inv = mkDiff(any, ran); + + delete ran; + delete any; + + return inv; +} + char *RuleOp::type = "RuleOp"; RuleOp::RuleOp(RegExp *e, RegExp *c, Token *t, uint a) diff --git a/bootstrap/scanner.cc b/bootstrap/scanner.cc index ff66b269..cbdbde0b 100644 --- a/bootstrap/scanner.cc +++ b/bootstrap/scanner.cc @@ -1,4 +1,4 @@ -/* Generated by re2c 0.9.8 on Sun Jun 26 14:33:21 2005 */ +/* Generated by re2c 0.9.9.dev on Sat Jul 9 12:50:01 2005 */ #line 1 "scanner.re" /* $Id$ */ #include @@ -65,7 +65,7 @@ char *Scanner::fill(char *cursor){ return cursor; } -#line 76 "scanner.re" +#line 77 "scanner.re" int Scanner::echo(std::ostream &out){ @@ -104,7 +104,7 @@ yy2: yyaccept = 0; if(yych == '*') goto yy12; goto yy3; yy3: -#line 122 "scanner.re" +#line 123 "scanner.re" { goto echo; } @@ -115,7 +115,7 @@ yy4: yych = *++YYCURSOR; yy5: ++YYCURSOR; goto yy6; yy6: -#line 111 "scanner.re" +#line 112 "scanner.re" { out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok)); tok = pos = cursor; cline++; oline++; @@ -125,7 +125,7 @@ yy6: yy7: ++YYCURSOR; goto yy8; yy8: -#line 116 "scanner.re" +#line 117 "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) { @@ -138,7 +138,7 @@ yy9: yych = *++YYCURSOR; yy10: ++YYCURSOR; goto yy11; yy11: -#line 102 "scanner.re" +#line 103 "scanner.re" { if (ignore_eoc) { ignore_eoc = false; @@ -175,7 +175,7 @@ yy18: yych = *++YYCURSOR; yy19: ++YYCURSOR; goto yy20; yy20: -#line 91 "scanner.re" +#line 92 "scanner.re" { out.write((const char*)(tok), (const char*)(&cursor[-7]) - (const char*)(tok)); tok = cursor; @@ -203,7 +203,7 @@ yy26: yych = *++YYCURSOR; yy27: ++YYCURSOR; goto yy28; yy28: -#line 96 "scanner.re" +#line 97 "scanner.re" { out << "#define YYMAXFILL " << maxFill << std::endl; tok = pos = cursor; @@ -212,7 +212,7 @@ yy28: } #line 214 "scanner.cc" } -#line 125 "scanner.re" +#line 126 "scanner.re" } @@ -285,53 +285,54 @@ yy29: yy31: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if(yych <= '/') goto yy32; - if(yych <= '9') goto yy77; + if(yych <= '9') goto yy82; goto yy32; yy32: -#line 138 "scanner.re" +#line 139 "scanner.re" { depth = 1; goto code; } #line 296 "scanner.cc" yy33: ++YYCURSOR; - if((yych = *YYCURSOR) == '*') goto yy75; + if((yych = *YYCURSOR) == '*') goto yy80; goto yy34; yy34: -#line 164 "scanner.re" +#line 169 "scanner.re" { RETURN(*tok); } #line 303 "scanner.cc" yy35: ++YYCURSOR; - if((yych = *YYCURSOR) == '/') goto yy73; + if((yych = *YYCURSOR) == '/') goto yy78; goto yy36; yy36: -#line 166 "scanner.re" +#line 171 "scanner.re" { yylval.op = *tok; RETURN(CLOSE); } #line 311 "scanner.cc" yy37: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if(yych != 0x0A) goto yy69; + if(yych != 0x0A) goto yy74; goto yy38; yy38: -#line 155 "scanner.re" +#line 156 "scanner.re" { fatal("unterminated string constant (missing \")"); } #line 319 "scanner.cc" yy39: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); - if(yych != 0x0A) goto yy64; + if(yych != 0x0A) goto yy69; goto yy40; yy40: -#line 156 "scanner.re" +#line 157 "scanner.re" { fatal("unterminated string constant (missing ')"); } #line 327 "scanner.cc" yy41: yyaccept = 3; yych = *(YYMARKER = ++YYCURSOR); - if(yych != 0x0A) goto yy58; - goto yy42; + if(yych == 0x0A) goto yy42; + if(yych == '^') goto yy60; + goto yy58; yy42: -#line 162 "scanner.re" +#line 167 "scanner.re" { fatal("unterminated range (missing ])"); } -#line 335 "scanner.cc" +#line 336 "scanner.cc" yy43: yych = *++YYCURSOR; goto yy34; yy44: yych = *++YYCURSOR; @@ -340,35 +341,35 @@ yy45: ++YYCURSOR; yych = *YYCURSOR; goto yy56; yy46: -#line 181 "scanner.re" +#line 186 "scanner.re" { cur = cursor; yylval.symbol = Symbol::find(token()); return ID; } -#line 348 "scanner.cc" +#line 349 "scanner.cc" yy47: ++YYCURSOR; yych = *YYCURSOR; goto yy54; yy48: -#line 185 "scanner.re" +#line 190 "scanner.re" { goto scan; } -#line 355 "scanner.cc" +#line 356 "scanner.cc" yy49: ++YYCURSOR; goto yy50; yy50: -#line 187 "scanner.re" +#line 192 "scanner.re" { if(cursor == eof) RETURN(0); pos = cursor; cline++; goto scan; } -#line 364 "scanner.cc" +#line 365 "scanner.cc" yy51: ++YYCURSOR; goto yy52; yy52: -#line 192 "scanner.re" +#line 197 "scanner.re" { std::cerr << "unexpected character: " << *tok << std::endl; goto scan; } -#line 372 "scanner.cc" +#line 373 "scanner.cc" yy53: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; @@ -398,8 +399,8 @@ yy58: if(yych <= '['){ if(yych != 0x0A) goto yy57; goto yy59; } else { - if(yych <= '\\') goto yy60; - if(yych <= ']') goto yy61; + if(yych <= '\\') goto yy62; + if(yych <= ']') goto yy63; goto yy57; } yy59: YYCURSOR = YYMARKER; @@ -410,52 +411,52 @@ yy59: YYCURSOR = YYMARKER; case 3: goto yy42; } yy60: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy61; +yy61: if(yych <= '['){ + if(yych == 0x0A) goto yy59; + goto yy60; + } else { + if(yych <= '\\') goto yy65; + if(yych <= ']') goto yy66; + goto yy60; + } +yy62: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych == 0x0A) goto yy59; goto yy57; -yy61: ++YYCURSOR; - goto yy62; -yy62: -#line 158 "scanner.re" +yy63: ++YYCURSOR; + goto yy64; +yy64: +#line 163 "scanner.re" { cur = cursor; yylval.regexp = ranToRE(token()); return RANGE; } -#line 425 "scanner.cc" -yy63: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy64; -yy64: if(yych <= '&'){ - if(yych == 0x0A) goto yy59; - goto yy63; - } else { - if(yych <= '\'') goto yy66; - if(yych != '\\') goto yy63; - goto yy65; - } +#line 438 "scanner.cc" yy65: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; if(yych == 0x0A) goto yy59; - goto yy63; + goto yy60; yy66: ++YYCURSOR; goto yy67; yy67: -#line 151 "scanner.re" +#line 159 "scanner.re" { cur = cursor; - yylval.regexp = strToCaseInsensitiveRE(token()); - return STRING; } -#line 450 "scanner.cc" + yylval.regexp = invToRE(token()); + return RANGE; } +#line 451 "scanner.cc" yy68: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; goto yy69; -yy69: if(yych <= '!'){ +yy69: if(yych <= '&'){ if(yych == 0x0A) goto yy59; goto yy68; } else { - if(yych <= '"') goto yy71; + if(yych <= '\'') goto yy71; if(yych != '\\') goto yy68; goto yy70; } @@ -467,245 +468,270 @@ yy70: ++YYCURSOR; yy71: ++YYCURSOR; goto yy72; yy72: -#line 147 "scanner.re" +#line 152 "scanner.re" { cur = cursor; - yylval.regexp = strToRE(token()); + yylval.regexp = strToCaseInsensitiveRE(token()); return STRING; } -#line 475 "scanner.cc" +#line 476 "scanner.cc" yy73: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; goto yy74; -yy74: -#line 144 "scanner.re" +yy74: if(yych <= '!'){ + if(yych == 0x0A) goto yy59; + goto yy73; + } else { + if(yych <= '"') goto yy76; + if(yych != '\\') goto yy73; + goto yy75; + } +yy75: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych == 0x0A) goto yy59; + goto yy73; +yy76: ++YYCURSOR; + goto yy77; +yy77: +#line 148 "scanner.re" +{ cur = cursor; + yylval.regexp = strToRE(token()); + return STRING; } +#line 501 "scanner.cc" +yy78: ++YYCURSOR; + goto yy79; +yy79: +#line 145 "scanner.re" { tok = cursor; RETURN(0); } -#line 482 "scanner.cc" -yy75: ++YYCURSOR; - goto yy76; -yy76: -#line 141 "scanner.re" +#line 508 "scanner.cc" +yy80: ++YYCURSOR; + goto yy81; +yy81: +#line 142 "scanner.re" { depth = 1; goto comment; } -#line 489 "scanner.cc" -yy77: ++YYCURSOR; +#line 515 "scanner.cc" +yy82: ++YYCURSOR; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; - goto yy78; -yy78: if(yych <= '/'){ - if(yych == ',') goto yy81; + goto yy83; +yy83: if(yych <= '/'){ + if(yych == ',') goto yy86; goto yy59; } else { - if(yych <= '9') goto yy77; + if(yych <= '9') goto yy82; if(yych != '}') goto yy59; - goto yy79; + goto yy84; } -yy79: ++YYCURSOR; - goto yy80; -yy80: -#line 169 "scanner.re" +yy84: ++YYCURSOR; + goto yy85; +yy85: +#line 174 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = atoi((char *)tok+1); RETURN(CLOSESIZE); } -#line 509 "scanner.cc" -yy81: yych = *++YYCURSOR; - if(yych != '}') goto yy85; - goto yy82; -yy82: ++YYCURSOR; - goto yy83; -yy83: -#line 177 "scanner.re" +#line 535 "scanner.cc" +yy86: yych = *++YYCURSOR; + if(yych != '}') goto yy90; + goto yy87; +yy87: ++YYCURSOR; + goto yy88; +yy88: +#line 182 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = -1; RETURN(CLOSESIZE); } -#line 520 "scanner.cc" -yy84: ++YYCURSOR; +#line 546 "scanner.cc" +yy89: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy85; -yy85: if(yych <= '/') goto yy59; - if(yych <= '9') goto yy84; + goto yy90; +yy90: if(yych <= '/') goto yy59; + if(yych <= '9') goto yy89; if(yych != '}') goto yy59; - goto yy86; -yy86: ++YYCURSOR; - goto yy87; -yy87: -#line 173 "scanner.re" + goto yy91; +yy91: ++YYCURSOR; + goto yy92; +yy92: +#line 178 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)tok, ',')+1)); RETURN(CLOSESIZE); } -#line 536 "scanner.cc" +#line 562 "scanner.cc" } -#line 195 "scanner.re" +#line 200 "scanner.re" code: -#line 543 "scanner.cc" +#line 569 "scanner.cc" { YYCTYPE yych; unsigned int yyaccept; - goto yy88; + goto yy93; ++YYCURSOR; -yy88: +yy93: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= '&'){ if(yych <= 0x0A){ - if(yych <= 0x09) goto yy96; - goto yy94; + if(yych <= 0x09) goto yy101; + goto yy99; } else { - if(yych == '"') goto yy98; - goto yy96; + if(yych == '"') goto yy103; + goto yy101; } } else { if(yych <= '{'){ - if(yych <= '\'') goto yy99; - if(yych <= 'z') goto yy96; - goto yy92; + if(yych <= '\'') goto yy104; + if(yych <= 'z') goto yy101; + goto yy97; } else { - if(yych != '}') goto yy96; - goto yy90; + if(yych != '}') goto yy101; + goto yy95; } } -yy90: ++YYCURSOR; - goto yy91; -yy91: -#line 199 "scanner.re" +yy95: ++YYCURSOR; + goto yy96; +yy96: +#line 204 "scanner.re" { if(--depth == 0){ cur = cursor; yylval.token = new Token(token(), tline); return CODE; } goto code; } -#line 580 "scanner.cc" -yy92: ++YYCURSOR; - goto yy93; -yy93: -#line 205 "scanner.re" +#line 606 "scanner.cc" +yy97: ++YYCURSOR; + goto yy98; +yy98: +#line 210 "scanner.re" { ++depth; goto code; } -#line 587 "scanner.cc" -yy94: ++YYCURSOR; - goto yy95; -yy95: -#line 207 "scanner.re" +#line 613 "scanner.cc" +yy99: ++YYCURSOR; + goto yy100; +yy100: +#line 212 "scanner.re" { if(cursor == eof) fatal("missing '}'"); pos = cursor; cline++; goto code; } -#line 596 "scanner.cc" -yy96: ++YYCURSOR; - goto yy97; -yy97: -#line 211 "scanner.re" +#line 622 "scanner.cc" +yy101: ++YYCURSOR; + goto yy102; +yy102: +#line 216 "scanner.re" { goto code; } -#line 602 "scanner.cc" -yy98: yyaccept = 0; +#line 628 "scanner.cc" +yy103: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == 0x0A) goto yy97; - goto yy105; -yy99: yyaccept = 0; + if(yych == 0x0A) goto yy102; + goto yy110; +yy104: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == 0x0A) goto yy97; - goto yy101; -yy100: ++YYCURSOR; + if(yych == 0x0A) goto yy102; + goto yy106; +yy105: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy101; -yy101: if(yych <= '&'){ - if(yych != 0x0A) goto yy100; - goto yy102; + goto yy106; +yy106: if(yych <= '&'){ + if(yych != 0x0A) goto yy105; + goto yy107; } else { - if(yych <= '\'') goto yy96; - if(yych == '\\') goto yy103; - goto yy100; + if(yych <= '\'') goto yy101; + if(yych == '\\') goto yy108; + goto yy105; } -yy102: YYCURSOR = YYMARKER; +yy107: YYCURSOR = YYMARKER; switch(yyaccept){ - case 0: goto yy97; + case 0: goto yy102; } -yy103: ++YYCURSOR; +yy108: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy102; - goto yy100; -yy104: ++YYCURSOR; + if(yych == 0x0A) goto yy107; + goto yy105; +yy109: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy105; -yy105: if(yych <= '!'){ - if(yych == 0x0A) goto yy102; - goto yy104; + goto yy110; +yy110: if(yych <= '!'){ + if(yych == 0x0A) goto yy107; + goto yy109; } else { - if(yych <= '"') goto yy96; - if(yych != '\\') goto yy104; - goto yy106; + if(yych <= '"') goto yy101; + if(yych != '\\') goto yy109; + goto yy111; } -yy106: ++YYCURSOR; +yy111: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == 0x0A) goto yy102; - goto yy104; + if(yych == 0x0A) goto yy107; + goto yy109; } -#line 212 "scanner.re" +#line 217 "scanner.re" comment: -#line 655 "scanner.cc" +#line 681 "scanner.cc" { YYCTYPE yych; - goto yy107; + goto yy112; ++YYCURSOR; -yy107: +yy112: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= ')'){ - if(yych == 0x0A) goto yy112; - goto yy114; + if(yych == 0x0A) goto yy117; + goto yy119; } else { - if(yych <= '*') goto yy109; - if(yych == '/') goto yy111; - goto yy114; + if(yych <= '*') goto yy114; + if(yych == '/') goto yy116; + goto yy119; } -yy109: ++YYCURSOR; - if((yych = *YYCURSOR) == '/') goto yy117; - goto yy110; -yy110: -#line 226 "scanner.re" +yy114: ++YYCURSOR; + if((yych = *YYCURSOR) == '/') goto yy122; + goto yy115; +yy115: +#line 231 "scanner.re" { goto comment; } -#line 677 "scanner.cc" -yy111: yych = *++YYCURSOR; - if(yych == '*') goto yy115; - goto yy110; -yy112: ++YYCURSOR; - goto yy113; -yy113: -#line 222 "scanner.re" +#line 703 "scanner.cc" +yy116: yych = *++YYCURSOR; + if(yych == '*') goto yy120; + goto yy115; +yy117: ++YYCURSOR; + goto yy118; +yy118: +#line 227 "scanner.re" { if(cursor == eof) RETURN(0); tok = pos = cursor; cline++; goto comment; } -#line 689 "scanner.cc" -yy114: yych = *++YYCURSOR; - goto yy110; -yy115: ++YYCURSOR; - goto yy116; -yy116: -#line 220 "scanner.re" +#line 715 "scanner.cc" +yy119: yych = *++YYCURSOR; + goto yy115; +yy120: ++YYCURSOR; + goto yy121; +yy121: +#line 225 "scanner.re" { ++depth; goto comment; } -#line 698 "scanner.cc" -yy117: ++YYCURSOR; - goto yy118; -yy118: -#line 216 "scanner.re" +#line 724 "scanner.cc" +yy122: ++YYCURSOR; + goto yy123; +yy123: +#line 221 "scanner.re" { if(--depth == 0) goto scan; else goto comment; } -#line 707 "scanner.cc" +#line 733 "scanner.cc" } -#line 227 "scanner.re" +#line 232 "scanner.re" } diff --git a/re.h b/re.h index ea52e644..22015823 100644 --- a/re.h +++ b/re.h @@ -294,6 +294,7 @@ extern void genCode(std::ostream&, RegExp*); extern RegExp *mkDiff(RegExp*, RegExp*); extern RegExp *strToRE(SubStr); extern RegExp *ranToRE(SubStr); +extern RegExp *invToRE(SubStr); extern RegExp *strToCaseInsensitiveRE(SubStr s); } // end namespace re2c diff --git a/scanner.re b/scanner.re index 6cd79fd6..d270df79 100644 --- a/scanner.re +++ b/scanner.re @@ -64,15 +64,16 @@ char *Scanner::fill(char *cursor){ } /*!re2c -zero = "\000"; -any = [\000-\377]; -dot = any \ [\n]; -esc = dot \ [\\]; -cstring = "[" ((esc \ [\]]) | "\\" dot)* "]" ; -dstring = "\"" ((esc \ ["] ) | "\\" dot)* "\""; -sstring = "'" ((esc \ ['] ) | "\\" dot)* "'" ; -letter = [a-zA-Z]; -digit = [0-9]; +zero = "\000"; +any = [\000-\377]; +dot = any \ [\n]; +esc = dot \ [\\]; +istring = "[" "^" ((esc \ [\]]) | "\\" dot)* "]" ; +cstring = "[" ((esc \ [\]]) | "\\" dot)* "]" ; +dstring = "\"" ((esc \ ["] ) | "\\" dot)* "\""; +sstring = "'" ((esc \ ['] ) | "\\" dot)* "'" ; +letter = [a-zA-Z]; +digit = [0-9]; */ int Scanner::echo(std::ostream &out){ @@ -155,6 +156,10 @@ scan: "\"" { fatal("unterminated string constant (missing \")"); } "'" { fatal("unterminated string constant (missing ')"); } + istring { cur = cursor; + yylval.regexp = invToRE(token()); + return RANGE; } + cstring { cur = cursor; yylval.regexp = ranToRE(token()); return RANGE; } diff --git a/substr.h b/substr.h index c7ff3b93..cb046f48 100644 --- a/substr.h +++ b/substr.h @@ -19,6 +19,7 @@ public: friend bool operator==(const SubStr &, const SubStr &); SubStr(uchar*, uint); SubStr(char*, uint); + SubStr(char*); SubStr(const SubStr&); void out(std::ostream&) const; }; @@ -52,6 +53,10 @@ inline SubStr::SubStr(char *s, uint l) : str(s), len(l) { } +inline SubStr::SubStr(char *s) + : str(s), len(strlen(s)) +{ } + inline SubStr::SubStr(const SubStr &s) : str(s.str), len(s.len) { } diff --git a/test/repeater.c b/test/repeater.c index af0f7859..3f523c55 100644 --- a/test/repeater.c +++ b/test/repeater.c @@ -4,11 +4,11 @@ #include #include -#define RET(n) printf("%d\n", n); return n +#define RET(n) return n -int scan(char *s, int l){ -char *p = s; -char *q; +int scan(const char *s, int l){ +const char *p = s; +const char *q; #define YYCTYPE char #define YYCURSOR p #define YYLIMIT (s+l) @@ -25,119 +25,137 @@ yy0: if((YYLIMIT - YYCURSOR) < 7) YYFILL(7); yych = *YYCURSOR; switch(yych){ - case 0x0A: case '^': case 'q': goto yy6; - case 'A': goto yy3; + case 0x0A: case 'q': goto yy7; + case 'A': goto yy2; case 'a': goto yy4; - default: goto yy2; + default: goto yy6; } -yy2: YYCURSOR = YYMARKER; - switch(yyaccept){ - case 0: goto yy5; - } -yy3: yych = *++YYCURSOR; +yy2: yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); switch(yych){ - case 0x0A: goto yy8; - case 'A': case 'a': goto yy7; - default: goto yy2; + case 0x0A: goto yy10; + case 'A': case 'a': goto yy8; + default: goto yy3; } -yy4: yyaccept = 0; +yy3: +#line 22 "repeater.re" +{RET(5);} +#line 44 "" +yy4: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); switch(yych){ - case 0x0A: goto yy8; - case 'A': case 'a': goto yy7; + case 0x0A: goto yy10; + case 'A': case 'a': goto yy8; default: goto yy5; } yy5: -#line 20 "repeater.re" +#line 23 "repeater.re" {RET(0);} -#line 54 "" +#line 55 "" yy6: yych = *++YYCURSOR; - goto yy5; + goto yy3; yy7: yych = *++YYCURSOR; + goto yy5; +yy8: yych = *++YYCURSOR; switch(yych){ - case 0x0A: goto yy11; - case 'A': case 'a': goto yy10; - default: goto yy2; + case 0x0A: goto yy13; + case 'A': case 'a': goto yy12; + default: goto yy9; } -yy8: ++YYCURSOR; - goto yy9; -yy9: -#line 16 "repeater.re" +yy9: YYCURSOR = YYMARKER; + switch(yyaccept){ + case 0: goto yy3; + case 1: goto yy5; + } +yy10: ++YYCURSOR; + goto yy11; +yy11: +#line 18 "repeater.re" {RET(1);} -#line 68 "" -yy10: yych = *++YYCURSOR; +#line 76 "" +yy12: yych = *++YYCURSOR; switch(yych){ - case 0x0A: goto yy11; - case 'A': case 'a': goto yy13; - default: goto yy2; + case 0x0A: goto yy13; + case 'A': case 'a': goto yy15; + default: goto yy9; } -yy11: ++YYCURSOR; - goto yy12; -yy12: -#line 17 "repeater.re" +yy13: ++YYCURSOR; + goto yy14; +yy14: +#line 19 "repeater.re" {RET(2);} -#line 80 "" -yy13: yych = *++YYCURSOR; +#line 88 "" +yy15: yych = *++YYCURSOR; switch(yych){ - case 0x0A: goto yy15; - case 'A': case 'a': goto yy14; - default: goto yy2; + case 0x0A: goto yy17; + case 'A': case 'a': goto yy16; + default: goto yy9; } -yy14: yych = *++YYCURSOR; +yy16: yych = *++YYCURSOR; switch(yych){ - case 0x0A: goto yy15; - case 'A': case 'a': goto yy17; - default: goto yy2; + case 0x0A: goto yy17; + case 'A': case 'a': goto yy19; + default: goto yy9; } -yy15: ++YYCURSOR; - goto yy16; -yy16: -#line 19 "repeater.re" -{RET(3);} -#line 98 "" -yy17: yych = *++YYCURSOR; +yy17: ++YYCURSOR; + goto yy18; +yy18: +#line 21 "repeater.re" +{RET(4);} +#line 106 "" +yy19: yych = *++YYCURSOR; switch(yych){ - case 0x0A: goto yy18; - default: goto yy21; + case 0x0A: goto yy20; + default: goto yy23; } -yy18: ++YYCURSOR; - goto yy19; -yy19: -#line 18 "repeater.re" -{RET(4);} -#line 109 "" yy20: ++YYCURSOR; + goto yy21; +yy21: +#line 20 "repeater.re" +{RET(3);} +#line 117 "" +yy22: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy21; -yy21: switch(yych){ - case 0x0A: goto yy15; - case 'A': case 'a': goto yy20; - default: goto yy2; + goto yy23; +yy23: switch(yych){ + case 0x0A: goto yy17; + case 'A': case 'a': goto yy22; + default: goto yy9; } } -#line 21 "repeater.re" +#line 24 "repeater.re" } -#define do_scan(str) scan(str, strlen(str)) +void _do_scan(int exp, const char * str, int len) +{ + int ret = scan(str, len); + + printf("%d %s %d\n", exp, exp == ret ? "==" : "!=", ret); +} + +#define do_scan(exp, str) _do_scan(exp, str, sizeof(str) - 1) main() { - do_scan("a\n"); - do_scan("aa\n"); - do_scan("aaa\n"); - do_scan("aaaa\n"); - do_scan("q"); - do_scan("a"); - do_scan("A\n"); - do_scan("AA\n"); - do_scan("aAa\n"); - do_scan("AaaA\n"); - do_scan("Q"); - do_scan("AaaAa\n"); - do_scan("AaaAaA\n"); - do_scan("A"); - do_scan("\n"); - do_scan("0"); + do_scan(1, "a\n"); + do_scan(2, "aa\n"); + do_scan(2, "aaa\n"); + do_scan(4, "aaaa\n"); + do_scan(0, "q"); + do_scan(0, "a"); + do_scan(1, "A\n"); + do_scan(2, "AA\n"); + do_scan(2, "aAa\n"); + do_scan(4, "AaaA\n"); + do_scan(5, "Q"); + do_scan(4, "AaaAa\n"); + do_scan(3, "AaaAaA\n"); + do_scan(5, "A"); + do_scan(0, "\n"); + do_scan(5, "0"); + do_scan(0, "a"); + do_scan(0, "q"); + do_scan(5, "x"); } diff --git a/test/repeater.re b/test/repeater.re index 05c4c884..146e75ff 100644 --- a/test/repeater.re +++ b/test/repeater.re @@ -2,43 +2,56 @@ #include #include -#define RET(n) printf("%d\n", n); return n +#define RET(n) return n -int scan(char *s, int l){ -char *p = s; -char *q; +int scan(const char *s, int l){ +const char *p = s; +const char *q; #define YYCTYPE char #define YYCURSOR p #define YYLIMIT (s+l) #define YYMARKER q #define YYFILL(n) /*!re2c - 'a'{1}"\n" {RET(1);} - 'a'{2,3}"\n" {RET(2);} - 'a'{6}"\n" {RET(4);} - 'a'{4,}"\n" {RET(3);} - [^aq]|"\n" {RET(0);} + any = [\000-\377]; + + 'a'{1}"\n" {RET(1);} + 'a'{2,3}"\n" {RET(2);} + 'a'{6}"\n" {RET(3);} + 'a'{4,}"\n" {RET(4);} + [^aq\n] {RET(5);} + any {RET(0);} */ } -#define do_scan(str) scan(str, strlen(str)) +void _do_scan(int exp, const char * str, int len) +{ + int ret = scan(str, len); + + printf("%d %s %d\n", exp, exp == ret ? "==" : "!=", ret); +} + +#define do_scan(exp, str) _do_scan(exp, str, sizeof(str) - 1) main() { - do_scan("a\n"); - do_scan("aa\n"); - do_scan("aaa\n"); - do_scan("aaaa\n"); - do_scan("q"); - do_scan("a"); - do_scan("A\n"); - do_scan("AA\n"); - do_scan("aAa\n"); - do_scan("AaaA\n"); - do_scan("Q"); - do_scan("AaaAa\n"); - do_scan("AaaAaA\n"); - do_scan("A"); - do_scan("\n"); - do_scan("0"); + do_scan(1, "a\n"); + do_scan(2, "aa\n"); + do_scan(2, "aaa\n"); + do_scan(4, "aaaa\n"); + do_scan(0, "q"); + do_scan(0, "a"); + do_scan(1, "A\n"); + do_scan(2, "AA\n"); + do_scan(2, "aAa\n"); + do_scan(4, "AaaA\n"); + do_scan(5, "Q"); + do_scan(4, "AaaAa\n"); + do_scan(3, "AaaAaA\n"); + do_scan(5, "A"); + do_scan(0, "\n"); + do_scan(5, "0"); + do_scan(0, "a"); + do_scan(0, "q"); + do_scan(5, "x"); } -- 2.50.1