heist 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/parser/nodes.rb CHANGED
@@ -1,6 +1,16 @@
1
1
  module Heist
2
+ # The +Scheme+ module hosts various classes used by the +SchemeParser+ class,
3
+ # which is generated from a parsing expression grammar using +Treetop+. (See
4
+ # <tt>lib/parser/scheme.tt</tt>.) The classes map syntax structures generated
5
+ # by +Treetop+ to Heist runtime objects for execution. All the classes except
6
+ # +Program+ are evaluated without a runtime environment; evaluating them
7
+ # simply casts to non-Treetop objects in the Heist library, or to raw Ruby
8
+ # objects. Evaluating a +Program+ requires a +Runtime+ in which to do so.
2
9
  module Scheme
3
10
 
11
+ # Any list-generating shorthands present in the grammar should be listed here.
12
+ # In Scheme, this list includes the various quoting symbols that can be used
13
+ # as shorthands for calling quoting functions.
4
14
  SHORTHANDS = {
5
15
  "'" => :quote,
6
16
  "`" => :quasiquote,
@@ -8,50 +18,63 @@ module Heist
8
18
  ",@" => :'unquote-splicing'
9
19
  }
10
20
 
21
+ # +Program+ is the root of the parse tree; parsing any string of Scheme code
22
+ # produces one of these.
11
23
  class Program < Treetop::Runtime::SyntaxNode
24
+ # Evaluates all the expressions in the +Program+ in order, returning the
25
+ # result of the last expression.
12
26
  def eval(scope)
13
27
  convert!
14
28
  @data.map { |part| Heist.evaluate(part, scope) }.last
15
29
  end
16
30
 
31
+ # Converts all the +Treetop+ objects in the +Program+ to Heist objects
32
+ # and raw Ruby data ready for interpretation using a +Runtime+.
17
33
  def convert!
18
34
  return if @data
19
- @data = []
20
- elements.each_with_index { |cell, i| self[i] = cell.eval }
21
- end
22
-
23
- def [](index)
24
- @data[index]
25
- end
26
-
27
- def []=(index, value)
28
- value.exists_at!(self, index) if Runtime::Expression === value
29
- @data[index] = value
35
+ @data = Runtime::Cons.construct(elements, true) { |c| c.eval }
30
36
  end
31
37
  end
32
38
 
39
+ # A +List+ has an array of +cells+, and optionally a +tail+ if it's an
40
+ # improper list or a dotted pair.
33
41
  module List
42
+ # Evaluating a +List+ produces a Heist +Cons+ object.
34
43
  def eval
35
- list = Runtime::List.new
36
- cells.each { |c| list << c.eval }
44
+ list = Runtime::Cons.construct(cells, true) { |c| c.eval }
45
+ list.tail.cdr = tail.cell.eval if tail.respond_to?(:dot)
37
46
  list
38
47
  end
39
48
 
40
49
  def cells
41
- @cells ||= elements[1].elements
50
+ @cells ||= elements[1].elements[0].elements
51
+ end
52
+
53
+ def tail
54
+ @tail ||= elements[1].elements[1]
55
+ end
56
+ end
57
+
58
+ # <tt>QuotedCell</tt> are generated using the quoting shorthands.
59
+ class QuotedCell < Treetop::Runtime::SyntaxNode
60
+ # Evaluating a +QuotedCell+ produces a +Cons+ that expresses a function
61
+ # call to the appropriate quoting function, with the cell as the argument.
62
+ def eval
63
+ quote = elements[1].text_value
64
+ cell = elements[2].eval
65
+ Runtime::Cons.construct([Runtime::Identifier.new(SHORTHANDS[quote]), cell])
42
66
  end
43
67
  end
44
68
 
69
+ # <tt>Cells</tt> are any piece of Scheme data: numbers, booleans, strings,
70
+ # lists. Any building block of Scheme code goes in a +Cell+.
45
71
  class Cell < Treetop::Runtime::SyntaxNode
46
72
  def eval
47
- result = elements[3].eval
48
- string = elements[1].text_value
49
- SHORTHANDS.has_key?(string) ?
50
- Runtime::List.new([Runtime::Identifier.new(SHORTHANDS[string]), result]) :
51
- result
73
+ elements[1].eval
52
74
  end
53
75
  end
54
76
 
