treetop 1.3.0 → 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,6 @@
1
+ # Autogenerated from a Treetop grammar. Edits may be lost.
2
+
3
+
1
4
  module Treetop
2
5
  module Compiler
3
6
  module Metagrammar
@@ -64,7 +67,7 @@ module Treetop
64
67
  r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
65
68
  r2.extend(TreetopFile0)
66
69
  else
67
- self.index = i2
70
+ @index = i2
68
71
  r2 = nil
69
72
  end
70
73
  if r2
@@ -93,7 +96,7 @@ module Treetop
93
96
  if r10
94
97
  r8 = r10
95
98
  else
96
- self.index = i8
99
+ @index = i8
97
100
  r8 = nil
98
101
  end
99
102
  end
@@ -114,13 +117,13 @@ module Treetop
114
117
  r0.extend(TreetopFile1)
115
118
  r0.extend(TreetopFile2)
116
119
  else
117
- self.index = i0
120
+ @index = i0
118
121
  r0 = nil
119
122
  end
120
123
 
121
124
  node_cache[:treetop_file][start_index] = r0
122
125
 
123
- return r0
126
+ r0
124
127
  end
125
128
 
126
129
  module RequireStatement0
@@ -147,7 +150,7 @@ module Treetop
147
150
  end
148
151
  s0 << r1
149
152
  if r1
150
- if input.index("require", index) == index
153
+ if has_terminal?("require", false, index)
151
154
  r3 = instantiate_node(SyntaxNode,input, index...(index + 7))
152
155
  @index += 7
153
156
  else
@@ -158,9 +161,10 @@ module Treetop
158
161
  if r3
159
162
  s4, i4 = [], index
160
163
  loop do
161
- if input.index(Regexp.new('[ \\t]'), index) == index
162
- r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
163
- @index += 1
164
+ if has_terminal?('\G[ \\t]', true, index)
165
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
166
+ r5 = true
167
+ @index = next_character
164
168
  else
165
169
  r5 = nil
166
170
  end
@@ -171,7 +175,7 @@ module Treetop
171
175
  end
172
176
  end
173
177
  if s4.empty?
174
- self.index = i4
178
+ @index = i4
175
179
  r4 = nil
176
180
  else
177
181
  r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
@@ -180,9 +184,10 @@ module Treetop
180
184
  if r4
181
185
  s6, i6 = [], index
182
186
  loop do
183
- if input.index(Regexp.new('[^\\n\\r]'), index) == index
184
- r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
185
- @index += 1
187
+ if has_terminal?('\G[^\\n\\r]', true, index)
188
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
189
+ r7 = true
190
+ @index = next_character
186
191
  else
187
192
  r7 = nil
188
193
  end
@@ -193,16 +198,17 @@ module Treetop
193
198
  end
194
199
  end
195
200
  if s6.empty?
196
- self.index = i6
201
+ @index = i6
197
202
  r6 = nil
198
203
  else
199
204
  r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
200
205
  end
201
206
  s0 << r6
202
207
  if r6
203
- if input.index(Regexp.new('[\\n\\r]'), index) == index
204
- r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
205
- @index += 1
208
+ if has_terminal?('\G[\\n\\r]', true, index)
209
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
210
+ r8 = true
211
+ @index = next_character
206
212
  else
207
213
  r8 = nil
208
214
  end
@@ -215,21 +221,21 @@ module Treetop
215
221
  r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
216
222
  r0.extend(RequireStatement0)
217
223
  else
218
- self.index = i0
224
+ @index = i0
219
225
  r0 = nil
220
226
  end
221
227
 
222
228
  node_cache[:require_statement][start_index] = r0
223
229
 
224
- return r0
230
+ r0
225
231
  end
226
232
 
227
233
  module ModuleDeclaration0
228
- def space
234
+ def space1
229
235
  elements[1]
230
236
  end
231
237
 
232
- def space
238
+ def space2
233
239
  elements[4]
234
240
  end
235
241
  end
@@ -271,7 +277,7 @@ module Treetop
271
277
 
272
278
  i0, s0 = index, []
273
279
  i1, s1 = index, []
274
- if input.index('module', index) == index
280
+ if has_terminal?('module', false, index)
275
281
  r2 = instantiate_node(SyntaxNode,input, index...(index + 6))
276
282
  @index += 6
277
283
  else
@@ -283,9 +289,10 @@ module Treetop
283
289
  r3 = _nt_space
284
290
  s1 << r3
285
291
  if r3
286
- if input.index(Regexp.new('[A-Z]'), index) == index
287
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
288
- @index += 1
292
+ if has_terminal?('\G[A-Z]', true, index)
293
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
294
+ r4 = true
295
+ @index = next_character
289
296
  else
290
297
  r4 = nil
291
298
  end
@@ -313,7 +320,7 @@ module Treetop
313
320
  r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
314
321
  r1.extend(ModuleDeclaration0)
315
322
  else
316
- self.index = i1
323
+ @index = i1
317
324
  r1 = nil
318
325
  end
319
326
  s0 << r1
@@ -327,7 +334,7 @@ module Treetop
327
334
  if r10
328
335
  r8 = r10
329
336
  else
330
- self.index = i8
337
+ @index = i8
331
338
  r8 = nil
332
339
  end
333
340
  end
@@ -337,7 +344,7 @@ module Treetop
337
344
  r12 = _nt_space
338
345
  s11 << r12
339
346
  if r12
340
- if input.index('end', index) == index
347
+ if has_terminal?('end', false, index)
341
348
  r13 = instantiate_node(SyntaxNode,input, index...(index + 3))
342
349
  @index += 3
343
350
  else
@@ -350,7 +357,7 @@ module Treetop
350
357
  r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
351
358
  r11.extend(ModuleDeclaration1)
352
359
  else
353
- self.index = i11
360
+ @index = i11
354
361
  r11 = nil
355
362
  end
356
363
  s0 << r11
@@ -361,13 +368,13 @@ module Treetop
361
368
  r0.extend(ModuleDeclaration2)
362
369
  r0.extend(ModuleDeclaration3)
363
370
  else
364
- self.index = i0
371
+ @index = i0
365
372
  r0 = nil
366
373
  end
367
374
 
368
375
  node_cache[:module_declaration][start_index] = r0
369
376
 
370
- return r0
377
+ r0
371
378
  end
372
379
 
373
380
  module Grammar0
@@ -377,7 +384,7 @@ module Treetop
377
384
  end
378
385
 
379
386
  module Grammar1
380
- def space
387
+ def space1
381
388
  elements[1]
382
389
  end
383
390
 
@@ -385,7 +392,7 @@ module Treetop
385
392
  elements[2]
386
393
  end
387
394
 
388
- def space
395
+ def space2
389
396
  elements[3]
390
397
  end
391
398
 
@@ -404,7 +411,7 @@ module Treetop
404
411
  end
405
412
 
406
413
  i0, s0 = index, []
407
- if input.index('grammar', index) == index
414
+ if has_terminal?('grammar', false, index)
408
415
  r1 = instantiate_node(SyntaxNode,input, index...(index + 7))
409
416
  @index += 7
410
417
  else
@@ -423,7 +430,7 @@ module Treetop
423
430
  s0 << r4
424
431
  if r4
425
432
  i6, s6 = index, []
426
- if input.index('do', index) == index
433
+ if has_terminal?('do', false, index)
427
434
  r7 = instantiate_node(SyntaxNode,input, index...(index + 2))
428
435
  @index += 2
429
436
  else
@@ -439,7 +446,7 @@ module Treetop
439
446
  r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
440
447
  r6.extend(Grammar0)
441
448
  else
442
- self.index = i6
449
+ @index = i6
443
450
  r6 = nil
444
451
  end
445
452
  if r6
@@ -460,7 +467,7 @@ module Treetop
460
467
  end
461
468
  s0 << r10
462
469
  if r10
463
- if input.index('end', index) == index
470
+ if has_terminal?('end', false, index)
464
471
  r12 = instantiate_node(SyntaxNode,input, index...(index + 3))
465
472
  @index += 3
466
473
  else
@@ -479,13 +486,13 @@ module Treetop
479
486
  r0 = instantiate_node(Grammar,input, i0...index, s0)
480
487
  r0.extend(Grammar1)
481
488
  else
482
- self.index = i0
489
+ @index = i0
483
490
  r0 = nil
484
491
  end
485
492
 
486
493
  node_cache[:grammar][start_index] = r0
487
494
 
488
- return r0
495
+ r0
489
496
  end
490
497
 
491
498
  module GrammarName0
@@ -500,9 +507,10 @@ module Treetop
500
507
  end
