heist 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -124,21 +124,14 @@ end
124
124
 
125
125
  # TODO write a more exact implementation, and implement (eq?)
126
126
  define('eqv?') do |op1, op2|
127
- (Identifier === op1 and op1 == op2) or op1.equal?(op2)
127
+ ([Identifier, Character].any? { |type| type === op1 } and op1 == op2) or
128
+ op1.equal?(op2)
128
129
  end
129
130
 
130
131
  define('equal?') do |op1, op2|
131
132
  op1 == op2
132
133
  end
133
134
 
134
- # Returns true iff the given number is exact i.e. an integer, a
135
- # rational, or a complex made of integers
136
- define('exact?') do |value|
137
- call('rational?', value) || (Complex === value &&
138
- call('rational?', value.real) &&
139
- call('rational?', value.imag))
140
- end
141
-
142
135
  # Returns true iff the arguments are monotonically decreasing
143
136
  define('>') do |*args|
144
137
  result = true
@@ -187,6 +180,10 @@ define('integer?') do |value|
187
180
  Integer === value
188
181
  end
189
182
 
183
+ define('char?') do |value|
184
+ Character === value
185
+ end
186
+
190
187
  define('string?') do |value|
191
188
  String === value
192
189
  end
@@ -203,6 +200,10 @@ define('pair?') do |value|
203
200
  Cons === value and value.pair?
204
201
  end
205
202
 
203
+ define('vector?') do |value|
204
+ Vector === value
205
+ end
206
+
206
207
  #----------------------------------------------------------------
207
208
 
208
209
  # Numerical functions
@@ -266,7 +267,7 @@ end
266
267
  # Returns a new complex number with the given real and
267
268
  # imaginary parts
268
269
  define('make-rectangular') do |real, imag|
269
- Complex.new(real, imag)
270
+ Complex(real, imag)
270
271
  end
271
272
 
272
273
  # Returns the real part of a number
@@ -321,6 +322,117 @@ end
321
322
 
322
323
  #----------------------------------------------------------------
323
324
 
325
+ # Symbol functions
326
+
327
+ # Returns a new string by casting the given symbol to a string
328
+ define('symbol->string') do |symbol|
329
+ symbol.to_s
330
+ end
331
+
332
+ # Returns the symbol whose name is the given string
333
+ define('string->symbol') do |string|
334
+ Identifier.new(string)
335
+ end
336
+
337
+ #----------------------------------------------------------------
338
+
339
+ # Character functions
340
+
341
+ # Returns true iff the two characters are equal
342
+ define('char=?') do |op1, op2|
343
+ Character === op1 and op1 == op2
344
+ end
345
+
346
+ define('char<?') do |op1, op2|
347
+ Character === op1 and Character === op2 and op1 < op2
348
+ end
349
+
350
+ define('char>?') do |op1, op2|
351
+ Character === op1 and Character === op2 and op1 > op2
352
+ end
353
+
354
+ define('char<=?') do |op1, op2|
355
+ Character === op1 and Character === op2 and op1 <= op2
356
+ end
357
+
358
+ define('char>=?') do |op1, op2|
359
+ Character === op1 and Character === op2 and op1 >= op2
360
+ end
361
+
362
+ # Returns a new character from an ASCII code
363
+ define('integer->char') do |code|
364
+ Character.new(code.chr)
365
+ end
366
+
367
+ # Returns the ASCII code for a character
368
+ define('char->integer') do |char|
369
+ char.char_code
370
+ end
371
+
372
+ #----------------------------------------------------------------
373
+
374
+ # String functions
375
+
376
+ # Returns a new string of the given size, filled with the given
377
+ # character. If no character is given, a space is used.
378
+ define('make-string') do |size, char|
379
+ char = " " if char.nil?
380
+ char.to_s * size
381
+ end
382
+
383
+ # Returns the length of the string
384
+ define('string-length') do |string|
385
+ string.length
386
+ end
387
+
388
+ # Returns the kth character in the string
389
+ define('string-ref') do |string, k|
390
+ size = string.length
391
+ raise BadIndexError.new("Cannot access index #{k} in string \"#{string}\"") if k >= size
392
+ char = string[k]
393
+ char = char.chr if Numeric === char
394
+ Character.new(char)
395
+ end
396
+
397
+ # Sets the kth character in string equal to char
398
+ define('string-set!') do |string, k, char|
399
+ raise ImmutableError.new("Cannot modify string constant") if string.frozen?
400
+ string[k] = char.to_s
401
+ string
402
+ end
403
+
404
+ #----------------------------------------------------------------
405
+
406
+ # Vector functions
407
+
408
+ # Returns a new vector of the given size, filled with the given
409
+ # filler value (this defaults to the NULL list)
410
+ define('make-vector') do |size, fill|
411
+ fill = Cons::NULL if fill.nil?
412
+ Vector.new(size, fill)
413
+ end
414
+
415
+ # Returns the length of the vector
416
+ define('vector-length') do |vector|
417
+ vector.size
418
+ end
419
+
420
+ # Returns the kth element of a vector
421
+ define('vector-ref') do |vector, k|
422
+ size = vector.size
423
+ raise BadIndexError.new("Cannot access index #{k} of vector of length #{size}") if k >= size
424
+ vector[k]
425
+ end
426
+
427
+ # Sets the kth element of a vector to object
428
+ define('vector-set!') do |vector, k, object|
429
+ size = vector.size
430
+ raise BadIndexError.new("Cannot modify index #{k} of vector of length #{size}") if k >= size
431
+ vector[k] = object
432
+ end
433
+
434
+ #----------------------------------------------------------------
435
+
324
436
  # Control features
325
437
 
326
438
  # Calls a function using a list for the arguments
@@ -61,11 +61,11 @@
61
61
  ; for several nested (let)s. Variables may refer to those that
62
62
  ; preceed them but not vice versa.
63
63
  (define-syntax let* (syntax-rules ()
64
- [(let* ([name expression]) body ...)
65
- (let ([name expression]) body ...)]
66
- [(let* ([n1 e1] [n2 e2] ...) body ...)
64
+ [(let* ([n1 e1] [n2 e2] [n3 e3] ...) body ...) ; 2 or more bindings
67
65
  (let ([n1 e1])
68
- (let* ([n2 e2] ...) body ...))]))
66
+ (let* ([n2 e2] [n3 e3] ...) body ...))]
67
+ [(let* ([name expression] ...) body ...) ; 0 or 1 binding
68
+ (let ([name expression] ...) body ...)]))
69
69
 
