~drizzle-trunk/drizzle/development

1 by brian
clean slate
1
/******************************************************
2
SQL parser: input file for the GNU Bison parser generator
3
4
(c) 1997 Innobase Oy
5
6
Created 12/14/1997 Heikki Tuuri
7
Published under the GPL version 2
8
9
Look from pars0lex.l for instructions how to generate the C files for
10
the InnoDB parser.
11
*******************************************************/
12
13
%{
14
/* The value of the semantic attribute is a pointer to a query tree node
15
que_node_t */
16
17
#include "univ.i"
18
#include <math.h>				/* Can't be before univ.i */
19
#include "pars0pars.h"
20
#include "mem0mem.h"
21
#include "que0types.h"
22
#include "que0que.h"
23
#include "row0sel.h"
24
25
#define YYSTYPE que_node_t*
26
27
/* #define __STDC__ */
28
29
int
30
yylex(void);
31
%}
32
33
%token PARS_INT_LIT
34
%token PARS_FLOAT_LIT
35
%token PARS_STR_LIT
36
%token PARS_FIXBINARY_LIT
37
%token PARS_BLOB_LIT
38
%token PARS_NULL_LIT
39
%token PARS_ID_TOKEN
40
%token PARS_AND_TOKEN
41
%token PARS_OR_TOKEN
42
%token PARS_NOT_TOKEN
43
%token PARS_GE_TOKEN
44
%token PARS_LE_TOKEN
45
%token PARS_NE_TOKEN
46
%token PARS_PROCEDURE_TOKEN
47
%token PARS_IN_TOKEN
48
%token PARS_OUT_TOKEN
49
%token PARS_BINARY_TOKEN
50
%token PARS_BLOB_TOKEN
51
%token PARS_INT_TOKEN
52
%token PARS_INTEGER_TOKEN
53
%token PARS_FLOAT_TOKEN
54
%token PARS_CHAR_TOKEN
55
%token PARS_IS_TOKEN
56
%token PARS_BEGIN_TOKEN
57
%token PARS_END_TOKEN
58
%token PARS_IF_TOKEN
59
%token PARS_THEN_TOKEN
60
%token PARS_ELSE_TOKEN
61
%token PARS_ELSIF_TOKEN
62
%token PARS_LOOP_TOKEN
63
%token PARS_WHILE_TOKEN
64
%token PARS_RETURN_TOKEN
65
%token PARS_SELECT_TOKEN
66
%token PARS_SUM_TOKEN
67
%token PARS_COUNT_TOKEN
68
%token PARS_DISTINCT_TOKEN
69
%token PARS_FROM_TOKEN
70
%token PARS_WHERE_TOKEN
71
%token PARS_FOR_TOKEN
72
%token PARS_DDOT_TOKEN
73
%token PARS_READ_TOKEN
74
%token PARS_ORDER_TOKEN
75
%token PARS_BY_TOKEN
76
%token PARS_ASC_TOKEN
77
%token PARS_DESC_TOKEN
78
%token PARS_INSERT_TOKEN
79
%token PARS_INTO_TOKEN
80
%token PARS_VALUES_TOKEN
81
%token PARS_UPDATE_TOKEN
82
%token PARS_SET_TOKEN
83
%token PARS_DELETE_TOKEN
84
%token PARS_CURRENT_TOKEN
85
%token PARS_OF_TOKEN
86
%token PARS_CREATE_TOKEN
87
%token PARS_TABLE_TOKEN
88
%token PARS_INDEX_TOKEN
89
%token PARS_UNIQUE_TOKEN
90
%token PARS_CLUSTERED_TOKEN
91
%token PARS_DOES_NOT_FIT_IN_MEM_TOKEN
92
%token PARS_ON_TOKEN
93
%token PARS_ASSIGN_TOKEN
94
%token PARS_DECLARE_TOKEN
95
%token PARS_CURSOR_TOKEN
96
%token PARS_SQL_TOKEN
97
%token PARS_OPEN_TOKEN
98
%token PARS_FETCH_TOKEN
99
%token PARS_CLOSE_TOKEN
100
%token PARS_NOTFOUND_TOKEN
101
%token PARS_TO_CHAR_TOKEN
102
%token PARS_TO_NUMBER_TOKEN
103
%token PARS_TO_BINARY_TOKEN
104
%token PARS_BINARY_TO_NUMBER_TOKEN
105
%token PARS_SUBSTR_TOKEN
106
%token PARS_REPLSTR_TOKEN
107
%token PARS_CONCAT_TOKEN
108
%token PARS_INSTR_TOKEN
109
%token PARS_LENGTH_TOKEN
110
%token PARS_SYSDATE_TOKEN
111
%token PARS_PRINTF_TOKEN
112
%token PARS_ASSERT_TOKEN
113
%token PARS_RND_TOKEN
114
%token PARS_RND_STR_TOKEN
115
%token PARS_ROW_PRINTF_TOKEN
116
%token PARS_COMMIT_TOKEN
117
%token PARS_ROLLBACK_TOKEN
118
%token PARS_WORK_TOKEN
119
%token PARS_UNSIGNED_TOKEN
120
%token PARS_EXIT_TOKEN
121
%token PARS_FUNCTION_TOKEN
122
%token PARS_LOCK_TOKEN
123
%token PARS_SHARE_TOKEN
124
%token PARS_MODE_TOKEN
125
126
%left PARS_AND_TOKEN PARS_OR_TOKEN
127
%left PARS_NOT_TOKEN
128
%left '=' '<' '>' PARS_GE_TOKEN PARS_LE_TOKEN
129
%left '-' '+'
130
%left '*' '/'
131
%left NEG     /* negation--unary minus */
132
%left '%'
133
134
/* Grammar follows */
135
%%
136
137
top_statement:
138
        procedure_definition ';'
