rubasteme 0.1.4 → 0.1.5

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