70
70
  ; (letrec) evaluates values in the inner scope, so lambdas are
71
71
  ; able to refer to other values assigned using the (letrec).
@@ -159,14 +159,10 @@
159
159
  ; it will evaluate it and insert the result into the
160
160
  ; surrounding quoted list.
161
161
  (define-syntax quasiquote (syntax-rules (unquote unquote-splicing)
162
- [(quasiquote (unquote expr))
163
- expr]
164
- [(quasiquote ((unquote-splicing expr)))
165
- expr]
166
- [(quasiquote ((unquote-splicing expr) . rest))
167
- (append expr (quasiquote rest))]
168
- [(quasiquote (first . rest))
169
- (cons (quasiquote first) (quasiquote rest))]
170
- [(quasiquote expr)
171
- 'expr]))
162
+ [`,expr expr]
163
+ [`(,@first . rest) (append first `rest)]
164
+ [`(first . rest) (cons `first `rest)]
165
+ [`#(,@first rest ...) (list->vector `(,@first rest ...))]
166
+ [`#(expr ...) (list->vector `(expr ...))]
167
+ [`expr 'expr]))
172
168
 
@@ -9,7 +9,7 @@ require 'treetop'
9
9
  # utility methods that don't belong anywhere else. See the README for an
10
10
  # overview of Heist's features.
11
11
  module Heist
12
- VERSION = '0.2.1'
12
+ VERSION = '0.3.0'
13
13
 
14
14
  ROOT_PATH = File.expand_path(File.dirname(__FILE__))
15
15
  PARSER_PATH = ROOT_PATH + '/parser/'
@@ -21,6 +21,7 @@ module Heist
21
21
  require PARSER_PATH + 'scheme'
22
22
  require PARSER_PATH + 'nodes'
23
23
  require RUNTIME_PATH + 'runtime'
24
+ require ROOT_PATH + '/trie'
24
25
  require ROOT_PATH + '/repl'
25
26
 
26
27
  LOAD_PATH = [LIB_PATH]
@@ -33,6 +34,7 @@ module Heist
33
34
  class MacroError < SyntaxError; end
34
35
  class MacroTemplateMismatch < MacroError; end
35
36
  class TypeError < RuntimeError; end
37
+ class BadIndexError < TypeError; end
36
38
  class ImmutableError < TypeError; end
37
39
 
38
40
  class << self
@@ -55,25 +57,15 @@ module Heist
55
57
  expression
56
58
  end
57
59
 
58
- # Returns a new complex number with the given +real+ and +imaginary+ parts.
59
- def complex(real, imaginary)
60
- Complex.new(real, imaginary)
61
- end
62
-
63
- # Returns a new rational number with the given +numerator+ and +denominator+.
64
- def rational(numerator, denominator)
65
- Rational(numerator, denominator)
66
- end
67
-
68
60
  # Returns the result of dividing the first argument by the second. If both
69
61
  # arguments are integers, returns a rational rather than performing
70
62
  # integer division as Ruby would normally do.
71
63
  def divide(op1, op2)
72
64
  [op1, op2].all? { |value| Integer === value } ?
73
- rational(op1, op2) :
65
+ Rational(op1, op2) :
74
66
  op1.to_f / op2
75
67
  end
68
+
76
69
  end
77
-
78
70
  end
79
71
 
@@ -31,7 +31,7 @@ module Heist
31
31
  # Converts all the +Treetop+ objects in the +Program+ to Heist objects
32
32
  # and raw Ruby data ready for interpretation using a +Runtime+.
33
33
  def convert!
34
- return if @data
34
+ return @data if @data
35
35
  @data = Runtime::Cons.construct(elements[1].elements, true) { |c| c.eval }
36
36
  end
37
37
  end
@@ -55,6 +55,17 @@ module Heist
55
55
  end
56
56
  end
57
57
 
58
+ # A +Vector+ is an array-like structure if integer-indexed cells
59
+ module Vector
60
+ def eval
61
+ Runtime::Vector.new(cells) { |cell| cell.eval }
62
+ end
63
+
64
+ def cells
65
+ @cells ||= elements[2].elements
66
+ end
67
+ end
68
+
58
69
  # <tt>QuotedCell</tt> are generated using the quoting shorthands.
59
70
  class QuotedCell < Treetop::Runtime::SyntaxNode
60
71
  # Evaluating a +QuotedCell+ produces a +Cons+ that expresses a function
@@ -81,7 +92,7 @@ module Heist
81
92
  end
82
93
  end
83
94
 
84
- module Boolean
95
+ class Boolean < Treetop::Runtime::SyntaxNode
85
96
  def eval
86
97
  @value ||= (text_value == "#t")
87
98
  end
@@ -89,7 +100,7 @@ module Heist
89
100
 
90
101
  class Complex < Treetop::Runtime::SyntaxNode
91
102
  def eval
92
- @value ||= Heist.complex(real.eval, imaginary.eval)
103
+ @value ||= Complex(real.eval, imaginary.eval)
93
104
  end
94
105
  end
95
106
 
@@ -101,7 +112,7 @@ module Heist
101
112
 
102
113
  class Rational < Treetop::Runtime::SyntaxNode
103
114
  def eval
104
- @value ||= Heist.rational(numerator.eval, denominator.eval)
115
+ @value ||= Rational(numerator.eval, denominator.eval)
105
116
  end
106
117
  end
107
118
 
@@ -111,9 +122,18 @@ module Heist
111
122
  end
112
123
  end
113
124
 
125
+ class Character < Treetop::Runtime::SyntaxNode
126
+ def eval
127
+ Runtime::Character.new(glyph.text_value)
128
+ end
129
+ end
130
+
114
131
  class String < Treetop::Runtime::SyntaxNode
115
132
  def eval
116
- @value ||= Kernel.eval(text_value)
133
+ return @value if @value
134
+ @value = Kernel.eval(text_value)
135
+ @value.freeze
136
+ @value
117
137
  end
118
138
  end
119
139
 
@@ -22,7 +22,7 @@ module Heist
22
22
  if r2
23
23
  r1 = r2
24
24
  else
25
- r1 = SyntaxNode.new(input, index...index)
25
+ r1 = instantiate_node(SyntaxNode,input, index...index)
26
26
  end
27
27
  s0 << r1
28
28
  if r1
@@ -35,11 +35,11 @@ module Heist
35
35
  break
36
36
  end
37
37
  end
38
- r3 = SyntaxNode.new(input, i3...index, s3)
38
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
39
39
  s0 << r3
40
40
  end
41
41
  if s0.last
42
- r0 = (Program).new(input, i0...index, s0)
42
+ r0 = instantiate_node(Program,input, i0...index, s0)
43
43
  r0.extend(Program0)
44
44
  else
45
45
  self.index = i0
@@ -75,11 +75,11 @@ module Heist
75
75
  break
76
76
  end
77
77
  end
78
- r1 = SyntaxNode.new(input, i1...index, s1)
78
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
79
79
  s0 << r1
80
80
  if r1
81
81
  if input.index("#!", index) == index
82
- r3 = (SyntaxNode).new(input, index...(index + 2))
82
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 2))
83
83
  @index += 2
84
84
  else
85
85
  terminal_parse_failure("#!")
@@ -92,7 +92,7 @@ module Heist
92
92
  i5, s5 = index, []
93
93
  i6 = index
94
94
  if input.index(Regexp.new('[\\n\\r]'), index) == index
95
- r7 = (SyntaxNode).new(input, index...(index + 1))
95
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
96
96
  @index += 1
97
97
  else
98
98
  r7 = nil
@@ -101,12 +101,12 @@ module Heist
101
101
  r6 = nil
102
102
  else
103
103
  self.index = i6
104
- r6 = SyntaxNode.new(input, index...index)
104
+ r6 = instantiate_node(SyntaxNode,input, index...index)
105
105
  end
106
106
  s5 << r6
107
107
  if r6
108
108
  if index < input_length
109
- r8 = (SyntaxNode).new(input, index...(index + 1))
109
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
110
110
  @index += 1
111
111
  else
112
112
  terminal_parse_failure("any character")
@@ -115,7 +115,7 @@ module Heist
115
115
  s5 << r8
116
116
  end
117
117
  if s5.last
118
- r5 = (SyntaxNode).new(input, i5...index, s5)
118
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
119
119
  r5.extend(Shebang0)
120
120
  else
121
121
  self.index = i5
@@ -127,12 +127,12 @@ module Heist
127
127
  break
128
128
  end
129
129
  end
130
- r4 = SyntaxNode.new(input, i4...index, s4)
130
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
131
131
  s0 << r4
132
132
  end
133
133
  end
134
134
  if s0.last
135
- r0 = (SyntaxNode).new(input, i0...index, s0)
135
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
136
136
  r0.extend(Shebang1)
137
137
  else
138
138
  self.index = i0
@@ -189,7 +189,7 @@ module Heist
189
189
  end
190
190
  end
191
191
  if s1.last
192
- r1 = (QuotedCell).new(input, i1...index, s1)
192
+ r1 = instantiate_node(QuotedCell,input, i1...index, s1)
193
193
  r1.extend(Cell0)
194
194
  else
195
195
  self.index = i1
@@ -207,22 +207,27 @@ module Heist
207
207
  if r8
208
208
  r7 = r8
209
209
  else
210
- r9 = _nt_atom
210
+ r9 = _nt_vector
211
211
  if r9
212
212
  r7 = r9
213
213
  else
214
- self.index = i7
215
- r7 = nil
214
+ r10 = _nt_atom
215
+ if r10
216
+ r7 = r10
217
+ else
218
+ self.index = i7
219
+ r7 = nil
220
+ end
216
221
  end
217
222
  end
218
223
  s5 << r7
219
224
  if r7
220
- r10 = _nt_ignore
221
- s5 << r10
225
+ r11 = _nt_ignore
226
+ s5 << r11
222
227
  end
223
228
  end
224
229
  if s5.last
225
- r5 = (Cell).new(input, i5...index, s5)
230
+ r5 = instantiate_node(Cell,input, i5...index, s5)
226
231
  r5.extend(Cell1)
227
232
  else
228
233
  self.index = i5
@@ -251,7 +256,7 @@ module Heist
251
256
 
252
257
  i0 = index
253
258
  if input.index("'", index) == index
254
- r1 = (SyntaxNode).new(input, index...(index + 1))
259
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
255
260
  @index += 1
256
261
  else
257
262
  terminal_parse_failure("'")
@@ -261,7 +266,7 @@ module Heist
261
266
  r0 = r1
262
267
  else
263
268
  if input.index("`", index) == index
264
- r2 = (SyntaxNode).new(input, index...(index + 1))
269
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
265
270
  @index += 1
266
271
  else
267
272
  terminal_parse_failure("`")
@@ -271,7 +276,7 @@ module Heist
271
276
  r0 = r2
272
277
  else
273
278
  if input.index(",@", index) == index
274
- r3 = (SyntaxNode).new(input, index...(index + 2))
279
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 2))
275
280
  @index += 2
276
281
  else
277
282
  terminal_parse_failure(",@")
@@ -281,7 +286,7 @@ module Heist
281
286
  r0 = r3
282
287
  else
283
288
  if input.index(",", index) == index
284
- r4 = (SyntaxNode).new(input, index...(index + 1))
289
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
285
290
  @index += 1
286
291
  else
287
292
  terminal_parse_failure(",")
@@ -311,7 +316,7 @@ module Heist
311
316
  end
312
317
 
313
318
  if input.index(".", index) == index
314
- r0 = (SyntaxNode).new(input, index...(index + 1))
319
+ r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
315
320
  @index += 1
316
321
  else
317
322
  terminal_parse_failure(".")
@@ -323,6 +328,27 @@ module Heist
323
328
  return r0
324
329
  end
325
330
 
331
+ def _nt_hash
332
+ start_index = index
333
+ if node_cache[:hash].has_key?(index)
334
+ cached = node_cache[:hash][index]
335
+ @index = cached.interval.end if cached
336
+ return cached
337
+ end
338
+
339
+ if input.index("#", index) == index
340
+ r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
341
+ @index += 1
342
+ else
343
+ terminal_parse_failure("#")
344
+ r0 = nil
345
+ end
346
+
347
+ node_cache[:hash][start_index] = r0
348
+
349
+ return r0
350
+ end
351
+
326
352
  module List0 #:nodoc:
327
353
  def cells
328
354
  elements[1]
@@ -348,7 +374,7 @@ module Heist
348
374
  i0 = index
349
375
  i1, s1 = index, []
350
376
  if input.index("(", index) == index
351
- r2 = (SyntaxNode).new(input, index...(index + 1))
377
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
352
378
  @index += 1
353
379
  else
354
380
  terminal_parse_failure("(")
@@ -360,7 +386,7 @@ module Heist
360
386
  s1 << r3
361
387
  if r3
362
388
  if input.index(")", index) == index
363
- r4 = (SyntaxNode).new(input, index...(index + 1))
389
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
364
390
  @index += 1
365
391
  else
366
392
  terminal_parse_failure(")")
@@ -370,7 +396,7 @@ module Heist
370
396
  end
371
397
  end
372
398
  if s1.last
373
- r1 = (SyntaxNode).new(input, i1...index, s1)
399
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
374
400
  r1.extend(List0)
375
401
  else
376
402
  self.index = i1
@@ -382,7 +408,7 @@ module Heist
382
408
  else
383
409
  i5, s5 = index, []
384
410
  if input.index("[", index) == index
385
- r6 = (SyntaxNode).new(input, index...(index + 1))
411
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
386
412
  @index += 1
387
413
  else
388
414
  terminal_parse_failure("[")
@@ -394,7 +420,7 @@ module Heist
394
420
  s5 << r7
395
421
  if r7
396
422
  if input.index("]", index) == index
397
- r8 = (SyntaxNode).new(input, index...(index + 1))
423
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
398
424
  @index += 1
399
425
  else
400
426
  terminal_parse_failure("]")
@@ -404,7 +430,7 @@ module Heist
404
430
  end
405
431
  end
406
432
  if s5.last
407
- r5 = (SyntaxNode).new(input, i5...index, s5)
433
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
408
434
  r5.extend(List1)
409
435
  else
410
436
  self.index = i5
@@ -470,7 +496,7 @@ module Heist
470
496
  self.index = i2
471
497
  r2 = nil
472
498
  else
473
- r2 = SyntaxNode.new(input, i2...index, s2)
499
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
474
500
  end
475
501
  s1 << r2
476
502
  if r2
@@ -486,7 +512,7 @@ module Heist
486
512
  end
487
513
  end
488
514
  if s4.last
489
- r4 = (SyntaxNode).new(input, i4...index, s4)
515
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
490
516
  r4.extend(Cells0)
491
517
  else
492
518
  self.index = i4
@@ -495,7 +521,7 @@ module Heist
495
521
  s1 << r4
496
522
  end
497
523
  if s1.last
498
- r1 = (SyntaxNode).new(input, i1...index, s1)
524
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
499
525
  r1.extend(Cells1)
500
526
  else
501
527
  self.index = i1
@@ -514,14 +540,14 @@ module Heist
514
540
  break
515
541
  end
516
542
  end
517
- r9 = SyntaxNode.new(input, i9...index, s9)
543
+ r9 = instantiate_node(SyntaxNode,input, i9...index, s9)
518
544
  s8 << r9
519
545
  if r9
520
546
  r11 = _nt_ignore
521
547
  s8 << r11
522
548
  end
523
549
  if s8.last
524
- r8 = (SyntaxNode).new(input, i8...index, s8)
550
+ r8 = instantiate_node(SyntaxNode,input, i8...index, s8)
525
551
  r8.extend(Cells2)
526
552
  else
527
553
  self.index = i8
@@ -540,6 +566,149 @@ module Heist
540
566
  return r0
541
567
  end
542
568
 
569
+ module Vector0 #:nodoc:
570
+ def hash
571
+ elements[0]
572
+ end
573
+
574
+ def ignore
575
+ elements[3]
576
+ end
577
+
578
+ end
579
+
580
+ module Vector1 #:nodoc:
581
+ def hash
582
+ elements[0]
583
+ end
584
+
585
+ def ignore
586
+ elements[3]
587
+ end
588
+
589
+ end
590
+
591
+ def _nt_vector
592
+ start_index = index
593
+ if node_cache[:vector].has_key?(index)
594
+ cached = node_cache[:vector][index]
595
+ @index = cached.interval.end if cached
596
+ return cached
597
+ end
598
+
599
+ i0 = index
600
+ i1, s1 = index, []
601
+ r2 = _nt_hash
602
+ s1 << r2
603
+ if r2
604
+ if input.index("(", index) == index
605
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
606
+ @index += 1
607
+ else
608
+ terminal_parse_failure("(")
609
+ r3 = nil
610
+ end
611
+ s1 << r3
612
+ if r3
613
+ s4, i4 = [], index
614
+ loop do
615
+ r5 = _nt_cell
616
+ if r5
617
+ s4 << r5
618
+ else
619
+ break
620
+ end
621
+ end
622
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
623
+ s1 << r4
624
+ if r4
625
+ r6 = _nt_ignore
626
+ s1 << r6
627
+ if r6
628
+ if input.index(")", index) == index
629
+ r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
630
+ @index += 1
631
+ else
632
+ terminal_parse_failure(")")
633
+ r7 = nil
634
+ end
635
+ s1 << r7
636
+ end
637
+ end
638
+ end
639
+ end
640
+ if s1.last
641
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
642
+ r1.extend(Vector0)
643
+ else
644
+ self.index = i1
645
+ r1 = nil
646
+ end
647
+ if r1
648
+ r0 = r1
649
+ r0.extend(Vector)
650
+ else
651
+ i8, s8 = index, []
652
+ r9 = _nt_hash
653
+ s8 << r9
654
+ if r9
655
+ if input.index("[", index) == index
656
+ r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
657
+ @index += 1
658
+ else
659
+ terminal_parse_failure("[")
660
+ r10 = nil
661
+ end
662
+ s8 << r10
663
+ if r10
664
+ s11, i11 = [], index
665
+ loop do
666
+ r12 = _nt_cell
667
+ if r12
668
+ s11 << r12
669
+ else
670
+ break
671
+ end
672
+ end
673
+ r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
674
+ s8 << r11
675
+ if r11
676
+ r13 = _nt_ignore
677
+ s8 << r13
678
+ if r13
679
+ if input.index("]", index) == index
680
+ r14 = instantiate_node(SyntaxNode,input, index...(index + 1))
681
+ @index += 1
682
+ else
683
+ terminal_parse_failure("]")
684
+ r14 = nil
685
+ end
686
+ s8 << r14
687
+ end
688
+ end
689
+ end
690
+ end
691
+ if s8.last
692
+ r8 = instantiate_node(SyntaxNode,input, i8...index, s8)
693
+ r8.extend(Vector1)
694
+ else
695
+ self.index = i8
696
+ r8 = nil
697
+ end
698
+ if r8
699
+ r0 = r8
700
+ r0.extend(Vector)
701
+ else
702
+ self.index = i0
703
+ r0 = nil
704
+ end
705
+ end
706
+
707
+ node_cache[:vector][start_index] = r0
708
+
709
+ return r0
710
+ end
711
+
543
712
  def _nt_atom
544
713
  start_index = index
545
714
  if node_cache[:atom].has_key?(index)
@@ -591,55 +760,60 @@ module Heist
591
760
  if r3
592
761
  r1 = r3
593
762
  else
594
- r4 = _nt_string
763
+ r4 = _nt_character
595
764
  if r4
596
765
  r1 = r4
597
766
  else
598
- self.index = i1
599
- r1 = nil
767
+ r5 = _nt_string
768
+ if r5
769
+ r1 = r5
770
+ else
771
+ self.index = i1
772
+ r1 = nil
773
+ end
600
774
  end
601
775
  end
602
776
  end
603
777
  s0 << r1
604
778
  if r1
605
- i5 = index
606
- i6, s6 = index, []
607
- i7 = index
608
- r8 = _nt_delimiter
609
- if r8
610
- r7 = nil
779
+ i6 = index
780
+ i7, s7 = index, []
781
+ i8 = index
782
+ r9 = _nt_delimiter
783
+ if r9
784
+ r8 = nil
611
785
  else
612
- self.index = i7
613
- r7 = SyntaxNode.new(input, index...index)
786
+ self.index = i8
787
+ r8 = instantiate_node(SyntaxNode,input, index...index)
614
788
  end
615
- s6 << r7
616
- if r7
789
+ s7 << r8
790
+ if r8
617
791
  if index < input_length
618
- r9 = (SyntaxNode).new(input, index...(index + 1))
792
+ r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
619
793
  @index += 1
620
794
  else
621
795
  terminal_parse_failure("any character")
622
- r9 = nil
796
+ r10 = nil
623
797
  end
624
- s6 << r9
798
+ s7 << r10
625
799
  end
626
- if s6.last
627
- r6 = (SyntaxNode).new(input, i6...index, s6)
628
- r6.extend(Datum0)
800
+ if s7.last
801
+ r7 = instantiate_node(SyntaxNode,input, i7...index, s7)
802
+ r7.extend(Datum0)
629
803
  else
630
- self.index = i6
631
- r6 = nil
804
+ self.index = i7
805
+ r7 = nil
632
806
  end
633
- if r6
634
- r5 = nil
807
+ if r7
808
+ r6 = nil
635
809
  else
636
- self.index = i5
637
- r5 = SyntaxNode.new(input, index...index)
810
+ self.index = i6
811
+ r6 = instantiate_node(SyntaxNode,input, index...index)
638
812
  end
639
- s0 << r5
813
+ s0 << r6
640
814
  end
641
815
  if s0.last
642
- r0 = (Datum).new(input, i0...index, s0)
816
+ r0 = instantiate_node(Datum,input, i0...index, s0)
643
817
  r0.extend(Datum1)
644
818
  else
645
819
  self.index = i0
@@ -651,6 +825,13 @@ module Heist
651
825
  return r0
652
826
  end
653
827
 
828
+ module Boolean0 #:nodoc:
829
+ def hash
830
+ elements[0]
831
+ end
832
+
833
+ end
834
+
654
835
  def _nt_boolean
655
836
  start_index = index
656
837
  if node_cache[:boolean].has_key?(index)
@@ -659,32 +840,24 @@ module Heist
659
840
  return cached
660
841
  end
661
842
 
662
- i0 = index
663
- if input.index("#t", index) == index
664
- r1 = (SyntaxNode).new(input, index...(index + 2))
665
- @index += 2
666
- else
667
- terminal_parse_failure("#t")
668
- r1 = nil
669
- end
843
+ i0, s0 = index, []
844
+ r1 = _nt_hash
845
+ s0 << r1
670
846
  if r1
671
- r0 = r1
672
- r0.extend(Boolean)
673
- else
674
- if input.index("#f", index) == index
675
- r2 = (SyntaxNode).new(input, index...(index + 2))
676
- @index += 2
847
+ if input.index(Regexp.new('[tf]'), index) == index
848
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
849
+ @index += 1
677
850
  else
678
- terminal_parse_failure("#f")
679
851
  r2 = nil
680
852
  end
681
- if r2
682
- r0 = r2
683
- r0.extend(Boolean)
684
- else
685
- self.index = i0
686
- r0 = nil
687
- end
853
+ s0 << r2
854
+ end
855
+ if s0.last
856
+ r0 = instantiate_node(Boolean,input, i0...index, s0)
857
+ r0.extend(Boolean0)
858
+ else
859
+ self.index = i0
860
+ r0 = nil
688
861
  end
689
862
 
690
863
  node_cache[:boolean][start_index] = r0
@@ -765,7 +938,7 @@ module Heist
765
938
  s0 << r1
766
939
  if r1
767
940
  if input.index("+", index) == index
768
- r4 = (SyntaxNode).new(input, index...(index + 1))
941
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
769
942
  @index += 1
770
943
  else
771
944
  terminal_parse_failure("+")
@@ -789,7 +962,7 @@ module Heist
789
962
  s0 << r5
790
963
  if r5
791
964
  if input.index("i", index) == index
792
- r8 = (SyntaxNode).new(input, index...(index + 1))
965
+ r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
793
966
  @index += 1
794
967
  else
795
968
  terminal_parse_failure("i")
@@ -800,7 +973,7 @@ module Heist
800
973
  end
801
974
  end
802
975
  if s0.last
803
- r0 = (Complex).new(input, i0...index, s0)
976
+ r0 = instantiate_node(Complex,input, i0...index, s0)
804
977
  r0.extend(Complex0)
805
978
  else
806
979
  self.index = i0
@@ -836,7 +1009,7 @@ module Heist
836
1009
  if r1
837
1010
  i2, s2 = index, []
838
1011
  if input.index(".", index) == index
839
- r3 = (SyntaxNode).new(input, index...(index + 1))
1012
+ r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
840
1013
  @index += 1
841
1014
  else
842
1015
  terminal_parse_failure(".")
@@ -857,12 +1030,12 @@ module Heist
857
1030
  self.index = i4
858
1031
  r4 = nil
859
1032
  else
860
- r4 = SyntaxNode.new(input, i4...index, s4)
1033
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
861
1034
  end
862
1035
  s2 << r4
863
1036
  end
864
1037
  if s2.last
865
- r2 = (SyntaxNode).new(input, i2...index, s2)
1038
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
866
1039
  r2.extend(Real0)
867
1040
  else
868
1041
  self.index = i2
@@ -871,7 +1044,7 @@ module Heist
871
1044
  s0 << r2
872
1045
  end
873
1046
  if s0.last
874
- r0 = (Real).new(input, i0...index, s0)
1047
+ r0 = instantiate_node(Real,input, i0...index, s0)
875
1048
  r0.extend(Real1)
876
1049
  else
877
1050
  self.index = i0
@@ -906,7 +1079,7 @@ module Heist
906
1079
  s0 << r1
907
1080
  if r1
908
1081
  if input.index("/", index) == index
909
- r2 = (SyntaxNode).new(input, index...(index + 1))
1082
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
910
1083
  @index += 1
911
1084
  else
912
1085
  terminal_parse_failure("/")
@@ -919,7 +1092,7 @@ module Heist
919
1092
  end
920
1093
  end
921
1094
  if s0.last
922
- r0 = (Rational).new(input, i0...index, s0)
1095
+ r0 = instantiate_node(Rational,input, i0...index, s0)
923
1096
  r0.extend(Rational0)
924
1097
  else
925
1098
  self.index = i0
@@ -947,7 +1120,7 @@ module Heist
947
1120
 
948
1121
  i0, s0 = index, []
949
1122
  if input.index("-", index) == index
950
- r2 = (SyntaxNode).new(input, index...(index + 1))
1123
+ r2 = instantiate_node(SyntaxNode,input, index...(index + 1))
951
1124
  @index += 1
952
1125
  else
953
1126
  terminal_parse_failure("-")
@@ -956,13 +1129,13 @@ module Heist
956
1129
  if r2
957
1130
  r1 = r2
958
1131
  else
959
- r1 = SyntaxNode.new(input, index...index)
1132
+ r1 = instantiate_node(SyntaxNode,input, index...index)
960
1133
  end
961
1134
  s0 << r1
962
1135
  if r1
963
1136
  i3 = index
964
1137
  if input.index("0", index) == index
965
- r4 = (SyntaxNode).new(input, index...(index + 1))
1138
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
966
1139
  @index += 1
967
1140
  else
968
1141
  terminal_parse_failure("0")
@@ -973,7 +1146,7 @@ module Heist
973
1146
  else
974
1147
  i5, s5 = index, []
975
1148
  if input.index(Regexp.new('[1-9]'), index) == index
976
- r6 = (SyntaxNode).new(input, index...(index + 1))
1149
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
977
1150
  @index += 1
978
1151
  else
979
1152
  r6 = nil
@@ -989,11 +1162,11 @@ module Heist
989
1162
  break
990
1163
  end
991
1164
  end
992
- r7 = SyntaxNode.new(input, i7...index, s7)
1165
+ r7 = instantiate_node(SyntaxNode,input, i7...index, s7)
993
1166
  s5 << r7
994
1167
  end
995
1168
  if s5.last
996
- r5 = (SyntaxNode).new(input, i5...index, s5)
1169
+ r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
997
1170
  r5.extend(Integer0)
998
1171
  else
999
1172
  self.index = i5
@@ -1009,7 +1182,7 @@ module Heist
1009
1182
  s0 << r3
1010
1183
  end
1011
1184
  if s0.last
1012
- r0 = (Integer).new(input, i0...index, s0)
1185
+ r0 = instantiate_node(Integer,input, i0...index, s0)
1013
1186
  r0.extend(Integer1)
1014
1187
  else
1015
1188
  self.index = i0
@@ -1021,6 +1194,64 @@ module Heist
1021
1194
  return r0
1022
1195
  end
1023
1196
 
1197
+ module Character0 #:nodoc:
1198
+ def glyph
1199
+ elements[1]
1200
+ end
1201
+ end
1202
+
1203
+ def _nt_character
1204
+ start_index = index
1205
+ if node_cache[:character].has_key?(index)
1206
+ cached = node_cache[:character][index]
1207
+ @index = cached.interval.end if cached
1208
+ return cached
1209
+ end
1210
+
1211
+ i0, s0 = index, []
1212
+ if input.index("#\\", index) == index
1213
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 2))
1214
+ @index += 2
1215
+ else
1216
+ terminal_parse_failure("#\\")
1217
+ r1 = nil
1218
+ end
1219
+ s0 << r1
1220
+ if r1
1221
+ i2 = index
1222
+ r3 = _nt_identifier
1223
+ if r3
1224
+ r2 = r3
1225
+ else
1226
+ if index < input_length
1227
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
1228
+ @index += 1
1229
+ else
1230
+ terminal_parse_failure("any character")
1231
+ r4 = nil
1232
+ end
1233
+ if r4
1234
+ r2 = r4
1235
+ else
1236
+ self.index = i2
1237
+ r2 = nil
1238
+ end
1239
+ end
1240
+ s0 << r2
1241
+ end
1242
+ if s0.last
1243
+ r0 = instantiate_node(Character,input, i0...index, s0)
1244
+ r0.extend(Character0)
1245
+ else
1246
+ self.index = i0
1247
+ r0 = nil
1248
+ end
1249
+
1250
+ node_cache[:character][start_index] = r0
1251
+
1252
+ return r0
1253
+ end
1254
+
1024
1255
  module String0 #:nodoc:
