code-ruby 0.5.6 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
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