melbourne 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. data/HISTORY +3 -0
  2. data/LICENSE +27 -0
  3. data/README.rdoc +38 -0
  4. data/Rakefile +38 -0
  5. data/VERSION.yml +4 -0
  6. data/ext/melbourne/bstring-license.txt +29 -0
  7. data/ext/melbourne/bstrlib.c +2918 -0
  8. data/ext/melbourne/bstrlib.h +302 -0
  9. data/ext/melbourne/extconf.rb +76 -0
  10. data/ext/melbourne/grammar.cpp +11885 -0
  11. data/ext/melbourne/grammar.hpp +14 -0
  12. data/ext/melbourne/grammar.y +6013 -0
  13. data/ext/melbourne/internal.hpp +137 -0
  14. data/ext/melbourne/lex.c.tab +136 -0
  15. data/ext/melbourne/local_state.hpp +41 -0
  16. data/ext/melbourne/melbourne.cpp +37 -0
  17. data/ext/melbourne/node.hpp +262 -0
  18. data/ext/melbourne/node_types.cpp +245 -0
  19. data/ext/melbourne/node_types.hpp +135 -0
  20. data/ext/melbourne/node_types.rb +190 -0
  21. data/ext/melbourne/quark.cpp +52 -0
  22. data/ext/melbourne/quark.hpp +14 -0
  23. data/ext/melbourne/symbols.cpp +219 -0
  24. data/ext/melbourne/symbols.hpp +116 -0
  25. data/ext/melbourne/var_table.cpp +113 -0
  26. data/ext/melbourne/var_table.hpp +33 -0
  27. data/ext/melbourne/visitor.cpp +1052 -0
  28. data/ext/melbourne/visitor.hpp +20 -0
  29. data/lib/melbourne/ast/constants.rb +128 -0
  30. data/lib/melbourne/ast/control_flow.rb +382 -0
  31. data/lib/melbourne/ast/data.rb +19 -0
  32. data/lib/melbourne/ast/definitions.rb +561 -0
  33. data/lib/melbourne/ast/exceptions.rb +182 -0
  34. data/lib/melbourne/ast/file.rb +15 -0
  35. data/lib/melbourne/ast/grapher.rb +75 -0
  36. data/lib/melbourne/ast/literals.rb +268 -0
  37. data/lib/melbourne/ast/node.rb +21 -0
  38. data/lib/melbourne/ast/operators.rb +117 -0
  39. data/lib/melbourne/ast/self.rb +17 -0
  40. data/lib/melbourne/ast/sends.rb +451 -0
  41. data/lib/melbourne/ast/values.rb +74 -0
  42. data/lib/melbourne/ast/variables.rb +251 -0
  43. data/lib/melbourne/ast.rb +22 -0
  44. data/lib/melbourne/parser.rb +38 -0
  45. data/lib/melbourne/processor.rb +460 -0
  46. data/lib/melbourne.rb +46 -0
  47. data/spec/helpers/ast/node.rb +15 -0
  48. data/spec/helpers/ast/reduced_graph.rb +64 -0
  49. data/spec/lib/parser/alias_spec.rb +97 -0
  50. data/spec/lib/parser/and_spec.rb +63 -0
  51. data/spec/lib/parser/array_spec.rb +157 -0
  52. data/spec/lib/parser/attrasgn_spec.rb +401 -0
  53. data/spec/lib/parser/back_ref_spec.rb +20 -0
  54. data/spec/lib/parser/call_spec.rb +958 -0
  55. data/spec/lib/parser/case_spec.rb +577 -0
  56. data/spec/lib/parser/cdecl_spec.rb +108 -0
  57. data/spec/lib/parser/class_spec.rb +221 -0
  58. data/spec/lib/parser/colon2_spec.rb +13 -0
  59. data/spec/lib/parser/colon3_spec.rb +12 -0
  60. data/spec/lib/parser/const_spec.rb +12 -0
  61. data/spec/lib/parser/cvar_spec.rb +55 -0
  62. data/spec/lib/parser/cvasgn_spec.rb +71 -0
  63. data/spec/lib/parser/cvdecl_spec.rb +31 -0
  64. data/spec/lib/parser/defined_spec.rb +353 -0
  65. data/spec/lib/parser/defn_spec.rb +1409 -0
  66. data/spec/lib/parser/defs_spec.rb +247 -0
  67. data/spec/lib/parser/dot2_spec.rb +29 -0
  68. data/spec/lib/parser/dot3_spec.rb +29 -0
  69. data/spec/lib/parser/dregx_spec.rb +127 -0
  70. data/spec/lib/parser/dstr_spec.rb +453 -0
  71. data/spec/lib/parser/dsym_spec.rb +31 -0
  72. data/spec/lib/parser/dxstr_spec.rb +31 -0
  73. data/spec/lib/parser/ensure_spec.rb +279 -0
  74. data/spec/lib/parser/false_spec.rb +12 -0
  75. data/spec/lib/parser/flip2_spec.rb +138 -0
  76. data/spec/lib/parser/flip3_spec.rb +100 -0
  77. data/spec/lib/parser/for_spec.rb +279 -0
  78. data/spec/lib/parser/gasgn_spec.rb +34 -0
  79. data/spec/lib/parser/gvar_spec.rb +33 -0
  80. data/spec/lib/parser/hash_spec.rb +77 -0
  81. data/spec/lib/parser/iasgn_spec.rb +54 -0
  82. data/spec/lib/parser/if_spec.rb +439 -0
  83. data/spec/lib/parser/iter_spec.rb +2582 -0
  84. data/spec/lib/parser/lasgn_spec.rb +1066 -0
  85. data/spec/lib/parser/lit_spec.rb +75 -0
  86. data/spec/lib/parser/masgn_spec.rb +1970 -0
  87. data/spec/lib/parser/match2_spec.rb +47 -0
  88. data/spec/lib/parser/match3_spec.rb +54 -0
  89. data/spec/lib/parser/match_spec.rb +19 -0
  90. data/spec/lib/parser/module_spec.rb +102 -0
  91. data/spec/lib/parser/nil_spec.rb +13 -0
  92. data/spec/lib/parser/not_spec.rb +39 -0
  93. data/spec/lib/parser/nth_ref_spec.rb +12 -0
  94. data/spec/lib/parser/op_asgn_spec.rb +619 -0
  95. data/spec/lib/parser/or_spec.rb +155 -0
  96. data/spec/lib/parser/postexe_spec.rb +31 -0
  97. data/spec/lib/parser/regex_spec.rb +52 -0
  98. data/spec/lib/parser/rescue_spec.rb +1028 -0
  99. data/spec/lib/parser/return_spec.rb +151 -0
  100. data/spec/lib/parser/sclass_spec.rb +172 -0
  101. data/spec/lib/parser/str_spec.rb +162 -0
  102. data/spec/lib/parser/super_spec.rb +276 -0
  103. data/spec/lib/parser/true_spec.rb +12 -0
  104. data/spec/lib/parser/undef_spec.rb +222 -0
  105. data/spec/lib/parser/until_spec.rb +286 -0
  106. data/spec/lib/parser/valias_spec.rb +12 -0
  107. data/spec/lib/parser/while_spec.rb +458 -0
  108. data/spec/lib/parser/xstr_spec.rb +12 -0
  109. data/spec/lib/parser/yield_spec.rb +202 -0
  110. data/spec/lib/parser/zsuper_spec.rb +101 -0
  111. data/spec/matchers/parse_as.rb +27 -0
  112. data/spec/spec_helper.rb +10 -0
  113. metadata +168 -0
