rubasteme 0.1.3 → 0.1.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ae403f48775a21a957a932a5a4ca6c8ba57a2a599e67a7dc1b3073c90979fda0
4
- data.tar.gz: 7f8b072b65a9011b3ba0bc010b58608d5c21bff9996279494f8e562ef4e6aa2d
3
+ metadata.gz: db8dd40c792c40ff4b5a60cfdf1e1ca6ec79384fc4b2fc773f4ed6b0882d1bc0
4
+ data.tar.gz: 2fec3b113e8fb7ed3da8199102b8df2999dafd116666586fc4405b8a21dd539b
5
5
  SHA512:
6
- metadata.gz: d99c7be0fab343b682c27bf8eae4ae6b57c7378cc83b106471902ae0c7fc320f69183d9c81f03541c52984792b87c0a88d57ce6ba0cd3b65436505717b25ed8a
7
- data.tar.gz: 70a04f9e03e44b7e4fb6c057fde7355acd27efc7b21522f408264791cf60786b22858e0d04d4a49a96af438dde4090be9d2fdf241ebdcd9fd421f3607aa8c51a
6
+ metadata.gz: ca78d9e9ae1c06e7e0cb19bf313f7e2fe6aa8e407d0927b77d8a86c7a1414dea44937924058fbb66c812804a66753891c508d155c3826cced645b813ba376845
7
+ data.tar.gz: 005c8b48680a091d3a8867341a5cc4e845ec7b0b299b0d862cea9830cd9c9b20951cf49ef7da2c917e5a1df0c3666cdc34bf5a4598c92ec4de4d8c8eff97d5a0
data/CHANGELOG.md CHANGED
@@ -1,6 +1,14 @@
1
1
  ## [Unreleased]
2
2
  - (nothing to record here)
3
3
 
4
+ ## [0.1.4] - 2021-05-31
5
+ ### Added
6
+ - Add a new node to represent sequence. (#3)
7
+ - Incorporate missing methods to ListNode from rbsiev project.
8
+
9
+ ### Fixed
10
+ - Fix #2: typo in the version string.
11
+
4
12
  ## [0.1.3] - 2021-05-20
5
13
  ### Fixed
6
14
  - Change a method name of AST::CondNode.
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}"
@@ -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/lib/rubasteme/ast.rb CHANGED
@@ -25,12 +25,18 @@ module Rubasteme
25
25
  :ast_procedure_call,
26
26
  :ast_lambda_expression,
27
27
  :ast_formals,
28
+ :ast_body,
29
+ :ast_internal_definitions,
30
+ :ast_sequence,
28
31
  :ast_conditional,
29
32
  :ast_assignment,
30
33
  :ast_identifier_definition,
31
34
  :ast_cond,
32
35
  :ast_cond_clause,
36
+ :ast_else_clause,
37
+ :ast_cond_recipient_clause,
33
38
  :ast_case,
39
+ :ast_else_recipient_clause,
34
40
  :ast_and,
35
41
  :ast_or,
36
42
  :ast_when,
@@ -58,6 +58,22 @@ module Rubasteme
58
58
  def initialize(_ = nil)
59
59
  super(nil)
60
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
76
+ end
61
77
  end
62
78
 
63
79
  class QuotationNode < ListNode
@@ -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,13 +120,11 @@ 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
 
