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,151 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "return"' do
6
+ ruby = 'return'
7
+ ast = {:return=>{:@splat=>nil, :@line=>1, :@value=>nil}}
8
+
9
+ ruby.should parse_as(ast)
10
+ end
11
+
12
+ it 'should correctly parse "return 1"' do
13
+ ruby = 'return 1'
14
+ ast = {:return=>
15
+ {:@splat=>nil,
16
+ :@line=>1,
17
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}}
18
+
19
+ ruby.should parse_as(ast)
20
+ end
21
+
22
+ it 'should correctly parse "return *1"' do
23
+ ruby = 'return *1'
24
+ ast = {:return=>
25
+ {:@splat=>nil,
26
+ :@line=>1,
27
+ :@value=>
28
+ {:svalue=>
29
+ {:@line=>1,
30
+ :@value=>
31
+ {:splatvalue=>
32
+ {:@line=>1, :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}}}}}}
33
+
34
+ ruby.should parse_as(ast)
35
+ end
36
+
37
+ it 'should correctly parse "x = 1, 2; return *x"' do
38
+ ruby = <<-ruby
39
+ x = 1, 2
40
+ return *x
41
+ ruby
42
+ ast = {:block=>
43
+ {:@array=>
44
+ [{:localvariableassignment=>
45
+ {:@variable=>nil,
46
+ :@name=>:x,
47
+ :@line=>1,
48
+ :@value=>
49
+ {:svalue=>
50
+ {:@line=>1,
51
+ :@value=>
52
+ {:arrayliteral=>
53
+ {:@body=>
54
+ [{:fixnumliteral=>{:@line=>1, :@value=>1}},
55
+ {:fixnumliteral=>{:@line=>1, :@value=>2}}],
56
+ :@line=>1}}}}}},
57
+ {:return=>
58
+ {:@splat=>nil,
59
+ :@line=>2,
60
+ :@value=>
61
+ {:svalue=>
62
+ {:@line=>2,
63
+ :@value=>
64
+ {:splatvalue=>
65
+ {:@line=>2,
66
+ :@value=>
67
+ {:localvariableaccess=>
68
+ {:@variable=>nil, :@name=>:x, :@line=>2}}}}}}}}],
69
+ :@line=>1}}
70
+
71
+ ruby.should parse_as(ast)
72
+ end
73
+
74
+ it 'should correctly parse "return 1, 2, 3"' do
75
+ ruby = 'return 1, 2, 3'
76
+ ast = {:return=>
77
+ {:@splat=>nil,
78
+ :@line=>1,
79
+ :@value=>
80
+ {:arrayliteral=>
81
+ {:@body=>
82
+ [{:fixnumliteral=>{:@line=>1, :@value=>1}},
83
+ {:fixnumliteral=>{:@line=>1, :@value=>2}},
84
+ {:fixnumliteral=>{:@line=>1, :@value=>3}}],
85
+ :@line=>1}}}}
86
+
87
+ ruby.should parse_as(ast)
88
+ end
89
+
90
+ it 'should correctly parse "return 1, 2, *c"' do
91
+ ruby = 'return 1, 2, *c'
92
+ ast = {:return=>
93
+ {:@splat=>nil,
94
+ :@line=>1,
95
+ :@value=>
96
+ {:concatargs=>
97
+ {:@array=>
98
+ {:arrayliteral=>
99
+ {:@body=>
100
+ [{:fixnumliteral=>{:@line=>1, :@value=>1}},
101
+ {:fixnumliteral=>{:@line=>1, :@value=>2}}],
102
+ :@line=>1}},
103
+ :@size=>2,
104
+ :@rest=>
105
+ {:send=>
106
+ {:@block=>nil,
107
+ :@name=>:c,
108
+ :@line=>1,
109
+ :@privately=>true,
110
+ :@receiver=>{:self=>{:@line=>1}},
111
+ :@check_for_local=>false}},
112
+ :@line=>1}}}}
113
+
114
+ ruby.should parse_as(ast)
115
+ end
116
+
117
+ it 'should correctly parse "return [*[1]]"' do
118
+ ruby = 'return [*[1]]'
119
+ ast = {:return=>
120
+ {:@splat=>nil,
121
+ :@line=>1,
122
+ :@value=>
123
+ {:splatvalue=>
124
+ {:@line=>1,
125
+ :@value=>
126
+ {:arrayliteral=>
127
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}], :@line=>1}}}}}}
128
+
129
+ ruby.should parse_as(ast)
130
+ end
131
+
132
+ it 'should correctly parse "return *[1]"' do
133
+ ruby = 'return *[1]'
134
+ ast = {:return=>
135
+ {:@splat=>nil,
136
+ :@line=>1,
137
+ :@value=>
138
+ {:svalue=>
139
+ {:@line=>1,
140
+ :@value=>
141
+ {:splatvalue=>
142
+ {:@line=>1,
143
+ :@value=>
144
+ {:arrayliteral=>
145
+ {:@body=>[{:fixnumliteral=>{:@line=>1, :@value=>1}}],
146
+ :@line=>1}}}}}}}}
147
+
148
+ ruby.should parse_as(ast)
149
+ end
150
+
151
+ end
@@ -0,0 +1,172 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "class << self; 42; end"' do
6
+ ruby = <<-ruby
7
+ class << self
8
+ 42
9
+ end
10
+ ruby
11
+ ast = {:sclass=>
12
+ {:@body=>
13
+ {:sclassscope=>
14
+ {:@body=>
15
+ {:block=>
16
+ {:@array=>[{:fixnumliteral=>{:@line=>2, :@value=>42}}], :@line=>3}},
17
+ :@name=>nil,
18
+ :@line=>1}},
19
+ :@line=>1,
20
+ :@receiver=>{:self=>{:@line=>1}}}}
21
+
22
+ ruby.should parse_as(ast)
23
+ end
24
+
25
+ it 'should correctly parse "class A; class << self ... end; class B; end ..."' do
26
+ ruby = <<-ruby
27
+ class A
28
+ class << self
29
+ a
30
+ end
31
+ class B
32
+ end
33
+ end
34
+ ruby
35
+ ast = {:class=>
36
+ {:@superclass=>{},
37
+ :@body=>
38
+ {:classscope=>
39
+ {:@body=>
40
+ {:block=>
41
+ {:@array=>
42
+ [{:sclass=>
43
+ {:@body=>
44
+ {:sclassscope=>
45
+ {:@body=>
46
+ {:block=>
47
+ {:@array=>
48
+ [{:send=>
49
+ {:@block=>nil,
50
+ :@name=>:a,
51
+ :@line=>3,
52
+ :@privately=>true,
53
+ :@receiver=>{:self=>{:@line=>3}},
54
+ :@check_for_local=>false}}],
55
+ :@line=>4}},
56
+ :@name=>nil,
57
+ :@line=>2}},
58
+ :@line=>2,
59
+ :@receiver=>{:self=>{:@line=>2}}}},
60
+ {:class=>
61
+ {:@superclass=>{},
62
+ :@body=>{:emptybody=>{:@line=>5}},
63
+ :@name=>
64
+ {:classname=>{:@superclass=>{}, :@name=>:B, :@line=>5}},
65
+ :@line=>5}}],
66
+ :@line=>2}},
67
+ :@name=>:A,
68
+ :@line=>1}},
69
+ :@name=>{:classname=>{:@superclass=>{}, :@name=>:A, :@line=>1}},
70
+ :@line=>1}}
71
+
72
+ ruby.should parse_as(ast)
73
+ end
74
+
75
+ it 'should correctly parse "x = "a"; class << x; end"' do
76
+ ruby = <<-ruby
77
+ x = "a"
78
+ class << x
79
+ end
80
+ ruby
81
+ ast = {:block=>
82
+ {:@array=>
83
+ [{:localvariableassignment=>
84
+ {:@variable=>nil,
85
+ :@name=>:x,
86
+ :@line=>1,
87
+ :@value=>{:stringliteral=>{:@string=>:a, :@line=>1}}}},
88
+ {:sclass=>
89
+ {:@body=>{:sclassscope=>{:@body=>nil, :@name=>nil, :@line=>2}},
90
+ :@line=>2,
91
+ :@receiver=>
92
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:x, :@line=>2}}}}],
93
+ :@line=>1}}
94
+
95
+ ruby.should parse_as(ast)
96
+ end
97
+
98
+ it 'should correctly parse "x = "a"; m do class << x ..."' do
99
+ ruby = <<-ruby
100
+ x = "a"
101
+ m do
102
+ class << x
103
+ end
104
+ end
105
+ ruby
106
+ ast = {:block=>
107
+ {:@array=>
108
+ [{:localvariableassignment=>
109
+ {:@variable=>nil,
110
+ :@name=>:x,
111
+ :@line=>1,
112
+ :@value=>{:stringliteral=>{:@string=>:a, :@line=>1}}}},
113
+ {:send=>
114
+ {:@block=>
115
+ {:iter=>
116
+ {:@body=>
117
+ {:sclass=>
118
+ {:@body=>{:sclassscope=>{:@body=>nil, :@name=>nil, :@line=>3}},
119
+ :@line=>3,
120
+ :@receiver=>
121
+ {:localvariableaccess=>
122
+ {:@variable=>nil, :@name=>:x, :@line=>3}}}},
123
+ :@line=>2,
124
+ :@arguments=>
125
+ {:iterarguments=>
126
+ {:@block=>nil,
127
+ :@arity=>-1,
128
+ :@prelude=>nil,
129
+ :@optional=>0,
130
+ :@splat=>nil,
131
+ :@line=>2,
132
+ :@splat_index=>-2,
133
+ :@required_args=>0}}}},
134
+ :@name=>:m,
135
+ :@line=>2,
136
+ :@privately=>true,
137
+ :@receiver=>{:self=>{:@line=>2}},
138
+ :@check_for_local=>false}}],
139
+ :@line=>1}}
140
+
141
+ ruby.should parse_as(ast)
142
+ end
143
+
144
+ it 'should correctly parse "x = "a"; class << x ..."' do
145
+ ruby = <<-ruby
146
+ x = "a"
147
+ class << x
148
+ self
149
+ end
150
+ ruby
151
+ ast = {:block=>
152
+ {:@array=>
153
+ [{:localvariableassignment=>
154
+ {:@variable=>nil,
155
+ :@name=>:x,
156
+ :@line=>1,
157
+ :@value=>{:stringliteral=>{:@string=>:a, :@line=>1}}}},
158
+ {:sclass=>
159
+ {:@body=>
160
+ {:sclassscope=>
161
+ {:@body=>{:block=>{:@array=>[{:self=>{:@line=>3}}], :@line=>4}},
162
+ :@name=>nil,
163
+ :@line=>2}},
164
+ :@line=>2,
165
+ :@receiver=>
166
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:x, :@line=>2}}}}],
167
+ :@line=>1}}
168
+
169
+ ruby.should parse_as(ast)
170
+ end
171
+
172
+ end
@@ -0,0 +1,162 @@
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 = {:send=>
8
+ {:@block=>nil,
9
+ :@name=>:x,
10
+ :@line=>1,
11
+ :@privately=>true,
12
+ :@receiver=>{:self=>{:@line=>1}},
13
+ :@check_for_local=>false}}
14
+
15
+ ruby.should parse_as(ast)
16
+ end
17
+
18
+ it 'should correctly parse ""before" \ ..."' do
19
+ ruby = <<-ruby
20
+ "before" \
21
+ " after"
22
+ ruby
23
+ ast = {:stringliteral=>{:@string=>:"before after", :@line=>1}}
24
+
25
+ ruby.should parse_as(ast)
26
+ end
27
+
28
+ it 'should correctly parse ""before" " after""' do
29
+ ruby = '"before" " after"'
30
+ ast = {:stringliteral=>{:@string=>:"before after", :@line=>1}}
31
+
32
+ ruby.should parse_as(ast)
33
+ end
34
+
35
+ it 'should correctly parse ""file = #{__FILE__}\n""' do
36
+ ruby = <<-ruby
37
+ "file = \#{__FILE__}\n"
38
+ ruby
39
+ ast = {:dynamicstring=>
40
+ {:@string=>:"file = ",
41
+ :@array=>
42
+ [{:tostring=>{:@line=>1, :@value=>{:file=>{:@line=>1}}}},
43
+ {:stringliteral=>{:@string=>:"\n", :@line=>2}}],
44
+ :@line=>1}}
45
+
46
+ ruby.should parse_as(ast)
47
+ end
48
+
49
+ it 'should correctly parse "<<\'EOM\'.strip ..."' do
50
+ ruby = <<-ruby
51
+ <<'EOM'.strip
52
+ blah
53
+ blah
54
+ EOM
55
+ ruby
56
+ ast = {:send=>
57
+ {:@block=>nil,
58
+ :@name=>:strip,
59
+ :@line=>1,
60
+ :@privately=>false,
61
+ :@receiver=>{:stringliteral=>{:@string=>:" blah\n blah\n", :@line=>1}},
62
+ :@check_for_local=>false}}
63
+
64
+ ruby.should parse_as(ast)
65
+ end
66
+
67
+ it 'should correctly parse "a += <<-H1 + b + <<-H2 ..."' do
68
+ ruby = <<-ruby
69
+ a += <<-H1 + b + <<-H2
70
+ first
71
+ H1
72
+ second
73
+ H2
74
+ ruby
75
+ ast = {:localvariableassignment=>
76
+ {:@variable=>nil,
77
+ :@name=>:a,
78
+ :@line=>1,
79
+ :@value=>
80
+ {:sendwitharguments=>
81
+ {:@block=>nil,
82
+ :@name=>:+,
83
+ :@line=>1,
84
+ :@privately=>false,
85
+ :@receiver=>
86
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:a, :@line=>1}},
87
+ :@check_for_local=>false,
88
+ :@arguments=>
89
+ {:actualarguments=>
90
+ {:@array=>
91
+ [{:sendwitharguments=>
92
+ {:@block=>nil,
93
+ :@name=>:+,
94
+ :@line=>1,
95
+ :@privately=>false,
96
+ :@receiver=>
97
+ {:sendwitharguments=>
98
+ {:@block=>nil,
99
+ :@name=>:+,
100
+ :@line=>1,
101
+ :@privately=>false,
102
+ :@receiver=>
103
+ {:stringliteral=>{:@string=>:" first\n", :@line=>1}},
104
+ :@check_for_local=>false,
105
+ :@arguments=>
106
+ {:actualarguments=>
107
+ {:@array=>
108
+ [{:send=>
109
+ {:@block=>nil,
110
+ :@name=>:b,
111
+ :@line=>1,
112
+ :@privately=>true,
113
+ :@receiver=>{:self=>{:@line=>1}},
114
+ :@check_for_local=>false}}],
115
+ :@splat=>nil,
116
+ :@line=>1}}}},
117
+ :@check_for_local=>false,
118
+ :@arguments=>
119
+ {:actualarguments=>
120
+ {:@array=>
121
+ [{:stringliteral=>{:@string=>:" second\n", :@line=>1}}],
122
+ :@splat=>nil,
123
+ :@line=>1}}}}],
124
+ :@splat=>nil,
125
+ :@line=>1}}}}}}
126
+
127
+ ruby.should parse_as(ast)
128
+ end
129
+
130
+ it 'should correctly parse "<<-EOM ..."' do
131
+ ruby = <<-ruby
132
+ <<-EOM
133
+ blah
134
+ blah
135
+
136
+ EOM
137
+ ruby
138
+ ast = {:stringliteral=>{:@string=>:" blah\nblah\n\n", :@line=>1}}
139
+
140
+ ruby.should parse_as(ast)
141
+ end
142
+
143
+ it 'should correctly parse "<<\'EOM\' ..."' do
144
+ ruby = <<-ruby
145
+ <<'EOM'
146
+ blah
147
+ blah
148
+ EOM
149
+ ruby
150
+ ast = {:stringliteral=>{:@string=>:" blah\nblah\n", :@line=>1}}
151
+
152
+ ruby.should parse_as(ast)
153
+ end
154
+
155
+ it 'should correctly parse "%(blah)"' do
156
+ ruby = '%(blah)'
157
+ ast = {:stringliteral=>{:@string=>:blah, :@line=>1}}
158
+
159
+ ruby.should parse_as(ast)
160
+ end
161
+
162
+ end