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,221 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "class X ..."' do
6
+ ruby = <<-ruby
7
+ class X
8
+ puts((1 + 1))
9
+ def blah
10
+ puts("hello")
11
+ end
12
+ end
13
+ ruby
14
+ ast = {:class=>
15
+ {:@superclass=>{},
16
+ :@body=>
17
+ {:classscope=>
18
+ {:@body=>
19
+ {:block=>
20
+ {:@array=>
21
+ [{:sendwitharguments=>
22
+ {:@block=>nil,
23
+ :@name=>:puts,
24
+ :@line=>2,
25
+ :@privately=>true,
26
+ :@receiver=>{:self=>{:@line=>2}},
27
+ :@check_for_local=>false,
28
+ :@arguments=>
29
+ {:actualarguments=>
30
+ {:@array=>
31
+ [{:sendwitharguments=>
32
+ {:@block=>nil,
33
+ :@name=>:+,
34
+ :@line=>2,
35
+ :@privately=>false,
36
+ :@receiver=>{:fixnumliteral=>{:@line=>2, :@value=>1}},
37
+ :@check_for_local=>false,
38
+ :@arguments=>
39
+ {:actualarguments=>
40
+ {:@array=>
41
+ [{:fixnumliteral=>{:@line=>2, :@value=>1}}],
42
+ :@splat=>nil,
43
+ :@line=>2}}}}],
44
+ :@splat=>nil,
45
+ :@line=>2}}}},
46
+ {:define=>
47
+ {:@body=>
48
+ {:block=>
49
+ {:@array=>
50
+ [{:sendwitharguments=>
51
+ {:@block=>nil,
52
+ :@name=>:puts,
53
+ :@line=>4,
54
+ :@privately=>true,
55
+ :@receiver=>{:self=>{:@line=>4}},
56
+ :@check_for_local=>false,
57
+ :@arguments=>
58
+ {:actualarguments=>
59
+ {:@array=>
60
+ [{:stringliteral=>
61
+ {:@string=>:hello, :@line=>4}}],
62
+ :@splat=>nil,
63
+ :@line=>4}}}}],
64
+ :@line=>3}},
65
+ :@name=>:blah,
66
+ :@line=>3,
67
+ :@arguments=>
68
+ {:formalarguments=>
69
+ {:@block_arg=>nil,
70
+ :@names=>[],
71
+ :@defaults=>nil,
72
+ :@optional=>[],
73
+ :@splat=>nil,
74
+ :@line=>3,
75
+ :@required=>[]}}}}],
76
+ :@line=>2}},
77
+ :@name=>:X,
78
+ :@line=>1}},
79
+ :@name=>{:classname=>{:@superclass=>{}, :@name=>:X, :@line=>1}},
80
+ :@line=>1}}
81
+
82
+ ruby.should parse_as(ast)
83
+ end
84
+
85
+ it 'should correctly parse "class ::Y ..."' do
86
+ ruby = <<-ruby
87
+ class ::Y
88
+ c
89
+ end
90
+ ruby
91
+ ast = {:class=>
92
+ {:@superclass=>{},
93
+ :@body=>
94
+ {:classscope=>
95
+ {:@body=>
96
+ {:block=>
97
+ {:@array=>
98
+ [{:send=>
99
+ {:@block=>nil,
100
+ :@name=>:c,
101
+ :@line=>2,
102
+ :@privately=>true,
103
+ :@receiver=>{:self=>{:@line=>2}},
104
+ :@check_for_local=>false}}],
105
+ :@line=>3}},
106
+ :@name=>:Y,
107
+ :@line=>1}},
108
+ :@name=>
109
+ {:scopedclassname=>
110
+ {:@superclass=>{},
111
+ :@parent=>{:toplevel=>{:@line=>1}},
112
+ :@name=>:Y,
113
+ :@line=>1}},
114
+ :@line=>1}}
115
+
116
+ ruby.should parse_as(ast)
117
+ end
118
+
119
+ it 'should correctly parse "class X::Y ..."' do
120
+ ruby = <<-ruby
121
+ class X::Y
122
+ c
123
+ end
124
+ ruby
125
+ ast = {:class=>
126
+ {:@superclass=>{},
127
+ :@body=>
128
+ {:classscope=>
129
+ {:@body=>
130
+ {:block=>
131
+ {:@array=>
132
+ [{:send=>
133
+ {:@block=>nil,
134
+ :@name=>:c,
135
+ :@line=>2,
136
+ :@privately=>true,
137
+ :@receiver=>{:self=>{:@line=>2}},
138
+ :@check_for_local=>false}}],
139
+ :@line=>3}},
140
+ :@name=>:Y,
141
+ :@line=>1}},
142
+ :@name=>
143
+ {:scopedclassname=>
144
+ {:@superclass=>{},
145
+ :@parent=>{:constfind=>{:@name=>:X, :@line=>1}},
146
+ :@name=>:Y,
147
+ :@line=>1}},
148
+ :@line=>1}}
149
+
150
+ ruby.should parse_as(ast)
151
+ end
152
+
153
+ it 'should correctly parse "class X < Array; end"' do
154
+ ruby = <<-ruby
155
+ class X < Array
156
+ end
157
+ ruby
158
+ ast = {:class=>
159
+ {:@superclass=>{:constfind=>{:@name=>:Array, :@line=>1}},
160
+ :@body=>{:emptybody=>{:@line=>1}},
161
+ :@name=>
162
+ {:classname=>
163
+ {:@superclass=>{:constfind=>{:@name=>:Array, :@line=>1}},
164
+ :@name=>:X,
165
+ :@line=>1}},
166
+ :@line=>1}}
167
+
168
+ ruby.should parse_as(ast)
169
+ end
170
+
171
+ it 'should correctly parse "class X < expr; end"' do
172
+ ruby = <<-ruby
173
+ class X < expr
174
+ end
175
+ ruby
176
+ ast = {:class=>
177
+ {:@superclass=>
178
+ {:send=>
179
+ {:@block=>nil,
180
+ :@name=>:expr,
181
+ :@line=>1,
182
+ :@privately=>true,
183
+ :@receiver=>{:self=>{:@line=>1}},
184
+ :@check_for_local=>false}},
185
+ :@body=>{:emptybody=>{:@line=>1}},
186
+ :@name=>
187
+ {:classname=>
188
+ {:@superclass=>
189
+ {:send=>
190
+ {:@block=>nil,
191
+ :@name=>:expr,
192
+ :@line=>1,
193
+ :@privately=>true,
194
+ :@receiver=>{:self=>{:@line=>1}},
195
+ :@check_for_local=>false}},
196
+ :@name=>:X,
197
+ :@line=>1}},
198
+ :@line=>1}}
199
+
200
+ ruby.should parse_as(ast)
201
+ end
202
+
203
+ it 'should correctly parse "class X < Object; end"' do
204
+ ruby = <<-ruby
205
+ class X < Object
206
+ end
207
+ ruby
208
+ ast = {:class=>
209
+ {:@superclass=>{:constfind=>{:@name=>:Object, :@line=>1}},
210
+ :@body=>{:emptybody=>{:@line=>1}},
211
+ :@name=>
212
+ {:classname=>
213
+ {:@superclass=>{:constfind=>{:@name=>:Object, :@line=>1}},
214
+ :@name=>:X,
215
+ :@line=>1}},
216
+ :@line=>1}}
217
+
218
+ ruby.should parse_as(ast)
219
+ end
220
+
221
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "X::Y"' do
6
+ ruby = 'X::Y'
7
+ ast = {:constaccess=>
8
+ {:@parent=>{:constfind=>{:@name=>:X, :@line=>1}}, :@name=>:Y, :@line=>1}}
9
+
10
+ ruby.should parse_as(ast)
11
+ end
12
+
13
+ end
@@ -0,0 +1,12 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "::X"' do
6
+ ruby = '::X'
7
+ ast = {:constattop=>{:@parent=>{:toplevel=>{:@line=>1}}, :@name=>:X, :@line=>1}}
8
+
9
+ ruby.should parse_as(ast)
10
+ end
11
+
12
+ end
@@ -0,0 +1,12 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "X"' do
6
+ ruby = 'X'
7
+ ast = {:constfind=>{:@name=>:X, :@line=>1}}
8
+
9
+ ruby.should parse_as(ast)
10
+ end
11
+
12
+ end
@@ -0,0 +1,55 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "@@x"' do
6
+ ruby = '@@x'
7
+ ast = {:classvariableaccess=>{:@name=>:@@x, :@line=>1}}
8
+
9
+ ruby.should parse_as(ast)
10
+ end
11
+
12
+ it 'should correctly parse "class A; @@a; end"' do
13
+ ruby = <<-ruby
14
+ class A
15
+ @@a
16
+ end
17
+ ruby
18
+ ast = {:class=>
19
+ {:@superclass=>{},
20
+ :@body=>
21
+ {:classscope=>
22
+ {:@body=>
23
+ {:block=>
24
+ {:@array=>[{:classvariableaccess=>{:@name=>:@@a, :@line=>2}}],
25
+ :@line=>3}},
26
+ :@name=>:A,
27
+ :@line=>1}},
28
+ :@name=>{:classname=>{:@superclass=>{}, :@name=>:A, :@line=>1}},
29
+ :@line=>1}}
30
+
31
+ ruby.should parse_as(ast)
32
+ end
33
+
34
+ it 'should correctly parse "module M; @@a; end"' do
35
+ ruby = <<-ruby
36
+ module M
37
+ @@a
38
+ end
39
+ ruby
40
+ ast = {:module=>
41
+ {:@body=>
42
+ {:modulescope=>
43
+ {:@body=>
44
+ {:block=>
45
+ {:@array=>[{:classvariableaccess=>{:@name=>:@@a, :@line=>2}}],
46
+ :@line=>3}},
47
+ :@name=>:M,
48
+ :@line=>1}},
49
+ :@name=>{:modulename=>{:@name=>:M, :@line=>1}},
50
+ :@line=>1}}
51
+
52
+ ruby.should parse_as(ast)
53
+ end
54
+
55
+ end
@@ -0,0 +1,71 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "def x; @@blah = 1; end"' do
6
+ ruby = <<-ruby
7
+ def x
8
+ @@blah = 1
9
+ end
10
+ ruby
11
+ ast = {:define=>
12
+ {:@body=>
13
+ {:block=>
14
+ {:@array=>
15
+ [{:classvariableassignment=>
16
+ {:@name=>:@@blah,
17
+ :@line=>2,
18
+ :@value=>{:fixnumliteral=>{:@line=>2, :@value=>1}}}}],
19
+ :@line=>1}},
20
+ :@name=>:x,
21
+ :@line=>1,
22
+ :@arguments=>
23
+ {:formalarguments=>
24
+ {:@block_arg=>nil,
25
+ :@names=>[],
26
+ :@defaults=>nil,
27
+ :@optional=>[],
28
+ :@splat=>nil,
29
+ :@line=>1,
30
+ :@required=>[]}}}}
31
+
32
+ ruby.should parse_as(ast)
33
+ end
34
+
35
+ it 'should correctly parse "def self.q ... @@q ..."' do
36
+ ruby = <<-ruby
37
+ def self.quiet_mode=(boolean)
38
+ @@quiet_mode = boolean
39
+ end
40
+ ruby
41
+ ast = {:definesingleton=>
42
+ {:@body=>
43
+ {:definesingletonscope=>
44
+ {:@body=>
45
+ {:block=>
46
+ {:@array=>
47
+ [{:classvariableassignment=>
48
+ {:@name=>:@@quiet_mode,
49
+ :@line=>2,
50
+ :@value=>
51
+ {:localvariableaccess=>
52
+ {:@variable=>nil, :@name=>:boolean, :@line=>2}}}}],
53
+ :@line=>1}},
54
+ :@name=>:quiet_mode=,
55
+ :@line=>1,
56
+ :@arguments=>
57
+ {:formalarguments=>
58
+ {:@block_arg=>nil,
59
+ :@names=>[:boolean],
60
+ :@defaults=>nil,
61
+ :@optional=>[],
62
+ :@splat=>nil,
63
+ :@line=>1,
64
+ :@required=>[:boolean]}}}},
65
+ :@line=>1,
66
+ :@receiver=>{:self=>{:@line=>1}}}}
67
+
68
+ ruby.should parse_as(ast)
69
+ end
70
+
71
+ end
@@ -0,0 +1,31 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "def x; @@blah = 1; end"' do
6
+ ruby = <<-ruby
7
+ class X
8
+ @@blah = 1
9
+ end
10
+ ruby
11
+ ast = {:class=>
12
+ {:@superclass=>{},
13
+ :@body=>
14
+ {:classscope=>
15
+ {:@body=>
16
+ {:block=>
17
+ {:@array=>
18
+ [{:classvariableassignment=>
19
+ {:@name=>:@@blah,
20
+ :@line=>2,
21
+ :@value=>{:fixnumliteral=>{:@line=>2, :@value=>1}}}}],
22
+ :@line=>3}},
23
+ :@name=>:X,
24
+ :@line=>1}},
25
+ :@name=>{:classname=>{:@superclass=>{}, :@name=>:X, :@line=>1}},
26
+ :@line=>1}}
27
+
28
+ ruby.should parse_as(ast)
29
+ end
30
+
31
+ end