77
+ # A +Datum+ is any piece of atomic literal data.
55
78
  class Datum < Treetop::Runtime::SyntaxNode
56
79
  def eval
57
80
  elements[0].eval
@@ -66,25 +89,25 @@ module Heist
66
89
 
67
90
  class Complex < Treetop::Runtime::SyntaxNode
68
91
  def eval
69
- # TODO
92
+ @value ||= Heist.complex(real.eval, imaginary.eval)
70
93
  end
71
94
  end
72
95
 
73
96
  class Real < Treetop::Runtime::SyntaxNode
74
97
  def eval
75
- @value ||= Kernel.eval(text_value).to_f
98
+ @value ||= text_value.to_f
76
99
  end
77
100
  end
78
101
 
79
102
  class Rational < Treetop::Runtime::SyntaxNode
80
103
  def eval
81
- @value ||= numerator.eval.to_f / denominator.eval
104
+ @value ||= Heist.rational(numerator.eval, denominator.eval)
82
105
  end
83
106
  end
84
107
 
85
108
  class Integer < Treetop::Runtime::SyntaxNode
86
109
  def eval
87
- @value ||= Kernel.eval(text_value).to_i
110
+ @value ||= text_value.to_i
88
111
  end
89
112
  end
90
113
 
@@ -94,7 +117,7 @@ module Heist
94
117
  end
95
118
  end
96
119
 
97
- class Identifier < Treetop::Runtime::SyntaxNode
120
+ module Identifier
98
121
  def eval
99
122
  Runtime::Identifier.new(text_value)
100
123
  end
@@ -0,0 +1,29 @@
1
+ module Heist
2
+ # +RubyParser+ parses non-string code given as Ruby data such as arrays. It
3
+ # allows Lisp-style code to be expressed inline with Ruby, for example:
4
+ #
5
+ # scheme = Heist::Runtime.new
6
+ # scheme.exec [:define, [:square, :x], [:*, :x, :x]]
7
+ # scheme.exec [:square, 9]
8
+ # #=> 81
9
+ #
10
+ # The above API uses +RubyParser+ behind the scenes to turn Ruby data into
11
+ # Heist runtime objects such as +Cons+ based lists before execution.
12
+ #
13
+ class RubyParser
14
+
15
+ # Parses a single piece of Ruby data in
16
+ def parse(source)
17
+ case source
18
+ when Array then
19
+ Runtime::Cons.construct(source) { |cell| parse(cell) }
20
+ when Symbol then
21
+ Runtime::Identifier.new(source)
22
+ else
23
+ source
24
+ end
25
+ end
26
+
27
+ end
28
+ end
29
+
data/lib/parser/scheme.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Heist
2
- module Scheme
2
+ module Scheme #:nodoc:
3
3
  include Treetop::Runtime
4
4
 
5
5
  def root
@@ -30,17 +30,27 @@ module Heist
30
30
  return r0
31
31
  end
32
32
 
33
- module Cell0
33
+ module Cell0 #:nodoc:
34
34
  def ignore
35
35
  elements[0]
36
36
  end
37
37
 
38
- def ignore
38
+ def quote
39
+ elements[1]
40
+ end
41
+
42
+ def cell
39
43
  elements[2]
40
44
  end
45
+ end
41
46
 
47
+ module Cell1 #:nodoc:
42
48
  def ignore
43
- elements[4]
49
+ elements[0]
50
+ end
51
+
52
+ def ignore
53
+ elements[2]
44
54
  end
45
55
  end
46
56
 
@@ -52,48 +62,64 @@ module Heist
52
62
  return cached
53
63
  end
54
64
 
55
- i0, s0 = index, []
56
- r1 = _nt_ignore
57
- s0 << r1
58
- if r1
65
+ i0 = index
66
+ i1, s1 = index, []
67
+ r2 = _nt_ignore
68
+ s1 << r2
69
+ if r2
59
70
  r3 = _nt_quote
71
+ s1 << r3
60
72
  if r3
61
- r2 = r3
62
- else
63
- r2 = SyntaxNode.new(input, index...index)
73
+ r4 = _nt_cell
74
+ s1 << r4
64
75
  end
