/* Generated by re2c 0.13.5 on Sat Jan 3 14:35:14 2009 */ #line 1 "lexer.re" #include #include #include #include "tokens.h" #define SLY_LEXER_BUF_PAD 32 static void escape_string(char *src_buf, size_t src_buf_len, char *dst_buf, size_t *dst_buf_len) { size_t i, o; for (i = 0, o = 0; i < src_buf_len && o < *dst_buf_len - 1; i++) { switch (src_buf[i]) { case '\n': dst_buf[o++] = '\\'; dst_buf[o++] = 'n'; break; case '\r': dst_buf[o++] = '\\'; dst_buf[o++] = 'r'; break; case '\t': dst_buf[o++] = '\\'; dst_buf[o++] = 't'; break; case '\0': dst_buf[o++] = '\\'; dst_buf[o++] = '0'; break; case '\v': dst_buf[o++] = '\\'; dst_buf[o++] = 'v'; break; case '\\': dst_buf[o++] = '\\'; dst_buf[o++] = '\\'; break; case '\'': dst_buf[o++] = '\\'; dst_buf[o++] = '\''; break; case '"': dst_buf[o++] = '\\'; dst_buf[o++] = '"'; break; default: dst_buf[o++] = src_buf[i]; } } *dst_buf_len = o; } static void dump_buf(sly_lexer_t *lex, char *buf_name, char *buf, size_t buf_len) { char dst_buf[4096]; size_t dst_buf_len = sizeof(dst_buf); if (!lex->debug) return; escape_string(buf, buf_len, dst_buf, &dst_buf_len); fprintf(stderr, "%s: \"", buf_name); fwrite(dst_buf, dst_buf_len, 1, stderr); fprintf(stderr, "\"\n"); } static void eat(sly_lexer_t *lex) { /* consume token */ if (lex->cursor - lex->buf > 0) { dump_buf(lex, "eat", lex->buf, lex->cursor - lex->buf); memmove(lex->buf, lex->cursor, lex->buf + lex->buf_len - lex->cursor); lex->buf_len -= lex->cursor - lex->buf; dump_buf(lex, "after eat", lex->buf, lex->buf_len); } /* reset scanner state */ /* XXX: does this bleong here? */ lex->cursor = lex->marker = lex->buf; lex->state = -1; } static sly_err_t send(sly_lexer_t *lex, sly_token_t tok) { sly_lexer_target_t *target = lex->target; size_t len = lex->cursor - lex->buf; sly_err_t err; /* emit token */ if ((err = target->cb(target->user_data, tok, lex->buf, len)) != SLY_OK) return err; /* consume token */ eat(lex); return SLY_OK; } #define YYFILL(n) do { \ if (lex->debug) \ fprintf(stderr, "need fill\n"); \ *need_fill = 1; \ return SLY_OK; \ } while (0) #define YYCURSOR lex->cursor #define YYMARKER lex->marker #define YYLIMIT (lex->buf + lex->buf_len) #define YYCTYPE char #define YYGETSTATE() lex->state #define YYSETSTATE(x) { lex->state = x; } #define yych lex->yych #define yyaccept lex->yyaccept #define EAT() do { \ eat(lex); \ return SLY_OK; \ } while (0) #define SEND(t) do { \ if (lex->debug) \ fprintf(stderr, "got %s\n", #t); \ return send(lex, t); \ } while (0) static int scan(sly_lexer_t *lex, int *need_fill) { if (!lex->buf_len) return 1; dump_buf(lex, "scan (0)", lex->buf, lex->buf_len); #line 139 "lexer.c" switch (YYGETSTATE()) { default: goto yy0; case 0: goto yyFillLabel0; case 1: goto yyFillLabel1; case 2: goto yyFillLabel2; case 3: goto yyFillLabel3; case 4: goto yyFillLabel4; case 5: goto yyFillLabel5; case 6: goto yyFillLabel6; case 7: goto yyFillLabel7; } yy0: YYSETSTATE(0); if ((YYLIMIT - YYCURSOR) < 7) YYFILL(7); yyFillLabel0: yych = *YYCURSOR; switch (yych) { case '\t': case '\n': case '\v': case '\r': case ' ': goto yy67; case '!': goto yy42; case '%': goto yy40; case '&': goto yy56; case '(': goto yy14; case ')': goto yy16; case '*': goto yy36; case '+': goto yy32; case ',': goto yy54; case '-': goto yy34; case '.': goto yy52; case '/': goto yy38; case '0': goto yy64; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy66; case ':': goto yy48; case ';': goto yy50; case '<': goto yy26; case '=': goto yy30; case '>': goto yy28; 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 'c': case 'g': case 'j': case 'k': case 'l': case 'm': case 'p': case 'q': case 's': case 'x': case 'y': case 'z': goto yy62; case '[': goto yy18; case ']': goto yy20; case '^': goto yy44; case 'a': goto yy60; case 'b': goto yy8; case 'd': goto yy12; case 'e': goto yy4; case 'f': goto yy6; case 'h': goto yy63; case 'i': goto yy2; case 'n': goto yy10; case 'o': goto yy61; case 'r': goto yy5; case 't': goto yy9; case 'u': goto yy11; case 'v': goto yy13; case 'w': goto yy7; case '{': goto yy22; case '|': goto yy58; case '}': goto yy24; case '~': goto yy46; default: goto yy69; } yy2: ++YYCURSOR; switch ((yych = *YYCURSOR)) { case 'f': goto yy190; default: goto yy91; } yy3: #line 213 "lexer.re" { SEND(Tident); } #line 260 "lexer.c" yy4: yych = *++YYCURSOR; switch (yych) { case 'l': goto yy186; default: goto yy91; } yy5: yych = *++YYCURSOR; switch (yych) { case 'e': goto yy180; default: goto yy91; } yy6: yych = *++YYCURSOR; switch (yych) { case 'a': goto yy172; case 'o': goto yy173; default: goto yy91; } yy7: yych = *++YYCURSOR; switch (yych) { case 'h': goto yy167; default: goto yy91; } yy8: yych = *++YYCURSOR; switch (yych) { case 'r': goto yy162; default: goto yy91; } yy9: yych = *++YYCURSOR; switch (yych) { case 'r': goto yy158; default: goto yy91; } yy10: yych = *++YYCURSOR; switch (yych) { case 'i': goto yy155; default: goto yy91; } yy11: yych = *++YYCURSOR; switch (yych) { case 'n': goto yy150; default: goto yy91; } yy12: yych = *++YYCURSOR; switch (yych) { case 'e': goto yy147; default: goto yy91; } yy13: yych = *++YYCURSOR; switch (yych) { case 'a': goto yy144; default: goto yy91; } yy14: ++YYCURSOR; #line 162 "lexer.re" { SEND(Tlpn); } #line 326 "lexer.c" yy16: ++YYCURSOR; #line 163 "lexer.re" { SEND(Trpn); } #line 331 "lexer.c" yy18: ++YYCURSOR; #line 164 "lexer.re" { SEND(Tlsb); } #line 336 "lexer.c" yy20: ++YYCURSOR; #line 165 "lexer.re" { SEND(Trsb); } #line 341 "lexer.c" yy22: ++YYCURSOR; #line 166 "lexer.re" { SEND(Tlqb); } #line 346 "lexer.c" yy24: ++YYCURSOR; #line 167 "lexer.re" { SEND(Trqb); } #line 351 "lexer.c" yy26: ++YYCURSOR; switch ((yych = *YYCURSOR)) { case '<': goto yy138; case '=': goto yy140; default: goto yy27; } yy27: #line 168 "lexer.re" { SEND(Tlt); } #line 362 "lexer.c" yy28: ++YYCURSOR; switch ((yych = *YYCURSOR)) { case '=': goto yy134; case '>': goto yy132; default: goto yy29; } yy29: #line 169 "lexer.re" { SEND(Tgt); } #line 373 "lexer.c" yy30: ++YYCURSOR; switch ((yych = *YYCURSOR)) { case '=': goto yy130; case '~': goto yy128; default: goto yy31; } yy31: #line 173 "lexer.re" { SEND(Teq); } #line 384 "lexer.c" yy32: ++YYCURSOR; switch ((yych = *YYCURSOR)) { case '+': goto yy124; case '=': goto yy126; default: goto yy33; } yy33: #line 174 "lexer.re" { SEND(Tplus); } #line 395 "lexer.c" yy34: ++YYCURSOR; switch ((yych = *YYCURSOR)) { case '-': goto yy120; case '=': goto yy122; default: goto yy35; } yy35: #line 175 "lexer.re" { SEND(Tminus); } #line 406 "lexer.c" yy36: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { case '*': goto yy115; case '=': goto yy116; default: goto yy37; } yy37: #line 176 "lexer.re" { SEND(Tstar); } #line 418 "lexer.c" yy38: ++YYCURSOR; switch ((yych = *YYCURSOR)) { case '=': goto yy113; default: goto yy39; } yy39: #line 177 "lexer.re" { SEND(Tdiv); } #line 428 "lexer.c" yy40: ++YYCURSOR; switch ((yych = *YYCURSOR)) { case '=': goto yy111; default: goto yy41; } yy41: #line 178 "lexer.re" { SEND(Tpercent); } #line 438 "lexer.c" yy42: ++YYCURSOR; switch ((yych = *YYCURSOR)) { case '=': goto yy107; case '~': goto yy105; default: goto yy43; } yy43: #line 179 "lexer.re" { SEND(Tnot); } #line 449 "lexer.c" yy44: ++YYCURSOR; switch ((yych = *YYCURSOR)) { case '=': goto yy103; default: goto yy45; } yy45: #line 180 "lexer.re" { SEND(Tcaret); } #line 459 "lexer.c" yy46: ++YYCURSOR; #line 181 "lexer.re" { SEND(Ttilde); } #line 464 "lexer.c" yy48: ++YYCURSOR; #line 182 "lexer.re" { SEND(Tcolon); } #line 469 "lexer.c" yy50: ++YYCURSOR; #line 183 "lexer.re" { SEND(Tsemi); } #line 474 "lexer.c" yy52: ++YYCURSOR; #line 184 "lexer.re" { SEND(Tdot); } #line 479 "lexer.c" yy54: ++YYCURSOR; #line 185 "lexer.re" { SEND(Tcomma); } #line 484 "lexer.c" yy56: ++YYCURSOR; switch ((yych = *YYCURSOR)) { case '&': goto yy101; case '=': goto yy99; default: goto yy57; } yy57: #line 186 "lexer.re" { SEND(Tamp); } #line 495 "lexer.c" yy58: ++YYCURSOR; switch ((yych = *YYCURSOR)) { case '|': goto yy97; default: goto yy59; } yy59: #line 187 "lexer.re" { SEND(Tpipe); } #line 505 "lexer.c" yy60: yych = *++YYCURSOR; switch (yych) { case 'n': goto yy94; default: goto yy91; } yy61: yych = *++YYCURSOR; switch (yych) { case 'r': goto yy92; default: goto yy91; } yy62: yych = *++YYCURSOR; goto yy91; yy63: yych = *++YYCURSOR; switch (yych) { case '\t': case '\n': case '\v': case '\r': case ' ': goto yy71; 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 '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 yy90; case 'h': goto yy88; default: goto yy3; } yy64: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { case 'b': goto yy80; case 'x': goto yy81; default: goto yy76; } yy65: #line 214 "lexer.re" { SEND(Tint); } #line 605 "lexer.c" yy66: yyaccept = 1; yych = *(YYMARKER = ++YYCURSOR); goto yy76; yy67: ++YYCURSOR; yych = *YYCURSOR; goto yy72; yy68: #line 219 "lexer.re" { EAT(); } #line 617 "lexer.c" yy69: ++YYCURSOR; #line 220 "lexer.re" { EAT(); } #line 622 "lexer.c" yy71: ++YYCURSOR; YYSETSTATE(1); if (YYLIMIT <= YYCURSOR) YYFILL(1); yyFillLabel1: yych = *YYCURSOR; yy72: switch (yych) { case '\t': case '\n': case '\v': case '\r': case ' ': case 'h': goto yy71; default: goto yy68; } yy73: yych = *++YYCURSOR; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy77; default: goto yy74; } yy74: YYCURSOR = YYMARKER; switch (yyaccept) { case 0: goto yy37; case 1: goto yy65; } yy75: yyaccept = 1; YYMARKER = ++YYCURSOR; YYSETSTATE(2); if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yyFillLabel2: yych = *YYCURSOR; yy76: switch (yych) { case '.': goto yy73; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy75; default: goto yy65; } yy77: ++YYCURSOR; YYSETSTATE(3); if (YYLIMIT <= YYCURSOR) YYFILL(1); yyFillLabel3: yych = *YYCURSOR; switch (yych) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': goto yy77; default: goto yy79; } yy79: #line 217 "lexer.re" { SEND(Tfloat); } #line 704 "lexer.c" yy80: yych = *++YYCURSOR; switch (yych) { case '0': case '1': goto yy85; default: goto yy74; } yy81: yych = *++YYCURSOR; 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 'a': case 'b': case 'c': case 'd': case 'e': case 'f': goto yy82; default: goto yy74; } yy82: ++YYCURSOR; YYSETSTATE(4); if (YYLIMIT <= YYCURSOR) YYFILL(1); yyFillLabel4: yych = *YYCURSOR; 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 'a': case 'b': case 'c': case 'd': case 'e': case 'f': goto yy82; default: goto yy84; } yy84: #line 215 "lexer.re" { SEND(Tint_hex); } #line 773 "lexer.c" yy85: ++YYCURSOR; YYSETSTATE(5); if (YYLIMIT <= YYCURSOR) YYFILL(1); yyFillLabel5: yych = *YYCURSOR; switch (yych) { case '0': case '1': goto yy85; default: goto yy87; } yy87: #line 216 "lexer.re" { SEND(Tint_bin); } #line 788 "lexer.c" yy88: ++YYCURSOR; YYSETSTATE(6); if (YYLIMIT <= YYCURSOR) YYFILL(1); yyFillLabel6: yych = *YYCURSOR; switch (yych) { case '\t': case '\n': case '\v': case '\r': case ' ': goto yy71; 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 '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 yy90; case 'h': goto yy88; default: goto yy3; } yy90: ++YYCURSOR; YYSETSTATE(7); if (YYLIMIT <= YYCURSOR) YYFILL(1); yyFillLabel7: yych = *YYCURSOR; yy91: 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 yy90; default: goto yy3; } yy92: ++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 yy90; default: goto yy93; } yy93: #line 197 "lexer.re" { SEND(Tor); } #line 1010 "lexer.c" yy94: yych = *++YYCURSOR; switch (yych) { case 'd': goto yy95; default: goto yy91; } yy95: ++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 yy90; default: goto yy96; } yy96: #line 196 "lexer.re" { SEND(Tand); } #line 1088 "lexer.c" yy97: ++YYCURSOR; #line 195 "lexer.re" { SEND(Tor); } #line 1093 "lexer.c" yy99: ++YYCURSOR; #line 198 "lexer.re" { SEND(Tamp_eq); } #line 1098 "lexer.c" yy101: ++YYCURSOR; #line 194 "lexer.re" { SEND(Tand); } #line 1103 "lexer.c" yy103: ++YYCURSOR; #line 206 "lexer.re" { SEND(Tcaret_eq); } #line 1108 "lexer.c" yy105: ++YYCURSOR; #line 193 "lexer.re" { SEND(Tnmatch); } #line 1113 "lexer.c" yy107: ++YYCURSOR; switch ((yych = *YYCURSOR)) { case '=': goto yy109; default: goto yy108; } yy108: #line 190 "lexer.re" { SEND(Tneq); } #line 1123 "lexer.c" yy109: ++YYCURSOR; #line 191 "lexer.re" { SEND(Tneqq); } #line 1128 "lexer.c" yy111: ++YYCURSOR; #line 205 "lexer.re" { SEND(Tpercent_eq); } #line 1133 "lexer.c" yy113: ++YYCURSOR; #line 202 "lexer.re" { SEND(Tdiv_eq); } #line 1138 "lexer.c" yy115: yych = *++YYCURSOR; switch (yych) { case '=': goto yy118; default: goto yy74; } yy116: ++YYCURSOR; #line 201 "lexer.re" { SEND(Tstar_eq); } #line 1149 "lexer.c" yy118: ++YYCURSOR; #line 209 "lexer.re" { SEND(Tpow_eq); } #line 1154 "lexer.c" yy120: ++YYCURSOR; #line 211 "lexer.re" { SEND(Tdec); } #line 1159 "lexer.c" yy122: ++YYCURSOR; #line 200 "lexer.re" { SEND(Tminus_eq); } #line 1164 "lexer.c" yy124: ++YYCURSOR; #line 210 "lexer.re" { SEND(Tinc); } #line 1169 "lexer.c" yy126: ++YYCURSOR; #line 199 "lexer.re" { SEND(Tplus_eq); } #line 1174 "lexer.c" yy128: ++YYCURSOR; #line 192 "lexer.re" { SEND(Tmatch); } #line 1179 "lexer.c" yy130: ++YYCURSOR; #line 189 "lexer.re" { SEND(Teqq); } #line 1184 "lexer.c" yy132: ++YYCURSOR; switch ((yych = *YYCURSOR)) { case '=': goto yy136; default: goto yy133; } yy133: #line 171 "lexer.re" { SEND(Trs); } #line 1194 "lexer.c" yy134: ++YYCURSOR; #line 204 "lexer.re" { SEND(Tgt_eq); } #line 1199 "lexer.c" yy136: ++YYCURSOR; #line 208 "lexer.re" { SEND(Trs_eq); } #line 1204 "lexer.c" yy138: ++YYCURSOR; switch ((yych = *YYCURSOR)) { case '=': goto yy142; default: goto yy139; } yy139: #line 170 "lexer.re" { SEND(Tls); } #line 1214 "lexer.c" yy140: ++YYCURSOR; #line 203 "lexer.re" { SEND(Tlt_eq); } #line 1219 "lexer.c" yy142: ++YYCURSOR; #line 207 "lexer.re" { SEND(Tls_eq); } #line 1224 "lexer.c" yy144: yych = *++YYCURSOR; switch (yych) { case 'r': goto yy145; default: goto yy91; } yy145: ++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 yy90; default: goto yy146; } yy146: #line 160 "lexer.re" { SEND(Tvar); } #line 1302 "lexer.c" yy147: yych = *++YYCURSOR; switch (yych) { case 'f': goto yy148; default: goto yy91; } yy148: ++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 yy90; default: goto yy149; } yy149: #line 159 "lexer.re" { SEND(Tdef); } #line 1380 "lexer.c" yy150: yych = *++YYCURSOR; switch (yych) { case 'd': goto yy151; default: goto yy91; } yy151: yych = *++YYCURSOR; switch (yych) { case 'e': goto yy152; default: goto yy91; } yy152: yych = *++YYCURSOR; switch (yych) { case 'f': goto yy153; default: goto yy91; } yy153: ++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 yy90; default: goto yy154; } yy154: #line 158 "lexer.re" { SEND(Tundef); } #line 1470 "lexer.c" yy155: yych = *++YYCURSOR; switch (yych) { case 'l': goto yy156; default: goto yy91; } yy156: ++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 yy90; default: goto yy157; } yy157: #line 157 "lexer.re" { SEND(Tnil); } #line 1548 "lexer.c" yy158: yych = *++YYCURSOR; switch (yych) { case 'u': goto yy159; default: goto yy91; } yy159: yych = *++YYCURSOR; switch (yych) { case 'e': goto yy160; default: goto yy91; } yy160: ++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 yy90; default: goto yy161; } yy161: #line 155 "lexer.re" { SEND(Ttrue); } #line 1632 "lexer.c" yy162: yych = *++YYCURSOR; switch (yych) { case 'e': goto yy163; default: goto yy91; } yy163: yych = *++YYCURSOR; switch (yych) { case 'a': goto yy164; default: goto yy91; } yy164: yych = *++YYCURSOR; switch (yych) { case 'k': goto yy165; default: goto yy91; } yy165: ++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 yy90; default: goto yy166; } yy166: #line 153 "lexer.re" { SEND(Tbreak); } #line 1722 "lexer.c" yy167: yych = *++YYCURSOR; switch (yych) { case 'i': goto yy168; default: goto yy91; } yy168: yych = *++YYCURSOR; switch (yych) { case 'l': goto yy169; default: goto yy91; } yy169: yych = *++YYCURSOR; switch (yych) { case 'e': goto yy170; default: goto yy91; } yy170: ++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 yy90; default: goto yy171; } yy171: #line 152 "lexer.re" { SEND(Twhile); } #line 1812 "lexer.c" yy172: yych = *++YYCURSOR; switch (yych) { case 'l': goto yy176; default: goto yy91; } yy173: yych = *++YYCURSOR; switch (yych) { case 'r': goto yy174; default: goto yy91; } yy174: ++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 yy90; default: goto yy175; } yy175: #line 151 "lexer.re" { SEND(Tfor); } #line 1896 "lexer.c" yy176: yych = *++YYCURSOR; switch (yych) { case 's': goto yy177; default: goto yy91; } yy177: yych = *++YYCURSOR; switch (yych) { case 'e': goto yy178; default: goto yy91; } yy178: ++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 yy90; default: goto yy179; } yy179: #line 156 "lexer.re" { SEND(Tfalse); } #line 1980 "lexer.c" yy180: yych = *++YYCURSOR; switch (yych) { case 't': goto yy181; default: goto yy91; } yy181: yych = *++YYCURSOR; switch (yych) { case 'u': goto yy182; default: goto yy91; } yy182: yych = *++YYCURSOR; switch (yych) { case 'r': goto yy183; default: goto yy91; } yy183: yych = *++YYCURSOR; switch (yych) { case 'n': goto yy184; default: goto yy91; } yy184: ++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 yy90; default: goto yy185; } yy185: #line 150 "lexer.re" { SEND(Tret); } #line 2076 "lexer.c" yy186: yych = *++YYCURSOR; switch (yych) { case 's': goto yy187; default: goto yy91; } yy187: yych = *++YYCURSOR; switch (yych) { case 'e': goto yy188; default: goto yy91; } yy188: ++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 yy90; default: goto yy189; } yy189: #line 149 "lexer.re" { SEND(Telse); } #line 2160 "lexer.c" yy190: ++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 yy90; default: goto yy191; } yy191: #line 148 "lexer.re" { SEND(Tif); } #line 2232 "lexer.c" #line 221 "lexer.re" /* ws+ { EAT(); } alpha+ { SEND(Tident); } [^] { SEND(Tunknown); } */ dump_buf(lex, "scan (1)", lex->buf, lex->buf_len); return SLY_OK; } sly_err_t sly_lexer_init(sly_lexer_t *lex, sly_lexer_target_t *target) { memset(lex, 0, sizeof(sly_lexer_t)); lex->target = target; lex->cursor = lex->marker = lex->buf; lex->state = -1; return SLY_OK; } sly_err_t sly_lexer_push(sly_lexer_t *lex, char *buf, size_t buf_len, int is_done) { char pad_buf[SLY_LEXER_BUF_PAD]; sly_err_t err; size_t slice; int need_fill = 0; while (buf_len > 0) { dump_buf(lex, "src buf (0)", buf, buf_len); /* calculate slice length */ slice = buf_len; if (lex->buf_len + buf_len > SLY_LEXER_BUF_SIZE) slice = SLY_LEXER_BUF_SIZE - lex->buf_len; /* add file chunk to scan buffer */ memcpy(lex->buf, buf, slice); lex->buf_len += slice; /* remove slice from src buffer */ buf += slice; buf_len -= slice; dump_buf(lex, "src buf (1)", buf, buf_len); /* tokenize buffer */ for (need_fill = 0, err = SLY_OK; !need_fill && err == SLY_OK; err = scan(lex, &need_fill)); if (err != SLY_OK) return err; } /* flush any remaining characters */ slice = sizeof(pad_buf); memset(pad_buf, 0, slice); memcpy(lex->buf + lex->buf_len, pad_buf, slice); lex->buf_len = slice; /* tokenize buffer */ for (need_fill = 0, err = SLY_OK; !need_fill && err == SLY_OK; err = scan(lex, &need_fill)); if (err != SLY_OK) return err; /* send eof to target */ if (is_done) SEND(Teof); /* return success */ return SLY_OK; } void sly_lexer_debug(sly_lexer_t *lex) { lex->debug = 1; } /* vim:syntax=c */