1025
1256
  end
1026
1257
 
@@ -1034,7 +1265,7 @@ module Heist
1034
1265
 
1035
1266
  i0, s0 = index, []
1036
1267
  if input.index('"', index) == index
1037
- r1 = (SyntaxNode).new(input, index...(index + 1))
1268
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
1038
1269
  @index += 1
1039
1270
  else
1040
1271
  terminal_parse_failure('"')
@@ -1046,7 +1277,7 @@ module Heist
1046
1277
  loop do
1047
1278
  i3 = index
1048
1279
  if input.index('\\"', index) == index
1049
- r4 = (SyntaxNode).new(input, index...(index + 2))
1280
+ r4 = instantiate_node(SyntaxNode,input, index...(index + 2))
1050
1281
  @index += 2
1051
1282
  else
1052
1283
  terminal_parse_failure('\\"')
@@ -1056,7 +1287,7 @@ module Heist
1056
1287
  r3 = r4
1057
1288
  else
1058
1289
  if input.index(Regexp.new('[^"]'), index) == index
1059
- r5 = (SyntaxNode).new(input, index...(index + 1))
1290
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
1060
1291
  @index += 1
1061
1292
  else
1062
1293
  r5 = nil
@@ -1074,11 +1305,11 @@ module Heist
1074
1305
  break
