rubasteme 0.1.1 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f983bac291b02cde63445a66509273604d6f64fabb7c833d24e7430f5605962d
4
- data.tar.gz: 9a08587175a838efb7572f17185e22891d58dc68cf9dacfd497d2ef1dd06bca2
3
+ metadata.gz: 64c7c931d6ce0f30b29ef9333c9e7152abce225dce5a97d735341b6d62e6b331
4
+ data.tar.gz: 761c91ab6bf8b418a9bf2f6949fd48e0155b7014ea0d38c0587b2afb014c5614
5
5
  SHA512:
6
- metadata.gz: 18df612e9ba4413f7e256e07e0227ac09a81db6926ff432d04d8e3c8742141479daa897e6f67e571b6e9c5d2e4ab93ab80eac30db0811a8dcd653c4b46d949c4
7
- data.tar.gz: 5b89ff08b4e4567b441aa50d0000e8237ea631d8987e4f4fb8dbe09109ed25d6f168751d72088867da2f441c65febc787951426a6276165d688a85742b157572
6
+ metadata.gz: 317a934288b9dc1df0001b15b923ba385801bcee0359178a050c64380192d8bb212a2328138db9c92ab75f2b41d427956a9f2777d3835677de0ed37c08da0c10
7
+ data.tar.gz: 972222e1ea19919cf532c909ffef26639da2b5534ff73d296a046c8eac222328a3d11d71af5c2f2d7453c7ea3e477c54fd3d9ac17e8261d838cab05e93f44df9
data/CHANGELOG.md CHANGED
@@ -1,6 +1,41 @@
1
1
  ## [Unreleased]
2
2
  - (nothing to record here)
3
3
 
