rattler 0.2.2 → 0.3.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 (56) hide show
  1. data/README.rdoc +83 -64
  2. data/features/grammar/comments.feature +24 -0
  3. data/features/grammar/list_matching.feature +41 -0
  4. data/features/grammar/symantic_action.feature +30 -12
  5. data/lib/rattler/back_end/parser_generator/assert_generator.rb +27 -27
  6. data/lib/rattler/back_end/parser_generator/choice_generator.rb +29 -29
  7. data/lib/rattler/back_end/parser_generator/direct_action_generator.rb +17 -17
  8. data/lib/rattler/back_end/parser_generator/disallow_generator.rb +27 -27
  9. data/lib/rattler/back_end/parser_generator/dispatch_action_generator.rb +17 -17
  10. data/lib/rattler/back_end/parser_generator/expr_generator.rb +129 -40
  11. data/lib/rattler/back_end/parser_generator/label_generator.rb +15 -15
  12. data/lib/rattler/back_end/parser_generator/list1_generator.rb +61 -0
  13. data/lib/rattler/back_end/parser_generator/list_generating.rb +71 -0
  14. data/lib/rattler/back_end/parser_generator/list_generator.rb +57 -0
  15. data/lib/rattler/back_end/parser_generator/one_or_more_generator.rb +14 -15
  16. data/lib/rattler/back_end/parser_generator/optional_generator.rb +24 -24
  17. data/lib/rattler/back_end/parser_generator/predicate_propogating.rb +9 -9
  18. data/lib/rattler/back_end/parser_generator/repeat_generating.rb +16 -16
  19. data/lib/rattler/back_end/parser_generator/sequence_generator.rb +40 -40
  20. data/lib/rattler/back_end/parser_generator/skip_generator.rb +18 -18
  21. data/lib/rattler/back_end/parser_generator/skip_propogating.rb +5 -5
  22. data/lib/rattler/back_end/parser_generator/sub_generating.rb +128 -0
  23. data/lib/rattler/back_end/parser_generator/token_generator.rb +15 -15
  24. data/lib/rattler/back_end/parser_generator/token_propogating.rb +1 -1
  25. data/lib/rattler/back_end/parser_generator/zero_or_more_generator.rb +12 -13
  26. data/lib/rattler/back_end/parser_generator.rb +10 -7
  27. data/lib/rattler/grammar/grammar_parser.rb +16 -21
  28. data/lib/rattler/grammar/metagrammar.rb +1039 -1035
  29. data/lib/rattler/grammar/rattler.rtlr +28 -28
  30. data/lib/rattler/parsers/action_code.rb +20 -9
  31. data/lib/rattler/parsers/fail.rb +7 -1
  32. data/lib/rattler/parsers/list.rb +57 -0
  33. data/lib/rattler/parsers/list1.rb +58 -0
  34. data/lib/rattler/parsers/parser_dsl.rb +60 -38
  35. data/lib/rattler/parsers.rb +5 -3
  36. data/lib/rattler/runtime/extended_packrat_parser.rb +88 -20
  37. data/lib/rattler/runtime/packrat_parser.rb +21 -14
  38. data/lib/rattler/runtime/parser.rb +74 -18
  39. data/lib/rattler/runtime/recursive_descent_parser.rb +15 -46
  40. data/spec/rattler/back_end/compiler_spec.rb +173 -107
  41. data/spec/rattler/back_end/parser_generator/list1_generator_spec.rb +304 -0
  42. data/spec/rattler/back_end/parser_generator/list_generator_spec.rb +288 -0
  43. data/spec/rattler/grammar/grammar_parser_spec.rb +65 -76
  44. data/spec/rattler/parsers/action_code_spec.rb +84 -34
  45. data/spec/rattler/parsers/direct_action_spec.rb +56 -34
  46. data/spec/rattler/parsers/fail_spec.rb +20 -0
  47. data/spec/rattler/parsers/list1_spec.rb +82 -0
  48. data/spec/rattler/parsers/list_spec.rb +82 -0
  49. data/spec/rattler/parsers/parser_dsl_spec.rb +48 -19
  50. data/spec/rattler/runtime/extended_packrat_parser_spec.rb +0 -1
  51. metadata +92 -173
  52. data/bin/rtlr.bat +0 -3
  53. data/lib/rattler/back_end/parser_generator/generator_helper.rb +0 -130
  54. data/lib/rattler/back_end/parser_generator/generators.rb +0 -86
  55. data/lib/rattler/back_end/parser_generator/nested_generators.rb +0 -15
  56. data/lib/rattler/back_end/parser_generator/top_level_generators.rb +0 -15
