piggly 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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