-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathlexer.rl
More file actions
78 lines (63 loc) · 1.7 KB
/
lexer.rl
File metadata and controls
78 lines (63 loc) · 1.7 KB
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
%%{
machine lexer;
main := |*
('-'|'+')? [1-9][0-9]* { INTEGER() };
('-'|'+')? [0-9]* '.' [0-9]+{ FLOAT() };
/select/i { KEYWORD(TK_SELECT) };
/quit/i { KEYWORD(TK_QUIT) };
/where/i { KEYWORD(TK_WHERE) };
/or/i { KEYWORD(TK_OR) };
/and/i { KEYWORD(TK_AND) };
/not/i { KEYWORD(TK_NOT) };
/like/i { KEYWORD(TK_LIKE) };
/from/i { KEYWORD(TK_FROM) };
/-r/i { KEYWORD(TK_RECURSIVE) };
/order/i { KEYWORD(TK_ORDER) };
/by/i { KEYWORD(TK_BY) };
/asc/i { KEYWORD(TK_ASC) };
/desc/i { KEYWORD(TK_DESC) };
/limit/i { KEYWORD(TK_LIMIT) };
'+' { SYMBOL(TK_PLUS) };
'-' { SYMBOL(TK_MINUS) };
'/' { SYMBOL(TK_DIV) };
'%' { SYMBOL(TK_MOD) };
'(' { SYMBOL(TK_LP) };
')' { SYMBOL(TK_RP) };
'>' { SYMBOL(TK_GT); };
'<' { SYMBOL(TK_LT); };
'=' { SYMBOL(TK_EQ); };
'>=' { SYMBOL(TK_GE); };
'<=' { SYMBOL(TK_LE); };
'!=' { SYMBOL(TK_NE); };
'*' { SYMBOL(TK_STAR) };
',' { SYMBOL(TK_COMMA) };
dliteralChar = [^`"\\] | ( '\\' any );
'"' (dliteralChar | '`')* '"' { STRING() };
'`' (dliteralChar | '"')* '`' { STRING() };
"'" (dliteralChar | '"')* "'" { STRING() };
(print - space - [,<>=\*])+ { ID() };
space;
*|;
}%%
%% write data;
ParserContext Parse(char *str) {
int cs, act;
char *ts, *te;
char *p = str;
char *pe = p + strlen(p);
char *eof = pe;
Token *tk = NULL;
ParserContext context;
context.stmt = NULL;
void *parser = ParseAlloc(malloc);
%% write init;
%% write exec;
if (cs < %%{ write first_final; }%%) {
printf("unrecognized: %s\n", p);
context.error = true;
} else {
Parse(parser, 0, 0, &context);
}
ParseFree(parser, free);
return context;
}