@@ -125,6 +139,59 @@ 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(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(nil)
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
@@ -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,13 +318,53 @@ module Rubasteme
249
318
  def test=(node)
250
319
  @nodes[0] = node
251
320
  end
321
+ end
322
+
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
252
330
 
253
- def sequence
254
- @nodes[1..-1]
331
+ def recipient
332
+ @nodes[@recipient_pos]
255
333
  end
256
334
 
257
- def add_expression(node)
258
- @nodes << node
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 ElseRecipientClauseNode < RecipientClauseBaseNode
364
+ def initialize(_ = nil)
365
+ # ( else => <recipient> )
366
+ # @nodes = [<recipient>]
367
+ super(1, 0)
259
368
  end
260
369
  end
261
370
 
@@ -273,9 +382,10 @@ module Rubasteme
273
382
  end
274
383
  end
275
384
 
276
- class TestAndSequenceNode < ListNode
385
+ class TestAndSequenceBaseNode < HoldingSequenceBaseNode
277
386
  def initialize(_ = nil)
278
- super(1)
387
+ # @nodes = [<test>, <sequence>]
388
+ super(2, 1, _)
279
389
  end
280
390
 
281
391
  def test
@@ -285,26 +395,18 @@ module Rubasteme
285
395
  def test=(node)
286
396
  @nodes[0] = node
287
397
  end
288
-
289
- def sequence
290
- @nodes[1..-1]
291
- end
292
-
293
- def add_sequence(node)
294
- @nodes << node
295
- end
296
398
  end
297
399
 
298
- class WhenNode < TestAndSequenceNode
400
+ class WhenNode < TestAndSequenceBaseNode
299
401
  end
300
402
 
301
- class UnlessNode < TestAndSequenceNode
403
+ class UnlessNode < TestAndSequenceBaseNode
302
404
  end
303
405
 
304
406
  class LetNode < ListNode
305
407
  def initialize(_ = nil)
306
- # @nodes = [<bindings>, <body>, ...] or
307
- # [<identifier>, <bindings>, <body>, ...]
408
+ # @nodes = [<bindings>, <body>] or
409
+ # [<identifier>, <bindings>, <body>]
308
410
  super(1)
309
411
  end
310
412
 
@@ -329,14 +431,12 @@ module Rubasteme
329
431
  end
330
432
 
331
433
  def body
332
- named_let? ? @nodes[2..-1] : @nodes[1..-1]
434
+ named_let? ? @nodes[2] : @nodes[1]
333
435
  end
334
436
 
335
- def body=(nodes)
437
+ def body=(node)
336
438
  start_pos = named_let? ? 2 : 1
337
- nodes.each_with_index { |node, i|
338
- @nodes[start_pos + i] = node
339
- }
439
+ @nodes[start_pos] = node
340
440
  end
341
441
 
342
442
  private
@@ -348,8 +448,8 @@ module Rubasteme
348
448
 
349
449
  class LetBaseNode < ListNode
350
450
  def initialize(_ = nil)
351
- # @nodes = [<bindings>, <body>, ...]
352
- super(1)
451
+ # @nodes = [<bindings>, <body>]
452
+ super(2)
353
453
  end
354
454
 
355
455
  def bindings
@@ -361,13 +461,11 @@ module Rubasteme
361
461
  end
362
462
 
363
463
  def body
364
- @nodes[1..-1]
464
+ @nodes[1]
365
465
  end
366
466
 
367
- def body=(nodes)
368
- nodes.each_with_index { |node, i|
369
- @nodes[1 + i] = node
370
- }
467
+ def body=(node)
468
+ @nodes[1] = node
371
469
  end
372
470
  end
373
471
 
@@ -413,9 +511,10 @@ module Rubasteme
413
511
  end
414
512
  end
415
513
 
416
- class BeginNode < ListNode
514
+ class BeginNode < HoldingSequenceBaseNode
417
515
  def initialize(_ = nil)
418
- super(nil)
516
+ # @nodes = [<sequnece>]
517
+ super(1, 0, _)
419
518
  end
420
519
  end
421
520
 
@@ -9,7 +9,7 @@ module Rubasteme
9
9
  class Parser
10
10
 
11
11
  def self.version
12
- "rubasteme.parser :version #{VERSION} :relase #{RELEASE}"
12
+ "(rubasteme.parser :version #{VERSION} :release #{RELEASE})"
13
13
  end
14
14
 
15
15
  def initialize
@@ -187,7 +187,7 @@ module Rubasteme
187
187
 
188
188
  def parse_lambda_expression
189
189
  @lexer.skip_token # skip :lambda
190
- lambda_node = make_lambda_expression_node(parse_formals, read_body)
190
+ lambda_node = make_lambda_expression_node(parse_formals, parse_body)
191
191
  skip_rparen
192
192
  lambda_node
193
193
  end
@@ -219,15 +219,33 @@ module Rubasteme
219
219
  formals_node
220
220
  end
221
221
 
222
- def read_body
223
- body = []
222
+ def parse_body
223
+ body = AST.instantiate(:ast_body, nil)
224
+
225
+ definitions = AST.instantiate(:ast_internal_definitions, nil)
226
+ body.definitions = definitions
227
+
228
+ # read definitions
224
229
  Kernel.loop {
225
230
  break if @lexer.peek_token.type == :rparen # the end of lambda exp.
226
- body << parse_expression
231
+ break unless is_definition?
232
+ body.definitions.add_definition(parse_expression)
227
233
  }
234
+
235
+ body.sequence = parse_sequence
228
236
  body
229
237
  end
230
238
 
239
+ def parse_sequence
240
+ seq_node = AST.instantiate(:ast_sequence, nil)
241
+ Kernel.loop {
242
+ break if @lexer.peek_token.type == :rparen # the end of parent list
243
+ exp = parse_expression
244
+ seq_node.add_expression(exp)
245
+ }
246
+ seq_node
247
+ end
248
+
231
249
  def parse_conditional
232
250
  if_node = AST.instantiate(:ast_conditional, @lexer.next_token.literal)
233
251
  if_node.test = parse_test
@@ -263,6 +281,22 @@ module Rubasteme
263
281
  not_implemented_yet("MACRO block")
264
282
  end
265
283
 
284
+ DEFINITION_IDENTIFIERS = [
285
+ "define",
286
+ "define-syntax",
287
+ "define-values",
288
+ "define-record-type",
289
+ ]
290
+
291
+ def is_definition?
292
+ if @lexer.peek_token.type == :lparen
293
+ type, literal = *@lexer.peek_token(1)
294
+ type == :identifier and DEFINITION_IDENTIFIERS.include?(literal)
295
+ else
296
+ false
297
+ end
298
+ end
299
+
266
300
  def parse_definition
267
301
  case @lexer.peek_token.literal
268
302
  when "define"
@@ -302,7 +336,7 @@ module Rubasteme
302
336
  }
