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,47 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "/x/ =~ "blah""' do
6
+ ruby = '/x/ =~ "blah"'
7
+ ast = {:match2=>
8
+ {:@line=>1,
9
+ :@value=>{:stringliteral=>{:@string=>:blah, :@line=>1}},
10
+ :@pattern=>{:regexliteral=>{:@source=>:x, :@options=>0, :@line=>1}}}}
11
+
12
+ ruby.should parse_as(ast)
13
+ end
14
+
15
+ it 'should correctly parse "x = "x"; /#{x}/ =~ x"' do
16
+ ruby = <<-ruby
17
+ x = "x"
18
+ /\#{x}/ =~ x
19
+ ruby
20
+ ast = {:block=>
21
+ {:@array=>
22
+ [{:localvariableassignment=>
23
+ {:@variable=>nil,
24
+ :@name=>:x,
25
+ :@line=>1,
26
+ :@value=>{:stringliteral=>{:@string=>:x, :@line=>1}}}},
27
+ {:match2=>
28
+ {:@line=>2,
29
+ :@value=>
30
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:x, :@line=>2}},
31
+ :@pattern=>
32
+ {:dynamicregex=>
33
+ {:@string=>:"<blank>",
34
+ :@array=>
35
+ [{:tostring=>
36
+ {:@line=>2,
37
+ :@value=>
38
+ {:localvariableaccess=>
39
+ {:@variable=>nil, :@name=>:x, :@line=>2}}}}],
40
+ :@options=>0,
41
+ :@line=>2}}}}],
42
+ :@line=>1}}
43
+
44
+ ruby.should parse_as(ast)
45
+ end
46
+
47
+ end
@@ -0,0 +1,54 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse ""blah" =~ /x/"' do
6
+ ruby = '"blah" =~ /x/'
7
+ ast = {:match3=>
8
+ {:@line=>1,
9
+ :@value=>{:stringliteral=>{:@string=>:blah, :@line=>1}},
10
+ :@pattern=>{:regexliteral=>{:@source=>:x, :@options=>0, :@line=>1}}}}
11
+
12
+ ruby.should parse_as(ast)
13
+ end
14
+
15
+ it 'should correctly parse "a = "abc"; if a =~ /#{a}/ ..."' do
16
+ ruby = <<-ruby
17
+ a = 'abc'
18
+ if a =~ /\#{a}/
19
+ 1
20
+ end
21
+ ruby
22
+ ast = {:block=>
23
+ {:@array=>
24
+ [{:localvariableassignment=>
25
+ {:@variable=>nil,
26
+ :@name=>:a,
27
+ :@line=>1,
28
+ :@value=>{:stringliteral=>{:@string=>:abc, :@line=>1}}}},
29
+ {:if=>
30
+ {:@body=>{:fixnumliteral=>{:@line=>3, :@value=>1}},
31
+ :@condition=>
32
+ {:match3=>
33
+ {:@line=>2,
34
+ :@value=>
35
+ {:localvariableaccess=>{:@variable=>nil, :@name=>:a, :@line=>2}},
36
+ :@pattern=>
37
+ {:dynamicregex=>
38
+ {:@string=>:"<blank>",
39
+ :@array=>
40
+ [{:tostring=>
41
+ {:@line=>2,
42
+ :@value=>
43
+ {:localvariableaccess=>
44
+ {:@variable=>nil, :@name=>:a, :@line=>2}}}}],
45
+ :@options=>0,
46
+ :@line=>2}}}},
47
+ :@else=>{},
48
+ :@line=>2}}],
49
+ :@line=>1}}
50
+
51
+ ruby.should parse_as(ast)
52
+ end
53
+
54
+ end
@@ -0,0 +1,19 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "1 if /x/"' do
6
+ ruby = '1 if /x/'
7
+ ast = {:if=>
8
+ {:@body=>{:fixnumliteral=>{:@line=>1, :@value=>1}},
9
+ :@condition=>
10
+ {:match=>
11
+ {:@line=>1,
12
+ :@pattern=>{:regexliteral=>{:@source=>:x, :@options=>0, :@line=>1}}}},
13
+ :@else=>{},
14
+ :@line=>1}}
15
+
16
+ ruby.should parse_as(ast)
17
+ end
18
+
19
+ end
@@ -0,0 +1,102 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "module X; def y; end; end"' do
6
+ ruby = <<-ruby
7
+ module X
8
+ def y
9
+ end
10
+ end
11
+ ruby
12
+ ast = {:module=>
13
+ {:@body=>
14
+ {:modulescope=>
15
+ {:@body=>
16
+ {:block=>
17
+ {:@array=>
18
+ [{:define=>
19
+ {:@body=>{:block=>{:@array=>[{}], :@line=>2}},
20
+ :@name=>:y,
21
+ :@line=>2,
22
+ :@arguments=>
23
+ {:formalarguments=>
24
+ {:@block_arg=>nil,
25
+ :@names=>[],
26
+ :@defaults=>nil,
27
+ :@optional=>[],
28
+ :@splat=>nil,
29
+ :@line=>2,
30
+ :@required=>[]}}}}],
31
+ :@line=>4}},
32
+ :@name=>:X,
33
+ :@line=>1}},
34
+ :@name=>{:modulename=>{:@name=>:X, :@line=>1}},
35
+ :@line=>1}}
36
+
37
+ ruby.should parse_as(ast)
38
+ end
39
+
40
+ it 'should correctly parse "module ::Y; c; end"' do
41
+ ruby = <<-ruby
42
+ module ::Y
43
+ c
44
+ end
45
+ ruby
46
+ ast = {:module=>
47
+ {:@body=>
48
+ {:modulescope=>
49
+ {:@body=>
50
+ {:block=>
51
+ {:@array=>
52
+ [{:send=>
53
+ {:@block=>nil,
54
+ :@name=>:c,
55
+ :@line=>2,
56
+ :@privately=>true,
57
+ :@receiver=>{:self=>{:@line=>2}},
58
+ :@check_for_local=>false}}],
59
+ :@line=>3}},
60
+ :@name=>:Y,
61
+ :@line=>1}},
62
+ :@name=>
63
+ {:scopedmodulename=>
64
+ {:@parent=>{:toplevel=>{:@line=>1}}, :@name=>:Y, :@line=>1}},
65
+ :@line=>1}}
66
+
67
+ ruby.should parse_as(ast)
68
+ end
69
+
70
+ it 'should correctly parse "modue X::Y; c; end"' do
71
+ ruby = <<-ruby
72
+ module X::Y
73
+ c
74
+ end
75
+ ruby
76
+ ast = {:module=>
77
+ {:@body=>
78
+ {:modulescope=>
79
+ {:@body=>
80
+ {:block=>
81
+ {:@array=>
82
+ [{:send=>
83
+ {:@block=>nil,
84
+ :@name=>:c,
85
+ :@line=>2,
86
+ :@privately=>true,
87
+ :@receiver=>{:self=>{:@line=>2}},
88
+ :@check_for_local=>false}}],
89
+ :@line=>3}},
90
+ :@name=>:Y,
91
+ :@line=>1}},
92
+ :@name=>
93
+ {:scopedmodulename=>
94
+ {:@parent=>{:constfind=>{:@name=>:X, :@line=>1}},
95
+ :@name=>:Y,
96
+ :@line=>1}},
97
+ :@line=>1}}
98
+
99
+ ruby.should parse_as(ast)
100
+ end
101
+
102
+ end
@@ -0,0 +1,13 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "nil"' do
6
+ ruby = 'nil'
7
+ # Melbourne::AST::ReducedGraph doesn't explicitely return data for nil nodes
8
+ ast = {}
9
+
10
+ ruby.should parse_as(ast)
11
+ end
12
+
13
+ end
@@ -0,0 +1,39 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "(not true)"' do
6
+ ruby = '(not true)'
7
+ ast = {:not=>{:@line=>1, :@value=>{:true=>{:@line=>1}}}}
8
+
9
+ ruby.should parse_as(ast)
10
+ end
11
+
12
+ it 'should correctly parse "a = 1; b = !a"' do
13
+ ruby = <<-ruby
14
+ a = 1
15
+ b = !a
16
+ ruby
17
+ ast = {:block=>
18
+ {:@array=>
19
+ [{:localvariableassignment=>
20
+ {:@variable=>nil,
21
+ :@name=>:a,
22
+ :@line=>1,
23
+ :@value=>{:fixnumliteral=>{:@line=>1, :@value=>1}}}},
24
+ {:localvariableassignment=>
25
+ {:@variable=>nil,
26
+ :@name=>:b,
27
+ :@line=>2,
28
+ :@value=>
29
+ {:not=>
30
+ {:@line=>2,
31
+ :@value=>
32
+ {:localvariableaccess=>
33
+ {:@variable=>nil, :@name=>:a, :@line=>2}}}}}}],
34
+ :@line=>1}}
35
+
36
+ ruby.should parse_as(ast)
37
+ end
38
+
39
+ end
@@ -0,0 +1,12 @@
1
+ require File.dirname(__FILE__) + '/../../spec_helper'
2
+
3
+ describe Melbourne::Parser do
4
+
5
+ it 'should correctly parse "$1"' do
6
+ ruby = '$1'
7
+ ast = {:nthref=>{:@line=>1, :@which=>1}}
8
+
9
+ ruby.should parse_as(ast)
10
+ end
11
+
12
+ end