rubasteme 0.1.4 → 0.1.5

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: db8dd40c792c40ff4b5a60cfdf1e1ca6ec79384fc4b2fc773f4ed6b0882d1bc0
4
- data.tar.gz: 2fec3b113e8fb7ed3da8199102b8df2999dafd116666586fc4405b8a21dd539b
3
+ metadata.gz: 55b3523ac9cea424c63244acb962f5a8c282515339cbf957ff34bd691ff3d5ef
4
+ data.tar.gz: 25f8653c598ac0cb61d3fd3c8277548f4b0ea033bc4d2fdb37fbab81efd8642f
5
5
  SHA512:
6
- metadata.gz: ca78d9e9ae1c06e7e0cb19bf313f7e2fe6aa8e407d0927b77d8a86c7a1414dea44937924058fbb66c812804a66753891c508d155c3826cced645b813ba376845
7
- data.tar.gz: 005c8b48680a091d3a8867341a5cc4e845ec7b0b299b0d862cea9830cd9c9b20951cf49ef7da2c917e5a1df0c3666cdc34bf5a4598c92ec4de4d8c8eff97d5a0
6
+ metadata.gz: 0b35c5f9339f74b843a2d19977fb1a5e08e0e018b59b699bd4d58f88ee7d541f24be08054bd5d5e96e48c9bfcf5995e441df330cbbe33e7990ee61e7824c6e70
7
+ data.tar.gz: 531caab37c793ebcef980fe0f146158871c374a47e6eca90778d7bba05de3d6834d51f4d169f8f13b6b9c96ab7a9129b7ee60658116005080afb2fccd074176e
data/CHANGELOG.md CHANGED
@@ -1,6 +1,17 @@
1
1
  ## [Unreleased]
2
2
  - (nothing to record here)
3
3
 
4
+ ## [0.1.5] - 2021-06-09
5
+ ### Added
6
+ - Add a new node to represent `case` expression and its parsing.
7
+
8
+ ### Changed
9
+ - Refactor parser to parse in 2 phases.
10
+
11
+ ### Fixed
12
+ - Fix #5: incorrect parsing with internal definition at wrong
13
+ position.
14
+
4
15
  ## [0.1.4] - 2021-05-31
5
16
  ### Added
6
17
  - Add a new node to represent sequence. (#3)
data/examples/mini_rus3 CHANGED
@@ -189,7 +189,7 @@ class Evaluator
189
189
 
190
190
  end
191
191
 
192
- parser = Rubasteme::Parser.new
192
+ parser = Rubasteme.parser
193
193
  evaluator = Evaluator.new
194
194
 
195
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
 
@@ -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,8 +19,8 @@ module Rubasteme
19
19
  :ast_dot,
20
20
  # branch
21
21
  :ast_program,
22
- :ast_list,
23
22
  :ast_vector,
23
+ :ast_list,
24
24
  :ast_quotation,
25
25
  :ast_procedure_call,
26
26
  :ast_lambda_expression,
@@ -33,9 +33,12 @@ module Rubasteme
33
33
  :ast_identifier_definition,
34
34
  :ast_cond,
35
35
  :ast_cond_clause,
36
- :ast_else_clause,
37
36
  :ast_cond_recipient_clause,
37
+ :ast_else_clause,
38
38
  :ast_case,
39
+ :ast_case_clause,
40
+ :ast_data,
41
+ :ast_case_recipient_clause,
39
42
  :ast_else_recipient_clause,
40
43
  :ast_and,
41
44
  :ast_or,
@@ -56,7 +59,7 @@ module Rubasteme
56
59
  :ast_illegal,
57
60
  ]
58
61
 
59
- def self.instantiate(ast_node_type, literal)
62
+ def self.instantiate(ast_node_type, literal = nil)
60
63
  type_name = Utils.camel_case(ast_node_type.to_s.delete_prefix("ast_"))
61
64
  klass = AST.const_get("#{type_name}Node")
62
65
 
@@ -55,8 +55,8 @@ 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
60
  end
61
61
 
62
62
  def empty?
