arpaka 1.0.0 → 2.0.0
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 +46 -2
- data/README.md +104 -7
- data/Rakefile +15 -1
- data/docs/architecture.dot +30 -0
- data/docs/architecture.md +96 -0
- data/docs/architecture.webp +0 -0
- data/docs/contributes.md +115 -0
- data/docs/usage.md +497 -0
- data/lib/arpaka/cli.rb +5 -53
- data/lib/arpaka/plugins/cli.rb +61 -0
- data/lib/arpaka/plugins/sample.rb +14 -0
- data/lib/arpaka/plugins/sample_runner.rb +21 -0
- data/lib/arpaka/{actions.rb → ruby/actions.rb} +230 -151
- data/lib/arpaka/ruby/class_name_parser.rb +97 -0
- data/lib/arpaka/ruby/cli.rb +64 -0
- data/lib/arpaka/ruby/frontend_emitter.rb +59 -0
- data/lib/arpaka/ruby/generator.rb +41 -0
- data/lib/arpaka/{ruby_grammar.rb → ruby/grammar.rb} +5 -56
- data/lib/arpaka/ruby/grammar_emitter.rb +71 -0
- data/lib/arpaka/ruby/profile.rb +129 -0
- data/lib/arpaka/{profile → ruby/profiles}/ruby_3_3.rb +21 -21
- data/lib/arpaka/{profile → ruby/profiles}/ruby_3_4.rb +21 -21
- data/lib/arpaka/{runtime → ruby/runtime/detailed}/ast.rb.erb +41 -5
- data/lib/arpaka/ruby/runtime/detailed/builder.rb.erb +1177 -0
- data/lib/arpaka/{runtime → ruby/runtime}/frontend.rb.erb +17 -4
- data/lib/arpaka/{runtime → ruby/runtime}/lexer.rb.erb +576 -99
- data/lib/arpaka/ruby/runtime/structured.rb.erb +111 -0
- data/lib/arpaka/ruby.rb +23 -0
- data/lib/arpaka.rb +6 -9
- data/lib/lrama/ruby/backend.rb +4 -9
- data/lib/lrama/ruby/parser.rb.erb +35 -9
- data/lib/lrama/ruby/parser_emitter.rb +41 -0
- data/lib/lrama/ruby/table_codec.rb +50 -0
- data/lib/lrama/ruby/version.rb +1 -1
- data/lib/lrama/ruby.rb +1 -0
- data/sig/arpaka.rbs +8 -3
- metadata +32 -16
- data/lib/arpaka/generator.rb +0 -51
- data/lib/arpaka/profile/ruby.rb +0 -49
- data/lib/arpaka/runtime/builder.rb.erb +0 -323
- /data/lib/arpaka/{BSDL → ruby/BSDL} +0 -0
- /data/lib/arpaka/{COPYING → ruby/COPYING} +0 -0
- /data/lib/arpaka/{source.json → ruby/source.json} +0 -0
- /data/lib/arpaka/{upstream_rules.json → ruby/upstream_rules.json} +0 -0
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"source_revision" => "76cca827ab52ab1d346a728f068d5b8da3e2952b",
|
|
3
3
|
"source_sha256" => "c3b4893af679eaeb5688d615cbfff0459a42077776a49df5d9514187cb56b1ec",
|
|
4
4
|
"runtime" => {
|
|
5
|
-
"ast_nodes" => %w[assignment singleton_method singleton_class pattern].freeze,
|
|
6
|
-
"builder_methods" => %w[assignment singleton_method singleton_class rescue].freeze,
|
|
7
|
-
"lexer" => {"source_text_tokens" => [
|
|
5
|
+
"ast_nodes" => %w[self assignment singleton_method singleton_class pattern keyword_arguments].freeze,
|
|
6
|
+
"builder_methods" => %w[self assignment singleton_method singleton_class rescue keyword_arguments].freeze,
|
|
7
|
+
"lexer" => {"source_text_tokens" => %w[tOP_ASGN tUMINUS tUPLUS].freeze}.freeze
|
|
8
8
|
}.freeze,
|
|
9
9
|
"actions" =>
|
|
10
10
|
{1 => ["empty", "nil"],
|
|
@@ -34,15 +34,15 @@
|
|
|
34
34
|
25 => ["empty", "nil"],
|
|
35
35
|
26 => ["pass_through", "$1"],
|
|
36
36
|
27 => ["empty", "nil"],
|
|
37
|
-
28 => ["ported", "@builder.alias_node($2, $4)"],
|
|
38
|
-
29 => ["ported", "@builder.alias_node($2, $3)"],
|
|
39
|
-
30 => ["ported", "@builder.alias_node($2, $3)"],
|
|
37
|
+
28 => ["ported", "@builder.alias_node(:method, $2, $4)"],
|
|
38
|
+
29 => ["ported", "@builder.alias_node(:variable, $2, $3)"],
|
|
39
|
+
30 => ["ported", "@builder.alias_node(:variable, $2, $3)"],
|
|
40
40
|
31 => ["unsupported", "@builder.unsupported(31)"],
|
|
41
41
|
32 => ["ported", "@builder.undef_node($2)"],
|
|
42
|
-
33 => ["ported", "@builder.
|
|
43
|
-
34 => ["ported", "@builder.
|
|
44
|
-
35 => ["ported", "@builder.
|
|
45
|
-
36 => ["ported", "@builder.
|
|
42
|
+
33 => ["ported", "@builder.modifier_if_node($3, [$1])"],
|
|
43
|
+
34 => ["ported", "@builder.modifier_unless_node($3, [$1])"],
|
|
44
|
+
35 => ["ported", "@builder.modifier_loop(:while, $3, [$1])"],
|
|
45
|
+
36 => ["ported", "@builder.modifier_loop(:until, $3, [$1])"],
|
|
46
46
|
37 => ["ported", "@builder.rescue_modifier($1, $4)"],
|
|
47
47
|
38 => ["ported", "@builder.end_block($4)"],
|
|
48
48
|
39 => ["pass_through", "$1"],
|
|
@@ -103,7 +103,7 @@
|
|
|
103
103
|
94 => ["ported", "@builder.receiver_call($1, :\"::\", $3, $4)"],
|
|
104
104
|
95 => ["ported", "@builder.block_call(@builder.receiver_call($1, :\"::\", $3, $4), $5)"],
|
|
105
105
|
96 => ["ported", "@builder.block_call(@builder.receiver_call($1, :\"::\", $3, []), $5)"],
|
|
106
|
-
97 => ["ported", "@builder.
|
|
106
|
+
97 => ["ported", "@builder.super_call($2 || [])"],
|
|
107
107
|
98 => ["ported", "@builder.call(:yield, $2 || [])"],
|
|
108
108
|
99 => ["ported", "@builder.call(:return, $2 || [])"],
|
|
109
109
|
100 => ["ported", "@builder.call(:break, $2 || [])"],
|
|
@@ -186,8 +186,8 @@
|
|
|
186
186
|
177 => ["ported", "@builder.operator(\"**\")"],
|
|
187
187
|
178 => ["ported", "@builder.operator(\"!\")"],
|
|
188
188
|
179 => ["ported", "@builder.operator(\"~\")"],
|
|
189
|
-
180 => ["ported", "@builder.operator(\"+@\")"],
|
|
190
|
-
181 => ["ported", "@builder.operator(\"-@\")"],
|
|
189
|
+
180 => ["ported", "@builder.operator($1 || \"+@\")"],
|
|
190
|
+
181 => ["ported", "@builder.operator($1 || \"-@\")"],
|
|
191
191
|
182 => ["ported", "@builder.operator(\"[]\")"],
|
|
192
192
|
183 => ["ported", "@builder.operator(\"[]=\")"],
|
|
193
193
|
184 => ["ported", "@builder.operator(\"`\")"],
|
|
@@ -397,7 +397,7 @@
|
|
|
397
397
|
388 => ["empty", "nil"],
|
|
398
398
|
389 => ["empty", "nil"],
|
|
399
399
|
390 => ["empty", "nil"],
|
|
400
|
-
391 => ["
|
|
400
|
+
391 => ["pass_through", "$1"],
|
|
401
401
|
392 => ["pass_through", "nil"],
|
|
402
402
|
393 => ["pass_through", "nil"],
|
|
403
403
|
394 => ["pass_through", "nil"],
|
|
@@ -490,8 +490,8 @@
|
|
|
490
490
|
481 => ["ported", "@builder.receiver_call($1, :\"::\", $3, [])"],
|
|
491
491
|
482 => ["pass_through", "$1"],
|
|
492
492
|
483 => ["pass_through", "$1"],
|
|
493
|
-
|
|
494
|
-
|
|
493
|
+
484 => ["ported", "@builder.super_call($2 || [])"],
|
|
494
|
+
485 => ["ported", "@builder.super_call(nil)"],
|
|
495
495
|
486 => ["ported", "@builder.index($1, $3 || [])"],
|
|
496
496
|
487 => ["pass_through", "$2"],
|
|
497
497
|
488 => ["pass_through", "$2"],
|
|
@@ -514,8 +514,8 @@
|
|
|
514
514
|
505 => ["pass_through", "$1"],
|
|
515
515
|
506 => ["pass_through", "$1"],
|
|
516
516
|
507 => ["pass_through", "$1"],
|
|
517
|
-
508 => ["ported", "@builder.
|
|
518
|
-
509 => ["ported", "@builder.
|
|
517
|
+
508 => ["ported", "@builder.modifier_if_node($3, [$1])"],
|
|
518
|
+
509 => ["ported", "@builder.modifier_unless_node($3, [$1])"],
|
|
519
519
|
510 => ["pass_through", "$1"],
|
|
520
520
|
511 => ["ported", "@builder.pattern(:array, [nil, [$1], nil, nil])"],
|
|
521
521
|
512 => ["ported", "@builder.pattern(:array, [[$1] + Array($3[0]), $3[1], $3[2]])"],
|
|
@@ -621,7 +621,7 @@
|
|
|
621
621
|
612 => ["ported", "@builder.concat_strings($1, $2)"],
|
|
622
622
|
613 => ["ported", "@builder.string(@builder.join_strings($2))"],
|
|
623
623
|
614 => ["ported", "@builder.xstring(@builder.join_strings($2))"],
|
|
624
|
-
615 => ["ported", "@builder.regexp(@builder.join_strings($2))"],
|
|
624
|
+
615 => ["ported", "@builder.regexp(@builder.join_strings($2), $3)"],
|
|
625
625
|
616 => ["pass_through", "nil"],
|
|
626
626
|
617 => ["pass_through", "nil"],
|
|
627
627
|
618 => ["pass_through", "$3"],
|
|
@@ -678,7 +678,7 @@
|
|
|
678
678
|
669 => ["ported", "@builder.variable(:constant, $1)"],
|
|
679
679
|
670 => ["pass_through", "$1"],
|
|
680
680
|
671 => ["ported", "@builder.literal(nil)"],
|
|
681
|
-
672 => ["ported", "@builder.
|
|
681
|
+
672 => ["ported", "@builder.self_node"],
|
|
682
682
|
673 => ["ported", "@builder.literal(true)"],
|
|
683
683
|
674 => ["ported", "@builder.literal(false)"],
|
|
684
684
|
675 => ["ported", "@builder.literal(:__FILE__)"],
|
|
@@ -797,6 +797,6 @@
|
|
|
797
797
|
788 => ["empty", "nil"],
|
|
798
798
|
792 => ["pass_through", "$1"],
|
|
799
799
|
795 => ["pass_through", "$1"],
|
|
800
|
-
797 => ["
|
|
800
|
+
797 => ["ported", "@builder.append_arguments($1, $3)"]},
|
|
801
801
|
"compatibility_actions" => {},
|
|
802
802
|
"additional_expected_conflicts" => 1}
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
module AST
|
|
2
2
|
Program = Data.define(:statements)
|
|
3
3
|
Literal = Data.define(:value)
|
|
4
|
+
EncodingLiteral = Data.define(:value)
|
|
5
|
+
<% if runtime.fetch("ast_nodes", []).include?("self") -%>
|
|
6
|
+
Self = Data.define
|
|
7
|
+
<% end -%>
|
|
4
8
|
Binary = Data.define(:operator, :left, :right)
|
|
5
9
|
Unary = Data.define(:operator, :operand)
|
|
6
10
|
If = Data.define(:condition, :then_body, :else_body)
|
|
@@ -9,28 +13,60 @@ module AST
|
|
|
9
13
|
<% if runtime.fetch("ast_nodes", []).include?("assignment") -%>
|
|
10
14
|
Assignment = Data.define(:target, :value)
|
|
11
15
|
OpAssign = Data.define(:target, :operator, :value)
|
|
12
|
-
MultipleAssign = Data.define(:targets, :value)
|
|
16
|
+
MultipleAssign = Data.define(:targets, :rest, :post, :value) do
|
|
17
|
+
constructor = method(:new)
|
|
18
|
+
define_singleton_method(:new) do |targets, value = nil, rest: nil, post: nil|
|
|
19
|
+
constructor.call(Array(targets).freeze, rest, Array(post).freeze, value)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
13
22
|
Field = Data.define(:receiver, :operator, :name)
|
|
14
|
-
Alias = Data.define(:new_name, :old_name)
|
|
23
|
+
Alias = Data.define(:kind, :new_name, :old_name)
|
|
15
24
|
Undef = Data.define(:names)
|
|
16
25
|
<% end -%>
|
|
17
26
|
BareCall = Data.define(:name)
|
|
18
27
|
ArrayLiteral = Data.define(:elements)
|
|
28
|
+
Splat = Data.define(:value)
|
|
19
29
|
HashLiteral = Data.define(:pairs)
|
|
30
|
+
<% if runtime.fetch("ast_nodes", []).include?("keyword_arguments") -%>
|
|
31
|
+
KeywordArguments = Data.define(:pairs)
|
|
32
|
+
<% end -%>
|
|
20
33
|
Pair = Data.define(:key, :value)
|
|
21
34
|
RangeLiteral = Data.define(:operator, :begin_value, :end_value)
|
|
22
35
|
Ternary = Data.define(:condition, :then_value, :else_value)
|
|
23
36
|
Call = Data.define(:name, :arguments)
|
|
37
|
+
Super = Data.define(:arguments)
|
|
38
|
+
BlockPass = Data.define(:arguments, :value)
|
|
24
39
|
ReceiverCall = Data.define(:receiver, :operator, :name, :arguments)
|
|
25
|
-
|
|
40
|
+
BlockParameters = Data.define(:kind, :value)
|
|
41
|
+
Parameter = Data.define(:kind, :name, :value)
|
|
42
|
+
BlockCall = Data.define(:call, :parameters, :body, :style) do
|
|
43
|
+
constructor = method(:new)
|
|
44
|
+
define_singleton_method(:new) do |call, parameters, body, style = nil|
|
|
45
|
+
constructor.call(call, parameters, body, style)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def ==(other)
|
|
49
|
+
other.is_a?(self.class) &&
|
|
50
|
+
call == other.call && parameters == other.parameters && body == other.body
|
|
51
|
+
end
|
|
52
|
+
alias eql? ==
|
|
53
|
+
end
|
|
26
54
|
StringLiteral = Data.define(:value)
|
|
27
55
|
InterpolatedString = Data.define(:parts)
|
|
56
|
+
DynamicSymbol = Data.define(:parts)
|
|
28
57
|
Index = Data.define(:receiver, :arguments)
|
|
29
58
|
Loop = Data.define(:kind, :condition, :body)
|
|
30
|
-
Control = Data.define(:kind)
|
|
59
|
+
Control = Data.define(:kind, :value)
|
|
31
60
|
Variable = Data.define(:kind, :name)
|
|
61
|
+
ConstantPath = Data.define(:receiver, :name)
|
|
62
|
+
AbsoluteConstant = Data.define(:name)
|
|
32
63
|
Rescue = Data.define(:expression, :fallback)
|
|
33
|
-
RegexpLiteral = Data.define(:value)
|
|
64
|
+
RegexpLiteral = Data.define(:value, :options, :encoding, :once) do
|
|
65
|
+
constructor = method(:new)
|
|
66
|
+
define_singleton_method(:new) do |value, options = 0, encoding = nil, once = false|
|
|
67
|
+
constructor.call(value, options, encoding, once)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
34
70
|
XStringLiteral = Data.define(:value)
|
|
35
71
|
For = Data.define(:variable, :enumerable, :body)
|
|
36
72
|
Def = Data.define(:name, :arguments, :body)
|