4
+ ## [0.1.6] - 2021-06-09
5
+ ### Fixed:
6
+ - Fix #8: cannot generate a procedure call node if operator is a
7
+ lambda expression.
8
+
9
+ ## [0.1.5] - 2021-06-09
10
+ ### Added
11
+ - Add a new node to represent `case` expression and its parsing.
12
+
13
+ ### Changed
14
+ - Refactor parser to parse in 2 phases.
15
+
16
+ ### Fixed
17
+ - Fix #5: incorrect parsing with internal definition at wrong
18
+ position.
19
+
20
+ ## [0.1.4] - 2021-05-31
21
+ ### Added
22
+ - Add a new node to represent sequence. (#3)
23
+ - Incorporate missing methods to ListNode from rbsiev project.
24
+
25
+ ### Fixed
26
+ - Fix #2: typo in the version string.
27
+
28
+ ## [0.1.3] - 2021-05-20
29
+ ### Fixed
30
+ - Change a method name of AST::CondNode.
31
+ - `#cond_clause` -> `#cond_clauses`
32
+ - Modify the timing to pass lexer to parser in `exe/rubasteme`.
33
+ - Fix #1: `:ast_vector` is missing in AST::AST_NODE_TYPE.
34
+
35
+ ## [0.1.2] - 2021-05-20
36
+ ### Added
37
+ - Add a singleton method, `version` to Parser class.
38
+
4
39
  ## [0.1.1] - 2021-05-20
5
40
  ### Changed
6
41
  - Change the timing to pass a lexer instance to a Parser object:
data/examples/mini_rus3 CHANGED
@@ -155,7 +155,7 @@ class Evaluator
155
155
 
156
156
  def translate_lambda_expression(ast_node)
157
157
  formals = ast_node.formals.map{|e| translate(e)}.join(",")
158
- body = ast_node.body.map{|e| translate(e)}.join("; ")
158
+ body = ast_node.body.sequence.map{|e| translate(e)}.join("; ")
159
159
  "lambda{|#{formals}|#{body}}"
160
160
  end
161
161
 
@@ -172,10 +172,15 @@ class Evaluator
172
172
  def translate_identifier_definition(ast_node)
173
173
  name = translate(ast_node.identifier)
174
174
  if ast_node.expression.type == :ast_lambda_expression
175
+ src = ""
175
176
  node = ast_node.expression
176
177
  formals = node.formals.map{|e| translate(e)}.join(", ")
177
- body = node.body.map{|e| translate(e)}.join("; ")
178
- "def #{name}(#{formals}); #{body}; end"
178
+ unless node.body.definitions.empty?
179
+ src += node.body.definitions.map{|e| translate(e)}.join("; ")
180
+ src += "; "
181
+ end
182
+ body = node.body.sequence.map{|e| translate(e)}.join("; ")
183
+ src + "def #{name}(#{formals}); #{body}; end"
179
184
  else
180
185
  value = translate(ast_node.expression)
181
186
  "#{name} = #{value}"
@@ -184,7 +189,7 @@ class Evaluator
184
189
 
185
190
  end
186
191
 
187
- parser = Rubasteme::Parser.new
192
+ parser = Rubasteme.parser
188
193
  evaluator = Evaluator.new
189
194
 
190
195
  require "readline"
@@ -25,7 +25,7 @@ module SicpScheme
25
25
 
26
26
  def self.repl(prompt)
27
27
  env = TOPLEVEL_ENV
28
- parser = Rubasteme::Parser.new
28
+ parser = Rubasteme.parser
29
29
  evaluator = Evaluator.new
30
30
  printer = Printer.new
31
31
 
@@ -43,6 +43,9 @@ module SicpScheme
43
43
  when *EV_IF
44
44
  eval_if(exp, env)
45
45
  when *EV_LAMBDA
46
+ internal_definitions(exp).each { |d|
47
+ eval_definition(d, env)
48
+ }
46
49
  make_procedure(lambda_parameters(exp),
47
50
  lambda_body(exp),
48
51
  env)
@@ -199,8 +202,9 @@ module SicpScheme
199
202
  end
200
203
 
201
204
  def begin_actions(exp)
202
- # exp = [:ast_begin, [:ast_*_1], [:ast_*_2], ... ]
203
- exp[1..-1]
205
+ # exp = [:ast_begin, [:ast_sequence]]
206
+ # sequence = [:ast_sequence, [:ast_*_1], [:ast_*_2], ...]
207
+ exp[1][1..-1]
204
208
  end
205
209
 
206
210
  def eval_sequence(exps, env)
@@ -241,15 +245,24 @@ module SicpScheme
241
245
  exp[2]
242
246
  end
243
247
 
248
+ def internal_definitions(exp)
249
+ # exp = [:ast_lambda_expression, [:ast_formals], [:ast_body]]
250
+ # body = [:ast_body, [:ast_internal_definitions], [:ast_sequence]]
251
+ # internal_definitions = [:ast_intern_definitions, [:ast_definition], ...]
252
+ exp[2][1][1..-1]
253
+ end
254
+
244
255
  def lambda_parameters(exp)
245
- # exp = [:ast_lambda_expression, [:ast_formals], [:ast_*_1] ...]
256
+ # exp = [:ast_lambda_expression, [:ast_formals], [:ast_body]]
246
257
  formals = exp[1][1..-1]
247
258
  formals.map{|node| identifier(node)}
248
259
  end
249
260
 
250
261
  def lambda_body(exp)
251
- # exp = [:ast_lambda_expression, [:ast_formals], [:ast_*_1] ...]
252
- exp[2..-1]
262
+ # exp = [:ast_lambda_expression, [:ast_formals], [:ast_body]]
263
+ # body = [:ast_body, [:ast_internal_definitions], [:ast_sequence]]
264
+ # sequence = [:ast_sequence, [:ast_*_1], [:ast_*_2], ...]
265
+ exp[2][2][1..-1]
253
266
  end
254
267
 
255
268
  def make_procedure(parameters, body, env)
data/exe/rubasteme CHANGED
@@ -73,8 +73,8 @@ end
73
73
 
74
74
  tokens = lines.map{|e| Kernel.eval(e)}
75
75
  lexer = Rubasteme.lexer(tokens)
76
- parser = Rubasteme.parser(lexer)
77
- ast = parser.parse
76
+ parser = Rubasteme.parser
77
+ ast = parser.parse(lexer)
78
78
 
79
79
  output = ""
80
80
  PP.pp(ast.to_a, output)
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rbscmlex
4
+
5
+ # :stopdoc:
6
+ EMSG = {
7
+ unexpected_token_type: "unexpected token type: got=%s, expected=%s",
8
+ missing_right_parenthesis: "missing right parenthesis",
9
+ }
10
+ # :startdoc:
11
+
12
+ # Indicates a token is not expected one.
13
+ class UnexpectedTokenTypeError < Error
14
+ def initialize(got, expected = nil)
15
+ super(EMSG[:unexpected_token_type] % [got, expected])
16
+ end
17
+ end
18
+
19
+ # Indicates a mismatch of parenthesizes.
20
+ class MissingRightParenthesisError < Error
21
+ def initialize
22
+ super(EMSG[:missing_right_parenthesis])
23
+ end
24
+ end
25
+
26
+ class Lexer
27
+
28
+ def skip_lparen(offset = 0)
29
+ if peek_token(offset).type == :lparen
30
+ skip_token(offset)
31
+ else
32
+ raise UnexpectedTokenTypeError.new(peek_token(offset).type, :lparen)
33
+ end
34
+ end
35
+
36
+ def skip_rparen(offset = 0)
37
+ if peek_token(offset).type == :rparen
38
+ skip_token(offset)
39
+ else
40
+ raise MissingRightParenthesisError
41
+ end
42
+ end
43
+
44
+ end
45
+
46
+ end
data/lib/rubasteme.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rbscmlex"
4
+ require_relative "rbscmlex/missing"
4
5
 
5
6
  module Rubasteme
6
7
 
@@ -8,6 +9,10 @@ module Rubasteme
8
9
  Rbscmlex::Lexer.new(obj)
9
10
  end
10
11
 
12
+ def self.parse(source)
13
+ parser.parse(lexer(source))
14
+ end
15
+
11
16
  require_relative "rubasteme/error"
12
17
  require_relative "rubasteme/utils"
13
18
  require_relative "rubasteme/ast"
data/lib/rubasteme/ast.rb CHANGED
@@ -19,17 +19,27 @@ module Rubasteme
19
19
  :ast_dot,
20
20
  # branch
21
21
  :ast_program,
22
+ :ast_vector,
22
23
  :ast_list,
23
24
  :ast_quotation,
24
25
  :ast_procedure_call,
25
26
  :ast_lambda_expression,
26
27
  :ast_formals,
28
+ :ast_body,
29
+ :ast_internal_definitions,
30
+ :ast_sequence,
27
31
  :ast_conditional,
28
32
  :ast_assignment,
29
33
  :ast_identifier_definition,
30
34
  :ast_cond,
31
35
  :ast_cond_clause,
36
+ :ast_cond_recipient_clause,
37
+ :ast_else_clause,
32
38
  :ast_case,
39
+ :ast_case_clause,
40
+ :ast_data,
41
+ :ast_case_recipient_clause,
42
+ :ast_else_recipient_clause,
33
43
  :ast_and,
34
44
  :ast_or,
35
45
  :ast_when,
@@ -49,7 +59,7 @@ module Rubasteme
49
59
  :ast_illegal,
50
60
  ]