65
- s0 << r2
66
- if r2
67
- r4 = _nt_ignore
68
- s0 << r4
69
- if r4
70
- i5 = index
71
- r6 = _nt_list
72
- if r6
73
- r5 = r6
76
+ end
77
+ if s1.last
78
+ r1 = (QuotedCell).new(input, i1...index, s1)
79
+ r1.extend(Cell0)
80
+ else
81
+ self.index = i1
82
+ r1 = nil
83
+ end
84
+ if r1
85
+ r0 = r1
86
+ else
87
+ i5, s5 = index, []
88
+ r6 = _nt_ignore
89
+ s5 << r6
90
+ if r6
91
+ i7 = index
92
+ r8 = _nt_list
93
+ if r8
94
+ r7 = r8
95
+ else
96
+ r9 = _nt_atom
97
+ if r9
98
+ r7 = r9
74
99
  else
75
- r7 = _nt_atom
76
- if r7
77
- r5 = r7
78
- else
79
- self.index = i5
80
- r5 = nil
81
- end
82
- end
83
- s0 << r5
84
- if r5
85
- r8 = _nt_ignore
86
- s0 << r8
100
+ self.index = i7
101
+ r7 = nil
87
102
  end
88
103
  end
104
+ s5 << r7
105
+ if r7
106
+ r10 = _nt_ignore
107
+ s5 << r10
108
+ end
109
+ end
110
+ if s5.last
111
+ r5 = (Cell).new(input, i5...index, s5)
112
+ r5.extend(Cell1)
113
+ else
114
+ self.index = i5
115
+ r5 = nil
116
+ end
117
+ if r5
118
+ r0 = r5
119
+ else
120
+ self.index = i0
121
+ r0 = nil
89
122
  end
90
- end
91
- if s0.last
92
- r0 = (Cell).new(input, i0...index, s0)
93
- r0.extend(Cell0)
94
- else
95
- self.index = i0
96
- r0 = nil
97
123
  end
98
124
 
99
125
  node_cache[:cell][start_index] = r0
@@ -162,10 +188,39 @@ module Heist
162
188
  return r0
163
189
  end
164
190
 
165
- module List0
191
+ def _nt_dot
192
+ start_index = index
193
+ if node_cache[:dot].has_key?(index)
194
+ cached = node_cache[:dot][index]
195
+ @index = cached.interval.end if cached
196
+ return cached
197
+ end
198
+
199
+ if input.index(".", index) == index
200
+ r0 = (SyntaxNode).new(input, index...(index + 1))
201
+ @index += 1
202
+ else
203
+ terminal_parse_failure(".")
204
+ r0 = nil
205
+ end
206
+
207
+ node_cache[:dot][start_index] = r0
208
+
209
+ return r0
166
210
  end
167
211
 
168
- module List1
212
+ module List0 #:nodoc:
213
+ def cells
214
+ elements[1]
215
+ end
216
+
217
+ end
218
+
219
+ module List1 #:nodoc:
220
+ def cells
221
+ elements[1]
222
+ end
223
+
169
224
  end
170
225
 
171
226
  def _nt_list
@@ -187,26 +242,17 @@ module Heist
187
242
  end
188
243
  s1 << r2
189
244
  if r2
190
- s3, i3 = [], index
191
- loop do
192
- r4 = _nt_cell
193
- if r4
194
- s3 << r4
195
- else
196
- break
197
- end
198
- end
199
- r3 = SyntaxNode.new(input, i3...index, s3)
245
+ r3 = _nt_cells
200
246
  s1 << r3
201
247
  if r3
202
248
  if input.index(")", index) == index
203
- r5 = (SyntaxNode).new(input, index...(index + 1))
249
+ r4 = (SyntaxNode).new(input, index...(index + 1))
204
250
  @index += 1
205
251
  else
206
252
  terminal_parse_failure(")")
207
- r5 = nil
253
+ r4 = nil
208
254
  end
209
- s1 << r5
255
+ s1 << r4
210
256
  end
211
257
  end
212
258
  if s1.last
@@ -220,47 +266,38 @@ module Heist
220
266
  r0 = r1
221
267
  r0.extend(List)
222
268
  else
223
- i6, s6 = index, []
269
+ i5, s5 = index, []
224
270
  if input.index("[", index) == index
225
- r7 = (SyntaxNode).new(input, index...(index + 1))
271
+ r6 = (SyntaxNode).new(input, index...(index + 1))
226
272
  @index += 1
227
273
  else
228
274
  terminal_parse_failure("[")
229
- r7 = nil
275
+ r6 = nil
230
276
  end