1075
1306
  end
1076
1307
  end
1077
- r2 = SyntaxNode.new(input, i2...index, s2)
1308
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
1078
1309
  s0 << r2
1079
1310
  if r2
1080
1311
  if input.index('"', index) == index
1081
- r6 = (SyntaxNode).new(input, index...(index + 1))
1312
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
1082
1313
  @index += 1
1083
1314
  else
1084
1315
  terminal_parse_failure('"')
@@ -1088,7 +1319,7 @@ module Heist
1088
1319
  end
1089
1320
  end
1090
1321
  if s0.last
1091
- r0 = (String).new(input, i0...index, s0)
1322
+ r0 = instantiate_node(String,input, i0...index, s0)
1092
1323
  r0.extend(String0)
1093
1324
  else
1094
1325
  self.index = i0
@@ -1129,12 +1360,12 @@ module Heist
1129
1360
  r3 = nil
1130
1361
  else
1131
1362
  self.index = i3
1132
- r3 = SyntaxNode.new(input, index...index)
1363
+ r3 = instantiate_node(SyntaxNode,input, index...index)
1133
1364
  end
1134
1365
  s2 << r3
1135
1366
  if r3
1136
1367
  if index < input_length
1137
- r5 = (SyntaxNode).new(input, index...(index + 1))
1368
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
1138
1369
  @index += 1
