code-ruby 0.3.1 → 0.5.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 (206) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/CHANGELOG.md +5 -0
  4. data/Gemfile +4 -0
  5. data/Gemfile.lock +28 -55
  6. data/TODO +17 -0
  7. data/bin/code +56 -31
  8. data/bin/format +3 -0
  9. data/bin/template +62 -20
  10. data/bin/test +17 -0
  11. data/code-ruby.gemspec +1 -6
  12. data/docs/class.code +9 -0
  13. data/docs/euler/1.template +1 -5
  14. data/docs/euler/5.template +0 -1
  15. data/docs/meetup.code +12 -0
  16. data/docs/precedence.template +6 -39
  17. data/docs/rain.code +22 -0
  18. data/docs/slack.code +17 -0
  19. data/docs/stripe.code +7 -0
  20. data/docs/twitter.code +9 -0
  21. data/language-ruby.gemspec +18 -0
  22. data/lib/code/error.rb +3 -0
  23. data/lib/code/node/base_10.rb +29 -0
  24. data/lib/code/node/base_16.rb +13 -0
  25. data/lib/code/node/base_2.rb +13 -0
  26. data/lib/code/node/base_8.rb +13 -0
  27. data/lib/code/node/boolean.rb +7 -7
  28. data/lib/code/node/call.rb +32 -37
  29. data/lib/code/node/call_argument.rb +11 -27
  30. data/lib/code/node/chained_call.rb +10 -25
  31. data/lib/code/node/code.rb +4 -6
  32. data/lib/code/node/decimal.rb +26 -0
  33. data/lib/code/node/dictionnary.rb +20 -9
  34. data/lib/code/node/equal.rb +18 -20
  35. data/lib/code/node/function.rb +10 -7
  36. data/lib/code/node/function_parameter.rb +31 -0
  37. data/lib/code/node/if.rb +36 -32
  38. data/lib/code/node/if_modifier.rb +35 -36
  39. data/lib/code/node/list.rb +6 -9
  40. data/lib/code/node/negation.rb +5 -23
  41. data/lib/code/node/not.rb +15 -0
  42. data/lib/code/node/nothing.rb +1 -1
  43. data/lib/code/node/number.rb +14 -12
  44. data/lib/code/node/operation.rb +21 -16
  45. data/lib/code/node/power.rb +10 -6
  46. data/lib/code/node/rescue.rb +4 -3
  47. data/lib/code/node/splat.rb +15 -0
  48. data/lib/code/node/statement.rb +47 -69
  49. data/lib/code/node/string.rb +41 -10
  50. data/lib/code/node/ternary.rb +7 -9
  51. data/lib/code/node/unary_minus.rb +5 -12
  52. data/lib/code/node/while.rb +17 -24
  53. data/lib/code/node.rb +7 -8
  54. data/lib/code/object/argument.rb +3 -12
  55. data/lib/code/object/decimal.rb +114 -27
  56. data/lib/code/object/dictionnary.rb +29 -12
  57. data/lib/code/object/function.rb +23 -24
  58. data/lib/code/object/global.rb +42 -0
  59. data/lib/code/object/integer.rb +142 -35
  60. data/lib/code/object/list.rb +74 -95
  61. data/lib/code/object/range.rb +38 -50
  62. data/lib/code/object/ruby_function.rb +31 -0
  63. data/lib/code/object/string.rb +36 -16
  64. data/lib/code/object.rb +114 -54
  65. data/lib/code/parser/addition.rb +12 -20
  66. data/lib/code/parser/and_operator.rb +9 -20
  67. data/lib/code/parser/bitwise_and.rb +9 -20
  68. data/lib/code/parser/bitwise_or.rb +12 -20
  69. data/lib/code/parser/boolean.rb +10 -7
  70. data/lib/code/parser/call.rb +92 -60
  71. data/lib/code/parser/chained_call.rb +47 -0
  72. data/lib/code/parser/class.rb +45 -0
  73. data/lib/code/parser/code.rb +17 -10
  74. data/lib/code/parser/dictionnary.rb +56 -30
  75. data/lib/code/parser/equal.rb +87 -35
  76. data/lib/code/parser/equality.rb +23 -24
  77. data/lib/code/parser/equality_lower.rb +9 -0
  78. data/lib/code/parser/function.rb +67 -40
  79. data/lib/code/parser/greater.rb +25 -0
  80. data/lib/code/parser/group.rb +13 -8
  81. data/lib/code/parser/if.rb +51 -21
  82. data/lib/code/parser/if_modifier.rb +43 -16
  83. data/lib/code/parser/list.rb +32 -19
  84. data/lib/code/parser/multiplication.rb +15 -20
  85. data/lib/code/parser/name.rb +96 -84
  86. data/lib/code/parser/negation.rb +20 -9
  87. data/lib/code/parser/not_keyword.rb +14 -12
  88. data/lib/code/parser/nothing.rb +13 -8
  89. data/lib/code/parser/number.rb +124 -68
  90. data/lib/code/parser/operation.rb +35 -0
  91. data/lib/code/parser/or_keyword.rb +12 -20
  92. data/lib/code/parser/or_operator.rb +9 -20
  93. data/lib/code/parser/power.rb +32 -14
  94. data/lib/code/parser/range.rb +9 -17
  95. data/lib/code/parser/rescue.rb +29 -13
  96. data/lib/code/parser/shift.rb +11 -21
  97. data/lib/code/parser/splat.rb +31 -0
  98. data/lib/code/parser/statement.rb +4 -3
  99. data/lib/code/parser/string.rb +53 -62
  100. data/lib/code/parser/ternary.rb +36 -15
  101. data/lib/code/parser/unary_minus.rb +23 -5
  102. data/lib/code/parser/while.rb +26 -15
  103. data/lib/code/parser/whitespace.rb +49 -0
  104. data/lib/code/parser.rb +15 -0
  105. data/lib/code/ruby.rb +162 -0
  106. data/lib/code-ruby.rb +2 -5
  107. data/lib/code.rb +24 -7
  108. data/lib/language/atom.rb +343 -0
  109. data/lib/language/output.rb +130 -0
  110. data/lib/language/parser/absent/present.rb +8 -0
  111. data/lib/language/parser/absent.rb +6 -0
  112. data/lib/language/parser/end_of_input.rb +6 -0
  113. data/lib/language/parser/interuption.rb +38 -0
  114. data/lib/language/parser/not_end_of_input.rb +6 -0
  115. data/lib/language/parser/str/not_found.rb +16 -0
  116. data/lib/language/parser/str.rb +6 -0
  117. data/lib/language/parser.rb +53 -0
  118. data/lib/language-ruby.rb +10 -0
  119. data/lib/language.rb +80 -0
  120. data/lib/template/node/code_part.rb +1 -1
  121. data/lib/template/node/part.rb +1 -1
  122. data/lib/template/node/template.rb +1 -1
  123. data/lib/template/node/text_part.rb +1 -1
  124. data/lib/template/node.rb +1 -1
  125. data/lib/template/parser/template.rb +26 -17
  126. data/lib/template/parser.rb +15 -0
  127. data/lib/template/version.rb +1 -1
  128. data/lib/template-ruby.rb +2 -5
  129. data/lib/template.rb +23 -13
  130. data/spec/code/addition_spec.rb +13 -0
  131. data/spec/code/and_operator_spec.rb +13 -0
  132. data/spec/code/bitwise_and_spec.rb +13 -0
  133. data/spec/code/bitwise_or_spec.rb +13 -0
  134. data/spec/code/boolean_spec.rb +13 -0
  135. data/spec/code/call_spec.rb +21 -0
  136. data/spec/code/chained_call_spec.rb +16 -0
  137. data/spec/code/dictionnary_spec.rb +17 -0
  138. data/spec/code/equal_spec.rb +26 -0
  139. data/spec/code/equality_spec.rb +13 -0
  140. data/spec/code/function_spec.rb +18 -0
  141. data/spec/code/greater_spec.rb +18 -0
  142. data/spec/code/group_spec.rb +12 -0
  143. data/spec/code/if_modifier_spec.rb +20 -0
  144. data/spec/code/if_spec.rb +25 -0
  145. data/spec/code/list_spec.rb +17 -0
  146. data/spec/code/multiplication_spec.rb +18 -0
  147. data/spec/code/negation_spec.rb +20 -0
  148. data/spec/code/not_keyword_spec.rb +13 -0
  149. data/spec/code/nothing_spec.rb +17 -0
  150. data/spec/code/number_spec.rb +22 -0
  151. data/spec/code/or_keyword_spec.rb +17 -0
  152. data/spec/code/or_operator_spec.rb +16 -0
  153. data/spec/code/parser/boolean_spec.rb +5 -7
  154. data/spec/code/parser/call_spec.rb +16 -56
  155. data/spec/code/parser/chained_call.rb +17 -0
  156. data/spec/code/parser/dictionnary_spec.rb +8 -9
  157. data/spec/code/parser/function_spec.rb +5 -21
  158. data/spec/code/parser/group_spec.rb +18 -0
  159. data/spec/code/parser/list_spec.rb +9 -20
  160. data/spec/code/parser/number_spec.rb +4 -109
  161. data/spec/code/parser/string_spec.rb +9 -17
  162. data/spec/code/parser_spec.rb +23 -0
  163. data/spec/code/power_spec.rb +13 -0
  164. data/spec/code/range_spec.rb +16 -0
  165. data/spec/code/rescue_spec.rb +13 -0
  166. data/spec/code/shift_spec.rb +13 -0
  167. data/spec/code/splat_spec.rb +13 -0
  168. data/spec/code/string_spec.rb +25 -0
  169. data/spec/code/ternary_spec.rb +18 -0
  170. data/spec/code/unary_minus_spec.rb +13 -0
  171. data/spec/code/while_spec.rb +18 -0
  172. data/spec/spec_helper.rb +4 -1
  173. data/template-ruby.gemspec +2 -7
  174. metadata +113 -99
  175. data/lib/code/node/base_10_decimal.rb +0 -32
  176. data/lib/code/node/base_10_integer.rb +0 -32
  177. data/lib/code/node/base_10_number.rb +0 -19
  178. data/lib/code/node/base_16_number.rb +0 -19
  179. data/lib/code/node/base_2_number.rb +0 -19
  180. data/lib/code/node/base_8_number.rb +0 -19
  181. data/lib/code/node/block.rb +0 -17
  182. data/lib/code/node/defined.rb +0 -19
  183. data/lib/code/node/dictionnary_key_value.rb +0 -23
  184. data/lib/code/node/function_argument.rb +0 -45
  185. data/lib/code/node/group.rb +0 -13
  186. data/lib/code/node/keyword_call_argument.rb +0 -30
  187. data/lib/code/node/keyword_function_argument.rb +0 -33
  188. data/lib/code/node/name.rb +0 -55
  189. data/lib/code/node/not_keyword.rb +0 -13
  190. data/lib/code/node/or_keyword.rb +0 -34
  191. data/lib/code/node/range.rb +0 -31
  192. data/lib/code/node/regular_call_argument.rb +0 -34
  193. data/lib/code/node/regular_function_argument.rb +0 -36
  194. data/lib/code/node/string_characters.rb +0 -13
  195. data/lib/code/node/string_component.rb +0 -23
  196. data/lib/code/node/string_interpolation.rb +0 -13
  197. data/lib/code/parser/defined.rb +0 -20
  198. data/lib/code/parser/greater_than.rb +0 -33
  199. data/spec/call_spec.rb +0 -22
  200. data/spec/code/error/type_error_spec.rb +0 -63
  201. data/spec/code/parser/name_spec.rb +0 -15
  202. data/spec/code/parser/nothing_spec.rb +0 -19
  203. data/spec/code_spec.rb +0 -120
  204. data/spec/function_spec.rb +0 -26
  205. data/spec/template/parser/template_spec.rb +0 -19
  206. data/spec/template_spec.rb +0 -33
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "string" do
4
+ let(:timeout) { 0 }
5
+ subject { Code.evaluate(input, timeout: timeout).to_s }
6
+
7
+ [["[1, 2].map(&:to_string)", '["1", "2"]']].each do |input, output|
8
+ context input do
9
+ let(:input) { input }
10
+ it { expect(subject).to eq(output) }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "string" do
4
+ let(:timeout) { 0 }
5
+ subject { Code.evaluate(input, timeout: timeout).to_s }
6
+
7
+ [
8
+ ["''", ""],
9
+ ['""', ""],
10
+ %w[:hello hello],
11
+ %w[:admin? admin?],
12
+ %w[:update! update!],
13
+ ["'Hello Dorian'", "Hello Dorian"],
14
+ ['"Hello Dorian"', "Hello Dorian"],
15
+ ["'Hello \\{name}'", "Hello {name}"],
16
+ ['"Hello \\{name}"', "Hello {name}"],
17
+ ["'Hello {1}'", "Hello 1"],
18
+ ['"Hello {1}"', "Hello 1"]
19
+ ].each do |input, output|
20
+ context input do
21
+ let(:input) { input }
22
+ it { expect(subject).to eq(output) }
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "ternary" do
4
+ let(:timeout) { 0 }
5
+ subject { Code.evaluate(input, timeout: timeout).to_s }
6
+
7
+ [
8
+ ["true ? 1", "1"],
9
+ ["false ? 1", ""],
10
+ ["true ? 1 : 2", "1"],
11
+ ["false ? 1 : 2", "2"]
12
+ ].each do |input, output|
13
+ context input do
14
+ let(:input) { input }
15
+ it { expect(subject).to eq(output) }
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "function" do
4
+ let(:timeout) { 0 }
5
+ subject { Code.evaluate(input, timeout: timeout).to_s }
6
+
7
+ [%w[-1 -1], %w[--1 1], %w[-1.0 -1.0], %w[--1.0 1.0]].each do |input, output|
8
+ context input do
9
+ let(:input) { input }
10
+ it { expect(subject).to eq(output) }
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,18 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe "while" do
4
+ let(:timeout) { 0 }
5
+ subject { Code.evaluate(input, timeout: timeout).to_s }
6
+
7
+ [
8
+ ["while false", ""],
9
+ ["a = 0\nwhile a < 10 a += 1 end a", "10"],
10
+ ["until true", ""],
11
+ ["a = 0\nuntil a > 10 a += 1 end a", "11"]
12
+ ].each do |input, output|
13
+ context input do
14
+ let(:input) { input }
15
+ it { expect(subject).to eq(output) }
16
+ end
17
+ end
18
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,6 @@
1
1
  require_relative "../lib/template-ruby"