231
- s6 << r7
232
- if r7
233
- s8, i8 = [], index
234
- loop do
235
- r9 = _nt_cell
236
- if r9
237
- s8 << r9
238
- else
239
- break
240
- end
241
- end
242
- r8 = SyntaxNode.new(input, i8...index, s8)
243
- s6 << r8
244
- if r8
277
+ s5 << r6
278
+ if r6
279
+ r7 = _nt_cells
280
+ s5 << r7
281
+ if r7
245
282
  if input.index("]", index) == index
246
- r10 = (SyntaxNode).new(input, index...(index + 1))
283
+ r8 = (SyntaxNode).new(input, index...(index + 1))
247
284
  @index += 1
248
285
  else
249
286
  terminal_parse_failure("]")
250
- r10 = nil
287
+ r8 = nil
251
288
  end
252
- s6 << r10
289
+ s5 << r8
253
290
  end
254
291
  end
255
- if s6.last
256
- r6 = (SyntaxNode).new(input, i6...index, s6)
257
- r6.extend(List1)
292
+ if s5.last
293
+ r5 = (SyntaxNode).new(input, i5...index, s5)
294
+ r5.extend(List1)
258
295
  else
259
- self.index = i6
260
- r6 = nil
296
+ self.index = i5
297
+ r5 = nil
261
298
  end
262
- if r6
263
- r0 = r6
299
+ if r5
300
+ r0 = r5
264
301
  r0.extend(List)
265
302
  else
266
303
  self.index = i0
@@ -273,6 +310,122 @@ module Heist
273
310
  return r0
274
311
  end
275
312
 
313
+ module Cells0 #:nodoc:
314
+ def dot
315
+ elements[0]
316
+ end
317
+
318
+ def space
319
+ elements[1]
320
+ end
321
+
322
+ def cell
323
+ elements[2]
324
+ end
325
+ end
326
+
327
+ module Cells1 #:nodoc:
328
+ end
329
+
330
+ module Cells2 #:nodoc:
331
+ def ignore
332
+ elements[1]
333
+ end
334
+ end
335
+
336
+ def _nt_cells
337
+ start_index = index
338
+ if node_cache[:cells].has_key?(index)
339
+ cached = node_cache[:cells][index]
340
+ @index = cached.interval.end if cached
341
+ return cached
342
+ end
343
+
344
+ i0 = index
345
+ i1, s1 = index, []
346
+ s2, i2 = [], index
347
+ loop do
348
+ r3 = _nt_cell
349
+ if r3
350
+ s2 << r3
351
+ else
352
+ break
353
+ end
354
+ end
355
+ if s2.empty?
356
+ self.index = i2
357
+ r2 = nil
358
+ else
359
+ r2 = SyntaxNode.new(input, i2...index, s2)
360
+ end
361
+ s1 << r2
362
+ if r2
363
+ i4, s4 = index, []
364
+ r5 = _nt_dot
365
+ s4 << r5
366
+ if r5
367
+ r6 = _nt_space
368
+ s4 << r6
369
+ if r6
370
+ r7 = _nt_cell
371
+ s4 << r7
372
+ end
373
+ end
374
+ if s4.last
375
+ r4 = (SyntaxNode).new(input, i4...index, s4)
376
+ r4.extend(Cells0)
377
+ else
378
+ self.index = i4
379
+ r4 = nil
380
+ end
381
+ s1 << r4
382
+ end
383
+ if s1.last
384
+ r1 = (SyntaxNode).new(input, i1...index, s1)
385
+ r1.extend(Cells1)
386
+ else
387
+ self.index = i1
388
+ r1 = nil
389
+ end
390
+ if r1
391
+ r0 = r1
392
+ else
393
+ i8, s8 = index, []
394
+ s9, i9 = [], index
395
+ loop do
396
+ r10 = _nt_cell
397
+ if r10
398
+ s9 << r10
399
+ else
400
+ break
401
+ end
402
+ end
403
+ r9 = SyntaxNode.new(input, i9...index, s9)
404
+ s8 << r9
405
+ if r9
406
+ r11 = _nt_ignore
407
+ s8 << r11
408
+ end
409
+ if s8.last
410
+ r8 = (SyntaxNode).new(input, i8...index, s8)
411
+ r8.extend(Cells2)
412
+ else
413
+ self.index = i8
414
+ r8 = nil
415
+ end
416
+ if r8
417
+ r0 = r8
418
+ else
419
+ self.index = i0
420
+ r0 = nil
421
+ end
422
+ end
423
+
424
+ node_cache[:cells][start_index] = r0
425
+
426
+ return r0
427
+ end
428
+
276
429
  def _nt_atom
