diff options
Diffstat (limited to 'tools/re2c/scanner.c')
-rw-r--r-- | tools/re2c/scanner.c | 748 |
1 files changed, 748 insertions, 0 deletions
diff --git a/tools/re2c/scanner.c b/tools/re2c/scanner.c new file mode 100644 index 0000000..034c935 --- /dev/null +++ b/tools/re2c/scanner.c @@ -0,0 +1,748 @@ +/* Generated by re2c 0.9.1-C on Sun Oct 9 22:15:58 2005 + */ +#line 1 "scanner.re" +#include <stdlib.h> +#include <string.h> +#include "tools/re2c/scanner.h" +#include "tools/re2c/parse.h" +#include "tools/re2c/globals.h" +#include "tools/re2c/parser.h" + +#ifndef MAX +#define MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +#define BSIZE 8192 + +#define YYCTYPE unsigned char +#define YYCURSOR cursor +#define YYLIMIT s->lim +#define YYMARKER s->ptr +#define YYFILL(n) {cursor = fill(s, cursor);} + +#define RETURN(i) {s->cur = cursor; return i;} + +static unsigned char *fill(Scanner*, unsigned char*); + +void +Scanner_init(Scanner *s, FILE *i) +{ + s->in = i; + s->bot = s->tok = s->ptr = s->cur = s->pos = s->lim = s->top = + s->eof = NULL; + s->tchar = s->tline = 0; + s->cline = 1; +} + +static unsigned char * +fill(Scanner *s, unsigned char *cursor) +{ + if(!s->eof){ + unsigned int cnt = s->tok - s->bot; + if(cnt){ + memcpy(s->bot, s->tok, s->lim - s->tok); + s->tok = s->bot; + s->ptr -= cnt; + cursor -= cnt; + s->pos -= cnt; + s->lim -= cnt; + } + if((s->top - s->lim) < BSIZE){ + unsigned char *buf = malloc(((s->lim - s->bot) + BSIZE) + 1); + memcpy(buf, s->tok, s->lim - s->tok); + s->tok = buf; + s->ptr = &buf[s->ptr - s->bot]; + cursor = &buf[cursor - s->bot]; + s->pos = &buf[s->pos - s->bot]; + s->lim = &buf[s->lim - s->bot]; + s->top = &s->lim[BSIZE]; + if (s->bot) + free(s->bot); + s->bot = buf; + } + if((cnt = fread(s->lim, 1, BSIZE, s->in)) != BSIZE){ + s->eof = &s->lim[cnt]; *s->eof++ = '\0'; + } + s->lim += cnt; + } + return cursor; +} + +#line 79 "scanner.re" + + +int +Scanner_echo(Scanner *s, FILE *out) +{ + unsigned char *cursor = s->cur; + int ignore_eoc = 0; + + /* Catch EOF */ + if (s->eof && cursor == s->eof) + return 0; + + s->tok = cursor; +echo: + +#line 87 "scanner.c" +{ + YYCTYPE yych; + unsigned int yyaccept; + goto yy0; + ++YYCURSOR; +yy0: + if((YYLIMIT - YYCURSOR) < 11) YYFILL(11); + yych = *YYCURSOR; + if(yych <= ')'){ + if(yych <= '\000') goto yy7; + if(yych == '\n') goto yy5; + goto yy9; + } else { + if(yych <= '*') goto yy4; + if(yych != '/') goto yy9; + goto yy2; + } +yy2: yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if(yych == '*') goto yy12; + goto yy3; +yy3: +#line 117 "scanner.re" +{ goto echo; } +#line 112 "scanner.c" +yy4: yych = *++YYCURSOR; + if(yych == '/') goto yy10; + goto yy3; +yy5: yych = *++YYCURSOR; + goto yy6; +yy6: +#line 112 "scanner.re" +{ fwrite(s->tok, 1, cursor - s->tok, out); + s->tok = s->pos = cursor; s->cline++; oline++; + goto echo; } +#line 123 "scanner.c" +yy7: yych = *++YYCURSOR; + goto yy8; +yy8: +#line 115 "scanner.re" +{ fwrite(s->tok, 1, cursor - s->tok - 1, out); /* -1 so we don't write out the \0 */ + if(cursor == s->eof) { RETURN(0); } } +#line 130 "scanner.c" +yy9: yych = *++YYCURSOR; + goto yy3; +yy10: yych = *++YYCURSOR; + goto yy11; +yy11: +#line 103 "scanner.re" +{ + if (ignore_eoc) { + ignore_eoc = 0; + } else { + fwrite(s->tok, 1, cursor - s->tok, out); + } + s->tok = s->pos = cursor; + goto echo; + } +#line 146 "scanner.c" +yy12: yych = *++YYCURSOR; + if(yych == '!') goto yy14; + goto yy13; +yy13: YYCURSOR = YYMARKER; + switch(yyaccept){ + case 0: 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; + goto yy17; +yy17: yych = *++YYCURSOR; + if(yych != '2') goto yy13; + goto yy18; +yy18: yych = *++YYCURSOR; + if(yych != 'c') goto yy13; + goto yy19; +yy19: yych = *++YYCURSOR; + goto yy20; +yy20: +#line 94 "scanner.re" +{ fwrite(s->tok, 1, &cursor[-7] - s->tok, out); + s->tok = cursor; + RETURN(1); } +#line 177 "scanner.c" +yy21: yych = *++YYCURSOR; + if(yych != 'x') goto yy13; + goto yy22; +yy22: yych = *++YYCURSOR; + if(yych != ':') goto yy13; + goto yy23; +yy23: yych = *++YYCURSOR; + if(yych != 'r') goto yy13; + goto yy24; +yy24: yych = *++YYCURSOR; + if(yych != 'e') goto yy13; + goto yy25; +yy25: yych = *++YYCURSOR; + if(yych != '2') goto yy13; + goto yy26; +yy26: yych = *++YYCURSOR; + if(yych != 'c') goto yy13; + goto yy27; +yy27: yych = *++YYCURSOR; + goto yy28; +yy28: +#line 97 "scanner.re" +{ + fprintf(out, "#define YYMAXFILL %u\n", maxFill); + s->tok = s->pos = cursor; + ignore_eoc = 1; + goto echo; + } +#line 206 "scanner.c" +} +#line 118 "scanner.re" + +} + + +int +Scanner_scan(Scanner *s) +{ + unsigned char *cursor = s->cur; + unsigned int depth; + +scan: + s->tchar = cursor - s->pos; + s->tline = s->cline; + s->tok = cursor; + +#line 224 "scanner.c" +{ + YYCTYPE yych; + unsigned int yyaccept; + goto yy29; + ++YYCURSOR; +yy29: + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + if(yych <= '/'){ + if(yych <= '"'){ + if(yych <= '\n'){ + if(yych <= '\b') goto yy53; + if(yych <= '\t') goto yy47; + goto yy49; + } else { + if(yych == ' ') goto yy47; + if(yych <= '!') goto yy53; + goto yy37; + } + } else { + if(yych <= '*'){ + if(yych <= '&') goto yy53; + if(yych <= '\'') goto yy39; + if(yych <= ')') goto yy43; + goto yy35; + } else { + if(yych <= '+') goto yy44; + if(yych <= '-') goto yy53; + if(yych <= '.') goto yy51; + goto yy33; + } + } + } else { + if(yych <= '@'){ + if(yych <= '<'){ + if(yych == ';') goto yy43; + goto yy53; + } else { + if(yych <= '=') goto yy43; + if(yych == '?') goto yy44; + goto yy53; + } + } else { + if(yych <= '`'){ + if(yych <= 'Z') goto yy45; + if(yych <= '[') goto yy41; + if(yych <= '\\') goto yy43; + goto yy53; + } else { + if(yych <= 'z') goto yy45; + if(yych <= '{') goto yy31; + if(yych <= '|') goto yy43; + goto yy53; + } + } + } +yy31: yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if(yych <= '/') goto yy32; + if(yych <= '9') goto yy84; + goto yy32; +yy32: +#line 133 "scanner.re" +{ depth = 1; + goto code; + } +#line 291 "scanner.c" +yy33: yych = *++YYCURSOR; + if(yych == '*') goto yy82; + goto yy34; +yy34: +#line 163 "scanner.re" +{ RETURN(*s->tok); } +#line 298 "scanner.c" +yy35: yych = *++YYCURSOR; + if(yych == '/') goto yy80; + goto yy36; +yy36: +#line 165 "scanner.re" +{ yylval.op = *s->tok; + RETURN(CLOSE); } +#line 306 "scanner.c" +yy37: yyaccept = 1; + yych = *(YYMARKER = ++YYCURSOR); + if(yych != '\n') goto yy76; + goto yy38; +yy38: +#line 150 "scanner.re" +{ Scanner_fatal(s, "unterminated string constant (missing \")"); } +#line 314 "scanner.c" +yy39: yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if(yych != '\n') goto yy71; + goto yy40; +yy40: +#line 151 "scanner.re" +{ Scanner_fatal(s, "unterminated string constant (missing ')"); } +#line 322 "scanner.c" +yy41: yyaccept = 3; + yych = *(YYMARKER = ++YYCURSOR); + if(yych == '\n') goto yy42; + if(yych == '^') goto yy62; + goto yy60; +yy42: +#line 161 "scanner.re" +{ Scanner_fatal(s, "unterminated range (missing ])"); } +#line 331 "scanner.c" +yy43: yych = *++YYCURSOR; + goto yy34; +yy44: yych = *++YYCURSOR; + goto yy36; +yy45: yych = *++YYCURSOR; + goto yy58; +yy46: +#line 180 "scanner.re" +{ SubStr substr; + s->cur = cursor; + substr = Scanner_token(s); + yylval.symbol = Symbol_find(&substr); + return ID; } +#line 345 "scanner.c" +yy47: yych = *++YYCURSOR; + goto yy56; +yy48: +#line 186 "scanner.re" +{ goto scan; } +#line 351 "scanner.c" +yy49: yych = *++YYCURSOR; + goto yy50; +yy50: +#line 188 "scanner.re" +{ if(cursor == s->eof) RETURN(0); + s->pos = cursor; s->cline++; + goto scan; + } +#line 360 "scanner.c" +yy51: yych = *++YYCURSOR; + goto yy52; +yy52: +#line 193 "scanner.re" +{ s->cur = cursor; + yylval.regexp = mkDot(); + return RANGE; + } +#line 369 "scanner.c" +yy53: yych = *++YYCURSOR; + goto yy54; +yy54: +#line 198 "scanner.re" +{ fprintf(stderr, "unexpected character: '%c'\n", *s->tok); + goto scan; + } +#line 377 "scanner.c" +yy55: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy56; +yy56: if(yych == '\t') goto yy55; + if(yych == ' ') goto yy55; + goto yy48; +yy57: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy58; +yy58: if(yych <= '@'){ + if(yych <= '/') goto yy46; + if(yych <= '9') goto yy57; + goto yy46; + } else { + if(yych <= 'Z') goto yy57; + if(yych <= '`') goto yy46; + if(yych <= 'z') goto yy57; + goto yy46; + } +yy59: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy60; +yy60: if(yych <= '['){ + if(yych != '\n') goto yy59; + goto yy61; + } else { + if(yych <= '\\') goto yy64; + if(yych <= ']') goto yy65; + goto yy59; + } +yy61: YYCURSOR = YYMARKER; + switch(yyaccept){ + case 0: goto yy32; + case 1: goto yy38; + case 2: goto yy40; + case 3: goto yy42; + } +yy62: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy63; +yy63: if(yych <= '['){ + if(yych == '\n') goto yy61; + goto yy62; + } else { + if(yych <= '\\') goto yy67; + if(yych <= ']') goto yy68; + goto yy62; + } +yy64: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych == '\n') goto yy61; + goto yy59; +yy65: yych = *++YYCURSOR; + goto yy66; +yy66: +#line 157 "scanner.re" +{ s->cur = cursor; + yylval.regexp = ranToRE(Scanner_token(s)); + return RANGE; } +#line 442 "scanner.c" +yy67: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych == '\n') goto yy61; + goto yy62; +yy68: yych = *++YYCURSOR; + goto yy69; +yy69: +#line 153 "scanner.re" +{ s->cur = cursor; + yylval.regexp = invToRE(Scanner_token(s)); + return RANGE; } +#line 455 "scanner.c" +yy70: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy71; +yy71: if(yych <= '&'){ + if(yych == '\n') goto yy61; + goto yy70; + } else { + if(yych <= '\'') goto yy73; + if(yych != '\\') goto yy70; + goto yy72; + } +yy72: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych == '\n') goto yy61; + goto yy70; +yy73: yych = *++YYCURSOR; + goto yy74; +yy74: +#line 146 "scanner.re" +{ s->cur = cursor; + yylval.regexp = strToCaseInsensitiveRE(Scanner_token(s)); + return STRING; } +#line 480 "scanner.c" +yy75: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy76; +yy76: if(yych <= '!'){ + if(yych == '\n') goto yy61; + goto yy75; + } else { + if(yych <= '"') goto yy78; + if(yych != '\\') goto yy75; + goto yy77; + } +yy77: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych == '\n') goto yy61; + goto yy75; +yy78: yych = *++YYCURSOR; + goto yy79; +yy79: +#line 142 "scanner.re" +{ s->cur = cursor; + yylval.regexp = strToRE(Scanner_token(s)); + return STRING; } +#line 505 "scanner.c" +yy80: yych = *++YYCURSOR; + goto yy81; +yy81: +#line 139 "scanner.re" +{ s->tok = cursor; + RETURN(0); } +#line 512 "scanner.c" +yy82: yych = *++YYCURSOR; + goto yy83; +yy83: +#line 136 "scanner.re" +{ depth = 1; + goto comment; } +#line 519 "scanner.c" +yy84: ++YYCURSOR; + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + goto yy85; +yy85: if(yych <= '/'){ + if(yych == ',') goto yy88; + goto yy61; + } else { + if(yych <= '9') goto yy84; + if(yych != '}') goto yy61; + goto yy86; + } +yy86: yych = *++YYCURSOR; + goto yy87; +yy87: +#line 168 "scanner.re" +{ yylval.extop.minsize = atoi((char *)s->tok+1); + yylval.extop.maxsize = atoi((char *)s->tok+1); + RETURN(CLOSESIZE); } +#line 539 "scanner.c" +yy88: yych = *++YYCURSOR; + if(yych != '}') goto yy92; + goto yy89; +yy89: yych = *++YYCURSOR; + goto yy90; +yy90: +#line 176 "scanner.re" +{ yylval.extop.minsize = atoi((char *)s->tok+1); + yylval.extop.maxsize = -1; + RETURN(CLOSESIZE); } +#line 550 "scanner.c" +yy91: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy92; +yy92: if(yych <= '/') goto yy61; + if(yych <= '9') goto yy91; + if(yych != '}') goto yy61; + goto yy93; +yy93: yych = *++YYCURSOR; + goto yy94; +yy94: +#line 172 "scanner.re" +{ yylval.extop.minsize = atoi((char *)s->tok+1); + yylval.extop.maxsize = MAX(yylval.extop.minsize,atoi(strchr((char *)s->tok, ',')+1)); + RETURN(CLOSESIZE); } +#line 566 "scanner.c" +} +#line 201 "scanner.re" + + +code: + +#line 573 "scanner.c" +{ + YYCTYPE yych; + unsigned int yyaccept; + goto yy95; + ++YYCURSOR; +yy95: + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + if(yych <= '&'){ + if(yych <= '\n'){ + if(yych <= '\t') goto yy103; + goto yy101; + } else { + if(yych == '"') goto yy105; + goto yy103; + } + } else { + if(yych <= '{'){ + if(yych <= '\'') goto yy106; + if(yych <= 'z') goto yy103; + goto yy99; + } else { + if(yych != '}') goto yy103; + goto yy97; + } + } +yy97: yych = *++YYCURSOR; + goto yy98; +yy98: +#line 205 "scanner.re" +{ if(--depth == 0){ + s->cur = cursor; + yylval.token = Token_new(Scanner_token(s), s->tline); + return CODE; + } + goto code; } +#line 610 "scanner.c" +yy99: yych = *++YYCURSOR; + goto yy100; +yy100: +#line 211 "scanner.re" +{ ++depth; + goto code; } +#line 617 "scanner.c" +yy101: yych = *++YYCURSOR; + goto yy102; +yy102: +#line 213 "scanner.re" +{ if(cursor == s->eof) Scanner_fatal(s, "missing '}'"); + s->pos = cursor; s->cline++; + goto code; + } +#line 626 "scanner.c" +yy103: yych = *++YYCURSOR; + goto yy104; +yy104: +#line 217 "scanner.re" +{ goto code; } +#line 632 "scanner.c" +yy105: yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if(yych == '\n') goto yy104; + goto yy112; +yy106: yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if(yych == '\n') goto yy104; + goto yy108; +yy107: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy108; +yy108: if(yych <= '&'){ + if(yych != '\n') goto yy107; + goto yy109; + } else { + if(yych <= '\'') goto yy103; + if(yych == '\\') goto yy110; + goto yy107; + } +yy109: YYCURSOR = YYMARKER; + switch(yyaccept){ + case 0: goto yy104; + } +yy110: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych == '\n') goto yy109; + goto yy107; +yy111: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + goto yy112; +yy112: if(yych <= '!'){ + if(yych == '\n') goto yy109; + goto yy111; + } else { + if(yych <= '"') goto yy103; + if(yych != '\\') goto yy111; + goto yy113; + } +yy113: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych == '\n') goto yy109; + goto yy111; +} +#line 218 "scanner.re" + + +comment: + +#line 685 "scanner.c" +{ + YYCTYPE yych; + goto yy114; + ++YYCURSOR; +yy114: + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + if(yych <= ')'){ + if(yych == '\n') goto yy119; + goto yy121; + } else { + if(yych <= '*') goto yy116; + if(yych == '/') goto yy118; + goto yy121; + } +yy116: yych = *++YYCURSOR; + if(yych == '/') goto yy124; + goto yy117; +yy117: +#line 232 "scanner.re" +{ goto comment; } +#line 707 "scanner.c" +yy118: yych = *++YYCURSOR; + if(yych == '*') goto yy122; + goto yy117; +yy119: yych = *++YYCURSOR; + goto yy120; +yy120: +#line 228 "scanner.re" +{ if(cursor == s->eof) RETURN(0); + s->tok = s->pos = cursor; s->cline++; + goto comment; + } +#line 719 "scanner.c" +yy121: yych = *++YYCURSOR; + goto yy117; +yy122: yych = *++YYCURSOR; + goto yy123; +yy123: +#line 226 "scanner.re" +{ ++depth; + goto comment; } +#line 728 "scanner.c" +yy124: yych = *++YYCURSOR; + goto yy125; +yy125: +#line 222 "scanner.re" +{ if(--depth == 0) + goto scan; + else + goto comment; } +#line 737 "scanner.c" +} +#line 233 "scanner.re" + +} + +void +Scanner_fatal(Scanner *s, const char *msg) +{ + fprintf(stderr, "line %d, column %d: %s\n", s->tline, s->tchar + 1, msg); + exit(1); +} |