2
+ require "json"
2
3
 
3
- RSpec.configure { |c| c.example_status_persistence_file_path = "examples.txt" }
4
+ RSpec.configure do |c|
5
+ c.example_status_persistence_file_path = "tmp/examples.txt"
6
+ end
@@ -5,7 +5,7 @@ Gem::Specification.new do |s|
5
5
  s.version = ::Template::Version
6
6
  s.summary = "A templating programming language"
7
7
  s.description =
8
- 'Like "Hello {name}" with {name: "Dorian"} gives "Hello Dorian"'
8
+ 'A templating programming language, like "Hello {name}" with {name: "Dorian"} gives "Hello Dorian"'
9
9
  s.authors = ["Dorian Marié"]
10
10
  s.email = "dorian@dorianmarie.fr"
11
11
  s.files = `git ls-files`.split($/)
@@ -15,10 +15,5 @@ Gem::Specification.new do |s|
15
15
  s.license = "MIT"
16
16
  s.executables = "template"
17
17
 
18
- s.add_dependency "activesupport", "~> 7"
19
- s.add_dependency "parslet", "~> 2"
20
- s.add_dependency "zeitwerk", "~> 2.6"
21
-
22
- s.add_development_dependency "prettier", "~> 3"
23
- s.add_development_dependency "rspec", "~> 3"
18
+ s.add_dependency "zeitwerk", "~> 2"
24
19
  end