277
430
  start_index = index
278
431
  if node_cache[:atom].has_key?(index)
@@ -300,10 +453,10 @@ module Heist
300
453
  return r0
301
454
  end
302
455
 
303
- module Datum0
456
+ module Datum0 #:nodoc:
304
457
  end
305
458
 
306
- module Datum1
459
+ module Datum1 #:nodoc:
307
460
  end
308
461
 
309
462
  def _nt_datum
@@ -462,12 +615,12 @@ module Heist
462
615
  return r0
463
616
  end
464
617
 
465
- module Complex0
618
+ module Complex0 #:nodoc:
466
619
  def real
467
620
  elements[0]
468
621
  end
469
622
 
470
- def real
623
+ def imaginary
471
624
  elements[2]
472
625
  end
473
626
 
@@ -482,29 +635,53 @@ module Heist
482
635
  end
483
636
 
484
637
  i0, s0 = index, []
485
- r1 = _nt_real
638
+ i1 = index
639
+ r2 = _nt_real
640
+ if r2
641
+ r1 = r2
642
+ else
643
+ r3 = _nt_integer
644
+ if r3
645
+ r1 = r3
646
+ else
647
+ self.index = i1
648
+ r1 = nil
649
+ end
650
+ end
486
651
  s0 << r1
487
652
  if r1
488
653
  if input.index("+", index) == index
489
- r2 = (SyntaxNode).new(input, index...(index + 1))
654
+ r4 = (SyntaxNode).new(input, index...(index + 1))
490
655
  @index += 1
491
656
  else
492
657
  terminal_parse_failure("+")
493
- r2 = nil
658
+ r4 = nil
494
659
  end
495
- s0 << r2
496
- if r2
497
- r3 = _nt_real
498
- s0 << r3
499
- if r3
660
+ s0 << r4
661
+ if r4
662
+ i5 = index
663
+ r6 = _nt_real
664
+ if r6
665
+ r5 = r6
666
+ else
667
+ r7 = _nt_integer
668
+ if r7
669
+ r5 = r7
670
+ else
671
+ self.index = i5
672
+ r5 = nil
673
+ end
674
+ end
675
+ s0 << r5
676
+ if r5
500
677
  if input.index("i", index) == index
501
- r4 = (SyntaxNode).new(input, index...(index + 1))
678
+ r8 = (SyntaxNode).new(input, index...(index + 1))
502
679
  @index += 1
503
680
  else
504
681
  terminal_parse_failure("i")
505
- r4 = nil
682
+ r8 = nil
506
683
  end
507
- s0 << r4
684
+ s0 << r8
508
685
  end
509
686
  end
510
687
  end
@@ -521,10 +698,10 @@ module Heist
521
698
  return r0
522
699
  end
523
700
 
524
- module Real0
701
+ module Real0 #:nodoc:
525
702
  end
526
703
 
527
- module Real1
704
+ module Real1 #:nodoc:
528
705
  def integer
529
706
  elements[0]
530
707
  end
@@ -592,7 +769,7 @@ module Heist
592
769
  return r0
593
770
  end
594
771
 
595
- module Rational0
772
+ module Rational0 #:nodoc:
596
773
  def numerator
597
774
  elements[0]
598
775
  end
@@ -640,10 +817,10 @@ module Heist
640
817
  return r0
641
818
  end
642
819
 
643
- module Integer0
820
+ module Integer0 #:nodoc:
644
821
  end
645
822
 
646
- module Integer1
823
+ module Integer1 #:nodoc:
647
824
  end
648
825
 
649
826
  def _nt_integer
@@ -730,7 +907,7 @@ module Heist
730
907
  return r0
731
908
  end
732
909
 
733
- module String0
910
+ module String0 #:nodoc:
734
911
  end
735
912
 
736
913
  def _nt_string
@@ -809,7 +986,16 @@ module Heist
809
986
  return r0
810
987
  end
811
988
 
