From 5cf8172ab2157e24d79ed41d8e17b9b23806f21c Mon Sep 17 00:00:00 2001 From: helly Date: Mon, 19 Apr 2004 02:13:49 +0000 Subject: [PATCH] Featurerequest #869298 (Add case insensitive string literals) --- actions.cc | 26 +++ bootstrap/scanner.cc | 532 +++++++++++++++++++++++-------------------- examples/repeater.re | 12 +- re.h | 3 +- re2c.1.in | 7 + scanner.re | 5 + 6 files changed, 331 insertions(+), 254 deletions(-) diff --git a/actions.cc b/actions.cc index c9599e23..f344b5b8 100644 --- a/actions.cc +++ b/actions.cc @@ -423,6 +423,32 @@ RegExp *strToRE(SubStr s){ return re; } +RegExp *strToCaseInsensitiveRE(SubStr s){ + s.len -= 2; s.str += 1; + if(s.len == 0) + return new NullOp; + uchar c = unescape(s); + RegExp *re, *reL, *reU; + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { + reL = matchChar(tolower(c)); + reU = matchChar(toupper(c)); + re = mkAlt(reL, reU); + } else { + re = matchChar(c); + } + while(s.len > 0) { + uchar c = unescape(s); + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { + reL = matchChar(tolower(c)); + reU = matchChar(toupper(c)); + re = new CatOp(re, mkAlt(reL, reU)); + } else { + re = new CatOp(re, matchChar(c)); + } + } + return re; +} + RegExp *ranToRE(SubStr s){ s.len -= 2; s.str += 1; if(s.len == 0) diff --git a/bootstrap/scanner.cc b/bootstrap/scanner.cc index 7f294140..5b39048e 100644 --- a/bootstrap/scanner.cc +++ b/bootstrap/scanner.cc @@ -1,4 +1,4 @@ -/* Generated by re2c 0.9.2 on Sun Mar 14 23:47:55 2004 */ +/* Generated by re2c 0.9.2 on Mon Apr 19 03:45:41 2004 */ #line 1 "scanner.re" /* $Id$ */ #include @@ -158,440 +158,472 @@ yy16: ++YYCURSOR; yy15: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; - if(yych <= ':'){ + if(yych <= '/'){ if(yych <= '"'){ if(yych <= '\n'){ - if(yych <= '\b') goto yy35; - if(yych <= '\t') goto yy31; - goto yy33; + if(yych <= '\b') goto yy37; + if(yych <= '\t') goto yy33; + goto yy35; } else { - if(yych == ' ') goto yy31; - if(yych <= '!') goto yy35; + if(yych == ' ') goto yy33; + if(yych <= '!') goto yy37; goto yy23; } } else { - if(yych <= '*'){ - if(yych <= '\'') goto yy35; - if(yych <= ')') goto yy27; - goto yy21; + if(yych <= ')'){ + if(yych <= '&') goto yy37; + if(yych <= '\'') goto yy25; + goto yy29; } else { - if(yych <= '+') goto yy28; - if(yych == '/') goto yy19; - goto yy35; + if(yych <= '*') goto yy21; + if(yych <= '+') goto yy30; + if(yych <= '.') goto yy37; + goto yy19; } } } else { - if(yych <= 'Z'){ - if(yych <= '='){ - if(yych == '<') goto yy35; - goto yy27; + if(yych <= '@'){ + if(yych <= '<'){ + if(yych == ';') goto yy29; + goto yy37; } else { - if(yych == '?') goto yy28; - if(yych <= '@') goto yy35; - goto yy29; + if(yych <= '=') goto yy29; + if(yych == '?') goto yy30; + goto yy37; } } else { if(yych <= '`'){ - if(yych <= '[') goto yy25; - if(yych <= '\\') goto yy27; - goto yy35; + if(yych <= 'Z') goto yy31; + if(yych <= '[') goto yy27; + if(yych <= '\\') goto yy29; + goto yy37; } else { - if(yych <= 'z') goto yy29; + if(yych <= 'z') goto yy31; if(yych <= '{') goto yy17; - if(yych <= '|') goto yy27; - goto yy35; + if(yych <= '|') goto yy29; + goto yy37; } } } yy17: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); if(yych <= '/') goto yy18; - if(yych <= '9') goto yy56; + if(yych <= '9') goto yy62; goto yy18; yy18: #line 106 "scanner.re" { depth = 1; goto code; } -#line 132 "re2c-output.c" +#line 134 "re2c-output.c" yy19: yych = *++YYCURSOR; - if(yych == '*') goto yy54; + if(yych == '*') goto yy60; goto yy20; yy20: -#line 125 "scanner.re" +#line 130 "scanner.re" { RETURN(*tok); } -#line 139 "re2c-output.c" +#line 141 "re2c-output.c" yy21: yych = *++YYCURSOR; - if(yych == '/') goto yy52; + if(yych == '/') goto yy58; goto yy22; yy22: -#line 127 "scanner.re" +#line 132 "scanner.re" { yylval.op = *tok; RETURN(CLOSE); } -#line 147 "re2c-output.c" +#line 149 "re2c-output.c" yy23: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); - if(yych != '\n') goto yy48; + if(yych != '\n') goto yy54; goto yy24; yy24: -#line 118 "scanner.re" +#line 123 "scanner.re" { fatal("bad string"); } -#line 155 "re2c-output.c" +#line 157 "re2c-output.c" yy25: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); - if(yych != '\n') goto yy42; + if(yych != '\n') goto yy49; goto yy26; yy26: -#line 123 "scanner.re" +#line 158 "scanner.re" +{ cerr << "unexpected character: " << *tok << endl; + goto scan; + } +#line 167 "re2c-output.c" +yy27: yyaccept = 3; + yych = *(YYMARKER = ++YYCURSOR); + if(yych != '\n') goto yy43; + goto yy28; +yy28: +#line 128 "scanner.re" { fatal("bad character constant"); } -#line 163 "re2c-output.c" -yy27: yych = *++YYCURSOR; +#line 175 "re2c-output.c" +yy29: yych = *++YYCURSOR; goto yy20; -yy28: yych = *++YYCURSOR; +yy30: yych = *++YYCURSOR; goto yy22; -yy29: yych = *++YYCURSOR; - goto yy40; -yy30: -#line 142 "scanner.re" +yy31: yych = *++YYCURSOR; + goto yy41; +yy32: +#line 147 "scanner.re" { cur = cursor; yylval.symbol = Symbol::find(token()); return ID; } -#line 175 "re2c-output.c" -yy31: yych = *++YYCURSOR; - goto yy38; -yy32: -#line 146 "scanner.re" -{ goto scan; } -#line 181 "re2c-output.c" +#line 187 "re2c-output.c" yy33: yych = *++YYCURSOR; - goto yy34; + goto yy39; yy34: -#line 148 "scanner.re" -{ if(cursor == eof) RETURN(0); - pos = cursor; cline++; - goto scan; - } -#line 190 "re2c-output.c" +#line 151 "scanner.re" +{ goto scan; } +#line 193 "re2c-output.c" yy35: yych = *++YYCURSOR; goto yy36; yy36: #line 153 "scanner.re" -{ cerr << "unexpected character: " << *tok << endl; +{ if(cursor == eof) RETURN(0); + pos = cursor; cline++; goto scan; - } -#line 198 "re2c-output.c" -yy37: ++YYCURSOR; + } +#line 202 "re2c-output.c" +yy37: yych = *++YYCURSOR; + goto yy26; +yy38: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy38; -yy38: if(yych == '\t') goto yy37; - if(yych == ' ') goto yy37; - goto yy32; -yy39: ++YYCURSOR; + goto yy39; +yy39: if(yych == '\t') goto yy38; + if(yych == ' ') goto yy38; + goto yy34; +yy40: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy40; -yy40: if(yych <= '@'){ - if(yych <= '/') goto yy30; - if(yych <= '9') goto yy39; - goto yy30; + goto yy41; +yy41: if(yych <= '@'){ + if(yych <= '/') goto yy32; + if(yych <= '9') goto yy40; + goto yy32; } else { - if(yych <= 'Z') goto yy39; - if(yych <= '`') goto yy30; - if(yych <= 'z') goto yy39; - goto yy30; + if(yych <= 'Z') goto yy40; + if(yych <= '`') goto yy32; + if(yych <= 'z') goto yy40; + goto yy32; } -yy41: ++YYCURSOR; +yy42: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy42; -yy42: if(yych <= '['){ - if(yych != '\n') goto yy41; - goto yy43; + goto yy43; +yy43: if(yych <= '['){ + if(yych != '\n') goto yy42; + goto yy44; } else { - if(yych <= '\\') goto yy44; - if(yych <= ']') goto yy45; - goto yy41; + if(yych <= '\\') goto yy45; + if(yych <= ']') goto yy46; + goto yy42; } -yy43: YYCURSOR = YYMARKER; +yy44: YYCURSOR = YYMARKER; switch(yyaccept){ case 0: goto yy18; case 1: goto yy24; + case 3: goto yy28; case 2: goto yy26; } -yy44: ++YYCURSOR; +yy45: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == '\n') goto yy43; - goto yy41; -yy45: yych = *++YYCURSOR; - goto yy46; -yy46: -#line 120 "scanner.re" + if(yych == '\n') goto yy44; + goto yy42; +yy46: yych = *++YYCURSOR; + goto yy47; +yy47: +#line 125 "scanner.re" { cur = cursor; yylval.regexp = ranToRE(token()); return RANGE; } -#line 250 "re2c-output.c" -yy47: ++YYCURSOR; +#line 257 "re2c-output.c" +yy48: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy49; +yy49: if(yych <= '&'){ + if(yych == '\n') goto yy44; + goto yy48; + } else { + if(yych <= '\'') goto yy51; + if(yych != '\\') goto yy48; + goto yy50; + } +yy50: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; + if(yych == '\n') goto yy44; goto yy48; -yy48: if(yych <= '!'){ - if(yych == '\n') goto yy43; - goto yy47; +yy51: yych = *++YYCURSOR; + goto yy52; +yy52: +#line 119 "scanner.re" +{ cur = cursor; + yylval.regexp = strToCaseInsensitiveRE(token()); + return STRING; } +#line 282 "re2c-output.c" +yy53: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy54; +yy54: if(yych <= '!'){ + if(yych == '\n') goto yy44; + goto yy53; } else { - if(yych <= '"') goto yy50; - if(yych != '\\') goto yy47; - goto yy49; + if(yych <= '"') goto yy56; + if(yych != '\\') goto yy53; + goto yy55; } -yy49: ++YYCURSOR; +yy55: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == '\n') goto yy43; - goto yy47; -yy50: yych = *++YYCURSOR; - goto yy51; -yy51: + if(yych == '\n') goto yy44; + goto yy53; +yy56: yych = *++YYCURSOR; + goto yy57; +yy57: #line 115 "scanner.re" { cur = cursor; yylval.regexp = strToRE(token()); return STRING; } -#line 275 "re2c-output.c" -yy52: yych = *++YYCURSOR; - goto yy53; -yy53: +#line 307 "re2c-output.c" +yy58: yych = *++YYCURSOR; + goto yy59; +yy59: #line 112 "scanner.re" { tok = cursor; RETURN(0); } -#line 282 "re2c-output.c" -yy54: yych = *++YYCURSOR; - goto yy55; -yy55: +#line 314 "re2c-output.c" +yy60: yych = *++YYCURSOR; + goto yy61; +yy61: #line 109 "scanner.re" { depth = 1; goto comment; } -#line 289 "re2c-output.c" -yy56: ++YYCURSOR; +#line 321 "re2c-output.c" +yy62: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy57; -yy57: if(yych <= '/'){ - if(yych == ',') goto yy60; - goto yy43; + goto yy63; +yy63: if(yych <= '/'){ + if(yych == ',') goto yy66; + goto yy44; } else { - if(yych <= '9') goto yy56; - if(yych != '}') goto yy43; - goto yy58; + if(yych <= '9') goto yy62; + if(yych != '}') goto yy44; + goto yy64; } -yy58: yych = *++YYCURSOR; - goto yy59; -yy59: -#line 130 "scanner.re" +yy64: yych = *++YYCURSOR; + goto yy65; +yy65: +#line 135 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = atoi((char *)tok+1); RETURN(CLOSESIZE); } -#line 309 "re2c-output.c" -yy60: yych = *++YYCURSOR; - if(yych != '}') goto yy64; - goto yy61; -yy61: yych = *++YYCURSOR; - goto yy62; -yy62: -#line 138 "scanner.re" +#line 341 "re2c-output.c" +yy66: yych = *++YYCURSOR; + if(yych != '}') goto yy70; + goto yy67; +yy67: yych = *++YYCURSOR; + goto yy68; +yy68: +#line 143 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = -1; RETURN(CLOSESIZE); } -#line 320 "re2c-output.c" -yy63: ++YYCURSOR; +#line 352 "re2c-output.c" +yy69: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy64; -yy64: if(yych <= '/') goto yy43; - if(yych <= '9') goto yy63; - if(yych != '}') goto yy43; - goto yy65; -yy65: yych = *++YYCURSOR; - goto yy66; -yy66: -#line 134 "scanner.re" + goto yy70; +yy70: if(yych <= '/') goto yy44; + if(yych <= '9') goto yy69; + if(yych != '}') goto yy44; + goto yy71; +yy71: yych = *++YYCURSOR; + goto yy72; +yy72: +#line 139 "scanner.re" { yylval.extop.minsize = atoi((char *)tok+1); yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)tok, ',')+1)); RETURN(CLOSESIZE); } -#line 336 "re2c-output.c" +#line 368 "re2c-output.c" } -#line 156 "scanner.re" +#line 161 "scanner.re" code: -#line 340 "re2c-output.c" +#line 372 "re2c-output.c" { YYCTYPE yych; unsigned int yyaccept; - goto yy67; -yy68: ++YYCURSOR; -yy67: + goto yy73; +yy74: ++YYCURSOR; +yy73: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= '&'){ if(yych <= '\n'){ - if(yych <= '\t') goto yy75; - goto yy73; + if(yych <= '\t') goto yy81; + goto yy79; } else { - if(yych == '"') goto yy77; - goto yy75; + if(yych == '"') goto yy83; + goto yy81; } } else { if(yych <= '{'){ - if(yych <= '\'') goto yy78; - if(yych <= 'z') goto yy75; - goto yy71; + if(yych <= '\'') goto yy84; + if(yych <= 'z') goto yy81; + goto yy77; } else { - if(yych != '}') goto yy75; - goto yy69; + if(yych != '}') goto yy81; + goto yy75; } } -yy69: yych = *++YYCURSOR; - goto yy70; -yy70: -#line 160 "scanner.re" +yy75: yych = *++YYCURSOR; + goto yy76; +yy76: +#line 165 "scanner.re" { if(--depth == 0){ cur = cursor; yylval.token = new Token(token(), tline); return CODE; } goto code; } -#line 377 "re2c-output.c" -yy71: yych = *++YYCURSOR; - goto yy72; -yy72: -#line 166 "scanner.re" +#line 409 "re2c-output.c" +yy77: yych = *++YYCURSOR; + goto yy78; +yy78: +#line 171 "scanner.re" { ++depth; goto code; } -#line 384 "re2c-output.c" -yy73: yych = *++YYCURSOR; - goto yy74; -yy74: -#line 168 "scanner.re" +#line 416 "re2c-output.c" +yy79: yych = *++YYCURSOR; + goto yy80; +yy80: +#line 173 "scanner.re" { if(cursor == eof) fatal("missing '}'"); pos = cursor; cline++; goto code; } -#line 393 "re2c-output.c" -yy75: yych = *++YYCURSOR; - goto yy76; -yy76: -#line 172 "scanner.re" +#line 425 "re2c-output.c" +yy81: yych = *++YYCURSOR; + goto yy82; +yy82: +#line 177 "scanner.re" { goto code; } -#line 399 "re2c-output.c" -yy77: yyaccept = 0; +#line 431 "re2c-output.c" +yy83: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == '\n') goto yy76; - goto yy84; -yy78: yyaccept = 0; + if(yych == '\n') goto yy82; + goto yy90; +yy84: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych == '\n') goto yy76; - goto yy80; -yy79: ++YYCURSOR; + if(yych == '\n') goto yy82; + goto yy86; +yy85: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy80; -yy80: if(yych <= '&'){ - if(yych != '\n') goto yy79; - goto yy81; + goto yy86; +yy86: if(yych <= '&'){ + if(yych != '\n') goto yy85; + goto yy87; } else { - if(yych <= '\'') goto yy75; - if(yych == '\\') goto yy82; - goto yy79; + if(yych <= '\'') goto yy81; + if(yych == '\\') goto yy88; + goto yy85; } -yy81: YYCURSOR = YYMARKER; +yy87: YYCURSOR = YYMARKER; switch(yyaccept){ - case 0: goto yy76; + case 0: goto yy82; } -yy82: ++YYCURSOR; +yy88: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == '\n') goto yy81; - goto yy79; -yy83: ++YYCURSOR; + if(yych == '\n') goto yy87; + goto yy85; +yy89: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - goto yy84; -yy84: if(yych <= '!'){ - if(yych == '\n') goto yy81; - goto yy83; + goto yy90; +yy90: if(yych <= '!'){ + if(yych == '\n') goto yy87; + goto yy89; } else { - if(yych <= '"') goto yy75; - if(yych != '\\') goto yy83; - goto yy85; + if(yych <= '"') goto yy81; + if(yych != '\\') goto yy89; + goto yy91; } -yy85: ++YYCURSOR; +yy91: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == '\n') goto yy81; - goto yy83; + if(yych == '\n') goto yy87; + goto yy89; } -#line 173 "scanner.re" +#line 178 "scanner.re" comment: -#line 449 "re2c-output.c" +#line 481 "re2c-output.c" { YYCTYPE yych; unsigned int yyaccept; - goto yy86; -yy87: ++YYCURSOR; -yy86: + goto yy92; +yy93: ++YYCURSOR; +yy92: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yych <= ')'){ - if(yych == '\n') goto yy91; - goto yy93; + if(yych == '\n') goto yy97; + goto yy99; } else { - if(yych <= '*') goto yy88; - if(yych == '/') goto yy90; - goto yy93; + if(yych <= '*') goto yy94; + if(yych == '/') goto yy96; + goto yy99; } -yy88: yych = *++YYCURSOR; - if(yych == '/') goto yy96; - goto yy89; -yy89: -#line 187 "scanner.re" +yy94: yych = *++YYCURSOR; + if(yych == '/') goto yy102; + goto yy95; +yy95: +#line 192 "scanner.re" { goto comment; } -#line 472 "re2c-output.c" -yy90: yych = *++YYCURSOR; - if(yych == '*') goto yy94; - goto yy89; -yy91: yych = *++YYCURSOR; - goto yy92; -yy92: -#line 183 "scanner.re" +#line 504 "re2c-output.c" +yy96: yych = *++YYCURSOR; + if(yych == '*') goto yy100; + goto yy95; +yy97: yych = *++YYCURSOR; + goto yy98; +yy98: +#line 188 "scanner.re" { if(cursor == eof) RETURN(0); tok = pos = cursor; cline++; goto comment; } -#line 484 "re2c-output.c" -yy93: yych = *++YYCURSOR; - goto yy89; -yy94: yych = *++YYCURSOR; +#line 516 "re2c-output.c" +yy99: yych = *++YYCURSOR; goto yy95; -yy95: -#line 181 "scanner.re" +yy100: yych = *++YYCURSOR; + goto yy101; +yy101: +#line 186 "scanner.re" { ++depth; goto comment; } -#line 493 "re2c-output.c" -yy96: yych = *++YYCURSOR; - goto yy97; -yy97: -#line 177 "scanner.re" +#line 525 "re2c-output.c" +yy102: yych = *++YYCURSOR; + goto yy103; +yy103: +#line 182 "scanner.re" { if(--depth == 0) goto scan; else goto comment; } -#line 502 "re2c-output.c" +#line 534 "re2c-output.c" } -#line 188 "scanner.re" +#line 193 "scanner.re" } diff --git a/examples/repeater.re b/examples/repeater.re index c8e20557..9afff2f0 100755 --- a/examples/repeater.re +++ b/examples/repeater.re @@ -13,9 +13,9 @@ char *q; #define YYMARKER q #define YYFILL(n) /*!re2c - "a"{1}"\n" {RET(1);} - "a"{2,3}"\n" {RET(2);} - "a"{4,}"\n" {RET(3);} + 'a'{1}"\n" {RET(1);} + 'a'{2,3}"\n" {RET(2);} + 'a'{4,}"\n" {RET(3);} [^aq]|"\n" {RET(0);} */ } @@ -30,6 +30,12 @@ main() 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("A"); do_scan("\n"); do_scan("0"); } diff --git a/re.h b/re.h index 51fd1c7b..6e6124c2 100644 --- a/re.h +++ b/re.h @@ -201,5 +201,6 @@ extern void genCode(ostream&, RegExp*); extern RegExp *mkDiff(RegExp*, RegExp*); extern RegExp *strToRE(SubStr); extern RegExp *ranToRE(SubStr); - +extern RegExp *strToCaseInsensitiveRE(SubStr s); + #endif diff --git a/re2c.1.in b/re2c.1.in index 1b155564..346b46bb 100644 --- a/re2c.1.in +++ b/re2c.1.in @@ -7,6 +7,9 @@ .ds rx regular expression .ds lx \fIl\fP-expression \"$Log$ +\"Revision 1.7 2004/04/19 02:13:48 helly +\"Featurerequest #869298 (Add case insensitive string literals) +\" \"Revision 1.6 2004/04/17 15:49:13 helly \"Fix example, cur must be set to make the uncommented printf's working \" @@ -175,6 +178,10 @@ Name definitions are of the form the literal string \fCfoo\fP. ANSI-C escape sequences can be used. .TP +\fC'foo'\fP +the literal string \fCfoo\fP (characters [a-zA-Z] treated case-insensitive). +ANSI-C escape sequences can be used. +.TP \fC[xyz]\fP a "character class"; in this case, the \*(rx matches either an '\fCx\fP', a '\fCy\fP', or a '\fCz\fP'. diff --git a/scanner.re b/scanner.re index 4b76eb4c..15d0b5f3 100644 --- a/scanner.re +++ b/scanner.re @@ -115,6 +115,11 @@ scan: dstring { cur = cursor; yylval.regexp = strToRE(token()); return STRING; } + + sstring { cur = cursor; + yylval.regexp = strToCaseInsensitiveRE(token()); + return STRING; } + "\"" { fatal("bad string"); } cstring { cur = cursor; -- 2.50.1