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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -2
  3. data/README.md +104 -7
  4. data/Rakefile +15 -1
  5. data/docs/architecture.dot +30 -0
  6. data/docs/architecture.md +96 -0
  7. data/docs/architecture.webp +0 -0
  8. data/docs/contributes.md +115 -0
  9. data/docs/usage.md +497 -0
  10. data/lib/arpaka/cli.rb +5 -53
  11. data/lib/arpaka/plugins/cli.rb +61 -0
  12. data/lib/arpaka/plugins/sample.rb +14 -0
  13. data/lib/arpaka/plugins/sample_runner.rb +21 -0
  14. data/lib/arpaka/{actions.rb → ruby/actions.rb} +230 -151
  15. data/lib/arpaka/ruby/class_name_parser.rb +97 -0
  16. data/lib/arpaka/ruby/cli.rb +64 -0
  17. data/lib/arpaka/ruby/frontend_emitter.rb +59 -0
  18. data/lib/arpaka/ruby/generator.rb +41 -0
  19. data/lib/arpaka/{ruby_grammar.rb → ruby/grammar.rb} +5 -56
  20. data/lib/arpaka/ruby/grammar_emitter.rb +71 -0
  21. data/lib/arpaka/ruby/profile.rb +129 -0
  22. data/lib/arpaka/{profile → ruby/profiles}/ruby_3_3.rb +21 -21
  23. data/lib/arpaka/{profile → ruby/profiles}/ruby_3_4.rb +21 -21
  24. data/lib/arpaka/{runtime → ruby/runtime/detailed}/ast.rb.erb +41 -5
  25. data/lib/arpaka/ruby/runtime/detailed/builder.rb.erb +1177 -0
  26. data/lib/arpaka/{runtime → ruby/runtime}/frontend.rb.erb +17 -4
  27. data/lib/arpaka/{runtime → ruby/runtime}/lexer.rb.erb +576 -99
  28. data/lib/arpaka/ruby/runtime/structured.rb.erb +111 -0
  29. data/lib/arpaka/ruby.rb +23 -0
  30. data/lib/arpaka.rb +6 -9
  31. data/lib/lrama/ruby/backend.rb +4 -9
  32. data/lib/lrama/ruby/parser.rb.erb +35 -9
  33. data/lib/lrama/ruby/parser_emitter.rb +41 -0
  34. data/lib/lrama/ruby/table_codec.rb +50 -0
  35. data/lib/lrama/ruby/version.rb +1 -1
  36. data/lib/lrama/ruby.rb +1 -0
  37. data/sig/arpaka.rbs +8 -3
  38. metadata +32 -16
  39. data/lib/arpaka/generator.rb +0 -51
  40. data/lib/arpaka/profile/ruby.rb +0 -49
  41. data/lib/arpaka/runtime/builder.rb.erb +0 -323
  42. /data/lib/arpaka/{BSDL → ruby/BSDL} +0 -0
  43. /data/lib/arpaka/{COPYING → ruby/COPYING} +0 -0
  44. /data/lib/arpaka/{source.json → ruby/source.json} +0 -0
  45. /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" => ["tOP_ASGN"].freeze}.freeze
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.if_node($3, [$1], nil)"],
43
- 34 => ["ported", "@builder.unless_node($3, [$1], nil)"],
44
- 35 => ["ported", "@builder.loop(:while, $3, [$1])"],
45
- 36 => ["ported", "@builder.loop(:until, $3, [$1])"],
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.call(:super, $2 || [])"],
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 => ["empty", "nil"],
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
- 484 => ["ported", "@builder.call(:super, $2 || [])"],
494
- 485 => ["ported", "@builder.call(:super, [])"],
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.if_node($3, [$1], nil)"],
518
- 509 => ["ported", "@builder.unless_node($3, [$1], nil)"],
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.literal(:self)"],
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 => ["pass_through", "$1"]},
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
- BlockCall = Data.define(:call, :body)
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)