forked from mastermay/sql-parser
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsql.y
More file actions
129 lines (112 loc) · 2.49 KB
/
sql.y
File metadata and controls
129 lines (112 loc) · 2.49 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
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
%{
#include "head.h"
#include<iostream>
#include<string>
using namespace std;
extern int yylex(void);
extern int yyparse(void);
extern int yyerror(string);
%}
%token SELECT FROM WHERE WORD COMMA SEMICOLON COMPARE NUMBER LOGIC LEFTPARENTHESIS RIGHTPARENTHESIS
%%
all:
select SEMICOLON
{
((TreeNode *) $$)->print_node(1);
return 0;
}
select:
SELECT tnames FROM tables
{
$$ = new TreeNode("QUERY");
((TreeNode *) $$) -> add( new TreeNode("SELECT") );
((TreeNode *) $$) -> add( (TreeNode *)$2 );
((TreeNode *) $$) -> add( new TreeNode("FROM") );
((TreeNode *) $$) -> add( (TreeNode *)$4 );
}
| SELECT tnames FROM tables WHERE wheres
{
$$ = new TreeNode("QUERY");
((TreeNode *) $$) -> add( new TreeNode("SELECT") );
((TreeNode *) $$) -> add( (TreeNode *)$2 );
((TreeNode *) $$) -> add( new TreeNode("FROM") );
((TreeNode *) $$) -> add( (TreeNode *)$4 );
((TreeNode *) $$) -> add( new TreeNode("WHERE") );
((TreeNode *) $$) -> add( (TreeNode *)$6 );
}
tnames:
tname
{
$$ = new TreeNode("FIELD");
((TreeNode *) $$) -> add( (TreeNode *)$1 );
}
| tnames COMMA tname
{
$$ = new TreeNode("FIELDS");
((TreeNode *) $$) -> add( (TreeNode *)$1 );
((TreeNode *) $$) -> add( new TreeNode(",") );
((TreeNode *) $$) -> add( (TreeNode *)$3 );
}
tname:
WORD
{
$$ = new TreeNode($1->getData());
}
tables:
table
{
$$ = new TreeNode("TABLE");
((TreeNode *) $$) -> add( (TreeNode *)$1 );
}
| tables COMMA table
{
$$ = new TreeNode("TABLES");
((TreeNode *) $$) -> add( (TreeNode *)$1 );
((TreeNode *) $$) -> add( new TreeNode(",") );
((TreeNode *) $$) -> add( (TreeNode *)$3 );
}
table:
WORD
{
$$ = new TreeNode( $1->getData() );
}
| LEFTPARENTHESIS select RIGHTPARENTHESIS
{
$$ = $2;
}
wheres:
comp
{
$$ = new TreeNode("CONDITION");
((TreeNode *) $$) -> add( (TreeNode *)$1 );
}
| comp LOGIC wheres
{
$$ = new TreeNode("CONDITIONS");
((TreeNode *) $$) -> add( (TreeNode *)$1 );
((TreeNode *) $$) -> add( (TreeNode *)$2 );
((TreeNode *) $$) -> add( (TreeNode *)$3 );
}
comp:
wordornum COMPARE wordornum
{
$$ = new TreeNode("COMPARE");
((TreeNode *) $$) -> add( (TreeNode *)$1 );
((TreeNode *) $$) -> add( (TreeNode *)$2 );
((TreeNode *) $$) -> add( (TreeNode *)$3 );
}
wordornum:
WORD
{
$$ = new TreeNode( $1->getData() );
}
| NUMBER
{
$$ = new TreeNode( $1->getData() );
}
%%
int main()
{
yyparse();
return 0;
}