139
140
statement:
141
	stored_procedure_call
142
	| predefined_procedure_call ';'
143
	| while_statement ';'
144
	| for_statement ';'
145
	| exit_statement ';'
146
	| if_statement ';'
147
	| return_statement ';'
148
	| assignment_statement ';'
149
	| select_statement ';'
150
	| insert_statement ';'
151
	| row_printf_statement ';'
152
	| delete_statement_searched ';'
153
	| delete_statement_positioned ';'
154
	| update_statement_searched ';'
155
	| update_statement_positioned ';'
156
	| open_cursor_statement ';'
157
	| fetch_statement ';'
158
	| close_cursor_statement ';'
159
	| commit_statement ';'
160
	| rollback_statement ';'
161
	| create_table ';'
162
	| create_index ';'
163
;
164
165
statement_list:
166
	statement		{ $$ = que_node_list_add_last(NULL, $1); }
167
	| statement_list statement
168
				{ $$ = que_node_list_add_last($1, $2); }
169
;
170
171
exp:
172
	PARS_ID_TOKEN		{ $$ = $1;}
173
	| function_name '(' exp_list ')'
174
				{ $$ = pars_func($1, $3); }
175
	| PARS_INT_LIT		{ $$ = $1;}
176
	| PARS_FLOAT_LIT	{ $$ = $1;}
177
	| PARS_STR_LIT		{ $$ = $1;}
178
	| PARS_FIXBINARY_LIT	{ $$ = $1;}
179
	| PARS_BLOB_LIT		{ $$ = $1;}
180
	| PARS_NULL_LIT		{ $$ = $1;}
181
	| PARS_SQL_TOKEN	{ $$ = $1;}
182
	| exp '+' exp        	{ $$ = pars_op('+', $1, $3); }
183
	| exp '-' exp        	{ $$ = pars_op('-', $1, $3); }
184
	| exp '*' exp        	{ $$ = pars_op('*', $1, $3); }
185
	| exp '/' exp        	{ $$ = pars_op('/', $1, $3); }
186
	| '-' exp %prec NEG 	{ $$ = pars_op('-', $2, NULL); }
187
	| '(' exp ')'        	{ $$ = $2; }
188
	| exp '=' exp		{ $$ = pars_op('=', $1, $3); }
189
	| exp '<' exp		{ $$ = pars_op('<', $1, $3); }
190
	| exp '>' exp		{ $$ = pars_op('>', $1, $3); }
191
	| exp PARS_GE_TOKEN exp	{ $$ = pars_op(PARS_GE_TOKEN, $1, $3); }
192
	| exp PARS_LE_TOKEN exp	{ $$ = pars_op(PARS_LE_TOKEN, $1, $3); }
193
	| exp PARS_NE_TOKEN exp	{ $$ = pars_op(PARS_NE_TOKEN, $1, $3); }
194
	| exp PARS_AND_TOKEN exp{ $$ = pars_op(PARS_AND_TOKEN, $1, $3); }
195
	| exp PARS_OR_TOKEN exp	{ $$ = pars_op(PARS_OR_TOKEN, $1, $3); }