metadata CHANGED
@@ -1,31 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: code-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dorian Marié
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-13 00:00:00.000000000 Z
11
+ date: 2022-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '7'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '7'
27
- - !ruby/object:Gem::Dependency
28
- name: parslet
14
+ name: zeitwerk
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - "~>"
@@ -38,48 +24,6 @@ dependencies:
38
24
  - - "~>"
39
25
  - !ruby/object:Gem::Version
40
26
  version: '2'
41
- - !ruby/object:Gem::Dependency
42
- name: zeitwerk
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: '2.6'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: '2.6'
55
- - !ruby/object:Gem::Dependency
56
- name: prettier
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: '3'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: '3'
69
- - !ruby/object:Gem::Dependency
70
- name: rspec
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '3'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '3'
83
27
  description: 'A programming language, like Code.evaluate("1 + 1") # => 2'
84
28
  email: dorian@dorianmarie.fr
85
29
  executables: []
@@ -96,61 +40,57 @@ files:
96
40
  - Gemfile.lock
97
41
  - LICENSE
98
42
  - README.md
43
+ - TODO
99
44
  - bin/code
45
+ - bin/format
100
46
  - bin/template
47
+ - bin/test
101
48
  - code-ruby.gemspec
49
+ - docs/class.code
102
50
  - docs/euler/1.template
