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,453 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "#{}"' do
6
+ ruby = '"#{}"'
7
+ ast = {:dynamicstring=>
8
+ {:@string=>:"<blank>",
9
+ :@array=>[{:stringliteral=>{:@string=>:"<blank>", :@line=>1}}],
10
+ :@line=>1}}
11
+
12
+ ruby.should parse_as(ast)
13
+ end
14
+
15
+ it 'should correctly parse "#{}#{}"' do
16
+ ruby = '"#{}#{}"'
17
+ ast = {:dynamicstring=>
18
+ {:@string=>:"<blank>",
19
+ :@array=>
20
+ [{:stringliteral=>{:@string=>:"<blank>", :@line=>1}},
21
+ {:stringliteral=>{:@string=>:"<blank>", :@line=>1}}],
22
+ :@line=>1}}
23
+
24
+ ruby.should parse_as(ast)
25
+ end
26
+
27
+ it 'should correctly parse "#{}hello#{}"' do
28
+ ruby = '"#{}hello#{}"'
29
+ ast = {:dynamicstring=>
30
+ {:@string=>:"<blank>",
31
+ :@array=>
32
+ [{:stringliteral=>{:@string=>:"<blank>", :@line=>1}},
33
+ {:stringliteral=>{:@string=>:hello, :@line=>1}},
34
+ {:stringliteral=>{:@string=>:"<blank>", :@line=>1}}],
35
+ :@line=>1}}
36
+
37
+ ruby.should parse_as(ast)
38
+ end
39
+
40
+ it 'should correctly parse "hello #{}"' do
41
+ ruby = '"hello #{}"'
42
+ ast = {:dynamicstring=>
43
+ {:@string=>:"hello ",
44
+ :@array=>[{:stringliteral=>{:@string=>:"<blank>", :@line=>1}}],
45
+ :@line=>1}}
46
+
47
+ ruby.should parse_as(ast)
48
+ end
49
+
50
+ it 'should correctly parse "#{} hello"' do
51
+ ruby = '"#{} hello"'
52
+ ast = {:dynamicstring=>
53
+ {:@string=>:"<blank>",
54
+ :@array=>
55
+ [{:stringliteral=>{:@string=>:"<blank>", :@line=>1}},
56
+ {:stringliteral=>{:@string=>:" hello", :@line=>1}}],
57
+ :@line=>1}}
58
+
59
+ ruby.should parse_as(ast)
60
+ end
61
+
62
+ it 'should correctly parse "#{a}"' do
63
+ ruby = '"#{a}"'
64
+ ast = {:dynamicstring=>
65
+ {:@string=>:"<blank>",
66
+ :@array=>
67
+ [{:tostring=>
68
+ {:@line=>1,
69
+ :@value=>
70
+ {:send=>
71
+ {:@block=>nil,
72
+ :@name=>:a,
73
+ :@line=>1,
74
+ :@privately=>true,
75
+ :@receiver=>{:self=>{:@line=>1}},
76
+ :@check_for_local=>false}}}}],
77
+ :@line=>1}}
78
+
79
+ ruby.should parse_as(ast)
80
+ end
81
+
82
+ it 'should correctly parse "hello #{a}"' do
83
+ ruby = '"hello #{a}"'
84
+ ast = {:dynamicstring=>
85
+ {:@string=>:"hello ",
86
+ :@array=>
87
+ [{:tostring=>
88
+ {:@line=>1,
89
+ :@value=>
90
+ {:send=>
91
+ {:@block=>nil,
92
+ :@name=>:a,
93
+ :@line=>1,
94
+ :@privately=>true,
95
+ :@receiver=>{:self=>{:@line=>1}},
96
+ :@check_for_local=>false}}}}],
97
+ :@line=>1}}
98
+
99
+ ruby.should parse_as(ast)
100
+ end
101
+
102
+ it 'should correctly parse "#{a} hello"' do
103
+ ruby = '"#{a} hello"'
104
+ ast = {:dynamicstring=>
105
+ {:@string=>:"<blank>",
106
+ :@array=>
107
+ [{:tostring=>
108
+ {:@line=>1,
109
+ :@value=>
110
+ {:send=>
111
+ {:@block=>nil,
112
+ :@name=>:a,
113
+ :@line=>1,
114
+ :@privately=>true,
115
+ :@receiver=>{:self=>{:@line=>1}},
116
+ :@check_for_local=>false}}}},
117
+ {:stringliteral=>{:@string=>:" hello", :@line=>1}}],
118
+ :@line=>1}}
119
+
120
+ ruby.should parse_as(ast)
121
+ end
122
+
123
+ it 'should correctly parse "argl = 1; "x#{argl}y""' do
124
+ ruby = <<-ruby
125
+ argl = 1
126
+ "x\#{argl}y"
127
+ ruby
128
+ ast = {:block=>
129
+ {:@array=>
130
+ [{:localvariableassignment=>
131
+ {:@variable=>nil,
132
+ :@name=>:argl,
133
+ :@line=>1,
134
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}},
135
+ {:dynamicstring=>
136
+ {:@string=>:x,
137
+ :@array=>
138
+ [{:tostring=>
139
+ {:@line=>2,
140
+ :@value=>
141
+ {:localvariableaccess=>
142
+ {:@variable=>nil, :@name=>:argl, :@line=>2}}}},
143
+ {:stringliteral=>{:@string=>:y, :@line=>2}}],
144
+ :@line=>2}}],
145
+ :@line=>1}}
146
+
147
+ ruby.should parse_as(ast)
148
+ end
149
+
150
+ it 'should correctly parse "argl = 1; "x#{("%.2f" % 3.14159)}y""' do
151
+ ruby = <<-ruby
152
+ argl = 1
153
+ "x\#{("%.2f" % 3.14159)}y"
154
+ ruby
155
+ ast = {:block=>
156
+ {:@array=>
157
+ [{:localvariableassignment=>
158
+ {:@variable=>nil,
159
+ :@name=>:argl,
160
+ :@line=>1,
161
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}},
162
+ {:dynamicstring=>
163
+ {:@string=>:x,
164
+ :@array=>
165
+ [{:tostring=>
166
+ {:@line=>2,
167
+ :@value=>
168
+ {:sendwitharguments=>
169
+ {:@block=>nil,
170
+ :@name=>:%,
171
+ :@line=>2,
172
+ :@privately=>false,
173
+ :@receiver=>{:stringliteral=>{:@string=>:"%.2f", :@line=>2}},
174
+ :@check_for_local=>false,
175
+ :@arguments=>
176
+ {:actualarguments=>
177
+ {:@array=>[{:float=>{:@line=>2, :@value=>:"3.14159"}}],
178
+ :@splat=>nil,
179
+ :@line=>2}}}}}},
180
+ {:stringliteral=>{:@string=>:y, :@line=>2}}],
181
+ :@line=>2}}],
182
+ :@line=>1}}
183
+
184
+ ruby.should parse_as(ast)
185
+ end
186
+
187
+ it 'should correctly parse "max = 2; argl = 1; "x#{("%.#{max}f" % 3.14159)}y" # ""' do
188
+ ruby = <<-ruby
189
+ max = 2
190
+ argl = 1
191
+ "x\#{("%.\#{max}f" % 3.14159)}y" # "
192
+ ruby
193
+ ast = {:block=>
194
+ {:@array=>
195
+ [{:localvariableassignment=>
196
+ {:@variable=>nil,
197
+ :@name=>:max,
198
+ :@line=>1,
199
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>2}}}},
200
+ {:localvariableassignment=>
201
+ {:@variable=>nil,
202
+ :@name=>:argl,
203
+ :@line=>2,
204
+ :@value=>{:fixnumliteral=>{:@line=>2, :@value=>1}}}},
205
+ {:dynamicstring=>
206
+ {:@string=>:x,
207
+ :@array=>
208
+ [{:tostring=>
209
+ {:@line=>3,
210
+ :@value=>
211
+ {:sendwitharguments=>
212
+ {:@block=>nil,
213
+ :@name=>:%,
214
+ :@line=>3,
215
+ :@privately=>false,
216
+ :@receiver=>
217
+ {:dynamicstring=>
218
+ {:@string=>:"%.",
219
+ :@array=>
220
+ [{:tostring=>
221
+ {:@line=>3,
222
+ :@value=>
223
+ {:localvariableaccess=>
224
+ {:@variable=>nil, :@name=>:max, :@line=>3}}}},
225
+ {:stringliteral=>{:@string=>:f, :@line=>3}}],
226
+ :@line=>3}},
227
+ :@check_for_local=>false,
228
+ :@arguments=>
229
+ {:actualarguments=>
230
+ {:@array=>[{:float=>{:@line=>3, :@value=>:"3.14159"}}],
231
+ :@splat=>nil,
232
+ :@line=>3}}}}}},
233
+ {:stringliteral=>{:@string=>:y, :@line=>3}}],
234
+ :@line=>3}}],
235
+ :@line=>1}}
236
+
237
+ ruby.should parse_as(ast)
238
+ end
239
+
240
+ it 'should correctly parse "#{22}aa" "cd#{44}" "55" "#{66}""' do
241
+ ruby = '"#{22}aa" "cd#{44}" "55" "#{66}"'
242
+ ast = {:dynamicstring=>
243
+ {:@string=>:"<blank>",
244
+ :@array=>
245
+ [{:tostring=>
246
+ {:@line=>1, :@value=>{:fixnumliteral=>{:@line=>1, :@value=>22}}}},
247
+ {:stringliteral=>{:@string=>:aa, :@line=>1}},
248
+ {:stringliteral=>{:@string=>:cd, :@line=>1}},
249
+ {:tostring=>
250
+ {:@line=>1, :@value=>{:fixnumliteral=>{:@line=>1, :@value=>44}}}},
251
+ {:stringliteral=>{:@string=>:"55", :@line=>1}},
252
+ {:tostring=>
253
+ {:@line=>1, :@value=>{:fixnumliteral=>{:@line=>1, :@value=>66}}}}],
254
+ :@line=>1}}
255
+
256
+ ruby.should parse_as(ast)
257
+ end
258
+
259
+ it 'should correctly parse "a #$global b #@ivar c #@@cvar d"' do
260
+ ruby = '"a #$global b #@ivar c #@@cvar d"'
261
+ ast = {:dynamicstring=>
262
+ {:@string=>:"a ",
263
+ :@array=>
264
+ [{:tostring=>
265
+ {:@line=>1,
266
+ :@value=>{:globalvariableaccess=>{:@name=>:$global, :@line=>1}}}},
267
+ {:stringliteral=>{:@string=>:" b ", :@line=>1}},
268
+ {:tostring=>
269
+ {:@line=>1,
270
+ :@value=>{:instancevariableaccess=>{:@name=>:@ivar, :@line=>1}}}},
271
+ {:stringliteral=>{:@string=>:" c ", :@line=>1}},
272
+ {:tostring=>
273
+ {:@line=>1,
274
+ :@value=>{:classvariableaccess=>{:@name=>:@@cvar, :@line=>1}}}},
275
+ {:stringliteral=>{:@string=>:" d", :@line=>1}}],
276
+ :@line=>1}}
277
+
278
+ ruby.should parse_as(ast)
279
+ end
280
+
281
+ it 'should correctly parse "<<EOM ..."' do
282
+ ruby = <<-ruby
283
+ <<EOM
284
+ foo
285
+ \#{1 + 1}blah
286
+ EOM
287
+ ruby
288
+ ast = {:dynamicstring=>
289
+ {:@string=>:" foo\n",
290
+ :@array=>
291
+ [{:tostring=>
292
+ {:@line=>3,
293
+ :@value=>
294
+ {:sendwitharguments=>
295
+ {:@block=>nil,
296
+ :@name=>:+,
297
+ :@line=>3,
298
+ :@privately=>false,
299
+ :@receiver=>{:fixnumliteral=>{:@line=>3, :@value=>1}},
300
+ :@check_for_local=>false,
301
+ :@arguments=>
302
+ {:actualarguments=>
303
+ {:@array=>[{:fixnumliteral=>{:@line=>3, :@value=>1}}],
304
+ :@splat=>nil,
305
+ :@line=>3}}}}}},
306
+ {:stringliteral=>{:@string=>:"blah\n", :@line=>1}}],
307
+ :@line=>3}}
308
+
309
+ ruby.should parse_as(ast)
310
+ end
311
+
312
+ it 'should correctly parse "<<-EOF ..."' do
313
+ ruby = <<-ruby
314
+ <<-EOF
315
+ def test_\#{action}_valid_feed
316
+ EOF
317
+ ruby
318
+ ast = {:dynamicstring=>
319
+ {:@string=>:" def test_",
320
+ :@array=>
321
+ [{:tostring=>
322
+ {:@line=>2,
323
+ :@value=>
324
+ {:send=>
325
+ {:@block=>nil,
326
+ :@name=>:action,
327
+ :@line=>2,
328
+ :@privately=>true,
329
+ :@receiver=>{:self=>{:@line=>2}},
330
+ :@check_for_local=>false}}}},
331
+ {:stringliteral=>{:@string=>:"_valid_feed\n", :@line=>1}}],
332
+ :@line=>2}}
333
+
334
+ ruby.should parse_as(ast)
335
+ end
336
+
337
+ it 'should correctly parse "<<-EOF ..."' do
338
+ ruby = <<-ruby
339
+ <<-EOF
340
+ s1 '\#{RUBY_PLATFORM}' s2
341
+ \#{__FILE__}
342
+ EOF
343
+ ruby
344
+ ast = {:dynamicstring=>
345
+ {:@string=>:" s1 '",
346
+ :@array=>
347
+ [{:tostring=>
348
+ {:@line=>2,
349
+ :@value=>{:constfind=>{:@name=>:RUBY_PLATFORM, :@line=>2}}}},
350
+ {:stringliteral=>{:@string=>:"' s2\n ", :@line=>3}},
351
+ {:tostring=>{:@line=>3, :@value=>{:file=>{:@line=>3}}}},
352
+ {:stringliteral=>{:@string=>:"\n", :@line=>1}}],
353
+ :@line=>2}}
354
+
355
+ ruby.should parse_as(ast)
356
+ end
357
+
358
+ it 'should correctly parse "%Q[before [#{nest}] after]"' do
359
+ ruby = '"%Q[before [#{nest}] after]"'
360
+ ast = {:dynamicstring=>
361
+ {:@string=>:"%Q[before [",
362
+ :@array=>
363
+ [{:tostring=>
364
+ {:@line=>1,
365
+ :@value=>
366
+ {:send=>
367
+ {:@block=>nil,
368
+ :@name=>:nest,
369
+ :@line=>1,
370
+ :@privately=>true,
371
+ :@receiver=>{:self=>{:@line=>1}},
372
+ :@check_for_local=>false}}}},
373
+ {:stringliteral=>{:@string=>:"] after]", :@line=>1}}],
374
+ :@line=>1}}
375
+
376
+ ruby.should parse_as(ast)
377
+ end
378
+
379
+ it 'should correctly parse "#{"blah"}#{__FILE__}:#{__LINE__}: warning: #{$!.message} (#{$!.class})"' do
380
+ ruby = '"#{"blah"}#{__FILE__}:#{__LINE__}: warning: #{$!.message} (#{$!.class})"'
381
+ ast = {:dynamicstring=>
382
+ {:@string=>:blah,
383
+ :@array=>
384
+ [{:tostring=>{:@line=>1, :@value=>{:file=>{:@line=>1}}}},
385
+ {:stringliteral=>{:@string=>:":", :@line=>1}},
386
+ {:tostring=>
387
+ {:@line=>1, :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}},
388
+ {:stringliteral=>{:@string=>:": warning: ", :@line=>1}},
389
+ {:tostring=>
390
+ {:@line=>1,
391
+ :@value=>
392
+ {:send=>
393
+ {:@block=>nil,
394
+ :@name=>:message,
395
+ :@line=>1,
396
+ :@privately=>false,
397
+ :@receiver=>{:globalvariableaccess=>{:@name=>:$!, :@line=>1}},
398
+ :@check_for_local=>false}}}},
399
+ {:stringliteral=>{:@string=>:" (", :@line=>1}},
400
+ {:tostring=>
401
+ {:@line=>1,
402
+ :@value=>
403
+ {:send=>
404
+ {:@block=>nil,
405
+ :@name=>:class,
406
+ :@line=>1,
407
+ :@privately=>false,
408
+ :@receiver=>{:globalvariableaccess=>{:@name=>:$!, :@line=>1}},
409
+ :@check_for_local=>false}}}},
410
+ {:stringliteral=>{:@string=>:")", :@line=>1}}],
411
+ :@line=>1}}
412
+
413
+ ruby.should parse_as(ast)
414
+ end
415
+
416
+ it 'should correctly parse "before #{from} middle #{to} (#{__FILE__}:#{__LINE__})"' do
417
+ ruby = '"before #{from} middle #{to} (#{__FILE__}:#{__LINE__})"'
418
+ ast = {:dynamicstring=>
419
+ {:@string=>:"before ",
420
+ :@array=>
421
+ [{:tostring=>
422
+ {:@line=>1,
423
+ :@value=>
424
+ {:send=>
425
+ {:@block=>nil,
426
+ :@name=>:from,
427
+ :@line=>1,
428
+ :@privately=>true,
429
+ :@receiver=>{:self=>{:@line=>1}},
430
+ :@check_for_local=>false}}}},
431
+ {:stringliteral=>{:@string=>:" middle ", :@line=>1}},
432
+ {:tostring=>
433
+ {:@line=>1,
434
+ :@value=>
435
+ {:send=>
436
+ {:@block=>nil,
437
+ :@name=>:to,
438
+ :@line=>1,
439
+ :@privately=>true,
440
+ :@receiver=>{:self=>{:@line=>1}},
441
+ :@check_for_local=>false}}}},
442
+ {:stringliteral=>{:@string=>:" (", :@line=>1}},
443
+ {:tostring=>{:@line=>1, :@value=>{:file=>{:@line=>1}}}},
444
+ {:stringliteral=>{:@string=>:":", :@line=>1}},
445
+ {:tostring=>
446
+ {:@line=>1, :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}},
447
+ {:stringliteral=>{:@string=>:")", :@line=>1}}],
448
+ :@line=>1}}
449
+
450
+ ruby.should parse_as(ast)
451
+ end
452
+
453
+ end
@@ -0,0 +1,31 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse ":"x#{(1 + 1)}y""' do
6
+ ruby = ':"x#{(1 + 1)}y"'
7
+ ast = {:dynamicsymbol=>
8
+ {:@string=>:x,
9
+ :@array=>
10
+ [{:tostring=>
11
+ {:@line=>1,
12
+ :@value=>
13
+ {:sendwitharguments=>
14
+ {:@block=>nil,
15
+ :@name=>:+,
16
+ :@line=>1,
17
+ :@privately=>false,
18
+ :@receiver=>{:fixnumliteral=>{:@line=>1, :@value=>1}},
19
+ :@check_for_local=>false,
20
+ :@arguments=>
21
+ {:actualarguments=>
22
+ {:@array=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}],
23
+ :@splat=>nil,
24
+ :@line=>1}}}}}},
25
+ {:stringliteral=>{:@string=>:y, :@line=>1}}],
26
+ :@line=>1}}
27
+
28
+ ruby.should parse_as(ast)
29
+ end
30
+
31
+ end
@@ -0,0 +1,31 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "`touch ...`"' do
6
+ ruby = <<-ruby
7
+ t = 5
8
+ `touch \#{t}`
9
+ ruby
10
+ ast = {:block=>
11
+ {:@array=>
12
+ [{:localvariableassignment=>
13
+ {:@variable=>nil,
14
+ :@name=>:t,
15
+ :@line=>1,
16
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>5}}}},
17
+ {:dynamicexecutestring=>
18
+ {:@string=>:"touch ",
19
+ :@array=>
20
+ [{:tostring=>
21
+ {:@line=>2,
22
+ :@value=>
23
+ {:localvariableaccess=>
24
+ {:@variable=>nil, :@name=>:t, :@line=>2}}}}],
25
+ :@line=>2}}],
26
+ :@line=>1}}
27
+
28
+ ruby.should parse_as(ast)
29
+ end
30
+
31
+ end