1139
1370
  else
1140
1371
  terminal_parse_failure("any character")
@@ -1143,7 +1374,7 @@ module Heist
1143
1374
  s2 << r5
1144
1375
  end
1145
1376
  if s2.last
1146
- r2 = (SyntaxNode).new(input, i2...index, s2)
1377
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
1147
1378
  r2.extend(Identifier0)
1148
1379
  else
1149
1380
  self.index = i2
@@ -1160,12 +1391,12 @@ module Heist
1160
1391
  r8 = nil
1161
1392
  else
1162
1393
  self.index = i8
1163
- r8 = SyntaxNode.new(input, index...index)
1394
+ r8 = instantiate_node(SyntaxNode,input, index...index)
1164
1395
  end
1165
1396
  s7 << r8
1166
1397
  if r8
1167
1398
  if index < input_length
1168
- r10 = (SyntaxNode).new(input, index...(index + 1))
1399
+ r10 = instantiate_node(SyntaxNode,input, index...(index + 1))
1169
1400
  @index += 1
1170
1401
  else
1171
1402
  terminal_parse_failure("any character")
@@ -1174,7 +1405,7 @@ module Heist
1174
1405
  s7 << r10
1175
1406
  end
1176
1407
  if s7.last
1177
- r7 = (SyntaxNode).new(input, i7...index, s7)
1408
+ r7 = instantiate_node(SyntaxNode,input, i7...index, s7)
1178
1409
  r7.extend(Identifier1)