196
	| PARS_NOT_TOKEN exp	{ $$ = pars_op(PARS_NOT_TOKEN, $2, NULL); }
197
	| PARS_ID_TOKEN '%' PARS_NOTFOUND_TOKEN
198
				{ $$ = pars_op(PARS_NOTFOUND_TOKEN, $1, NULL); }
199
	| PARS_SQL_TOKEN '%' PARS_NOTFOUND_TOKEN
200
				{ $$ = pars_op(PARS_NOTFOUND_TOKEN, $1, NULL); }
201
;
202
203
function_name:
204
	PARS_TO_CHAR_TOKEN	{ $$ = &pars_to_char_token; }
205
	| PARS_TO_NUMBER_TOKEN	{ $$ = &pars_to_number_token; }
206
	| PARS_TO_BINARY_TOKEN	{ $$ = &pars_to_binary_token; }
207
	| PARS_BINARY_TO_NUMBER_TOKEN
208
				{ $$ = &pars_binary_to_number_token; }
209
	| PARS_SUBSTR_TOKEN	{ $$ = &pars_substr_token; }
210
	| PARS_CONCAT_TOKEN	{ $$ = &pars_concat_token; }
211
	| PARS_INSTR_TOKEN	{ $$ = &pars_instr_token; }
212
	| PARS_LENGTH_TOKEN	{ $$ = &pars_length_token; }
213
	| PARS_SYSDATE_TOKEN	{ $$ = &pars_sysdate_token; }
214
	| PARS_RND_TOKEN	{ $$ = &pars_rnd_token; }
215
	| PARS_RND_STR_TOKEN	{ $$ = &pars_rnd_str_token; }
216
;
217
218
question_mark_list:
219
	/* Nothing */
220
	| '?'
221
	| question_mark_list ',' '?'
222
;
223
224
stored_procedure_call:
225
	'{' PARS_ID_TOKEN '(' question_mark_list ')' '}'
226
				{ $$ = pars_stored_procedure_call($2); }
227
;
228
229
predefined_procedure_call:
230
	predefined_procedure_name '(' exp_list ')'
231
				{ $$ = pars_procedure_call($1, $3); }
232
;
233
234
predefined_procedure_name:
235
	PARS_REPLSTR_TOKEN	{ $$ = &pars_replstr_token; }
236
	| PARS_PRINTF_TOKEN	{ $$ = &pars_printf_token; }
237
	| PARS_ASSERT_TOKEN	{ $$ = &pars_assert_token; }
238
;
239
240
user_function_call:
241
	PARS_ID_TOKEN '(' ')'	{ $$ = $1; }
242
;
243
244
table_list:
245
	PARS_ID_TOKEN		{ $$ = que_node_list_add_last(NULL, $1); }
246
	| table_list ',' PARS_ID_TOKEN
247
				{ $$ = que_node_list_add_last($1, $3); }
248
;
249
250
variable_list:
251
	/* Nothing */		{ $$ = NULL; }
252
	| PARS_ID_TOKEN		{ $$ = que_node_list_add_last(NULL, $1); }
253
	| variable_list ',' PARS_ID_TOKEN
254
				{ $$ = que_node_list_add_last($1, $3); }
255
;
256
257
exp_list:
258
	/* Nothing */		{ $$ = NULL; }
259
	| exp			{ $$ = que_node_list_add_last(NULL, $1);}
260
	| exp_list ',' exp	{ $$ = que_node_list_add_last($1, $3); }
261
;
262
263
select_item:
264
	exp			{ $$ = $1; }
265
	| PARS_COUNT_TOKEN '(' '*' ')'
266
				{ $$ = pars_func(&pars_count_token,
267
				          que_node_list_add_last(NULL,
268
					    sym_tab_add_int_lit(
269
						pars_sym_tab_global, 1))); }
270
	| PARS_COUNT_TOKEN '(' PARS_DISTINCT_TOKEN PARS_ID_TOKEN ')'
271
				{ $$ = pars_func(&pars_count_token,
272
					    que_node_list_add_last(NULL,
273
						pars_func(&pars_distinct_token,
274
						     que_node_list_add_last(
275
								NULL, $4)))); }
276
	| PARS_SUM_TOKEN '(' exp ')'
277
				{ $$ = pars_func(&pars_sum_token,
278
						que_node_list_add_last(NULL,
279
									$3)); }