501
508
 
502
509
  i0, s0 = index, []
503
- if input.index(Regexp.new('[A-Z]'), index) == index
504
- r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
505
- @index += 1
510
+ if has_terminal?('\G[A-Z]', true, index)
511
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
512
+ r1 = true
513
+ @index = next_character
506
514
  else
507
515
  r1 = nil
508
516
  end
@@ -524,13 +532,13 @@ module Treetop
524
532
  r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
525
533
  r0.extend(GrammarName0)
526
534
  else
527
- self.index = i0
535
+ @index = i0
528
536
  r0 = nil
529
537
  end
530
538
 
531
539
  node_cache[:grammar_name][start_index] = r0
532
540
 
533
- return r0
541
+ r0
534
542
  end
535
543
 
536
544
  module DeclarationSequence0
@@ -594,7 +602,7 @@ module Treetop
594
602
  r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
595
603
  r4.extend(DeclarationSequence0)
596
604
  else
597
- self.index = i4
605
+ @index = i4
598
606
  r4 = nil
599
607
  end
600
608
  if r4
@@ -611,13 +619,13 @@ module Treetop
611
619
  r1.extend(DeclarationSequence1)
612
620
  r1.extend(DeclarationSequence2)
613
621
  else
614
- self.index = i1
622
+ @index = i1
615
623
  r1 = nil
616
624
  end
617
625
  if r1
618
626
  r0 = r1
619
627
  else
620
- if input.index('', index) == index
628
+ if has_terminal?('', false, index)
621
629
  r7 = instantiate_node(SyntaxNode,input, index...(index + 0))
622
630
  r7.extend(DeclarationSequence3)
623
631
  @index += 0
@@ -628,14 +636,14 @@ module Treetop
628
636
  if r7
629
637
  r0 = r7
630
638
  else
631
- self.index = i0
639
+ @index = i0
632
640
  r0 = nil
633
641
  end
634
642
  end
635
643
 
636
644
  node_cache[:declaration_sequence][start_index] = r0
637
645
 
638
- return r0
646
+ r0
639
647
  end
640
648
 
641
649
  def _nt_declaration
@@ -655,14 +663,14 @@ module Treetop
655
663
  if r2
656
664
  r0 = r2
657
665
  else
658
- self.index = i0
666
+ @index = i0
659
667
  r0 = nil
660
668
  end
661
669
  end
662
670
 
663
671
  node_cache[:declaration][start_index] = r0
664
672
 
665
- return r0
673
+ r0
666
674
  end
667
675
 
668
676
  module IncludeDeclaration0
@@ -687,7 +695,7 @@ module Treetop
687
695
  end
688
696
 
689
697
  i0, s0 = index, []
690
- if input.index('include', index) == index
698
+ if has_terminal?('include', false, index)
691
699
  r1 = instantiate_node(SyntaxNode,input, index...(index + 7))
692
700
  @index += 7
693
701
  else
@@ -699,9 +707,10 @@ module Treetop
699
707
  r2 = _nt_space
700
708
  s0 << r2
701
709
  if r2
702
- if input.index(Regexp.new('[A-Z]'), index) == index
703
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
704
- @index += 1
710
+ if has_terminal?('\G[A-Z]', true, index)
711
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
712
+ r3 = true
713
+ @index = next_character
705
714
  else
706
715
  r3 = nil
707
716
  end
@@ -714,7 +723,7 @@ module Treetop
714
723
  if r6
715
724
  r5 = r6
716
725
  else
717
- if input.index('::', index) == index
726
+ if has_terminal?('::', false, index)
718
727
  r7 = instantiate_node(SyntaxNode,input, index...(index + 2))
719
728
  @index += 2
720
729
  else
@@ -724,7 +733,7 @@ module Treetop
724
733
  if r7
725
734
  r5 = r7
726
735
  else
727
- self.index = i5
736
+ @index = i5
728
737
  r5 = nil
729
738
  end
730
739
  end
@@ -744,13 +753,13 @@ module Treetop
744
753
  r0.extend(IncludeDeclaration0)
745
754
  r0.extend(IncludeDeclaration1)
746
755
  else
747
- self.index = i0
756
+ @index = i0
748
757
  r0 = nil
749
758
  end
750
759
 
751
760
  node_cache[:include_declaration][start_index] = r0
752
761
 
753
- return r0
762
+ r0
754
763
  end
755
764
 
756
765
  module ParsingRule0
@@ -760,7 +769,7 @@ module Treetop
760
769
  end
761
770
 
762
771
  module ParsingRule1
763
- def space
772
+ def space1
764
773
  elements[1]
765
774
  end
766
775
 
@@ -768,7 +777,7 @@ module Treetop
768
777
  elements[2]
769
778
  end
770
779
 
771
- def space
780
+ def space2
772
781
  elements[3]
773
782
  end
774
783
 
@@ -776,7 +785,7 @@ module Treetop
776
785
  elements[5]
777
786
  end
778
787
 
779
- def space
788
+ def space3
780
789
  elements[6]
781
790
  end
782
791
 
@@ -791,7 +800,7 @@ module Treetop
791
800
  end
792
801
 
793
802
  i0, s0 = index, []
794
- if input.index('rule', index) == index
803
+ if has_terminal?('rule', false, index)
795
804
  r1 = instantiate_node(SyntaxNode,input, index...(index + 4))
796
805
  @index += 4
797
806
  else
@@ -810,7 +819,7 @@ module Treetop
810
819
  s0 << r4
811
820
  if r4
812
821
  i6, s6 = index, []
813
- if input.index('do', index) == index
822
+ if has_terminal?('do', false, index)
814
823
  r7 = instantiate_node(SyntaxNode,input, index...(index + 2))
815
824
  @index += 2
816
825
  else
@@ -826,7 +835,7 @@ module Treetop
826
835
  r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
827
836
  r6.extend(ParsingRule0)
828
837
  else
829
- self.index = i6
838
+ @index = i6
830
839
  r6 = nil
831
840
  end
832
841
  if r6
@@ -842,7 +851,7 @@ module Treetop
842
851
  r10 = _nt_space
843
852
  s0 << r10
844
853
  if r10
845
- if input.index('end', index) == index
854
+ if has_terminal?('end', false, index)
846
855
  r11 = instantiate_node(SyntaxNode,input, index...(index + 3))
847
856
  @index += 3
848
857
  else
@@ -861,13 +870,13 @@ module Treetop
861
870
  r0 = instantiate_node(ParsingRule,input, i0...index, s0)
862
871
  r0.extend(ParsingRule1)
863
872
  else
864
- self.index = i0
873
+ @index = i0
865
874
  r0 = nil
866
875
  end
867
876
 
868
877
  node_cache[:parsing_rule][start_index] = r0
869
878
 
870
- return r0
879
+ r0
871
880
  end
872
881
 
873
882
  def _nt_parsing_expression
@@ -891,7 +900,7 @@ module Treetop
891
900
  if r3
892
901
  r0 = r3
893
902
  else
894
- self.index = i0
903
+ @index = i0
895
904
  r0 = nil
896
905
  end
897
906
  end
@@ -899,7 +908,7 @@ module Treetop
899
908
 
900
909
  node_cache[:parsing_expression][start_index] = r0
901
910
 
902
- return r0
911
+ r0
903
912
  end
904
913
 
905
914
  module Choice0
@@ -955,7 +964,7 @@ module Treetop
955
964
  end
956
965
  s3 << r4
957
966
  if r4
958
- if input.index('/', index) == index
967
+ if has_terminal?('/', false, index)
959
968
  r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
960
969
  @index += 1
961
970
  else
@@ -981,7 +990,7 @@ module Treetop
981
990
  r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
982
991
  r3.extend(Choice0)
983
992
  else
984
- self.index = i3
993
+ @index = i3
985
994
  r3 = nil
986
995
  end
987
996
  if r3
@@ -991,7 +1000,7 @@ module Treetop
991
1000
  end
992
1001
  end
993
1002
  if s2.empty?
994
- self.index = i2
1003
+ @index = i2
995
1004
  r2 = nil
996
1005
  else
997
1006
  r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
@@ -1003,13 +1012,13 @@ module Treetop
1003
1012
  r0.extend(Choice1)
1004
1013
  r0.extend(Choice2)
1005
1014
  else
1006
- self.index = i0
1015
+ @index = i0
1007
1016
  r0 = nil
1008
1017
  end
1009
1018
 
1010
1019
  node_cache[:choice][start_index] = r0
1011
1020
 
1012
- return r0
1021
+ r0
1013
1022
  end
1014
1023
 
1015
1024
  module Sequence0