303
337
  skip_rparen
304
338
 
305
- lambda_node = make_lambda_expression_node(def_formals_node, read_body)
339
+ lambda_node = make_lambda_expression_node(def_formals_node, parse_body)
306
340
  skip_rparen
307
341
 
308
342
  define_node.expression = lambda_node
@@ -352,18 +386,50 @@ module Rubasteme
352
386
 
353
387
  def parse_cond_clause
354
388
  skip_lparen
355
- clause_node = AST.instantiate(:ast_cond_clause, nil)
356
389
  # type 1: ( <test> )
357
- # type 2: ( <test> => <expression> )
358
- # type 3: ( <test> <sequence> )
390
+ # type 2: ( <test> <sequence> )
391
+ # type 3: ( <test> => <recipient> )
359
392
  # type 4: ( else <sequence> )
360
- clause_node.test = parse_test
361
- Kernel.loop {
362
- break if @lexer.peek_token.type == :rparen
363
- clause_node.add_expression(parse_expression)
364
- }
393
+ if identifier_name?(@lexer.peek_token, "else")
394
+ # type 4
395
+ parse_else_clause
396
+ else
397
+ clause_node = nil
398
+ test_node = parse_test
399
+ if identifier_name?(@lexer.peek_token, "=>")
400
+ # type 3
401
+ @lexer.skip_token # skip "=>"
402
+ clause_node = AST.instantiate(:ast_cond_recipient_clause, nil)
403
+ clause_node.recipient = parse_recipient
404
+ else
405
+ # type 1 and 2
406
+ clause_node = AST.instantiate(:ast_cond_clause, nil)
407
+ clause_node.sequence = parse_sequence
408
+ end
409
+ skip_rparen
410
+ clause_node.test = test_node
411
+ clause_node
412
+ end
413
+ end
414
+
415
+ def parse_else_clause
416
+ @lexer.skip_token # skip "else"
417
+ else_clause_node = AST.instantiate(:ast_else_clause, nil)
418
+ else_clause_node.sequence = parse_sequence
365
419
  skip_rparen
366
- clause_node
420
+ else_clause_node
421
+ end
422
+
423
+ def parse_else_recipient_clause
424
+ @lexer.skip_token # skip "else"
425
+ @lexer.skip_token # skip "=>"
426
+ else_recipient_clause_node = AST.instantiate(:ast_else_recipient_clause, nil)
427
+ else_recipient_clause_node = parse_recipient
428
+ else_recipient_clause_node
429
+ end
430
+
431
+ def parse_recipient
432
+ parse_expression
367
433
  end
368
434
 
369
435
  def parse_case
@@ -401,10 +467,7 @@ module Rubasteme
401
467
  ast_type = "ast_#{type}".intern
402
468
  node = AST.instantiate(ast_type, nil)
403
469
  node.test = parse_test
404
- Kernel.loop {
405
- break if @lexer.peek_token.type == :rparen
406
- node << parse_expression
407
- }
470
+ node.sequence = parse_sequence
408
471
  skip_rparen
409
472
  node
410
473
  end
@@ -415,7 +478,7 @@ module Rubasteme
415
478
  let_node.identifier = parse_identifier
416
479
  end
417
480
  let_node.bindings = parse_bindings
418
- let_node.body = read_body
481
+ let_node.body = parse_body
419
482
  skip_rparen
420
483
  let_node
421
484
  end
@@ -456,7 +519,7 @@ module Rubasteme
456
519
  ast_type = "ast_#{type}".intern
457
520
  node = AST.instantiate(ast_type, nil)
458
521
  node.bindings = parse_bindings
459
- node.body = read_body
522
+ node.body = parse_body
460
523
  skip_rparen
461
524
  node
462
525
  end
@@ -471,10 +534,7 @@ module Rubasteme
471
534
 
472
535
  def parse_begin
473
536
  begin_node = AST.instantiate(:ast_begin, nil)
474
- Kernel.loop {
475
- break if @lexer.peek_token.type == :rparen
476
- begin_node << parse_expression
477
- }
537
+ begin_node.sequence = parse_sequence
478
538
  skip_rparen
479
539
  begin_node
480
540
  end
@@ -581,7 +641,7 @@ module Rubasteme
581
641
  when :dot
582
642
  :ast_dot
583
643
  else
584
- :ast_identifier
644
+ :ast_illegal
585
645
  end
586
646
  end
587
647
 
@@ -594,6 +654,10 @@ module Rubasteme
594
654
  end
595
655
  end
596
656
 
657
+ def identifier_name?(token, name)
658
+ token.type == :identifier && token.literal == name
659
+ end
660
+
597
661
  SCM_CHAR_TO_RB_MAP = {
598
662
  "*" => "_star",
599
663
  "-" => "_",
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rubasteme
4
- VERSION = "0.1.3"
5
- RELEASE = "2021-05-20"
4
+ VERSION = "0.1.4"
5
+ RELEASE = "2021-05-31"
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubasteme
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - mnbi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-05-20 00:00:00.000000000 Z
11
+ date: 2021-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rbscmlex