1179
1410
  else
1180
1411
  self.index = i7
@@ -1190,12 +1421,12 @@ module Heist
1190
1421
  self.index = i6
1191
1422
  r6 = nil
1192
1423
  else
1193
- r6 = SyntaxNode.new(input, i6...index, s6)
1424
+ r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
1194
1425
  end
1195
1426
  s1 << r6
1196
1427
  end
1197
1428
  if s1.last
1198
- r1 = (SyntaxNode).new(input, i1...index, s1)
1429
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
1199
1430
  r1.extend(Identifier2)
1200
1431
  else
1201
1432
  self.index = i1
@@ -1212,12 +1443,12 @@ module Heist
1212
1443
  r12 = nil
1213
1444
  else
1214
1445
  self.index = i12
1215
- r12 = SyntaxNode.new(input, index...index)
1446
+ r12 = instantiate_node(SyntaxNode,input, index...index)
1216
1447
  end
1217
1448
  s11 << r12
1218
1449
  if r12
1219
1450
  if index < input_length
1220
- r14 = (SyntaxNode).new(input, index...(index + 1))
1451
+ r14 = instantiate_node(SyntaxNode,input, index...(index + 1))
1221
1452
  @index += 1
1222
1453
  else
1223
1454
  terminal_parse_failure("any character")
