piggly 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. data/README.markdown +84 -0
  2. data/Rakefile +19 -0
  3. data/bin/piggly +245 -0
  4. data/lib/piggly/compiler/cache.rb +151 -0
  5. data/lib/piggly/compiler/pretty.rb +67 -0
  6. data/lib/piggly/compiler/queue.rb +46 -0
  7. data/lib/piggly/compiler/tags.rb +244 -0
  8. data/lib/piggly/compiler/trace.rb +91 -0
  9. data/lib/piggly/compiler.rb +5 -0
  10. data/lib/piggly/config.rb +43 -0
  11. data/lib/piggly/filecache.rb +40 -0
  12. data/lib/piggly/installer.rb +95 -0
  13. data/lib/piggly/parser/grammar.tt +747 -0
  14. data/lib/piggly/parser/nodes.rb +319 -0
  15. data/lib/piggly/parser/parser.rb +11783 -0
  16. data/lib/piggly/parser/traversal.rb +48 -0
  17. data/lib/piggly/parser/treetop_ruby19_patch.rb +17 -0
  18. data/lib/piggly/parser.rb +67 -0
  19. data/lib/piggly/profile.rb +87 -0
  20. data/lib/piggly/reporter/html.rb +207 -0
  21. data/lib/piggly/reporter/piggly.css +187 -0
  22. data/lib/piggly/reporter/sortable.js +493 -0
  23. data/lib/piggly/reporter.rb +21 -0
  24. data/lib/piggly/task.rb +64 -0
  25. data/lib/piggly/util.rb +28 -0
  26. data/lib/piggly/version.rb +15 -0
  27. data/lib/piggly.rb +18 -0
  28. data/spec/compiler/cache_spec.rb +9 -0
  29. data/spec/compiler/pretty_spec.rb +9 -0
  30. data/spec/compiler/queue_spec.rb +3 -0
  31. data/spec/compiler/rewrite_spec.rb +3 -0
  32. data/spec/compiler/tags_spec.rb +285 -0
  33. data/spec/compiler/trace_spec.rb +173 -0
  34. data/spec/config_spec.rb +58 -0
  35. data/spec/filecache_spec.rb +70 -0
  36. data/spec/fixtures/snippets.sql +158 -0
  37. data/spec/grammar/expression_spec.rb +302 -0
  38. data/spec/grammar/statements/assignment_spec.rb +70 -0
  39. data/spec/grammar/statements/exception_spec.rb +52 -0
  40. data/spec/grammar/statements/if_spec.rb +178 -0
  41. data/spec/grammar/statements/loop_spec.rb +41 -0
  42. data/spec/grammar/statements/sql_spec.rb +71 -0
  43. data/spec/grammar/tokens/comment_spec.rb +58 -0
  44. data/spec/grammar/tokens/datatype_spec.rb +52 -0
  45. data/spec/grammar/tokens/identifier_spec.rb +58 -0
  46. data/spec/grammar/tokens/keyword_spec.rb +44 -0
  47. data/spec/grammar/tokens/label_spec.rb +40 -0
  48. data/spec/grammar/tokens/literal_spec.rb +30 -0
  49. data/spec/grammar/tokens/lval_spec.rb +50 -0
  50. data/spec/grammar/tokens/number_spec.rb +34 -0
  51. data/spec/grammar/tokens/sqlkeywords_spec.rb +45 -0
  52. data/spec/grammar/tokens/string_spec.rb +54 -0
  53. data/spec/grammar/tokens/whitespace_spec.rb +40 -0
  54. data/spec/parser_spec.rb +8 -0
  55. data/spec/profile_spec.rb +5 -0
  56. data/spec/reporter/html_spec.rb +0 -0
  57. data/spec/spec_helper.rb +61 -0
  58. data/spec/spec_suite.rb +5 -0
  59. metadata +121 -0
