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 +4 -4
- data/CHANGELOG.md +11 -0
- data/examples/mini_rus3 +1 -1
- data/examples/mini_sicp_scheme +1 -1
- data/lib/rbscmlex/missing.rb +46 -0
- data/lib/rubasteme.rb +5 -0
- data/lib/rubasteme/ast.rb +6 -3
- data/lib/rubasteme/ast/branch_node.rb +88 -41
- data/lib/rubasteme/ast/leaf_node.rb +4 -0
- data/lib/rubasteme/error.rb +3 -3
- data/lib/rubasteme/parser.rb +28 -649
- data/lib/rubasteme/parser/derived_converter.rb +315 -0
- data/lib/rubasteme/parser/phase1_parser.rb +119 -0
- data/lib/rubasteme/parser/phase2_parser.rb +253 -0
- data/lib/rubasteme/version.rb +7 -2
- data/rubasteme.gemspec +1 -1
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 55b3523ac9cea424c63244acb962f5a8c282515339cbf957ff34bd691ff3d5ef
|
4
|
+
data.tar.gz: 25f8653c598ac0cb61d3fd3c8277548f4b0ea033bc4d2fdb37fbab81efd8642f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
data/examples/mini_sicp_scheme
CHANGED
@@ -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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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(
|
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 <
|
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
|
-
|
628
|
+
# 1. @nodes = [<identifier>, <init>, <step>]
|
629
|
+
# 2. @nodes = [<identifier>, <init>]
|
630
|
+
super(2, _)
|
584
631
|
end
|
585
632
|
|
586
633
|
def identifier
|