103
51
  - docs/euler/2.template
104
52
  - docs/euler/3.template
105
53
  - docs/euler/4.template
106
54
  - docs/euler/5.template
107
55
  - docs/fibonnaci.template
56
+ - docs/meetup.code
108
57
  - docs/precedence.template
58
+ - docs/rain.code
59
+ - docs/slack.code
60
+ - docs/stripe.code
61
+ - docs/twitter.code
62
+ - language-ruby.gemspec
109
63
  - lib/code-ruby.rb
110
64
  - lib/code.rb
111
65
  - lib/code/error.rb
112
66
  - lib/code/node.rb
113
- - lib/code/node/base_10_decimal.rb
114
- - lib/code/node/base_10_integer.rb
115
- - lib/code/node/base_10_number.rb
116
- - lib/code/node/base_16_number.rb
117
- - lib/code/node/base_2_number.rb
118
- - lib/code/node/base_8_number.rb
119
- - lib/code/node/block.rb
67
+ - lib/code/node/base_10.rb
68
+ - lib/code/node/base_16.rb
69
+ - lib/code/node/base_2.rb
70
+ - lib/code/node/base_8.rb
120
71
  - lib/code/node/boolean.rb
121
72
  - lib/code/node/call.rb
122
73
  - lib/code/node/call_argument.rb
