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,276 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "def x; super(); end"' do
6
+ ruby = <<-ruby
7
+ def x
8
+ super()
9
+ end
10
+ ruby
11
+ ast = {:define=>
12
+ {:@body=>
13
+ {:block=>
14
+ {:@array=>
15
+ [{:super=>
16
+ {:@block=>nil,
17
+ :@line=>2,
18
+ :@arguments=>
19
+ {:actualarguments=>{:@array=>[], :@splat=>nil, :@line=>2}}}}],
20
+ :@line=>1}},
21
+ :@name=>:x,
22
+ :@line=>1,
23
+ :@arguments=>
24
+ {:formalarguments=>
25
+ {:@block_arg=>nil,
26
+ :@names=>[],
27
+ :@defaults=>nil,
28
+ :@optional=>[],
29
+ :@splat=>nil,
30
+ :@line=>1,
31
+ :@required=>[]}}}}
32
+
33
+ ruby.should parse_as(ast)
34
+ end
35
+
36
+ it 'should correctly parse "def x(&block); super(&block); end"' do
37
+ ruby = <<-ruby
38
+ def x(&block)
39
+ super(&block)
40
+ end
41
+ ruby
42
+ ast = {:define=>
43
+ {:@body=>
44
+ {:block=>
45
+ {:@array=>
46
+ [{:super=>
47
+ {:@block=>
48
+ {:blockpass=>
49
+ {:@body=>
50
+ {:localvariableaccess=>
51
+ {:@variable=>nil, :@name=>:block, :@line=>2}},
52
+ :@line=>2}},
53
+ :@line=>2,
54
+ :@arguments=>
55
+ {:actualarguments=>{:@array=>[], :@splat=>nil, :@line=>2}}}}],
56
+ :@line=>1}},
57
+ :@name=>:x,
58
+ :@line=>1,
59
+ :@arguments=>
60
+ {:formalarguments=>
61
+ {:@block_arg=>{:blockargument=>{:@name=>:block, :@line=>1}},
62
+ :@names=>[:block],
63
+ :@defaults=>nil,
64
+ :@optional=>[],
65
+ :@splat=>nil,
66
+ :@line=>1,
67
+ :@required=>[]}}}}
68
+
69
+ ruby.should parse_as(ast)
70
+ end
71
+
72
+ it 'should correctly parse "def x; super([24, 42]); end"' do
73
+ ruby = <<-ruby
74
+ def x
75
+ super([24, 42])
76
+ end
77
+ ruby
78
+ ast = {:define=>
79
+ {:@body=>
80
+ {:block=>
81
+ {:@array=>
82
+ [{:super=>
83
+ {:@block=>nil,
84
+ :@line=>2,
85
+ :@arguments=>
86
+ {:actualarguments=>
87
+ {:@array=>
88
+ [{:arrayliteral=>
89
+ {:@body=>
90
+ [{:fixnumliteral=>{:@line=>2, :@value=>24}},
91
+ {:fixnumliteral=>{:@line=>2, :@value=>42}}],
92
+ :@line=>2}}],
93
+ :@splat=>nil,
94
+ :@line=>2}}}}],
95
+ :@line=>1}},
96
+ :@name=>:x,
97
+ :@line=>1,
98
+ :@arguments=>
99
+ {:formalarguments=>
100
+ {:@block_arg=>nil,
101
+ :@names=>[],
102
+ :@defaults=>nil,
103
+ :@optional=>[],
104
+ :@splat=>nil,
105
+ :@line=>1,
106
+ :@required=>[]}}}}
107
+
108
+ ruby.should parse_as(ast)
109
+ end
110
+
111
+ it 'should correctly parse "def x; super(4); end"' do
112
+ ruby = <<-ruby
113
+ def x
114
+ super(4)
115
+ end
116
+ ruby
117
+ ast = {:define=>
118
+ {:@body=>
119
+ {:block=>
120
+ {:@array=>
121
+ [{:super=>
122
+ {:@block=>nil,
123
+ :@line=>2,
124
+ :@arguments=>
125
+ {:actualarguments=>
126
+ {:@array=>[{:fixnumliteral=>{:@line=>2, :@value=>4}}],
127
+ :@splat=>nil,
128
+ :@line=>2}}}}],
129
+ :@line=>1}},
130
+ :@name=>:x,
131
+ :@line=>1,
132
+ :@arguments=>
133
+ {:formalarguments=>
134
+ {:@block_arg=>nil,
135
+ :@names=>[],
136
+ :@defaults=>nil,
137
+ :@optional=>[],
138
+ :@splat=>nil,
139
+ :@line=>1,
140
+ :@required=>[]}}}}
141
+
142
+ ruby.should parse_as(ast)
143
+ end
144
+
145
+ it 'should correctly parse "super(a, &b)"' do
146
+ ruby = 'super(a, &b)'
147
+ ast = {:super=>
148
+ {:@block=>
149
+ {:blockpass=>
150
+ {:@body=>
151
+ {:send=>
152
+ {:@block=>nil,
153
+ :@name=>:b,
154
+ :@line=>1,
155
+ :@privately=>true,
156
+ :@receiver=>{:self=>{:@line=>1}},
157
+ :@check_for_local=>false}},
158
+ :@line=>1}},
159
+ :@line=>1,
160
+ :@arguments=>
161
+ {:actualarguments=>
162
+ {:@array=>
163
+ [{:send=>
164
+ {:@block=>nil,
165
+ :@name=>:a,
166
+ :@line=>1,
167
+ :@privately=>true,
168
+ :@receiver=>{:self=>{:@line=>1}},
169
+ :@check_for_local=>false}}],
170
+ :@splat=>nil,
171
+ :@line=>1}}}}
172
+
173
+ ruby.should parse_as(ast)
174
+ end
175
+
176
+ it 'should correctly parse "def f(*); super; end"' do
177
+ ruby = <<-ruby
178
+ def f(*)
179
+ super
180
+ end
181
+ ruby
182
+ ast = {:define=>
183
+ {:@body=>
184
+ {:block=>{:@array=>[{:zsuper=>{:@block=>nil, :@line=>2}}], :@line=>1}},
185
+ :@name=>:f,
186
+ :@line=>1,
187
+ :@arguments=>
188
+ {:formalarguments=>
189
+ {:@block_arg=>nil,
190
+ :@names=>[:@unnamed_splat],
191
+ :@defaults=>nil,
192
+ :@optional=>[],
193
+ :@splat=>:@unnamed_splat,
194
+ :@line=>1,
195
+ :@required=>[]}}}}
196
+
197
+ ruby.should parse_as(ast)
198
+ end
199
+
200
+ it 'should correctly parse "def x; super(24, 42); end"' do
201
+ ruby = <<-ruby
202
+ def x
203
+ super(24, 42)
204
+ end
205
+ ruby
206
+ ast = {:define=>
207
+ {:@body=>
208
+ {:block=>
209
+ {:@array=>
210
+ [{:super=>
211
+ {:@block=>nil,
212
+ :@line=>2,
213
+ :@arguments=>
214
+ {:actualarguments=>
215
+ {:@array=>
216
+ [{:fixnumliteral=>{:@line=>2, :@value=>24}},
217
+ {:fixnumliteral=>{:@line=>2, :@value=>42}}],
218
+ :@splat=>nil,
219
+ :@line=>2}}}}],
220
+ :@line=>1}},
221
+ :@name=>:x,
222
+ :@line=>1,
223
+ :@arguments=>
224
+ {:formalarguments=>
225
+ {:@block_arg=>nil,
226
+ :@names=>[],
227
+ :@defaults=>nil,
228
+ :@optional=>[],
229
+ :@splat=>nil,
230
+ :@line=>1,
231
+ :@required=>[]}}}}
232
+
233
+ ruby.should parse_as(ast)
234
+ end
235
+
236
+ it 'should correctly parse "super([*[1]])"' do
237
+ ruby = 'super([*[1]])'
238
+ ast = {:super=>
239
+ {:@block=>nil,
240
+ :@line=>1,
241
+ :@arguments=>
242
+ {:actualarguments=>
243
+ {:@array=>
244
+ [{:splatvalue=>
245
+ {:@line=>1,
246
+ :@value=>
247
+ {:arrayliteral=>
248
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}],
249
+ :@line=>1}}}}],
250
+ :@splat=>nil,
251
+ :@line=>1}}}}
252
+
253
+ ruby.should parse_as(ast)
254
+ end
255
+
256
+ it 'should correctly parse "super(*[1])"' do
257
+ ruby = 'super(*[1])'
258
+ ast = {:super=>
259
+ {:@block=>nil,
260
+ :@line=>1,
261
+ :@arguments=>
262
+ {:actualarguments=>
263
+ {:@array=>[],
264
+ :@splat=>
265
+ {:splatvalue=>
266
+ {:@line=>1,
267
+ :@value=>
268
+ {:arrayliteral=>
269
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}],
270
+ :@line=>1}}}},
271
+ :@line=>1}}}}
272
+
273
+ ruby.should parse_as(ast)
274
+ end
275
+
276
+ end
@@ -0,0 +1,12 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "true"' do
6
+ ruby = 'true'
7
+ ast = {:true=>{:@line=>1}}
8
+
9
+ ruby.should parse_as(ast)
10
+ end
11
+
12
+ end
@@ -0,0 +1,222 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "undef :x"' do
6
+ ruby = 'undef :x'
7
+ ast = {:undef=>{:@name=>{:symbolliteral=>{:@line=>1, :@value=>:x}}, :@line=>1}}
8
+
9
+ ruby.should parse_as(ast)
10
+ end
11
+
12
+ it 'should correctly parse "undef :x, :y"' do
13
+ ruby = 'undef :x, :y'
14
+ ast = {:block=>
15
+ {:@array=>
16
+ [{:undef=>{:@name=>{:symbolliteral=>{:@line=>1, :@value=>:x}}, :@line=>1}},
17
+ {:undef=>
18
+ {:@name=>{:symbolliteral=>{:@line=>1, :@value=>:y}}, :@line=>1}}],
19
+ :@line=>1}}
20
+
21
+ ruby.should parse_as(ast)
22
+ end
23
+
24
+ it 'should correctly parse "undef :x, :y, :z"' do
25
+ ruby = 'undef :x, :y, :z'
26
+ ast = {:block=>
27
+ {:@array=>
28
+ [{:undef=>{:@name=>{:symbolliteral=>{:@line=>1, :@value=>:x}}, :@line=>1}},
29
+ {:undef=>{:@name=>{:symbolliteral=>{:@line=>1, :@value=>:y}}, :@line=>1}},
30
+ {:undef=>
31
+ {:@name=>{:symbolliteral=>{:@line=>1, :@value=>:z}}, :@line=>1}}],
32
+ :@line=>1}}
33
+
34
+ ruby.should parse_as(ast)
35
+ end
36
+
37
+ it 'should correctly parse "f1; undef :x"' do
38
+ ruby = <<-ruby
39
+ f1
40
+ undef :x
41
+ ruby
42
+ ast = {:block=>
43
+ {:@array=>
44
+ [{:send=>
45
+ {:@block=>nil,
46
+ :@name=>:f1,
47
+ :@line=>1,
48
+ :@privately=>true,
49
+ :@receiver=>{:self=>{:@line=>1}},
50
+ :@check_for_local=>false}},
51
+ {:undef=>
52
+ {:@name=>{:symbolliteral=>{:@line=>2, :@value=>:x}}, :@line=>2}}],
53
+ :@line=>1}}
54
+
55
+ ruby.should parse_as(ast)
56
+ end
57
+
58
+ it 'should correctly parse "f1; undef :x, :y"' do
59
+ ruby = <<-ruby
60
+ f1
61
+ undef :x, :y
62
+ ruby
63
+ ast = {:block=>
64
+ {:@array=>
65
+ [{:send=>
66
+ {:@block=>nil,
67
+ :@name=>:f1,
68
+ :@line=>1,
69
+ :@privately=>true,
70
+ :@receiver=>{:self=>{:@line=>1}},
71
+ :@check_for_local=>false}},
72
+ {:block=>
73
+ {:@array=>
74
+ [{:undef=>
75
+ {:@name=>{:symbolliteral=>{:@line=>2, :@value=>:x}}, :@line=>2}},
76
+ {:undef=>
77
+ {:@name=>{:symbolliteral=>{:@line=>2, :@value=>:y}}, :@line=>2}}],
78
+ :@line=>2}}],
79
+ :@line=>1}}
80
+
81
+ ruby.should parse_as(ast)
82
+ end
83
+
84
+ it 'should correctly parse "undef :x, :y, :z; f2"' do
85
+ ruby = <<-ruby
86
+ undef :x, :y, :z
87
+ f2
88
+ ruby
89
+ ast = {:block=>
90
+ {:@array=>
91
+ [{:undef=>{:@name=>{:symbolliteral=>{:@line=>1, :@value=>:x}}, :@line=>1}},
92
+ {:undef=>{:@name=>{:symbolliteral=>{:@line=>1, :@value=>:y}}, :@line=>1}},
93
+ {:undef=>{:@name=>{:symbolliteral=>{:@line=>1, :@value=>:z}}, :@line=>1}},
94
+ {:send=>
95
+ {:@block=>nil,
96
+ :@name=>:f2,
97
+ :@line=>2,
98
+ :@privately=>true,
99
+ :@receiver=>{:self=>{:@line=>2}},
100
+ :@check_for_local=>false}}],
101
+ :@line=>1}}
102
+
103
+ ruby.should parse_as(ast)
104
+ end
105
+
106
+ it 'should correctly parse "f1; undef :x, :y, :z"' do
107
+ ruby = <<-ruby
108
+ f1
109
+ undef :x, :y, :z
110
+ ruby
111
+ ast = {:block=>
112
+ {:@array=>
113
+ [{:send=>
114
+ {:@block=>nil,
115
+ :@name=>:f1,
116
+ :@line=>1,
117
+ :@privately=>true,
118
+ :@receiver=>{:self=>{:@line=>1}},
119
+ :@check_for_local=>false}},
120
+ {:block=>
121
+ {:@array=>
122
+ [{:undef=>
123
+ {:@name=>{:symbolliteral=>{:@line=>2, :@value=>:x}}, :@line=>2}},
124
+ {:undef=>
125
+ {:@name=>{:symbolliteral=>{:@line=>2, :@value=>:y}}, :@line=>2}},
126
+ {:undef=>
127
+ {:@name=>{:symbolliteral=>{:@line=>2, :@value=>:z}}, :@line=>2}}],
128
+ :@line=>2}}],
129
+ :@line=>1}}
130
+
131
+ ruby.should parse_as(ast)
132
+ end
133
+
134
+ it 'should correctly parse "f1; undef :x, :y, :z; f2"' do
135
+ ruby = <<-ruby
136
+ f1
137
+ undef :x, :y, :z
138
+ f2
139
+ ruby
140
+ ast = {:block=>
141
+ {:@array=>
142
+ [{:send=>
143
+ {:@block=>nil,
144
+ :@name=>:f1,
145
+ :@line=>1,
146
+ :@privately=>true,
147
+ :@receiver=>{:self=>{:@line=>1}},
148
+ :@check_for_local=>false}},
149
+ {:block=>
150
+ {:@array=>
151
+ [{:undef=>
152
+ {:@name=>{:symbolliteral=>{:@line=>2, :@value=>:x}}, :@line=>2}},
153
+ {:undef=>
154
+ {:@name=>{:symbolliteral=>{:@line=>2, :@value=>:y}}, :@line=>2}},
155
+ {:undef=>
156
+ {:@name=>{:symbolliteral=>{:@line=>2, :@value=>:z}}, :@line=>2}}],
157
+ :@line=>2}},
158
+ {:send=>
159
+ {:@block=>nil,
160
+ :@name=>:f2,
161
+ :@line=>3,
162
+ :@privately=>true,
163
+ :@receiver=>{:self=>{:@line=>3}},
164
+ :@check_for_local=>false}}],
165
+ :@line=>1}}
166
+
167
+ ruby.should parse_as(ast)
168
+ end
169
+
170
+ it 'should correctly parse "class B; undef :blah; end"' do
171
+ ruby = 'class B; undef :blah; end'
172
+ ast = {:class=>
173
+ {:@superclass=>{},
174
+ :@body=>
175
+ {:classscope=>
176
+ {:@body=>
177
+ {:block=>
178
+ {:@array=>
179
+ [{:undef=>
180
+ {:@name=>{:symbolliteral=>{:@line=>1, :@value=>:blah}},
181
+ :@line=>1}}],
182
+ :@line=>1}},
183
+ :@name=>:B,
184
+ :@line=>1}},
185
+ :@name=>{:classname=>{:@superclass=>{}, :@name=>:B, :@line=>1}},
186
+ :@line=>1}}
187
+
188
+ ruby.should parse_as(ast)
189
+ end
190
+
191
+ it 'should correctly parse "undef :"x#{1}", :"x#{2}""' do
192
+ ruby = <<-ruby
193
+ undef :"x\#{1}", :"x\#{2}"
194
+ ruby
195
+ ast = {:block=>
196
+ {:@array=>
197
+ [{:undef=>
198
+ {:@name=>
199
+ {:dynamicsymbol=>
200
+ {:@string=>:x,
201
+ :@array=>
202
+ [{:tostring=>
203
+ {:@line=>1,
204
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}}],
205
+ :@line=>1}},
206
+ :@line=>1}},
207
+ {:undef=>
208
+ {:@name=>
209
+ {:dynamicsymbol=>
210
+ {:@string=>:x,
211
+ :@array=>
212
+ [{:tostring=>
213
+ {:@line=>1,
214
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>2}}}}],
215
+ :@line=>1}},
216
+ :@line=>1}}],
217
+ :@line=>1}}
218
+
219
+ ruby.should parse_as(ast)
220
+ end
221
+
222
+ end