-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathgrammar
243 lines (192 loc) · 16.9 KB
/
grammar
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
#
# Grammar Rules(v0.2)
#
# Grammar Rules
% start S
S[SEM=?vp] -> VP[SEM=?vp]
# SELECT * FROM TABLE FORMAT
VP[TNS=PRES, SEM=<all x.?nn(x)>] -> 'show' NP[SEM=?nn, TYPE=table] | 'return' NP[SEM=?nn, TYPE=table] | 'show me' NP[SEM=?nn, TYPE=table] | 'tell me' NP[SEM=?nn, TYPE=table] | 'find' NP[SEM=?nn, TYPE=table]
VP[SEM=<?vp(?pp)>] -> V[SEM=?vp, TYPE=simple] NP[SEM=?np, TYPE=records] PP[SEM=?pp, TYPE=table]
# To be used for testing instead of the upper one.
#VP[TNS=PRES, SEM=<all x.?nn(x)>] -> 'show' NP[SEM=?nn, TYPE=table] | 'return' NP[SEM=?nn, TYPE=table] | 'show' 'me' NP[SEM=?nn, TYPE=table] | 'tell' 'me' NP[SEM=?nn, TYPE=table] | 'find' NP[SEM=?nn, TYPE=table]
# SELECT * FORMAT
VP[SEM=<?vp(?np)(?pp)>] -> V[SEM=?vp] NP[SEM=?np, TYPE=table] PP[SEM=?pp]
VP[SEM=<?vp(?pp)>] -> V[SEM=?vp] NP[SEM=?np, TYPE=records] PP[SEM=?pp, TYPE=wherecolumn]
VP[SEM=<?vp(?pp1)(?pp)>] -> V[SEM=?vp] NP[SEM=?np, TYPE=records] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=table]
VP[SEM=<?vp(?pp1)(?pp)>] -> V[SEM=?vp] NP[SEM=?np, TYPE=records] PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=table]
VP[SEM=<?vp(?pp1)(?pp)>] -> V[SEM=?vp] NP[SEM=?np, TYPE=records] PP[SEM=?pp, TYPE=table] PP[SEM=?pp1, TYPE=wherecolumn]
VP[SEM=<?vp(?pp1)(?pp)>] -> V[SEM=?vp] NP[SEM=?np, TYPE=records] PP[SEM=?pp, TYPE=table] PP[SEM=?pp1, TYPE=date]
VP[SEM=<?vp(?pp1)((?pp & ?pp2))>] -> V[SEM=?vp] NP[SEM=?np, TYPE=records] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=wherecolumn]
VP[SEM=<?vp(?pp1)((?pp & ?pp2))>] -> V[SEM=?vp] NP[SEM=?np, TYPE=records] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=date]
VP[SEM=<?vp(?pp1)((?pp & ?pp2))>] -> V[SEM=?vp] NP[SEM=?np, TYPE=records] PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=wherecolumn]
VP[SEM=<?vp(?pp1)((?pp & ?pp2))>] -> V[SEM=?vp] NP[SEM=?np, TYPE=records] PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=date]
#VP[SEM=<?vp(?pp)>] -> V[SEM=?vp] PP[SEM=?pp]
## LIMIT
VP[SEM=<?vp(?pp)(?np)>] -> V[SEM=?vp] NP[SEM=?np, TYPE=limit] PP[SEM=?pp, TYPE=table]
VP[SEM=<?vp(?pp1)((?pp & ?np))>] -> V[SEM=?vp] NP[SEM=?np, TYPE=limit] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=table]
VP[SEM=<?vp(?pp1)((?pp & ?np))>] -> V[SEM=?vp] NP[SEM=?np, TYPE=limit] PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=table]
VP[SEM=<?vp(?pp1)((?pp & ?np))>] -> V[SEM=?vp] NP[SEM=?np, TYPE=limit] PP[SEM=?pp, TYPE=table] PP[SEM=?pp1, TYPE=wherecolumn]
VP[SEM=<?vp(?pp1)((?pp & ?np))>] -> V[SEM=?vp] NP[SEM=?np, TYPE=limit] PP[SEM=?pp, TYPE=table] PP[SEM=?pp1, TYPE=date]
VP[SEM=<?vp(?pp1)((?pp & ?pp2 & ?np))>] -> V[SEM=?vp] NP[SEM=?np, TYPE=limit] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=wherecolumn]
VP[SEM=<?vp(?pp1)((?pp & ?pp2 & ?np))>] -> V[SEM=?vp] NP[SEM=?np, TYPE=limit] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=date]
VP[SEM=<?vp(?pp1)((?pp & ?pp2 & ?np))>] -> V[SEM=?vp] NP[SEM=?np, TYPE=limit] PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=wherecolumn]
VP[SEM=<?vp(?pp1)((?pp & ?pp2 & ?np))>] -> V[SEM=?vp] NP[SEM=?np, TYPE=limit] PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=date]
VP[SEM=<?vp(?adp)((?pp1 & ?np))>] -> V[SEM=?vp, TYPE=selectsomewhere] NP[SEM=?np, TYPE=limit] ADP[SEM=?adp] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=groupby]
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?np))>] -> V[SEM=?vp, TYPE=selectsomewhere] NP[SEM=?np, TYPE=limit] ADP[SEM=?adp] PP[SEM=?pp, TYPE=groupby] PP[SEM=?pp1, TYPE=table]
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?pp2 & ?np))>] -> V[SEM=?vp, TYPE=selectsomewhere] NP[SEM=?np, TYPE=limit] ADP[SEM=?adp] PP[SEM=?pp, TYPE=groupby] PP[SEM=?pp2, TYPE=orderby] PP[SEM=?pp1, TYPE=table]
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?pp2 & ?pp3 & ?np))>] -> V[SEM=?vp, TYPE=selectsomewhere] NP[SEM=?np, TYPE=limit] ADP[SEM=?adp] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp2, TYPE=groupby] PP[SEM=?pp3, TYPE=orderby] PP[SEM=?pp1, TYPE=table]
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?pp2 & ?np))>] -> V[SEM=?vp, TYPE=selectsomewhere] NP[SEM=?np, TYPE=limit] ADP[SEM=?adp] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp2, TYPE=groupby] PP[SEM=?pp1, TYPE=table]
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?pp2 & ?np))>] -> V[SEM=?vp, TYPE=selectsomewhere] NP[SEM=?np, TYPE=limit] ADP[SEM=?adp] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=groupby]
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?pp2 & ?pp3 & ?np))>] -> V[SEM=?vp, TYPE=selectsomewhere] NP[SEM=?np, TYPE=limit] ADP[SEM=?adp] PP[SEM=?pp, TYPE=date] PP[SEM=?pp2, TYPE=groupby] PP[SEM=?pp3, TYPE=orderby] PP[SEM=?pp1, TYPE=table]
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?pp2 & ?np))>] -> V[SEM=?vp, TYPE=selectsomewhere] NP[SEM=?np, TYPE=limit] ADP[SEM=?adp] PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=groupby]
# SELECT @some_columns FORMAT
## AGGREGATION FORMAT
VP[SEM=<?vp(?adp)(?pp)>] -> V[SEM=?vp, TYPE=selectsomenowhere] ADP[SEM=?adp] PP[SEM=?pp, TYPE=table]
VP[SEM=<?vp(?adp)(?pp1)(?pp)>] -> V[SEM=?vp, TYPE=selectsomewhere] ADP[SEM=?adp] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp, TYPE=wherecolumn]
VP[SEM=<?vp(?adp)(?pp1)(?pp)>] -> V[SEM=?vp, TYPE=selectsomewhere] ADP[SEM=?adp] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=table]
VP[SEM=<?vp(?adp)(?pp1)(?pp)>] -> V[SEM=?vp, TYPE=selectsomewhere] ADP[SEM=?adp] PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=table]
VP[SEM=<?vp(?adp)(?pp1)(?pp)>] -> V[SEM=?vp, TYPE=selectsomewhere] ADP[SEM=?adp] PP[SEM=?pp, TYPE=table] PP[SEM=?pp1, TYPE=date]
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?pp2))>] -> V[SEM=?vp, TYPE=selectsomewhere] ADP[SEM=?adp] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=wherecolumn]
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?pp2))>] -> V[SEM=?vp, TYPE=selectsomewhere] ADP[SEM=?adp] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=date]
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?pp2))>] -> V[SEM=?vp, TYPE=selectsomewhere] ADP[SEM=?adp] PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=wherecolumn]
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?pp2))>] -> V[SEM=?vp, TYPE=selectsomewhere] ADP[SEM=?adp] PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=date]
## GROUP BY FORMAT W/O ORDER BY
VP[SEM=<?vp(?adp)(?pp1)>] -> V[SEM=?vp, TYPE=selectsomewhere] ADP[SEM=?adp] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=groupby]
VP[SEM=<?vp(?adp)(?pp1)(?pp)>] -> V[SEM=?vp, TYPE=selectsomewhere] ADP[SEM=?adp] PP[SEM=?pp, TYPE=groupby] PP[SEM=?pp1, TYPE=table]
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?pp2))>] -> V[SEM=?vp, TYPE=selectsomewhere] ADP[SEM=?adp] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=groupby]
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?pp2))>] -> V[SEM=?vp, TYPE=selectsomewhere] ADP[SEM=?adp] PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=groupby]
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?pp2))>] -> V[SEM=?vp, TYPE=selectsomewhere] ADP[SEM=?adp] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp2, TYPE=groupby] PP[SEM=?pp1, TYPE=table]
## GROUP BY FORMAT W/ ORDER BY
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?pp2))>] -> V[SEM=?vp, TYPE=selectsomewhere] ADP[SEM=?adp] PP[SEM=?pp, TYPE=groupby] PP[SEM=?pp2, TYPE=orderby] PP[SEM=?pp1, TYPE=table]
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?pp2 & ?pp3))>] -> V[SEM=?vp, TYPE=selectsomewhere] ADP[SEM=?adp] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp2, TYPE=groupby] PP[SEM=?pp3, TYPE=orderby] PP[SEM=?pp1, TYPE=table]
VP[SEM=<?vp(?adp)(?pp1)((?pp & ?pp2 & ?pp3))>] -> V[SEM=?vp, TYPE=selectsomewhere] ADP[SEM=?adp] PP[SEM=?pp, TYPE=date] PP[SEM=?pp2, TYPE=groupby] PP[SEM=?pp3, TYPE=orderby] PP[SEM=?pp1, TYPE=table]
## W/O AGGREGATION FORMAT
VP[SEM=<?vp(?np)(?pp1)(?pp)>] -> V[SEM=?vp, TYPE=selectsomewhere] NP[SEM=?np, TYPE=selectcolumn] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp, TYPE=wherecolumn]
VP[SEM=<?vp(?np)(?pp1)(?pp)>] -> V[SEM=?vp, TYPE=selectsomewhere] NP[SEM=?np, TYPE=selectcolumn] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=table]
VP[SEM=<?vp(?np)(?pp1)((?pp & ?pp2))>] -> V[SEM=?vp, TYPE=selectsomewhere] NP[SEM=?np, TYPE=selectcolumn] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=wherecolumn]
VP[SEM=<?vp(?np)(?pp1)((?pp & ?pp2))>] -> V[SEM=?vp, TYPE=selectsomewhere] NP[SEM=?np, TYPE=selectcolumn] PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=date]
VP[SEM=<?vp(?np)(?pp1)((?pp & ?pp2))>] -> V[SEM=?vp, TYPE=selectsomewhere] NP[SEM=?np, TYPE=selectcolumn] PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=wherecolumn]
VP[SEM=<?vp(?np)(?pp1)((?pp & ?pp2))>] -> V[SEM=?vp, TYPE=selectsomewhere] NP[SEM=?np, TYPE=selectcolumn] PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=table] PP[SEM=?pp2, TYPE=date]
VP[SEM=<?vp(?np)(?pp)>] -> V[SEM=?vp, TYPE=selectsomenowhere] NP[SEM=?np, TYPE=selectcolumn] PP[SEM=?pp, TYPE=table]
NP[SEM=<?nom>, TYPE=?type] -> NOM[SEM=?nom, TYPE=?type]
NOM[SEM=<?nn>, TYPE=?type] -> NN[SEM=?nn, TYPE=?type]
# LIMIT WITH 0 OFFSET
NOM[SEM=<?propn(\x.LIMIT(x))>, TYPE=limit] -> PropN[SEM=?propn, TYPE=number] NN[SEM=?nn, TYPE=?type]
NOM[SEM=<?propn(\x.LIMIT(x))>, TYPE=limit] -> ORD[TYPE=ordtop] PropN[SEM=?propn, TYPE=number] NN[SEM=?nn, TYPE=?type]
#NOM[SEM=<?propn>] -> PropN[SEM=?propn] # Why commented?
NOM[SEM=<?propn(?nn)>] -> NN[SEM=?nn, TYPE=wherecolumn] PropN[SEM=?propn]
#NOM[SEM=<?nn>, TYPE=selectcolumn] -> NN[SEM=?nn, TYPE=selectcolumn]
NOM[SEM=<(?nn & ?nom)>, TYPE=selectcolumn] -> NN[SEM=?nn, TYPE=selectcolumn] CONJ[] NOM[SEM=?nom, TYPE=selectcolumn]
# AGGREGATION
ADP[SEM=<?adj(?nn)>, TYPE=selectcolumn] -> ADJ[SEM=?adj] NN[SEM=?nn, TYPE=selectcolumn]
ADP[SEM=<(?adj(?nn) & ?adp)>, TYPE=selectcolumn] -> ADJ[SEM=?adj] NN[SEM=?nn, TYPE=selectcolumn] CONJ[] ADP[SEM=?adp, TYPE=selectcolumn]
PP[SEM=<?np>, TYPE=?type] -> P[SEM=?p] NP[SEM=?np, TYPE=?type]
# GROUP BY PP
PP[SEM=<?adv(?np)>, TYPE=groupby] -> P[SEM=?p] ADV[SEM=?adv, TYPE=groupby] NP[SEM=?np, TYPE=selectcolumn]
# DATE PP
PP[SEM=<?np(\x.date(date_column,greater,x))>, TYPE=date] -> P[TYPE=from] PropN[TYPE=date, SEM=?np]
PP[SEM=<?np(\x.date(date_column,lesser,x))>, TYPE=date] -> P[TYPE=to] PropN[TYPE=date, SEM=?np]
PP[SEM=<?np(\x.date(date_column,greater,x))>, TYPE=date] -> P[TYPE=from] NN[SEM=?nn, TYPE=wherecolumn] PropN[TYPE=date, SEM=?np]
PP[SEM=<?np(\x.date(date_column,lesser,x))>, TYPE=date] -> P[TYPE=to] NN[SEM=?nn, TYPE=wherecolumn] PropN[TYPE=date, SEM=?np]
PP[SEM=<?np(\x.date(date_column,equals,x))>, TYPE=date] -> P[TYPE=for] NN[SEM=?nn, TYPE=wherecolumn] PropN[TYPE=date, SEM=?np]
PP[SEM=<?np(\x.date(date_column,equals,x))>, TYPE=date] -> P[TYPE=for] PropN[TYPE=date, SEM=?np]
# MULTIPLE WHERE PP
PP[SEM=<?pp & ?pp1>, TYPE=wherecolumn] -> PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=wherecolumn]
PP[SEM=<?pp & ?pp1>, TYPE=date] -> PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=date]
PP[SEM=<?pp & ?pp1>, TYPE=date] -> PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=wherecolumn]
PP[SEM=<?pp & ?pp1>, TYPE=date] -> PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=date]
# ORDER BY and MULTIPLE WHERE PP
PP[SEM=<?pp>, TYPE=wherecolumn] -> PP[SEM=?pp, TYPE=orderby]
PP[SEM=<?pp & ?pp1>, TYPE=wherecolumn] -> PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=orderby]
PP[SEM=<?pp & ?pp1>, TYPE=date] -> PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=orderby]
PP[SEM=<?pp & ?pp1 & ?pp2>, TYPE=date] -> PP[SEM=?pp, TYPE=wherecolumn] PP[SEM=?pp1, TYPE=date] PP[SEM=?pp2, TYPE=orderby]
PP[SEM=<?pp & ?pp1 & ?pp2>, TYPE=date] -> PP[SEM=?pp, TYPE=date] PP[SEM=?pp1, TYPE=wherecolumn] PP[SEM=?pp2, TYPE=orderby]
PP[SEM=<?gerundv(?nn)>, TYPE=orderby] -> P[TYPE=in] GERUNDV[SEM=?gerundv, TYPE=orderby] NN[SEM=?nn, TYPE=selectcolumn]
PP[SEM=<?gerundv(?nn)>, TYPE=orderby] -> P[TYPE=in] GERUNDV[SEM=?gerundv, TYPE=orderby] NN[SEM=?nn, TYPE=selectcolumn]
PP[SEM=<?v(?nn)>, TYPE=orderby] -> V[SEM=?v, TYPE=orderbydefault] NN[SEM=?nn, TYPE=selectcolumn]
PP[SEM=<?v(?nn)(?o)>, TYPE=orderby] -> V[SEM=?v, TYPE=orderby] NN[SEM=?nn, TYPE=selectcolumn] ORD[TYPE=orderby, SEM=?o]
#
# Lexicons(v0.2)
#
CONJ[] -> 'and'
P[TYPE=for] -> 'for'
P[TYPE=of] -> 'of'
P[TYPE=from] -> 'from' | 'after'
P[TYPE=by] -> 'by'
P[TYPE=to] -> 'to' | 'before'
P[TYPE=in] -> 'in'
ORD[TYPE=ordtop] -> 'top'
ORD[TYPE=orderby, SEM=<ASC>] -> 'lowest first' | 'increasing' | 'ascending'
ORD[TYPE=orderby, SEM=<DESC>] -> 'highest first' | 'decreasing' | 'descending'
GERUNDV[TYPE=orderby, SEM=<\x.orderby(ASC,x)>] -> 'increasing order of'
GERUNDV[TYPE=orderby, SEM=<\x.orderby(DESC,x)>] -> 'decreasing order of'
ADV[TYPE=groupby, SEM=<\x.groupby(x)>] -> 'each' | 'every' | 'each and every'
ADJ[TYPE=mean, SEM=<\x.AVG(x)>] -> 'mean' | 'average' | 'avg'
ADJ[TYPE=max, SEM=<\x.MAX(x)>] -> 'maximum' | 'max'
ADJ[TYPE=min, SEM=<\x.MIN(x)>] -> 'minimum' | 'min'
ADJ[TYPE=sum, SEM=<\x.SUM(x)>] -> 'sum of' | 'total of' | 'total'
ADJ[TYPE=count, SEM=<\x.COUNT(x)>] -> 'total number of' | 'count of'
ADJ[TYPE=count, SEM=<\x.DISTINCT(x)>] -> 'unique' | 'distinct'
NN[TYPE=table, NUM=pl, SEM=<\x.timesheet(x)>] -> 'timesheet records' | 'timesheet' | 'timesheet table'
NN[TYPE=wherecolumn, NUM=sg] -> 'date'
NN[TYPE=wherecolumn, NUM=sg, SEM=<\x.company(company_name_column,x)>] -> 'company name' | 'company'
NN[TYPE=wherecolumn, NUM=sg, SEM=<\x.employeeid(employee_id_column,x)>] -> 'employee id'
NN[TYPE=wherecolumn, NUM=pl, SEM=<\x.workhours(work_hour_column,x)>] -> 'work hours'
NN[TYPE=wherecolumn, NUM=sg, SEM=<\x.employeename(employee_name_column,x)>] -> 'employee' | 'employee name'
NN[TYPE=wherecolumn, NUM=sg, SEM=<\x.project(project_name_column,x)>] -> 'project name' | 'project'
NN[TYPE=selectcolumn, NUM=sg, SEM=<date_column>] -> 'date'
NN[TYPE=selectcolumn, NUM=sg, SEM=<company_name_column>] -> 'company name' | 'company'
NN[TYPE=selectcolumn, NUM=sg, SEM=<employee_id_column>] -> 'employee id'
NN[TYPE=selectcolumn, NUM=pl, SEM=<work_hour_column>] -> 'work hours'
NN[TYPE=selectcolumn, NUM=sg, SEM=<employee_name_column>] -> 'employee' | 'employee name'
NN[TYPE=selectcolumn, NUM=sg, SEM=<project_name_column>] -> 'project name' | 'project'
NN[NUM=pl, TYPE=records] -> 'records' | 'entries' | 'rows'
V[TYPE=selectsomewhere, TNS=PRES, SEM=<\r P q.all x.(P(x) & r -> q)>] -> 'show' | 'return' | 'show me' | 'tell me' | 'find'
V[TYPE=selectsomenowhere, TNS=PRES, SEM=<\r P.all x.(P(x) & r)>] -> 'show' | 'return' | 'show me' | 'tell me' | 'find'
V[TYPE=selectstar, TNS=PRES, SEM=<\P q.all x.(P(x) -> q)>] -> 'show' | 'return' | 'show me' | 'tell me' | 'find'
V[TYPE=simple, TNS=PRES, SEM=<\P.all x.P(x)>] -> 'show' | 'return' | 'show me' | 'tell me' | 'find'
V[TYPE=orderbydefault, TNS=SIMPLEPAST, SEM=<\x.orderby(ASC,x)>] -> 'ordered by' | 'sorted by'
V[TYPE=orderby, TNS=SIMPLEPAST, SEM=<\x y.orderby(y,x)>] -> 'ordered by' | 'sorted by'
#
# Will be dynamically generated (Uncomment this while running testing.py)
#
#PropN[TYPE=variable, SEM=<\P.P('andy')>] -> 'andy'
#PropN[TYPE=variable, SEM=<\P.P('soli')>] -> 'soli'
#PropN[TYPE=variable, SEM=<\P.P('ws174')>] -> 'ws174'
#PropN[TYPE=date, SEM=<\P.P('d1')>] -> 'd1'
#PropN[TYPE=date, SEM=<\P.P('d2')>] -> 'd2'
#PropN[TYPE=number, SEM=<\P.P('10')>] -> '10'
#
#GERUNDV[TYPE=orderby, SEM=<\x.orderby(ASC,x)>] -> 'increasing' 'order' 'of'
#GERUNDV[TYPE=orderby, SEM=<\x.orderby(DESC,x)>] -> 'decreasing' 'order' 'of'
#
#ADV[TYPE=groupby, SEM=<\x.groupby(x)>] -> 'each' | 'every' | 'each' 'and' 'every'
#
#ADJ[TYPE=mean, SEM=<\x.AVG(x)>] -> 'mean' | 'average' | 'avg'
#ADJ[TYPE=max, SEM=<\x.MAX(x)>] -> 'maximum' | 'max'
#ADJ[TYPE=min, SEM=<\x.MIN(x)>] -> 'minimum' | 'min'
#ADJ[TYPE=sum, SEM=<\x.SUM(x)>] -> 'sum' 'of' | 'total' 'of' | 'total'
#ADJ[TYPE=count, SEM=<\x.COUNT(x)>] -> 'total' 'number' 'of' | 'count' 'of'
#ADJ[TYPE=count, SEM=<\x.DISTINCT(x)>] -> 'unique' | 'distinct'
#
#NN[TYPE=table, NUM=pl, SEM=<\x.timesheet(x)>] -> 'timesheet' 'records' | 'timesheet' | 'timesheet' 'table'
#NN[TYPE=wherecolumn, NUM=sg] -> 'date'
#NN[TYPE=wherecolumn, NUM=sg, SEM=<\x.company(company_name_column,x)>] -> 'company' 'name' | 'company'
#NN[TYPE=wherecolumn, NUM=sg, SEM=<\x.employeeid(employee_id_column,x)>] -> 'employee' 'id'
#NN[TYPE=wherecolumn, NUM=pl, SEM=<\x.workhours(work_hour_column,x)>] -> 'work' 'hours'
#NN[TYPE=wherecolumn, NUM=sg, SEM=<\x.employeename(employee_name_column,x)>] -> 'employee' | 'employee' 'name'
#NN[TYPE=wherecolumn, NUM=sg, SEM=<\x.project(project_name_column,x)>] -> 'project' 'name' | 'project'
#
#NN[TYPE=selectcolumn, NUM=sg, SEM=<date_column>] -> 'date'
#NN[TYPE=selectcolumn, NUM=sg, SEM=<company_name_column>] -> 'company' 'name' | 'company'
#NN[TYPE=selectcolumn, NUM=sg, SEM=<employee_id_column>] -> 'employee' 'id'
#NN[TYPE=selectcolumn, NUM=pl, SEM=<work_hour_column>] -> 'work' 'hours'
#NN[TYPE=selectcolumn, NUM=sg, SEM=<employee_name_column>] -> 'employee' | 'employee' 'name'
#NN[TYPE=selectcolumn, NUM=sg, SEM=<project_name_column>] -> 'project' 'name' | 'project'
#
#NN[NUM=pl, TYPE=records] -> 'records' | 'entries' | 'rows'
#
#V[TYPE=selectsomewhere, TNS=PRES, SEM=<\r P q.all x.(P(x) & r -> q)>] -> 'show' | 'return' | 'show' 'me' | 'tell' 'me' | 'find'
#V[TYPE=selectsomenowhere, TNS=PRES, SEM=<\r P.all x.(P(x) & r)>] -> 'show' | 'return' | 'show' 'me' | 'tell' 'me' | 'find'
#V[TYPE=selectstar, TNS=PRES, SEM=<\P q.all x.(P(x) -> q)>] -> 'show' | 'return' | 'show' 'me' | 'tell' 'me' | 'find'
#V[TYPE=simple, TNS=PRES, SEM=<\P.all x.P(x)>] -> 'show' | 'return' | 'show' 'me' | 'tell' 'me' | 'find'