-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathlexer.l
136 lines (114 loc) · 3.27 KB
/
lexer.l
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
%option noyywrap nodefault yylineno case-insensitive
%{
#include "ast.h"
#include "parser.tab.h"
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
void yyerror(char *s, ...);
extern int yylex();
int oldstate;
%}
%x COMMENT
%s BTWMODE
%%
/* BETWEEN ... AND ...的特殊处理 */
<BTWMODE>AND { BEGIN INITIAL; return AND; }
AND { return ANDOP; }
AS { return AS; }
ASC { return ASC; }
BY { return BY; }
CASE { return CASE; }
DELETE { return DELETE; }
DESC { return DESC; }
ELSE { return ELSE; }
END { return END; }
EXIT { return EXIT; }
FROM { return FROM; }
GROUP { return GROUP; }
IN { return IN; }
INSERT { return INSERT; }
INTO { return INTO; }
LIKE { return LIKE; }
LIMIT { return LIMIT; }
NOT { return NOT; }
OR { return OR; }
ORDER { return ORDER; }
SELECT { return SELECT; }
SET { return SET; }
THEN { return THEN; }
UPDATE { return UPDATE; }
VALUES { return VALUES; }
WHEN { return WHEN; }
WHERE { return WHERE; }
/* 数字 */
-?[0-9]+ { yylval.intval=atoi(yytext); return INTNUM; }
-?[0-9]+"."[0-9]* |
-?"."[0-9]+ |
-?[0-9]+E[-+]?[0-9]+ |
-?[0-9]+"."[0-9]*E[-+]?[0-9]+ |
-?"."[0-9]+E[-+]?[0-9]+ { yylval.floatval=atof(yytext); return APPROXNUM; }
/* 字符串 */
'(\\.|''|[^'\n])*' |
\"(\\.|\"\"|[^"\n])*?\" {
yylval.strval = my_strdup(yytext+1);
yylval.strval[yyleng-2]=0;
//fprintf(stderr, "Scan String:'%s'\nByte Array:", yylval.strval);
//for(char *p = yylval.strval; *p; ++p) fprintf(stderr, "%x ", *p);
return STRING;
}
'(\\.|[^'\n])*$ { yyerror("Unterminated string %s", yytext); }
\"(\\.|[^"\n])*$ { yyerror("Unterminated string %s", yytext); }
/* 十六进制字符串 */
X'[0-9A-F]+' |
0X[0-9A-F]+ { yylval.strval = my_strdup(yytext); return STRING; }
/* 二进制字符串 */
0B[01]+ |
B'[01]+' { yylval.strval=my_strdup(yytext); return STRING; }
/* 操作符 */
[-+&~|^/%*(),.;!] {return yytext[0]; }
"&&" { return ANDOP; }
"||" { return OR; }
"=" { yylval.subtok=EXPR_EQ; return COMPARISON; }
">=" { yylval.subtok=EXPR_GE; return COMPARISON; }
">" { yylval.subtok=EXPR_GT; return COMPARISON; }
"<=" { yylval.subtok=EXPR_LE; return COMPARISON; }
"<" { yylval.subtok=EXPR_LT; return COMPARISON; }
"!=" |
"<>" { yylval.subtok=EXPR_NE; return COMPARISON; }
/* check trailing context manually */
COUNT { int c=input(); unput(c);
if(c=='(') return FCOUNT;
yylval.strval=my_strdup(yytext); return NAME; }
SUM { int c=input(); unput(c);
if(c=='(') return FSUM;
yylval.strval=my_strdup(yytext); return NAME; }
/* 名字 */
[A-Za-z][A-Za-z0-9_]* {
yylval.strval = my_strdup(yytext);
return NAME;
}
`[^`/\\.\n]+` {
yylval.strval=my_strdup(yytext+1);
yylval.strval[yyleng-2]=0;
return NAME;
}
`[^`\n]*$ { yyerror("Unterminated quoted name %s",yytext); }
/* 注释 */
#.* ;
"--"[ \t].* ;
/* Others */
[ \t\n]
. { yyerror("Mystery character '%c'", *yytext); }
%%
// main(int argc, char *argv[])
// {
// int tok;
// while(tok=yylex()) {
// printf("tok : %d\n", tok);
// if(tok==INTNUM) printf("INTNUM = %d\n", yylval.intval);
// else if(tok==APPROXNUM) printf("APPROXNUM = %f\n", yylval.floatval);
// else if(tok==NAME) printf("NAME : %s\n", yylval.strval);
// else printf("OTHERS : %s\n", yylval.name);
// }
// }