rubasteme 0.1.3 → 0.1.4

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: 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