melbourne 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,577 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "case ..."' do
6
+ ruby = <<-ruby
7
+ var = 2
8
+ result = ""
9
+ case var
10
+ when 1 then
11
+ puts("something")
12
+ result = "red"
13
+ when 2, 3 then
14
+ result = "yellow"
15
+ when 4 then
16
+ # do nothing
17
+ else
18
+ result = "green"
19
+ end
20
+ case result
21
+ when "red" then
22
+ var = 1
23
+ when "yellow" then
24
+ var = 2
25
+ when "green" then
26
+ var = 3
27
+ else
28
+ # do nothing
29
+ end
30
+ ruby
31
+ ast = {:block=>
32
+ {:@array=>
33
+ [{:localvariableassignment=>
34
+ {:@variable=>nil,
35
+ :@name=>:var,
36
+ :@line=>1,
37
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>2}}}},
38
+ {:localvariableassignment=>
39
+ {:@variable=>nil,
40
+ :@name=>:result,
41
+ :@line=>2,
42
+ :@value=>{:stringliteral=>{:@string=>:"<blank>", :@line=>2}}}},
43
+ {:receivercase=>
44
+ {:@whens=>
45
+ [{:when=>
46
+ {:@body=>
47
+ {:block=>
48
+ {:@array=>
49
+ [{:sendwitharguments=>
50
+ {:@block=>nil,
51
+ :@name=>:puts,
52
+ :@line=>5,
53
+ :@privately=>true,
54
+ :@receiver=>{:self=>{:@line=>5}},
55
+ :@check_for_local=>false,
56
+ :@arguments=>
57
+ {:actualarguments=>
58
+ {:@array=>
59
+ [{:stringliteral=>
60
+ {:@string=>:something, :@line=>5}}],
61
+ :@splat=>nil,
62
+ :@line=>5}}}},
63
+ {:localvariableassignment=>
64
+ {:@variable=>nil,
65
+ :@name=>:result,
66
+ :@line=>6,
67
+ :@value=>
68
+ {:stringliteral=>{:@string=>:red, :@line=>6}}}}],
69
+ :@line=>5}},
70
+ :@splat=>nil,
71
+ :@line=>13,
72
+ :@single=>{:fixnumliteral=>{:@line=>4, :@value=>1}}}},
73
+ {:when=>
74
+ {:@conditions=>
75
+ {:arrayliteral=>
76
+ {:@body=>
77
+ [{:fixnumliteral=>{:@line=>7, :@value=>2}},
78
+ {:fixnumliteral=>{:@line=>7, :@value=>3}}],
79
+ :@line=>7}},
80
+ :@body=>
81
+ {:localvariableassignment=>
82
+ {:@variable=>nil,
83
+ :@name=>:result,
84
+ :@line=>8,
85
+ :@value=>{:stringliteral=>{:@string=>:yellow, :@line=>8}}}},
86
+ :@splat=>nil,
87
+ :@line=>13,
88
+ :@single=>nil}},
89
+ {:when=>
90
+ {:@body=>{},
91
+ :@splat=>nil,
92
+ :@line=>13,
93
+ :@single=>{:fixnumliteral=>{:@line=>9, :@value=>4}}}}],
94
+ :@else=>
95
+ {:localvariableassignment=>
96
+ {:@variable=>nil,
97
+ :@name=>:result,
98
+ :@line=>12,
99
+ :@value=>{:stringliteral=>{:@string=>:green, :@line=>12}}}},
100
+ :@line=>3,
101
+ :@receiver=>
102
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:var, :@line=>3}}}},
103
+ {:receivercase=>
104
+ {:@whens=>
105
+ [{:when=>
106
+ {:@body=>
107
+ {:localvariableassignment=>
108
+ {:@variable=>nil,
109
+ :@name=>:var,
110
+ :@line=>16,
111
+ :@value=>{:fixnumliteral=>{:@line=>16, :@value=>1}}}},
112
+ :@splat=>nil,
113
+ :@line=>23,
114
+ :@single=>{:stringliteral=>{:@string=>:red, :@line=>15}}}},
115
+ {:when=>
116
+ {:@body=>
117
+ {:localvariableassignment=>
118
+ {:@variable=>nil,
119
+ :@name=>:var,
120
+ :@line=>18,
121
+ :@value=>{:fixnumliteral=>{:@line=>18, :@value=>2}}}},
122
+ :@splat=>nil,
123
+ :@line=>23,
124
+ :@single=>{:stringliteral=>{:@string=>:yellow, :@line=>17}}}},
125
+ {:when=>
126
+ {:@body=>
127
+ {:localvariableassignment=>
128
+ {:@variable=>nil,
129
+ :@name=>:var,
130
+ :@line=>20,
131
+ :@value=>{:fixnumliteral=>{:@line=>20, :@value=>3}}}},
132
+ :@splat=>nil,
133
+ :@line=>23,
134
+ :@single=>{:stringliteral=>{:@string=>:green, :@line=>19}}}}],
135
+ :@else=>{},
136
+ :@line=>14,
137
+ :@receiver=>
138
+ {:localvariableaccess=>
139
+ {:@variable=>nil, :@name=>:result, :@line=>14}}}}],
140
+ :@line=>1}}
141
+
142
+ ruby.should parse_as(ast)
143
+ end
144
+
145
+ it 'should correctly parse "case ..."' do
146
+ ruby = <<-ruby
147
+ case a
148
+ when b then
149
+ case
150
+ when (d and e) then
151
+ f
152
+ else
153
+ # do nothing
154
+ end
155
+ else
156
+ # do nothing
157
+ end
158
+ ruby
159
+ ast = {:receivercase=>
160
+ {:@whens=>
161
+ [{:when=>
162
+ {:@body=>
163
+ {:case=>
164
+ {:@whens=>
165
+ [{:when=>
166
+ {:@body=>
167
+ {:send=>
168
+ {:@block=>nil,
169
+ :@name=>:f,
170
+ :@line=>5,
171
+ :@privately=>true,
172
+ :@receiver=>{:self=>{:@line=>5}},
173
+ :@check_for_local=>false}},
174
+ :@splat=>nil,
175
+ :@line=>8,
176
+ :@single=>
177
+ {:and=>
178
+ {:@line=>4,
179
+ :@left=>
180
+ {:send=>
181
+ {:@block=>nil,
182
+ :@name=>:d,
183
+ :@line=>4,
184
+ :@privately=>true,
185
+ :@receiver=>{:self=>{:@line=>4}},
186
+ :@check_for_local=>false}},
187
+ :@right=>
188
+ {:send=>
189
+ {:@block=>nil,
190
+ :@name=>:e,
191
+ :@line=>4,
192
+ :@privately=>true,
193
+ :@receiver=>{:self=>{:@line=>4}},
194
+ :@check_for_local=>false}}}}}}],
195
+ :@else=>{},
196
+ :@line=>11}},
197
+ :@splat=>nil,
198
+ :@line=>11,
199
+ :@single=>
200
+ {:send=>
201
+ {:@block=>nil,
202
+ :@name=>:b,
203
+ :@line=>2,
204
+ :@privately=>true,
205
+ :@receiver=>{:self=>{:@line=>2}},
206
+ :@check_for_local=>false}}}}],
207
+ :@else=>{},
208
+ :@line=>1,
209
+ :@receiver=>
210
+ {:send=>
211
+ {:@block=>nil,
212
+ :@name=>:a,
213
+ :@line=>1,
214
+ :@privately=>true,
215
+ :@receiver=>{:self=>{:@line=>1}},
216
+ :@check_for_local=>false}}}}
217
+
218
+ ruby.should parse_as(ast)
219
+ end
220
+
221
+ it 'should correctly parse "case ..."' do
222
+ ruby = <<-ruby
223
+ var1 = 1
224
+ var2 = 2
225
+ result = nil
226
+ case var1
227
+ when 1 then
228
+ case var2
229
+ when 1 then
230
+ result = 1
231
+ when 2 then
232
+ result = 2
233
+ else
234
+ result = 3
235
+ end
236
+ when 2 then
237
+ case var2
238
+ when 1 then
239
+ result = 4
240
+ when 2 then
241
+ result = 5
242
+ else
243
+ result = 6
244
+ end
245
+ else
246
+ result = 7
247
+ end
248
+ ruby
249
+ ast = {:block=>
250
+ {:@array=>
251
+ [{:localvariableassignment=>
252
+ {:@variable=>nil,
253
+ :@name=>:var1,
254
+ :@line=>1,
255
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}},
256
+ {:localvariableassignment=>
257
+ {:@variable=>nil,
258
+ :@name=>:var2,
259
+ :@line=>2,
260
+ :@value=>{:fixnumliteral=>{:@line=>2, :@value=>2}}}},
261
+ {:localvariableassignment=>
262
+ {:@variable=>nil, :@name=>:result, :@line=>3, :@value=>{}}},
263
+ {:receivercase=>
264
+ {:@whens=>
265
+ [{:when=>
266
+ {:@body=>
267
+ {:receivercase=>
268
+ {:@whens=>
269
+ [{:when=>
270
+ {:@body=>
271
+ {:localvariableassignment=>
272
+ {:@variable=>nil,
273
+ :@name=>:result,
274
+ :@line=>8,
275
+ :@value=>{:fixnumliteral=>{:@line=>8, :@value=>1}}}},
276
+ :@splat=>nil,
277
+ :@line=>13,
278
+ :@single=>{:fixnumliteral=>{:@line=>7, :@value=>1}}}},
279
+ {:when=>
280
+ {:@body=>
281
+ {:localvariableassignment=>
282
+ {:@variable=>nil,
283
+ :@name=>:result,
284
+ :@line=>10,
285
+ :@value=>
286
+ {:fixnumliteral=>{:@line=>10, :@value=>2}}}},
287
+ :@splat=>nil,
288
+ :@line=>13,
289
+ :@single=>{:fixnumliteral=>{:@line=>9, :@value=>2}}}}],
290
+ :@else=>
291
+ {:localvariableassignment=>
292
+ {:@variable=>nil,
293
+ :@name=>:result,
294
+ :@line=>12,
295
+ :@value=>{:fixnumliteral=>{:@line=>12, :@value=>3}}}},
296
+ :@line=>6,
297
+ :@receiver=>
298
+ {:localvariableaccess=>
299
+ {:@variable=>nil, :@name=>:var2, :@line=>6}}}},
300
+ :@splat=>nil,
301
+ :@line=>25,
302
+ :@single=>{:fixnumliteral=>{:@line=>5, :@value=>1}}}},
303
+ {:when=>
304
+ {:@body=>
305
+ {:receivercase=>
306
+ {:@whens=>
307
+ [{:when=>
308
+ {:@body=>
309
+ {:localvariableassignment=>
310
+ {:@variable=>nil,
311
+ :@name=>:result,
312
+ :@line=>17,
313
+ :@value=>
314
+ {:fixnumliteral=>{:@line=>17, :@value=>4}}}},
315
+ :@splat=>nil,
316
+ :@line=>22,
317
+ :@single=>{:fixnumliteral=>{:@line=>16, :@value=>1}}}},
318
+ {:when=>
319
+ {:@body=>
320
+ {:localvariableassignment=>
321
+ {:@variable=>nil,
322
+ :@name=>:result,
323
+ :@line=>19,
324
+ :@value=>
325
+ {:fixnumliteral=>{:@line=>19, :@value=>5}}}},
326
+ :@splat=>nil,
327
+ :@line=>22,
328
+ :@single=>{:fixnumliteral=>{:@line=>18, :@value=>2}}}}],
329
+ :@else=>
330
+ {:localvariableassignment=>
331
+ {:@variable=>nil,
332
+ :@name=>:result,
333
+ :@line=>21,
334
+ :@value=>{:fixnumliteral=>{:@line=>21, :@value=>6}}}},
335
+ :@line=>15,
336
+ :@receiver=>
337
+ {:localvariableaccess=>
338
+ {:@variable=>nil, :@name=>:var2, :@line=>15}}}},
339
+ :@splat=>nil,
340
+ :@line=>25,
341
+ :@single=>{:fixnumliteral=>{:@line=>14, :@value=>2}}}}],
342
+ :@else=>
343
+ {:localvariableassignment=>
344
+ {:@variable=>nil,
345
+ :@name=>:result,
346
+ :@line=>24,
347
+ :@value=>{:fixnumliteral=>{:@line=>24, :@value=>7}}}},
348
+ :@line=>4,
349
+ :@receiver=>
350
+ {:localvariableaccess=>
351
+ {:@variable=>nil, :@name=>:var1, :@line=>4}}}}],
352
+ :@line=>1}}
353
+
354
+ ruby.should parse_as(ast)
355
+ end
356
+
357
+ it 'should correctly parse "case ..."' do
358
+ ruby = <<-ruby
359
+ case
360
+ when (a == 1) then
361
+ :a
362
+ when (a == 2) then
363
+ :b
364
+ else
365
+ :c
366
+ end
367
+ ruby
368
+ ast = {:case=>
369
+ {:@whens=>
370
+ [{:when=>
371
+ {:@body=>{:symbolliteral=>{:@line=>3, :@value=>:a}},
372
+ :@splat=>nil,
373
+ :@line=>8,
374
+ :@single=>
375
+ {:sendwitharguments=>
376
+ {:@block=>nil,
377
+ :@name=>:==,
378
+ :@line=>2,
379
+ :@privately=>false,
380
+ :@receiver=>
381
+ {:send=>
382
+ {:@block=>nil,
383
+ :@name=>:a,
384
+ :@line=>2,
385
+ :@privately=>true,
386
+ :@receiver=>{:self=>{:@line=>2}},
387
+ :@check_for_local=>false}},
388
+ :@check_for_local=>false,
389
+ :@arguments=>
390
+ {:actualarguments=>
391
+ {:@array=>[{:fixnumliteral=>{:@line=>2, :@value=>1}}],
392
+ :@splat=>nil,
393
+ :@line=>2}}}}}},
394
+ {:when=>
395
+ {:@body=>{:symbolliteral=>{:@line=>5, :@value=>:b}},
396
+ :@splat=>nil,
397
+ :@line=>8,
398
+ :@single=>
399
+ {:sendwitharguments=>
400
+ {:@block=>nil,
401
+ :@name=>:==,
402
+ :@line=>4,
403
+ :@privately=>false,
404
+ :@receiver=>
405
+ {:send=>
406
+ {:@block=>nil,
407
+ :@name=>:a,
408
+ :@line=>4,
409
+ :@privately=>true,
410
+ :@receiver=>{:self=>{:@line=>4}},
411
+ :@check_for_local=>false}},
412
+ :@check_for_local=>false,
413
+ :@arguments=>
414
+ {:actualarguments=>
415
+ {:@array=>[{:fixnumliteral=>{:@line=>4, :@value=>2}}],
416
+ :@splat=>nil,
417
+ :@line=>4}}}}}}],
418
+ :@else=>{:symbolliteral=>{:@line=>7, :@value=>:c}},
419
+ :@line=>8}}
420
+
421
+ ruby.should parse_as(ast)
422
+ end
423
+
424
+ it 'should correctly parse "case ..."' do
425
+ ruby = <<-ruby
426
+ case a
427
+ when :b, *c then
428
+ d
429
+ else
430
+ e
431
+ end
432
+ ruby
433
+ ast = {:receivercase=>
434
+ {:@whens=>
435
+ [{:when=>
436
+ {:@conditions=>
437
+ {:arrayliteral=>
438
+ {:@body=>[{:symbolliteral=>{:@line=>2, :@value=>:b}}], :@line=>2}},
439
+ :@body=>
440
+ {:send=>
441
+ {:@block=>nil,
442
+ :@name=>:d,
443
+ :@line=>3,
444
+ :@privately=>true,
445
+ :@receiver=>{:self=>{:@line=>3}},
446
+ :@check_for_local=>false}},
447
+ :@splat=>
448
+ {:splatwhen=>
449
+ {:@condition=>
450
+ {:send=>
451
+ {:@block=>nil,
452
+ :@name=>:c,
453
+ :@line=>2,
454
+ :@privately=>true,
455
+ :@receiver=>{:self=>{:@line=>2}},
456
+ :@check_for_local=>false}},
457
+ :@line=>6}},
458
+ :@line=>6,
459
+ :@single=>nil}}],
460
+ :@else=>
461
+ {:send=>
462
+ {:@block=>nil,
463
+ :@name=>:e,
464
+ :@line=>5,
465
+ :@privately=>true,
466
+ :@receiver=>{:self=>{:@line=>5}},
467
+ :@check_for_local=>false}},
468
+ :@line=>1,
469
+ :@receiver=>
470
+ {:send=>
471
+ {:@block=>nil,
472
+ :@name=>:a,
473
+ :@line=>1,
474
+ :@privately=>true,
475
+ :@receiver=>{:self=>{:@line=>1}},
476
+ :@check_for_local=>false}}}}
477
+
478
+ ruby.should parse_as(ast)
479
+ end
480
+
481
+ it 'should correctly parse "case true ..."' do
482
+ ruby = <<-ruby
483
+ case true
484
+ when String, *%w(foo bar baz) then
485
+ 12
486
+ end
487
+ ruby
488
+ ast = {:receivercase=>
489
+ {:@whens=>
490
+ [{:when=>
491
+ {:@conditions=>
492
+ {:arrayliteral=>
493
+ {:@body=>
494
+ [{:constfind=>{:@name=>:String, :@line=>2}},
495
+ {:stringliteral=>{:@string=>:foo, :@line=>2}},
496
+ {:stringliteral=>{:@string=>:bar, :@line=>2}},
497
+ {:stringliteral=>{:@string=>:baz, :@line=>2}}],
498
+ :@line=>2}},
499
+ :@body=>{:fixnumliteral=>{:@line=>3, :@value=>12}},
500
+ :@splat=>nil,
501
+ :@line=>4,
502
+ :@single=>nil}}],
503
+ :@else=>{},
504
+ :@line=>1,
505
+ :@receiver=>{:true=>{:@line=>1}}}}
506
+
507
+ ruby.should parse_as(ast)
508
+ end
509
+
510
+ it 'should correctly parse "case() ..."' do
511
+ ruby = <<-ruby
512
+ case ()
513
+ when a
514
+ 1
515
+ end
516
+ ruby
517
+ ast = {:receivercase=>
518
+ {:@whens=>
519
+ [{:when=>
520
+ {:@body=>{:fixnumliteral=>{:@line=>3, :@value=>1}},
521
+ :@splat=>nil,
522
+ :@line=>4,
523
+ :@single=>
524
+ {:send=>
525
+ {:@block=>nil,
526
+ :@name=>:a,
527
+ :@line=>2,
528
+ :@privately=>true,
529
+ :@receiver=>{:self=>{:@line=>2}},
530
+ :@check_for_local=>false}}}}],
531
+ :@else=>{},
532
+ :@line=>1,
533
+ :@receiver=>{}}}
534
+
535
+ ruby.should parse_as(ast)
536
+ end
537
+
538
+ it 'should correctly parse "case ..."' do
539
+ ruby = <<-ruby
540
+ x = 1
541
+ case a
542
+ when x
543
+ 2
544
+ end
545
+ ruby
546
+ ast = {:block=>
547
+ {:@array=>
548
+ [{:localvariableassignment=>
549
+ {:@variable=>nil,
550
+ :@name=>:x,
551
+ :@line=>1,
552
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}},
553
+ {:receivercase=>
554
+ {:@whens=>
555
+ [{:when=>
556
+ {:@body=>{:fixnumliteral=>{:@line=>4, :@value=>2}},
557
+ :@splat=>nil,
558
+ :@line=>5,
559
+ :@single=>
560
+ {:localvariableaccess=>
561
+ {:@variable=>nil, :@name=>:x, :@line=>3}}}}],
562
+ :@else=>{},
563
+ :@line=>2,
564
+ :@receiver=>
565
+ {:send=>
566
+ {:@block=>nil,
567
+ :@name=>:a,
568
+ :@line=>2,
569
+ :@privately=>true,
570
+ :@receiver=>{:self=>{:@line=>2}},
571
+ :@check_for_local=>false}}}}],
572
+ :@line=>1}}
573
+
574
+ ruby.should parse_as(ast)
575
+ end
576
+
577
+ end
@@ -0,0 +1,108 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "X = 42"' do
6
+ ruby = 'X = 42'
7
+ ast = {:constset=>
8
+ {:@parent=>nil,
9
+ :@name=>{:constname=>{:@name=>:X, :@line=>1}},
10
+ :@line=>1,
11
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>42}}}}
12
+
13
+ ruby.should parse_as(ast)
14
+ end
15
+
16
+ it 'should correctly parse "::X = 1"' do
17
+ ruby = '::X = 1'
18
+ ast = {:constset=>
19
+ {:@parent=>{:toplevel=>{:@line=>1}},
20
+ :@name=>{:constname=>{:@name=>:X, :@line=>1}},
21
+ :@line=>1,
22
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}}
23
+
24
+ ruby.should parse_as(ast)
25
+ end
26
+
27
+ it 'should correctly parse "X::Y = 1"' do
28
+ ruby = 'X::Y = 1'
29
+ ast = {:constset=>
30
+ {:@parent=>{:constfind=>{:@name=>:X, :@line=>1}},
31
+ :@name=>{:constname=>{:@name=>:Y, :@line=>1}},
32
+ :@line=>1,
33
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}}
34
+
35
+ ruby.should parse_as(ast)
36
+ end
37
+
38
+ it 'should correctly parse "X::Y::Z = a"' do
39
+ ruby = 'X::Y::Z = a'
40
+ ast = {:constset=>
41
+ {:@parent=>
42
+ {:constaccess=>
43
+ {:@parent=>{:constfind=>{:@name=>:X, :@line=>1}},
44
+ :@name=>:Y,
45
+ :@line=>1}},
46
+ :@name=>{:constname=>{:@name=>:Z, :@line=>1}},
47
+ :@line=>1,
48
+ :@value=>
49
+ {:send=>
50
+ {:@block=>nil,
51
+ :@name=>:a,
52
+ :@line=>1,
53
+ :@privately=>true,
54
+ :@receiver=>{:self=>{:@line=>1}},
55
+ :@check_for_local=>false}}}}
56
+
57
+ ruby.should parse_as(ast)
58
+ end
59
+
60
+ it 'should correctly parse "a::A = 1"' do
61
+ ruby = 'a::A = 1'
62
+ ast = {:constset=>
63
+ {:@parent=>
64
+ {:send=>
65
+ {:@block=>nil,
66
+ :@name=>:a,
67
+ :@line=>1,
68
+ :@privately=>true,
69
+ :@receiver=>{:self=>{:@line=>1}},
70
+ :@check_for_local=>false}},
71
+ :@name=>{:constname=>{:@name=>:A, :@line=>1}},
72
+ :@line=>1,
73
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}}
74
+
75
+ ruby.should parse_as(ast)
76
+ end
77
+
78
+ it 'should correctly parse "a::B = b"' do
79
+ ruby = <<-ruby
80
+ a = Object
81
+ a::B = b
82
+ ruby
83
+ ast = {:block=>
84
+ {:@array=>
85
+ [{:localvariableassignment=>
86
+ {:@variable=>nil,
87
+ :@name=>:a,
88
+ :@line=>1,
89
+ :@value=>{:constfind=>{:@name=>:Object, :@line=>1}}}},
90
+ {:constset=>
91
+ {:@parent=>
92
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:a, :@line=>2}},
93
+ :@name=>{:constname=>{:@name=>:B, :@line=>2}},
94
+ :@line=>2,
95
+ :@value=>
96
+ {:send=>
97
+ {:@block=>nil,
98
+ :@name=>:b,
99
+ :@line=>2,
100
+ :@privately=>true,
101
+ :@receiver=>{:self=>{:@line=>2}},
102
+ :@check_for_local=>false}}}}],
103
+ :@line=>1}}
104
+
105
+ ruby.should parse_as(ast)
106
+ end
107
+
108
+ end