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