280
;
281
282
select_item_list:
283
	/* Nothing */		{ $$ = NULL; }
284
	| select_item		{ $$ = que_node_list_add_last(NULL, $1); }
285
	| select_item_list ',' select_item
286
				{ $$ = que_node_list_add_last($1, $3); }
287
;
288
289
select_list:
290
	'*'			{ $$ = pars_select_list(&pars_star_denoter,
291
								NULL); }
292
	| select_item_list PARS_INTO_TOKEN variable_list
293
				{ $$ = pars_select_list($1, $3); }
294
	| select_item_list	{ $$ = pars_select_list($1, NULL); }
295
;
296
297
search_condition:
298
	/* Nothing */		{ $$ = NULL; }
299
	| PARS_WHERE_TOKEN exp	{ $$ = $2; }
300
;
301
302
for_update_clause:
303
	/* Nothing */		{ $$ = NULL; }
304
	| PARS_FOR_TOKEN PARS_UPDATE_TOKEN
305
				{ $$ = &pars_update_token; }
306
;
307
308
lock_shared_clause:
309
	/* Nothing */		{ $$ = NULL; }
310
	| PARS_LOCK_TOKEN PARS_IN_TOKEN PARS_SHARE_TOKEN PARS_MODE_TOKEN
311
				{ $$ = &pars_share_token; }
312
;
313
314
order_direction:
315
	/* Nothing */		{ $$ = &pars_asc_token; }
316
	| PARS_ASC_TOKEN	{ $$ = &pars_asc_token; }
317
	| PARS_DESC_TOKEN	{ $$ = &pars_desc_token; }
318
;
319
320
order_by_clause:
321
	/* Nothing */		{ $$ = NULL; }
322
	| PARS_ORDER_TOKEN PARS_BY_TOKEN PARS_ID_TOKEN order_direction
323
				{ $$ = pars_order_by($3, $4); }
324
;
325
326
select_statement:
327
	PARS_SELECT_TOKEN select_list
328
	PARS_FROM_TOKEN table_list
329
	search_condition
330
	for_update_clause
331
	lock_shared_clause
332
	order_by_clause		{ $$ = pars_select_statement($2, $4, $5,
333
								$6, $7, $8); }
334
;
335
336
insert_statement_start:
337
	PARS_INSERT_TOKEN PARS_INTO_TOKEN
338
	PARS_ID_TOKEN		{ $$ = $3; }
339
;
340
341
insert_statement:
342
	insert_statement_start PARS_VALUES_TOKEN '(' exp_list ')'
343
				{ $$ = pars_insert_statement($1, $4, NULL); }
344
	| insert_statement_start select_statement
345
				{ $$ = pars_insert_statement($1, NULL, $2); }
346
;
347
348
column_assignment:
349
	PARS_ID_TOKEN '=' exp	{ $$ = pars_column_assignment($1, $3); }
350
;
351
352
column_assignment_list:
353
	column_assignment	{ $$ = que_node_list_add_last(NULL, $1); }
354
	| column_assignment_list ',' column_assignment
355
				{ $$ = que_node_list_add_last($1, $3); }
356
;
357
358
cursor_positioned:
359
	PARS_WHERE_TOKEN
360
	PARS_CURRENT_TOKEN PARS_OF_TOKEN
361
	PARS_ID_TOKEN 		{ $$ = $4; }
362
;
363
364
update_statement_start:
365
	PARS_UPDATE_TOKEN PARS_ID_TOKEN
366
	PARS_SET_TOKEN
367
	column_assignment_list	{ $$ = pars_update_statement_start(FALSE,
368
								$2, $4); }
369
;
370
371
update_statement_searched:
372
	update_statement_start
373
	search_condition	{ $$ = pars_update_statement($1, NULL, $2); }
374
;
375
376
update_statement_positioned:
377
	update_statement_start
378
	cursor_positioned	{ $$ = pars_update_statement($1, $2, NULL); }
379
;
380
381
delete_statement_start:
382
	PARS_DELETE_TOKEN PARS_FROM_TOKEN
383
	PARS_ID_TOKEN		{ $$ = pars_update_statement_start(TRUE,
384
								$3, NULL); }
385
;
386
387
delete_statement_searched:
388
	delete_statement_start
389
	search_condition	{ $$ = pars_update_statement($1, NULL, $2); }
390
;
391
392
delete_statement_positioned:
393
	delete_statement_start
394
	cursor_positioned	{ $$ = pars_update_statement($1, $2, NULL); }