@@ -1081,7 +1090,7 @@ module Treetop
1081
1090
  r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
1082
1091
  r3.extend(Sequence0)
1083
1092
  else
1084
- self.index = i3
1093
+ @index = i3
1085
1094
  r3 = nil
1086
1095
  end
1087
1096
  if r3
@@ -1091,7 +1100,7 @@ module Treetop
1091
1100
  end
1092
1101
  end
1093
1102
  if s2.empty?
1094
- self.index = i2
1103
+ @index = i2
1095
1104
  r2 = nil
1096
1105
  else
1097
1106
  r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
@@ -1107,13 +1116,13 @@ module Treetop
1107
1116
  r0.extend(Sequence1)
1108
1117
  r0.extend(Sequence2)
1109
1118
  else
1110
- self.index = i0
1119
+ @index = i0
1111
1120
  r0 = nil
1112
1121
  end
1113
1122
 
1114
1123
  node_cache[:sequence][start_index] = r0
1115
1124
 
1116
- return r0
1125
+ r0
1117
1126
  end
1118
1127
 
1119
1128
  def _nt_alternative
@@ -1133,14 +1142,14 @@ module Treetop
1133
1142
  if r2
1134
1143
  r0 = r2
1135
1144
  else
1136
- self.index = i0
1145
+ @index = i0
1137
1146
  r0 = nil
1138
1147
  end
1139
1148
  end
1140
1149
 
1141
1150
  node_cache[:alternative][start_index] = r0
1142
1151
 
1143
- return r0
1152
+ r0
1144
1153
  end
1145
1154
 
1146
1155
  module Primary0
@@ -1172,6 +1181,28 @@ module Treetop
1172
1181
  end
1173
1182
 
1174
1183
  module Primary2
1184
+ def prefix
1185
+ elements[0]
1186
+ end
1187
+
1188
+ def predicate_block
1189
+ elements[2]
1190
+ end
1191
+ end
1192
+
1193
+ module Primary3
1194
+ def compile(address, builder, parent_expression=nil)
1195
+ prefix.compile(address, builder, self)
1196
+ end
1197
+ def prefixed_expression
1198
+ predicate_block
1199
+ end
1200
+ def inline_modules
1201
+ []
1202
+ end
1203
+ end
1204
+
1205
+ module Primary4
1175
1206
  def atomic
1176
1207
  elements[0]
1177
1208
  end
@@ -1185,7 +1216,7 @@ module Treetop
1185
1216
  end
1186
1217
  end
1187
1218
 
1188
- module Primary3
1219
+ module Primary5
1189
1220
  def compile(address, builder, parent_expression=nil)
1190
1221
  suffix.compile(address, builder, self)
1191
1222
  end
@@ -1207,7 +1238,7 @@ module Treetop
1207
1238
  end
1208
1239
  end
1209
1240
 
1210
- module Primary4
1241
+ module Primary6
1211
1242
  def atomic
1212
1243
  elements[0]
1213
1244
  end
@@ -1217,7 +1248,7 @@ module Treetop
1217
1248
  end
1218
1249
  end
1219
1250
 
1220
- module Primary5
1251
+ module Primary7
1221
1252
  def compile(address, builder, parent_expression=nil)
1222
1253
  atomic.compile(address, builder, self)
1223
1254
  end
@@ -1256,21 +1287,26 @@ module Treetop
1256
1287
  r1.extend(Primary0)
1257
1288
  r1.extend(Primary1)
1258
1289
  else
1259
- self.index = i1
1290
+ @index = i1
1260
1291
  r1 = nil
1261
1292
  end
1262
1293
  if r1
1263
1294
  r0 = r1
1264
1295
  else
1265
1296
  i4, s4 = index, []
1266
- r5 = _nt_atomic
1297
+ r5 = _nt_prefix
1267
1298
  s4 << r5
1268
1299
  if r5
1269
- r6 = _nt_suffix
1300
+ r7 = _nt_space
1301
+ if r7
1302
+ r6 = r7
1303
+ else
1304
+ r6 = instantiate_node(SyntaxNode,input, index...index)
1305
+ end
1270
1306
  s4 << r6
1271
1307
  if r6
1272
- r7 = _nt_node_class_declarations
1273
- s4 << r7
1308
+ r8 = _nt_predicate_block
1309
+ s4 << r8
1274
1310
  end
1275
1311
  end
1276
1312
  if s4.last
@@ -1278,39 +1314,62 @@ module Treetop
1278
1314
  r4.extend(Primary2)
1279
1315
  r4.extend(Primary3)
1280
1316
  else
1281
- self.index = i4
1317
+ @index = i4
1282
1318
  r4 = nil
1283
1319
  end
1284
1320
  if r4
1285
1321
  r0 = r4
1286
1322
  else
1287
- i8, s8 = index, []
1288
- r9 = _nt_atomic
1289
- s8 << r9
1290
- if r9
1291
- r10 = _nt_node_class_declarations
1292
- s8 << r10
1323
+ i9, s9 = index, []
1324
+ r10 = _nt_atomic
1325
+ s9 << r10
1326
+ if r10
1327
+ r11 = _nt_suffix
1328
+ s9 << r11
1329
+ if r11
1330
+ r12 = _nt_node_class_declarations
1331
+ s9 << r12
1332
+ end
1293
1333
  end
1294
- if s8.last
1295
- r8 = instantiate_node(SyntaxNode,input, i8...index, s8)
1296
- r8.extend(Primary4)
1297
- r8.extend(Primary5)
1334
+ if s9.last
1335
+ r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
1336
+ r9.extend(Primary4)
1337
+ r9.extend(Primary5)
1298
1338
  else
1299
- self.index = i8
1300
- r8 = nil
1339
+ @index = i9
1340
+ r9 = nil
1301
1341
  end
1302
- if r8
1303
- r0 = r8
1342
+ if r9
1343
+ r0 = r9
1304
1344
  else
1305
- self.index = i0
1306
- r0 = nil
1345
+ i13, s13 = index, []
1346
+ r14 = _nt_atomic
1347
+ s13 << r14
1348
+ if r14
1349
+ r15 = _nt_node_class_declarations
1350
+ s13 << r15
1351
+ end
1352
+ if s13.last
1353
+ r13 = instantiate_node(SyntaxNode,input, i13...index, s13)
1354
+ r13.extend(Primary6)
1355
+ r13.extend(Primary7)
1356
+ else
1357
+ @index = i13
1358
+ r13 = nil
1359
+ end
1360
+ if r13
1361
+ r0 = r13
1362
+ else
1363
+ @index = i0
1364
+ r0 = nil
1365
+ end
1307
1366
  end
1308
1367
  end
1309
1368
  end
1310
1369
 
1311
1370
  node_cache[:primary][start_index] = r0
1312
1371
 
1313
- return r0
1372
+ r0
1314
1373
  end
1315
1374
 
1316
1375
  module LabeledSequencePrimary0
@@ -1363,13 +1422,13 @@ module Treetop
1363
1422
  r0.extend(LabeledSequencePrimary0)
1364
1423
  r0.extend(LabeledSequencePrimary1)
1365
1424
  else
1366
- self.index = i0
1425
+ @index = i0
1367
1426
  r0 = nil
1368
1427
  end
1369
1428
 
1370
1429
  node_cache[:labeled_sequence_primary][start_index] = r0
1371
1430
 
1372
- return r0
1431
+ r0
1373
1432
  end
1374
1433
 
1375
1434
  module Label0
@@ -1424,12 +1483,12 @@ module Treetop
1424
1483
  r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
1425
1484
  r2.extend(Label0)
1426
1485
  else
1427
- self.index = i2
1486
+ @index = i2
1428
1487
  r2 = nil
1429
1488
  end
1430
1489
  s1 << r2
1431
1490
  if r2
1432
- if input.index(':', index) == index
1491
+ if has_terminal?(':', false, index)
1433
1492
  r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
1434
1493
  @index += 1
1435
1494
  else
@@ -1443,13 +1502,13 @@ module Treetop
1443
1502
  r1.extend(Label1)
1444
1503
  r1.extend(Label2)
1445
1504
  else
1446
- self.index = i1
1505
+ @index = i1
1447
1506
  r1 = nil
1448
1507
  end
1449
1508
  if r1
1450
1509
  r0 = r1
1451
1510
  else
1452
- if input.index('', index) == index
1511
+ if has_terminal?('', false, index)
1453
1512
  r7 = instantiate_node(SyntaxNode,input, index...(index + 0))
1454
1513
  r7.extend(Label3)
1455
1514
  @index += 0
@@ -1460,14 +1519,14 @@ module Treetop
1460
1519
  if r7