@@ -78,14 +78,14 @@ module Rubasteme
78
78
 
79
79
  class QuotationNode < ListNode
80
80
  def initialize(_ = nil)
81
- super(nil)
81
+ super(0, nil)
82
82
  end
83
83
  end
84
84
 
85
85
  class ProcedureCallNode < ListNode
86
86
  def initialize(_ = nil)
87
87
  # @nodes = [<operator>, <operand>*]
88
- super(1)
88
+ super(1, _)
89
89
  end
90
90
 
91
91
  def operator
@@ -108,7 +108,7 @@ module Rubasteme
108
108
  class LambdaExpressionNode < ListNode
109
109
  def initialize(_ = nil)
110
110
  # @nodes = [<formals>, <body>]
111
- super(2)
111
+ super(2, _)
112
112
  end
113
113
 
114
114
  def formals
@@ -131,7 +131,7 @@ module Rubasteme
131
131
  class FormalsNode < ListNode
132
132
  def initialize(_ = nil)
133
133
  # @nodes = [<identifier 1>, <identifier 2>, ... ]
134
- super(nil)
134
+ super(0, nil)
135
135
  end
136
136
 
137
137
  def add_identifier(node)
@@ -142,7 +142,7 @@ module Rubasteme
142
142
  class HoldingSequenceBaseNode < ListNode
143
143
  def initialize(initial_size = 0, sequence_pos = 0, _ = nil)
144
144
  # @nodes = [..., <sequence>, ...]
145
- super(initial_size)
145
+ super(initial_size, _)
146
146
  @sequence_pos = sequence_pos
147
147
  end
148
148
 
@@ -173,7 +173,7 @@ module Rubasteme
173
173
  class InternalDefinitionsNode < ListNode
174
174
  def initialize(_ = nil)
175
175
  # @nodes = [<definition 1>, <definition 2>, ... ]
176
- super(nil)
176
+ super(0, nil)
177
177
  end
178
178
 
179
179
  def add_definition(node)
@@ -184,7 +184,7 @@ module Rubasteme
184
184
  class SequenceNode < ListNode
185
185
  def initialize(_ = nil)
186
186
  # @nodes = [<expression 1>, <expression 2>, ... ]
187
- super(nil)
187
+ super(0, _)
188
188
  end
189
189
 
190
190
  def add_expression(node)
@@ -196,7 +196,7 @@ module Rubasteme
196
196
  def initialize(_ = nil)
197
197
  # @nodes = [<test>, <consequent>] or
198
198
  # [<test>, <consequent>, <alternate>]
199
- super(1)
199
+ super(2, _)
200
200
  end
201
201
 
202
202
  def test
@@ -231,7 +231,7 @@ module Rubasteme
231
231
  class AssignmentNode < ListNode
232
232
  def initialize(_ = nil)
233
233
  # @nodes = [<identifier>, <expression>]
234
- super(2)
234
+ super(2, _)
235
235
  end
236
236
 
237
237
  def identifier
@@ -255,7 +255,7 @@ module Rubasteme
255
255
  def initialize(_ = nil)
256
256
  # @nodes = [<identifier>, <expression>]
257
257
  # <expression> might be a lambda expression.
258
- super(2)
258
+ super(2, _)
259
259
  end
260
260
 
261
261
  def identifier
@@ -291,7 +291,7 @@ module Rubasteme
291
291
 
292
292
  class CondNode < ListNode
293
293
  def initialize(_ = nil)
294
- super(nil)
294
+ super(0, _)
295
295
  end
296
296
 
297
297
  def cond_clauses
@@ -324,7 +324,7 @@ module Rubasteme
324
324
  def initialize(initial_size = 0, recipient_pos = 0, _ = nil)
325
325
  # @nodes = [<recipient>]
326
326
  # <recipient> -> <expression>
327
- super(initial_size)
327
+ super(initial_size, _)
328
328
  @recipient_pos = recipient_pos
329
329
  end
330
330
 
@@ -360,25 +360,86 @@ module Rubasteme
360
360
  end
361
361
  end