123
74
  - lib/code/node/chained_call.rb
124
75
  - lib/code/node/code.rb
125
- - lib/code/node/defined.rb
76
+ - lib/code/node/decimal.rb
126
77
  - lib/code/node/dictionnary.rb
127
- - lib/code/node/dictionnary_key_value.rb
128
78
  - lib/code/node/equal.rb
129
79
  - lib/code/node/function.rb
130
- - lib/code/node/function_argument.rb
131
- - lib/code/node/group.rb
80
+ - lib/code/node/function_parameter.rb
132
81
  - lib/code/node/if.rb
133
82
  - lib/code/node/if_modifier.rb
134
- - lib/code/node/keyword_call_argument.rb
135
- - lib/code/node/keyword_function_argument.rb
136
83
  - lib/code/node/list.rb
137
- - lib/code/node/name.rb
138
84
  - lib/code/node/negation.rb
139
- - lib/code/node/not_keyword.rb
85
+ - lib/code/node/not.rb
140
86
  - lib/code/node/nothing.rb
141
87
  - lib/code/node/number.rb
142
88
  - lib/code/node/operation.rb
143
- - lib/code/node/or_keyword.rb
144
89
  - lib/code/node/power.rb
145
- - lib/code/node/range.rb
146
- - lib/code/node/regular_call_argument.rb
147
- - lib/code/node/regular_function_argument.rb
148
90
  - lib/code/node/rescue.rb
91
+ - lib/code/node/splat.rb
149
92
  - lib/code/node/statement.rb
150
93
  - lib/code/node/string.rb
151
- - lib/code/node/string_characters.rb
152
- - lib/code/node/string_component.rb
153
- - lib/code/node/string_interpolation.rb
154
94
  - lib/code/node/ternary.rb
155
95
  - lib/code/node/unary_minus.rb
156
96
  - lib/code/node/while.rb
@@ -160,11 +100,13 @@ files:
160
100
  - lib/code/object/decimal.rb
161
101
  - lib/code/object/dictionnary.rb
162
102
  - lib/code/object/function.rb
103
+ - lib/code/object/global.rb
163
104
  - lib/code/object/integer.rb
164
105
  - lib/code/object/list.rb
165
106
  - lib/code/object/nothing.rb
166
107
  - lib/code/object/number.rb
167
108
  - lib/code/object/range.rb
109
+ - lib/code/object/ruby_function.rb
168
110
  - lib/code/object/string.rb
169
111
  - lib/code/parser.rb
170
112
  - lib/code/parser/addition.rb
@@ -173,13 +115,15 @@ files:
173
115
  - lib/code/parser/bitwise_or.rb
174
116
  - lib/code/parser/boolean.rb
175
117
  - lib/code/parser/call.rb
118
+ - lib/code/parser/chained_call.rb
119
+ - lib/code/parser/class.rb
176
120
  - lib/code/parser/code.rb
177
- - lib/code/parser/defined.rb
178
121
  - lib/code/parser/dictionnary.rb
179
122
  - lib/code/parser/equal.rb
180
123
  - lib/code/parser/equality.rb