812
- module Identifier0
989
+ module Identifier0 #:nodoc:
990
+ end
991
+
992
+ module Identifier1 #:nodoc:
993
+ end
994
+
995
+ module Identifier2 #:nodoc:
996
+ end
997
+
998
+ module Identifier3 #:nodoc:
813
999
  end
814
1000
 
815
1001
  def _nt_identifier
@@ -820,47 +1006,126 @@ module Heist
820
1006
  return cached
821
1007
  end
822
1008
 
823
- s0, i0 = [], index
824
- loop do
825
- i1, s1 = index, []
826
- i2 = index
827
- r3 = _nt_delimiter
828
- if r3
829
- r2 = nil
1009
+ i0 = index
1010
+ i1, s1 = index, []
1011
+ i2, s2 = index, []
1012
+ i3 = index
1013
+ r4 = _nt_delimiter
1014
+ if r4
1015
+ r3 = nil
1016
+ else
1017
+ self.index = i3
1018
+ r3 = SyntaxNode.new(input, index...index)
1019
+ end
1020
+ s2 << r3
1021
+ if r3
1022
+ if index < input_length
1023
+ r5 = (SyntaxNode).new(input, index...(index + 1))
1024
+ @index += 1
830
1025
  else
831
- self.index = i2
832
- r2 = SyntaxNode.new(input, index...index)
1026
+ terminal_parse_failure("any character")
1027
+ r5 = nil
833
1028
  end
834
- s1 << r2
835
- if r2
1029
+ s2 << r5
1030
+ end
1031
+ if s2.last
1032
+ r2 = (SyntaxNode).new(input, i2...index, s2)
1033
+ r2.extend(Identifier0)
1034
+ else
1035
+ self.index = i2
1036
+ r2 = nil
1037
+ end
1038
+ s1 << r2
1039
+ if r2
1040
+ s6, i6 = [], index
1041
+ loop do
1042
+ i7, s7 = index, []
1043
+ i8 = index
1044
+ r9 = _nt_delimiter
1045
+ if r9
1046
+ r8 = nil
1047
+ else
1048
+ self.index = i8
1049
+ r8 = SyntaxNode.new(input, index...index)
1050
+ end
1051
+ s7 << r8
1052
+ if r8
1053
+ if index < input_length
1054
+ r10 = (SyntaxNode).new(input, index...(index + 1))
1055
+ @index += 1
1056
+ else
1057
+ terminal_parse_failure("any character")
1058
+ r10 = nil
1059
+ end
1060
+ s7 << r10
1061
+ end
1062
+ if s7.last
1063
+ r7 = (SyntaxNode).new(input, i7...index, s7)
1064
+ r7.extend(Identifier1)
1065
+ else
1066
+ self.index = i7
1067
+ r7 = nil
1068
+ end
1069
+ if r7
1070
+ s6 << r7
1071
+ else
1072
+ break
1073
+ end
1074
+ end
1075
+ if s6.empty?
1076
+ self.index = i6
1077
+ r6 = nil
1078
+ else
1079
+ r6 = SyntaxNode.new(input, i6...index, s6)
1080
+ end
1081
+ s1 << r6
1082
+ end
1083
+ if s1.last
1084
+ r1 = (SyntaxNode).new(input, i1...index, s1)
1085
+ r1.extend(Identifier2)
1086
+ else
1087
+ self.index = i1
1088
+ r1 = nil
1089
+ end
1090
+ if r1
1091
+ r0 = r1
1092
+ r0.extend(Identifier)
1093
+ else
1094
+ i11, s11 = index, []
1095
+ i12 = index
1096
+ r13 = _nt_reserved
1097
+ if r13
1098
+ r12 = nil
1099
+ else
1100
+ self.index = i12
1101
+ r12 = SyntaxNode.new(input, index...index)
1102
+ end
1103
+ s11 << r12
1104
+ if r12
836
1105
  if index < input_length
837
- r4 = (SyntaxNode).new(input, index...(index + 1))
1106
+ r14 = (SyntaxNode).new(input, index...(index + 1))
838
1107
  @index += 1
839
1108
  else
840
1109
  terminal_parse_failure("any character")
841
- r4 = nil
1110
+ r14 = nil
842
1111
  end
843
- s1 << r4
1112
+ s11 << r14
844
1113
  end