362
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
378
+ @nodes[1..-1]
379
+ end
380
+
381
+ def add_clause(node)
382
+ @nodes << node
383
+ end
384
+ end
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
+
363
424
  class ElseRecipientClauseNode < RecipientClauseBaseNode
364
425
  def initialize(_ = nil)
365
426
  # ( else => <recipient> )
366
427
  # @nodes = [<recipient>]
367
- super(1, 0)
428
+ super(1, 0, _)
368
429
  end
369
430
  end
370
431
 
371
432
  class AndNode < ListNode
372
433
  def initialize(_ = nil)
373
434
  # @nodes = [<test>, ...]
374
- super(nil)
435
+ super(0, _)
375
436
  end
376
437
  end
377
438
 
378
439
  class OrNode < ListNode
379
440
  def initialize(_ = nil)
380
441
  # @nodes = [<test>, ...]
381
- super(nil)
442
+ super(0, _)
382
443
  end
383
444
  end
384
445
 
@@ -407,7 +468,7 @@ module Rubasteme
407
468
  def initialize(_ = nil)
408
469
  # @nodes = [<bindings>, <body>] or
409
470
  # [<identifier>, <bindings>, <body>]
410
- super(1)
471
+ super(1, _)
411
472
  end
412
473
 
413
474
  def identifier
@@ -449,7 +510,7 @@ module Rubasteme
449
510
  class LetBaseNode < ListNode
450
511
  def initialize(_ = nil)
451
512
  # @nodes = [<bindings>, <body>]
452
- super(2)
513
+ super(2, _)
453
514
  end
454
515
 
455
516
  def bindings
@@ -481,7 +542,7 @@ module Rubasteme
481
542
  class BindingsNode < ListNode
482
543
  def initialize(_ = nil)
483
544
  # @nodes = [<bind spec 1>, <bind spec 2> , ...]
484
- super(nil)
545
+ super(0, _)
485
546
  end
486
547
 
487
548
  def add_bind_spec(node)
@@ -491,7 +552,7 @@ module Rubasteme
491
552
 
492
553
  class BindSpecNode < ListNode
493
554
  def initialize(_ = nil)
494
- super(2)
555
+ super(2, _)
495
556
  end
496
557
 
497
558
  def identifier
@@ -521,7 +582,7 @@ module Rubasteme
521
582
  class DoNode < ListNode
522
583
  def initialize(_ = nil)
523
584
  # @nodes = [<iteration bindings>, <test and do result>, <command>, ...]
524
- super(2)
585
+ super(2, _)
525
586
  end
526
587
 
527
588
  def iteration_bindings
@@ -551,7 +612,7 @@ module Rubasteme
551
612
 
552
613
  class IterationBindingsNode < ListNode
553
614
  def initialize(_ = nil)
554
- super(nil)
615
+ super(0, _)
555
616
  end
556
617
 
557
618
  def add_iteration_spec(node)
@@ -559,28 +620,14 @@ module Rubasteme
559
620
  end
560
621
  end
561
622
 
562
- class TestAndDoResultNode < ListNode
563
- def initialize(_ = nil)
564
- super(1)
565
- end
566
-
567
- def test
568
- @nodes[0]
569
- end
570
-
571
- def test=(node)
572
- @nodes[0] = node
573
- end
574
-
575
- def add_expression(node)
576
- @nodes << node
577
- end
623
+ class TestAndDoResultNode < TestAndSequenceBaseNode
578
624
  end
579
625
 
580
626
  class IterationSpecNode < ListNode
581
627
  def initialize(_ = nil)
582
- # @nodes = [<identifier>, <init>, <step>]
583
- super(3)
628
+ # 1. @nodes = [<identifier>, <init>, <step>]
629
+ # 2. @nodes = [<identifier>, <init>]
630
+ super(2, _)
584
631
  end
585
632
 
586
633
  def identifier
@@ -32,6 +32,10 @@ module Rubasteme
32
32
  def initialize(literal)
33
33
  super
34
34
  end
35
+
36
+ def identifier
37
+ literal
38
+ end
35
39
  end
36
40
 
37
41
  class CharacterNode < LeafNode