124
+ - lib/code/parser/equality_lower.rb
181
125
  - lib/code/parser/function.rb
182
- - lib/code/parser/greater_than.rb
126
+ - lib/code/parser/greater.rb
183
127
  - lib/code/parser/group.rb
184
128
  - lib/code/parser/if.rb
185
129
  - lib/code/parser/if_modifier.rb
@@ -190,17 +134,33 @@ files:
190
134
  - lib/code/parser/not_keyword.rb
191
135
  - lib/code/parser/nothing.rb
192
136
  - lib/code/parser/number.rb
137
+ - lib/code/parser/operation.rb
193
138
  - lib/code/parser/or_keyword.rb
194
139
  - lib/code/parser/or_operator.rb
195
140
  - lib/code/parser/power.rb
196
141
  - lib/code/parser/range.rb
197
142
  - lib/code/parser/rescue.rb
198
143
  - lib/code/parser/shift.rb
144
+ - lib/code/parser/splat.rb
199
145
  - lib/code/parser/statement.rb
200
146
  - lib/code/parser/string.rb
201
147
  - lib/code/parser/ternary.rb
202
148
  - lib/code/parser/unary_minus.rb
203
149
  - lib/code/parser/while.rb
150
+ - lib/code/parser/whitespace.rb
151
+ - lib/code/ruby.rb
152
+ - lib/language-ruby.rb
153
+ - lib/language.rb
154
+ - lib/language/atom.rb
155
+ - lib/language/output.rb
156
+ - lib/language/parser.rb
157
+ - lib/language/parser/absent.rb
158
+ - lib/language/parser/absent/present.rb
159
+ - lib/language/parser/end_of_input.rb
160
+ - lib/language/parser/interuption.rb
161
+ - lib/language/parser/not_end_of_input.rb
162
+ - lib/language/parser/str.rb
163
+ - lib/language/parser/str/not_found.rb
204
164
  - lib/template-ruby.rb
205
165
  - lib/template.rb
206
166
  - lib/template/node.rb
@@ -211,22 +171,49 @@ files:
211
171
  - lib/template/parser.rb
212
172
  - lib/template/parser/template.rb
213
173
  - lib/template/version.rb
214
- - spec/call_spec.rb
215
- - spec/code/error/type_error_spec.rb
174
+ - spec/code/addition_spec.rb
175
+ - spec/code/and_operator_spec.rb
176
+ - spec/code/bitwise_and_spec.rb
177
+ - spec/code/bitwise_or_spec.rb
178
+ - spec/code/boolean_spec.rb
179
+ - spec/code/call_spec.rb
180
+ - spec/code/chained_call_spec.rb
181
+ - spec/code/dictionnary_spec.rb
182
+ - spec/code/equal_spec.rb
183
+ - spec/code/equality_spec.rb
184
+ - spec/code/function_spec.rb
185
+ - spec/code/greater_spec.rb
186
+ - spec/code/group_spec.rb
187
+ - spec/code/if_modifier_spec.rb
188
+ - spec/code/if_spec.rb
189
+ - spec/code/list_spec.rb
190
+ - spec/code/multiplication_spec.rb
191
+ - spec/code/negation_spec.rb
192
+ - spec/code/not_keyword_spec.rb
193
+ - spec/code/nothing_spec.rb
194
+ - spec/code/number_spec.rb
195
+ - spec/code/or_keyword_spec.rb
196
+ - spec/code/or_operator_spec.rb
216
197
  - spec/code/parser/boolean_spec.rb
217
198
  - spec/code/parser/call_spec.rb
199
+ - spec/code/parser/chained_call.rb
218
200
  - spec/code/parser/dictionnary_spec.rb
219
201
  - spec/code/parser/function_spec.rb
202
+ - spec/code/parser/group_spec.rb
220
203
  - spec/code/parser/list_spec.rb
221
- - spec/code/parser/name_spec.rb
222
- - spec/code/parser/nothing_spec.rb
223
204
  - spec/code/parser/number_spec.rb
224
205
  - spec/code/parser/string_spec.rb
225
- - spec/code_spec.rb
226
- - spec/function_spec.rb
206
+ - spec/code/parser_spec.rb
207
+ - spec/code/power_spec.rb
208
+ - spec/code/range_spec.rb
209
+ - spec/code/rescue_spec.rb
210
+ - spec/code/shift_spec.rb
211
+ - spec/code/splat_spec.rb
212
+ - spec/code/string_spec.rb
213
+ - spec/code/ternary_spec.rb
214
+ - spec/code/unary_minus_spec.rb
215
+ - spec/code/while_spec.rb
227
216
  - spec/spec_helper.rb