@@ -1226,7 +1457,7 @@ module Heist
1226
1457
  s11 << r14
1227
1458
  end
1228
1459
  if s11.last
1229
- r11 = (SyntaxNode).new(input, i11...index, s11)
1460
+ r11 = instantiate_node(SyntaxNode,input, i11...index, s11)
1230
1461
  r11.extend(Identifier3)
1231
1462
  else
1232
1463
  self.index = i11
@@ -1255,7 +1486,7 @@ module Heist
1255
1486
  end
1256
1487
 
1257
1488
  if input.index(Regexp.new('[0-9]'), index) == index
1258
- r0 = (SyntaxNode).new(input, index...(index + 1))
1489
+ r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
1259
1490
  @index += 1
1260
1491
  else
1261
1492
  r0 = nil
@@ -1306,16 +1537,21 @@ module Heist
1306
1537
  if r1
1307
1538
  r0 = r1
1308
1539
  else
1309
- r2 = _nt_paren
1540
+ r2 = _nt_hash
1310
1541
  if r2
1311
1542
  r0 = r2
1312
1543
  else
1313
- r3 = _nt_space
1544
+ r3 = _nt_paren
1314
1545
  if r3
1315
1546
  r0 = r3
1316
1547
  else
1317
- self.index = i0
1318
- r0 = nil
1548
+ r4 = _nt_space
1549
+ if r4
1550
+ r0 = r4
1551
+ else
1552
+ self.index = i0
1553
+ r0 = nil
1554
+ end
1319
1555
  end