845
- if s1.last
846
- r1 = (SyntaxNode).new(input, i1...index, s1)
847
- r1.extend(Identifier0)
1114
+ if s11.last
1115
+ r11 = (SyntaxNode).new(input, i11...index, s11)
1116
+ r11.extend(Identifier3)
848
1117
  else
849
- self.index = i1
850
- r1 = nil
1118
+ self.index = i11
1119
+ r11 = nil
851
1120
  end
852
- if r1
853
- s0 << r1
1121
+ if r11
1122
+ r0 = r11
1123
+ r0.extend(Identifier)
854
1124
  else
855
- break
1125
+ self.index = i0
1126
+ r0 = nil
856
1127
  end
857
1128
  end
858
- if s0.empty?
859
- self.index = i0
860
- r0 = nil
861
- else
862
- r0 = Identifier.new(input, i0...index, s0)
863
- end
864
1129
 
865
1130
  node_cache[:identifier][start_index] = r0
866
1131
 
@@ -887,6 +1152,33 @@ module Heist
887
1152
  return r0
888
1153
  end
889
1154
 
1155
+ def _nt_reserved
1156
+ start_index = index
1157
+ if node_cache[:reserved].has_key?(index)
1158
+ cached = node_cache[:reserved][index]
1159
+ @index = cached.interval.end if cached
1160
+ return cached
1161
+ end
1162
+
1163
+ i0 = index
1164
+ r1 = _nt_dot
1165
+ if r1
1166
+ r0 = r1
1167
+ else
1168
+ r2 = _nt_delimiter
1169
+ if r2
1170
+ r0 = r2
1171
+ else
1172
+ self.index = i0
1173
+ r0 = nil
1174
+ end
1175
+ end
1176
+
1177
+ node_cache[:reserved][start_index] = r0
1178
+
1179
+ return r0
1180
+ end
1181
+
890
1182
  def _nt_delimiter
891
1183
  start_index = index
892
1184
  if node_cache[:delimiter].has_key?(index)
@@ -896,21 +1188,21 @@ module Heist
896
1188
  end
897
1189
 
898
1190
  i0 = index
899
- if input.index(Regexp.new('[\\(\\)\\[\\]]'), index) == index
900
- r1 = (SyntaxNode).new(input, index...(index + 1))
901
- @index += 1
902
- else
903
- r1 = nil
904
- end
1191
+ r1 = _nt_quote
905
1192
  if r1
906
1193
  r0 = r1
907
1194
  else
908
- r2 = _nt_space
1195
+ r2 = _nt_paren
909
1196
  if r2
910
1197
  r0 = r2
911
1198
  else
912
- self.index = i0
913
- r0 = nil
1199
+ r3 = _nt_space
1200
+ if r3
1201
+ r0 = r3
1202
+ else
1203
+ self.index = i0
1204
+ r0 = nil
1205
+ end
914
1206
  end
915
1207
  end
916
1208
 
@@ -919,6 +1211,26 @@ module Heist
919
1211
  return r0
920
1212
  end
921
1213
 
1214
+ def _nt_paren
1215
+ start_index = index
1216
+ if node_cache[:paren].has_key?(index)
1217
+ cached = node_cache[:paren][index]
1218
+ @index = cached.interval.end if cached
1219
+ return cached
1220
+ end
1221
+
1222
+ if input.index(Regexp.new('[\\(\\)\\[\\]]'), index) == index
1223
+ r0 = (SyntaxNode).new(input, index...(index + 1))
1224
+ @index += 1
1225
+ else
1226
+ r0 = nil
1227
+ end
1228
+
1229
+ node_cache[:paren][start_index] = r0
1230
+
1231
+ return r0
1232
+ end
1233
+
922
1234
  def _nt_space
923
1235
  start_index = index
924
1236
  if node_cache[:space].has_key?(index)
@@ -939,7 +1251,7 @@ module Heist
939
1251
  return r0
940
1252
  end
941
1253
 
942
- module Ignore0
1254
+ module Ignore0 #:nodoc:
943
1255
  end
944
1256
 
945
1257
  def _nt_ignore
@@ -984,10 +1296,10 @@ module Heist
984
1296
  return r0
985
1297
  end
986
1298
 
987
- module Comment0
1299
+ module Comment0 #:nodoc:
988
1300
  end
989
1301
 
990
- module Comment1
1302
+ module Comment1 #:nodoc:
991
1303
  def ignore
992
1304
  elements[2]
993
1305
  end