1461
1520
  r0 = r7
1462
1521
  else
1463
- self.index = i0
1522
+ @index = i0
1464
1523
  r0 = nil
1465
1524
  end
1466
1525
  end
1467
1526
 
1468
1527
  node_cache[:label][start_index] = r0
1469
1528
 
1470
- return r0
1529
+ r0
1471
1530
  end
1472
1531
 
1473
1532
  module SequencePrimary0
@@ -1499,6 +1558,28 @@ module Treetop
1499
1558
  end
1500
1559
 
1501
1560
  module SequencePrimary2
1561
+ def prefix
1562
+ elements[0]
1563
+ end
1564
+
1565
+ def predicate_block
1566
+ elements[2]
1567
+ end
1568
+ end
1569
+
1570
+ module SequencePrimary3
1571
+ def compile(address, builder, parent_expression=nil)
1572
+ prefix.compile(address, builder, self)
1573
+ end
1574
+ def prefixed_expression
1575
+ predicate_block
1576
+ end
1577
+ def inline_modules
1578
+ []
1579
+ end
1580
+ end
1581
+
1582
+ module SequencePrimary4
1502
1583
  def atomic
1503
1584
  elements[0]
1504
1585
  end
@@ -1508,7 +1589,7 @@ module Treetop
1508
1589
  end
1509
1590
  end
1510
1591
 
1511
- module SequencePrimary3
1592
+ module SequencePrimary5
1512
1593
  def compile(lexical_address, builder)
1513
1594
  suffix.compile(lexical_address, builder, self)
1514
1595
  end
@@ -1547,43 +1628,71 @@ module Treetop
1547
1628
  r1.extend(SequencePrimary0)
1548
1629
  r1.extend(SequencePrimary1)
1549
1630
  else
1550
- self.index = i1
1631
+ @index = i1
1551
1632
  r1 = nil
1552
1633
  end
1553
1634
  if r1
1554
1635
  r0 = r1
1555
1636
  else
1556
1637
  i4, s4 = index, []
1557
- r5 = _nt_atomic
1638
+ r5 = _nt_prefix
1558
1639
  s4 << r5
1559
1640
  if r5
1560
- r6 = _nt_suffix
1641
+ r7 = _nt_space
1642
+ if r7
1643
+ r6 = r7
1644
+ else
1645
+ r6 = instantiate_node(SyntaxNode,input, index...index)
1646
+ end
1561
1647
  s4 << r6
1648
+ if r6
1649
+ r8 = _nt_predicate_block
1650
+ s4 << r8
1651
+ end
1562
1652
  end
1563
1653
  if s4.last
1564
1654
  r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
1565
1655
  r4.extend(SequencePrimary2)
1566
1656
  r4.extend(SequencePrimary3)
1567
1657
  else
1568
- self.index = i4
1658
+ @index = i4
1569
1659
  r4 = nil
1570
1660
  end
1571
1661
  if r4
1572
1662
  r0 = r4
1573
1663
  else
1574
- r7 = _nt_atomic
1575
- if r7
1576
- r0 = r7
1664
+ i9, s9 = index, []
1665
+ r10 = _nt_atomic
1666
+ s9 << r10
1667
+ if r10
1668
+ r11 = _nt_suffix
1669
+ s9 << r11
1670
+ end
1671
+ if s9.last
1672
+ r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
1673
+ r9.extend(SequencePrimary4)
1674
+ r9.extend(SequencePrimary5)
1577
1675
  else
1578
- self.index = i0
1579
- r0 = nil
1676
+ @index = i9
1677
+ r9 = nil
1678
+ end
1679
+ if r9
1680
+ r0 = r9
1681
+ else
1682
+ r12 = _nt_atomic
1683
+ if r12
1684
+ r0 = r12
1685
+ else
1686
+ @index = i0
1687
+ r0 = nil
1688
+ end
1580
1689
  end
1581
1690
  end
1582
1691
  end
1583
1692
 
1584
1693
  node_cache[:sequence_primary][start_index] = r0
1585
1694
 
1586
- return r0
1695
+ r0
1587
1696
  end
1588
1697
 
1589
1698
  def _nt_suffix
@@ -1603,14 +1712,14 @@ module Treetop
1603
1712
  if r2
1604
1713
  r0 = r2
1605
1714
  else
1606
- self.index = i0
1715
+ @index = i0
1607
1716
  r0 = nil
1608
1717
  end
1609
1718
  end
1610
1719
 
1611
1720
  node_cache[:suffix][start_index] = r0
1612
1721
 
1613
- return r0
1722
+ r0
1614
1723
  end
1615
1724
 
1616
1725
  def _nt_optional_suffix
@@ -1621,7 +1730,7 @@ module Treetop
1621
1730
  return cached
1622
1731
  end
1623
1732
 
1624
- if input.index('?', index) == index
1733
+ if has_terminal?('?', false, index)
1625
1734
  r0 = instantiate_node(Optional,input, index...(index + 1))
1626
1735
  @index += 1
1627
1736
  else
@@ -1631,7 +1740,7 @@ module Treetop
1631
1740
 
1632
1741
  node_cache[:optional_suffix][start_index] = r0
1633
1742
 
1634
- return r0
1743
+ r0
1635
1744
  end
1636
1745
 
1637
1746
  module NodeClassDeclarations0
@@ -1682,13 +1791,13 @@ module Treetop
1682
1791
  r0.extend(NodeClassDeclarations0)
1683
1792
  r0.extend(NodeClassDeclarations1)
1684
1793
  else
1685
- self.index = i0
1794
+ @index = i0
1686
1795
  r0 = nil
1687
1796
  end
1688
1797
 
1689
1798
  node_cache[:node_class_declarations][start_index] = r0
1690
1799
 
1691
- return r0
1800
+ r0
1692
1801
  end
1693
1802
 
1694
1803
  def _nt_repetition_suffix
@@ -1700,7 +1809,7 @@ module Treetop
1700
1809
  end
1701
1810
 
1702
1811
  i0 = index
1703
- if input.index('+', index) == index
1812
+ if has_terminal?('+', false, index)
1704
1813
  r1 = instantiate_node(OneOrMore,input, index...(index + 1))
1705
1814
  @index += 1
1706
1815
  else
@@ -1710,7 +1819,7 @@ module Treetop
1710
1819
  if r1
1711
1820
  r0 = r1
1712
1821
  else
1713
- if input.index('*', index) == index
1822
+ if has_terminal?('*', false, index)
1714
1823
  r2 = instantiate_node(ZeroOrMore,input, index...(index + 1))
1715
1824
  @index += 1
1716
1825
  else
@@ -1720,14 +1829,14 @@ module Treetop
1720
1829
  if r2
1721
1830
  r0 = r2
1722
1831
  else
1723
- self.index = i0
1832
+ @index = i0
1724
1833
  r0 = nil
1725
1834
  end
1726
1835
  end
1727
1836
 
1728
1837
  node_cache[:repetition_suffix][start_index] = r0
1729
1838
 
1730
- return r0
1839
+ r0
1731
1840
  end
1732
1841
 
1733
1842
  def _nt_prefix
@@ -1739,7 +1848,7 @@ module Treetop
1739
1848
  end
1740
1849
 
1741
1850
  i0 = index
1742
- if input.index('&', index) == index
1851
+ if has_terminal?('&', false, index)
1743
1852
  r1 = instantiate_node(AndPredicate,input, index...(index + 1))
1744
1853
  @index += 1
1745
1854
  else
@@ -1749,7 +1858,7 @@ module Treetop
1749
1858
  if r1
1750
1859
  r0 = r1
1751
1860
  else
1752
- if input.index('!', index) == index
1861
+ if has_terminal?('!', false, index)
1753
1862
  r2 = instantiate_node(NotPredicate,input, index...(index + 1))
1754
1863
  @index += 1
1755
1864
  else
@@ -1759,7 +1868,7 @@ module Treetop
1759
1868
  if r2
1760
1869
  r0 = r2
1761
1870
  else
1762
- if input.index('~', index) == index
1871
+ if has_terminal?('~', false, index)
1763
1872
  r3 = instantiate_node(TransientPrefix,input, index...(index + 1))
1764
1873
  @index += 1
1765
1874
  else
@@ -1769,7 +1878,7 @@ module Treetop
1769
1878
  if r3
1770
1879
  r0 = r3
1771
1880
  else
1772
- self.index = i0
1881
+ @index = i0
1773
1882
  r0 = nil
1774
1883
  end
1775
1884
  end
@@ -1777,7 +1886,7 @@ module Treetop
1777
1886
 
