/* Generated by re2c */ #line 1 "push.f.re" /* * A push-model scanner example for re2c -f * Written Mon Apr 11 2005 by mgix@mgix.com * This file is in the public domain. * */ // ---------------------------------------------------------------------- #include #include #include #include #include #if defined(WIN32) typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #else #include #include #ifndef O_BINARY #define O_BINARY 0 #endif #endif // ---------------------------------------------------------------------- #define TOKENS \ \ TOK(kEOF) \ TOK(kEOL) \ TOK(kUnknown) \ TOK(kIdentifier) \ TOK(kDecimalConstant) \ \ TOK(kEqual) \ TOK(kLeftParen) \ TOK(kRightParen) \ TOK(kMinus) \ TOK(kPlus) \ TOK(kStar) \ TOK(kSlash) \ \ TOK(kIf) \ TOK(kFor) \ TOK(kElse) \ TOK(kGoto) \ TOK(kBreak) \ TOK(kWhile) \ TOK(kReturn) \ // ---------------------------------------------------------------------- static const char *tokenNames[] = { #define TOK(x) #x, TOKENS #undef TOK }; // ---------------------------------------------------------------------- class PushScanner { public: enum Token { #define TOK(x) x, TOKENS #undef TOK }; private: bool eof; int32_t state; uint8_t *limit; uint8_t *start; uint8_t *cursor; uint8_t *marker; uint8_t *buffer; uint8_t *bufferEnd; uint8_t yych; uint32_t yyaccept; public: // ---------------------------------------------------------------------- PushScanner() { limit = 0; start = 0; state = -1; cursor = 0; marker = 0; buffer = 0; eof = false; bufferEnd = 0; } // ---------------------------------------------------------------------- ~PushScanner() { } // ---------------------------------------------------------------------- void send( Token token ) { size_t tokenSize = cursor-start; const char *tokenName = tokenNames[token]; printf( "scanner is pushing out a token of type %d (%s)", token, tokenName ); if(token==kEOF) putchar('\n'); else { size_t tokenNameSize = strlen(tokenNames[token]); size_t padSize = 20-(20"); fwrite( start, tokenSize, 1, stdout ); printf("<----\n"); } } // ---------------------------------------------------------------------- uint32_t push( const void *input, ssize_t inputSize ) { printf( "scanner is receiving a new data batch of length %d\n" "scanner continues with saved state = %d\n", inputSize, state ); /* * Data source is signaling end of file when batch size * is less than maxFill. This is slightly annoying because * maxFill is a value that can only be known after re2c does * its thing. Practically though, maxFill is never bigger than * the longest keyword, so given our grammar, 32 is a safe bet. */ uint8_t null[64]; const ssize_t maxFill = 32; if(inputSize" { switch(YYGETSTATE()) { default: goto yy0; case 0: goto yyFillLabel0; case 1: goto yyFillLabel1; case 2: goto yyFillLabel2; } yy0: YYSETSTATE(0); if((YYLIMIT - YYCURSOR) < 7) YYFILL(7); yyFillLabel0: yych = *YYCURSOR; switch(yych) { case 0x00: goto yy32; case 0x09: case 0x0B: case 0x0C: case 0x0D: case ' ': goto yy30; case 0x0A: goto yy28; case '(': goto yy16; case ')': goto yy18; case '*': goto yy24; case '+': goto yy22; case '-': goto yy20; case '/': goto yy26; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy12; case '=': goto yy14; case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'c': case 'd': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 's': case 't': case 'u': case 'v': case 'x': case 'y': case 'z': goto yy10; case 'b': goto yy7; case 'e': goto yy5; case 'f': goto yy4; case 'g': goto yy6; case 'h': goto yy11; case 'i': goto yy2; case 'r': goto yy9; case 'w': goto yy8; default: goto yy34; } yy2: ++YYCURSOR; switch((yych = *YYCURSOR)) { case 'f': goto yy67; default: goto yy39; } yy3: #line 246 "push.f.re" { SEND(kIdentifier); } #line 336 "" yy4: yych = *++YYCURSOR; switch(yych) { case 'o': goto yy64; default: goto yy39; } yy5: yych = *++YYCURSOR; switch(yych) { case 'l': goto yy60; default: goto yy39; } yy6: yych = *++YYCURSOR; switch(yych) { case 'o': goto yy56; default: goto yy39; } yy7: yych = *++YYCURSOR; switch(yych) { case 'r': goto yy51; default: goto yy39; } yy8: yych = *++YYCURSOR; switch(yych) { case 'h': goto yy46; default: goto yy39; } yy9: yych = *++YYCURSOR; switch(yych) { case 'e': goto yy40; default: goto yy39; } yy10: yych = *++YYCURSOR; goto yy39; yy11: yych = *++YYCURSOR; goto yy39; yy12: ++YYCURSOR; yych = *YYCURSOR; goto yy37; yy13: #line 247 "push.f.re" { SEND(kDecimalConstant);} #line 386 "" yy14: ++YYCURSOR; #line 249 "push.f.re" { SEND(kEqual); } #line 391 "" yy16: ++YYCURSOR; #line 250 "push.f.re" { SEND(kLeftParen); } #line 396 "" yy18: ++YYCURSOR; #line 251 "push.f.re" { SEND(kRightParen); } #line 401 "" yy20: ++YYCURSOR; #line 252 "push.f.re" { SEND(kMinus); } #line 406 "" yy22: ++YYCURSOR; #line 253 "push.f.re" { SEND(kPlus); } #line 411 "" yy24: ++YYCURSOR; #line 254 "push.f.re" { SEND(kStar); } #line 416 "" yy26: ++YYCURSOR; #line 255 "push.f.re" { SEND(kSlash); } #line 421 "" yy28: ++YYCURSOR; #line 257 "push.f.re" { SKIP(); } #line 426 "" yy30: ++YYCURSOR; #line 258 "push.f.re" { SKIP(); } #line 431 "" yy32: ++YYCURSOR; #line 259 "push.f.re" { send(kEOF); return 1; } #line 436 "" yy34: ++YYCURSOR; #line 260 "push.f.re" { SEND(kUnknown); } #line 441 "" yy36: ++YYCURSOR; YYSETSTATE(1); if(YYLIMIT == YYCURSOR) YYFILL(1); yyFillLabel1: yych = *YYCURSOR; yy37: switch(yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy36; default: goto yy13; } yy38: ++YYCURSOR; YYSETSTATE(2); if(YYLIMIT == YYCURSOR) YYFILL(1); yyFillLabel2: yych = *YYCURSOR; yy39: switch(yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': goto yy38; default: goto yy3; } yy40: yych = *++YYCURSOR; switch(yych) { case 't': goto yy41; default: goto yy39; } yy41: yych = *++YYCURSOR; switch(yych) { case 'u': goto yy42; default: goto yy39; } yy42: yych = *++YYCURSOR; switch(yych) { case 'r': goto yy43; default: goto yy39; } yy43: yych = *++YYCURSOR; switch(yych) { case 'n': goto yy44; default: goto yy39; } yy44: ++YYCURSOR; switch((yych = *YYCURSOR)) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': goto yy38; default: goto yy45; } yy45: #line 245 "push.f.re" { SEND(kReturn); } #line 630 "" yy46: yych = *++YYCURSOR; switch(yych) { case 'i': goto yy47; default: goto yy39; } yy47: yych = *++YYCURSOR; switch(yych) { case 'l': goto yy48; default: goto yy39; } yy48: yych = *++YYCURSOR; switch(yych) { case 'e': goto yy49; default: goto yy39; } yy49: ++YYCURSOR; switch((yych = *YYCURSOR)) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': goto yy38; default: goto yy50; } yy50: #line 244 "push.f.re" { SEND(kWhile); } #line 720 "" yy51: yych = *++YYCURSOR; switch(yych) { case 'e': goto yy52; default: goto yy39; } yy52: yych = *++YYCURSOR; switch(yych) { case 'a': goto yy53; default: goto yy39; } yy53: yych = *++YYCURSOR; switch(yych) { case 'k': goto yy54; default: goto yy39; } yy54: ++YYCURSOR; switch((yych = *YYCURSOR)) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': goto yy38; default: goto yy55; } yy55: #line 243 "push.f.re" { SEND(kBreak); } #line 810 "" yy56: yych = *++YYCURSOR; switch(yych) { case 't': goto yy57; default: goto yy39; } yy57: yych = *++YYCURSOR; switch(yych) { case 'o': goto yy58; default: goto yy39; } yy58: ++YYCURSOR; switch((yych = *YYCURSOR)) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': goto yy38; default: goto yy59; } yy59: #line 242 "push.f.re" { SEND(kGoto); } #line 894 "" yy60: yych = *++YYCURSOR; switch(yych) { case 's': goto yy61; default: goto yy39; } yy61: yych = *++YYCURSOR; switch(yych) { case 'e': goto yy62; default: goto yy39; } yy62: ++YYCURSOR; switch((yych = *YYCURSOR)) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': goto yy38; default: goto yy63; } yy63: #line 241 "push.f.re" { SEND(kElse); } #line 978 "" yy64: yych = *++YYCURSOR; switch(yych) { case 'r': goto yy65; default: goto yy39; } yy65: ++YYCURSOR; switch((yych = *YYCURSOR)) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': goto yy38; default: goto yy66; } yy66: #line 240 "push.f.re" { SEND(kFor); } #line 1056 "" yy67: ++YYCURSOR; switch((yych = *YYCURSOR)) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': case 'Y': case 'Z': case '_': case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': case 's': case 't': case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': goto yy38; default: goto yy68; } yy68: #line 239 "push.f.re" { SEND(kIf); } #line 1128 "" } #line 261 "push.f.re" fill: ssize_t unfinishedSize = cursor-start; printf( "scanner needs a refill. Exiting for now with:\n" " saved fill state = %d\n" " unfinished token size = %d\n", state, unfinishedSize ); if(0