228
- - spec/template/parser/template_spec.rb
229
- - spec/template_spec.rb
230
217
  - template-ruby.gemspec
231
218
  homepage: https://github.com/dorianmariefr/template-ruby
232
219
  licenses:
@@ -252,19 +239,46 @@ signing_key:
252
239
  specification_version: 4
253
240
  summary: A programming language
254
241
  test_files:
255
- - spec/call_spec.rb
256
- - spec/code/error/type_error_spec.rb
242
+ - spec/code/addition_spec.rb
243
+ - spec/code/and_operator_spec.rb
244
+ - spec/code/bitwise_and_spec.rb
245
+ - spec/code/bitwise_or_spec.rb
246
+ - spec/code/boolean_spec.rb
247
+ - spec/code/call_spec.rb
248
+ - spec/code/chained_call_spec.rb
249
+ - spec/code/dictionnary_spec.rb
250
+ - spec/code/equal_spec.rb
251
+ - spec/code/equality_spec.rb
252
+ - spec/code/function_spec.rb
253
+ - spec/code/greater_spec.rb
254
+ - spec/code/group_spec.rb
255
+ - spec/code/if_modifier_spec.rb
256
+ - spec/code/if_spec.rb
257
+ - spec/code/list_spec.rb
258
+ - spec/code/multiplication_spec.rb
259
+ - spec/code/negation_spec.rb
260
+ - spec/code/not_keyword_spec.rb
261
+ - spec/code/nothing_spec.rb
262
+ - spec/code/number_spec.rb
263
+ - spec/code/or_keyword_spec.rb
264
+ - spec/code/or_operator_spec.rb
257
265
  - spec/code/parser/boolean_spec.rb
258
266
  - spec/code/parser/call_spec.rb
267
+ - spec/code/parser/chained_call.rb
259
268
  - spec/code/parser/dictionnary_spec.rb
260
269
  - spec/code/parser/function_spec.rb
270
+ - spec/code/parser/group_spec.rb
261
271
  - spec/code/parser/list_spec.rb
262
- - spec/code/parser/name_spec.rb
263
- - spec/code/parser/nothing_spec.rb
264
272
  - spec/code/parser/number_spec.rb
265
273
  - spec/code/parser/string_spec.rb
266
- - spec/code_spec.rb
267
- - spec/function_spec.rb
274
+ - spec/code/parser_spec.rb
275
+ - spec/code/power_spec.rb
276
+ - spec/code/range_spec.rb
277
+ - spec/code/rescue_spec.rb
278
+ - spec/code/shift_spec.rb
279
+ - spec/code/splat_spec.rb
280
+ - spec/code/string_spec.rb
281
+ - spec/code/ternary_spec.rb
282
+ - spec/code/unary_minus_spec.rb
283
+ - spec/code/while_spec.rb
268
284
  - spec/spec_helper.rb
