This repository has been archived by the owner on Jun 9, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathKuneiformParser.g4
307 lines (252 loc) · 4.94 KB
/
KuneiformParser.g4
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
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
/*
* A ANTLR4 grammar for Kuneiform.
* Developed by the Kuneiform team.
*/
parser grammar KuneiformParser;
options {
tokenVocab=KuneiformLexer;
}
source_unit:// databaseSpec then table or action declarations
database_directive SCOL
(extension_directive)*
(table_decl | action_decl | init_decl)*
EOF
;
database_directive: DATABASE_ database_name;
extension_directive:
USE_ extension_name
(L_BRACE ext_config_list R_BRACE)?
AS_ extension_name
SCOL
;
ext_config_list:
ext_config (COMMA ext_config)*
;
ext_config:
ext_config_name COL ext_config_value
;
annotation_decl:
annotation_target_name
L_PAREN annotation_attr_list R_PAREN
;
annotation_attr_list:
annotation_attr (COMMA annotation_attr)*
;
annotation_attr:
annotation_attr_name ASSIGN annotation_attr_value
;
table_decl:
TABLE_ table_name
L_BRACE
column_def_list
(COMMA (index_def | foreign_key_def))*
COMMA? // optional comma
R_BRACE
;
column_def:
column_name column_type column_constraint*
;
column_def_list:
column_def (COMMA column_def)*
;
column_type:
INT_
| TEXT_
| BLOB_
;
column_constraint:
PRIMARY_
| NOT_NULL_
| UNIQUE_
| DEFAULT_ L_PAREN literal_value R_PAREN
| MIN_ L_PAREN number_value R_PAREN
| MAX_ L_PAREN number_value R_PAREN
| MIN_LEN_ L_PAREN number_value R_PAREN
| MAX_LEN_ L_PAREN number_value R_PAREN
;
literal_value:
STRING_LITERAL
| UNSIGNED_NUMBER_LITERAL
;
number_value:
UNSIGNED_NUMBER_LITERAL
;
index_def:
index_name
(UNIQUE_ | INDEX_ | PRIMARY_)
L_PAREN column_name_list R_PAREN
;
foreign_key_action:
(ACTION_ON_UPDATE_ | ACTION_ON_DELETE_)
ACTION_DO_?
(ACTION_DO_NO_ACTION_
| ACTION_DO_RESTRICT_
| ACTION_DO_SET_NULL_
| ACTION_DO_SET_DEFAULT_
| ACTION_DO_CASCADE_)
;
foreign_key_def:
(FOREIGN_KEY_ | FOREIGN_KEY_ABBR_)
L_PAREN column_name_list R_PAREN
(REFERENCES_ | REFERENCES_ABBR_)
table_name
L_PAREN column_name_list R_PAREN
foreign_key_action*
;
action_visibility:
PUBLIC_
| PRIVATE_
;
action_mutability:
VIEW_
;
action_auxiliary:
OWNER_
;
action_attr_list:
(action_visibility | action_mutability | action_auxiliary)*
;
action_decl:
annotation_decl*
ACTION_ action_name
L_PAREN param_list R_PAREN
action_attr_list
L_BRACE
action_stmt_list
R_BRACE
;
param_list:
parameter? (COMMA parameter)*
;
parameter:
PARAM_OR_VAR
;
database_name:
IDENTIFIER
;
extension_name:
IDENTIFIER
;
ext_config_name:
IDENTIFIER
;
table_name:
IDENTIFIER
;
action_name:
IDENTIFIER
;
column_name:
IDENTIFIER
;
column_name_list:
column_name (COMMA column_name)*
;
index_name:
INDEX_NAME
;
annotation_target_name:
BLOCK_VAR_OR_ANNOTATION
;
annotation_attr_name:
IDENTIFIER
;
annotation_attr_value:
literal_value
;
ext_config_value:
literal_value
;
// parsed as action
init_decl:
INIT_
L_PAREN R_PAREN
L_BRACE
action_stmt_list
R_BRACE
;
action_stmt_list:
action_stmt+
;
action_stmt:
sql_stmt
| call_stmt
;
sql_stmt:
SQL_STMT SCOL
;
call_stmt:
(call_receivers ASSIGN)?
call_body SCOL
;
call_receivers:
variable (COMMA variable)*
;
call_body:
fn_name L_PAREN fn_arg_list R_PAREN
;
variable:
PARAM_OR_VAR
;
block_var:
BLOCK_VAR_OR_ANNOTATION
;
extension_call_name:
IDENTIFIER PERIOD IDENTIFIER
;
//external_action_name:
// IDENTIFIER PERIOD IDENTIFIER
//;
// function name
fn_name:
extension_call_name
| action_name
// | external_action_name
;
// (inside action) scalar function name
sfn_name:
IDENTIFIER
;
//fn_arg:
// literal_value
// | variable
// | block_var
//;
fn_arg_list:
// fn_arg? (COMMA fn_arg)*
fn_arg_expr? (COMMA fn_arg_expr)*
;
// NOTE: this will only be used inside fn_arg_list, his is based on sqlparser's expr.
// This is only meant to support the most basic expressions.
//
// binary operators precedence: highest to lowest:
// ||
// * / %
// << >> & |
// < <= > >=
// = == != <>
// AND
// OR
fn_arg_expr:
// primary expressions(don't fit in operator pattern), order is irrelevant
literal_value
| variable
| block_var
// order is relevant for below expressions
| L_PAREN elevate_expr=fn_arg_expr R_PAREN
| ( MINUS | PLUS | TILDE ) unary_expr=fn_arg_expr
// binary operators
| fn_arg_expr PIPE2 fn_arg_expr
| fn_arg_expr ( STAR | DIV | MOD ) fn_arg_expr
| fn_arg_expr ( PLUS | MINUS) fn_arg_expr
| fn_arg_expr ( LT2 | GT2 | AMP | PIPE ) fn_arg_expr
| fn_arg_expr ( LT | LT_EQ | GT | GT_EQ ) fn_arg_expr
| fn_arg_expr ( ASSIGN | EQ | SQL_NOT_EQ1 | SQL_NOT_EQ2 ) fn_arg_expr
// logical operators
| NOT_ unary_expr=fn_arg_expr
| fn_arg_expr AND_ fn_arg_expr
| fn_arg_expr OR_ fn_arg_expr
// scalar functions
| sfn_name L_PAREN ( (fn_arg_expr (COMMA fn_arg_expr)*) | STAR )? R_PAREN
;
// future expr, replace whole `call_body`?