]> granicus.if.org Git - re2c/commitdiff
- Implemented #1232777 negated char classes.
authorhelly <helly@642ea486-5414-0410-9d7f-a0204ed87703>
Sat, 9 Jul 2005 11:14:41 +0000 (11:14 +0000)
committerhelly <helly@642ea486-5414-0410-9d7f-a0204ed87703>
Sat, 9 Jul 2005 11:14:41 +0000 (11:14 +0000)
CHANGELOG
actions.cc
bootstrap/scanner.cc
re.h
scanner.re
substr.h
test/repeater.c
test/repeater.re

index 136f470b5fe4930424d0b5a398f31f37ec0974cb..7a42f28620775daa716c6cfd6b4a8b9496c343c4 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,6 @@
 Version 0.9.9 (????-??-??)
 --------------------------
+- Implemented #1232777 negated char classes.
 
 Version 0.9.8 (2005-06-26)
 --------------------------
index eacedbbd0d4aabaee1a565e4e4d8f86d853f6edf..14f787a2d0b7e02fb73d3360d8b7abed8ef6d65b 100644 (file)
@@ -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)
index ff66b2693b1dd7df765a38e07bda81f9ea3009c0..cbdbde0b84166823c52b47b2128298604d63d690 100644 (file)
@@ -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 <stdlib.h>
@@ -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 ea52e6442c3fd9df288f294840e96f6bf6d04e8b..22015823c5f8f0f4b43ffd0c0e6209230ccf456b 100644 (file)
--- 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
index 6cd79fd64568fa9234cda95a30a3a10ba9e3c996..d270df791b25fd7d86b0da728628e895a63dd60d 100644 (file)
@@ -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; }
index c7ff3b934428301d1a8d5a0e78ec8ea0715f449a..cb046f486e0d6f48f92ac9712e3b84c26ed43807 100644 (file)
--- 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)
 { }
index af0f785917c301f884fb438037de1eb0bfba5773..3f523c5504e3c79c6ac11909e4a11677e17d8305 100644 (file)
@@ -4,11 +4,11 @@
 #include <stdio.h>
 #include <string.h>
 
-#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 "<stdout>"
+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 "<stdout>"
+#line 55 "<stdout>"
 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 "<stdout>"
-yy10:  yych = *++YYCURSOR;
+#line 76 "<stdout>"
+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 "<stdout>"
-yy13:  yych = *++YYCURSOR;
+#line 88 "<stdout>"
+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 "<stdout>"
-yy17:  yych = *++YYCURSOR;
+yy17:  ++YYCURSOR;
+       goto yy18;
+yy18:
+#line 21 "repeater.re"
+{RET(4);}
+#line 106 "<stdout>"
+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 "<stdout>"
 yy20:  ++YYCURSOR;
+       goto yy21;
+yy21:
+#line 20 "repeater.re"
+{RET(3);}
+#line 117 "<stdout>"
+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");
 }
index 05c4c884229727a1f3f162479a2cc21b02cb33a1..146e75ff6b763ae380e383531d7a0bfc72286b36 100644 (file)
@@ -2,43 +2,56 @@
 #include <stdio.h>
 #include <string.h>
 
-#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");
 }