@@ -0,0 +1,353 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "defined? $x"' do
6
+ ruby = 'defined? $x'
7
+ ast = {:defined=>
8
+ {:@expression=>{:globalvariableaccess=>{:@name=>:$x, :@line=>1}}, :@line=>1}}
9
+
10
+ ruby.should parse_as(ast)
11
+ end
12
+
13
+ it 'should correctly parse "defined? a"' do
14
+ ruby = 'defined? a'
15
+ ast = {:defined=>
16
+ {:@expression=>
17
+ {:send=>
18
+ {:@receiver=>{:self=>{:@line=>1}},
19
+ :@check_for_local=>false,
20
+ :@block=>nil,
21
+ :@name=>:a,
22
+ :@line=>1,
23
+ :@privately=>true}},
24
+ :@line=>1}}
25
+
26
+ ruby.should parse_as(ast)
27
+ end
28
+
29
+ it 'should correctly parse "a = 1; defined? a"' do
30
+ ruby = <<-ruby
31
+ a = 1
32
+ defined? a
33
+ ruby
34
+ ast = {:block=>
35
+ {:@array=>
36
+ [{:localvariableassignment=>
37
+ {:@variable=>nil,
38
+ :@name=>:a,
39
+ :@line=>1,
40
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}},
41
+ {:defined=>
42
+ {:@expression=>
43
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:a, :@line=>2}},
44
+ :@line=>2}}],
45
+ :@line=>1}}
46
+
47
+ ruby.should parse_as(ast)
48
+ end
49
+
50
+ it 'should correctly parse "defined? x = 1"' do
51
+ ruby = 'defined? x = 1'
52
+ ast = {:defined=>
53
+ {:@expression=>
54
+ {:localvariableassignment=>
55
+ {:@variable=>nil,
56
+ :@name=>:x,
57
+ :@line=>1,
58
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}},
59
+ :@line=>1}}
60
+
61
+ ruby.should parse_as(ast)
62
+ end
63
+
64
+ it 'should correctly parse "defined? x += 1"' do
65
+ ruby = 'defined? x += 1'
66
+ ast = {:defined=>
67
+ {:@expression=>
68
+ {:localvariableassignment=>
69
+ {:@variable=>nil,
70
+ :@name=>:x,
71
+ :@line=>1,
72
+ :@value=>
73
+ {:sendwitharguments=>
74
+ {:@receiver=>
75
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:x, :@line=>1}},
76
+ :@check_for_local=>false,
77
+ :@arguments=>
78
+ {:actualarguments=>
79
+ {:@array=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}],
80
+ :@splat=>nil,
81
+ :@line=>1}},
82
+ :@block=>nil,
83
+ :@name=>:+,
84
+ :@line=>1,
85
+ :@privately=>false}}}},
86
+ :@line=>1}}
87
+
88
+ ruby.should parse_as(ast)
89
+ end
90
+
91
+ it 'should correctly parse "defined? x ||= 1"' do
92
+ ruby = 'defined? x ||= 1'
93
+ ast = {:defined=>
94
+ {:@expression=>
95
+ {:opassignor=>
96
+ {:@right=>
97
+ {:localvariableassignment=>
98
+ {:@variable=>nil,
99
+ :@name=>:x,
100
+ :@line=>1,
101
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}},
102
+ :@line=>1,
103
+ :@left=>
104
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:x, :@line=>1}}}},
105
+ :@line=>1}}
106
+
107
+ ruby.should parse_as(ast)
108
+ end
109
+
110
+ it 'should correctly parse "defined? x &&= 1"' do
111
+ ruby = 'defined? x &&= 1'
112
+ ast = {:defined=>
113
+ {:@expression=>
114
+ {:opassignand=>
115
+ {:@right=>
116
+ {:localvariableassignment=>
117
+ {:@variable=>nil,
118
+ :@name=>:x,
119
+ :@line=>1,
120
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}},
121
+ :@line=>1,
122
+ :@left=>
123
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:x, :@line=>1}}}},
124
+ :@line=>1}}
125
+
126
+ ruby.should parse_as(ast)
127
+ end
128
+
129
+ it 'should correctly parse "defined? X"' do
130
+ ruby = 'defined? X'
131
+ ast = {:defined=>{:@expression=>{:constfind=>{:@name=>:X, :@line=>1}}, :@line=>1}}
132
+
133
+ ruby.should parse_as(ast)
134
+ end
135
+
136
+ it 'should correctly parse "defined? ::X"' do
137
+ ruby = 'defined? ::X'
138
+ ast = {:defined=>
139
+ {:@expression=>
140
+ {:constattop=>{:@parent=>{:toplevel=>{:@line=>1}}, :@name=>:X, :@line=>1}},
141
+ :@line=>1}}
142
+
143
+ ruby.should parse_as(ast)
144
+ end
145
+
146
+ it 'should correctly parse "defined? X::Y"' do
147
+ ruby = 'defined? X::Y::Z'
148
+ ast = {:defined=>
149
+ {:@expression=>
150
+ {:constaccess=>
151
+ {:@parent=>
152
+ {:constaccess=>
153
+ {:@parent=>{:constfind=>{:@name=>:X, :@line=>1}},
154
+ :@name=>:Y,
155
+ :@line=>1}},
156
+ :@name=>:Z,
157
+ :@line=>1}},
158
+ :@line=>1}}
159
+
160
+ ruby.should parse_as(ast)
161
+ end
162
+
163
+ it 'should correctly parse "defined? self::A"' do
164
+ ruby = 'defined? self::A'
165
+ ast = {:defined=>
166
+ {:@expression=>
167
+ {:constaccess=>{:@parent=>{:self=>{:@line=>1}}, :@name=>:A, :@line=>1}},
168
+ :@line=>1}}
169
+
170
+ ruby.should parse_as(ast)
171
+ end
172
+
173
+ it 'should correctly parse "defined? self"' do
174
+ ruby = 'defined? self'
175
+ ast = {:defined=>{:@expression=>{:self=>{:@line=>1}}, :@line=>1}}
176
+
177
+ ruby.should parse_as(ast)
178
+ end
179
+
180
+ it 'should correctly parse "defined? true"' do
181
+ ruby = 'defined? true'
182
+ ast = {:defined=>{:@expression=>{:true=>{:@line=>1}}, :@line=>1}}
183
+
184
+ ruby.should parse_as(ast)
185
+ end
186
+
187
+ it 'should correctly parse "defined? false"' do
188
+ ruby = 'defined? false'
189
+ ast = {:defined=>{:@expression=>{:false=>{:@line=>1}}, :@line=>1}}
190
+
191
+ ruby.should parse_as(ast)
192
+ end
193
+
194
+ it 'should correctly parse "defined? nil"' do
195
+ ruby = 'defined? nil'
196
+ ast = {:defined=>{:@expression=>{}, :@line=>1}}
197
+
198
+ ruby.should parse_as(ast)
199
+ end
200
+
201
+ it 'should correctly parse "defined? @var"' do
202
+ ruby = 'defined? @var'
203
+ ast = {:defined=>
204
+ {:@expression=>{:instancevariableaccess=>{:@name=>:@var, :@line=>1}},
205
+ :@line=>1}}
206
+
207
+ ruby.should parse_as(ast)
208
+ end
209
+
210
+ it 'should correctly parse "defined? :a"' do
211
+ ruby = 'defined? :a'
212
+ ast = {:defined=>
213
+ {:@expression=>{:symbolliteral=>{:@line=>1, :@value=>:a}}, :@line=>1}}
214
+
215
+ ruby.should parse_as(ast)
216
+ end
217
+
218
+ it 'should correctly parse "defined? \'a\'"' do
219
+ ruby = "defined? 'a'"
220
+ ast = {:defined=>
221
+ {:@expression=>{:stringliteral=>{:@string=>:a, :@line=>1}}, :@line=>1}}
222
+
223
+ ruby.should parse_as(ast)
224
+ end
225
+
226
+ it 'should correctly parse "defined? 0"' do
227
+ ruby = 'defined? 0'
228
+ ast = {:defined=>
229
+ {:@expression=>{:fixnumliteral=>{:@line=>1, :@value=>0}}, :@line=>1}}
230
+
231
+ ruby.should parse_as(ast)
232
+ end
233
+
234
+ it 'should correctly parse "defined? yield"' do
235
+ ruby = 'defined? yield'
236
+ ast = {:defined=>
237
+ {:@expression=>
238
+ {:yield=>
239
+ {:@arguments=>{:actualarguments=>{:@array=>[], :@splat=>nil, :@line=>1}},
240
+ :@argument_count=>0,
241
+ :@yield_splat=>false,
242
+ :@line=>1}},
243
+ :@line=>1}}
244
+
245
+ ruby.should parse_as(ast)
246
+ end
247
+
248
+ it 'should correctly parse "defined? A.m"' do
249
+ ruby = 'defined? A.m'
250
+ ast = {:defined=>
251
+ {:@expression=>
252
+ {:send=>
253
+ {:@receiver=>{:constfind=>{:@name=>:A, :@line=>1}},
254
+ :@check_for_local=>false,
255
+ :@block=>nil,
256
+ :@name=>:m,
257
+ :@line=>1,
258
+ :@privately=>false}},
259
+ :@line=>1}}
260
+
261
+ ruby.should parse_as(ast)
262
+ end
263
+
264
+ it 'should correctly parse "defined? ::A.m"' do
265
+ ruby = 'defined? ::A.m'
266
+ ast = {:defined=>
267
+ {:@expression=>
268
+ {:send=>
269
+ {:@receiver=>
270
+ {:constattop=>
271
+ {:@parent=>{:toplevel=>{:@line=>1}}, :@name=>:A, :@line=>1}},
272
+ :@check_for_local=>false,
273
+ :@block=>nil,
274
+ :@name=>:m,
275
+ :@line=>1,
276
+ :@privately=>false}},
277
+ :@line=>1}}
278
+
279
+ ruby.should parse_as(ast)
280
+ end
281
+
282
+ it 'should correctly parse "defined? A::B.m"' do
283
+ ruby = 'defined? A::B.m'
284
+ ast = {:defined=>
285
+ {:@expression=>
286
+ {:send=>
287
+ {:@receiver=>
288
+ {:constaccess=>
289
+ {:@parent=>{:constfind=>{:@name=>:A, :@line=>1}},
290
+ :@name=>:B,
291
+ :@line=>1}},
292
+ :@check_for_local=>false,
293
+ :@block=>nil,
294
+ :@name=>:m,
295
+ :@line=>1,
296
+ :@privately=>false}},
297
+ :@line=>1}}
298
+
299
+ ruby.should parse_as(ast)
300
+ end
301
+
302
+ it 'should correctly parse "defined? a.b"' do
303
+ ruby = 'defined? a.b'
304
+ ast = {:defined=>
305
+ {:@expression=>
306
+ {:send=>
307
+ {:@receiver=>
308
+ {:send=>
309
+ {:@receiver=>{:self=>{:@line=>1}},
310
+ :@check_for_local=>false,
311
+ :@block=>nil,
312
+ :@name=>:a,
313
+ :@line=>1,
314
+ :@privately=>true}},
315
+ :@check_for_local=>false,
316
+ :@block=>nil,
317
+ :@name=>:b,
318
+ :@line=>1,
319
+ :@privately=>false}},
320
+ :@line=>1}}
321
+
322
+ ruby.should parse_as(ast)
323
+ end
324
+
325
+ it 'should correctly parse "a = 1; defined? a.to_s"' do
326
+ ruby = <<-ruby
327
+ a = 1
328
+ defined? a.to_s
329
+ ruby
330
+ ast = {:block=>
331
+ {:@array=>
332
+ [{:localvariableassignment=>
333
+ {:@variable=>nil,
334
+ :@name=>:a,
335
+ :@line=>1,
336
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}},
337
+ {:defined=>
338
+ {:@expression=>
339
+ {:send=>
340
+ {:@receiver=>
341
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:a, :@line=>2}},
342
+ :@check_for_local=>false,
343
+ :@block=>nil,
344
+ :@name=>:to_s,
345
+ :@line=>2,
346
+ :@privately=>false}},
347
+ :@line=>2}}],
348
+ :@line=>1}}
349
+
350
+ ruby.should parse_as(ast)
351
+ end
352
+
353
+ end