51
61
 
52
- def self.instantiate(ast_node_type, literal)
62
+ def self.instantiate(ast_node_type, literal = nil)
53
63
  type_name = Utils.camel_case(ast_node_type.to_s.delete_prefix("ast_"))
54
64
  klass = AST.const_get("#{type_name}Node")
55
65
 
@@ -55,21 +55,37 @@ module Rubasteme
55
55
  end
56
56
 
57
57
  class ListNode < BranchNode
58
- def initialize(_ = nil)
59
- super(nil)
58
+ def initialize(initial_size = 0, _ = nil)
59
+ super(initial_size)
60
+ end
61
+
62
+ def empty?
63
+ @nodes.empty?
64
+ end
65
+
66
+ def first
67
+ @nodes[0]
68
+ end
69
+
70
+ def rest
71
+ @nodes[1..-1]
72
+ end
73
+
74
+ def elements
75
+ @nodes
60
76
  end
61
77
  end
62
78
 
63
79
  class QuotationNode < ListNode
64
80
  def initialize(_ = nil)
65
- super(nil)
81
+ super(0, nil)
66
82
  end
67
83
  end
68
84
 
69
85
  class ProcedureCallNode < ListNode
70
86
  def initialize(_ = nil)
71
87
  # @nodes = [<operator>, <operand>*]
72
- super(1)
88
+ super(1, _)
73
89
  end
74
90
 
75
91
  def operator
@@ -91,8 +107,8 @@ module Rubasteme
91
107
 
92
108
  class LambdaExpressionNode < ListNode
93
109
  def initialize(_ = nil)
94
- # @nodes = [<formals>, <body>, ...]
95
- super(1)
110
+ # @nodes = [<formals>, <body>]
111
+ super(2, _)
96
112
  end
97
113
 
98
114
  def formals
@@ -104,20 +120,18 @@ module Rubasteme
104
120
  end
105
121
 
106
122
  def body
107
- @nodes[1..-1]
123
+ @nodes[1]
108
124
  end
109
125
 
