-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsql.parsing.y
149 lines (119 loc) · 4.05 KB
/
sql.parsing.y
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
*SQL词法分析器
*by axknightroad
*2013/5/10
*/
%option noyywrap nodefault yylineno case-insensitive
%{
#include "sql.parsing.tab.h"
#include <stdarg.h>
#include <string.h>
void yyerror(char *s, ...);
%}
%s BTWMODE
%%
CREATE {return CREATE;}
DATABASE {return DATABASE;}
DATABASES {return DATABASES;}
SHOW {return SHOW;}
DROP {return DROP;}
USE {return USE;}
TABLE {return TABLE;}
TABLES {return TABLES;}
INSERT {return INSERT;}
INTO {return INTO;}
VALUES {return VALUES;}
SELECT {return SELECT;}
FROM {return FROM;}
WHERE {return WHERE;}
BETWEEN {BEGIN BTWMODE; return BETWEEN;}
<BTWMODE>AND {BEGIN INITIAL; return AND;}
AND {return ANDOP;}
OR {return OR;}
XOR {return XOR;}
NOT {return NOT;}
DELETE {return DELETE;}
UPDATE {return UPDATE;}
SET {return SET;}
SCHEMA {return DATABASE;}
SCHEMAS {return DATABASES;}
CASCADE {return CASCADE;}
RESTRICT {return RESTRICT;}
CHAR {return CHAR;}
VARCHAR {return VARCHAR;}
INT {return INT;}
SMALLINT {return SMALLINT;}
NUMERIC {return NUMERIC;}
REAL {return REAL;}
DOUBLE {return DOUBLE;}
PRECISION {return PRECISION;}
FLOAT {return FLOAT;}
DATE {return DATE;}
TIME {return TIME;}
ADD {return ADD;}
ALTER {return ALTER;}
COLUMN {return COLUMN;}
UNIQUE {return UNIQUE;}
CLUSTER {return CLUSTER;}
INDEX {return INDEX;}
ON {return ON;}
ALL {return ALL;}
DISTINCT {return DISTINCT;}
GROUP {return GROUP;}
BY {return BY;}
HAVING {return HAVING;}
ORDER {return ORDER;}
ASC {return ASC;}
DESC {return DESC;}
LIKE {return LIKE;}
NULL {return NULLX;}
IN {return IN;}
LEFT {return LEFT;}
RIGHT {return RIGHT;}
OUT {return OUT;}
JOIN {return JOIN;}
ANY {return ANY;}
SOME {return SOME;}
EXISTS {yylval.subtok=0; return EXISTS;}
NOT[ \t\n]+EXISTS {yylval.subtok=1; return EXISTS;}
UNION {return UNION;}
INTERSECT {return INTERSECT;}
EXCEPT {return EXCEPT;}
VIEW {return VIEW;}
AS {return AS;}
WITH {return WITH;}
CHECK {return CHECK;}
OPTION {return OPTION;}
DISTINCTROW {return DISTINCTROW;}
-?[0-9]+ { yylval.intval=atoi(yytext); return INTNUM;}
-?[0-9]+"."[0-9]* |
-?[0-9]+E[-+]?[0-9]+ |
-?[0-9]+"."[0-9]*E[-+]?[0-9]+ {yylval.floatval=atof(yytext); return APPROXNUM;}
TRUE {yylval.intval=1; return BOOL;}
UNKNOWN {yylval.intval=-1; return BOOL;}
FALSE {yylval.intval=0; return BOOL;}
'(''|[^'\n])*' {yylval.strval=strdup(yytext);return STRING;}
'(''|[^'\n])*$ {yyerror("Unterminated string %s",yytext);}
[-+&~|^/%*(),.;!] {return yytext[0];}
"&&" {return ANDOP;}
"||" {return OR;}
"=" {yylval.subtok=4;return COMPARISON;}
"<=>" {yylval.subtok=12;return COMPARISON;}
">=" {yylval.subtok=6;return COMPARISON;}
">" {yylval.subtok=2;return COMPARISON;}
"<=" {yylval.subtok=5;return COMPARISON;}
"<" {yylval.subtok=1;return COMPARISON;}
"!="|"<>" {yylval.subtok=3;return COMPARISON;}
"!<" {yylval.subtok=7;return COMPARISON;}
"!>" {yylval.subtok=8;return COMPARISON;}
"<<" {yylval.subtok=1;return SHIFT;}
">>" {yylval.subtok=2;return SHIFT;}
COUNT {int c=input();unput(c);
if(c=='(') return FCOUNT;
yylval.strval=strdup(yytext);
return NAME;
}
[A-Za-z][A-Za-z0-9_]* {yylval.strval=strdup(yytext); return NAME;}
[ \t\n] /*whitespace*/
. {yyerror("mystery character '%c'",*yytext);}
%%