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 +4 -4
- data/CHANGELOG.md +8 -0
- data/examples/mini_rus3 +8 -3
- data/examples/sicp_scheme/evaluator.rb +18 -5
- data/lib/rubasteme/ast.rb +6 -0
- data/lib/rubasteme/ast/branch_node.rb +141 -42
- data/lib/rubasteme/parser.rb +90 -26
- data/lib/rubasteme/version.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db8dd40c792c40ff4b5a60cfdf1e1ca6ec79384fc4b2fc773f4ed6b0882d1bc0
|
4
|
+
data.tar.gz: 2fec3b113e8fb7ed3da8199102b8df2999dafd116666586fc4405b8a21dd539b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
178
|
-
|
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, [:
|
203
|
-
|
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], [:
|
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], [:
|
252
|
-
|
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(
|
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
|
123
|
+
@nodes[1]
|
108
124
|
end
|
109
125
|
|
110
|
-
def body=(
|
111
|
-
nodes
|
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 <
|
240
|
-
# @nodes = [<test>, <sequence>]
|
306
|
+
class CondClauseNode < HoldingSequenceBaseNode
|
241
307
|
def initialize(_ = nil)
|
242
|
-
|
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
|
254
|
-
@nodes[
|
331
|
+
def recipient
|
332
|
+
@nodes[@recipient_pos]
|
255
333
|
end
|
256
334
|
|
257
|
-
def
|
258
|
-
@nodes
|
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
|
385
|
+
class TestAndSequenceBaseNode < HoldingSequenceBaseNode
|
277
386
|
def initialize(_ = nil)
|
278
|
-
|
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 <
|
400
|
+
class WhenNode < TestAndSequenceBaseNode
|
299
401
|
end
|
300
402
|
|
301
|
-
class UnlessNode <
|
403
|
+
class UnlessNode < TestAndSequenceBaseNode
|
302
404
|
end
|
303
405
|
|
304
406
|
class LetNode < ListNode
|
305
407
|
def initialize(_ = nil)
|
306
|
-
# @nodes = [<bindings>, <body
|
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
|
434
|
+
named_let? ? @nodes[2] : @nodes[1]
|
333
435
|
end
|
334
436
|
|
335
|
-
def body=(
|
437
|
+
def body=(node)
|
336
438
|
start_pos = named_let? ? 2 : 1
|
337
|
-
nodes
|
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(
|
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
|
464
|
+
@nodes[1]
|
365
465
|
end
|
366
466
|
|
367
|
-
def body=(
|
368
|
-
nodes
|
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 <
|
514
|
+
class BeginNode < HoldingSequenceBaseNode
|
417
515
|
def initialize(_ = nil)
|
418
|
-
|
516
|
+
# @nodes = [<sequnece>]
|
517
|
+
super(1, 0, _)
|
419
518
|
end
|
420
519
|
end
|
421
520
|
|
data/lib/rubasteme/parser.rb
CHANGED
@@ -9,7 +9,7 @@ module Rubasteme
|
|
9
9
|
class Parser
|
10
10
|
|
11
11
|
def self.version
|
12
|
-
"rubasteme.parser :version #{VERSION} :
|
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,
|
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
|
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
|
-
|
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,
|
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>
|
358
|
-
# type 3: ( <test> <
|
390
|
+
# type 2: ( <test> <sequence> )
|
391
|
+
# type 3: ( <test> => <recipient> )
|
359
392
|
# type 4: ( else <sequence> )
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
|
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
|
-
|
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
|
-
|
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 =
|
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 =
|
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
|
-
|
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
|
-
:
|
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
|
"-" => "_",
|
data/lib/rubasteme/version.rb
CHANGED
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.
|
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-
|
11
|
+
date: 2021-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rbscmlex
|