110
- def body=(nodes)
111
- nodes.each_with_index { |node, i|
112
- @nodes[i + 1] = node
113
- }
126
+ def body=(node)
127
+ @nodes[1] = node
114
128
  end
115
129
  end
116
130
 
117
131
  class FormalsNode < ListNode
118
132
  def initialize(_ = nil)
119
133
  # @nodes = [<identifier 1>, <identifier 2>, ... ]
120
- super(nil)
134
+ super(0, nil)
121
135
  end
122
136
 
123
137
  def add_identifier(node)
@@ -125,11 +139,64 @@ module Rubasteme
125
139
  end
126
140
  end
127
141
 
142
+ class HoldingSequenceBaseNode < ListNode
143
+ def initialize(initial_size = 0, sequence_pos = 0, _ = nil)
144
+ # @nodes = [..., <sequence>, ...]
145
+ super(initial_size, _)
146
+ @sequence_pos = sequence_pos
147
+ end
148
+
149
+ def sequence
150
+ @nodes[@sequence_pos]
151
+ end
152
+
153
+ def sequence=(node)
154
+ @nodes[@sequence_pos] = node
155
+ end
156
+ end
157
+
158
+ class BodyNode < HoldingSequenceBaseNode
159
+ def initialize(_ = nil)
160
+ # @nodes = [<definitions>, <sequence>]
161
+ super(2, 1, _)
162
+ end
163
+
164
+ def definitions
165
+ @nodes[0]
166
+ end
167
+
168
+ def definitions=(node)
169
+ @nodes[0] = node
170
+ end
171
+ end
172
+
173
+ class InternalDefinitionsNode < ListNode
174
+ def initialize(_ = nil)
175
+ # @nodes = [<definition 1>, <definition 2>, ... ]
176
+ super(0, nil)
177
+ end
178
+
179
+ def add_definition(node)
180
+ @nodes << node
181
+ end
182
+ end
183
+
184
+ class SequenceNode < ListNode
185
+ def initialize(_ = nil)
186
+ # @nodes = [<expression 1>, <expression 2>, ... ]
187
+ super(0, _)
188
+ end
189
+
190
+ def add_expression(node)
191
+ @nodes << node
192
+ end
193
+ end
194
+
128
195
  class ConditionalNode < ListNode
129
196
  def initialize(_ = nil)
130
197
  # @nodes = [<test>, <consequent>] or
131
198
  # [<test>, <consequent>, <alternate>]
132
- super(1)
199
+ super(2, _)
133
200
  end
134
201
 
135
202
  def test
@@ -164,7 +231,7 @@ module Rubasteme
164
231
  class AssignmentNode < ListNode
165
232
  def initialize(_ = nil)
166
233
  # @nodes = [<identifier>, <expression>]
167
- super(2)
234
+ super(2, _)
168
235
  end
169
236
 
170
237
  def identifier
@@ -188,7 +255,7 @@ module Rubasteme
188
255
  def initialize(_ = nil)
189
256
  # @nodes = [<identifier>, <expression>]
190
257
  # <expression> might be a lambda expression.
191
- super(2)
258
+ super(2, _)
192
259
  end
193
260
 
194
261
  def identifier
@@ -224,10 +291,10 @@ module Rubasteme
224
291
 
225
292
  class CondNode < ListNode
226
293
  def initialize(_ = nil)
227
- super(nil)
294
+ super(0, _)
228
295
  end
229
296
 
230
- def cond_clause
297
+ def cond_clauses
231
298
  @nodes[0..-1]
232
299
  end
233
300
 
@@ -236,10 +303,12 @@ module Rubasteme
236
303
  end
237
304
  end
238
305
 
239
- class CondClauseNode < ListNode
240
- # @nodes = [<test>, <sequence>]
306
+ class CondClauseNode < HoldingSequenceBaseNode
241
307
  def initialize(_ = nil)
242
- super(nil)
308
+ # type 1: @nodes = [<test>, <sequence>]
309
+ # type 2: @nodes = [<test>]
310
+ # - <sequence> is empty
311
+ super(2, 1, _)
243
312
  end
244
313
 
245
314
  def test
@@ -249,33 +318,135 @@ module Rubasteme
249
318
  def test=(node)
250
319
  @nodes[0] = node
251
320
  end
321
+ end
252
322
 