1778
1887
  node_cache[:prefix][start_index] = r0
1779
1888
 
1780
- return r0
1889
+ r0
1781
1890
  end
1782
1891
 
1783
1892
  def _nt_atomic
@@ -1801,7 +1910,7 @@ module Treetop
1801
1910
  if r3
1802
1911
  r0 = r3
1803
1912
  else
1804
- self.index = i0
1913
+ @index = i0
1805
1914
  r0 = nil
1806
1915
  end
1807
1916
  end
@@ -1809,7 +1918,7 @@ module Treetop
1809
1918
 
1810
1919
  node_cache[:atomic][start_index] = r0
1811
1920
 
1812
- return r0
1921
+ r0
1813
1922
  end
1814
1923
 
1815
1924
  module ParenthesizedExpression0
@@ -1834,7 +1943,7 @@ module Treetop
1834
1943
  end
1835
1944
 
1836
1945
  i0, s0 = index, []
1837
- if input.index('(', index) == index
1946
+ if has_terminal?('(', false, index)
1838
1947
  r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
1839
1948
  @index += 1
1840
1949
  else
@@ -1862,7 +1971,7 @@ module Treetop
1862
1971
  end
1863
1972
  s0 << r5
1864
1973
  if r5
1865
- if input.index(')', index) == index
1974
+ if has_terminal?(')', false, index)
1866
1975
  r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
1867
1976
  @index += 1
1868
1977
  else
@@ -1879,13 +1988,13 @@ module Treetop
1879
1988
  r0.extend(ParenthesizedExpression0)
1880
1989
  r0.extend(ParenthesizedExpression1)
1881
1990
  else
1882
- self.index = i0
1991
+ @index = i0
1883
1992
  r0 = nil
1884
1993
  end
1885
1994
 
1886
1995
  node_cache[:parenthesized_expression][start_index] = r0
1887
1996
 
1888
- return r0
1997
+ r0
1889
1998
  end
1890
1999
 
1891
2000
  module Nonterminal0
@@ -1912,7 +2021,7 @@ module Treetop
1912
2021
  if r2
1913
2022
  r1 = nil
1914
2023
  else
1915
- self.index = i1
2024
+ @index = i1
1916
2025
  r1 = instantiate_node(SyntaxNode,input, index...index)
1917
2026
  end
1918
2027
  s0 << r1
@@ -1937,7 +2046,7 @@ module Treetop
1937
2046
  r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
1938
2047
  r3.extend(Nonterminal0)
1939
2048
  else
1940
- self.index = i3
2049
+ @index = i3
1941
2050
  r3 = nil
1942
2051
  end
1943
2052
  s0 << r3
@@ -1946,13 +2055,13 @@ module Treetop
1946
2055
  r0 = instantiate_node(Nonterminal,input, i0...index, s0)
1947
2056
  r0.extend(Nonterminal1)
1948
2057
  else
1949
- self.index = i0
2058
+ @index = i0
1950
2059
  r0 = nil
1951
2060
  end
1952
2061
 
1953
2062
  node_cache[:nonterminal][start_index] = r0
1954
2063
 
1955
- return r0
2064
+ r0
1956
2065
  end
1957
2066
 
1958
2067
  def _nt_terminal
@@ -1976,7 +2085,7 @@ module Treetop
1976
2085
  if r3
1977
2086
  r0 = r3
1978
2087
  else
1979
- self.index = i0
2088
+ @index = i0
1980
2089
  r0 = nil
1981
2090
  end
1982
2091
  end
@@ -1984,7 +2093,7 @@ module Treetop
1984
2093
 
1985
2094
  node_cache[:terminal][start_index] = r0
1986
2095
 
1987
- return r0
2096
+ r0
1988
2097
  end
1989
2098
 
1990
2099
  module QuotedString0
@@ -2012,14 +2121,14 @@ module Treetop
2012
2121
  r0 = r2
2013
2122
  r0.extend(QuotedString0)
2014
2123
  else
2015
- self.index = i0
2124
+ @index = i0
2016
2125
  r0 = nil
2017
2126
  end
2018
2127
  end
2019
2128
 
2020
2129
  node_cache[:quoted_string][start_index] = r0
2021
2130
 
2022
- return r0
2131
+ r0
2023
2132
  end
2024
2133
 
2025
2134
  module DoubleQuotedString0
@@ -2041,7 +2150,7 @@ module Treetop
2041
2150
  end
2042
2151
 
2043
2152
  i0, s0 = index, []
2044
- if input.index('"', index) == index
2153
+ if has_terminal?('"', false, index)
2045
2154
  r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
2046
2155
  @index += 1
2047
2156
  else
@@ -2054,7 +2163,7 @@ module Treetop
2054
2163
  loop do
2055
2164
  i3, s3 = index, []
2056
2165
  i4 = index
2057
- if input.index('"', index) == index
2166
+ if has_terminal?('"', false, index)
2058
2167
  r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
2059
2168
  @index += 1
2060
2169
  else
@@ -2064,13 +2173,13 @@ module Treetop
2064
2173
  if r5
2065
2174
  r4 = nil
2066
2175
  else
2067
- self.index = i4
2176
+ @index = i4
2068
2177
  r4 = instantiate_node(SyntaxNode,input, index...index)
2069
2178
  end
2070
2179
  s3 << r4
2071
2180
  if r4
2072
2181
  i6 = index
2073
- if input.index("\\\\", index) == index
2182
+ if has_terminal?("\\\\", false, index)
2074
2183
  r7 = instantiate_node(SyntaxNode,input, index...(index + 2))
2075
2184
  @index += 2
2076
2185
  else
@@ -2080,7 +2189,7 @@ module Treetop
2080
2189
  if r7
2081
2190
  r6 = r7
2082
2191
  else
2083
- if input.index('\"', index) == index
2192
+ if has_terminal?('\"', false, index)
2084
2193
  r8 = instantiate_node(SyntaxNode,input, index...(index + 2))
2085
2194
  @index += 2
2086
2195
  else
@@ -2091,8 +2200,9 @@ module Treetop
2091
2200
  r6 = r8
2092
2201
  else
2093
2202
  if index < input_length
2094
- r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
2095
- @index += 1
2203
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
2204
+ r9 = instantiate_node(SyntaxNode,input, index...next_character)
2205
+ @index = next_character
2096
2206
  else
2097
2207
  terminal_parse_failure("any character")
2098
2208
  r9 = nil
@@ -2100,7 +2210,7 @@ module Treetop
2100
2210
  if r9
2101
2211
  r6 = r9
2102
2212
  else
2103
- self.index = i6
2213
+ @index = i6
2104
2214
  r6 = nil
2105
2215
  end
2106
2216
  end
@@ -2111,7 +2221,7 @@ module Treetop
2111
2221
  r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
2112
2222
  r3.extend(DoubleQuotedString0)
2113
2223
  else
2114
- self.index = i3
2224
+ @index = i3
2115
2225
  r3 = nil
2116
2226
  end
2117
2227
  if r3
@@ -2123,7 +2233,7 @@ module Treetop
2123
2233
  r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
2124
2234
  s0 << r2
2125
2235
  if r2
2126
- if input.index('"', index) == index
2236
+ if has_terminal?('"', false, index)
2127
2237
  r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
2128
2238
  @index += 1
2129
2239
  else
@@ -2137,13 +2247,13 @@ module Treetop
2137
2247
  r0 = instantiate_node(Terminal,input, i0...index, s0)
2138
2248
  r0.extend(DoubleQuotedString1)
2139
2249
  else
2140
- self.index = i0
2250
+ @index = i0
2141
2251
  r0 = nil
2142
2252
  end
2143
2253
 
2144
2254
  node_cache[:double_quoted_string][start_index] = r0
2145
2255
 
2146
- return r0
2256
+ r0
2147
2257
  end
2148
2258
 
2149
2259
  module SingleQuotedString0
@@ -2165,7 +2275,7 @@ module Treetop
2165
2275
  end
2166
2276
 
2167
2277
  i0, s0 = index, []
2168
- if input.index("'", index) == index
2278
+ if has_terminal?("'", false, index)
2169
2279
  r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
2170
2280
  @index += 1
2171
2281
  else
@@ -2178,7 +2288,7 @@ module Treetop
2178
2288
  loop do
2179
2289
  i3, s3 = index, []
2180
2290
  i4 = index
2181
- if input.index("'", index) == index
2291
+ if has_terminal?("'", false, index)
2182
2292
  r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
2183
2293
  @index += 1
2184
2294
  else
@@ -2188,13 +2298,13 @@ module Treetop
2188
2298
  if r5