269
- - spec/template/parser/template_spec.rb
270
- - spec/template_spec.rb
@@ -1,32 +0,0 @@
1
- class Code
2
- class Node
3
- class Base10Decimal < Node
4
- def initialize(number)
5
- @sign = number[:sign]
6
- @whole = number.fetch(:whole)
7
- @decimal = number.fetch(:decimal)
8
-
9
- if number.key?(:exponent)
10
- @exponent = ::Code::Node::Base10Number.new(number[:exponent])
11
- end
12
- end
13
-
14
- def evaluate(**args)
15
- if @exponent
16
- exponent = @exponent.evaluate(**args)
17
-
18
- ::Code::Object::Decimal.new(
19
- "#{sign}#{whole}.#{decimal}",
20
- exponent: exponent,
21
- )
22
- else
23
- ::Code::Object::Decimal.new("#{sign}#{whole}.#{decimal}")
24
- end
25
- end
26
-
27
- private
28
-
29
- attr_reader :sign, :whole, :decimal
30
- end
31
- end
32
- end
@@ -1,32 +0,0 @@
1
- class Code
2
- class Node
3
- class Base10Integer < Node
4
- def initialize(number)
5
- @sign = number[:sign]
6
- @whole = number.fetch(:whole)
7
-
8
- if number.key?(:exponent)
9
- @exponent = ::Code::Node::Base10Number.new(number[:exponent])
10
- end
11
- end
12
-
13
- def evaluate(**args)
14
- if @exponent
15
- exponent = @exponent.evaluate(**args)
16
-
17
- if exponent.is_a?(::Code::Object::Decimal)
18
- ::Code::Object::Decimal.new("#{sign}#{whole}", exponent: exponent)
19
- else
20
- ::Code::Object::Integer.new("#{sign}#{whole}", exponent: exponent)
21
- end
22
- else
23
- ::Code::Object::Integer.new("#{sign}#{whole}")
24
- end
25
- end
26
-
27
- private
28
-
29
- attr_reader :sign, :whole
30
- end
31
- end
32
- end
@@ -1,19 +0,0 @@
1
- class Code
2
- class Node
3
- class Base10Number < Node
4
- def initialize(number)
5
- if number.key?(:integer)
6
- @number = ::Code::Node::Base10Integer.new(number[:integer])
7
- elsif number.key?(:decimal)
8
- @number = ::Code::Node::Base10Decimal.new(number[:decimal])
9
- else
10
- raise NotImplementedErorr.new(number.inspect)
11
- end
12
- end
13
-
14
- def evaluate(**args)
15
- @number.evaluate(**args)
16
- end
17
- end
18
- end
19
- end
@@ -1,19 +0,0 @@
1
- class Code
2
- class Node
3
- class Base16Number < Node
4
- def initialize(number)
5
- @number = number
6
- end
7
-
8
- def evaluate(**args)
9
- ::Code::Object::Integer.new(number)
10
- end
11
-
12
- private
13
-
14
- def number
15
- @number.to_s.to_i(16)
16
- end
17
- end
18
- end
19
- end
@@ -1,19 +0,0 @@
1
- class Code
2
- class Node
3
- class Base2Number < Node
4
- def initialize(number)
5
- @number = number
6
- end
7
-
8
- def evaluate(**args)
9
- ::Code::Object::Integer.new(number)
10
- end
11
-
12
- private
13
-
14
- def number
15
- @number.to_s.to_i(2)
16
- end
17
- end
18
- end
19
- end
@@ -1,19 +0,0 @@
1
- class Code
2
- class Node
3
- class Base8Number < Node
4
- def initialize(number)
5
- @number = number
6
- end
7
-
8
- def evaluate(**args)
9
- ::Code::Object::Integer.new(number)
10
- end
11
-
12
- private
13
-
14
- def number
15
- @number.to_s.to_i(8)
16
- end
17
- end
18
- end
19
- end
@@ -1,17 +0,0 @@
1
- class Code
2
- class Node
3
- class Block < Node
4
- def initialize(block)
5
- @body = ::Code::Node::Code.new(block.fetch(:body))
6
- @arguments = block.fetch(:arguments, [])
7
- @arguments.map! do |argument|
8
- ::Code::Node::FunctionArgument.new(argument)
9
- end
10
- end
11
-
12
- def evaluate(**args)
13
- ::Code::Object::Function.new(arguments: @arguments, body: @body)
14
- end
15
- end
16
- end
17
- end
@@ -1,19 +0,0 @@
1
- class Code
2
- class Node
3
- class Defined < Node
4
- def initialize(defined)
5
- @name = defined.fetch(:name)
6
- end
7
-
8
- def evaluate(**args)
9
- ::Code::Object::Boolean.new(args.fetch(:context).key?(name))
10
- end
11
-
12
- private
13
-
14
- def name
15
- ::Code::Object::String.new(@name.to_s)
16
- end
17
- end
18
- end
19
- end
@@ -1,23 +0,0 @@
1
- class Code
2
- class Node
3
- class DictionnaryKeyValue < Node
4
- def initialize(key_value)
5
- @key = key_value.fetch(:key)
6
-
7
- if @key.is_a?(Array)
8
- @key = ::Code::Node::Code.new(@key)
9
- elsif @key.key?(:name)
10
- @key = ::Code::Node::String.new(@key[:name])
11
- else
12
- @key = ::Code::Node::Statement.new(@key)
13
- end
14
-
15
- @value = ::Code::Node::Code.new(key_value.fetch(:value))
16
- end
17
-
18
- def evaluate(**args)
19
- [@key.evaluate(**args), @value.evaluate(**args)]
20
- end
21
- end
22
- end
23
- end