253
- def sequence
323
+ class RecipientClauseBaseNode < ListNode
324
+ def initialize(initial_size = 0, recipient_pos = 0, _ = nil)
325
+ # @nodes = [<recipient>]
326
+ # <recipient> -> <expression>
327
+ super(initial_size, _)
328
+ @recipient_pos = recipient_pos
329
+ end
330
+
331
+ def recipient
332
+ @nodes[@recipient_pos]
333
+ end
334
+
335
+ def recipient=(node)
336
+ @nodes[@recipient_pos] = node
337
+ end
338
+ end
339
+
340
+ class CondRecipientClauseNode < RecipientClauseBaseNode
341
+ def initialize(_ = nil)
342
+ # <cond clause> -> ( <test> => <recipient> )
343
+ # @nodes = [<test>, <recipient>]
344
+ super(2, 1, _)
345
+ end
346
+
347
+ def test
348
+ @nodes[0]
349
+ end
350
+
351
+ def test=(node)
352
+ @nodes[0] = node
353
+ end
354
+ end
355
+
356
+ class ElseClauseNode < HoldingSequenceBaseNode
357
+ def initialize(_ = nil)
358
+ # @nodes = [<sequence>]
359
+ super(1, 0, _)
360
+ end
361
+ end
362
+
363
+ class CaseNode < ListNode
364
+ def initialize(_ = nil)
365
+ # @nodes = [<expression>, <case caluse>, ... <else clause>]
366
+ super(1, _)
367
+ end
368
+
369
+ def expression
370
+ @nodes[0]
371
+ end
372
+
373
+ def expression=(node)
374
+ @nodes[0] = node
375
+ end
376
+
377
+ def case_clauses
254
378
  @nodes[1..-1]
255
379
  end
256
380
 
257
- def add_expression(node)
381
+ def add_clause(node)
258
382
  @nodes << node
259
383
  end
260
384
  end
261
385
 
386
+ class CaseClauseNode < HoldingSequenceBaseNode
387
+ def initialize(_ = nil)
388
+ # @nodes = [<data>, <sequence>]
389
+ super(2, 1, _)
390
+ end
391
+
392
+ def data
393
+ @nodes[0]
394
+ end
395
+
396
+ def data=(node)
397
+ @nodes[0] = node
398
+ end
399
+ end
400
+
401
+ class DataNode < ListNode
402
+ def initialize(_ = nil)
403
+ # @nodes = [<datum>, ...]
404
+ super(0, _)
405
+ end
406
+ end
407
+
408
+ class CaseRecipientClauseNode < RecipientClauseBaseNode
409
+ def initialize(_ = nil)
410
+ # ( ( <datum>* ) => <recipient> )
411
+ # @nodes = [<data>, <recipient>]
412
+ super(2, 1, _)
413
+ end
414
+
415
+ def data
416
+ @nodes[0]
417
+ end
418
+
419
+ def data=(node)
420
+ @nodes[0] = node
421
+ end
422
+ end
423
+
424
+ class ElseRecipientClauseNode < RecipientClauseBaseNode
425
+ def initialize(_ = nil)
426
+ # ( else => <recipient> )
427
+ # @nodes = [<recipient>]
428
+ super(1, 0, _)
429
+ end
430
+ end
431
+
262
432
  class AndNode < ListNode
263
433
  def initialize(_ = nil)
264
434
  # @nodes = [<test>, ...]
265
- super(nil)
435
+ super(0, _)
266
436
  end
267
437
  end
268
438
 
269
439
  class OrNode < ListNode
270
440
  def initialize(_ = nil)
271
441
  # @nodes = [<test>, ...]
272
- super(nil)
442
+ super(0, _)
273
443
  end
274
444
  end
275
445
 
276
- class TestAndSequenceNode < ListNode
446
+ class TestAndSequenceBaseNode < HoldingSequenceBaseNode
277
447
  def initialize(_ = nil)
278
- super(1)
448
+ # @nodes = [<test>, <sequence>]
449
+ super(2, 1, _)
279
450
  end
280
451
 
281
452
  def test
@@ -285,27 +456,19 @@ module Rubasteme
285
456
  def test=(node)
286
457
  @nodes[0] = node
287
458
  end
288
-
289
- def sequence
290
- @nodes[1..-1]
291
- end
292
-
293
- def add_sequence(node)
294
- @nodes << node
295
- end
296
459
  end
297
460
 
298
- class WhenNode < TestAndSequenceNode
461
+ class WhenNode < TestAndSequenceBaseNode
299
462
  end
300
463
 
301
- class UnlessNode < TestAndSequenceNode
464
+ class UnlessNode < TestAndSequenceBaseNode
302
465
  end
303
466
 