2189
2299
  r4 = nil
2190
2300
  else
2191
- self.index = i4
2301
+ @index = i4
2192
2302
  r4 = instantiate_node(SyntaxNode,input, index...index)
2193
2303
  end
2194
2304
  s3 << r4
2195
2305
  if r4
2196
2306
  i6 = index
2197
- if input.index("\\\\", index) == index
2307
+ if has_terminal?("\\\\", false, index)
2198
2308
  r7 = instantiate_node(SyntaxNode,input, index...(index + 2))
2199
2309
  @index += 2
2200
2310
  else
@@ -2204,7 +2314,7 @@ module Treetop
2204
2314
  if r7
2205
2315
  r6 = r7
2206
2316
  else
2207
- if input.index("\\'", index) == index
2317
+ if has_terminal?("\\'", false, index)
2208
2318
  r8 = instantiate_node(SyntaxNode,input, index...(index + 2))
2209
2319
  @index += 2
2210
2320
  else
@@ -2215,8 +2325,9 @@ module Treetop
2215
2325
  r6 = r8
2216
2326
  else
2217
2327
  if index < input_length
2218
- r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
2219
- @index += 1
2328
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
2329
+ r9 = instantiate_node(SyntaxNode,input, index...next_character)
2330
+ @index = next_character
2220
2331
  else
2221
2332
  terminal_parse_failure("any character")
2222
2333
  r9 = nil
@@ -2224,7 +2335,7 @@ module Treetop
2224
2335
  if r9
2225
2336
  r6 = r9
2226
2337
  else
2227
- self.index = i6
2338
+ @index = i6
2228
2339
  r6 = nil
2229
2340
  end
2230
2341
  end
@@ -2235,7 +2346,7 @@ module Treetop
2235
2346
  r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
2236
2347
  r3.extend(SingleQuotedString0)
2237
2348
  else
2238
- self.index = i3
2349
+ @index = i3
2239
2350
  r3 = nil
2240
2351
  end
2241
2352
  if r3
@@ -2247,7 +2358,7 @@ module Treetop
2247
2358
  r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
2248
2359
  s0 << r2
2249
2360
  if r2
2250
- if input.index("'", index) == index
2361
+ if has_terminal?("'", false, index)
2251
2362
  r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
2252
2363
  @index += 1
2253
2364
  else
@@ -2261,13 +2372,13 @@ module Treetop
2261
2372
  r0 = instantiate_node(Terminal,input, i0...index, s0)
2262
2373
  r0.extend(SingleQuotedString1)
2263
2374
  else
2264
- self.index = i0
2375
+ @index = i0
2265
2376
  r0 = nil
2266
2377
  end
2267
2378
 
2268
2379
  node_cache[:single_quoted_string][start_index] = r0
2269
2380
 
2270
- return r0
2381
+ r0
2271
2382
  end
2272
2383
 
2273
2384
  module CharacterClass0
@@ -2301,7 +2412,7 @@ module Treetop
2301
2412
  end
2302
2413
 
2303
2414
  i0, s0 = index, []
2304
- if input.index('[', index) == index
2415
+ if has_terminal?('[', false, index)
2305
2416
  r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
2306
2417
  @index += 1
2307
2418
  else
@@ -2314,7 +2425,7 @@ module Treetop
2314
2425
  loop do
2315
2426
  i3, s3 = index, []
2316
2427
  i4 = index
2317
- if input.index(']', index) == index
2428
+ if has_terminal?(']', false, index)
2318
2429
  r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
2319
2430
  @index += 1
2320
2431
  else
@@ -2324,14 +2435,14 @@ module Treetop
2324
2435
  if r5
2325
2436
  r4 = nil
2326
2437
  else
2327
- self.index = i4
2438
+ @index = i4
2328
2439
  r4 = instantiate_node(SyntaxNode,input, index...index)
2329
2440
  end
2330
2441
  s3 << r4
2331
2442
  if r4
2332
2443
  i6 = index
2333
2444
  i7, s7 = index, []
2334
- if input.index('\\', index) == index
2445
+ if has_terminal?('\\', false, index)
2335
2446
  r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
2336
2447
  @index += 1
2337
2448
  else
@@ -2341,8 +2452,9 @@ module Treetop
2341
2452
  s7 << r8
2342
2453
  if r8
2343
2454
  if index < input_length
2344
- r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
2345
- @index += 1
2455
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
2456
+ r9 = instantiate_node(SyntaxNode,input, index...next_character)
2457
+ @index = next_character
2346
2458
  else
2347
2459
  terminal_parse_failure("any character")
2348
2460
  r9 = nil
@@ -2353,7 +2465,7 @@ module Treetop
2353
2465
  r7 = instantiate_node(SyntaxNode,input, i7...index, s7)
2354
2466
  r7.extend(CharacterClass0)
2355
2467
  else
2356
- self.index = i7
2468
+ @index = i7
2357
2469
  r7 = nil
2358
2470
  end
2359
2471
  if r7
@@ -2361,7 +2473,7 @@ module Treetop
2361
2473
  else
2362
2474
  i10, s10 = index, []
2363
2475
  i11 = index
2364
- if input.index('\\', index) == index
2476
+ if has_terminal?('\\', false, index)
2365
2477
  r12 = instantiate_node(SyntaxNode,input, index...(index + 1))
2366
2478
  @index += 1
2367
2479
  else
@@ -2371,14 +2483,15 @@ module Treetop
2371
2483
  if r12
2372
2484
  r11 = nil
2373
2485
  else
2374
- self.index = i11
2486
+ @index = i11
2375
2487
  r11 = instantiate_node(SyntaxNode,input, index...index)
2376
2488
  end
2377
2489
  s10 << r11
2378
2490
  if r11
2379
2491
  if index < input_length
2380
- r13 = instantiate_node(SyntaxNode,input, index...(index + 1))
2381
- @index += 1
2492
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
2493
+ r13 = instantiate_node(SyntaxNode,input, index...next_character)
2494
+ @index = next_character
2382
2495
  else
2383
2496
  terminal_parse_failure("any character")
2384
2497
  r13 = nil
@@ -2389,13 +2502,13 @@ module Treetop
2389
2502
  r10 = instantiate_node(SyntaxNode,input, i10...index, s10)
2390
2503
  r10.extend(CharacterClass1)
2391
2504
  else
2392
- self.index = i10
2505
+ @index = i10
2393
2506
  r10 = nil
2394
2507
  end
2395
2508
  if r10
2396
2509
  r6 = r10
2397
2510
  else
2398
- self.index = i6
2511
+ @index = i6
2399
2512
  r6 = nil
2400
2513
  end
2401
2514
  end
@@ -2405,7 +2518,7 @@ module Treetop
2405
2518
  r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
2406
2519
  r3.extend(CharacterClass2)
2407
2520
  else
2408
- self.index = i3
2521
+ @index = i3
2409
2522
  r3 = nil
2410
2523
  end
2411
2524
  if r3
@@ -2415,14 +2528,14 @@ module Treetop
2415
2528
  end
2416
2529
  end
2417
2530
  if s2.empty?
2418
- self.index = i2
2531
+ @index = i2
2419
2532
  r2 = nil
2420
2533
  else
2421
2534
  r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
2422
2535
  end
2423
2536
  s0 << r2
2424
2537
  if r2
2425
- if input.index(']', index) == index
2538
+ if has_terminal?(']', false, index)
2426
2539
  r14 = instantiate_node(SyntaxNode,input, index...(index + 1))
2427
2540
  @index += 1
2428
2541
  else
@@ -2437,13 +2550,13 @@ module Treetop
2437
2550
  r0.extend(CharacterClass3)
2438
2551
  r0.extend(CharacterClass4)
2439
2552
  else
2440
- self.index = i0
2553
+ @index = i0
2441
2554
  r0 = nil
2442
2555
  end
2443
2556
 
2444
2557
  node_cache[:character_class][start_index] = r0
2445
2558
 
2446
- return r0
2559
+ r0
2447
2560
  end
2448
2561
 
2449
2562
  def _nt_anything_symbol
@@ -2454,7 +2567,7 @@ module Treetop
2454
2567
  return cached
2455
2568
  end
2456
2569
 
2457
- if input.index('.', index) == index
2570
+ if has_terminal?('.', false, index)
2458
2571
  r0 = instantiate_node(AnythingSymbol,input, index...(index + 1))
2459
2572
  @index += 1
2460
2573
  else
@@ -2464,7 +2577,7 @@ module Treetop
2464
2577
 
2465
2578
  node_cache[:anything_symbol][start_index] = r0
2466
2579
 
2467
- return r0
2580
+ r0
2468
2581
  end