395
;
396
397
row_printf_statement:
398
	PARS_ROW_PRINTF_TOKEN select_statement
399
				{ $$ = pars_row_printf_statement($2); }
400
;
401
402
assignment_statement:
403
	PARS_ID_TOKEN PARS_ASSIGN_TOKEN exp
404
				{ $$ = pars_assignment_statement($1, $3); }
405
;
406
407
elsif_element:
408
	PARS_ELSIF_TOKEN
409
	exp PARS_THEN_TOKEN statement_list
410
				{ $$ = pars_elsif_element($2, $4); }
411
;
412
413
elsif_list:
414
	elsif_element		{ $$ = que_node_list_add_last(NULL, $1); }
415
	| elsif_list elsif_element
416
				{ $$ = que_node_list_add_last($1, $2); }
417
;
418
419
else_part:
420
	/* Nothing */		{ $$ = NULL; }
421
	| PARS_ELSE_TOKEN statement_list
422
				{ $$ = $2; }
423
	| elsif_list		{ $$ = $1; }
424
;
425
426
if_statement:
427
	PARS_IF_TOKEN exp PARS_THEN_TOKEN statement_list
428
	else_part
429
	PARS_END_TOKEN PARS_IF_TOKEN
430
				{ $$ = pars_if_statement($2, $4, $5); }
431
;
432
433
while_statement:
434
	PARS_WHILE_TOKEN exp PARS_LOOP_TOKEN statement_list
435
	PARS_END_TOKEN PARS_LOOP_TOKEN
436
				{ $$ = pars_while_statement($2, $4); }
437
;
438
439
for_statement:
440
	PARS_FOR_TOKEN PARS_ID_TOKEN PARS_IN_TOKEN
441
	exp PARS_DDOT_TOKEN exp
442
	PARS_LOOP_TOKEN statement_list
443
	PARS_END_TOKEN PARS_LOOP_TOKEN
444
				{ $$ = pars_for_statement($2, $4, $6, $8); }
445
;
446
447
exit_statement:
448
	PARS_EXIT_TOKEN		{ $$ = pars_exit_statement(); }
449
;
450
451
return_statement:
452
	PARS_RETURN_TOKEN	{ $$ = pars_return_statement(); }
453
;
454
455
open_cursor_statement:
456
	PARS_OPEN_TOKEN PARS_ID_TOKEN
457
				{ $$ = pars_open_statement(
458
						ROW_SEL_OPEN_CURSOR, $2); }
459
;
460
461
close_cursor_statement:
462
	PARS_CLOSE_TOKEN PARS_ID_TOKEN
463
				{ $$ = pars_open_statement(
464
						ROW_SEL_CLOSE_CURSOR, $2); }
465
;
466
467
fetch_statement:
468
	PARS_FETCH_TOKEN PARS_ID_TOKEN PARS_INTO_TOKEN variable_list
469
				{ $$ = pars_fetch_statement($2, $4, NULL); }
470
	| PARS_FETCH_TOKEN PARS_ID_TOKEN PARS_INTO_TOKEN user_function_call
471
				{ $$ = pars_fetch_statement($2, NULL, $4); }
472
;
473
474
column_def:
475
	PARS_ID_TOKEN type_name	opt_column_len opt_unsigned opt_not_null
476
				{ $$ = pars_column_def($1, $2, $3, $4, $5); }
477
;
478
479
column_def_list:
480
	column_def		{ $$ = que_node_list_add_last(NULL, $1); }
481
	| column_def_list ',' column_def
482
				{ $$ = que_node_list_add_last($1, $3); }
483
;
484
485
opt_column_len:
486
	/* Nothing */		{ $$ = NULL; }
487
	| '(' PARS_INT_LIT ')'
488
				{ $$ = $2; }
489
;
490
491
opt_unsigned:
492
	/* Nothing */		{ $$ = NULL; }
493
	| PARS_UNSIGNED_TOKEN
494
				{ $$ = &pars_int_token;
495
					/* pass any non-NULL pointer */ }
496
;
497
498
opt_not_null:
499
	/* Nothing */		{ $$ = NULL; }
500
	| PARS_NOT_TOKEN PARS_NULL_LIT
501
				{ $$ = &pars_int_token;
502
					/* pass any non-NULL pointer */ }
503
;
504
505
not_fit_in_memory:
506
	/* Nothing */		{ $$ = NULL; }
507
	| PARS_DOES_NOT_FIT_IN_MEM_TOKEN