1320
1556
  end
1321
1557
  end
@@ -1334,7 +1570,7 @@ module Heist
1334
1570
  end
1335
1571
 
1336
1572
  if input.index(Regexp.new('[\\(\\)\\[\\]]'), index) == index
1337
- r0 = (SyntaxNode).new(input, index...(index + 1))
1573
+ r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
1338
1574
  @index += 1
1339
1575
  else
1340
1576
  r0 = nil
@@ -1354,7 +1590,7 @@ module Heist
1354
1590
  end
1355
1591
 
1356
1592
  if input.index(Regexp.new('[\\s\\n\\r\\t]'), index) == index
1357
- r0 = (SyntaxNode).new(input, index...(index + 1))
1593
+ r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
1358
1594
  @index += 1
1359
1595
  else
1360
1596
  r0 = nil
@@ -1366,6 +1602,16 @@ module Heist
1366
1602
  end
1367
1603
 
1368
1604
  module Ignore0 #:nodoc:
1605
+ def comment
1606
+ elements[0]
1607
+ end
1608
+
1609
+ def ignore
1610
+ elements[1]
1611
+ end
1612
+ end
1613
+
1614
+ module Ignore1 #:nodoc:
1369
1615
  end
1370
1616
 
1371
1617
  def _nt_ignore
@@ -1386,20 +1632,33 @@ module Heist
1386
1632
  break
1387
1633
  end
1388
1634
  end
1389
- r1 = SyntaxNode.new(input, i1...index, s1)
1635
+ r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
1390
1636
  s0 << r1
1391
1637
  if r1
1392
- r4 = _nt_comment
1638
+ i4, s4 = index, []
1639
+ r5 = _nt_comment
1640
+ s4 << r5
1641
+ if r5
1642
+ r6 = _nt_ignore
1643
+ s4 << r6
1644
+ end
1645
+ if s4.last
1646
+ r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
1647
+ r4.extend(Ignore0)
1648
+ else
1649
+ self.index = i4
1650
+ r4 = nil
1651
+ end
1393
1652
  if r4
1394
1653
  r3 = r4
1395
1654
  else
1396
- r3 = SyntaxNode.new(input, index...index)
1655
+ r3 = instantiate_node(SyntaxNode,input, index...index)
1397
1656
  end
1398
1657
  s0 << r3
1399
1658
  end
1400
1659
  if s0.last
1401
- r0 = (SyntaxNode).new(input, i0...index, s0)
1402
- r0.extend(Ignore0)
1660
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1661
+ r0.extend(Ignore1)
1403
1662
  else
1404
1663
  self.index = i0
1405
1664
  r0 = nil
@@ -1414,9 +1673,6 @@ module Heist
1414
1673
  end
1415
1674
 
1416
1675
  module Comment1 #:nodoc:
1417
- def ignore
1418
- elements[2]
1419
- end
1420
1676
  end
1421
1677
 
1422
1678
  def _nt_comment
@@ -1429,7 +1685,7 @@ module Heist
1429
1685
 
1430
1686
  i0, s0 = index, []
1431
1687
  if input.index(";", index) == index
1432
- r1 = (SyntaxNode).new(input, index...(index + 1))
1688
+ r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
1433
1689
  @index += 1
1434
1690
  else
1435
1691
  terminal_parse_failure(";")
@@ -1442,7 +1698,7 @@ module Heist
1442
1698
  i3, s3 = index, []
1443
1699
  i4 = index
1444
1700
  if input.index(Regexp.new('[\\n\\r]'), index) == index
1445
- r5 = (SyntaxNode).new(input, index...(index + 1))
1701
+ r5 = instantiate_node(SyntaxNode,input, index...(index + 1))
1446
1702
  @index += 1
1447
1703
  else
1448
1704
  r5 = nil
@@ -1451,12 +1707,12 @@ module Heist
1451
1707
  r4 = nil
1452
1708
  else
1453
1709
  self.index = i4
1454
- r4 = SyntaxNode.new(input, index...index)
1710
+ r4 = instantiate_node(SyntaxNode,input, index...index)
1455
1711
  end
1456
1712
  s3 << r4
1457
1713
  if r4
1458
1714
  if index < input_length
1459
- r6 = (SyntaxNode).new(input, index...(index + 1))
1715
+ r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
1460
1716
  @index += 1
1461
1717
  else
1462
1718
  terminal_parse_failure("any character")
@@ -1465,7 +1721,7 @@ module Heist
1465
1721
  s3 << r6
1466
1722
  end
1467
1723
  if s3.last
1468
- r3 = (SyntaxNode).new(input, i3...index, s3)
1724
+ r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
1469
1725
  r3.extend(Comment0)
1470
1726
  else
1471
1727
  self.index = i3
@@ -1477,15 +1733,11 @@ module Heist
1477
1733
  break
1478
1734
  end
1479
1735
  end
1480
- r2 = SyntaxNode.new(input, i2...index, s2)
1736
+ r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
1481
1737
  s0 << r2
1482
- if r2
1483
- r7 = _nt_ignore
1484
- s0 << r7
1485
- end
1486
1738
  end
1487
1739
  if s0.last
1488
- r0 = (SyntaxNode).new(input, i0...index, s0)
1740
+ r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
1489
1741
  r0.extend(Comment1)
1490
1742
  else
1491
1743
  self.index = i0