From: helly Date: Sat, 8 Apr 2006 20:00:44 +0000 (+0000) Subject: - Add -s test for scanner X-Git-Tag: 0.13.6~421 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1d760a6a7fedead01729a78b4b9b6f7cbce30333;p=re2c - Add -s test for scanner --- diff --git a/test/scanner.s.c b/test/scanner.s.c new file mode 100755 index 00000000..df287d9e --- /dev/null +++ b/test/scanner.s.c @@ -0,0 +1,1142 @@ +/* Generated by re2c */ +#line 1 "scanner.s.re" +/* $Id$ */ +#include +#include +#include +#include +#include "scanner.h" +#include "parser.h" +#include "y.tab.h" +#include "globals.h" +#include "dfa.h" + +extern YYSTYPE yylval; + +#ifndef MAX +#define MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +#define BSIZE 8192 + +#define YYCTYPE char +#define YYCURSOR cursor +#define YYLIMIT lim +#define YYMARKER ptr +#define YYFILL(n) {cursor = fill(cursor);} + +#define RETURN(i) {cur = cursor; return i;} + +namespace re2c +{ + +Scanner::Scanner(std::istream& i, std::ostream& o) + : in(i) + , out(o) + , bot(NULL), tok(NULL), ptr(NULL), cur(NULL), pos(NULL), lim(NULL) + , top(NULL), eof(NULL), tchar(0), tline(0), cline(1), iscfg(0) +{ + ; +} + +char *Scanner::fill(char *cursor) +{ + if(!eof) + { + uint cnt = tok - bot; + if(cnt) + { + memcpy(bot, tok, lim - tok); + tok = bot; + ptr -= cnt; + cursor -= cnt; + pos -= cnt; + lim -= cnt; + } + if((top - lim) < BSIZE) + { + char *buf = new char[(lim - bot) + BSIZE]; + memcpy(buf, tok, lim - tok); + tok = buf; + ptr = &buf[ptr - bot]; + cursor = &buf[cursor - bot]; + pos = &buf[pos - bot]; + lim = &buf[lim - bot]; + top = &lim[BSIZE]; + delete [] bot; + bot = buf; + } + in.read(lim, BSIZE); + if ((cnt = in.gcount()) != BSIZE ) + { + eof = &lim[cnt]; *eof++ = '\0'; + } + lim += cnt; + } + return cursor; +} + +#line 95 "scanner.s.re" + + +int Scanner::echo() +{ + char *cursor = cur; + bool ignore_eoc = false; + + if (eof && cursor == eof) // Catch EOF + { + return 0; + } + + tok = cursor; +echo: + +#line 96 "" +{ + YYCTYPE yych; + + if((YYLIMIT - YYCURSOR) < 11) YYFILL(11); + yych = *YYCURSOR; + if(yych <= ')') { + if(yych <= 0x00) goto yy7; + if(yych == 0x0A) goto yy5; + goto yy9; + } else { + if(yych <= '*') goto yy4; + if(yych != '/') goto yy9; + } + yych = *(YYMARKER = ++YYCURSOR); + if(yych == '*') goto yy12; +yy3: +#line 141 "scanner.s.re" + { + goto echo; + } +#line 117 "" +yy4: + yych = *++YYCURSOR; + if(yych == '/') goto yy10; + goto yy3; +yy5: + ++YYCURSOR; +#line 130 "scanner.s.re" + { + out.write((const char*)(tok), (const char*)(cursor) - (const char*)(tok)); + tok = pos = cursor; cline++; + goto echo; + } +#line 130 "" +yy7: + ++YYCURSOR; +#line 135 "scanner.s.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 140 "" +yy9: + yych = *++YYCURSOR; + goto yy3; +yy10: + ++YYCURSOR; +#line 121 "scanner.s.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 156 "" +yy12: + yych = *++YYCURSOR; + if(yych == '!') goto yy14; +yy13: + YYCURSOR = YYMARKER; + goto yy3; +yy14: + yych = *++YYCURSOR; + 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; + yych = *++YYCURSOR; + if(yych != '2') goto yy13; + yych = *++YYCURSOR; + if(yych != 'c') goto yy13; + ++YYCURSOR; +#line 110 "scanner.s.re" + { + out.write((const char*)(tok), (const char*)(&cursor[-7]) - (const char*)(tok)); + tok = cursor; + RETURN(1); + } +#line 186 "" +yy21: + yych = *++YYCURSOR; + if(yych != 'x') goto yy13; + yych = *++YYCURSOR; + if(yych != ':') goto yy13; + yych = *++YYCURSOR; + if(yych != 'r') goto yy13; + yych = *++YYCURSOR; + if(yych != 'e') goto yy13; + yych = *++YYCURSOR; + if(yych != '2') goto yy13; + yych = *++YYCURSOR; + if(yych != 'c') goto yy13; + ++YYCURSOR; +#line 115 "scanner.s.re" + { + out << "#define YYMAXFILL " << maxFill << std::endl; + tok = pos = cursor; + ignore_eoc = true; + goto echo; + } +#line 208 "" +} +#line 144 "scanner.s.re" + +} + + +int Scanner::scan() +{ + char *cursor = cur; + uint depth; + +scan: + tchar = cursor - pos; + tline = cline; + tok = cursor; + if (iscfg == 1) + { + goto config; + } + else if (iscfg == 2) + { + goto value; + } + +#line 233 "" +{ + YYCTYPE yych; + unsigned int yyaccept = 0; + if((YYLIMIT - YYCURSOR) < 5) YYFILL(5); + yych = *YYCURSOR; + if(yych <= '/') { + if(yych <= '!') { + if(yych <= 0x0C) { + if(yych <= 0x08) goto yy56; + if(yych <= 0x09) goto yy50; + if(yych <= 0x0A) goto yy52; + goto yy56; + } else { + if(yych <= 0x0D) goto yy54; + if(yych == ' ') goto yy50; + goto yy56; + } + } else { + if(yych <= ')') { + if(yych <= '"') goto yy37; + if(yych <= '&') goto yy56; + if(yych <= '\'') goto yy39; + goto yy43; + } else { + if(yych <= '+') { + if(yych <= '*') goto yy35; + goto yy44; + } else { + if(yych <= '-') goto yy56; + if(yych <= '.') goto yy48; + goto yy33; + } + } + } + } else { + if(yych <= 'Z') { + if(yych <= '=') { + if(yych == ';') goto yy43; + if(yych <= '<') goto yy56; + goto yy43; + } else { + if(yych == '?') goto yy44; + if(yych <= '@') goto yy56; + goto yy47; + } + } else { + if(yych <= 'q') { + if(yych <= '[') goto yy41; + if(yych <= '\\') goto yy43; + if(yych <= '`') goto yy56; + goto yy47; + } else { + if(yych <= 'z') { + if(yych <= 'r') goto yy45; + goto yy47; + } else { + if(yych <= '{') goto yy31; + if(yych <= '|') goto yy43; + goto yy56; + } + } + } + } +yy31: + yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if(yych <= '/') { + if(yych == ',') goto yy97; + } else { + if(yych <= '0') goto yy94; + if(yych <= '9') goto yy95; + } +yy32: +#line 166 "scanner.s.re" + { depth = 1; + goto code; + } +#line 311 "" +yy33: + ++YYCURSOR; + if((yych = *YYCURSOR) == '*') goto yy92; +yy34: +#line 196 "scanner.s.re" + { RETURN(*tok); } +#line 318 "" +yy35: + ++YYCURSOR; + if((yych = *YYCURSOR) == '/') goto yy90; +yy36: +#line 198 "scanner.s.re" + { yylval.op = *tok; + RETURN(CLOSE); } +#line 326 "" +yy37: + yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if(yych != 0x0A) goto yy86; +yy38: +#line 183 "scanner.s.re" + { fatal("unterminated string constant (missing \")"); } +#line 334 "" +yy39: + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if(yych != 0x0A) goto yy81; +yy40: +#line 184 "scanner.s.re" + { fatal("unterminated string constant (missing ')"); } +#line 342 "" +yy41: + yyaccept = 3; + yych = *(YYMARKER = ++YYCURSOR); + if(yych == 0x0A) goto yy42; + if(yych == '^') goto yy72; + goto yy71; +yy42: +#line 194 "scanner.s.re" + { fatal("unterminated range (missing ])"); } +#line 352 "" +yy43: + yych = *++YYCURSOR; + goto yy34; +yy44: + yych = *++YYCURSOR; + goto yy36; +yy45: + ++YYCURSOR; + if((yych = *YYCURSOR) == 'e') goto yy62; + goto yy61; +yy46: +#line 225 "scanner.s.re" + { cur = cursor; + yylval.symbol = Symbol::find(token()); + return ID; } +#line 368 "" +yy47: + yych = *++YYCURSOR; + goto yy61; +yy48: + ++YYCURSOR; +#line 229 "scanner.s.re" + { cur = cursor; + yylval.regexp = mkDot(); + return RANGE; + } +#line 379 "" +yy50: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy59; +yy51: +#line 234 "scanner.s.re" + { goto scan; } +#line 387 "" +yy52: + ++YYCURSOR; +yy53: +#line 236 "scanner.s.re" + { if(cursor == eof) RETURN(0); + pos = cursor; cline++; + goto scan; + } +#line 396 "" +yy54: + ++YYCURSOR; + if((yych = *YYCURSOR) == 0x0A) goto yy57; +yy55: +#line 241 "scanner.s.re" + { std::ostringstream msg; + msg << "unexpected character: "; + prtChOrHex(msg, *tok); + fatal(msg.str().c_str()); + goto scan; + } +#line 408 "" +yy56: + yych = *++YYCURSOR; + goto yy55; +yy57: + yych = *++YYCURSOR; + goto yy53; +yy58: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy59: + if(yych == 0x09) goto yy58; + if(yych == ' ') goto yy58; + goto yy51; +yy60: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy61: + if(yych <= '@') { + if(yych <= '/') goto yy46; + if(yych <= '9') goto yy60; + goto yy46; + } else { + if(yych <= 'Z') goto yy60; + if(yych <= '`') goto yy46; + if(yych <= 'z') goto yy60; + goto yy46; + } +yy62: + yych = *++YYCURSOR; + if(yych != '2') goto yy61; + yych = *++YYCURSOR; + if(yych != 'c') goto yy61; + yyaccept = 4; + yych = *(YYMARKER = ++YYCURSOR); + if(yych != ':') goto yy61; +yy65: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych <= '@') goto yy66; + if(yych <= 'Z') goto yy67; + if(yych <= '`') goto yy66; + if(yych <= 'z') goto yy67; +yy66: + YYCURSOR = YYMARKER; + switch(yyaccept) { + case 0: goto yy32; + case 1: goto yy38; + case 2: goto yy40; + case 3: goto yy42; + case 6: goto yy98; + case 5: goto yy69; + case 4: goto yy46; + } +yy67: + yyaccept = 5; + YYMARKER = ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych <= 'Z') { + if(yych <= '9') { + if(yych >= '0') goto yy67; + } else { + if(yych <= ':') goto yy65; + if(yych >= 'A') goto yy67; + } + } else { + if(yych <= '_') { + if(yych >= '_') goto yy67; + } else { + if(yych <= '`') goto yy69; + if(yych <= 'z') goto yy67; + } + } +yy69: +#line 218 "scanner.s.re" + { cur = cursor; + tok+= 5; /* skip "re2c:" */ + iscfg = 1; + yylval.str = new Str(token()); + return CONFIG; + } +#line 493 "" +yy70: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy71: + if(yych <= '[') { + if(yych == 0x0A) goto yy66; + goto yy70; + } else { + if(yych <= '\\') goto yy74; + if(yych <= ']') goto yy75; + goto yy70; + } +yy72: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych <= '[') { + if(yych == 0x0A) goto yy66; + goto yy72; + } else { + if(yych <= '\\') goto yy77; + if(yych <= ']') goto yy78; + goto yy72; + } +yy74: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych == 0x0A) goto yy66; + goto yy70; +yy75: + ++YYCURSOR; +#line 190 "scanner.s.re" + { cur = cursor; + yylval.regexp = ranToRE(token()); + return RANGE; } +#line 531 "" +yy77: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych == 0x0A) goto yy66; + goto yy72; +yy78: + ++YYCURSOR; +#line 186 "scanner.s.re" + { cur = cursor; + yylval.regexp = invToRE(token()); + return RANGE; } +#line 544 "" +yy80: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy81: + if(yych <= '&') { + if(yych == 0x0A) goto yy66; + goto yy80; + } else { + if(yych <= '\'') goto yy83; + if(yych != '\\') goto yy80; + } + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych == 0x0A) goto yy66; + goto yy80; +yy83: + ++YYCURSOR; +#line 179 "scanner.s.re" + { cur = cursor; + yylval.regexp = strToCaseInsensitiveRE(token()); + return STRING; } +#line 568 "" +yy85: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy86: + if(yych <= '!') { + if(yych == 0x0A) goto yy66; + goto yy85; + } else { + if(yych <= '"') goto yy88; + if(yych != '\\') goto yy85; + } + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych == 0x0A) goto yy66; + goto yy85; +yy88: + ++YYCURSOR; +#line 175 "scanner.s.re" + { cur = cursor; + yylval.regexp = strToRE(token()); + return STRING; } +#line 592 "" +yy90: + ++YYCURSOR; +#line 172 "scanner.s.re" + { tok = cursor; + RETURN(0); } +#line 598 "" +yy92: + ++YYCURSOR; +#line 169 "scanner.s.re" + { depth = 1; + goto comment; } +#line 604 "" +yy94: + yych = *++YYCURSOR; + if(yych == ',') goto yy108; + goto yy96; +yy95: + ++YYCURSOR; + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; +yy96: + if(yych <= '/') { + if(yych == ',') goto yy101; + goto yy66; + } else { + if(yych <= '9') goto yy95; + if(yych == '}') goto yy99; + goto yy66; + } +yy97: + ++YYCURSOR; +yy98: +#line 216 "scanner.s.re" + { fatal("illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers"); } +#line 627 "" +yy99: + ++YYCURSOR; +#line 204 "scanner.s.re" + { yylval.extop.minsize = atoi((char *)tok+1); + yylval.extop.maxsize = atoi((char *)tok+1); + RETURN(CLOSESIZE); } +#line 634 "" +yy101: + yyaccept = 6; + yych = *(YYMARKER = ++YYCURSOR); + if(yych <= '/') goto yy98; + if(yych <= '9') goto yy104; + if(yych != '}') goto yy98; + ++YYCURSOR; +#line 212 "scanner.s.re" + { yylval.extop.minsize = atoi((char *)tok+1); + yylval.extop.maxsize = -1; + RETURN(CLOSESIZE); } +#line 646 "" +yy104: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych <= '/') goto yy66; + if(yych <= '9') goto yy104; + if(yych != '}') goto yy66; + ++YYCURSOR; +#line 208 "scanner.s.re" + { yylval.extop.minsize = atoi((char *)tok+1); + yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)tok, ',')+1)); + RETURN(CLOSESIZE); } +#line 659 "" +yy108: + yyaccept = 6; + yych = *(YYMARKER = ++YYCURSOR); + if(yych <= '/') goto yy98; + if(yych <= '9') goto yy104; + if(yych != '}') goto yy98; + ++YYCURSOR; +#line 201 "scanner.s.re" + { yylval.op = '*'; + RETURN(CLOSE); } +#line 670 "" +} +#line 247 "scanner.s.re" + + +code: + +#line 677 "" +{ + YYCTYPE yych; + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + if(yych <= '&') { + if(yych <= 0x0A) { + if(yych <= 0x09) goto yy119; + goto yy117; + } else { + if(yych == '"') goto yy121; + goto yy119; + } + } else { + if(yych <= '{') { + if(yych <= '\'') goto yy122; + if(yych <= 'z') goto yy119; + goto yy115; + } else { + if(yych != '}') goto yy119; + } + } + ++YYCURSOR; +#line 251 "scanner.s.re" + { if(--depth == 0){ + cur = cursor; + yylval.token = new Token(token(), tline); + return CODE; + } + goto code; } +#line 707 "" +yy115: + ++YYCURSOR; +#line 257 "scanner.s.re" + { ++depth; + goto code; } +#line 713 "" +yy117: + ++YYCURSOR; +#line 259 "scanner.s.re" + { if(cursor == eof) fatal("missing '}'"); + pos = cursor; cline++; + goto code; + } +#line 721 "" +yy119: + ++YYCURSOR; +yy120: +#line 263 "scanner.s.re" + { goto code; } +#line 727 "" +yy121: + yych = *(YYMARKER = ++YYCURSOR); + if(yych == 0x0A) goto yy120; + goto yy128; +yy122: + yych = *(YYMARKER = ++YYCURSOR); + if(yych == 0x0A) goto yy120; + goto yy124; +yy123: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy124: + if(yych <= '&') { + if(yych != 0x0A) goto yy123; + } else { + if(yych <= '\'') goto yy119; + if(yych == '\\') goto yy126; + goto yy123; + } +yy125: + YYCURSOR = YYMARKER; + goto yy120; +yy126: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych == 0x0A) goto yy125; + goto yy123; +yy127: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy128: + if(yych <= '!') { + if(yych == 0x0A) goto yy125; + goto yy127; + } else { + if(yych <= '"') goto yy119; + if(yych != '\\') goto yy127; + } + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych == 0x0A) goto yy125; + goto yy127; +} +#line 264 "scanner.s.re" + + +comment: + +#line 780 "" +{ + YYCTYPE yych; + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + if(yych <= ')') { + if(yych == 0x0A) goto yy135; + goto yy137; + } else { + if(yych <= '*') goto yy132; + if(yych == '/') goto yy134; + goto yy137; + } +yy132: + ++YYCURSOR; + if((yych = *YYCURSOR) == '/') goto yy140; +yy133: +#line 279 "scanner.s.re" + { if(cursor == eof) RETURN(0); + goto comment; } +#line 800 "" +yy134: + yych = *++YYCURSOR; + if(yych == '*') goto yy138; + goto yy133; +yy135: + ++YYCURSOR; +#line 275 "scanner.s.re" + { if(cursor == eof) RETURN(0); + tok = pos = cursor; cline++; + goto comment; + } +#line 812 "" +yy137: + yych = *++YYCURSOR; + goto yy133; +yy138: + ++YYCURSOR; +#line 272 "scanner.s.re" + { ++depth; + fatal("ambiguous /* found"); + goto comment; } +#line 822 "" +yy140: + ++YYCURSOR; +#line 268 "scanner.s.re" + { if(--depth == 0) + goto scan; + else + goto comment; } +#line 830 "" +} +#line 281 "scanner.s.re" + + +config: + +#line 837 "" +{ + YYCTYPE yych; + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + if(yych <= 0x1F) { + if(yych != 0x09) goto yy148; + } else { + if(yych <= ' ') goto yy144; + if(yych == '=') goto yy146; + goto yy148; + } +yy144: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy153; +yy145: +#line 285 "scanner.s.re" + { goto config; } +#line 856 "" +yy146: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy151; +yy147: +#line 286 "scanner.s.re" + { iscfg = 2; + cur = cursor; + RETURN('='); + } +#line 867 "" +yy148: + ++YYCURSOR; +#line 290 "scanner.s.re" + { fatal("missing '='"); } +#line 872 "" +yy150: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy151: + if(yych == 0x09) goto yy150; + if(yych == ' ') goto yy150; + goto yy147; +yy152: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy153: + if(yych == 0x09) goto yy152; + if(yych == ' ') goto yy152; + goto yy145; +} +#line 291 "scanner.s.re" + + +value: + +#line 895 "" +{ + YYCTYPE yych; + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + if(yych <= '&') { + if(yych <= 0x0D) { + if(yych <= 0x08) goto yy162; + if(yych <= 0x0A) goto yy156; + if(yych <= 0x0C) goto yy162; + } else { + if(yych <= ' ') { + if(yych <= 0x1F) goto yy162; + } else { + if(yych == '"') goto yy164; + goto yy162; + } + } + } else { + if(yych <= '/') { + if(yych <= '\'') goto yy166; + if(yych == '-') goto yy159; + goto yy162; + } else { + if(yych <= '9') { + if(yych <= '0') goto yy157; + goto yy160; + } else { + if(yych != ';') goto yy162; + } + } + } +yy156: +#line 300 "scanner.s.re" + { cur = cursor; + yylval.str = new Str(token()); + iscfg = 0; + return VALUE; + } +#line 934 "" +yy157: + ++YYCURSOR; + if((yych = *YYCURSOR) <= 0x0D) { + if(yych <= 0x08) goto yy162; + if(yych <= 0x0A) goto yy158; + if(yych <= 0x0C) goto yy162; + } else { + if(yych <= ' ') { + if(yych <= 0x1F) goto yy162; + } else { + if(yych != ';') goto yy162; + } + } +yy158: +#line 295 "scanner.s.re" + { cur = cursor; + yylval.number = atoi(token().to_string().c_str()); + iscfg = 0; + return NUMBER; + } +#line 955 "" +yy159: + yych = *++YYCURSOR; + if(yych <= '0') goto yy163; + if(yych >= ':') goto yy163; +yy160: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych <= 0x1F) { + if(yych <= 0x0A) { + if(yych >= 0x09) goto yy158; + } else { + if(yych == 0x0D) goto yy158; + } + } else { + if(yych <= '9') { + if(yych <= ' ') goto yy158; + if(yych >= '0') goto yy160; + } else { + if(yych == ';') goto yy158; + } + } +yy162: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy163: + if(yych <= 0x0D) { + if(yych <= 0x08) goto yy162; + if(yych <= 0x0A) goto yy156; + if(yych <= 0x0C) goto yy162; + goto yy156; + } else { + if(yych <= ' ') { + if(yych <= 0x1F) goto yy162; + goto yy156; + } else { + if(yych == ';') goto yy156; + goto yy162; + } + } +yy164: + YYMARKER = ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych <= ' ') { + if(yych <= 0x0A) { + if(yych <= 0x08) goto yy164; + if(yych <= 0x09) goto yy174; + goto yy156; + } else { + if(yych == 0x0D) goto yy174; + if(yych <= 0x1F) goto yy164; + goto yy174; + } + } else { + if(yych <= ':') { + if(yych == '"') goto yy162; + goto yy164; + } else { + if(yych <= ';') goto yy174; + if(yych == '\\') goto yy176; + goto yy164; + } + } +yy166: + YYMARKER = ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych <= ' ') { + if(yych <= 0x0A) { + if(yych <= 0x08) goto yy166; + if(yych >= 0x0A) goto yy156; + } else { + if(yych == 0x0D) goto yy168; + if(yych <= 0x1F) goto yy166; + } + } else { + if(yych <= ':') { + if(yych == '\'') goto yy162; + goto yy166; + } else { + if(yych <= ';') goto yy168; + if(yych == '\\') goto yy171; + goto yy166; + } + } +yy168: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych <= '&') { + if(yych != 0x0A) goto yy168; + } else { + if(yych <= '\'') goto yy172; + if(yych == '\\') goto yy173; + goto yy168; + } +yy170: + YYCURSOR = YYMARKER; + goto yy156; +yy171: + YYMARKER = ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych <= 0x0D) { + if(yych <= 0x09) { + if(yych <= 0x08) goto yy166; + goto yy168; + } else { + if(yych <= 0x0A) goto yy156; + if(yych <= 0x0C) goto yy166; + goto yy168; + } + } else { + if(yych <= ' ') { + if(yych <= 0x1F) goto yy166; + goto yy168; + } else { + if(yych == ';') goto yy168; + goto yy166; + } + } +yy172: + yych = *++YYCURSOR; + goto yy156; +yy173: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych == 0x0A) goto yy170; + goto yy168; +yy174: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych <= '!') { + if(yych == 0x0A) goto yy170; + goto yy174; + } else { + if(yych <= '"') goto yy172; + if(yych == '\\') goto yy177; + goto yy174; + } +yy176: + YYMARKER = ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych <= 0x0D) { + if(yych <= 0x09) { + if(yych <= 0x08) goto yy164; + goto yy174; + } else { + if(yych <= 0x0A) goto yy156; + if(yych <= 0x0C) goto yy164; + goto yy174; + } + } else { + if(yych <= ' ') { + if(yych <= 0x1F) goto yy164; + goto yy174; + } else { + if(yych == ';') goto yy174; + goto yy164; + } + } +yy177: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych == 0x0A) goto yy170; + goto yy174; +} +#line 305 "scanner.s.re" + +} + +void Scanner::fatal(uint ofs, const char *msg) const +{ + out.flush(); + std::cerr << "re2c: error: " + << "line " << tline << ", column " << (tchar + ofs + 1) << ": " + << msg << std::endl; + exit(1); +} + +} // end namespace re2c + diff --git a/test/scanner.s.re b/test/scanner.s.re new file mode 100755 index 00000000..aaf376ae --- /dev/null +++ b/test/scanner.s.re @@ -0,0 +1,318 @@ +/* $Id$ */ +#include +#include +#include +#include +#include "scanner.h" +#include "parser.h" +#include "y.tab.h" +#include "globals.h" +#include "dfa.h" + +extern YYSTYPE yylval; + +#ifndef MAX +#define MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +#define BSIZE 8192 + +#define YYCTYPE char +#define YYCURSOR cursor +#define YYLIMIT lim +#define YYMARKER ptr +#define YYFILL(n) {cursor = fill(cursor);} + +#define RETURN(i) {cur = cursor; return i;} + +namespace re2c +{ + +Scanner::Scanner(std::istream& i, std::ostream& o) + : in(i) + , out(o) + , bot(NULL), tok(NULL), ptr(NULL), cur(NULL), pos(NULL), lim(NULL) + , top(NULL), eof(NULL), tchar(0), tline(0), cline(1), iscfg(0) +{ + ; +} + +char *Scanner::fill(char *cursor) +{ + if(!eof) + { + uint cnt = tok - bot; + if(cnt) + { + memcpy(bot, tok, lim - tok); + tok = bot; + ptr -= cnt; + cursor -= cnt; + pos -= cnt; + lim -= cnt; + } + if((top - lim) < BSIZE) + { + char *buf = new char[(lim - bot) + BSIZE]; + memcpy(buf, tok, lim - tok); + tok = buf; + ptr = &buf[ptr - bot]; + cursor = &buf[cursor - bot]; + pos = &buf[pos - bot]; + lim = &buf[lim - bot]; + top = &lim[BSIZE]; + delete [] bot; + bot = buf; + } + in.read(lim, BSIZE); + if ((cnt = in.gcount()) != BSIZE ) + { + eof = &lim[cnt]; *eof++ = '\0'; + } + lim += cnt; + } + return cursor; +} + +/*!re2c +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]; +number = "0" | ("-"? [1-9] digit*); +name = letter (letter|digit)*; +cname = ":" letter (letter|digit|"_")*; +space = [ \t]; +eol = ("\r\n" | "\n"); +config = "re2c" cname+; +value = [^\r\n; \t]* | dstring | sstring; +*/ + +int Scanner::echo() +{ + char *cursor = cur; + bool ignore_eoc = false; + + if (eof && cursor == eof) // Catch EOF + { + return 0; + } + + tok = cursor; +echo: +/*!re2c + "/*!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; + } +*/ +} + + +int Scanner::scan() +{ + char *cursor = cur; + uint depth; + +scan: + tchar = cursor - pos; + tline = cline; + tok = cursor; + if (iscfg == 1) + { + goto config; + } + else if (iscfg == 2) + { + goto value; + } +/*!re2c + "{" { depth = 1; + goto code; + } + "/*" { depth = 1; + goto comment; } + + "*/" { tok = cursor; + RETURN(0); } + + dstring { cur = cursor; + yylval.regexp = strToRE(token()); + return STRING; } + + sstring { cur = cursor; + yylval.regexp = strToCaseInsensitiveRE(token()); + return STRING; } + + "\"" { 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; } + + "[" { fatal("unterminated range (missing ])"); } + + [()|=;/\\] { RETURN(*tok); } + + [*+?] { yylval.op = *tok; + RETURN(CLOSE); } + + "{0,}" { yylval.op = '*'; + RETURN(CLOSE); } + + "{" [0-9]+ "}" { yylval.extop.minsize = atoi((char *)tok+1); + yylval.extop.maxsize = atoi((char *)tok+1); + RETURN(CLOSESIZE); } + + "{" [0-9]+ "," [0-9]+ "}" { yylval.extop.minsize = atoi((char *)tok+1); + yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)tok, ',')+1)); + RETURN(CLOSESIZE); } + + "{" [0-9]+ ",}" { yylval.extop.minsize = atoi((char *)tok+1); + yylval.extop.maxsize = -1; + RETURN(CLOSESIZE); } + + "{" [0-9]* "," { fatal("illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers"); } + + config { cur = cursor; + tok+= 5; /* skip "re2c:" */ + iscfg = 1; + yylval.str = new Str(token()); + return CONFIG; + } + + name { cur = cursor; + yylval.symbol = Symbol::find(token()); + return ID; } + + "." { cur = cursor; + yylval.regexp = mkDot(); + return RANGE; + } + + space+ { goto scan; } + + eol { if(cursor == eof) RETURN(0); + pos = cursor; cline++; + goto scan; + } + + any { std::ostringstream msg; + msg << "unexpected character: "; + prtChOrHex(msg, *tok); + fatal(msg.str().c_str()); + goto scan; + } +*/ + +code: +/*!re2c + "}" { if(--depth == 0){ + cur = cursor; + yylval.token = new Token(token(), tline); + return CODE; + } + goto code; } + "{" { ++depth; + goto code; } + "\n" { if(cursor == eof) fatal("missing '}'"); + pos = cursor; cline++; + goto code; + } + dstring | sstring | any { goto code; } +*/ + +comment: +/*!re2c + "*/" { if(--depth == 0) + goto scan; + else + goto comment; } + "/*" { ++depth; + fatal("ambiguous /* found"); + goto comment; } + "\n" { if(cursor == eof) RETURN(0); + tok = pos = cursor; cline++; + goto comment; + } + any { if(cursor == eof) RETURN(0); + goto comment; } +*/ + +config: +/*!re2c + space+ { goto config; } + "=" space* { iscfg = 2; + cur = cursor; + RETURN('='); + } + any { fatal("missing '='"); } +*/ + +value: +/*!re2c + number { cur = cursor; + yylval.number = atoi(token().to_string().c_str()); + iscfg = 0; + return NUMBER; + } + value { cur = cursor; + yylval.str = new Str(token()); + iscfg = 0; + return VALUE; + } +*/ +} + +void Scanner::fatal(uint ofs, const char *msg) const +{ + out.flush(); + std::cerr << "re2c: error: " + << "line " << tline << ", column " << (tchar + ofs + 1) << ": " + << msg << std::endl; + exit(1); +} + +} // end namespace re2c +