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,63 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "(a and b)"' do
6
+ ruby = '(a and b)'
7
+ ast = {:and=>
8
+ {:@line=>1,
9
+ :@left=>
10
+ {:send=>
11
+ {:@block=>nil,
12
+ :@name=>:a,
13
+ :@line=>1,
14
+ :@privately=>true,
15
+ :@receiver=>{:self=>{:@line=>1}},
16
+ :@check_for_local=>false}},
17
+ :@right=>
18
+ {:send=>
19
+ {:@block=>nil,
20
+ :@name=>:b,
21
+ :@line=>1,
22
+ :@privately=>true,
23
+ :@receiver=>{:self=>{:@line=>1}},
24
+ :@check_for_local=>false}}}}
25
+
26
+ ruby.should parse_as(ast)
27
+ end
28
+
29
+ it 'should correctly parse "() and a"' do
30
+ ruby = '() and a'
31
+ ast = {:and=>
32
+ {:@line=>1,
33
+ :@left=>{},
34
+ :@right=>
35
+ {:send=>
36
+ {:@block=>nil,
37
+ :@name=>:a,
38
+ :@line=>1,
39
+ :@privately=>true,
40
+ :@receiver=>{:self=>{:@line=>1}},
41
+ :@check_for_local=>false}}}}
42
+
43
+ ruby.should parse_as(ast)
44
+ end
45
+
46
+ it 'should correctly parse "a and ()"' do
47
+ ruby = 'a and ()'
48
+ ast = {:and=>
49
+ {:@line=>1,
50
+ :@left=>
51
+ {:send=>
52
+ {:@block=>nil,
53
+ :@name=>:a,
54
+ :@line=>1,
55
+ :@privately=>true,
56
+ :@receiver=>{:self=>{:@line=>1}},
57
+ :@check_for_local=>false}},
58
+ :@right=>{}}}
59
+
60
+ ruby.should parse_as(ast)
61
+ end
62
+
63
+ end
@@ -0,0 +1,157 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "[1, :b, "c"]"' do
6
+ ruby = '[1, :b, "c"]'
7
+ ast = {:arrayliteral=>
8
+ {:@body=>
9
+ [{:fixnumliteral=>{:@line=>1, :@value=>1}},
10
+ {:symbolliteral=>{:@line=>1, :@value=>:b}},
11
+ {:stringliteral=>{:@string=>:c, :@line=>1}}],
12
+ :@line=>1}}
13
+
14
+ ruby.should parse_as(ast)
15
+ end
16
+
17
+ it 'should correctly parse "%w[a b c]"' do
18
+ ruby = '%w[a b c]'
19
+ ast = {:arrayliteral=>
20
+ {:@body=>
21
+ [{:stringliteral=>{:@string=>:a, :@line=>1}},
22
+ {:stringliteral=>{:@string=>:b, :@line=>1}},
23
+ {:stringliteral=>{:@string=>:c, :@line=>1}}],
24
+ :@line=>1}}
25
+
26
+ ruby.should parse_as(ast)
27
+ end
28
+
29
+ it 'should correctly parse "%w[a #{@b} c]"' do
30
+ ruby = '%w[a #{@b} c]'
31
+ ast = {:arrayliteral=>
32
+ {:@body=>
33
+ [{:stringliteral=>{:@string=>:a, :@line=>1}},
34
+ {:stringliteral=>{:@string=>:"\#{@b}", :@line=>1}},
35
+ {:stringliteral=>{:@string=>:c, :@line=>1}}],
36
+ :@line=>1}}
37
+
38
+ ruby.should parse_as(ast)
39
+ end
40
+
41
+ it 'should correctly parse "%W[a b c]"' do
42
+ ruby = '%W[a b c]'
43
+ ast = {:arrayliteral=>
44
+ {:@body=>
45
+ [{:stringliteral=>{:@string=>:a, :@line=>1}},
46
+ {:stringliteral=>{:@string=>:b, :@line=>1}},
47
+ {:stringliteral=>{:@string=>:c, :@line=>1}}],
48
+ :@line=>1}}
49
+
50
+ ruby.should parse_as(ast)
51
+ end
52
+
53
+ it 'should correctly parse "%W[a #{@b} c]"' do
54
+ ruby = '%W[a #{@b} c]'
55
+ ast = {:arrayliteral=>
56
+ {:@body=>
57
+ [{:stringliteral=>{:@string=>:a, :@line=>1}},
58
+ {:dynamicstring=>
59
+ {:@string=>:"<blank>",
60
+ :@array=>
61
+ [{:tostring=>
62
+ {:@line=>1,
63
+ :@value=>{:instancevariableaccess=>{:@name=>:@b, :@line=>1}}}}],
64
+ :@line=>1}},
65
+ {:stringliteral=>{:@string=>:c, :@line=>1}}],
66
+ :@line=>1}}
67
+
68
+ ruby.should parse_as(ast)
69
+ end
70
+
71
+ it 'should correctly parse "[*[1]]"' do
72
+ ruby = '[*[1]]'
73
+ ast = {:splatvalue=>
74
+ {:@line=>1,
75
+ :@value=>
76
+ {:arrayliteral=>
77
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}], :@line=>1}}}}
78
+
79
+ ruby.should parse_as(ast)
80
+ end
81
+
82
+ it 'should correctly parse "[*1]"' do
83
+ ruby = '[*1]'
84
+ ast = {:splatvalue=>{:@line=>1, :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}}
85
+
86
+ ruby.should parse_as(ast)
87
+ end
88
+
89
+ it 'should correctly parse "[[*1]]"' do
90
+ ruby = '[[*1]]'
91
+ ast = {:arrayliteral=>
92
+ {:@body=>
93
+ [{:splatvalue=>
94
+ {:@line=>1, :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}}],
95
+ :@line=>1}}
96
+
97
+ ruby.should parse_as(ast)
98
+ end
99
+
100
+ it 'should correctly parse "[1, *2]"' do
101
+ ruby = '[1, *2]'
102
+ ast = {:concatargs=>
103
+ {:@array=>
104
+ {:arrayliteral=>
105
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}], :@line=>1}},
106
+ :@size=>1,
107
+ :@rest=>{:fixnumliteral=>{:@line=>1, :@value=>2}},
108
+ :@line=>1}}
109
+
110
+ ruby.should parse_as(ast)
111
+ end
112
+
113
+ it 'should correctly parse "[1, *c()]"' do
114
+ ruby = '[1, *c()]'
115
+ ast = {:concatargs=>
116
+ {:@array=>
117
+ {:arrayliteral=>
118
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}], :@line=>1}},
119
+ :@size=>1,
120
+ :@rest=>
121
+ {:send=>
122
+ {:@block=>nil,
123
+ :@name=>:c,
124
+ :@line=>1,
125
+ :@privately=>true,
126
+ :@receiver=>{:self=>{:@line=>1}},
127
+ :@check_for_local=>false}},
128
+ :@line=>1}}
129
+
130
+ ruby.should parse_as(ast)
131
+ end
132
+
133
+ it 'should correctly parse "x = [2]; [1, *x]"' do
134
+ ruby = 'x = [2]; [1, *x]'
135
+ ast = {:block=>
136
+ {:@array=>
137
+ [{:localvariableassignment=>
138
+ {:@variable=>nil,
139
+ :@name=>:x,
140
+ :@line=>1,
141
+ :@value=>
142
+ {:arrayliteral=>
143
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>2}}], :@line=>1}}}},
144
+ {:concatargs=>
145
+ {:@array=>
146
+ {:arrayliteral=>
147
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}], :@line=>1}},
148
+ :@size=>1,
149
+ :@rest=>
150
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:x, :@line=>1}},
151
+ :@line=>1}}],
152
+ :@line=>1}}
153
+
154
+ ruby.should parse_as(ast)
155
+ end
156
+
157
+ end
@@ -0,0 +1,401 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "y = 0; 42.method = y"' do
6
+ ruby = 'y = 0; 42.method = y'
7
+ ast = {:block=>
8
+ {:@array=>
9
+ [{:localvariableassignment=>
10
+ {:@variable=>nil,
11
+ :@name=>:y,
12
+ :@line=>1,
13
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>0}}}},
14
+ {:attributeassignment=>
15
+ {:@name=>:method=,
16
+ :@line=>1,
17
+ :@privately=>false,
18
+ :@receiver=>{:fixnumliteral=>{:@line=>1, :@value=>42}},
19
+ :@arguments=>
20
+ {:actualarguments=>
21
+ {:@array=>
22
+ [{:localvariableaccess=>
23
+ {:@variable=>nil, :@name=>:y, :@line=>1}}],
24
+ :@splat=>nil,
25
+ :@line=>1}}}}],
26
+ :@line=>1}}
27
+
28
+ ruby.should parse_as(ast)
29
+ end
30
+
31
+ it 'should correctly parse "a.m = *[1]"' do
32
+ ruby = 'a.m = *[1]'
33
+ ast = {:attributeassignment=>
34
+ {:@name=>:m=,
35
+ :@line=>1,
36
+ :@privately=>false,
37
+ :@receiver=>
38
+ {:send=>
39
+ {:@block=>nil,
40
+ :@name=>:a,
41
+ :@line=>1,
42
+ :@privately=>true,
43
+ :@receiver=>{:self=>{:@line=>1}},
44
+ :@check_for_local=>false}},
45
+ :@arguments=>
46
+ {:actualarguments=>
47
+ {:@array=>
48
+ [{:svalue=>
49
+ {:@line=>1,
50
+ :@value=>
51
+ {:splatvalue=>
52
+ {:@line=>1,
53
+ :@value=>
54
+ {:arrayliteral=>
55
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}],
56
+ :@line=>1}}}}}}],
57
+ :@splat=>nil,
58
+ :@line=>1}}}}
59
+
60
+ ruby.should parse_as(ast)
61
+ end
62
+
63
+ it 'should correctly parse "a[*b] = c"' do
64
+ ruby = 'a[*b] = c'
65
+ ast = {:elementassignment=>
66
+ {:@name=>:[]=,
67
+ :@line=>1,
68
+ :@privately=>false,
69
+ :@receiver=>
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
+ :@arguments=>
78
+ {:pushargs=>
79
+ {:@line=>1,
80
+ :@value=>
81
+ {:send=>
82
+ {:@block=>nil,
83
+ :@name=>:c,
84
+ :@line=>1,
85
+ :@privately=>true,
86
+ :@receiver=>{:self=>{:@line=>1}},
87
+ :@check_for_local=>false}},
88
+ :@arguments=>
89
+ {:splatvalue=>
90
+ {:@line=>1,
91
+ :@value=>
92
+ {:send=>
93
+ {:@block=>nil,
94
+ :@name=>:b,
95
+ :@line=>1,
96
+ :@privately=>true,
97
+ :@receiver=>{:self=>{:@line=>1}},
98
+ :@check_for_local=>false}}}}}}}}
99
+
100
+ ruby.should parse_as(ast)
101
+ end
102
+
103
+ it 'should correctly parse "a[b, *c] = d"' do
104
+ ruby = 'a[b, *c] = d'
105
+ ast = {:elementassignment=>
106
+ {:@name=>:[]=,
107
+ :@line=>1,
108
+ :@privately=>false,
109
+ :@receiver=>
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
+ :@arguments=>
118
+ {:pushargs=>
119
+ {:@line=>1,
120
+ :@value=>
121
+ {:send=>
122
+ {:@block=>nil,
123
+ :@name=>:d,
124
+ :@line=>1,
125
+ :@privately=>true,
126
+ :@receiver=>{:self=>{:@line=>1}},
127
+ :@check_for_local=>false}},
128
+ :@arguments=>
129
+ {:concatargs=>
130
+ {:@array=>
131
+ {:arrayliteral=>
132
+ {:@body=>
133
+ [{:send=>
134
+ {:@block=>nil,
135
+ :@name=>:b,
136
+ :@line=>1,
137
+ :@privately=>true,
138
+ :@receiver=>{:self=>{:@line=>1}},
139
+ :@check_for_local=>false}}],
140
+ :@line=>1}},
141
+ :@size=>1,
142
+ :@rest=>
143
+ {:send=>
144
+ {:@block=>nil,
145
+ :@name=>:c,
146
+ :@line=>1,
147
+ :@privately=>true,
148
+ :@receiver=>{:self=>{:@line=>1}},
149
+ :@check_for_local=>false}},
150
+ :@line=>1}}}}}}
151
+
152
+ ruby.should parse_as(ast)
153
+ end
154
+
155
+ it 'should correctly parse "a[b, *c] = *d"' do
156
+ ruby = 'a[b, *c] = *d'
157
+ ast = {:elementassignment=>
158
+ {:@name=>:[]=,
159
+ :@line=>1,
160
+ :@privately=>false,
161
+ :@receiver=>
162
+ {:send=>
163
+ {:@block=>nil,
164
+ :@name=>:a,
165
+ :@line=>1,
166
+ :@privately=>true,
167
+ :@receiver=>{:self=>{:@line=>1}},
168
+ :@check_for_local=>false}},
169
+ :@arguments=>
170
+ {:pushargs=>
171
+ {:@line=>1,
172
+ :@value=>
173
+ {:svalue=>
174
+ {:@line=>1,
175
+ :@value=>
176
+ {:splatvalue=>
177
+ {:@line=>1,
178
+ :@value=>
179
+ {:send=>
180
+ {:@block=>nil,
181
+ :@name=>:d,
182
+ :@line=>1,
183
+ :@privately=>true,
184
+ :@receiver=>{:self=>{:@line=>1}},
185
+ :@check_for_local=>false}}}}}},
186
+ :@arguments=>
187
+ {:concatargs=>
188
+ {:@array=>
189
+ {:arrayliteral=>
190
+ {:@body=>
191
+ [{:send=>
192
+ {:@block=>nil,
193
+ :@name=>:b,
194
+ :@line=>1,
195
+ :@privately=>true,
196
+ :@receiver=>{:self=>{:@line=>1}},
197
+ :@check_for_local=>false}}],
198
+ :@line=>1}},
199
+ :@size=>1,
200
+ :@rest=>
201
+ {:send=>
202
+ {:@block=>nil,
203
+ :@name=>:c,
204
+ :@line=>1,
205
+ :@privately=>true,
206
+ :@receiver=>{:self=>{:@line=>1}},
207
+ :@check_for_local=>false}},
208
+ :@line=>1}}}}}}
209
+
210
+ ruby.should parse_as(ast)
211
+ end
212
+
213
+ it 'should correctly parse "a[b, *c] = *d"' do
214
+ ruby = 'a[b, *c] = *d'
215
+ ast = {:elementassignment=>
216
+ {:@name=>:[]=,
217
+ :@line=>1,
218
+ :@privately=>false,
219
+ :@receiver=>
220
+ {:send=>
221
+ {:@block=>nil,
222
+ :@name=>:a,
223
+ :@line=>1,
224
+ :@privately=>true,
225
+ :@receiver=>{:self=>{:@line=>1}},
226
+ :@check_for_local=>false}},
227
+ :@arguments=>
228
+ {:pushargs=>
229
+ {:@line=>1,
230
+ :@value=>
231
+ {:svalue=>
232
+ {:@line=>1,
233
+ :@value=>
234
+ {:splatvalue=>
235
+ {:@line=>1,
236
+ :@value=>
237
+ {:send=>
238
+ {:@block=>nil,
239
+ :@name=>:d,
240
+ :@line=>1,
241
+ :@privately=>true,
242
+ :@receiver=>{:self=>{:@line=>1}},
243
+ :@check_for_local=>false}}}}}},
244
+ :@arguments=>
245
+ {:concatargs=>
246
+ {:@array=>
247
+ {:arrayliteral=>
248
+ {:@body=>
249
+ [{:send=>
250
+ {:@block=>nil,
251
+ :@name=>:b,
252
+ :@line=>1,
253
+ :@privately=>true,
254
+ :@receiver=>{:self=>{:@line=>1}},
255
+ :@check_for_local=>false}}],
256
+ :@line=>1}},
257
+ :@size=>1,
258
+ :@rest=>
259
+ {:send=>
260
+ {:@block=>nil,
261
+ :@name=>:c,
262
+ :@line=>1,
263
+ :@privately=>true,
264
+ :@receiver=>{:self=>{:@line=>1}},
265
+ :@check_for_local=>false}},
266
+ :@line=>1}}}}}}
267
+
268
+ ruby.should parse_as(ast)
269
+ end
270
+
271
+ it 'should correctly parse "a[42] = 24"' do
272
+ ruby = 'a[42] = 24'
273
+ ast = {:elementassignment=>
274
+ {:@name=>:[]=,
275
+ :@line=>1,
276
+ :@privately=>false,
277
+ :@receiver=>
278
+ {:send=>
279
+ {:@block=>nil,
280
+ :@name=>:a,
281
+ :@line=>1,
282
+ :@privately=>true,
283
+ :@receiver=>{:self=>{:@line=>1}},
284
+ :@check_for_local=>false}},
285
+ :@arguments=>
286
+ {:actualarguments=>
287
+ {:@array=>
288
+ [{:fixnumliteral=>{:@line=>1, :@value=>42}},
289
+ {:fixnumliteral=>{:@line=>1, :@value=>24}}],
290
+ :@splat=>nil,
291
+ :@line=>1}}}}
292
+
293
+ ruby.should parse_as(ast)
294
+ end
295
+
296
+ it 'should correctly parse "self[index, 0] = other_string"' do
297
+ ruby = 'self[index, 0] = other_string'
298
+ ast = {:elementassignment=>
299
+ {:@name=>:[]=,
300
+ :@line=>1,
301
+ :@privately=>true,
302
+ :@receiver=>{:self=>{:@line=>1}},
303
+ :@arguments=>
304
+ {:actualarguments=>
305
+ {:@array=>
306
+ [{:send=>
307
+ {:@block=>nil,
308
+ :@name=>:index,
309
+ :@line=>1,
310
+ :@privately=>true,
311
+ :@receiver=>{:self=>{:@line=>1}},
312
+ :@check_for_local=>false}},
313
+ {:fixnumliteral=>{:@line=>1, :@value=>0}},
314
+ {:send=>
315
+ {:@block=>nil,
316
+ :@name=>:other_string,
317
+ :@line=>1,
318
+ :@privately=>true,
319
+ :@receiver=>{:self=>{:@line=>1}},
320
+ :@check_for_local=>false}}],
321
+ :@splat=>nil,
322
+ :@line=>1}}}}
323
+
324
+ ruby.should parse_as(ast)
325
+ end
326
+
327
+ it 'should correctly parse "a = []; a [42] = 24"' do
328
+ ruby = <<-ruby
329
+ a = []
330
+ a [42] = 24
331
+ ruby
332
+ ast = {:block=>
333
+ {:@array=>
334
+ [{:localvariableassignment=>
335
+ {:@variable=>nil,
336
+ :@name=>:a,
337
+ :@line=>1,
338
+ :@value=>{:emptyarray=>{:@line=>1}}}},
339
+ {:elementassignment=>
340
+ {:@name=>:[]=,
341
+ :@line=>2,
342
+ :@privately=>false,
343
+ :@receiver=>
344
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:a, :@line=>2}},
345
+ :@arguments=>
346
+ {:actualarguments=>
347
+ {:@array=>
348
+ [{:fixnumliteral=>{:@line=>2, :@value=>42}},
349
+ {:fixnumliteral=>{:@line=>2, :@value=>24}}],
350
+ :@splat=>nil,
351
+ :@line=>2}}}}],
352
+ :@line=>1}}
353
+
354
+ ruby.should parse_as(ast)
355
+ end
356
+
357
+ it 'should correctly parse "m { |a.b| }"' do
358
+ ruby = <<-ruby
359
+ m { |a.b| }
360
+ ruby
361
+ ast = {:send=>
362
+ {:@block=>
363
+ {:iter=>
364
+ {:@body=>{},
365
+ :@line=>1,
366
+ :@arguments=>
367
+ {:iterarguments=>
368
+ {:@block=>nil,
369
+ :@arity=>1,
370
+ :@prelude=>:single,
371
+ :@optional=>0,
372
+ :@splat=>nil,
373
+ :@line=>1,
374
+ :@splat_index=>-1,
375
+ :@required_args=>1,
376
+ :@arguments=>
377
+ {:attributeassignment=>
378
+ {:@name=>:b=,
379
+ :@line=>1,
380
+ :@privately=>false,
381
+ :@receiver=>
382
+ {:send=>
383
+ {:@block=>nil,
384
+ :@name=>:a,
385
+ :@line=>1,
386
+ :@privately=>true,
387
+ :@receiver=>{:self=>{:@line=>1}},
388
+ :@check_for_local=>false}},
389
+ :@arguments=>
390
+ {:actualarguments=>
391
+ {:@array=>[], :@splat=>nil, :@line=>1}}}}}}}},
392
+ :@name=>:m,
393
+ :@line=>1,
394
+ :@privately=>true,
395
+ :@receiver=>{:self=>{:@line=>1}},
396
+ :@check_for_local=>false}}
397
+
398
+ ruby.should parse_as(ast)
399
+ end
400
+
401
+ end
@@ -0,0 +1,20 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "[$&, $`, $\', $+]"' do
6
+ ruby = <<-ruby
7
+ [$&, $`, $', $+]
8
+ ruby
9
+ ast = {:arrayliteral=>
10
+ {:@body=>
11
+ [{:backref=>{:@kind=>:&, :@line=>1}},
12
+ {:backref=>{:@kind=>:`, :@line=>1}},
13
+ {:backref=>{:@kind=>:"'", :@line=>1}},
14
+ {:backref=>{:@kind=>:+, :@line=>1}}],
15
+ :@line=>1}}
16
+
17
+ ruby.should parse_as(ast)
18
+ end
19
+
20
+ end