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