myco 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/lib/myco/bootstrap/instance.rb +13 -3
  3. data/lib/myco/code_tools/AST.my +0 -2
  4. data/lib/myco/code_tools/AST.my.rb +0 -1
  5. data/lib/myco/code_tools/AST/Block.my +15 -4
  6. data/lib/myco/code_tools/AST/Block.my.rb +16 -3
  7. data/lib/myco/code_tools/AST/DeclareMeme.my +44 -64
  8. data/lib/myco/code_tools/AST/DeclareMeme.my.rb +66 -74
  9. data/lib/myco/code_tools/AST/ToRuby.my +17 -20
  10. data/lib/myco/code_tools/AST/ToRuby.my.rb +24 -22
  11. data/lib/myco/code_tools/Parser.my +2 -1
  12. data/lib/myco/code_tools/Parser.my.rb +2 -1
  13. data/lib/myco/code_tools/parser/MycoBuilder.my +2 -2
  14. data/lib/myco/code_tools/parser/MycoBuilder.my.rb +2 -2
  15. data/lib/myco/code_tools/parser/MycoGrammar.my +28 -21
  16. data/lib/myco/code_tools/parser/MycoGrammar.my.rb +94 -56
  17. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces.my +10 -11
  18. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces.my.rb +10 -9
  19. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeHelpers.my +25 -3
  20. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeHelpers.my.rb +38 -0
  21. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Capture.my +152 -0
  22. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Capture.my.rb +189 -0
  23. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Common.my +84 -0
  24. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Common.my.rb +114 -0
  25. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Common/Parser.my +139 -0
  26. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/{BytecodeParser.my.rb → Common/Parser.my.rb} +17 -36
  27. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Composite.my +229 -0
  28. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Composite.my.rb +296 -0
  29. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Grammar.my +8 -25
  30. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Grammar.my.rb +9 -37
  31. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Parser.my +139 -37
  32. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Parser.my.rb +206 -36
  33. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Processor.my +21 -12
  34. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Processor.my.rb +45 -24
  35. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Stream.my +99 -0
  36. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Stream.my.rb +152 -0
  37. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Stream/Parser.my +37 -0
  38. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Stream/Parser.my.rb +57 -0
  39. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/String.my +136 -0
  40. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/String.my.rb +147 -0
  41. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/String/Parser.my +45 -0
  42. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/String/Parser.my.rb +85 -0
  43. data/lib/myco/code_tools/parser/pegleromyces/spec/Patterns.test.my +31 -25
  44. data/lib/myco/code_tools/parser/pegleromyces/spec/Patterns.test.my.rb +44 -25
  45. data/lib/myco/code_tools/parser/pegleromyces/spec/Stream/Parser.test.my +49 -0
  46. data/lib/myco/code_tools/parser/pegleromyces/spec/Stream/Parser.test.my.rb +119 -0
  47. data/lib/myco/code_tools/parser/pegleromyces/spec/Stream/Patterns.test.my +131 -0
  48. data/lib/myco/code_tools/parser/pegleromyces/spec/Stream/Patterns.test.my.rb +595 -0
  49. data/lib/myco/code_tools/parser/pegleromyces/spec/{BytecodeParser.test.my → String/Parser.test.my} +41 -2
  50. data/lib/myco/code_tools/parser/pegleromyces/spec/{BytecodeParser.test.my.rb → String/Parser.test.my.rb} +144 -3
  51. data/lib/myco/code_tools/parser/pegleromyces/spec/run.my +4 -10
  52. data/lib/myco/code_tools/parser/pegleromyces/spec/run.my.rb +4 -8
  53. data/lib/myco/core.my +1 -0
  54. data/lib/myco/core.my.rb +1 -0
  55. data/lib/myco/core/BasicObject.my +4 -2
  56. data/lib/myco/core/BasicObject.my.rb +2 -5
  57. data/lib/myco/core/Loop.my +5 -0
  58. data/lib/myco/core/Loop.my.rb +13 -0
  59. data/lib/myco/dev.rb +1 -0
  60. data/lib/myco/dev/profile.rb +12 -0
  61. data/lib/myco/version.rb +3 -3
  62. metadata +54 -59
  63. data/lib/myco/code_tools/AST/DeclareDecorator.my +0 -19
  64. data/lib/myco/code_tools/AST/DeclareDecorator.my.rb +0 -24
  65. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Builder.my +0 -4
  66. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Builder.my.rb +0 -5
  67. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeInstructions.my +0 -420
  68. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeInstructions.my.rb +0 -415
  69. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/BytecodeParser.my +0 -147
  70. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Constructions.my +0 -183
  71. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Constructions.my.rb +0 -370
  72. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Instructions.my +0 -139
  73. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Instructions.my.rb +0 -284
  74. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Machine.my +0 -37
  75. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Machine.my.rb +0 -24
  76. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Patterns.my +0 -123
  77. data/lib/myco/code_tools/parser/pegleromyces/lib/pegleromyces/Patterns.my.rb +0 -164
  78. data/lib/myco/code_tools/parser/pegleromyces/spec/Builder.test.my +0 -10
  79. data/lib/myco/code_tools/parser/pegleromyces/spec/Builder.test.my.rb +0 -9
  80. data/lib/myco/code_tools/parser/pegleromyces/spec/BytecodeInstructions.test.my +0 -10
  81. data/lib/myco/code_tools/parser/pegleromyces/spec/BytecodeInstructions.test.my.rb +0 -9
  82. data/lib/myco/code_tools/parser/pegleromyces/spec/Constructions.test.my +0 -229
  83. data/lib/myco/code_tools/parser/pegleromyces/spec/Constructions.test.my.rb +0 -663
  84. data/lib/myco/code_tools/parser/pegleromyces/spec/Instructions.test.my +0 -10
  85. data/lib/myco/code_tools/parser/pegleromyces/spec/Instructions.test.my.rb +0 -9
  86. data/lib/myco/code_tools/parser/pegleromyces/spec/Machine.test.my +0 -13
  87. data/lib/myco/code_tools/parser/pegleromyces/spec/Machine.test.my.rb +0 -20
  88. data/lib/myco/code_tools/parser/pegleromyces/spec/Parser.test.my +0 -54
  89. data/lib/myco/code_tools/parser/pegleromyces/spec/Parser.test.my.rb +0 -215