2469
2582
 
2470
2583
  module NodeClassExpression0
@@ -2502,7 +2615,7 @@ module Treetop
2502
2615
  r2 = _nt_space
2503
2616
  s1 << r2
2504
2617
  if r2
2505
- if input.index('<', index) == index
2618
+ if has_terminal?('<', false, index)
2506
2619
  r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
2507
2620
  @index += 1
2508
2621
  else
@@ -2515,7 +2628,7 @@ module Treetop
2515
2628
  loop do
2516
2629
  i5, s5 = index, []
2517
2630
  i6 = index
2518
- if input.index('>', index) == index
2631
+ if has_terminal?('>', false, index)
2519
2632
  r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
2520
2633
  @index += 1
2521
2634
  else
@@ -2525,14 +2638,15 @@ module Treetop
2525
2638
  if r7
2526
2639
  r6 = nil
2527
2640
  else
2528
- self.index = i6
2641
+ @index = i6
2529
2642
  r6 = instantiate_node(SyntaxNode,input, index...index)
2530
2643
  end
2531
2644
  s5 << r6
2532
2645
  if r6
2533
2646
  if index < input_length
2534
- r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
2535
- @index += 1
2647
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
2648
+ r8 = instantiate_node(SyntaxNode,input, index...next_character)
2649
+ @index = next_character
2536
2650
  else
2537
2651
  terminal_parse_failure("any character")
2538
2652
  r8 = nil
@@ -2543,7 +2657,7 @@ module Treetop
2543
2657
  r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
2544
2658
  r5.extend(NodeClassExpression0)
2545
2659
  else
2546
- self.index = i5
2660
+ @index = i5
2547
2661
  r5 = nil
2548
2662
  end
2549
2663
  if r5
@@ -2553,14 +2667,14 @@ module Treetop
2553
2667
  end
2554
2668
  end
2555
2669
  if s4.empty?
2556
- self.index = i4
2670
+ @index = i4
2557
2671
  r4 = nil
2558
2672
  else
2559
2673
  r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
2560
2674
  end
2561
2675
  s1 << r4
2562
2676
  if r4
2563
- if input.index('>', index) == index
2677
+ if has_terminal?('>', false, index)
2564
2678
  r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
2565
2679
  @index += 1
2566
2680
  else
@@ -2576,13 +2690,13 @@ module Treetop
2576
2690
  r1.extend(NodeClassExpression1)
2577
2691
  r1.extend(NodeClassExpression2)
2578
2692
  else
2579
- self.index = i1
2693
+ @index = i1
2580
2694
  r1 = nil
2581
2695
  end
2582
2696
  if r1
2583
2697
  r0 = r1
2584
2698
  else
2585
- if input.index('', index) == index
2699
+ if has_terminal?('', false, index)
2586
2700
  r10 = instantiate_node(SyntaxNode,input, index...(index + 0))
2587
2701
  r10.extend(NodeClassExpression3)
2588
2702
  @index += 0
@@ -2593,14 +2707,14 @@ module Treetop
2593
2707
  if r10
2594
2708
  r0 = r10
2595
2709
  else
2596
- self.index = i0
2710
+ @index = i0
2597
2711
  r0 = nil
2598
2712
  end
2599
2713
  end
2600
2714
 
2601
2715
  node_cache[:node_class_expression][start_index] = r0
2602
2716
 
2603
- return r0
2717
+ r0
2604
2718
  end
2605
2719
 
2606
2720
  module TrailingInlineModule0
@@ -2658,13 +2772,13 @@ module Treetop
2658
2772
  r1.extend(TrailingInlineModule0)
2659
2773
  r1.extend(TrailingInlineModule1)
2660
2774
  else
2661
- self.index = i1
2775
+ @index = i1
2662
2776
  r1 = nil
2663
2777
  end
2664
2778
  if r1
2665
2779
  r0 = r1
2666
2780
  else
2667
- if input.index('', index) == index
2781
+ if has_terminal?('', false, index)
2668
2782
  r4 = instantiate_node(SyntaxNode,input, index...(index + 0))
2669
2783
  r4.extend(TrailingInlineModule2)
2670
2784
  @index += 0
@@ -2675,14 +2789,54 @@ module Treetop
2675
2789
  if r4
2676
2790
  r0 = r4
2677
2791
  else
2678
- self.index = i0
2792
+ @index = i0
2679
2793
  r0 = nil
2680
2794
  end
2681
2795
  end
2682
2796
 
2683
2797
  node_cache[:trailing_inline_module][start_index] = r0
2684
2798
 
2685
- return r0
2799
+ r0
2800
+ end
2801
+
2802
+ module PredicateBlock0
2803
+ def inline_module
2804
+ elements[1]
2805
+ end
2806
+ end
2807
+
2808
+ def _nt_predicate_block
2809
+ start_index = index
2810
+ if node_cache[:predicate_block].has_key?(index)
2811
+ cached = node_cache[:predicate_block][index]
2812
+ @index = cached.interval.end if cached
2813
+ return cached
2814
+ end
2815
+
2816
+ i0, s0 = index, []
2817
+ if has_terminal?('', false, index)
2818
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 0))
2819
+ @index += 0
2820
+ else
2821
+ terminal_parse_failure('')
2822
+ r1 = nil
2823
+ end
2824
+ s0 << r1
2825
+ if r1
2826
+ r2 = _nt_inline_module
2827
+ s0 << r2
2828
+ end
2829
+ if s0.last
2830
+ r0 = instantiate_node(PredicateBlock,input, i0...index, s0)
2831
+ r0.extend(PredicateBlock0)
2832
+ else
2833
+ @index = i0
2834
+ r0 = nil
2835
+ end
2836
+
2837
+ node_cache[:predicate_block][start_index] = r0
2838
+
2839
+ r0
2686
2840
  end
2687
2841
 
2688
2842
  module InlineModule0
@@ -2700,7 +2854,7 @@ module Treetop
2700
2854
  end
2701
2855
 
2702
2856
  i0, s0 = index, []
2703
- if input.index('{', index) == index
2857
+ if has_terminal?('{', false, index)
2704
2858
  r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
2705
2859
  @index += 1
2706
2860
  else
@@ -2718,23 +2872,25 @@ module Treetop
2718
2872
  else
2719
2873
  i5, s5 = index, []
2720
2874
  i6 = index
2721
- if input.index(Regexp.new('[{}]'), index) == index
2722
- r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
2723
- @index += 1
2875
+ if has_terminal?('\G[{}]', true, index)
2876
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
2877
+ r7 = true
2878
+ @index = next_character
2724
2879
  else
2725
2880
  r7 = nil
2726
2881
  end
2727
2882
  if r7
2728
2883
  r6 = nil
2729
2884
  else
2730
- self.index = i6
2885
+ @index = i6
2731
2886
  r6 = instantiate_node(SyntaxNode,input, index...index)
2732
2887
  end
2733
2888
  s5 << r6
2734
2889
  if r6
2735
2890
  if index < input_length
2736
- r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
2737
- @index += 1
2891
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
2892
+ r8 = instantiate_node(SyntaxNode,input, index...next_character)
2893
+ @index = next_character
2738
2894
  else
2739
2895
  terminal_parse_failure("any character")
2740
2896
  r8 = nil
@@ -2745,13 +2901,13 @@ module Treetop
2745
2901
  r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
2746
2902
  r5.extend(InlineModule0)
2747
2903
  else
2748
- self.index = i5
2904
+ @index = i5
2749
2905
  r5 = nil
2750
2906
  end
2751
2907
  if r5
2752
2908
  r3 = r5
2753
2909
  else
2754
- self.index = i3
2910
+ @index = i3
2755
2911
  r3 = nil
2756
2912
  end
2757
2913
  end
@@ -2764,7 +2920,7 @@ module Treetop
2764
2920
  r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
2765
2921
  s0 << r2
2766
2922
  if r2
2767
- if input.index('}', index) == index
2923
+ if has_terminal?('}', false, index)
2768
2924
  r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
2769
2925
  @index += 1
2770
2926
  else
@@ -2778,13 +2934,13 @@ module Treetop
2778
2934
  r0 = instantiate_node(InlineModule,input, i0...index, s0)
2779
2935
  r0.extend(InlineModule1)
2780
2936
  else
2781
- self.index = i0
2937
+ @index = i0
2782
2938
  r0 = nil
2783
2939
  end
2784
2940
 
2785
2941
  node_cache[:inline_module][start_index] = r0
2786
2942
 
2787
- return r0
2943
+ r0
2788
2944
  end
2789
2945
 
2790
2946
  module KeywordInsideGrammar0