@@ -0,0 +1,747 @@
1
+ grammar Piggly
2
+ # include Keywords
3
+ # include Expressions
4
+ # include Statements
5
+ # include Tokens
6
+
7
+ rule start
8
+ procedure+
9
+ end
10
+
11
+ # elements[20] is procedure body
12
+ rule procedure
13
+ procedureHeader
14
+ name:tIdentifier tSpace?
15
+ parameters:parameterList tSpace
16
+ procedureReturn tSpace
17
+ return:tType tSpace kwAS tSpace
18
+ procedureBody
19
+ procedureFooter <Procedure>
20
+ end
21
+
22
+ rule procedureHeader
23
+ tSpace? 'create' tSpace 'or' tSpace 'replace' tSpace 'function' tSpace <TextNode>
24
+ end
25
+
26
+ rule procedureReturn
27
+ 'returns' tSpace 'setof'? <TextNode>
28
+ end
29
+
30
+ rule procedureBody
31
+ dollarQuoteMarker tSpace? body:block ';'? tSpace? dollarQuoteMarker
32
+ / "'" tSpace? body:block ';'? tSpace? "'"
33
+ end
34
+
35
+ rule procedureFooter
36
+ expressionUntilSemiColon ';' tSpace? <TextNode>
37
+ end
38
+
39
+ rule parameterList
40
+ '(' ( tSpace? name:tIdentifier tSpace type:tType tSpace? ',' )*
41
+ ( tSpace? name:tIdentifier tSpace type:tType )? tSpace? ')'
42
+ end
43
+
44
+ rule statement
45
+ inner:( block ';'
46
+ / stmtAssignment
47
+ / stmtIf
48
+ / stmtCase
49
+ / stmtLoop
50
+ / stmtWhileLoop
51
+ / stmtForLoop
52
+ / stmtExit
53
+ / stmtContinue
54
+ / stmtReturn
55
+ / stmtRaise
56
+ / stmtExecSql
57
+ / stmtNull
58
+ / stmtPerform
59
+ / stmtDynamicExecute
60
+ / stmtGetDiag
61
+ / stmtOpen
62
+ / stmtFetch
63
+ / stmtMove
64
+ / stmtClose ) tail:tSpace? <Statement>
65
+ end
66
+
67
+ rule block
68
+ label_open:tLabel tSpace
69
+ blockDeclarations:stmtDeclare*
70
+ kwBEGIN
71
+ bodySpace:tSpace
72
+ bodyStub:stubNode
73
+ body:statement*
74
+ blockExceptions?
75
+ kwEND
76
+ ( tSpace label_close:tLabel )?
77
+ tSpace? <Block>
78
+ /
79
+ blockDeclarations:stmtDeclare*
80
+ kwBEGIN
81
+ bodySpace:tSpace
82
+ bodyStub:stubNode
83
+ body:statement*
84
+ blockExceptions?
85
+ kwEND
86
+ tSpace? <Block>
87
+ end
88
+
89
+ rule stmtAssignment
90
+ lval:lValue tSpace? kwASSIGN ws? rval:expressionUntilSemiColon ';' <Assignment>
91
+ end
92
+
93
+ rule stmtCase
94
+ kwCASE tSpace
95
+ cases:condWhen+
96
+ else:stmtElse?
97
+ kwEND tSpace kwCASE tSpace? ';' <Cond>
98
+ /
99
+ kwCASE tSpace
100
+ expr:expressionUntilWhen
101
+ cases:caseWhen+
102
+ else:stmtElse?
103
+ kwEND tSpace kwCASE tSpace? ';' <Case>
104
+ end
105
+
106
+ rule stmtIf
107
+ kwIF
108
+ condSpace:tSpace?
109
+ condStub:stubNode
110
+ cond:expressionUntilThen
111
+ kwTHEN
112
+ bodySpace:tSpace
113
+ bodyStub:stubNode
114
+ body:statement*
115
+ else:stmtElse?
116
+ kwEND tSpace kwIF tSpace? ';' <If>
117
+ end
118
+
119
+ rule stmtElse
120
+ kwELSIF
121
+ condSpace:tSpace?
122
+ condStub:stubNode
123
+ cond:expressionUntilThen
124
+ kwTHEN
125
+ bodySpace:tSpace
126
+ bodyStub:stubNode
127
+ body:statement*
128
+ else:stmtElse? <If>
129
+ /
130
+ kwELSE
131
+ bodySpace:tSpace
132
+ bodyStub:stubNode
133
+ body:statement* <Else>
134
+ end
135
+
136
+ rule stmtLoop
137
+ label_open:tLabel tSpace
138
+ cond:kwLOOP
139
+ bodySpace:tSpace
140
+ bodyStub:stubNode
141
+ body:statement*
142
+ kwEND tSpace kwLOOP
143
+ ( tSpace label_close:tIdentifier )?
144
+ tSpace? ';' exitStub:stubNode <Loop>
145
+ /
146
+ cond:kwLOOP
147
+ bodySpace:tSpace
148
+ bodyStub:stubNode
149
+ body:statement*
150
+ kwEND tSpace kwLOOP
151
+ tSpace? ';' exitStub:stubNode <Loop>
152
+ end
153
+
154
+ rule stmtWhileLoop
155
+ label_open:tLabel tSpace
156
+ kwWHILE
157
+ condSpace:tSpace?
158
+ condStub:stubNode
159
+ cond:expressionUntilLoop
160
+ kwLOOP
161
+ bodySpace:tSpace
162
+ bodyStub:stubNode
163
+ body:statement*
164
+ kwEND tSpace kwLOOP
165
+ ( tSpace label_close:tIdentifier )?
166
+ tSpace? ';' <WhileLoop>
167
+ /
168
+ kwWHILE
169
+ condSpace:tSpace?
170
+ condStub:stubNode
171
+ cond:expressionUntilLoop
172
+ kwLOOP
173
+ bodySpace:tSpace
174
+ bodyStub:stubNode
175
+ body:statement*
176
+ kwEND tSpace kwLOOP
177
+ tSpace? ';' <WhileLoop>
178
+ end
179
+
180
+ # loop coverage calculated by using exitStub
181
+ rule stmtForLoop
182
+ label_open:tLabel tSpace
183
+ kwFOR tSpace identifierList tSpace
184
+ kwIN
185
+ condSpace:tSpace
186
+ cond:( stmtForSql / expressionUntilLoop )
187
+ kwLOOP
188
+ bodySpace:tSpace
189
+ bodyStub:stubNode
190
+ body:statement*
191
+ doneStub:stubNode
192
+ kwEND tSpace kwLOOP
193
+ ( tSpace label_close:tIdentifier )?
194
+ tSpace? ';'
195
+ exitStub:stubNode <ForLoop>
196
+ /
197
+ kwFOR tSpace identifierList tSpace
198
+ kwIN
199
+ condSpace:tSpace
200
+ cond:( stmtForSql / expressionUntilLoop )
201
+ kwLOOP
202
+ bodySpace:tSpace
203
+ bodyStub:stubNode
204
+ body:statement*
205
+ doneStub:stubNode
206
+ kwEND tSpace kwLOOP tSpace? ';'
207
+ exitStub:stubNode <ForLoop>
208
+ end
209
+
210
+ rule stmtForSql
211
+ sqlKeyword tSpace expressionUntilLoop <Sql>
212
+ end
213
+
214
+ rule stmtExit
215
+ bodyStub:stubNode
216
+ body:( kwEXIT (tSpace label:tIdentifier)? ) tSpace? ';' <Exit>
217
+ /
218
+ body:( kwEXIT (tSpace label:tIdentifier)? ) tSpace
219
+ kwWHEN
220
+ condSpace:tSpace
221
+ condStub:stubNode
222
+ cond:expressionUntilSemiColon ';' <ExitWhen>
223
+ end
224
+
225
+ rule stmtContinue
226
+ bodyStub:stubNode
227
+ body:( kwCONTINUE (tSpace label:tIdentifier)? ) tSpace? ';' <Continue>
228
+ /
229
+ body:( kwCONTINUE (tSpace label:tIdentifier)? ) tSpace
230
+ kwWHEN
231
+ condSpace:tSpace
232
+ condStub:stubNode
233
+ cond:expressionUntilSemiColon ';' <ContinueWhen>
234
+ end
235
+
236
+ rule stmtReturn
237
+ bodyStub:stubNode
238
+ body:(kwRETURN ( tSpace? &';'
239
+ / tSpace kwNEXT tSpace expressionUntilSemiColon tSpace?
240
+ / tSpace kwQUERY tSpace expressionUntilSemiColon
241
+ / expressionUntilSemiColon )) ';'
242
+ end
243
+
244
+ rule stmtRaise
245
+ bodyStub:stubNode
246
+ body:(kwRAISE tSpace level:kwEXCEPTION tSpace expr:expressionUntilSemiColon) ';' <Throw>
247
+ /
248
+ kwRAISE tSpace
249
+ level:( kwWARNING
250
+ / kwNOTICE
251
+ / kwINFO
252
+ / kwLOG
253
+ / kwDEBUG )
254
+ tSpace
255
+ expr:expressionUntilSemiColon ';' <Raise>
256
+ end
257
+
258
+ rule stmtExecSql
259
+ sqlKeyword tSpace expressionUntilSemiColon ';' <Sql>
260
+ end
261
+
262
+ rule stmtDynamicExecute
263
+ kwEXECUTE tSpace expressionUntilSemiColon ';'
264
+ end
265
+
266
+ rule stmtPerform
267
+ kwPERFORM tSpace expressionUntilSemiColon ';'
268
+ end
269
+
270
+ rule stmtOpen
271
+ kwOPEN notImplemented
272
+ end
273
+
274
+ rule stmtFetch
275
+ kwFETCH notImplemented
276
+ end
277
+
278
+ rule stmtMove
279
+ kwMOVE notImplemented
280
+ end
281
+
282
+ rule stmtClose
283
+ kwCLOSE notImplemented
284
+ end
285
+
286
+ rule stmtGetDiag
287
+ kwGET tSpace
288
+ kwPERFORM tSpace
289
+ notImplemented
290
+ end
291
+
292
+ rule stmtNull
293
+ kwNULL tSpace? ';'
294
+ end
295
+
296
+ ##
297
+ #############################################################################
298
+
299
+ rule stmtDeclare
300
+ kwDECLARE tSpace varDeclaration*
301
+ end
302
+
303
+ rule varDeclaration
304
+ name:tIdentifier tSpace ( kwCONSTANT tSpace )?
305
+ type:tType ( tSpace kwNOT tSpace kwNULL )?
306
+ ( tSpace kwASSIGN tSpace? rval:expressionUntilSemiColon )?
307
+ tSpace?
308
+ ';' tSpace?
309
+ end
310
+
311
+ rule identifierList
312
+ tIdentifier ( tSpace? ',' tSpace? tIdentifier )*
313
+ end
314
+
315
+ rule blockExceptions
316
+ kwEXCEPTION tSpace cases:exceptionCase*
317
+ end
318
+
319
+ rule exceptionCase
320
+ # cannot provide branch-coverage on cond
321
+ kwWHEN
322
+ condSpace:tSpace
323
+ cond:expressionUntilThen
324
+ kwTHEN
325
+ bodySpace:tSpace
326
+ bodyStub:stubNode
327
+ body:statement* <Catch>
328
+ end
329
+
330
+ rule caseWhen
331
+ # cannot provide branch-coverage on cond
332
+ kwWHEN
333
+ condSpace:tSpace
334
+ cond:expressionUntilThen
335
+ kwTHEN
336
+ bodySpace:tSpace
337
+ bodyStub:stubNode
338
+ body:statement* <Case>
339
+ end
340
+
341
+ rule condWhen
342
+ kwWHEN
343
+ condSpace:tSpace
344
+ condStub:stubNode
345
+ cond:expressionUntilThen
346
+ kwTHEN
347
+ bodySpace:tSpace
348
+ bodyStub:stubNode
349
+ body:statement* <Cond>
350
+ end
351
+
352
+ ## EXPRESSIONS
353
+ #############################################################################
354
+
355
+ # it would be nice to match parens and brackets here, but we again assume there
356
+ # are no syntax errors in the proc and let the database worry about them
357
+
358
+ rule expressionUntilSemiColon
359
+ head:tSpace? expr:( tString / skipWords / tSpace !';' / !tSpace [^;] )* tail:tSpace? &';' <Expression>
360
+ end
361
+
362
+ rule expressionUntilClosingBracket
363
+ head:tSpace? expr:( tString / skipWords / tSpace !']' / !tSpace [^\]] )+ tail:tSpace? &']' <Expression>
364
+ end
365
+
366
+ rule expressionUntilThen
367
+ head:tSpace? expr:( tString / skipWords / tSpace !kwTHEN / !tSpace !kwTHEN . )+ tail:tSpace &kwTHEN <Expression>
368
+ end
369
+
370
+ rule expressionUntilWhen
371
+ head:tSpace? expr:( tString / skipWords / tSpace !kwWHEN / !tSpace !kwWHEN . )+ tail:tSpace &kwWHEN <Expression>
372
+ end
373
+
374
+ rule expressionUntilLoop
375
+ head:tSpace? expr:( tString / skipWords / tSpace !kwLOOP / !tSpace !kwLOOP . )+ tail:tSpace &kwLOOP <Expression>
376
+ end
377
+
378
+ rule skipWords
379
+ [a-z0-9_]+ <TextNode>
380
+ end
381
+
382
+ ##
383
+ #############################################################################
384
+
385
+ rule ws
386
+ [ \t\n\v\f\r]+ <TextNode>
387
+ end
388
+
389
+ rule dollarQuoteMarker
390
+ '$' tag:( [a-z\200-\377_] [a-z\200-\377_0-9]* )? '$' <TDollarQuoteMarker>
391
+ end
392
+
393
+ rule stubNode
394
+ '' <StubNode>
395
+ end
396
+
397
+ rule notImplemented
398
+ '' <NotImplemented>
399
+ end
400
+
401
+ rule lValue
402
+ tIdentifier sub:('[' expressionUntilClosingBracket ']')+ next:('.' lValue)+ <Assignable>
403
+ / tIdentifier sub:('[' expressionUntilClosingBracket ']')+ <Assignable>
404
+ / tIdentifier next:('.' lValue)+ <Assignable>
405
+ / tIdentifier x:'' <Assignable>
406
+ end
407
+
408
+ ## BASIC TOKENS
409
+ #############################################################################
410
+
411
+ rule tEOF
412
+ !.
413
+ end
414
+
415
+ rule tLabel
416
+ '<<' tSpace? name:tIdentifier tSpace? '>>' <TLabel>
417
+ end
418
+
419
+ rule tIdentifier
420
+ ( '"' [^"]+ '"' )+ <TIdentifier>
421
+ / !keyword ( [a-z\200-\377_] [a-z\200-\377_0-9$]* ) <TIdentifier>
422
+ end
423
+
424
+ # not context sensitive so opening and closing tag might not match
425
+ rule tString
426
+ openTag:dollarQuoteMarker content:(!dollarQuoteMarker .)* closeTag:dollarQuoteMarker <TString> /
427
+ "E'" content:("''" / [^'])* "'" <TString> /
428
+ "'" content:("''" / [^'])* "'" <TString>
429
+ end
430
+
431
+ # beware this is quite broad and might match things it shouldn't
432
+ rule tType
433
+ [a-z\200-\377_]
434
+ ( '(' rType ')' /
435
+ '[' rType ']' /
436
+ [a-z\200-\377_0-9$%]+ /
437
+ ws !( kwAS / kwNOT / kwASSIGN / kwDEFAULT ) )* <TDatatype>
438
+ end
439
+
440
+ rule rType
441
+ ( '(' rType ')' /
442
+ '[' rType ']' /
443
+ [^\(\)\[\]]+ )*
444
+ end
445
+
446
+ rule tSpace
447
+ ws !tComment <TextNode>
448
+ /
449
+ ( ws / tComment )+
450
+ end
451
+
452
+ rule tComment
453
+ '/*' content:(!'*/' .)* '*/' <TComment> /
454
+ '--' content:[^\n]* ("\n" / tEOF) <TComment>
455
+ end
456
+
457
+ ##
458
+ #############################################################################
459
+
460
+ rule tBinary
461
+ "b'" [01]+ "'"
462
+ end
463
+
464
+ rule tHex
465
+ "x'" [0123456789abcdef]+ "'"
466
+ end
467
+
468
+ rule tNumber
469
+ tBinary / tHex /
470
+ sign:[+-]? '.' [0-9]+ exponent:('e' [+-]? [0-9]+)? /
471
+ sign:[+-]? [0-9]+ '.' [0-9]* exponent:('e' [+-]? [0-9]+)? /
472
+ sign:[+-]? [0-9]+ '.'? exponent:('e' [+-]? [0-9]+)?
473
+ end
474
+
475
+ rule tLiteral
476
+ tString (tSpace? '::' tSpace? tType) /
477
+ tString /
478
+ tNumber (tSpace? '::' tSpace? tType) /
479
+ tNumber /
480
+ 'cast' tSpace? '(' tSpace? tString tSpace kwAS tSpace tType tSpace? ')' /
481
+ 'cast' tSpace? '(' tSpace? tNumber tSpace kwAS tSpace tType tSpace? ')'
482
+ end
483
+
484
+ ## KEYWORDS
485
+ #############################################################################
486
+
487
+ rule sqlKeyword
488
+ ( 'insert'
489
+ / 'select'
490
+ / 'update'
491
+ / 'delete'
492
+ / 'drop'
493
+ / 'alter'
494
+ / 'commit'
495
+ / 'copy'
496
+ / 'create'
497
+ / 'begin'
498
+ / 'rollback'
499
+ / 'set'
500
+ / 'start'
501
+ / 'vacuum' ) ![a-z0-9] <TextNode>
502
+ end
503
+
504
+ rule keyword
505
+ # WHEN is checked first as a minor optimization to distinguish
506
+ # CONTINUE tIdentifier WHEN cond;
507
+ # EXIT tIdentifier WHEN cond;
508
+ #
509
+ # CONTINUE WHEN cond;
510
+ # EXIT WHEN cond;
511
+
512
+ kwWHEN / kwAS / kwASSIGN / kwALIAS / kwBEGIN / kwBY / kwCASE / kwCLOSE
513
+ / kwCONSTANT / kwCONTINUE / kwCURSOR / kwDEBUG / kwDECLARE / kwDEFAULT
514
+ / kwDIAGNOSTICS / kwELSE / kwELSIF / kwEND / kwEXCEPTION / kwEXECUTE / kwEXIT
515
+ / kwFETCH / kwFOR / kwFROM / kwGET / kwIF / kwIN / kwINFO / kwINSERT / kwINTO
516
+ / kwIS / kwLOG / kwLOOP / kwMOVE / kwNOT / kwNOTICE / kwNULL / kwOPEN
517
+ / kwOR / kwPERFORM / kwRAISE / kwRENAME / kwRESULTOID / kwRETURN
518
+ / kwREVERSE / kwROWCOUNT / kwSCROLL / kwSTRICT / kwTHEN / kwTO / kwTYPE
519
+ / kwWARNING / kwWHILE
520
+ end
521
+
522
+ # this terminates keywords
523
+ rule x
524
+ [^a-z0-9_]
525
+ end
526
+
527
+ rule kwAS
528
+ 'as' ![a-z0-9_] <TKeyword>
529
+ end
530
+
531
+ rule kwASSIGN
532
+ ':=' <TKeyword> / '=' <TKeyword>
533
+ end
534
+
535
+ rule kwALIAS
536
+ 'alias' ![a-z0-9_] <TKeyword>
537
+ end
538
+
539
+ rule kwBEGIN
540
+ 'begin' ![a-z0-9_] <TKeyword>
541
+ end
542
+
543
+ rule kwBY
544
+ 'by' ![a-z0-9_] <TKeyword>
545
+ end
546
+
547
+ rule kwCASE
548
+ 'case' ![a-z0-9_] <TKeyword>
549
+ end
550
+
551
+ rule kwCLOSE
552
+ 'close' ![a-z0-9_] <TKeyword>
553
+ end
554
+
555
+ rule kwCONSTANT
556
+ 'constant' ![a-z0-9_] <TKeyword>
557
+ end
558
+
559
+ rule kwCONTINUE
560
+ 'continue' ![a-z0-9_] <TKeyword>
561
+ end
562
+
563
+ rule kwCURSOR
564
+ 'cursor' ![a-z0-9_] <TKeyword>
565
+ end
566
+
567
+ rule kwDEBUG
568
+ 'debug' ![a-z0-9_] <TKeyword>
569
+ end
570
+
571
+ rule kwDECLARE
572
+ 'declare' ![a-z0-9_] <TKeyword>
573
+ end
574
+
575
+ rule kwDEFAULT
576
+ 'default' ![a-z0-9_] <TKeyword>
577
+ end
578
+
579
+ rule kwDIAGNOSTICS
580
+ 'diagnostics' ![a-z0-9_] <TKeyword>
581
+ end
582
+
583
+ rule kwELSE
584
+ 'else' ![a-z0-9_] <TKeyword>
585
+ end
586
+
587
+ rule kwELSIF
588
+ ('elsif'/'elseif') ![a-z0-9_] <TKeyword>
589
+ end
590
+
591
+ rule kwEND
592
+ 'end' ![a-z0-9_] <TKeyword>
593
+ end
594
+
595
+ rule kwEXCEPTION
596
+ 'exception' ![a-z0-9_] <TKeyword>
597
+ end
598
+
599
+ rule kwEXECUTE
600
+ 'execute' ![a-z0-9_] <TKeyword>
601
+ end
602
+
603
+ rule kwEXIT
604
+ 'exit' ![a-z0-9_] <TKeyword>
605
+ end
606
+
607
+ rule kwFETCH
608
+ 'fetch' ![a-z0-9_] <TKeyword>
609
+ end
610
+
611
+ rule kwFOR
612
+ 'for' ![a-z0-9_] <TKeyword>
613
+ end
614
+
615
+ rule kwFROM
616
+ 'from' ![a-z0-9_] <TKeyword>
617
+ end
618
+
619
+ rule kwGET
620
+ 'get' ![a-z0-9_] <TKeyword>
621
+ end
622
+
623
+ rule kwIF
624
+ 'if' ![a-z0-9_] <TKeyword>
625
+ end
626
+
627
+ rule kwIN
628
+ 'in' ![a-z0-9_] <TKeyword>
629
+ end
630
+
631
+ rule kwINFO
632
+ 'info' ![a-z0-9_] <TKeyword>
633
+ end
634
+
635
+ rule kwINSERT
636
+ 'insert' ![a-z0-9_] <TKeyword>
637
+ end
638
+
639
+ rule kwINTO
640
+ 'into' ![a-z0-9_] <TKeyword>
641
+ end
642
+
643
+ rule kwIS
644
+ 'is' ![a-z0-9_] <TKeyword>
645
+ end
646
+
647
+ rule kwLOG
648
+ 'log' ![a-z0-9_] <TKeyword>
649
+ end
650
+
651
+ rule kwLOOP
652
+ 'loop' ![a-z0-9_] <TKeyword>
653
+ end
654
+
655
+ rule kwMOVE
656
+ 'move' ![a-z0-9_] <TKeyword>
657
+ end
658
+
659
+ rule kwNEXT
660
+ 'next' ![a-z0-9_] <TKeyword>
661
+ end
662
+
663
+ rule kwNOT
664
+ 'not' ![a-z0-9_] <TKeyword>
665
+ end
666
+
667
+ rule kwNOTICE
668
+ 'notice' ![a-z0-9_] <TKeyword>
669
+ end
670
+
671
+ rule kwNULL
672
+ 'null' ![a-z0-9_] <TKeyword>
673
+ end
674
+
675
+ rule kwOPEN
676
+ 'open' ![a-z0-9_] <TKeyword>
677
+ end
678
+
679
+ rule kwOR
680
+ 'or' ![a-z0-9_] <TKeyword>
681
+ end
682
+
683
+ rule kwPERFORM
684
+ 'perform' ![a-z0-9_] <TKeyword>
685
+ end
686
+
687
+ rule kwQUERY
688
+ 'query' ![a-z0-9_] <TKeyword>
689
+ end
690
+
691
+ rule kwRAISE
692
+ 'raise' ![a-z0-9_] <TKeyword>
693
+ end
694
+
695
+ rule kwRENAME
696
+ 'rename' ![a-z0-9_] <TKeyword>
697
+ end
698
+
699
+ rule kwRESULTOID
700
+ 'result_oid' ![a-z0-9_] <TKeyword>
701
+ end
702
+
703
+ rule kwRETURN
704
+ 'return' ![a-z0-9_] <TKeyword>
705
+ end
706
+
707
+ rule kwREVERSE
708
+ 'reverse' ![a-z0-9_] <TKeyword>
709
+ end
710
+
711
+ rule kwROWCOUNT
712
+ 'row_count' ![a-z0-9_] <TKeyword>
713
+ end
714
+
715
+ rule kwSCROLL
716
+ 'scroll' ![a-z0-9_] <TKeyword>
717
+ end
718
+
719
+ rule kwSTRICT
720
+ 'strict' ![a-z0-9_] <TKeyword>
721
+ end
722
+
723
+ rule kwTHEN
724
+ 'then' ![a-z0-9_] <TKeyword>
725
+ end
726
+
727
+ rule kwTO
728
+ 'to' ![a-z0-9_] <TKeyword>
729
+ end
730
+
731
+ rule kwTYPE
732
+ 'type' ![a-z0-9_] <TKeyword>
733
+ end
734
+
735
+ rule kwWARNING
736
+ 'warning' ![a-z0-9_] <TKeyword>
737
+ end
738
+
739
+ rule kwWHEN
740
+ 'when' ![a-z0-9_] <TKeyword>
741
+ end
742
+
743
+ rule kwWHILE
744
+ 'while' ![a-z0-9_] <TKeyword>
745
+ end
746
+
747
+ end