@@ -1,415 +0,0 @@
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::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
- ::Object::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
- ::Object::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
- ::Object::Proc.new { || (
29
- self.inner.bytecode(m)
30
- (Rubinius::Type.object_respond_to?(self.inlaid, :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
- ::Object::Proc.new { || (self.inner.bytecode(m))},
36
- ::Object::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
- ::Object::Proc.new { || (
41
- self.inner.bytecode(m)
42
- (Rubinius::Type.object_respond_to?(self.inlaid, :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
- ::Object::Proc.new { || (self.first.bytecode(m))},
48
- ::Object::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
- ::Object::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_reject_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
@@ -1,147 +0,0 @@
1
-
2
- BytecodeParser < BasicObject {
3
- State < BasicObject {
4
- var string
5
- var start_idx
6
- var end_idx
7
- var rule
8
- var result
9
-
10
- var error_idx
11
- var error_row
12
- var error_col
13
- var error_string
14
-
15
- raise_error: self.error_idx && raise(SyntaxError
16
- "Unexpected character with parser: "self.rule \
17
- " near line: "self.error_row \
18
- ", column: "self.error_col".\n" \
19
- self.string.each_line.to_a[self.error_row - 1]"" \
20
- (' ' * [(self.error_col - 1), 0].max)"^"
21
- )
22
- }
23
-
24
- var grammar: Grammar.new
25
- var builder: Builder.new
26
-
27
- new_worker: set_up_worker(prototype.new)
28
- new_processor: Processor.new(builder: builder)
29
-
30
- var prototype: compile_prototype
31
-
32
- refresh: self.prototype = compile_prototype
33
-
34
- compile_prototype: {
35
- proto = Component.new
36
- grammar.construct_all_rules
37
- grammar.rule_table.each |name, rule| {
38
- compile_rule_into(proto, name, rule)
39
- }
40
- proto
41
- }
42
-
43
- compile_rule_into: |proto, name, rule| {
44
- construct = rule.construct_rule
45
-
46
- Myco.add_dynamic_method(proto, name, "(compiled parser)") |g| {
47
- instructor = BytecodeInstructions.new
48
- instructor.g = g
49
- g.extend(BytecodeHelpers)
50
-
51
- g.rule_start
52
- construct.bytecode(instructor)
53
- g.rule_finish
54
- }
55
- }
56
-
57
- compile_generator: |name, file, line=1, &block| {
58
- g = Myco::ToolSet::Generator.new
59
- g.name = name
60
- g.file = file
61
- g.set_line(line)
62
-
63
- block.call(g)
64
-
65
- g.ret
66
- g.close
67
- g.use_detected
68
- g
69
- }
70
-
71
- compile_code: |name, file, line=1, &block| {
72
- g = compile_generator(name, file, line, &block)
73
- g.encode
74
- g.package(Rubinius::CompiledCode)
75
- }
76
-
77
- save_prototype: |filename| {
78
- code = compile_code(:__script__, :"(snippet)") |g| {
79
- g.push_cpath_top; g.find_const(:Class)
80
- g.create_block(compile_generator(:__block__, :"(snippet)") |g| {
81
- prototype.instance_methods.each |name| {
82
- code = prototype.instance_method(name).executable
83
- if(code.is_a?(Rubinius::CompiledCode)) {
84
- g.push_rubinius
85
- g.push_literal(name)
86
- g.push_literal(code)
87
- g.push_scope
88
- g.push_variables; g.send(:method_visibility, 0)
89
- g.send(:add_defn_method, 4)
90
- }
91
- }
92
- })
93
- g.send_with_block(:new, 0)
94
- }
95
-
96
- Myco::ToolSet::CompiledFile.dump(code, filename, Rubinius::Signature, Rubinius::RUBY_LIB_VERSION)
97
- }
98
-
99
- load_prototype: |filename| {
100
- loader = Myco::CodeLoader::BytecodeLoader.new(filename)
101
- loader.bind_to(call_depth:1)
102
- self.prototype = loader.load
103
- }
104
-
105
- set_up_worker: |worker| {
106
- worker.__set_ivar__(:"@captures", [])
107
- worker.__set_ivar__(:"@highest_idx", 0)
108
- worker
109
- }
110
-
111
- captures_of_worker: |worker|
112
- worker.__get_ivar__(:"@captures")
113
-
114
- highest_idx_of_worker: |worker|
115
- worker.__get_ivar__(:"@highest_idx")
116
-
117
-
118
- # Match and process the given string using the current grammar
119
- parse: |string, rule:"root", start_idx:0| {
120
- worker = new_worker
121
- processor = new_processor
122
- state = State.new(
123
- string: string.to_s
124
- rule: rule.to_sym
125
- start_idx: start_idx.to_i
126
- error_idx: null
127
- error_row: null
128
- error_col: null
129
- error_string: null
130
- result: null
131
- )
132
-
133
- state.end_idx = worker.__send__(state.rule, state.string, state.start_idx)
134
-
135
- state.end_idx &? (
136
- processor.string = state.string
137
- processor.capture_items = captures_of_worker(worker)
138
- state.result = processor.process
139
- ) ?? (
140
- state.error_idx = highest_idx_of_worker(worker)
141
- pos = processor.position_of(state.error_idx, state.string)
142
- state.error_row = pos.first
143
- state.error_col = pos.last
144
- )
145
- state
146
- }
147
- }