myco 0.1.4 → 0.1.5

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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/lib/myco/bootstrap/find_constant.rb +4 -11
  3. data/lib/myco/code_loader.rb +2 -1
  4. data/lib/myco/code_tools/AST/ConstantAccess.my +47 -3
  5. data/lib/myco/code_tools/AST/ConstantAccess.my.rb +13 -9
  6. data/lib/myco/code_tools/AST/ConstantAssignment.my +1 -5
  7. data/lib/myco/code_tools/AST/ConstantAssignment.my.rb +3 -9
  8. data/lib/myco/code_tools/AST/ToRuby.my +5 -2
  9. data/lib/myco/code_tools/AST/ToRuby.my.rb +7 -3
  10. data/lib/myco/code_tools/AST.my +1 -0
  11. data/lib/myco/code_tools/AST.my.rb +9 -1
  12. data/lib/myco/code_tools/Parser.my +24 -0
  13. data/lib/myco/code_tools/Parser.my.rb +25 -0
  14. data/lib/myco/code_tools/parser/MycoBuilder.my +67 -0
  15. data/lib/myco/code_tools/parser/MycoBuilder.my.rb +99 -0
  16. data/lib/myco/code_tools/parser/MycoCharacterClasses.my +20 -0
  17. data/lib/myco/code_tools/parser/MycoCharacterClasses.my.rb +56 -0
  18. data/lib/myco/code_tools/parser/MycoGrammar.my +564 -0
  19. data/lib/myco/code_tools/parser/MycoGrammar.my.rb +1851 -0
  20. data/lib/myco/code_tools/parser/MycoTokens.my +78 -0
  21. data/lib/myco/code_tools/parser/MycoTokens.my.rb +170 -0
  22. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Builder.my +4 -0
  23. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Builder.my.rb +5 -0
  24. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeHelpers.my +142 -0
  25. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeHelpers.my.rb +181 -0
  26. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeInstructions.my +420 -0
  27. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeInstructions.my.rb +415 -0
  28. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeParser.my +137 -0
  29. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeParser.my.rb +237 -0
  30. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Constructions.my +183 -0
  31. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Constructions.my.rb +370 -0
  32. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Grammar.my +65 -0
  33. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Grammar.my.rb +83 -0
  34. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Instructions.my +139 -0
  35. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Instructions.my.rb +284 -0
  36. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Machine.my +37 -0
  37. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Machine.my.rb +24 -0
  38. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Parser.my +42 -0
  39. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Parser.my.rb +52 -0
  40. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Patterns.my +123 -0
  41. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Patterns.my.rb +164 -0
  42. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Processor.my +236 -0
  43. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Processor.my.rb +339 -0
  44. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces.my +15 -0
  45. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces.my.rb +14 -0
  46. data/lib/myco/code_tools.rb +1 -1
  47. data/lib/myco/version.rb +1 -1
  48. data/lib/myco.rb +2 -0
  49. metadata +44 -25
  50. data/lib/myco/code_tools/parser/peg_parser.rb +0 -7182
  51. data/lib/myco/code_tools/parser.rb +0 -39