304
467
  class LetNode < ListNode
305
468
  def initialize(_ = nil)
306
- # @nodes = [<bindings>, <body>, ...] or
307
- # [<identifier>, <bindings>, <body>, ...]
308
- super(1)
469
+ # @nodes = [<bindings>, <body>] or
470
+ # [<identifier>, <bindings>, <body>]
471
+ super(1, _)
309
472
  end
310
473
 
311
474
  def identifier
@@ -329,14 +492,12 @@ module Rubasteme
329
492
  end
330
493
 
331
494
  def body
332
- named_let? ? @nodes[2..-1] : @nodes[1..-1]
495
+ named_let? ? @nodes[2] : @nodes[1]
333
496
  end
334
497
 
335
- def body=(nodes)
498
+ def body=(node)
336
499
  start_pos = named_let? ? 2 : 1
337
- nodes.each_with_index { |node, i|
338
- @nodes[start_pos + i] = node
339
- }
500
+ @nodes[start_pos] = node
340
501
  end
341
502
 
342
503
  private
@@ -348,8 +509,8 @@ module Rubasteme
348
509
 
349
510
  class LetBaseNode < ListNode
350
511
  def initialize(_ = nil)
351
- # @nodes = [<bindings>, <body>, ...]
352
- super(1)
512
+ # @nodes = [<bindings>, <body>]
513
+ super(2, _)
353
514
  end
354
515
 
355
516
  def bindings
@@ -361,13 +522,11 @@ module Rubasteme
361
522
  end
362
523
 
363
524
  def body
364
- @nodes[1..-1]
525
+ @nodes[1]
365
526
  end
366
527
 
367
- def body=(nodes)
368
- nodes.each_with_index { |node, i|
369
- @nodes[1 + i] = node
370
- }
528
+ def body=(node)
529
+ @nodes[1] = node
371
530
  end
372
531
  end
373
532
 
@@ -383,7 +542,7 @@ module Rubasteme
383
542
  class BindingsNode < ListNode
384
543
  def initialize(_ = nil)
385
544
  # @nodes = [<bind spec 1>, <bind spec 2> , ...]
386
- super(nil)
545
+ super(0, _)
387
546
  end
388
547
 
389
548
  def add_bind_spec(node)
@@ -393,7 +552,7 @@ module Rubasteme
393
552
 
394
553
  class BindSpecNode < ListNode
395
554
  def initialize(_ = nil)
396
- super(2)
555
+ super(2, _)
397
556
  end
398
557
 
399
558
  def identifier
@@ -413,16 +572,17 @@ module Rubasteme
413
572
  end
414
573
  end
415
574
 
416
- class BeginNode < ListNode
575
+ class BeginNode < HoldingSequenceBaseNode
417
576
  def initialize(_ = nil)
418
- super(nil)
577
+ # @nodes = [<sequnece>]
578
+ super(1, 0, _)
419
579
  end
420
580
  end
421
581
 
422
582
  class DoNode < ListNode
423
583
  def initialize(_ = nil)
424
584
  # @nodes = [<iteration bindings>, <test and do result>, <command>, ...]
425
- super(2)
585
+ super(2, _)
426
586
  end
427
587
 
428
588
  def iteration_bindings
@@ -452,7 +612,7 @@ module Rubasteme
452
612
 
453
613
  class IterationBindingsNode < ListNode
454
614
  def initialize(_ = nil)
455
- super(nil)
615
+ super(0, _)
456
616
  end
457
617
 
458
618
  def add_iteration_spec(node)
@@ -460,28 +620,14 @@ module Rubasteme
460
620
  end
461
621
  end
462
622
 
463
- class TestAndDoResultNode < ListNode
464
- def initialize(_ = nil)
465
- super(1)
466
- end
467
-
468
- def test
469
- @nodes[0]
470
- end
471
-
472
- def test=(node)
473
- @nodes[0] = node
474
- end
475
-
476
- def add_expression(node)
477
- @nodes << node
478
- end
623
+ class TestAndDoResultNode < TestAndSequenceBaseNode
479
624
  end
480
625
 
481
626
  class IterationSpecNode < ListNode
482
627
  def initialize(_ = nil)
483
- # @nodes = [<identifier>, <init>, <step>]
484
- super(3)
628
+ # 1. @nodes = [<identifier>, <init>, <step>]
629
+ # 2. @nodes = [<identifier>, <init>]
630
+ super(2, _)
485
631
  end
486
632
 
487
633
  def identifier