#include #include #include #include FILE *yyin; struct yycontext { int q; int curcond; int bolp; unsigned char *buf; /* current input buffer */ size_t plen; /* its physical length */ size_t fptr; /* fill pointer */ size_t rptr; /* read pointer */ size_t sptr; /* start pointer */ char save; unsigned char *savep; int eofp; }; #define YYQ0 0 #define YY_UNDERFLOW_SENTINEL 0 #define YY_UNDERFLOW_SUBST 256 #define YY_EOF_SENTINEL 0 #define USE_UNDEFRLOW 0 #define INITIAL (0) struct yycontext yycontext = { YYQ0, INITIAL, 1, 0, 0, 0, 0, 0, 0, 0, 0 }; char *yytext; static void yyless (int n) { int bp; if (yycontext.savep) *yycontext.savep = yycontext.save, yycontext.savep = 0; bp = yycontext.sptr + n; yycontext.savep = yycontext.buf + bp; yycontext.save = yycontext.buf[bp]; /* does it exist? */ *yycontext.savep = 0; yycontext.rptr = bp; // yycontext.rptr = yycontext.sptr + n; } static int yy_underflow (struct yycontext *ctx) { again: if (ctx->eofp) return YY_EOF_SENTINEL; else if (ctx->rptr < ctx->fptr) { /* not a read underflow */ if (0) printf ("no nunderflow %d, %d\n", (int)ctx->rptr, (int)ctx->fptr); ctx->rptr++; return YY_UNDERFLOW_SUBST; } else { int n, delta, room; assert (ctx->rptr == ctx->fptr); memcpy (ctx->buf, ctx->buf + ctx->sptr - 1, ctx->fptr - ctx->sptr + 1); delta = ctx->sptr - 1; ctx->fptr -= delta; ctx->rptr -= delta; ctx->sptr -= delta; room = ctx->plen - ctx->fptr; // if (room > 16 * 1024) room = (16 * 1024); // printf ("room = %d\n", room); n = fread (ctx->buf + ctx->fptr, 1, room, yyin); if (n > 0) { ctx->fptr += n; ctx->buf [ctx->fptr] = '\0'; return ctx->buf [ctx->rptr++]; } else { ctx->eofp = 1; return YY_EOF_SENTINEL; /* our idea of EOF */ } } } #define ECHO do{ fputs (yytext, stdout); }while (0) #define BEGIN yycontext.curcond = int yylex (void) { int reg [64], v[64]; int cat; int bp; unsigned char yych; unsigned char *buf; unsigned p; int yyq; struct yycontext *yyctx = &yycontext; if (__builtin_expect (!yyctx->buf, 0)) { yyctx->plen = /*58724000*/ + 20 * 1024; yyctx->plen = 32 * 1024; yyctx->buf = calloc (1, yyctx->plen + 1); yyctx->buf[0] = '\n'; yyctx->rptr = 1; yyctx->fptr = 1; yyctx->sptr = 1; yy_underflow (yyctx); yyctx->rptr--; yyctx->savep = yyctx->buf + 1; yyctx->save = *yyctx->savep; } //#define p (rp - sp) /* 10% of time is used for checking for underflow. */ #if !USE_UNDEFRLOW #define YY_GETC(c) \ do{ \ /*assert (yyctx->rptr <= yyctx->fptr);*/ \ if (__builtin_expect(((c) = buf[p++]) == 0,0)) \ { \ p--; \ yyctx->rptr = p; \ (c) = yy_underflow (yyctx); \ bp -= (p - (yyctx->rptr-1)); \ p = yyctx->rptr; \ } \ }while(0) #else #define YY_GETC(c) ((c) = buf [p++]) #endif // YY_GETC(yynext); #define YY_UNDERFLOW(c,z) \ do{ \ { \ p--; \ yyctx->rptr = p; \ (c) = yy_underflow (yyctx); \ bp -= (p - (yyctx->rptr-1)); \ p = yyctx->rptr; \ } \ }while(0) rescan: buf = yyctx->buf; p = yyctx->rptr; again: if (yyctx->savep) { *yyctx->savep = yyctx->save; yyctx->savep = 0; } cat = 0; yyctx->sptr = p; loop: goto L0; reenter: switch (yyq) { L8: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); L8a: if (yych < 43) { if (yych < 42) { goto L10; } else { goto L9; } } else { if (yych < 258) { goto L10; } else { } } L7: YY_GETC(yych); case 7: L7a: switch (yych) { case '\1' ... ')': case '+' ... '.': case '0' ... 255: goto L10; case '/': goto L8; case '*': goto L7; default: goto jam; } break; L6: YY_GETC(yych); case 6: L6a: switch (yych) { case '*': goto L7; case '/': goto L10; case '\1' ... ')': case '+' ... '.': case '0' ... 255: goto L10; default: goto jam; } break; L9: YY_GETC(yych); case 9: L9a: switch (yych) { case '*': goto L6; case '/': goto L65; case '\1' ... ')': case '+' ... '.': case '0' ... 255: goto L10; default: goto jam; } break; L10: YY_GETC(yych); L10a: if (yych < 43) { if (yych < 42) { goto L10; } else { goto L9; } } else { if (yych < 258) { goto L10; } else { } } L14: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 14: L14a: switch (yych) { case '\1' ... '\t': case '\v' ... '[': case ']' ... 255: goto L13; case '\\': goto L15; case '\n': goto L65; default: goto jam; } break; L15: YY_GETC(yych); case 15: L15a: switch (yych) { case '\1' ... '\t': case '\v' ... '[': case ']' ... 255: goto L13; case '\\': goto L15; case '\n': goto L14; default: goto jam; } break; L13: YY_GETC(yych); case 13: L13a: switch (yych) { case '\1' ... '\t': case '\v' ... '[': case ']' ... 255: goto L13; case '\\': goto L15; case '\n': goto L65; default: goto jam; } break; L3: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 3: L3a: switch (yych) { case '*': goto L10; case '=': goto L65; case '/': goto L13; default: goto jam; } break; L16: reg[0] = p; cat = 2; bp = p; YY_GETC(yych); case 16: L16a: switch (yych) { case '\\': goto L19; case '\1' ... '\t': case '\v' ... '[': case ']' ... 255: goto L92; default: goto jam; } break; L21: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 21: L21a: switch (yych) { case '+': goto L65; case '=': goto L65; case '.': goto L51; case '1' ... '9': goto L50; case '0': goto L49; default: goto jam; } break; L43: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 43: L43a: switch (yych) { case '0' ... '9': goto L43; case '.': goto L37; case 'E': case 'e': goto L33; case 'F': case 'L': case 'f': case 'l': goto L65; default: goto jam; } break; L42: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 42: L42a: switch (yych) { case '8' ... '9': goto L43; case '0' ... '7': goto L42; case '.': goto L37; case 'E': case 'e': goto L33; case 'U': case 'u': goto L38; case 'L': case 'l': goto L39; case 'F': case 'f': goto L65; default: goto jam; } break; L49: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 49: L49a: switch (yych) { case '8' ... '9': goto L43; case '0' ... '7': goto L42; case '.': goto L37; case 'E': case 'e': goto L33; case 'X': case 'x': goto L53; case 'U': case 'u': goto L38; case 'L': case 'l': goto L39; case 'F': case 'f': goto L65; default: goto jam; } break; L37: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 37: L37a: switch (yych) { case 'F': case 'L': case 'f': case 'l': goto L65; case 'E': case 'e': goto L33; case '0' ... '9': goto L35; default: goto jam; } break; L39: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 39: L39a: switch (yych) { case 'U': case 'u': goto L65; case 'L': case 'l': goto L47; default: goto jam; } break; L36: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 36: L36a: switch (yych) { case '0' ... '9': goto L36; case '.': goto L37; case 'E': case 'e': goto L33; case 'U': case 'u': goto L38; case 'L': case 'l': goto L39; case 'F': case 'f': goto L65; default: goto jam; } break; L50: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 50: L50a: switch (yych) { case 'L': case 'l': goto L39; case 'F': case 'f': goto L65; case 'U': case 'u': goto L38; case 'E': case 'e': goto L33; case '.': goto L37; case '0' ... '9': goto L36; default: goto jam; } break; L27: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 27: L27a: switch (yych) { case 'F': case 'L': case 'f': case 'l': goto L65; case '0' ... '9': goto L27; default: goto jam; } break; L26: YY_GETC(yych); L26a: if (yych < 58) { if (yych < 48) { goto L58; } else { goto L27; } } else { if (yych < 258) { goto L58; } else { } } L33: YY_GETC(yych); case 33: L33a: switch (yych) { case '0' ... '9': goto L27; case '+': case '-': goto L26; default: goto jam; } break; L35: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 35: L35a: switch (yych) { case '0' ... '9': goto L35; case 'F': case 'L': case 'f': case 'l': goto L65; case 'E': case 'e': goto L33; default: goto jam; } break; L51: YY_GETC(yych); L51a: if (yych < 58) { if (yych < 48) { goto L58; } else { goto L35; } } else { if (yych < 258) { goto L58; } else { } } L48: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 48: L48a: switch (yych) { case '0': goto L49; case '1' ... '9': goto L50; case '.': goto L51; case '=': goto L65; case '>': goto L65; case '-': goto L65; default: goto jam; } break; L45: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 45: L45a: switch (yych) { case 'L': case 'l': goto L54; case 'U': case 'u': goto L38; case '0' ... '9': case 'A' ... 'F': case 'a' ... 'f': goto L45; default: goto jam; } break; L53: YY_GETC(yych); case 53: L53a: switch (yych) { case '0' ... '9': case 'A' ... 'F': case 'a' ... 'f': goto L45; default: goto jam; } break; L55: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 55: L55a: switch (yych) { case 'L': case 'l': goto L54; case 'U': case 'u': goto L38; case '0' ... '7': goto L55; default: goto jam; } break; L52: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 52: L52a: switch (yych) { case 'X': case 'x': goto L53; case 'L': case 'l': goto L54; case 'U': case 'u': goto L38; case '0' ... '7': goto L55; default: goto jam; } break; L56: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); L56a: if (yych < 61) { if (yych < 38) { goto L58; } else { if (yych < 39) { goto L65; } else { goto L58; } } } else { if (yych < 258) { if (yych < 62) { goto L65; } else { goto L58; } } else { } } L57: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); L57a: if (yych < 59) { if (yych < 58) { goto L58; } else { goto L65; } } else { if (yych < 258) { goto L58; } else { } } L59: reg[0] = p; cat = 2; bp = p; goto jam; L60: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); L60a: if (yych < 124) { if (yych < 61) { goto L58; } else { if (yych < 62) { goto L65; } else { goto L58; } } } else { if (yych < 258) { if (yych < 125) { goto L65; } else { goto L58; } } else { } } L62: YY_GETC(yych); L62a: if (yych < 47) { if (yych < 46) { goto L58; } else { goto L65; } } else { if (yych < 258) { goto L58; } else { } } L61: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); L61a: if (yych < 47) { if (yych < 46) { goto L58; } else { goto L62; } } else { if (yych < 258) { goto L58; } else { } } L64: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); L64a: if (yych < 62) { if (yych < 61) { goto L58; } else { goto L65; } } else { if (yych < 258) { if (yych < 63) { goto L67; } else { goto L58; } } else { } } L66: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); L66a: if (yych < 61) { if (yych < 60) { goto L58; } else { goto L67; } } else { if (yych < 258) { if (yych < 62) { goto L65; } else { goto L58; } } else { } } L67: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); L67a: if (yych < 62) { if (yych < 61) { goto L58; } else { goto L65; } } else { if (yych < 258) { goto L58; } else { } } L68: reg[0] = p; cat = 2; bp = p; YY_GETC(yych); case 68: L68a: switch (yych) { case '"': goto L65; case '\1' ... '\t': case '\v' ... '!': case '#' ... '[': case ']' ... 255: goto L73; case '\\': goto L72; default: goto jam; } break; L74: reg[0] = p; cat = 2; bp = p; YY_GETC(yych); case 74: L74a: switch (yych) { case '\\': goto L77; case '\'': goto L65; case '\1' ... '\t': case '\v' ... '&': case '(' ... '[': case ']' ... 255: goto L82; default: goto jam; } break; L47: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); L47a: if (yych < 117) { if (yych < 85) { goto L58; } else { if (yych < 86) { goto L65; } else { goto L58; } } } else { if (yych < 258) { if (yych < 118) { goto L65; } else { goto L58; } } else { } } L54: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 54: L54a: switch (yych) { case 'U': case 'u': goto L65; case 'L': case 'l': goto L47; default: goto jam; } break; L32: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); L32a: if (yych < 108) { if (yych < 76) { goto L58; } else { if (yych < 77) { goto L65; } else { goto L58; } } } else { if (yych < 258) { if (yych < 109) { goto L65; } else { goto L58; } } else { } } L38: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); L38a: if (yych < 108) { if (yych < 76) { goto L58; } else { if (yych < 77) { goto L32; } else { goto L58; } } } else { if (yych < 258) { if (yych < 109) { goto L32; } else { goto L58; } } else { } } L79: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 79: L79a: switch (yych) { case 'L': case 'l': goto L54; case 'U': case 'u': goto L38; case '0' ... '9': goto L79; default: goto jam; } break; L78: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 78: L78a: switch (yych) { case 'L': case 'l': goto L54; case 'U': case 'u': goto L38; case '0' ... '9': goto L79; default: goto jam; } break; L71: YY_GETC(yych); case 71: L71a: switch (yych) { case '\n': goto L73; case '"': goto L65; case '\1' ... '\t': case '\v' ... '!': case '#' ... '[': case ']' ... 255: goto L73; case '\\': goto L72; default: goto jam; } break; L72: YY_GETC(yych); case 72: L72a: switch (yych) { case '\1' ... '\t': case '\v' ... '\f': case '\16' ... 255: goto L73; case '\r': goto L71; case '\n': goto L73; default: goto jam; } break; L73: YY_GETC(yych); case 73: L73a: switch (yych) { case '"': goto L65; case '\1' ... '\t': case '\v' ... '!': case '#' ... '[': case ']' ... 255: goto L73; case '\\': goto L72; default: goto jam; } break; L77: YY_GETC(yych); L77a: if (yych < 11) { if (yych < 10) { goto L82; } else { goto L58; } } else { if (yych < 258) { goto L82; } else { } } L65: reg[0] = p; cat = 1; bp = p; goto jam; L82: YY_GETC(yych); case 82: L82a: switch (yych) { case '\\': goto L77; case '\'': goto L65; case '\1' ... '\t': case '\v' ... '&': case '(' ... '[': case ']' ... 255: goto L82; default: goto jam; } break; L80: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 80: L80a: switch (yych) { case '0' ... '9': case 'A' ... 'Z': case '_': case 'a' ... 'z': goto L84; case '"': goto L73; case '\'': goto L82; default: goto jam; } break; L84: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 84: L84a: switch (yych) { case '0' ... '9': case 'A' ... 'Z': case '_': case 'a' ... 'z': goto L84; default: goto jam; } break; L83: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 83: L83a: switch (yych) { case '0' ... '9': case 'A' ... 'Z': case '_': case 'a' ... 'z': goto L84; default: goto jam; } break; L85: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); L85a: if (yych < 32) { if (yych < 9) { goto L58; } else { if (yych < 14) { goto L88; } else { goto L58; } } } else { if (yych < 258) { if (yych < 33) { goto L88; } else { goto L58; } } else { } } L87: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); L87a: if (yych < 32) { if (yych < 9) { goto L58; } else { if (yych < 14) { goto L88; } else { goto L58; } } } else { if (yych < 258) { if (yych < 33) { goto L88; } else { goto L58; } } else { } } L88: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); L88a: if (yych < 32) { if (yych < 9) { goto L58; } else { if (yych < 14) { goto L88; } else { goto L58; } } } else { if (yych < 258) { if (yych < 33) { goto L88; } else { goto L58; } } else { } } L90: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 90: L90a: switch (yych) { case '\n' ... '\r': goto L88; case '\t': case ' ': goto L90; case '#': goto L91; default: goto jam; } break; L18: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 18: L18a: switch (yych) { case '\n': goto L92; case '\\': goto L19; case '\1' ... '\t': case '\v' ... '[': case ']' ... 255: goto L92; default: goto jam; } break; L19: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 19: L19a: switch (yych) { case '\n': goto L92; case '\\': goto L19; case '\1' ... '\t': case '\v' ... '\f': case '\16' ... '[': case ']' ... 255: goto L92; case '\r': goto L18; default: goto jam; } break; L92: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 92: L92a: switch (yych) { case '\\': goto L19; case '\1' ... '\t': case '\v' ... '[': case ']' ... 255: goto L92; default: goto jam; } break; L91: YY_GETC(yych); case 91: L91a: switch (yych) { case '\\': goto L19; case '\1' ... '\t': case '\v' ... '[': case ']' ... 255: goto L92; default: goto jam; } break; L89: reg[0] = p; cat = 1; bp = p; YY_GETC(yych); case 89: L89a: switch (yych) { case '\n' ... '\r': goto L88; case '\t': case ' ': goto L90; case '#': goto L91; default: goto jam; } break; L2: YY_GETC(yych); case 2: L2a: switch (yych) { case '/': goto L3; case '#': goto L16; case '+': goto L21; case '-': goto L48; case '0': goto L52; case ';': goto L65; case '*': goto L67; case '%': goto L67; case '&': goto L56; case '(': goto L65; case '[': goto L65; case '{': goto L65; case ':': goto L57; case '?': goto L65; case '\1' ... '\b': case '\16' ... '\37': case '$': case '@': case '\\': case '`': case '\177' ... 255: goto L59; case '}': goto L65; case ']': goto L65; case ')': goto L65; case '|': goto L60; case '~': goto L65; case '^': goto L67; case '.': goto L61; case ',': goto L65; case '!': goto L67; case '>': goto L64; case '<': goto L66; case '=': goto L67; case '"': goto L68; case '\'': goto L74; case '1' ... '9': goto L78; case 'L': goto L80; case 'A' ... 'K': case 'M' ... 'Z': case '_': case 'a' ... 'z': goto L83; case '\n': goto L85; case '\v' ... '\r': goto L87; case '\t': case ' ': goto L89; goto L96; default: goto jam; } break; L95: reg[0] = p; cat = 3; bp = p; goto jam; L58: goto jam; L96: reg[0] = p; cat = 0; bp = p; goto jam; L94: YY_GETC(yych); L94a: if (yych < 1) { goto L96; } else { goto L95; } L0: switch (2 * yycontext.curcond + (yycontext.buf[yycontext.rptr-1] == '\n')) { case '\0' ... '\1': goto L2; case '\2' ... 255: goto L94; default: goto jam; } break; } underflow: abort (); jam: #define YY_JAMTODO \ do{ \ yyctx->savep = buf + bp; \ yyctx->save = *yyctx->savep; \ *yyctx->savep = '\0'; \ p = yyctx->rptr = bp; \ yytext = (char*) (yyctx->buf + yyctx->sptr); \ }while(0) YY_JAMTODO; switch (cat) { case 3: CAT3: ECHO; break; case 2: CAT2: printf("*** ERROR '%s' at line %d\n", yytext, 0); break; case 1: CAT1: return 1; break; case 0: CAT0: return 0; default: fprintf (stderr, "Scanner error; cat = %d", cat); abort (); } goto again; } #define RUNS 10000 int main() { int tok; int n; yyin = stdin; n = 0; while ((tok = yylex ())) { if (0) printf ("tok %d: '%s'\n", tok, yytext); n++; } fprintf(stderr, "%d tokens read\n", n); return 0; }