| %{ | |
| /* code here */ | |
| #include <stdarg.h> | |
| #include "sqlhist-parse.h" | |
| extern int my_yyinput(void *extra, char *buf, int max); | |
| #undef YY_INPUT | |
| #define YY_INPUT(b, r, m) ({r = my_yyinput(yyextra, b, m);}) | |
| #define YY_NO_INPUT | |
| #define YY_NO_UNPUT | |
| #define YY_EXTRA_TYPE struct sqlhist_bison * | |
| #define yytext yyg->yytext_r | |
| #define TRACE_SB ((struct sqlhist_bison *)yyextra) | |
| #define HANDLE_COLUMN do { TRACE_SB->line_idx += strlen(yytext); } while (0) | |
| %} | |
| %option caseless | |
| %option reentrant | |
| %option bison-bridge | |
| field \\?[a-z_][a-z0-9_\.]* | |
| qstring \"[^\"]*\" | |
| hexnum 0x[0-9a-f]+ | |
| number [0-9a-f]+ | |
| %% | |
| select { HANDLE_COLUMN; return SELECT; } | |
| as { HANDLE_COLUMN; return AS; } | |
| from { HANDLE_COLUMN; return FROM; } | |
| join { HANDLE_COLUMN; return JOIN; } | |
| on { HANDLE_COLUMN; return ON; } | |
| where { HANDLE_COLUMN; return WHERE; } | |
| cast { HANDLE_COLUMN; return CAST; } | |
| sym-offset { | |
| HANDLE_COLUMN; | |
| yylval->string = store_str(TRACE_SB, yyg->yytext_r); | |
| return FIELD; | |
| } | |
| {qstring} { | |
| HANDLE_COLUMN; | |
| yylval->string = store_str(TRACE_SB, yyg->yytext_r); | |
| return STRING; | |
| } | |
| {field} { | |
| const char *str = yyg->yytext_r; | |
| HANDLE_COLUMN; | |
| if (str[0] == '\\') { str++; }; | |
| yylval->string = store_str(TRACE_SB, str); | |
| return FIELD; | |
| } | |
| {hexnum} { | |
| HANDLE_COLUMN; | |
| yylval->number = strtol(yyg->yytext_r, NULL, 0); | |
| return NUMBER; | |
| } | |
| {number} { | |
| HANDLE_COLUMN; | |
| yylval->number = strtol(yyg->yytext_r, NULL, 0); | |
| return NUMBER; | |
| } | |
| \!= { HANDLE_COLUMN; return NEQ; } | |
| \<= { HANDLE_COLUMN; return LE; } | |
| \>= { HANDLE_COLUMN; return GE; } | |
| == { HANDLE_COLUMN; return EQ; } | |
| && { HANDLE_COLUMN; return AND; } | |
| "||" { HANDLE_COLUMN; return OR; } | |
| [<>&~] { HANDLE_COLUMN; return yytext[0]; } | |
| [\!()\-\+\*/,=] { HANDLE_COLUMN; return yytext[0]; } | |
| [ \t] { HANDLE_COLUMN; } | |
| \n { TRACE_SB->line_idx = 0; TRACE_SB->line_no++; } | |
| . { HANDLE_COLUMN; return PARSE_ERROR; } | |
| %% | |
| int yywrap(void *data) | |
| { | |
| return 1; | |
| } | |
| void yyerror(struct sqlhist_bison *sb, char *fmt, ...) | |
| { | |
| struct yyguts_t * yyg = (struct yyguts_t*)sb->scanner; | |
| va_list ap; | |
| va_start(ap, fmt); | |
| sql_parse_error(sb, yytext, fmt, ap); | |
| va_end(ap); | |
| } |