@@ -0,0 +1,415 @@
1
+
2
+ ::Myco::Component.new([::Myco::FileToplevel], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
3
+ .tap { |__c__| __c__.__last__ = __c__.component_eval {(
4
+ declare_meme(:"BytecodeHelpers.my", [[:import, []]], nil, ::Myco.cscope.dup) { |*| nil}
5
+ ::Myco.cscope.for_method_definition.const_set(:BytecodeInstructions, ::Myco::Component.new([::Myco.find_constant(:BasicObject)], ::Myco.cscope.for_method_definition, __FILE__, __LINE__)
6
+ .tap { |__c__| __c__.__last__ = __c__.component_eval {(
7
+ ::Myco.find_constant(:Constructions).component_eval {(
8
+ ::Myco.find_constant(:AnyCharacter).component_eval {(declare_meme(:bytecode, [], nil, ::Myco.cscope.dup) { |m| (m.any(1))})}
9
+ ::Myco.find_constant(:Character).component_eval {(declare_meme(:bytecode, [], nil, ::Myco.cscope.dup) { |m| (m.char(self.code.chr))})}
10
+ ::Myco.find_constant(:CharacterString).component_eval {(declare_meme(:bytecode, [], nil, ::Myco.cscope.dup) { |m| (m.char(self.codes.map(&:chr).join))})}
11
+ ::Myco.find_constant(:CharacterSet).component_eval {(declare_meme(:bytecode, [], nil, ::Myco.cscope.dup) { |m| (m.set(self.codes.map(&:chr).join))})}
12
+ ::Myco.find_constant(:CharacterRange).component_eval {(declare_meme(:bytecode, [], nil, ::Myco.cscope.dup) { |m| (
13
+ codes = ::Myco.find_constant(:Range).new(
14
+ self.start,
15
+ self.stop
16
+ )
17
+ m.set(codes.map(&:chr).join)
18
+ )})}
19
+ ::Myco.find_constant(:NegativePredicate).component_eval {(declare_meme(:bytecode, [], nil, ::Myco.cscope.dup) { |m| (m.neg_predicate(
20
+ ::Proc.new { || (self.inner.bytecode(m))},
21
+ self.inner.bytecode_can_capture
22
+ ))})}
23
+ ::Myco.find_constant(:PositivePredicate).component_eval {(declare_meme(:bytecode, [], nil, ::Myco.cscope.dup) { |m| (m.pos_predicate(
24
+ ::Proc.new { || (self.inner.bytecode(m))},
25
+ self.inner.bytecode_can_capture
26
+ ))})}
27
+ ::Myco.find_constant(:OneOrMore).component_eval {(declare_meme(:bytecode, [], nil, ::Myco.cscope.dup) { |m| (m.many(
28
+ ::Proc.new { || (
29
+ self.inner.bytecode(m)
30
+ (self.inlaid.respond_to?(:call).false? ? ::Myco::Void : self.inlaid.call)
31
+ )},
32
+ self.inner.bytecode_can_capture
33
+ ))})}
34
+ ::Myco.find_constant(:ZeroOrOne).component_eval {(declare_meme(:bytecode, [], nil, ::Myco.cscope.dup) { |m| (m.choice(
35
+ ::Proc.new { || (self.inner.bytecode(m))},
36
+ ::Proc.new { || nil},
37
+ self.inner.bytecode_can_capture
38
+ ))})}
39
+ ::Myco.find_constant(:ZeroOrMore).component_eval {(declare_meme(:bytecode, [], nil, ::Myco.cscope.dup) { |m| (m.kleene(
40
+ ::Proc.new { || (
41
+ self.inner.bytecode(m)
42
+ (self.inlaid.respond_to?(:call).false? ? ::Myco::Void : self.inlaid.call)
43
+ )},
44
+ self.inner.bytecode_can_capture
45
+ ))})}
46
+ ::Myco.find_constant(:OrderedChoice).component_eval {(declare_meme(:bytecode, [], nil, ::Myco.cscope.dup) { |m| (m.choice(
47
+ ::Proc.new { || (self.first.bytecode(m))},
48
+ ::Proc.new { || (self.second.bytecode(m))},
49
+ self.first.bytecode_can_capture
50
+ ))})}
51
+ ::Myco.find_constant(:Concatenation).component_eval {(declare_meme(:bytecode, [], nil, ::Myco.cscope.dup) { |m| (
52
+ self.first.bytecode(m)
53
+ self.second.bytecode(m)
54
+ )})}
55
+ ::Myco.find_constant(:NamedCapture).component_eval {(declare_meme(:bytecode, [], nil, ::Myco.cscope.dup) { |m| (::Myco.branch_op(:"??", ::Myco.branch_op(:"&?", ::Myco.branch_op(:"||", self.inner.__send__(
56
+ :is_a?,
57
+ ::Myco.find_constant(:OneOrMore)
58
+ )) {self.inner.__send__(
59
+ :is_a?,
60
+ ::Myco.find_constant(:ZeroOrMore)
61
+ )}) {(
62
+ self.inner.__send__(
63
+ :inlaid=,
64
+ ::Proc.new { || (m.capture(
65
+ :m_split,
66
+ self.captargs
67
+ ))}
68
+ )
69
+ m.capture(:m_start)
70
+ self.inner.bytecode(m)
71
+ m.capture(
72
+ :m_end,
73
+ self.captargs
74
+ )
75
+ )}) {(
76
+ m.capture(:c_start)
77
+ self.inner.bytecode(m)
78
+ m.capture(
79
+ :c_end,
80
+ self.captargs
81
+ )
82
+ )})})}
83
+ ::Myco.find_constant(:NamedTextCapture).component_eval {(declare_meme(:bytecode, [], nil, ::Myco.cscope.dup) { |m| (
84
+ m.capture(:s_start)
85
+ self.inner.bytecode(m)
86
+ m.capture(
87
+ :s_end,
88
+ self.captargs
89
+ )
90
+ )})}
91
+ ::Myco.find_constant(:NamedTokenCapture).component_eval {(declare_meme(:bytecode, [], nil, ::Myco.cscope.dup) { |m| (
92
+ m.capture(:t_start)
93
+ self.inner.bytecode(m)
94
+ m.capture(
95
+ :t_end,
96
+ self.captargs
97
+ )
98
+ )})}
99
+ ::Myco.find_constant(:Reduction).component_eval {(declare_meme(:bytecode, [], nil, ::Myco.cscope.dup) { |m| (
100
+ m.capture(:r_start)
101
+ self.inner.bytecode(m)
102
+ m.capture(
103
+ :r_end,
104
+ self.captargs
105
+ )
106
+ )})}
107
+ ::Myco.find_constant(:AnyCharacter).component_eval {(declare_meme(:bytecode_can_capture, [], nil, ::Myco.cscope.dup) { |*| (false)})}
108
+ ::Myco.find_constant(:Character).component_eval {(declare_meme(:bytecode_can_capture, [], nil, ::Myco.cscope.dup) { |*| (false)})}
109
+ ::Myco.find_constant(:CharacterString).component_eval {(declare_meme(:bytecode_can_capture, [], nil, ::Myco.cscope.dup) { |*| (false)})}
110
+ ::Myco.find_constant(:CharacterSet).component_eval {(declare_meme(:bytecode_can_capture, [], nil, ::Myco.cscope.dup) { |*| (false)})}
111
+ ::Myco.find_constant(:CharacterRange).component_eval {(declare_meme(:bytecode_can_capture, [], nil, ::Myco.cscope.dup) { |*| (false)})}
112
+ ::Myco.find_constant(:NegativePredicate).component_eval {(declare_meme(:bytecode_can_capture, [], nil, ::Myco.cscope.dup) { |*| (self.inner.bytecode_can_capture)})}
113
+ ::Myco.find_constant(:PositivePredicate).component_eval {(declare_meme(:bytecode_can_capture, [], nil, ::Myco.cscope.dup) { |*| (self.inner.bytecode_can_capture)})}
114
+ ::Myco.find_constant(:OneOrMore).component_eval {(declare_meme(:bytecode_can_capture, [], nil, ::Myco.cscope.dup) { |*| (self.inner.bytecode_can_capture)})}
115
+ ::Myco.find_constant(:ZeroOrOne).component_eval {(declare_meme(:bytecode_can_capture, [], nil, ::Myco.cscope.dup) { |*| (self.inner.bytecode_can_capture)})}
116
+ ::Myco.find_constant(:ZeroOrMore).component_eval {(declare_meme(:bytecode_can_capture, [], nil, ::Myco.cscope.dup) { |*| (self.inner.bytecode_can_capture)})}
117
+ ::Myco.find_constant(:OrderedChoice).component_eval {(declare_meme(:bytecode_can_capture, [], nil, ::Myco.cscope.dup) { |*| (::Myco.branch_op(:"||", self.first.bytecode_can_capture) {self.second.bytecode_can_capture})})}
118
+ ::Myco.find_constant(:Concatenation).component_eval {(declare_meme(:bytecode_can_capture, [], nil, ::Myco.cscope.dup) { |*| (::Myco.branch_op(:"||", self.first.bytecode_can_capture) {self.second.bytecode_can_capture})})}
119
+ ::Myco.find_constant(:NamedCapture).component_eval {(declare_meme(:bytecode_can_capture, [], nil, ::Myco.cscope.dup) { |*| (true)})}
120
+ ::Myco.find_constant(:NamedTextCapture).component_eval {(declare_meme(:bytecode_can_capture, [], nil, ::Myco.cscope.dup) { |*| (true)})}
121
+ ::Myco.find_constant(:NamedTokenCapture).component_eval {(declare_meme(:bytecode_can_capture, [], nil, ::Myco.cscope.dup) { |*| (true)})}
122
+ ::Myco.find_constant(:Reduction).component_eval {(declare_meme(:bytecode_can_capture, [], nil, ::Myco.cscope.dup) { |*| (true)})}
123
+ )}
124
+ declare_meme(:g, [[:var, []]], nil, ::Myco.cscope.dup) { |*| nil}
125
+ declare_meme(:any, [], nil, ::Myco.cscope.dup) { |count| (
126
+ self.g.push_idx
127
+ self.g.push_int(count)
128
+ self.g.send(
129
+ :+,
130
+ 1
131
+ )
132
+ self.g.push_subject
133
+ self.g.send(
134
+ :size,
135
+ 0
136
+ )
137
+ self.g.send(
138
+ :<=,
139
+ 1
140
+ )
141
+ self.g.goto_if_false(self.g.overall_fail)
142
+ self.g.push_int(count)
143
+ self.g.increment_idx
144
+ )}
145
+ declare_meme(:char, [], nil, ::Myco.cscope.dup) { |string| (
146
+ self.g.setup_unwind(
147
+ self.g.overall_fail,
148
+ 0
149
+ )
150
+ self.g.push_literal(string)
151
+ self.g.push_subject
152
+ self.g.push_idx
153
+ self.g.push_int(string.size)
154
+ self.g.send(
155
+ :compare_substring,
156
+ 3
157
+ )
158
+ self.g.__send__(:meta_push_0)
159
+ self.g.pop_unwind
160
+ self.g.goto_if_not_equal(self.g.overall_fail)
161
+ self.g.push_int(string.size)
162
+ self.g.increment_idx
163
+ )}
164
+ declare_meme(:set, [], nil, ::Myco.cscope.dup) { |string| (
165
+ local_done = self.g.new_label
166
+ local_early_fail = self.g.new_label
167
+ self.g.push_literal(string)
168
+ self.g.push_subject_at_idx
169
+ self.g.dup_top
170
+ self.g.goto_if_false(local_early_fail)
171
+ self.g.__send__(:meta_push_0)
172
+ self.g.send(
173
+ :find_string,
174
+ 2
175
+ )
176
+ self.g.goto_if_false(self.g.overall_fail)
177
+ self.g.goto(local_done)
178
+ local_early_fail.__send__(:set!)
179
+ self.g.pop
180
+ self.g.pop
181
+ self.g.goto(self.g.overall_fail)
182
+ local_done.__send__(:set!)
183
+ self.g.__send__(:meta_push_1)
184
+ self.g.increment_idx
185
+ )}
186
+ declare_meme(:choice, [], nil, ::Myco.cscope.dup) { |first, second, first_can_capture| (
187
+ local_done = self.g.new_label
188
+ local_fail = self.g.new_label
189
+ old_fail = self.g.overall_fail
190
+ self.g.__send__(
191
+ :overall_fail=,
192
+ local_fail
193
+ )
194
+ self.__send__(
195
+ :if,
196
+ first_can_capture
197
+ ) { || (self.g.push_temp_captures)}
198
+ self.g.push_idx
199
+ first.call
200
+ self.g.pop
201
+ self.__send__(
202
+ :if,
203
+ first_can_capture
204
+ ) { || (self.g.pop_to_accept_captures)}
205
+ self.g.__send__(
206
+ :overall_fail=,
207
+ old_fail
208
+ )
209
+ self.g.goto(local_done)
210
+ local_fail.__send__(:set!)
211
+ self.g.pop_to_set_idx
212
+ self.__send__(
213
+ :if,
214
+ first_can_capture
215
+ ) { || (self.g.pop_to_reject_captures)}
216
+ self.g.__send__(
217
+ :overall_fail=,
218
+ old_fail
219
+ )
220
+ second.call
221
+ local_done.__send__(:set!)
222
+ )}
223
+ declare_meme(:many, [], nil, ::Myco.cscope.dup) { |inner, inner_can_capture| (
224
+ local_retry = self.g.new_label
225
+ local_fail = self.g.new_label
226
+ old_fail = self.g.overall_fail
227
+ self.g.__send__(
228
+ :overall_fail=,
229
+ local_fail
230
+ )
231
+ self.g.push_false
232
+ local_retry.__send__(:set!)
233
+ self.__send__(
234
+ :if,
235
+ inner_can_capture
236
+ ) { || (self.g.push_temp_captures)}
237
+ inner.call
238
+ self.__send__(
239
+ :if,
240
+ inner_can_capture
241
+ ) { || (self.g.pop_to_accept_captures)}
242
+ self.g.pop
243
+ self.g.push_true
244
+ self.g.goto(local_retry)
245
+ local_fail.__send__(:set!)
246
+ self.__send__(
247
+ :if,
248
+ inner_can_capture
249
+ ) { || (self.g.pop_to_reject_captures)}
250
+ self.g.__send__(
251
+ :overall_fail=,
252
+ old_fail
253
+ )
254
+ self.g.goto_if_false(self.g.overall_fail)
255
+ )}
256
+ declare_meme(:kleene, [], nil, ::Myco.cscope.dup) { |inner, inner_can_capture| (
257
+ local_retry = self.g.new_label
258
+ local_fail = self.g.new_label
259
+ old_fail = self.g.overall_fail
260
+ self.g.__send__(
261
+ :overall_fail=,
262
+ local_fail
263
+ )
264
+ local_retry.__send__(:set!)
265
+ self.__send__(
266
+ :if,
267
+ inner_can_capture
268
+ ) { || (self.g.push_temp_captures)}
269
+ inner.call
270
+ self.__send__(
271
+ :if,
272
+ inner_can_capture
273
+ ) { || (self.g.pop_to_accept_captures)}
274
+ self.g.goto(local_retry)
275
+ local_fail.__send__(:set!)
276
+ self.__send__(
277
+ :if,
278
+ inner_can_capture
279
+ ) { || (self.g.pop_to_reject_captures)}
280
+ self.g.__send__(
281
+ :overall_fail=,
282
+ old_fail
283
+ )
284
+ )}
285
+ declare_meme(:pos_predicate, [], nil, ::Myco.cscope.dup) { |inner, inner_can_capture| (
286
+ local_done = self.g.new_label
287
+ local_fail = self.g.new_label
288
+ old_fail = self.g.overall_fail
289
+ self.g.__send__(
290
+ :overall_fail=,
291
+ local_fail
292
+ )
293
+ self.__send__(
294
+ :if,
295
+ inner_can_capture
296
+ ) { || (self.g.push_temp_captures)}
297
+ self.g.push_idx
298
+ inner.call
299
+ self.g.pop_to_set_idx
300
+ self.__send__(
301
+ :if,
302
+ inner_can_capture
303
+ ) { || (self.g.pop_to_accept_captures)}
304
+ self.g.__send__(
305
+ :overall_fail=,
306
+ old_fail
307
+ )
308
+ self.g.goto(local_done)
309
+ local_fail.__send__(:set!)
310
+ self.g.pop_to_set_idx
311
+ self.__send__(
312
+ :if,
313
+ inner_can_capture
314
+ ) { || (self.g.pop_to_reject_captures)}
315
+ self.g.__send__(
316
+ :overall_fail=,
317
+ old_fail
318
+ )
319
+ self.g.goto(self.g.overall_fail)
320
+ local_done.__send__(:set!)
321
+ )}
322
+ declare_meme(:neg_predicate, [], nil, ::Myco.cscope.dup) { |inner, inner_can_capture| (
323
+ local_fail = self.g.new_label
324
+ old_fail = self.g.overall_fail
325
+ self.g.__send__(
326
+ :overall_fail=,
327
+ local_fail
328
+ )
329
+ self.__send__(
330
+ :if,
331
+ inner_can_capture
332
+ ) { || (self.g.push_temp_captures)}
333
+ self.g.push_idx
334
+ inner.call
335
+ self.g.pop_to_set_idx
336
+ self.__send__(
337
+ :if,
338
+ inner_can_capture
339
+ ) { || (self.g.pop_to_reject_captures)}
340
+ self.g.__send__(
341
+ :overall_fail=,
342
+ old_fail
343
+ )
344
+ self.g.goto(self.g.overall_fail)
345
+ local_fail.__send__(:set!)
346
+ self.g.pop_to_set_idx
347
+ self.__send__(
348
+ :if,
349
+ inner_can_capture
350
+ ) { || (self.g.pop_to_accept_captures)}
351
+ self.g.__send__(
352
+ :overall_fail=,
353
+ old_fail
354
+ )
355
+ )}
356
+ declare_meme(:call, [], nil, ::Myco.cscope.dup) { |name, memoize=true| (
357
+ result_check = self.g.new_label
358
+ memo_result_check = self.g.new_label
359
+ local_success = self.g.new_label
360
+ local_fail = self.g.new_label
361
+ self.g.push_temp_captures
362
+ self.__send__(
363
+ :if,
364
+ memoize
365
+ ) { || (
366
+ self.g.memo_or_eq_new_hash(name)
367
+ self.g.goto_if_memo_for_idx(
368
+ name,
369
+ memo_result_check
370
+ )
371
+ )}
372
+ self.g.push_self
373
+ self.g.push_subject
374
+ self.g.push_idx
375
+ self.g.send(
376
+ name,
377
+ 2
378
+ )
379
+ result_check.__send__(:set!)
380
+ self.g.copy_result_to_memo(name)
381
+ self.g.dup_top
382
+ self.g.goto_if_true(local_success)
383
+ self.g.goto(local_fail)
384
+ self.__send__(
385
+ :if,
386
+ memoize
387
+ ) { || (
388
+ memo_result_check.__send__(:set!)
389
+ self.g.dup_top
390
+ self.g.goto_if_true(local_success)
391
+ self.g.goto(local_fail)
392
+ )}
393
+ local_fail.__send__(:set!)
394
+ self.g.pop
395
+ self.g.pop_to_reject_captures
396
+ self.g.goto(self.g.overall_fail)
397
+ local_success.__send__(:set!)
398
+ self.g.pop_to_set_idx
399
+ self.g.pop_to_accept_captures
400
+ )}
401
+ declare_meme(:capture, [], nil, ::Myco.cscope.dup) { |*metadata| (
402
+ self.g.push_captures
403
+ self.g.push_idx
404
+ self.g.push_literal_or_array(metadata)
405
+ self.g.make_array(2)
406
+ self.g.make_array(1)
407
+ self.g.send(
408
+ :concat,
409
+ 1
410
+ )
411
+ self.g.pop
412
+ )}
413
+ )}})
414
+ .tap { |__c__| __c__.__name__ = :BytecodeInstructions }
415
+ )}}.instance
@@ -0,0 +1,137 @@
1
+
2
+ BytecodeParser < BasicObject {
3
+ var grammar: Grammar { }
4
+
5
+ new_worker: set_up_worker(prototype.new)
6
+
7
+ var prototype: compile_prototype
8
+
9
+ refresh: self.prototype = compile_prototype
10
+
11
+ compile_prototype: {
12
+ proto = Component.new
13
+ grammar.construct_all_rules
14
+ grammar.rule_table.each |name, rule| {
15
+ compile_rule_into(proto, name, rule)
16
+ }
17
+ proto
18
+ }
19
+
20
+ compile_rule_into: |proto, name, rule| {
21
+ construct = rule.construct_rule
22
+
23
+ proto.dynamic_method(name, "(compiled parser)") |g| {
24
+ instructor = BytecodeInstructions { }
25
+ instructor.g = g
26
+ g.extend(BytecodeHelpers)
27
+
28
+ g.rule_start
29
+ construct.bytecode(instructor)
30
+ g.rule_finish
31
+ }
32
+ }
33
+
34
+ compile_generator: |name, file, line=1, &block| {
35
+ g = Myco::ToolSet::Generator.new
36
+ g.name = name
37
+ g.file = file
38
+ g.set_line(line)
39
+
40
+ block.call(g)
41
+
42
+ g.ret
43
+ g.close
44
+ g.use_detected
45
+ g
46
+ }
47
+
48
+ compile_code: |name, file, line=1, &block| {
49
+ g = compile_generator(name, file, line, &block)
50
+ g.encode
51
+ g.package(Rubinius::CompiledCode)
52
+ }
53
+
54
+ save_prototype: |filename| {
55
+ code = compile_code(:__script__, :"(snippet)") |g| {
56
+ g.push_cpath_top; g.find_const(:"Class")
57
+ g.create_block(compile_generator(:__block__, :"(snippet)") |g| {
58
+ prototype.instance_methods.each |name| {
59
+ code = prototype.instance_method(name).executable
60
+ if(code.is_a?(Rubinius::CompiledCode)) {
61
+ g.push_rubinius
62
+ g.push_literal(name)
63
+ g.push_literal(code)
64
+ g.push_scope
65
+ g.push_variables; g.send(:method_visibility, 0)
66
+ g.send(:add_defn_method, 4)
67
+ }
68
+ }
69
+ })
70
+ g.send_with_block(:new, 0)
71
+ }
72
+
73
+ Myco::ToolSet::CompiledFile.dump(code, filename, Rubinius::Signature, Rubinius::RUBY_LIB_VERSION)
74
+ }
75
+
76
+ load_prototype: |filename| {
77
+ loader = Myco::CodeLoader::BytecodeLoader.new(filename)
78
+ loader.bind_to(call_depth:1)
79
+ self.prototype = loader.load
80
+ }
81
+
82
+ set_up_worker: |worker| {
83
+ worker.instance_variable_set(:"@captures", [])
84
+ worker.instance_variable_set(:"@highest_idx", 0)
85
+ worker
86
+ }
87
+
88
+ captures_of_worker: |worker|
89
+ worker.instance_variable_get(:"@captures")
90
+
91
+ highest_idx_of_worker: |worker|
92
+ worker.instance_variable_get(:"@highest_idx")
93
+
94
+ new_processor: Processor.new(builder: new_builder)
95
+ new_builder: Builder.new
96
+
97
+
98
+ # Match and process the given string using the current grammar
99
+ parse: |string| {
100
+ worker = new_worker
101
+
102
+ self.error_idx = null
103
+ self.error_row = null
104
+ self.error_col = null
105
+ self.error_string = null
106
+ self.result = null
107
+ self.end_idx = worker.root(string, 0)
108
+
109
+ processor = new_processor
110
+
111
+ if(end_idx) {
112
+ processor.string = string
113
+ processor.capture_items = captures_of_worker(worker)
114
+ self.result = processor.process
115
+ }
116
+ if(!end_idx) {
117
+ self.error_idx = highest_idx_of_worker(worker)
118
+ pos = processor.position_of(error_idx, string)
119
+ self.error_row = pos.first
120
+ self.error_col = pos.last
121
+ self.error_string = \
122
+ "Unexpected character near line: "error_row", column: "error_col".\n" \
123
+ string.each_line.to_a[error_row - 1]"" \
124
+ (' ' * [(error_col - 1), 0].max)"^"
125
+ }
126
+ self.result
127
+ }
128
+
129
+ var end_idx
130
+ var result
131
+
132
+ var error_idx
133
+ var error_row
134
+ var error_col
135
+ var error_string
136
+ raise_error: raise(SyntaxError, error_string)
137
+ }