code-ruby 0.5.6 → 0.6.1

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 (218) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -3
  3. data/Gemfile.lock +11 -21
  4. data/README.md +2 -102
  5. data/bin/code +34 -16
  6. data/code-ruby.gemspec +5 -3
  7. data/lib/code/error.rb +16 -5
  8. data/lib/code/node/base_10.rb +4 -2
  9. data/lib/code/node/base_16.rb +3 -1
  10. data/lib/code/node/base_2.rb +3 -1
  11. data/lib/code/node/base_8.rb +3 -1
  12. data/lib/code/node/boolean.rb +4 -2
  13. data/lib/code/node/call.rb +35 -12
  14. data/lib/code/node/call_argument.rb +16 -5
  15. data/lib/code/node/code.rb +5 -4
  16. data/lib/code/node/decimal.rb +2 -0
  17. data/lib/code/node/{dictionnary.rb → dictionary.rb} +14 -5
  18. data/lib/code/node/function.rb +7 -4
  19. data/lib/code/node/function_parameter.rb +3 -1
  20. data/lib/code/node/if.rb +5 -3
  21. data/lib/code/node/left_operation.rb +63 -0
  22. data/lib/code/node/list.rb +2 -0
  23. data/lib/code/node/negation.rb +2 -0
  24. data/lib/code/node/not.rb +2 -0
  25. data/lib/code/node/nothing.rb +3 -1
  26. data/lib/code/node/number.rb +2 -0
  27. data/lib/code/node/right_operation.rb +70 -0
  28. data/lib/code/node/splat.rb +2 -0
  29. data/lib/code/node/square_bracket.rb +37 -0
  30. data/lib/code/node/statement.rb +13 -5
  31. data/lib/code/node/string.rb +3 -1
  32. data/lib/code/node/ternary.rb +5 -3
  33. data/lib/code/node/unary_minus.rb +2 -0
  34. data/lib/code/node/while.rb +6 -4
  35. data/lib/code/node.rb +11 -5
  36. data/lib/code/object/argument.rb +13 -7
  37. data/lib/code/object/boolean.rb +43 -5
  38. data/lib/code/object/class.rb +17 -0
  39. data/lib/code/object/context.rb +36 -0
  40. data/lib/code/object/decimal.rb +252 -100
  41. data/lib/code/object/dictionary.rb +641 -0
  42. data/lib/code/object/function.rb +54 -27
  43. data/lib/code/object/global.rb +65 -19
  44. data/lib/code/object/identifier_list.rb +47 -0
  45. data/lib/code/object/integer.rb +320 -137
  46. data/lib/code/object/list.rb +140 -138
  47. data/lib/code/object/nothing.rb +10 -4
  48. data/lib/code/object/number.rb +6 -1
  49. data/lib/code/object/range.rb +85 -88
  50. data/lib/code/object/ruby_function.rb +11 -6
  51. data/lib/code/object/string.rb +51 -48
  52. data/lib/code/object.rb +117 -139
  53. data/lib/code/parser/addition.rb +4 -2
  54. data/lib/code/parser/and_operator.rb +4 -2
  55. data/lib/code/parser/bitwise_and.rb +4 -2
  56. data/lib/code/parser/bitwise_or.rb +4 -2
  57. data/lib/code/parser/boolean.rb +3 -1
  58. data/lib/code/parser/call.rb +17 -11
  59. data/lib/code/parser/chained_call.rb +10 -22
  60. data/lib/code/parser/class.rb +9 -6
  61. data/lib/code/parser/code.rb +6 -4
  62. data/lib/code/parser/{dictionnary.rb → dictionary.rb} +16 -13
  63. data/lib/code/parser/equal.rb +9 -36
  64. data/lib/code/parser/equality.rb +4 -2
  65. data/lib/code/parser/function.rb +24 -9
  66. data/lib/code/parser/greater.rb +6 -3
  67. data/lib/code/parser/group.rb +4 -2
  68. data/lib/code/parser/if.rb +6 -4
  69. data/lib/code/parser/if_modifier.rb +5 -25
  70. data/lib/code/parser/left_operation.rb +40 -0
  71. data/lib/code/parser/list.rb +6 -5
  72. data/lib/code/parser/multiplication.rb +4 -2
  73. data/lib/code/parser/name.rb +19 -4
  74. data/lib/code/parser/negation.rb +4 -2
  75. data/lib/code/parser/not_keyword.rb +5 -3
  76. data/lib/code/parser/nothing.rb +3 -10
  77. data/lib/code/parser/number.rb +4 -2
  78. data/lib/code/parser/or_keyword.rb +4 -2
  79. data/lib/code/parser/or_operator.rb +4 -2
  80. data/lib/code/parser/power.rb +4 -28
  81. data/lib/code/parser/range.rb +4 -2
  82. data/lib/code/parser/rescue.rb +6 -26
  83. data/lib/code/parser/right_operation.rb +40 -0
  84. data/lib/code/parser/shift.rb +4 -2
  85. data/lib/code/parser/splat.rb +5 -3
  86. data/lib/code/parser/square_bracket.rb +48 -0
  87. data/lib/code/parser/statement.rb +3 -1
  88. data/lib/code/parser/string.rb +12 -10
  89. data/lib/code/parser/ternary.rb +10 -11
  90. data/lib/code/parser/unary_minus.rb +5 -3
  91. data/lib/code/parser/while.rb +5 -3
  92. data/lib/code/parser/whitespace.rb +2 -0
  93. data/lib/code/parser.rb +10 -3
  94. data/lib/code/ruby.rb +4 -2
  95. data/lib/code/type/hash.rb +38 -0
  96. data/lib/code/type/maybe.rb +29 -0
  97. data/lib/code/type/or.rb +38 -0
  98. data/lib/code/type/repeat.rb +38 -0
  99. data/lib/code/type/sig.rb +130 -0
  100. data/lib/code/type.rb +25 -0
  101. data/lib/code/version.rb +3 -0
  102. data/lib/code-ruby.rb +1 -2
  103. data/lib/code.rb +15 -16
  104. data/spec/code/node/call_spec.rb +39 -0
  105. data/spec/code/object/boolean_spec.rb +18 -0
  106. data/spec/code/object/decimal_spec.rb +51 -0
  107. data/spec/code/object/dictionary_spec.rb +98 -0
  108. data/spec/code/object/function_spec.rb +42 -0
  109. data/spec/code/object/integer_spec.rb +43 -0
  110. data/spec/code/object/nothing_spec.rb +14 -0
  111. data/spec/code/object/range_spec.rb +23 -0
  112. data/spec/code/parser/boolean_spec.rb +5 -10
  113. data/spec/code/parser/chained_call.rb +4 -5
  114. data/spec/code/parser/{dictionnary_spec.rb → dictionary_spec.rb} +5 -6
  115. data/spec/code/parser/function_spec.rb +4 -5
  116. data/spec/code/parser/group_spec.rb +5 -12
  117. data/spec/code/parser/if_modifier_spec.rb +18 -0
  118. data/spec/code/parser/list_spec.rb +4 -5
  119. data/spec/code/parser/number_spec.rb +4 -5
  120. data/spec/code/parser/string_spec.rb +4 -5
  121. data/spec/code/parser_spec.rb +22 -16
  122. data/spec/code/type_spec.rb +21 -0
  123. data/spec/code_spec.rb +171 -0
  124. data/spec/spec_helper.rb +1 -6
  125. metadata +63 -136
  126. data/.cherry.js +0 -21
  127. data/.editorconfig +0 -9
  128. data/.github/workflows/rspec.yml +0 -14
  129. data/.gitignore +0 -2
  130. data/.prettierrc +0 -3
  131. data/.tool-versions +0 -1
  132. data/CHANGELOG.md +0 -55
  133. data/LICENSE +0 -7
  134. data/TODO +0 -17
  135. data/bin/format +0 -3
  136. data/bin/publish +0 -19
  137. data/bin/template +0 -85
  138. data/bin/test +0 -17
  139. data/docs/class.code +0 -9
  140. data/docs/euler/1.template +0 -10
  141. data/docs/euler/2.template +0 -16
  142. data/docs/euler/3.template +0 -16
  143. data/docs/euler/4.template +0 -10
  144. data/docs/euler/5.template +0 -13
  145. data/docs/fibonnaci.template +0 -14
  146. data/docs/meetup.code +0 -12
  147. data/docs/precedence.template +0 -36
  148. data/docs/rain.code +0 -22
  149. data/docs/slack.code +0 -17
  150. data/docs/stripe.code +0 -7
  151. data/docs/twitter.code +0 -9
  152. data/language-ruby.gemspec +0 -17
  153. data/lib/code/node/chained_call.rb +0 -23
  154. data/lib/code/node/equal.rb +0 -34
  155. data/lib/code/node/if_modifier.rb +0 -47
  156. data/lib/code/node/operation.rb +0 -38
  157. data/lib/code/node/power.rb +0 -20
  158. data/lib/code/node/rescue.rb +0 -17
  159. data/lib/code/object/dictionnary.rb +0 -96
  160. data/lib/code/parser/equality_lower.rb +0 -9
  161. data/lib/code/parser/operation.rb +0 -35
  162. data/lib/language/atom.rb +0 -342
  163. data/lib/language/output.rb +0 -130
  164. data/lib/language/parser/absent/present.rb +0 -8
  165. data/lib/language/parser/absent.rb +0 -6
  166. data/lib/language/parser/end_of_input.rb +0 -6
  167. data/lib/language/parser/interuption.rb +0 -38
  168. data/lib/language/parser/not_end_of_input.rb +0 -6
  169. data/lib/language/parser/str/not_found.rb +0 -16
  170. data/lib/language/parser/str.rb +0 -6
  171. data/lib/language/parser.rb +0 -53
  172. data/lib/language-ruby.rb +0 -10
  173. data/lib/language.rb +0 -80
  174. data/lib/template/node/code_part.rb +0 -13
  175. data/lib/template/node/part.rb +0 -19
  176. data/lib/template/node/template.rb +0 -15
  177. data/lib/template/node/text_part.rb +0 -13
  178. data/lib/template/node.rb +0 -4
  179. data/lib/template/parser/template.rb +0 -39
  180. data/lib/template/parser.rb +0 -19
  181. data/lib/template/version.rb +0 -3
  182. data/lib/template-ruby.rb +0 -10
  183. data/lib/template.rb +0 -50
  184. data/spec/code/addition_spec.rb +0 -13
  185. data/spec/code/and_operator_spec.rb +0 -13
  186. data/spec/code/bitwise_and_spec.rb +0 -13
  187. data/spec/code/bitwise_or_spec.rb +0 -13
  188. data/spec/code/boolean_spec.rb +0 -13
  189. data/spec/code/call_spec.rb +0 -21
  190. data/spec/code/chained_call_spec.rb +0 -16
  191. data/spec/code/code_spec.rb +0 -29
  192. data/spec/code/dictionnary_spec.rb +0 -17
  193. data/spec/code/equal_spec.rb +0 -26
  194. data/spec/code/equality_spec.rb +0 -13
  195. data/spec/code/function_spec.rb +0 -18
  196. data/spec/code/greater_spec.rb +0 -18
  197. data/spec/code/group_spec.rb +0 -12
  198. data/spec/code/if_modifier_spec.rb +0 -20
  199. data/spec/code/if_spec.rb +0 -25
  200. data/spec/code/list_spec.rb +0 -19
  201. data/spec/code/multiplication_spec.rb +0 -18
  202. data/spec/code/negation_spec.rb +0 -20
  203. data/spec/code/not_keyword_spec.rb +0 -13
  204. data/spec/code/nothing_spec.rb +0 -17
  205. data/spec/code/number_spec.rb +0 -22
  206. data/spec/code/or_keyword_spec.rb +0 -17
  207. data/spec/code/or_operator_spec.rb +0 -16
  208. data/spec/code/parser/call_spec.rb +0 -26
  209. data/spec/code/power_spec.rb +0 -13
  210. data/spec/code/range_spec.rb +0 -16
  211. data/spec/code/rescue_spec.rb +0 -13
  212. data/spec/code/shift_spec.rb +0 -13
  213. data/spec/code/splat_spec.rb +0 -13
  214. data/spec/code/string_spec.rb +0 -27
  215. data/spec/code/ternary_spec.rb +0 -18
  216. data/spec/code/unary_minus_spec.rb +0 -13
  217. data/spec/code/while_spec.rb +0 -18
  218. data/template-ruby.gemspec +0 -19