@@ -2800,7 +2956,7 @@ module Treetop
2800
2956
 
2801
2957
  i0, s0 = index, []
2802
2958
  i1 = index
2803
- if input.index('rule', index) == index
2959
+ if has_terminal?('rule', false, index)
2804
2960
  r2 = instantiate_node(SyntaxNode,input, index...(index + 4))
2805
2961
  @index += 4
2806
2962
  else
@@ -2810,7 +2966,7 @@ module Treetop
2810
2966
  if r2
2811
2967
  r1 = r2
2812
2968
  else
2813
- if input.index('end', index) == index
2969
+ if has_terminal?('end', false, index)
2814
2970
  r3 = instantiate_node(SyntaxNode,input, index...(index + 3))
2815
2971
  @index += 3
2816
2972
  else
@@ -2820,7 +2976,7 @@ module Treetop
2820
2976
  if r3
2821
2977
  r1 = r3
2822
2978
  else
2823
- self.index = i1
2979
+ @index = i1
2824
2980
  r1 = nil
2825
2981
  end
2826
2982
  end
@@ -2831,7 +2987,7 @@ module Treetop
2831
2987
  if r5
2832
2988
  r4 = nil
2833
2989
  else
2834
- self.index = i4
2990
+ @index = i4
2835
2991
  r4 = instantiate_node(SyntaxNode,input, index...index)
2836
2992
  end
2837
2993
  s0 << r4
@@ -2840,13 +2996,13 @@ module Treetop
2840
2996
  r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
2841
2997
  r0.extend(KeywordInsideGrammar0)
2842
2998
  else
2843
- self.index = i0
2999
+ @index = i0
2844
3000
  r0 = nil
2845
3001
  end
2846
3002
 
2847
3003
  node_cache[:keyword_inside_grammar][start_index] = r0
2848
3004
 
2849
- return r0
3005
+ r0
2850
3006
  end
2851
3007
 
2852
3008
  module NonSpaceChar0
@@ -2866,14 +3022,15 @@ module Treetop
2866
3022
  if r2
2867
3023
  r1 = nil
2868
3024
  else
2869
- self.index = i1
3025
+ @index = i1
2870
3026
  r1 = instantiate_node(SyntaxNode,input, index...index)
2871
3027
  end
2872
3028
  s0 << r1
2873
3029
  if r1
2874
3030
  if index < input_length
2875
- r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
2876
- @index += 1
3031
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
3032
+ r3 = instantiate_node(SyntaxNode,input, index...next_character)
3033
+ @index = next_character
2877
3034
  else
2878
3035
  terminal_parse_failure("any character")
2879
3036
  r3 = nil
@@ -2884,13 +3041,13 @@ module Treetop
2884
3041
  r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
2885
3042
  r0.extend(NonSpaceChar0)
2886
3043
  else
2887
- self.index = i0
3044
+ @index = i0
2888
3045
  r0 = nil
2889
3046
  end
2890
3047
 
2891
3048
  node_cache[:non_space_char][start_index] = r0
2892
3049
 
2893
- return r0
3050
+ r0
2894
3051
  end
2895
3052
 
2896
3053
  def _nt_alpha_char
@@ -2901,16 +3058,17 @@ module Treetop
2901
3058
  return cached
2902
3059
  end
2903
3060
 
2904
- if input.index(Regexp.new('[A-Za-z_]'), index) == index
2905
- r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
2906
- @index += 1
3061
+ if has_terminal?('\G[A-Za-z_]', true, index)
3062
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
3063
+ r0 = instantiate_node(SyntaxNode, input, index...next_character)
3064
+ @index = next_character
2907
3065
  else
2908
3066
  r0 = nil
2909
3067
  end
2910
3068
 
2911
3069
  node_cache[:alpha_char][start_index] = r0
2912
3070
 
2913
- return r0
3071
+ r0
2914
3072
  end
2915
3073
 
2916
3074
  def _nt_alphanumeric_char
@@ -2926,23 +3084,24 @@ module Treetop
2926
3084
  if r1
2927
3085
  r0 = r1
2928
3086
  else
2929
- if input.index(Regexp.new('[0-9]'), index) == index
2930
- r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
2931
- @index += 1
3087
+ if has_terminal?('\G[0-9]', true, index)
3088
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
3089
+ r2 = true
3090
+ @index = next_character
2932
3091
  else
2933
3092
  r2 = nil
2934
3093
  end
2935
3094
  if r2
2936
3095
  r0 = r2
2937
3096
  else
2938
- self.index = i0
3097
+ @index = i0
2939
3098
  r0 = nil
2940
3099
  end
2941
3100
  end
2942
3101
 
2943
3102
  node_cache[:alphanumeric_char][start_index] = r0
2944
3103
 
2945
- return r0
3104
+ r0
2946
3105
  end
2947
3106
 
2948
3107
  def _nt_space
@@ -2964,7 +3123,7 @@ module Treetop
2964
3123
  if r3
2965
3124
  r1 = r3
2966
3125
  else
2967
- self.index = i1
3126
+ @index = i1
2968
3127
  r1 = nil
2969
3128
  end
2970
3129
  end
@@ -2975,7 +3134,7 @@ module Treetop
2975
3134
  end
2976
3135
  end
2977
3136
  if s0.empty?
2978
- self.index = i0
3137
+ @index = i0
2979
3138
  r0 = nil
2980
3139
  else
2981
3140
  r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
@@ -2983,7 +3142,7 @@ module Treetop
2983
3142
 
2984
3143
  node_cache[:space][start_index] = r0
2985
3144
 
2986
- return r0
3145
+ r0
2987
3146
  end
2988
3147
 
2989
3148
  module CommentToEol0
@@ -3001,7 +3160,7 @@ module Treetop
3001
3160
  end
3002
3161
 
3003
3162
  i0, s0 = index, []
3004
- if input.index('#', index) == index
3163
+ if has_terminal?('#', false, index)
3005
3164
  r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
3006
3165
  @index += 1
3007
3166
  else
@@ -3014,7 +3173,7 @@ module Treetop
3014
3173
  loop do
3015
3174
  i3, s3 = index, []
3016
3175
  i4 = index
3017
- if input.index("\n", index) == index
3176
+ if has_terminal?("\n", false, index)
3018
3177
  r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
3019
3178
  @index += 1
3020
3179
  else
@@ -3024,14 +3183,15 @@ module Treetop
3024
3183
  if r5
3025
3184
  r4 = nil
3026
3185
  else
3027
- self.index = i4
3186
+ @index = i4
3028
3187
  r4 = instantiate_node(SyntaxNode,input, index...index)
3029
3188
  end
3030
3189
  s3 << r4
3031
3190
  if r4
3032
3191
  if index < input_length
3033
- r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
3034
- @index += 1
3192
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
3193
+ r6 = instantiate_node(SyntaxNode,input, index...next_character)
3194
+ @index = next_character
3035
3195
  else
3036
3196
  terminal_parse_failure("any character")
3037
3197
  r6 = nil
@@ -3042,7 +3202,7 @@ module Treetop
3042
3202
  r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
3043
3203
  r3.extend(CommentToEol0)
3044
3204
  else
3045
- self.index = i3
3205
+ @index = i3
3046
3206
  r3 = nil
3047
3207
  end
3048
3208
  if r3
@@ -3058,13 +3218,13 @@ module Treetop
3058
3218
  r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
3059
3219
  r0.extend(CommentToEol1)
3060
3220
  else
3061
- self.index = i0
3221
+ @index = i0
3062
3222
  r0 = nil
3063
3223
  end
3064
3224
 
3065
3225
  node_cache[:comment_to_eol][start_index] = r0
3066
3226
 
3067
- return r0
3227
+ r0
3068
3228
  end
3069
3229
 
3070
3230
  def _nt_white
@@ -3075,16 +3235,17 @@ module Treetop
3075
3235
  return cached
3076
3236
  end
3077
3237
 
3078
- if input.index(Regexp.new('[ \\t\\n\\r]'), index) == index
3079
- r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
3080
- @index += 1
3238
+ if has_terminal?('\G[ \\t\\n\\r]', true, index)
3239
+ next_character = index + input[index..-1].match(/\A(.)/um).end(1)
3240
+ r0 = instantiate_node(SyntaxNode, input, index...next_character)
3241
+ @index = next_character
3081
3242
  else
3082
3243
  r0 = nil
3083
3244
  end
3084
3245
 
3085
3246
  node_cache[:white][start_index] = r0
3086
3247
 
3087
- return r0
3248
+ r0
3088
3249
  end
3089
3250
 
3090
3251
  end