@@ -1,1035 +1,1039 @@
1
- require 'rattler/grammar'
2
-
3
- module Rattler
4
- module Grammar
5
- # @private
6
- module Metagrammar #:nodoc:
7
-
8
- include Rattler::Parsers
9
-
10
- # @private
11
- def start_rule #:nodoc:
12
- :grammar
13
- end
14
-
15
- # @private
16
- def match_grammar #:nodoc:
17
- p0 = @scanner.pos
18
- begin
19
- (r0_0 = match(:heading)) &&
20
- (r0_1 = match(:rules)) &&
21
- begin
22
- p1 = @scanner.pos
23
- begin
24
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
25
- @scanner.eos? &&
26
- true
27
- end || begin
28
- @scanner.pos = p1
29
- false
30
- end
31
- end &&
32
- Grammar.parsed(select_captures([r0_0, r0_1]))
33
- end || begin
34
- @scanner.pos = p0
35
- false
36
- end
37
- end
38
-
39
- # @private
40
- def match_heading #:nodoc:
41
- p0 = @scanner.pos
42
- begin
43
- (r0_0 = match(:requires)) &&
44
- (r0_1 = ((r = match(:module_decl)) ? [r] : [])) &&
45
- (r0_2 = match(:includes)) &&
46
- (heading r0_0, r0_1, r0_2)
47
- end || begin
48
- @scanner.pos = p0
49
- false
50
- end
51
- end
52
-
53
- # @private
54
- def match_requires #:nodoc:
55
- a0 = []
56
- while r = begin
57
- p0 = @scanner.pos
58
- begin
59
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>require)(?>(?![[:alnum:]_])))/) &&
60
- (r0_0 = match(:literal)) &&
61
- match(:eol) &&
62
- r0_0
63
- end || begin
64
- @scanner.pos = p0
65
- false
66
- end
67
- end
68
- a0 << r
69
- end
70
- ({:requires => select_captures(a0)})
71
- end
72
-
73
- # @private
74
- def match_module_decl #:nodoc:
75
- begin
76
- p0 = @scanner.pos
77
- begin
78
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>parser)(?>(?![[:alnum:]_])))/) &&
79
- (r0_0 = match(:constant)) &&
80
- (r0_1 = ((r = begin
81
- p1 = @scanner.pos
82
- begin
83
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><)/) &&
84
- match(:constant)
85
- end || begin
86
- @scanner.pos = p1
87
- false
88
- end
89
- end) ? [r] : [])) &&
90
- match(:eol) &&
91
- (parser_decl r0_0, r0_1)
92
- end || begin
93
- @scanner.pos = p0
94
- false
95
- end
96
- end ||
97
- begin
98
- p0 = @scanner.pos
99
- begin
100
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>grammar)(?>(?![[:alnum:]_])))/) &&
101
- (r0_0 = match(:constant)) &&
102
- match(:eol) &&
103
- ({:grammar_name => r0_0})
104
- end || begin
105
- @scanner.pos = p0
106
- false
107
- end
108
- end
109
- end
110
-
111
- # @private
112
- def match_includes #:nodoc:
113
- a0 = []
114
- while r = begin
115
- p0 = @scanner.pos
116
- begin
117
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>include)(?>(?![[:alnum:]_])))/) &&
118
- (r0_0 = match(:constant)) &&
119
- match(:eol) &&
120
- r0_0
121
- end || begin
122
- @scanner.pos = p0
123
- false
124
- end
125
- end
126
- a0 << r
127
- end
128
- ({:includes => select_captures(a0)})
129
- end
130
-
131
- # @private
132
- def match_rules #:nodoc:
133
- a0 = []
134
- while r = begin
135
- match(:directive) ||
136
- match(:rule) ||
137
- match(:block_close)
138
- end
139
- a0 << r
140
- end
141
- Rules.parsed(select_captures(a0)) unless a0.empty?
142
- end
143
-
144
- # @private
145
- def match_directive #:nodoc:
146
- match(:ws_directive) ||
147
- match(:wc_directive)
148
- end
149
-
150
- # @private
151
- def match_ws_directive #:nodoc:
152
- begin
153
- p0 = @scanner.pos
154
- begin
155
- (r0_0 = match(:ws_decl)) &&
156
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{)/) &&
157
- (start_ws r0_0)
158
- end || begin
159
- @scanner.pos = p0
160
- false
161
- end
162
- end ||
163
- ((r = match(:ws_decl)) && (set_ws r))
164
- end
165
-
166
- # @private
167
- def match_ws_decl #:nodoc:
168
- p0 = @scanner.pos
169
- begin
170
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%whitespace)(?>(?![[:alnum:]_])))/) &&
171
- match(:unattributed)
172
- end || begin
173
- @scanner.pos = p0
174
- false
175
- end
176
- end
177
-
178
- # @private
179
- def match_wc_directive #:nodoc:
180
- begin
181
- p0 = @scanner.pos
182
- begin
183
- (r0_0 = match(:wc_decl)) &&
184
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{)/) &&
185
- (start_wc r0_0)
186
- end || begin
187
- @scanner.pos = p0
188
- false
189
- end
190
- end ||
191
- ((r = match(:wc_decl)) && (set_wc r))
192
- end
193
-
194
- # @private
195
- def match_wc_decl #:nodoc:
196
- p0 = @scanner.pos
197
- begin
198
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%word_character)(?>(?![[:alnum:]_])))/) &&
199
- match(:unattributed)
200
- end || begin
201
- @scanner.pos = p0
202
- false
203
- end
204
- end
205
-
206
- # @private
207
- def match_block_close #:nodoc:
208
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\})/) &&
209
- (end_block )
210
- end
211
-
212
- # @private
213
- def match_rule #:nodoc:
214
- p0 = @scanner.pos
215
- begin
216
- (r0_0 = match(:identifier)) &&
217
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><\-)/) &&
218
- (r0_1 = match(:expression)) &&
219
- (rule r0_0, r0_1)
220
- end || begin
221
- @scanner.pos = p0
222
- false
223
- end
224
- end
225
-
226
- # @private
227
- def match_unattributed #:nodoc:
228
- begin
229
- p0 = @scanner.pos
230
- begin
231
- (r0_0 = match(:unattributed)) &&
232
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\|)/) &&
233
- (r0_1 = match(:terms)) &&
234
- Choice.parsed(select_captures([r0_0, r0_1]))
235
- end || begin
236
- @scanner.pos = p0
237
- false
238
- end
239
- end ||
240
- match(:terms)
241
- end
242
-
243
- # @private
244
- def match_expression #:nodoc:
245
- begin
246
- p0 = @scanner.pos
247
- begin
248
- (r0_0 = match(:expression)) &&
249
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\|)/) &&
250
- (r0_1 = match(:attributed)) &&
251
- Choice.parsed(select_captures([r0_0, r0_1]))
252
- end || begin
253
- @scanner.pos = p0
254
- false
255
- end
256
- end ||
257
- match(:attributed)
258
- end
259
-
260
- # @private
261
- def match_attributed #:nodoc:
262
- begin
263
- p0 = @scanner.pos
264
- begin
265
- (r0_0 = match(:attributed)) &&
266
- (r0_1 = match(:attribute)) &&
267
- DispatchAction.parsed(select_captures([r0_0, r0_1]))
268
- end || begin
269
- @scanner.pos = p0
270
- false
271
- end
272
- end ||
273
- begin
274
- p0 = @scanner.pos
275
- begin
276
- (r0_0 = match(:attributed)) &&
277
- (r0_1 = match(:action)) &&
278
- DirectAction.parsed(select_captures([r0_0, r0_1]))
279
- end || begin
280
- @scanner.pos = p0
281
- false
282
- end
283
- end ||
284
- match(:terms)
285
- end
286
-
287
- # @private
288
- def match_attribute #:nodoc:
289
- p0 = @scanner.pos
290
- begin
291
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><)/) &&
292
- (r0_0 = ((r = match(:option)) ? [r] : [])) &&
293
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>>)/) &&
294
- r0_0
295
- end || begin
296
- @scanner.pos = p0
297
- false
298
- end
299
- end
300
-
301
- # @private
302
- def match_option #:nodoc:
303
- p0 = @scanner.pos
304
- begin
305
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
306
- begin
307
- p1 = @scanner.pos
308
- begin
309
- match(:name) &&
310
- begin
311
- match(:method)
312
- true
313
- end &&
314
- @scanner.string[p1...(@scanner.pos)]
315
- end || begin
316
- @scanner.pos = p1
317
- false
318
- end
319
- end
320
- end || begin
321
- @scanner.pos = p0
322
- false
323
- end
324
- end
325
-
326
- # @private
327
- def match_method #:nodoc:
328
- p0 = @scanner.pos
329
- begin
330
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.)/) &&
331
- match(:var_name)
332
- end || begin
333
- @scanner.pos = p0
334
- false
335
- end
336
- end
337
-
338
- # @private
339
- def match_action #:nodoc:
340
- begin
341
- p0 = @scanner.pos
342
- begin
343
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{)/) &&
344
- (r0_0 = begin
345
- p1 = @scanner.pos
346
- begin
347
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
348
- @scanner.scan(/(?>(?>\{)(?>(?>[^}])*)(?>\})|[^{}])*/)
349
- end || begin
350
- @scanner.pos = p1
351
- false
352
- end
353
- end) &&
354
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\})/) &&
355
- r0_0
356
- end || begin
357
- @scanner.pos = p0
358
- false
359
- end
360
- end ||
361
- begin
362
- p0 = @scanner.pos
363
- begin
364
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><)/) &&
365
- (r0_0 = match(:method)) &&
366
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>>)/) &&
367
- ("|_| _.#{r0_0}")
368
- end || begin
369
- @scanner.pos = p0
370
- false
371
- end
372
- end
373
- end
374
-
375
- # @private
376
- def match_terms #:nodoc:
377
- begin
378
- p0 = @scanner.pos
379
- begin
380
- (r0_0 = match(:terms)) &&
381
- (r0_1 = match(:term)) &&
382
- Sequence.parsed(select_captures([r0_0, r0_1]))
383
- end || begin
384
- @scanner.pos = p0
385
- false
386
- end
387
- end ||
388
- match(:term)
389
- end
390
-
391
- # @private
392
- def match_term #:nodoc:
393
- match(:fail_expr) ||
394
- match(:labeled) ||
395
- match(:prefixed) ||
396
- match(:suffixed) ||
397
- match(:primary)
398
- end
399
-
400
- # @private
401
- def match_fail_expr #:nodoc:
402
- p0 = @scanner.pos
403
- begin
404
- (r0_0 = begin
405
- begin
406
- p1 = @scanner.pos
407
- begin
408
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
409
- @scanner.scan(/(?>fail)(?>(?![[:alnum:]_]))/)
410
- end || begin
411
- @scanner.pos = p1
412
- false
413
- end
414
- end ||
415
- begin
416
- p1 = @scanner.pos
417
- begin
418
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
419
- @scanner.scan(/(?>fail_rule)(?>(?![[:alnum:]_]))/)
420
- end || begin
421
- @scanner.pos = p1
422
- false
423
- end
424
- end ||
425
- begin
426
- p1 = @scanner.pos
427
- begin
428
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
429
- @scanner.scan(/(?>fail_parse)(?>(?![[:alnum:]_]))/)
430
- end || begin
431
- @scanner.pos = p1
432
- false
433
- end
434
- end
435
- end) &&
436
- (r0_1 = match(:fail_arg)) &&
437
- Fail.parsed(select_captures([r0_0, r0_1]))
438
- end || begin
439
- @scanner.pos = p0
440
- false
441
- end
442
- end
443
-
444
- # @private
445
- def match_fail_arg #:nodoc:
446
- begin
447
- p0 = @scanner.pos
448
- begin
449
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\()/) &&
450
- (r0_0 = match(:literal)) &&
451
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\))/) &&
452
- r0_0
453
- end || begin
454
- @scanner.pos = p0
455
- false
456
- end
457
- end ||
458
- match(:literal)
459
- end
460
-
461
- # @private
462
- def match_labeled #:nodoc:
463
- p0 = @scanner.pos
464
- begin
465
- (r0_0 = match(:label)) &&
466
- (r0_1 = begin
467
- match(:prefixed) ||
468
- match(:prefixable)
469
- end) &&
470
- Label.parsed(select_captures([r0_0, r0_1]))
471
- end || begin
472
- @scanner.pos = p0
473
- false
474
- end
475
- end
476
-
477
- # @private
478
- def match_label #:nodoc:
479
- p0 = @scanner.pos
480
- begin
481
- (r0_0 = match(:var_name)) &&
482
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>:)/) &&
483
- r0_0
484
- end || begin
485
- @scanner.pos = p0
486
- false
487
- end
488
- end
489
-
490
- # @private
491
- def match_prefixed #:nodoc:
492
- begin
493
- p0 = @scanner.pos
494
- begin
495
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>&)/) &&
496
- (r0_0 = match(:prefixable)) &&
497
- Assert.parsed(select_captures([r0_0]))
498
- end || begin
499
- @scanner.pos = p0
500
- false
501
- end
502
- end ||
503
- begin
504
- p0 = @scanner.pos
505
- begin
506
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>!)/) &&
507
- (r0_0 = match(:prefixable)) &&
508
- Disallow.parsed(select_captures([r0_0]))
509
- end || begin
510
- @scanner.pos = p0
511
- false
512
- end
513
- end ||
514
- begin
515
- p0 = @scanner.pos
516
- begin
517
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>~)/) &&
518
- (r0_0 = match(:prefixable)) &&
519
- Skip.parsed(select_captures([r0_0]))
520
- end || begin
521
- @scanner.pos = p0
522
- false
523
- end
524
- end ||
525
- begin
526
- p0 = @scanner.pos
527
- begin
528
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>@)/) &&
529
- (r0_0 = match(:prefixable)) &&
530
- Token.parsed(select_captures([r0_0]))
531
- end || begin
532
- @scanner.pos = p0
533
- false
534
- end
535
- end
536
- end
537
-
538
- # @private
539
- def match_prefixable #:nodoc:
540
- match(:suffixed) ||
541
- match(:primary)
542
- end
543
-
544
- # @private
545
- def match_suffixed #:nodoc:
546
- begin
547
- p0 = @scanner.pos
548
- begin
549
- (r0_0 = match(:primary)) &&
550
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\?)/) &&
551
- Optional.parsed(select_captures([r0_0]))
552
- end || begin
553
- @scanner.pos = p0
554
- false
555
- end
556
- end ||
557
- begin
558
- p0 = @scanner.pos
559
- begin
560
- (r0_0 = match(:primary)) &&
561
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\*)/) &&
562
- ZeroOrMore.parsed(select_captures([r0_0]))
563
- end || begin
564
- @scanner.pos = p0
565
- false
566
- end
567
- end ||
568
- begin
569
- p0 = @scanner.pos
570
- begin
571
- (r0_0 = match(:primary)) &&
572
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\+)/) &&
573
- OneOrMore.parsed(select_captures([r0_0]))
574
- end || begin
575
- @scanner.pos = p0
576
- false
577
- end
578
- end
579
- end
580
-
581
- # @private
582
- def match_primary #:nodoc:
583
- begin
584
- p0 = @scanner.pos
585
- begin
586
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\()/) &&
587
- (r0_0 = match(:expression)) &&
588
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\))/) &&
589
- r0_0
590
- end || begin
591
- @scanner.pos = p0
592
- false
593
- end
594
- end ||
595
- match(:atom)
596
- end
597
-
598
- # @private
599
- def match_atom #:nodoc:
600
- begin
601
- p0 = @scanner.pos
602
- begin
603
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
604
- (r0_0 = @scanner.scan(/(?>EOF)(?>(?![[:alnum:]_]))/)) &&
605
- Eof.parsed([r0_0])
606
- end || begin
607
- @scanner.pos = p0
608
- false
609
- end
610
- end ||
611
- ((r = match(:posix_class)) && (posix_class r)) ||
612
- begin
613
- p0 = @scanner.pos
614
- begin
615
- (r0_0 = match(:identifier)) &&
616
- begin
617
- p1 = @scanner.pos
618
- r = !begin
619
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
620
- @scanner.skip(/<\-/)
621
- end
622
- @scanner.pos = p1
623
- r
624
- end &&
625
- Apply.parsed(select_captures([r0_0]))
626
- end || begin
627
- @scanner.pos = p0
628
- false
629
- end
630
- end ||
631
- ((r = match(:literal)) && (literal r)) ||
632
- ((r = match(:word_literal)) && (word_literal r)) ||
633
- ((r = match(:class)) && (char_class r)) ||
634
- ((r = match(:regexp)) && Match.parsed([r])) ||
635
- begin
636
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.)/) &&
637
- (Match[/./] )
638
- end
639
- end
640
-
641
- # @private
642
- def match_posix_class #:nodoc:
643
- begin
644
- p0 = @scanner.pos
645
- begin
646
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
647
- @scanner.scan(/(?>ALNUM)(?>(?![[:alnum:]_]))/)
648
- end || begin
649
- @scanner.pos = p0
650
- false
651
- end
652
- end ||
653
- begin
654
- p0 = @scanner.pos
655
- begin
656
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
657
- @scanner.scan(/(?>ALPHA)(?>(?![[:alnum:]_]))/)
658
- end || begin
659
- @scanner.pos = p0
660
- false
661
- end
662
- end ||
663
- begin
664
- p0 = @scanner.pos
665
- begin
666
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
667
- @scanner.scan(/(?>ASCII)(?>(?![[:alnum:]_]))/)
668
- end || begin
669
- @scanner.pos = p0
670
- false
671
- end
672
- end ||
673
- begin
674
- p0 = @scanner.pos
675
- begin
676
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
677
- @scanner.scan(/(?>BLANK)(?>(?![[:alnum:]_]))/)
678
- end || begin
679
- @scanner.pos = p0
680
- false
681
- end
682
- end ||
683
- begin
684
- p0 = @scanner.pos
685
- begin
686
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
687
- @scanner.scan(/(?>CNTRL)(?>(?![[:alnum:]_]))/)
688
- end || begin
689
- @scanner.pos = p0
690
- false
691
- end
692
- end ||
693
- begin
694
- p0 = @scanner.pos
695
- begin
696
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
697
- @scanner.scan(/(?>DIGIT)(?>(?![[:alnum:]_]))/)
698
- end || begin
699
- @scanner.pos = p0
700
- false
701
- end
702
- end ||
703
- begin
704
- p0 = @scanner.pos
705
- begin
706
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
707
- @scanner.scan(/(?>GRAPH)(?>(?![[:alnum:]_]))/)
708
- end || begin
709
- @scanner.pos = p0
710
- false
711
- end
712
- end ||
713
- begin
714
- p0 = @scanner.pos
715
- begin
716
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
717
- @scanner.scan(/(?>LOWER)(?>(?![[:alnum:]_]))/)
718
- end || begin
719
- @scanner.pos = p0
720
- false
721
- end
722
- end ||
723
- begin
724
- p0 = @scanner.pos
725
- begin
726
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
727
- @scanner.scan(/(?>PRINT)(?>(?![[:alnum:]_]))/)
728
- end || begin
729
- @scanner.pos = p0
730
- false
731
- end
732
- end ||
733
- begin
734
- p0 = @scanner.pos
735
- begin
736
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
737
- @scanner.scan(/(?>PUNCT)(?>(?![[:alnum:]_]))/)
738
- end || begin
739
- @scanner.pos = p0
740
- false
741
- end
742
- end ||
743
- begin
744
- p0 = @scanner.pos
745
- begin
746
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
747
- @scanner.scan(/(?>SPACE)(?>(?![[:alnum:]_]))/)
748
- end || begin
749
- @scanner.pos = p0
750
- false
751
- end
752
- end ||
753
- begin
754
- p0 = @scanner.pos
755
- begin
756
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
757
- @scanner.scan(/(?>UPPER)(?>(?![[:alnum:]_]))/)
758
- end || begin
759
- @scanner.pos = p0
760
- false
761
- end
762
- end ||
763
- begin
764
- p0 = @scanner.pos
765
- begin
766
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
767
- @scanner.scan(/(?>XDIGIT)(?>(?![[:alnum:]_]))/)
768
- end || begin
769
- @scanner.pos = p0
770
- false
771
- end
772
- end ||
773
- begin
774
- p0 = @scanner.pos
775
- begin
776
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
777
- @scanner.scan(/(?>WORD)(?>(?![[:alnum:]_]))/)
778
- end || begin
779
- @scanner.pos = p0
780
- false
781
- end
782
- end
783
- end
784
-
785
- # @private
786
- def match_literal #:nodoc:
787
- p0 = @scanner.pos
788
- begin
789
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
790
- @scanner.scan(/(["'])(?:\\.|(?:(?!\1).))*\1/)
791
- end || begin
792
- @scanner.pos = p0
793
- false
794
- end
795
- end
796
-
797
- # @private
798
- def match_word_literal #:nodoc:
799
- p0 = @scanner.pos
800
- begin
801
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
802
- @scanner.scan(/(?>`)(?>(?>(?>\\)(?>.)|[^`])*)(?>`)/)
803
- end || begin
804
- @scanner.pos = p0
805
- false
806
- end
807
- end
808
-
809
- # @private
810
- def match_class #:nodoc:
811
- p0 = @scanner.pos
812
- begin
813
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
814
- begin
815
- p1 = @scanner.pos
816
- begin
817
- @scanner.skip(/\[/) &&
818
- begin
819
- r = false
820
- while begin
821
- p2 = @scanner.pos
822
- begin
823
- @scanner.skip(/(?!\])/) &&
824
- match(:range) &&
825
- true
826
- end || begin
827
- @scanner.pos = p2
828
- false
829
- end
830
- end
831
- r = true
832
- end
833
- r
834
- end &&
835
- @scanner.skip(/\]/) &&
836
- @scanner.string[p1...(@scanner.pos)]
837
- end || begin
838
- @scanner.pos = p1
839
- false
840
- end
841
- end
842
- end || begin
843
- @scanner.pos = p0
844
- false
845
- end
846
- end
847
-
848
- # @private
849
- def match_regexp #:nodoc:
850
- p0 = @scanner.pos
851
- begin
852
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
853
- @scanner.scan(/\/(?:\\.|[^\/])+\/(?:[iomx]+(?!\w))?/)
854
- end || begin
855
- @scanner.pos = p0
856
- false
857
- end
858
- end
859
-
860
- # @private
861
- def match_name #:nodoc:
862
- match(:var_name) ||
863
- match(:constant)
864
- end
865
-
866
- # @private
867
- def match_identifier #:nodoc:
868
- p0 = @scanner.pos
869
- begin
870
- begin
871
- p1 = @scanner.pos
872
- r = !begin
873
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
874
- @scanner.skip(/(?>EOF)(?>(?![[:alnum:]_]))/)
875
- end
876
- @scanner.pos = p1
877
- r
878
- end &&
879
- begin
880
- p1 = @scanner.pos
881
- begin
882
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
883
- @scanner.scan(/(?>[[:alnum:]_])+/)
884
- end || begin
885
- @scanner.pos = p1
886
- false
887
- end
888
- end
889
- end || begin
890
- @scanner.pos = p0
891
- false
892
- end
893
- end
894
-
895
- # @private
896
- def match_var_name #:nodoc:
897
- p0 = @scanner.pos
898
- begin
899
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
900
- @scanner.scan(/(?>[[:lower:]])(?>(?>[[:alnum:]_])*)/)
901
- end || begin
902
- @scanner.pos = p0
903
- false
904
- end
905
- end
906
-
907
- # @private
908
- def match_constant #:nodoc:
909
- p0 = @scanner.pos
910
- begin
911
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
912
- begin
913
- p1 = @scanner.pos
914
- begin
915
- begin
916
- while begin
917
- p2 = @scanner.pos
918
- begin
919
- match(:const_name) &&
920
- @scanner.skip(/::/) &&
921
- true
922
- end || begin
923
- @scanner.pos = p2
924
- false
925
- end
926
- end; end
927
- true
928
- end &&
929
- match(:const_name) &&
930
- @scanner.string[p1...(@scanner.pos)]
931
- end || begin
932
- @scanner.pos = p1
933
- false
934
- end
935
- end
936
- end || begin
937
- @scanner.pos = p0
938
- false
939
- end
940
- end
941
-
942
- # @private
943
- def match_const_name #:nodoc:
944
- p0 = @scanner.pos
945
- begin
946
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
947
- @scanner.scan(/(?>[[:upper:]])(?>(?>[[:alnum:]_])*)/)
948
- end || begin
949
- @scanner.pos = p0
950
- false
951
- end
952
- end
953
-
954
- # @private
955
- def match_range #:nodoc:
956
- begin
957
- p0 = @scanner.pos
958
- begin
959
- @scanner.skip(/\[:/) &&
960
- match(:posix_name) &&
961
- @scanner.skip(/:\]/) &&
962
- @scanner.string[p0...(@scanner.pos)]
963
- end || begin
964
- @scanner.pos = p0
965
- false
966
- end
967
- end ||
968
- begin
969
- p0 = @scanner.pos
970
- begin
971
- match(:class_char) &&
972
- begin
973
- begin
974
- p1 = @scanner.pos
975
- begin
976
- @scanner.skip(/\-/) &&
977
- match(:class_char) &&
978
- true
979
- end || begin
980
- @scanner.pos = p1
981
- false
982
- end
983
- end
984
- true
985
- end &&
986
- @scanner.string[p0...(@scanner.pos)]
987
- end || begin
988
- @scanner.pos = p0
989
- false
990
- end
991
- end
992
- end
993
-
994
- # @private
995
- def match_posix_name #:nodoc:
996
- @scanner.scan(/(?>alnum)(?>(?![[:alnum:]_]))/) ||
997
- @scanner.scan(/(?>alpha)(?>(?![[:alnum:]_]))/) ||
998
- @scanner.scan(/(?>ascii)(?>(?![[:alnum:]_]))/) ||
999
- @scanner.scan(/(?>blank)(?>(?![[:alnum:]_]))/) ||
1000
- @scanner.scan(/(?>cntrl)(?>(?![[:alnum:]_]))/) ||
1001
- @scanner.scan(/(?>digit)(?>(?![[:alnum:]_]))/) ||
1002
- @scanner.scan(/(?>graph)(?>(?![[:alnum:]_]))/) ||
1003
- @scanner.scan(/(?>lower)(?>(?![[:alnum:]_]))/) ||
1004
- @scanner.scan(/(?>print)(?>(?![[:alnum:]_]))/) ||
1005
- @scanner.scan(/(?>punct)(?>(?![[:alnum:]_]))/) ||
1006
- @scanner.scan(/(?>space)(?>(?![[:alnum:]_]))/) ||
1007
- @scanner.scan(/(?>upper)(?>(?![[:alnum:]_]))/) ||
1008
- @scanner.scan(/(?>xdigit)(?>(?![[:alnum:]_]))/) ||
1009
- @scanner.scan(/(?>word)(?>(?![[:alnum:]_]))/)
1010
- end
1011
-
1012
- # @private
1013
- def match_class_char #:nodoc:
1014
- @scanner.scan(/(?>\\)(?>[0-3])(?>[0-7])(?>[0-7])|(?>\\x)(?>[[:xdigit:]])(?>[[:xdigit:]])|(?>\\)(?>.)|[^\\\]]/)
1015
- end
1016
-
1017
- # @private
1018
- def match_eol #:nodoc:
1019
- p0 = @scanner.pos
1020
- begin
1021
- @scanner.skip(/(?>[[:blank:]])*/) &&
1022
- begin
1023
- @scanner.eos? ||
1024
- @scanner.skip(/;|(?>(?>\r)?)(?>\n)|(?>\#)(?>(?>[^\n])*)/)
1025
- end &&
1026
- true
1027
- end || begin
1028
- @scanner.pos = p0
1029
- false
1030
- end
1031
- end
1032
-
1033
- end
1034
- end
1035
- end
1
+ require 'rattler/grammar'
2
+
3
+ module Rattler
4
+ module Grammar
5
+ # @private
6
+ module Metagrammar #:nodoc:
7
+
8
+ include Rattler::Parsers
9
+
10
+ # @private
11
+ def start_rule #:nodoc:
12
+ :grammar
13
+ end
14
+
15
+ # @private
16
+ def match_grammar #:nodoc:
17
+ p0 = @scanner.pos
18
+ begin
19
+ (r0_0 = match(:heading)) &&
20
+ (r0_1 = match(:rules)) &&
21
+ begin
22
+ p1 = @scanner.pos
23
+ begin
24
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
25
+ @scanner.eos? &&
26
+ true
27
+ end || begin
28
+ @scanner.pos = p1
29
+ false
30
+ end
31
+ end &&
32
+ Grammar.parsed(select_captures([r0_0, r0_1]))
33
+ end || begin
34
+ @scanner.pos = p0
35
+ false
36
+ end
37
+ end
38
+
39
+ # @private
40
+ def match_heading #:nodoc:
41
+ p0 = @scanner.pos
42
+ begin
43
+ (r0_0 = match(:requires)) &&
44
+ (r0_1 = ((r = match(:module_decl)) ? [r] : [])) &&
45
+ (r0_2 = match(:includes)) &&
46
+ (heading *[r0_0, r0_1, r0_2])
47
+ end || begin
48
+ @scanner.pos = p0
49
+ false
50
+ end
51
+ end
52
+
53
+ # @private
54
+ def match_requires #:nodoc:
55
+ a0 = []
56
+ while r = begin
57
+ p0 = @scanner.pos
58
+ begin
59
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>require)(?>(?![[:alnum:]_])))/) &&
60
+ (r0_0 = match(:literal)) &&
61
+ match(:eol) &&
62
+ r0_0
63
+ end || begin
64
+ @scanner.pos = p0
65
+ false
66
+ end
67
+ end
68
+ a0 << r
69
+ end
70
+ ({ :requires => select_captures(a0) })
71
+ end
72
+
73
+ # @private
74
+ def match_module_decl #:nodoc:
75
+ begin
76
+ p0 = @scanner.pos
77
+ begin
78
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>parser)(?>(?![[:alnum:]_])))/) &&
79
+ (r0_0 = match(:constant)) &&
80
+ (r0_1 = ((r = begin
81
+ p1 = @scanner.pos
82
+ begin
83
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><)/) &&
84
+ match(:constant)
85
+ end || begin
86
+ @scanner.pos = p1
87
+ false
88
+ end
89
+ end) ? [r] : [])) &&
90
+ match(:eol) &&
91
+ (parser_decl *[r0_0, r0_1])
92
+ end || begin
93
+ @scanner.pos = p0
94
+ false
95
+ end
96
+ end ||
97
+ begin
98
+ p0 = @scanner.pos
99
+ begin
100
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>grammar)(?>(?![[:alnum:]_])))/) &&
101
+ (r0_0 = match(:constant)) &&
102
+ match(:eol) &&
103
+ ({ :grammar_name => r0_0 })
104
+ end || begin
105
+ @scanner.pos = p0
106
+ false
107
+ end
108
+ end
109
+ end
110
+
111
+ # @private
112
+ def match_includes #:nodoc:
113
+ a0 = []
114
+ while r = begin
115
+ p0 = @scanner.pos
116
+ begin
117
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>include)(?>(?![[:alnum:]_])))/) &&
118
+ (r0_0 = match(:constant)) &&
119
+ match(:eol) &&
120
+ r0_0
121
+ end || begin
122
+ @scanner.pos = p0
123
+ false
124
+ end
125
+ end
126
+ a0 << r
127
+ end
128
+ ({ :includes => select_captures(a0) })
129
+ end
130
+
131
+ # @private
132
+ def match_rules #:nodoc:
133
+ a0 = []
134
+ while r = begin
135
+ match(:directive) ||
136
+ match(:rule) ||
137
+ match(:block_close)
138
+ end
139
+ a0 << r
140
+ end
141
+ Rules.parsed(select_captures(a0)) unless a0.empty?
142
+ end
143
+
144
+ # @private
145
+ def match_directive #:nodoc:
146
+ match(:ws_directive) ||
147
+ match(:wc_directive)
148
+ end
149
+
150
+ # @private
151
+ def match_ws_directive #:nodoc:
152
+ begin
153
+ p0 = @scanner.pos
154
+ begin
155
+ (r0_0 = match(:ws_decl)) &&
156
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{)/) &&
157
+ (start_ws r0_0)
158
+ end || begin
159
+ @scanner.pos = p0
160
+ false
161
+ end
162
+ end ||
163
+ ((r = match(:ws_decl)) && (set_ws r))
164
+ end
165
+
166
+ # @private
167
+ def match_ws_decl #:nodoc:
168
+ p0 = @scanner.pos
169
+ begin
170
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%whitespace)(?>(?![[:alnum:]_])))/) &&
171
+ match(:unattributed)
172
+ end || begin
173
+ @scanner.pos = p0
174
+ false
175
+ end
176
+ end
177
+
178
+ # @private
179
+ def match_wc_directive #:nodoc:
180
+ begin
181
+ p0 = @scanner.pos
182
+ begin
183
+ (r0_0 = match(:wc_decl)) &&
184
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{)/) &&
185
+ (start_wc r0_0)
186
+ end || begin
187
+ @scanner.pos = p0
188
+ false
189
+ end
190
+ end ||
191
+ ((r = match(:wc_decl)) && (set_wc r))
192
+ end
193
+
194
+ # @private
195
+ def match_wc_decl #:nodoc:
196
+ p0 = @scanner.pos
197
+ begin
198
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%word_character)(?>(?![[:alnum:]_])))/) &&
199
+ match(:unattributed)
200
+ end || begin
201
+ @scanner.pos = p0
202
+ false
203
+ end
204
+ end
205
+
206
+ # @private
207
+ def match_block_close #:nodoc:
208
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\})/) &&
209
+ (end_block)
210
+ end
211
+
212
+ # @private
213
+ def match_rule #:nodoc:
214
+ p0 = @scanner.pos
215
+ begin
216
+ (r0_0 = match(:identifier)) &&
217
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><\-)/) &&
218
+ (r0_1 = match(:expression)) &&
219
+ (rule *[r0_0, r0_1])
220
+ end || begin
221
+ @scanner.pos = p0
222
+ false
223
+ end
224
+ end
225
+
226
+ # @private
227
+ def match_unattributed #:nodoc:
228
+ begin
229
+ p0 = @scanner.pos
230
+ begin
231
+ (r0_0 = match(:unattributed)) &&
232
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\|)/) &&
233
+ (r0_1 = match(:terms)) &&
234
+ Choice.parsed(select_captures([r0_0, r0_1]))
235
+ end || begin
236
+ @scanner.pos = p0
237
+ false
238
+ end
239
+ end ||
240
+ match(:terms)
241
+ end
242
+
243
+ # @private
244
+ def match_expression #:nodoc:
245
+ begin
246
+ p0 = @scanner.pos
247
+ begin
248
+ (r0_0 = match(:expression)) &&
249
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\|)/) &&
250
+ (r0_1 = match(:attributed)) &&
251
+ Choice.parsed(select_captures([r0_0, r0_1]))
252
+ end || begin
253
+ @scanner.pos = p0
254
+ false
255
+ end
256
+ end ||
257
+ match(:attributed)
258
+ end
259
+
260
+ # @private
261
+ def match_attributed #:nodoc:
262
+ begin
263
+ p0 = @scanner.pos
264
+ begin
265
+ (r0_0 = match(:attributed)) &&
266
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><)/) &&
267
+ (r0_1 = ((r = match(:dispatch)) ? [r] : [])) &&
268
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>>)/) &&
269
+ DispatchAction.parsed(select_captures([r0_0, r0_1]))
270
+ end || begin
271
+ @scanner.pos = p0
272
+ false
273
+ end
274
+ end ||
275
+ begin
276
+ p0 = @scanner.pos
277
+ begin
278
+ (r0_0 = match(:attributed)) &&
279
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{)/) &&
280
+ (r0_1 = match(:action)) &&
281
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\})/) &&
282
+ DirectAction.parsed(select_captures([r0_0, r0_1]))
283
+ end || begin
284
+ @scanner.pos = p0
285
+ false
286
+ end
287
+ end ||
288
+ match(:terms)
289
+ end
290
+
291
+ # @private
292
+ def match_dispatch #:nodoc:
293
+ p0 = @scanner.pos
294
+ begin
295
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
296
+ begin
297
+ p1 = @scanner.pos
298
+ begin
299
+ match(:name) &&
300
+ begin
301
+ begin
302
+ p2 = @scanner.pos
303
+ begin
304
+ @scanner.skip(/\./) &&
305
+ match(:var_name) &&
306
+ true
307
+ end || begin
308
+ @scanner.pos = p2
309
+ false
310
+ end
311
+ end
312
+ true
313
+ end &&
314
+ @scanner.string[p1...(@scanner.pos)]
315
+ end || begin
316
+ @scanner.pos = p1
317
+ false
318
+ end
319
+ end
320
+ end || begin
321
+ @scanner.pos = p0
322
+ false
323
+ end
324
+ end
325
+
326
+ # @private
327
+ def match_action #:nodoc:
328
+ p0 = @scanner.pos
329
+ begin
330
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
331
+ @scanner.scan(/(?>(?>\{)(?>(?>[^}])*)(?>\})|[^{}])*/)
332
+ end || begin
333
+ @scanner.pos = p0
334
+ false
335
+ end
336
+ end
337
+
338
+ # @private
339
+ def match_terms #:nodoc:
340
+ begin
341
+ p0 = @scanner.pos
342
+ begin
343
+ (r0_0 = match(:terms)) &&
344
+ (r0_1 = match(:term)) &&
345
+ Sequence.parsed(select_captures([r0_0, r0_1]))
346
+ end || begin
347
+ @scanner.pos = p0
348
+ false
349
+ end
350
+ end ||
351
+ match(:term)
352
+ end
353
+
354
+ # @private
355
+ def match_term #:nodoc:
356
+ match(:fail_expr) ||
357
+ match(:labeled) ||
358
+ match(:labelable)
359
+ end
360
+
361
+ # @private
362
+ def match_fail_expr #:nodoc:
363
+ p0 = @scanner.pos
364
+ begin
365
+ (r0_0 = begin
366
+ begin
367
+ p1 = @scanner.pos
368
+ begin
369
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
370
+ @scanner.scan(/(?>fail)(?>(?![[:alnum:]_]))/)
371
+ end || begin
372
+ @scanner.pos = p1
373
+ false
374
+ end
375
+ end ||
376
+ begin
377
+ p1 = @scanner.pos
378
+ begin
379
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
380
+ @scanner.scan(/(?>fail_rule)(?>(?![[:alnum:]_]))/)
381
+ end || begin
382
+ @scanner.pos = p1
383
+ false
384
+ end
385
+ end ||
386
+ begin
387
+ p1 = @scanner.pos
388
+ begin
389
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
390
+ @scanner.scan(/(?>fail_parse)(?>(?![[:alnum:]_]))/)
391
+ end || begin
392
+ @scanner.pos = p1
393
+ false
394
+ end
395
+ end
396
+ end) &&
397
+ (r0_1 = match(:fail_arg)) &&
398
+ Fail.parsed(select_captures([r0_0, r0_1]))
399
+ end || begin
400
+ @scanner.pos = p0
401
+ false
402
+ end
403
+ end
404
+
405
+ # @private
406
+ def match_fail_arg #:nodoc:
407
+ begin
408
+ p0 = @scanner.pos
409
+ begin
410
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\()/) &&
411
+ (r0_0 = match(:literal)) &&
412
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\))/) &&
413
+ r0_0
414
+ end || begin
415
+ @scanner.pos = p0
416
+ false
417
+ end
418
+ end ||
419
+ match(:literal)
420
+ end
421
+
422
+ # @private
423
+ def match_labeled #:nodoc:
424
+ p0 = @scanner.pos
425
+ begin
426
+ (r0_0 = match(:var_name)) &&
427
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>:)/) &&
428
+ (r0_1 = match(:labelable)) &&
429
+ Label.parsed(select_captures([r0_0, r0_1]))
430
+ end || begin
431
+ @scanner.pos = p0
432
+ false
433
+ end
434
+ end
435
+
436
+ # @private
437
+ def match_labelable #:nodoc:
438
+ match(:list) ||
439
+ match(:list_term)
440
+ end
441
+
442
+ # @private
443
+ def match_list #:nodoc:
444
+ begin
445
+ p0 = @scanner.pos
446
+ begin
447
+ (r0_0 = match(:list_term)) &&
448
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\*\^)/) &&
449
+ (r0_1 = match(:list_term)) &&
450
+ List.parsed(select_captures([r0_0, r0_1]))
451
+ end || begin
452
+ @scanner.pos = p0
453
+ false
454
+ end
455
+ end ||
456
+ begin
457
+ p0 = @scanner.pos
458
+ begin
459
+ (r0_0 = match(:list_term)) &&
460
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\+\^)/) &&
461
+ (r0_1 = match(:list_term)) &&
462
+ List1.parsed(select_captures([r0_0, r0_1]))
463
+ end || begin
464
+ @scanner.pos = p0
465
+ false
466
+ end
467
+ end
468
+ end
469
+
470
+ # @private
471
+ def match_list_term #:nodoc:
472
+ match(:prefixed) ||
473
+ match(:prefixable)
474
+ end
475
+
476
+ # @private
477
+ def match_prefixed #:nodoc:
478
+ begin
479
+ p0 = @scanner.pos
480
+ begin
481
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>&)/) &&
482
+ (r0_0 = match(:prefixable)) &&
483
+ Assert.parsed(select_captures([r0_0]))
484
+ end || begin
485
+ @scanner.pos = p0
486
+ false
487
+ end
488
+ end ||
489
+ begin
490
+ p0 = @scanner.pos
491
+ begin
492
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>!)/) &&
493
+ (r0_0 = match(:prefixable)) &&
494
+ Disallow.parsed(select_captures([r0_0]))
495
+ end || begin
496
+ @scanner.pos = p0
497
+ false
498
+ end
499
+ end ||
500
+ begin
501
+ p0 = @scanner.pos
502
+ begin
503
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>~)/) &&
504
+ (r0_0 = match(:prefixable)) &&
505
+ Skip.parsed(select_captures([r0_0]))
506
+ end || begin
507
+ @scanner.pos = p0
508
+ false
509
+ end
510
+ end ||
511
+ begin
512
+ p0 = @scanner.pos
513
+ begin
514
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>@)/) &&
515
+ (r0_0 = match(:prefixable)) &&
516
+ Token.parsed(select_captures([r0_0]))
517
+ end || begin
518
+ @scanner.pos = p0
519
+ false
520
+ end
521
+ end
522
+ end
523
+
524
+ # @private
525
+ def match_prefixable #:nodoc:
526
+ match(:suffixed) ||
527
+ match(:primary)
528
+ end
529
+
530
+ # @private
531
+ def match_suffixed #:nodoc:
532
+ begin
533
+ p0 = @scanner.pos
534
+ begin
535
+ (r0_0 = match(:primary)) &&
536
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\?)/) &&
537
+ Optional.parsed(select_captures([r0_0]))
538
+ end || begin
539
+ @scanner.pos = p0
540
+ false
541
+ end
542
+ end ||
543
+ begin
544
+ p0 = @scanner.pos
545
+ begin
546
+ (r0_0 = match(:primary)) &&
547
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\*)/) &&
548
+ begin
549
+ p1 = @scanner.pos
550
+ r = !begin
551
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
552
+ @scanner.skip(/\^/)
553
+ end
554
+ @scanner.pos = p1
555
+ r
556
+ end &&
557
+ ZeroOrMore.parsed(select_captures([r0_0]))
558
+ end || begin
559
+ @scanner.pos = p0
560
+ false
561
+ end
562
+ end ||
563
+ begin
564
+ p0 = @scanner.pos
565
+ begin
566
+ (r0_0 = match(:primary)) &&
567
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\+)/) &&
568
+ begin
569
+ p1 = @scanner.pos
570
+ r = !begin
571
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
572
+ @scanner.skip(/\^/)
573
+ end
574
+ @scanner.pos = p1
575
+ r
576
+ end &&
577
+ OneOrMore.parsed(select_captures([r0_0]))
578
+ end || begin
579
+ @scanner.pos = p0
580
+ false
581
+ end
582
+ end
583
+ end
584
+
585
+ # @private
586
+ def match_primary #:nodoc:
587
+ begin
588
+ p0 = @scanner.pos
589
+ begin
590
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\()/) &&
591
+ (r0_0 = match(:expression)) &&
592
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\))/) &&
593
+ r0_0
594
+ end || begin
595
+ @scanner.pos = p0
596
+ false
597
+ end
598
+ end ||
599
+ match(:atom)
600
+ end
601
+
602
+ # @private
603
+ def match_atom #:nodoc:
604
+ begin
605
+ p0 = @scanner.pos
606
+ begin
607
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
608
+ (r0_0 = @scanner.scan(/(?>EOF)(?>(?![[:alnum:]_]))/)) &&
609
+ Eof.parsed([r0_0])
610
+ end || begin
611
+ @scanner.pos = p0
612
+ false
613
+ end
614
+ end ||
615
+ ((r = match(:posix_class)) && (posix_class r)) ||
616
+ begin
617
+ p0 = @scanner.pos
618
+ begin
619
+ (r0_0 = match(:identifier)) &&
620
+ begin
621
+ p1 = @scanner.pos
622
+ r = !begin
623
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
624
+ @scanner.skip(/<\-/)
625
+ end
626
+ @scanner.pos = p1
627
+ r
628
+ end &&
629
+ Apply.parsed(select_captures([r0_0]))
630
+ end || begin
631
+ @scanner.pos = p0
632
+ false
633
+ end
634
+ end ||
635
+ ((r = match(:literal)) && (literal r)) ||
636
+ ((r = match(:word_literal)) && (word_literal r)) ||
637
+ ((r = match(:class)) && (char_class r)) ||
638
+ ((r = match(:regexp)) && Match.parsed([r])) ||
639
+ begin
640
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.)/) &&
641
+ (Match[/./])
642
+ end
643
+ end
644
+
645
+ # @private
646
+ def match_posix_class #:nodoc:
647
+ begin
648
+ p0 = @scanner.pos
649
+ begin
650
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
651
+ @scanner.scan(/(?>ALNUM)(?>(?![[:alnum:]_]))/)
652
+ end || begin
653
+ @scanner.pos = p0
654
+ false
655
+ end
656
+ end ||
657
+ begin
658
+ p0 = @scanner.pos
659
+ begin
660
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
661
+ @scanner.scan(/(?>ALPHA)(?>(?![[:alnum:]_]))/)
662
+ end || begin
663
+ @scanner.pos = p0
664
+ false
665
+ end
666
+ end ||
667
+ begin
668
+ p0 = @scanner.pos
669
+ begin
670
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
671
+ @scanner.scan(/(?>ASCII)(?>(?![[:alnum:]_]))/)
672
+ end || begin
673
+ @scanner.pos = p0
674
+ false
675
+ end
676
+ end ||
677
+ begin
678
+ p0 = @scanner.pos
679
+ begin
680
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
681
+ @scanner.scan(/(?>BLANK)(?>(?![[:alnum:]_]))/)
682
+ end || begin
683
+ @scanner.pos = p0
684
+ false
685
+ end
686
+ end ||
687
+ begin
688
+ p0 = @scanner.pos
689
+ begin
690
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
691
+ @scanner.scan(/(?>CNTRL)(?>(?![[:alnum:]_]))/)
692
+ end || begin
693
+ @scanner.pos = p0
694
+ false
695
+ end
696
+ end ||
697
+ begin
698
+ p0 = @scanner.pos
699
+ begin
700
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
701
+ @scanner.scan(/(?>DIGIT)(?>(?![[:alnum:]_]))/)
702
+ end || begin
703
+ @scanner.pos = p0
704
+ false
705
+ end
706
+ end ||
707
+ begin
708
+ p0 = @scanner.pos
709
+ begin
710
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
711
+ @scanner.scan(/(?>GRAPH)(?>(?![[:alnum:]_]))/)
712
+ end || begin
713
+ @scanner.pos = p0
714
+ false
715
+ end
716
+ end ||
717
+ begin
718
+ p0 = @scanner.pos
719
+ begin
720
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
721
+ @scanner.scan(/(?>LOWER)(?>(?![[:alnum:]_]))/)
722
+ end || begin
723
+ @scanner.pos = p0
724
+ false
725
+ end
726
+ end ||
727
+ begin
728
+ p0 = @scanner.pos
729
+ begin
730
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
731
+ @scanner.scan(/(?>PRINT)(?>(?![[:alnum:]_]))/)
732
+ end || begin
733
+ @scanner.pos = p0
734
+ false
735
+ end
736
+ end ||
737
+ begin
738
+ p0 = @scanner.pos
739
+ begin
740
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
741
+ @scanner.scan(/(?>PUNCT)(?>(?![[:alnum:]_]))/)
742
+ end || begin
743
+ @scanner.pos = p0
744
+ false
745
+ end
746
+ end ||
747
+ begin
748
+ p0 = @scanner.pos
749
+ begin
750
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
751
+ @scanner.scan(/(?>SPACE)(?>(?![[:alnum:]_]))/)
752
+ end || begin
753
+ @scanner.pos = p0
754
+ false
755
+ end
756
+ end ||
757
+ begin
758
+ p0 = @scanner.pos
759
+ begin
760
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
761
+ @scanner.scan(/(?>UPPER)(?>(?![[:alnum:]_]))/)
762
+ end || begin
763
+ @scanner.pos = p0
764
+ false
765
+ end
766
+ end ||
767
+ begin
768
+ p0 = @scanner.pos
769
+ begin
770
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
771
+ @scanner.scan(/(?>XDIGIT)(?>(?![[:alnum:]_]))/)
772
+ end || begin
773
+ @scanner.pos = p0
774
+ false
775
+ end
776
+ end ||
777
+ begin
778
+ p0 = @scanner.pos
779
+ begin
780
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
781
+ @scanner.scan(/(?>WORD)(?>(?![[:alnum:]_]))/)
782
+ end || begin
783
+ @scanner.pos = p0
784
+ false
785
+ end
786
+ end
787
+ end
788
+
789
+ # @private
790
+ def match_literal #:nodoc:
791
+ p0 = @scanner.pos
792
+ begin
793
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
794
+ @scanner.scan(/(["'])(?:\\.|(?:(?!\1).))*\1/)
795
+ end || begin
796
+ @scanner.pos = p0
797
+ false
798
+ end
799
+ end
800
+
801
+ # @private
802
+ def match_word_literal #:nodoc:
803
+ p0 = @scanner.pos
804
+ begin
805
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
806
+ @scanner.scan(/(?>`)(?>(?>(?>\\)(?>.)|[^`])*)(?>`)/)
807
+ end || begin
808
+ @scanner.pos = p0
809
+ false
810
+ end
811
+ end
812
+
813
+ # @private
814
+ def match_class #:nodoc:
815
+ p0 = @scanner.pos
816
+ begin
817
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
818
+ begin
819
+ p1 = @scanner.pos
820
+ begin
821
+ @scanner.skip(/\[/) &&
822
+ begin
823
+ r = false
824
+ while begin
825
+ p2 = @scanner.pos
826
+ begin
827
+ @scanner.skip(/(?!\])/) &&
828
+ match(:range) &&
829
+ true
830
+ end || begin
831
+ @scanner.pos = p2
832
+ false
833
+ end
834
+ end
835
+ r = true
836
+ end
837
+ r
838
+ end &&
839
+ @scanner.skip(/\]/) &&
840
+ @scanner.string[p1...(@scanner.pos)]
841
+ end || begin
842
+ @scanner.pos = p1
843
+ false
844
+ end
845
+ end
846
+ end || begin
847
+ @scanner.pos = p0
848
+ false
849
+ end
850
+ end
851
+
852
+ # @private
853
+ def match_regexp #:nodoc:
854
+ p0 = @scanner.pos
855
+ begin
856
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
857
+ @scanner.scan(/\/(?:\\.|[^\/])+\/(?:[iomx]+(?!\w))?/)
858
+ end || begin
859
+ @scanner.pos = p0
860
+ false
861
+ end
862
+ end
863
+
864
+ # @private
865
+ def match_name #:nodoc:
866
+ match(:var_name) ||
867
+ match(:constant)
868
+ end
869
+
870
+ # @private
871
+ def match_identifier #:nodoc:
872
+ p0 = @scanner.pos
873
+ begin
874
+ begin
875
+ p1 = @scanner.pos
876
+ r = !begin
877
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
878
+ @scanner.skip(/(?>EOF)(?>(?![[:alnum:]_]))/)
879
+ end
880
+ @scanner.pos = p1
881
+ r
882
+ end &&
883
+ begin
884
+ p1 = @scanner.pos
885
+ begin
886
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
887
+ @scanner.scan(/(?>[[:alnum:]_])+/)
888
+ end || begin
889
+ @scanner.pos = p1
890
+ false
891
+ end
892
+ end
893
+ end || begin
894
+ @scanner.pos = p0
895
+ false
896
+ end
897
+ end
898
+
899
+ # @private
900
+ def match_var_name #:nodoc:
901
+ p0 = @scanner.pos
902
+ begin
903
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
904
+ @scanner.scan(/(?>[[:lower:]])(?>(?>[[:alnum:]_])*)/)
905
+ end || begin
906
+ @scanner.pos = p0
907
+ false
908
+ end
909
+ end
910
+
911
+ # @private
912
+ def match_constant #:nodoc:
913
+ p0 = @scanner.pos
914
+ begin
915
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
916
+ begin
917
+ p1 = @scanner.pos
918
+ begin
919
+ begin
920
+ while begin
921
+ p2 = @scanner.pos
922
+ begin
923
+ match(:const_name) &&
924
+ @scanner.skip(/::/) &&
925
+ true
926
+ end || begin
927
+ @scanner.pos = p2
928
+ false
929
+ end
930
+ end; end
931
+ true
932
+ end &&
933
+ match(:const_name) &&
934
+ @scanner.string[p1...(@scanner.pos)]
935
+ end || begin
936
+ @scanner.pos = p1
937
+ false
938
+ end
939
+ end
940
+ end || begin
941
+ @scanner.pos = p0
942
+ false
943
+ end
944
+ end
945
+
946
+ # @private
947
+ def match_const_name #:nodoc:
948
+ p0 = @scanner.pos
949
+ begin
950
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
951
+ @scanner.scan(/(?>[[:upper:]])(?>(?>[[:alnum:]_])*)/)
952
+ end || begin
953
+ @scanner.pos = p0
954
+ false
955
+ end
956
+ end
957
+
958
+ # @private
959
+ def match_range #:nodoc:
960
+ begin
961
+ p0 = @scanner.pos
962
+ begin
963
+ @scanner.skip(/\[:/) &&
964
+ match(:posix_name) &&
965
+ @scanner.skip(/:\]/) &&
966
+ @scanner.string[p0...(@scanner.pos)]
967
+ end || begin
968
+ @scanner.pos = p0
969
+ false
970
+ end
971
+ end ||
972
+ begin
973
+ p0 = @scanner.pos
974
+ begin
975
+ match(:class_char) &&
976
+ begin
977
+ begin
978
+ p1 = @scanner.pos
979
+ begin
980
+ @scanner.skip(/\-/) &&
981
+ match(:class_char) &&
982
+ true
983
+ end || begin
984
+ @scanner.pos = p1
985
+ false
986
+ end
987
+ end
988
+ true
989
+ end &&
990
+ @scanner.string[p0...(@scanner.pos)]
991
+ end || begin
992
+ @scanner.pos = p0
993
+ false
994
+ end
995
+ end
996
+ end
997
+
998
+ # @private
999
+ def match_posix_name #:nodoc:
1000
+ @scanner.scan(/(?>alnum)(?>(?![[:alnum:]_]))/) ||
1001
+ @scanner.scan(/(?>alpha)(?>(?![[:alnum:]_]))/) ||
1002
+ @scanner.scan(/(?>ascii)(?>(?![[:alnum:]_]))/) ||
1003
+ @scanner.scan(/(?>blank)(?>(?![[:alnum:]_]))/) ||
1004
+ @scanner.scan(/(?>cntrl)(?>(?![[:alnum:]_]))/) ||
1005
+ @scanner.scan(/(?>digit)(?>(?![[:alnum:]_]))/) ||
1006
+ @scanner.scan(/(?>graph)(?>(?![[:alnum:]_]))/) ||
1007
+ @scanner.scan(/(?>lower)(?>(?![[:alnum:]_]))/) ||
1008
+ @scanner.scan(/(?>print)(?>(?![[:alnum:]_]))/) ||
1009
+ @scanner.scan(/(?>punct)(?>(?![[:alnum:]_]))/) ||
1010
+ @scanner.scan(/(?>space)(?>(?![[:alnum:]_]))/) ||
1011
+ @scanner.scan(/(?>upper)(?>(?![[:alnum:]_]))/) ||
1012
+ @scanner.scan(/(?>xdigit)(?>(?![[:alnum:]_]))/) ||
1013
+ @scanner.scan(/(?>word)(?>(?![[:alnum:]_]))/)
1014
+ end
1015
+
1016
+ # @private
1017
+ def match_class_char #:nodoc:
1018
+ @scanner.scan(/(?>\\)(?>[0-3])(?>[0-7])(?>[0-7])|(?>\\x)(?>[[:xdigit:]])(?>[[:xdigit:]])|(?>\\)(?>.)|[^\\\]]/)
1019
+ end
1020
+
1021
+ # @private
1022
+ def match_eol #:nodoc:
1023
+ p0 = @scanner.pos
1024
+ begin
1025
+ @scanner.skip(/(?>[[:blank:]])*/) &&
1026
+ begin
1027
+ @scanner.eos? ||
1028
+ @scanner.skip(/;|(?>(?>\r)?)(?>\n)|(?>\#)(?>(?>[^\n])*)/)
1029
+ end &&
1030
+ true
1031
+ end || begin
1032
+ @scanner.pos = p0
1033
+ false
1034
+ end
1035
+ end
1036
+
1037
+ end
1038
+ end
1039
+ end