508
				{ $$ = &pars_int_token;
509
					/* pass any non-NULL pointer */ }
510
;
511
512
create_table:
513
	PARS_CREATE_TOKEN PARS_TABLE_TOKEN
514
	PARS_ID_TOKEN '(' column_def_list ')'
515
	not_fit_in_memory	{ $$ = pars_create_table($3, $5, $7); }
516
;
517
518
column_list:
519
	PARS_ID_TOKEN		{ $$ = que_node_list_add_last(NULL, $1); }
520
	| column_list ',' PARS_ID_TOKEN
521
				{ $$ = que_node_list_add_last($1, $3); }
522
;
523
524
unique_def:
525
	/* Nothing */		{ $$ = NULL; }
526
	| PARS_UNIQUE_TOKEN	{ $$ = &pars_unique_token; }
527
;
528
529
clustered_def:
530
	/* Nothing */		{ $$ = NULL; }
531
	| PARS_CLUSTERED_TOKEN	{ $$ = &pars_clustered_token; }
532
;
533
534
create_index:
535
	PARS_CREATE_TOKEN unique_def
536
	clustered_def
537
	PARS_INDEX_TOKEN
538
	PARS_ID_TOKEN PARS_ON_TOKEN PARS_ID_TOKEN
539
	'(' column_list ')'	{ $$ = pars_create_index($2, $3, $5, $7, $9); }
540
;
541
542
commit_statement:
543
	PARS_COMMIT_TOKEN PARS_WORK_TOKEN
544
				{ $$ = pars_commit_statement(); }
545
;
546
547
rollback_statement:
548
	PARS_ROLLBACK_TOKEN PARS_WORK_TOKEN
549
				{ $$ = pars_rollback_statement(); }
550
;
551
552
type_name:
553
	PARS_INT_TOKEN		{ $$ = &pars_int_token; }
554
	| PARS_INTEGER_TOKEN	{ $$ = &pars_int_token; }
555
	| PARS_CHAR_TOKEN	{ $$ = &pars_char_token; }
556
	| PARS_BINARY_TOKEN	{ $$ = &pars_binary_token; }
557
	| PARS_BLOB_TOKEN	{ $$ = &pars_blob_token; }
558
;
559
560
parameter_declaration:
561
	PARS_ID_TOKEN PARS_IN_TOKEN type_name
562
				{ $$ = pars_parameter_declaration($1,
563
							PARS_INPUT, $3); }
564
	| PARS_ID_TOKEN PARS_OUT_TOKEN type_name
565
				{ $$ = pars_parameter_declaration($1,
566
							PARS_OUTPUT, $3); }
567
;
568
569
parameter_declaration_list:
570
	/* Nothing */		{ $$ = NULL; }
571
	| parameter_declaration	{ $$ = que_node_list_add_last(NULL, $1); }
572
	| parameter_declaration_list ',' parameter_declaration
573
				{ $$ = que_node_list_add_last($1, $3); }
574
;
575
576
variable_declaration:
577
	PARS_ID_TOKEN type_name ';'
578
				{ $$ = pars_variable_declaration($1, $2); }
579
;
580
581
variable_declaration_list:
582
	/* Nothing */
583
	| variable_declaration
584
	| variable_declaration_list variable_declaration
585
;
586
587
cursor_declaration:
588
	PARS_DECLARE_TOKEN PARS_CURSOR_TOKEN PARS_ID_TOKEN
589
	PARS_IS_TOKEN select_statement ';'
590
				{ $$ = pars_cursor_declaration($3, $5); }
591
;
592
593
function_declaration:
594
	PARS_DECLARE_TOKEN PARS_FUNCTION_TOKEN PARS_ID_TOKEN ';'
595
				{ $$ = pars_function_declaration($3); }
596
;
597
598
declaration:
599
	cursor_declaration
600
	| function_declaration
601
;
602
603
declaration_list:
604
	/* Nothing */
605
	| declaration
606
	| declaration_list declaration
607
;
608
609
procedure_definition:
610
	PARS_PROCEDURE_TOKEN PARS_ID_TOKEN '(' parameter_declaration_list ')'
611
	PARS_IS_TOKEN
612
	variable_declaration_list
613
	declaration_list
614
	PARS_BEGIN_TOKEN
615
	statement_list
616
	PARS_END_TOKEN		{ $$ = pars_procedure_definition($2, $4,
617
								$10); }
618
;
619
620
%%