@@ -1,35 +0,0 @@
1
- class Code
2
- class Parser
3
- class Operation < Language
4
- def statement
5
- raise NotImplementedError
6
- end
7
-
8
- def whitespace
9
- ::Code::Parser::Whitespace
10
- end
11
-
12
- def whitespace?
13
- whitespace.maybe
14
- end
15
-
16
- def operator
17
- raise NotImplementedError
18
- end
19
-
20
- def root
21
- (
22
- statement.aka(:first) <<
23
- (
24
- whitespace? << operator.aka(:operator) << whitespace? <<
25
- statement.aka(:statement)
26
- ).repeat(1).aka(:others).maybe
27
- )
28
- .aka(:operation)
29
- .then do |output|
30
- output[:operation][:others] ? output : output[:operation][:first]
31
- end
32
- end
33
- end
34
- end
35
- end
data/lib/language/atom.rb DELETED
@@ -1,342 +0,0 @@
1
- class Language
2
- class Atom
3
- class Rule < Atom
4
- def initialize(name:)
5
- @name = name
6
- end
7
-
8
- def parse(parser)
9
- parser.find_rule!(@name).parse(parser)
10
- end
11
-
12
- def to_s
13
- "rule(#{@name.inspect})"
14
- end
15
- end
16
-
17
- class Any < Atom
18
- def parse(parser)
19
- parser.consume(1)
20
- end
21
-
22
- def to_s
23
- "any"
24
- end
25
- end
26
-
27
- class Then < Atom
28
- def initialize(parent:, block:)
29
- @parent = parent
30
- @block = block
31
- end
32
-
33
- def parse(parser)
34
- @parent.parse(parser)
35
- parser.output = Output.from_raw(@block.call(parser.output.to_raw))
36
- end
37
-
38
- def to_s
39
- "(#{@parent}).then {}"
40
- end
41
- end
42
-
43
- class Repeat < Atom
44
- def initialize(parent: nil, min: 0, max: nil)
45
- @parent = parent
46
- @min = min
47
- @max = max
48
- end
49
-
50
- def parse(parser)
51
- return unless @parent
52
-
53
- if @max.nil?
54
- @min.times { match(parser) }
55
-
56
- begin
57
- loop { match(parser) }
58
- rescue Parser::Interuption
59
- end
60
- else
61
- @min.times { match(parser) }
62
-
63
- begin
64
- (@max - @min).times { match(parser) }
65
- rescue Parser::Interuption
66
- end
67
- end
68
- end
69
-
70
- def to_s
71
- min = @min.zero? ? "" : @min.to_s
72
- max = @max.nil? ? "" : ", #{@max}"
73
- parenthesis = min.empty? && max.empty? ? "" : "(#{min}#{max})"
74
-
75
- @parent ? "(#{@parent}).repeat#{parenthesis}" : "repeat#{parenthesis}"
76
- end
77
-
78
- private
79
-
80
- def match(parser)
81
- clone =
82
- Parser.new(
83
- root: self,
84
- input: parser.input,
85
- cursor: parser.cursor,
86
- buffer: parser.buffer
87
- )
88
-
89
- @parent.parse(clone)
90
-
91
- parser.cursor = clone.cursor
92
- parser.buffer = clone.buffer
93
- parser.output << clone.output
94
- end
95
- end
96
-
97
- class Str < Atom
98
- def initialize(string:)
99
- @string = string
100
- end
101
-
102
- def parse(parser)
103
- if parser.next?(@string)
104
- parser.consume(@string.size)
105
- else
106
- raise Parser::Str::NotFound.new(parser, @string)
107
- end
108
- end
109
-
110
- def to_s
111
- "str(#{@string.inspect})"
112
- end
113
- end
114
-
115
- class Absent < Atom
116
- def initialize(parent: nil)
117
- @parent = parent
118
- end
119
-
120
- def parse(parser)
121
- clone =
122
- Parser.new(
123
- root: self,
124
- input: parser.input,
125
- cursor: parser.cursor,
126
- buffer: parser.buffer
127
- )
128
- @parent.parse(clone) if @parent
129
- rescue Parser::Interuption
130
- else
131
- raise Parser::Interuption.new(parser, self)
132
- end
133
-
134
- def to_s
135
- @parent ? "(#{@parent}).absent" : "absent"
136
- end
137
- end
138
-
139
- class Ignore < Atom
140
- def initialize(parent: nil)
141
- @parent = parent
142
- end
143
-
144
- def parse(parser)
145
- clone =
146
- Parser.new(
147
- root: self,
148
- input: parser.input,
149
- cursor: parser.cursor,
150
- buffer: parser.buffer
151
- )
152
- @parent.parse(clone) if @parent
153
- parser.cursor = clone.cursor
154
- end
155
-
156
- def to_s
157
- @parent ? "#{@parent}.ignore" : "ignore"
158
- end
159
- end
160
-
161
- class Maybe < Atom
162
- def initialize(parent:)
163
- @parent = parent
164
- end
165
-
166
- def parse(parser)
167
- clone =
168
- Parser.new(
169
- root: self,
170
- input: parser.input,
171
- cursor: parser.cursor,
172
- buffer: parser.buffer
173
- )
174
-
175
- @parent.parse(clone)
176
- rescue Parser::Interuption
177
- else
178
- parser.cursor = clone.cursor
179
- parser.output = clone.output
180
- end
181
-
182
- def to_s
183
- @parent ? "#{@parent}.maybe" : "maybe"
184
- end
185
- end
186
-
187
- class Aka < Atom
188
- def initialize(name:, parent:)
189
- @name = name
190
- @parent = parent
191
- end
192
-
193
- def parse(parser)
194
- clone =
195
- Parser.new(root: self, input: parser.input, cursor: parser.cursor)
196
-
197
- @parent.parse(clone)
198
-
199
- if clone.output?
200
- parser.output = Output.new(@name => clone.output)
201
- else
202
- parser.output[@name] = Output.new(clone.buffer)
203
- parser.buffer = ""
204
- end
205
-
206
- parser.cursor = clone.cursor
207
- end
208
-
209
- def to_s
210
- @parent ? "#{@parent}.aka(#{@name.inspect})" : "aka(#{@name.inspect})"
211
- end
212
- end
213
-
214
- class Or < Atom
215
- def initialize(left:, right:)
216
- @left = left
217
- @right = right
218
- end
219
-
220
- def parse(parser)
221
- left_clone =
222
- Parser.new(
223
- root: self,
224
- input: parser.input,
225
- cursor: parser.cursor,
226
- buffer: parser.buffer
227
- )
228
-
229
- right_clone =
230
- Parser.new(
231
- root: self,
232
- input: parser.input,
233
- cursor: parser.cursor,
234
- buffer: parser.buffer
235
- )
236
-
237
- begin
238
- @left.parse(left_clone)
239
- parser.cursor = left_clone.cursor
240
- parser.buffer = left_clone.buffer
241
- parser.output.merge(left_clone.output)
242
- rescue Parser::Interuption
243
- @right.parse(right_clone)
244
- parser.cursor = right_clone.cursor
245
- parser.buffer = right_clone.buffer
246
- parser.output.merge(right_clone.output)
247
- end
248
- end
249
-
250
- def to_s
251
- "((#{@left}) | (#{@right}))"
252
- end
253
- end
254
-
255
- class And < Atom
256
- def initialize(left:, right:)
257
- @left = left
258
- @right = right
259
- end
260
-
261
- def parse(parser)
262
- @left.parse(parser)
263
- right_clone =
264
- Parser.new(
265
- root: self,
266
- input: parser.input,
267
- cursor: parser.cursor,
268
- buffer: parser.buffer
269
- )
270
- @right.parse(right_clone)
271
- parser.cursor = right_clone.cursor
272
- parser.buffer = right_clone.buffer
273
-
274
- parser.output.merge(right_clone.output)
275
- end
276
-
277
- def to_s
278
- "#{@left} >> #{@right}".to_s
279
- end
280
- end
281
-
282
- def any
283
- Any.new
284
- end
285
-
286
- def str(string)
287
- Str.new(string: string)
288
- end
289
-
290
- def absent
291
- Absent.new(parent: self)
292
- end
293
-
294
- def ignore
295
- Ignore.new(parent: self)
296
- end
297
-
298
- def maybe
299
- Maybe.new(parent: self)
300
- end
301
-
302
- def repeat(min = 0, max = nil)
303
- Repeat.new(parent: self, min: min, max: max)
304
- end
305
-
306
- def aka(name)
307
- Aka.new(parent: self, name: name)
308
- end
309
-
310
- def |(other)
311
- Or.new(left: self, right: other)
312
- end
313
-
314
- def >>(other)
315
- And.new(left: self, right: other)
316
- end
317
-
318
- def <<(other)
319
- And.new(left: self, right: other)
320
- end
321
-
322
- def then(&block)
323
- Then.new(parent: self, block: block)
324
- end
325
-
326
- def rule(name)
327
- Rule.new(name: name)
328
- end
329
-
330
- def parse(parser)
331
- raise NotImplementedError.new("#{self.class}#parse")
332
- end
333
-
334
- def to_s
335
- ""
336
- end
337
-
338
- def inspect
339
- to_s
340
- end
341
- end
342
- end
@@ -1,130 +0,0 @@
1
- class Language
2
- class Output
3
- attr_reader :raw
4
-
5
- def initialize(raw = nil)
6
- @raw = raw
7
- end
8
-
9
- def self.from_raw(raw)
10
- if raw.is_a?(Array)
11
- new(raw.map { |element| from_raw(element) })
12
- elsif raw.is_a?(Hash)
13
- new(raw.map { |key, value| [key, from_raw(value)] }.to_h)
14
- else
15
- new(raw)
16
- end
17
- end
18
-
19
- def to_raw
20
- if raw.is_a?(Array)
21
- raw.map(&:to_raw)
22
- elsif raw.is_a?(Hash)
23
- raw.map { |key, value| [key, value.to_raw] }.to_h
24
- else
25
- raw
26
- end
27
- end
28
-
29
- def clone
30
- Output.new(@raw.clone)
31
- end
32
-
33
- def present?
34
- @raw != nil
35
- end
36
-
37
- def ==(other)
38
- other.is_a?(Output) ? raw == other.raw : raw == other
39
- end
40
-
41
- def to_s
42
- raw.to_s
43
- end
44
-
45
- def inspect
46
- raw.inspect
47
- end
48
-
49
- def []=(key, value)
50
- case @raw
51
- when NilClass
52
- @raw = { key => value }
53
- when String
54
- @raw = { key => value }
55
- when Array
56
- @raw << Output.new({ key => value })
57
- when Hash
58
- @raw[key] = value
59
- end
60
- end
61
-
62
- def merge(other)
63
- case @raw
64
- when NilClass
65
- @raw = other.raw
66
- when String
67
- case other.raw
68
- when String
69
- @raw = @raw + other.raw
70
- when Array
71
- @raw = other.raw
72
- when Hash
73
- @raw = other.raw
74
- end
75
- when Array
76
- case other.raw
77
- when String
78
- return
79
- when Array
80
- @raw = @raw + other.raw
81
- when Hash
82
- @raw << other
83
- end
84
- when Hash
85
- case other.raw
86
- when String
87
- return
88
- when Array
89
- return
90
- when Hash
91
- @raw.merge!(other.raw)
92
- end
93
- end
94
- end
95
-
96
- def <<(other)
97
- case @raw
98
- when NilClass
99
- case other.raw
100
- when String
101
- @raw = [other]
102
- when Array
103
- @raw = [other]
104
- when Hash
105
- @raw = [other]
106
- end
107
- when String
108
- case other.raw
109
- when String
110
- @raw = @raw + other.raw
111
- when Array
112
- @raw = [other]
113
- when Hash
114
- @raw = [other]
115
- end
116
- when Array
117
- @raw << other
118
- when Hash
119
- case other.raw
120
- when String
121
- return
122
- when Array
123
- return
124
- when Hash
125
- @raw.merge!(other.raw)
126
- end
127
- end
128
- end
129
- end
130
- end
@@ -1,8 +0,0 @@
1
- class Language
2
- class Parser
3
- class Absent
4
- class Present < Interuption
5
- end
6
- end
7
- end
8
- end
@@ -1,6 +0,0 @@
1
- class Language
2
- class Parser
3
- class Absent
4
- end
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- class Language
2
- class Parser
3
- class EndOfInput < Interuption
4
- end
5
- end
6
- end
@@ -1,38 +0,0 @@
1
- class Language
2
- class Parser
3
- class Interuption < StandardError
4
- def initialize(parser, atom = Atom.new)
5
- @parser = parser
6
- @atom = atom
7
- end
8
-
9
- def message
10
- "\n#{line}#{" " * column_index}^\n"
11
- end
12
-
13
- def line
14
- l = input.lines[line_index]
15
- l += "\n" if l[-1] != "\n"
16
- l
17
- end
18
-
19
- def line_index
20
- input[...cursor].count("\n")
21
- end
22
-
23
- def column_index
24
- cursor - input.lines[...line_index].map(&:size).sum
25
- end
26
-
27
- private
28
-
29
- def cursor
30
- @parser.cursor
31
- end
32
-
33
- def input
34
- @parser.input
35
- end
36
- end
37
- end
38
- end
@@ -1,6 +0,0 @@
1
- class Language
2
- class Parser
3
- class NotEndOfInput < Interuption
4
- end
5
- end
6
- end
@@ -1,16 +0,0 @@
1
- class Language
2
- class Parser
3
- class Str
4
- class NotFound < Interuption
5
- def initialize(parser, string)
6
- @parser = parser
7
- @string = string
8
- end
9
-
10
- def message
11
- "#{@string} not found\n#{super}"
12
- end
13
- end
14
- end
15
- end
16
- end
@@ -1,6 +0,0 @@
1
- class Language
2
- class Parser
3
- class Str
4
- end
5
- end
6
- end
@@ -1,53 +0,0 @@
1
- class Language
2
- class Parser
3
- attr_accessor :input, :buffer, :output, :root, :cursor
4
-
5
- def initialize(root:, input:, cursor: 0, buffer: "", output: Output.new)
6
- @root = root
7
- @input = input
8
- @cursor = cursor
9
- @buffer = buffer
10
- @output = output
11
- end
12
-
13
- def parse(check_end_of_input: true)
14
- @root.parse(self)
15
-
16
- if @cursor == @input.size || !check_end_of_input
17
- @output.present? ? @output : Output.new(@buffer)
18
- else
19
- raise NotEndOfInput.new(self)
20
- end
21
- end
22
-
23
- def consume(n)
24
- if @cursor + n <= @input.size
25
- @buffer += @input[@cursor, n]
26
- @cursor += n
27
- else
28
- raise EndOfInput.new(self)
29
- end
30
- end
31
-
32
- def aka(name)
33
- if @buffer.empty?
34
- @output = Output.new({ name => @output })
35
- else
36
- @output[name] = Output.new(@buffer)
37
- @buffer = ""
38
- end
39
- end
40
-
41
- def next?(string)
42
- @input[@cursor...(@cursor + string.size)] == string
43
- end
44
-
45
- def buffer?
46
- @buffer != ""
47
- end
48
-
49
- def output?
50
- @output.present?
51
- end
52
- end
53
- end
data/lib/language-ruby.rb DELETED
@@ -1,10 +0,0 @@
1
- require "bigdecimal"
2
- require "stringio"
3
- require "timeout"
4
- require "zeitwerk"
5
-
6
- loader = Zeitwerk::Loader.for_gem(warn_on_extra_files: false)
7
- loader.ignore("#{__dir__}/template-ruby.rb")
8
- loader.ignore("#{__dir__}/code-ruby.rb")
9
- loader.ignore("#{__dir__}/language-ruby.rb")
10
- loader.setup