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,251 @@
1
+ module Melbourne
2
+
3
+ module AST
4
+
5
+ # A back reference as in:
6
+ #
7
+ # $&
8
+ #
9
+ # or
10
+ #
11
+ # $'
12
+ #
13
+ class BackRef < Node
14
+
15
+ # The kind of back reference
16
+ #
17
+ attr_accessor :kind
18
+
19
+ def initialize(line, ref) #:nodoc:
20
+ @line = line
21
+ @kind = ref
22
+ end
23
+
24
+ end
25
+
26
+ # A reference to the nth match in a regular expression match result as in:
27
+ #
28
+ # $1
29
+ #
30
+ class NthRef < Node
31
+
32
+ # The number of the match that is referenced
33
+ #
34
+ attr_accessor :which
35
+
36
+ def initialize(line, ref) #:nodoc:
37
+ @line = line
38
+ @which = ref
39
+ end
40
+
41
+ end
42
+
43
+ class VariableAccess < Node #:nodoc:
44
+
45
+ attr_accessor :name
46
+
47
+ def initialize(line, name)
48
+ @line = line
49
+ @name = name
50
+ end
51
+
52
+ end
53
+
54
+ class VariableAssignment < Node #:nodoc:
55
+
56
+ attr_accessor :name, :value
57
+
58
+ def initialize(line, name, value)
59
+ @line = line
60
+ @name = name
61
+ @value = value
62
+ end
63
+
64
+ end
65
+
66
+ # Access of a class variable as in:
67
+ #
68
+ # puts @@var
69
+ #
70
+ class ClassVariableAccess < VariableAccess
71
+
72
+ end
73
+
74
+ # An assignment to a class variable as in:
75
+ #
76
+ # @@var = 1
77
+ #
78
+ class ClassVariableAssignment < VariableAssignment
79
+
80
+ end
81
+
82
+ class CVarDeclare < ClassVariableAssignment #:nodoc:
83
+
84
+ end
85
+
86
+ # Access of a global variable as in:
87
+ #
88
+ # $stderr
89
+ #
90
+ class GlobalVariableAccess < VariableAccess
91
+
92
+ end
93
+
94
+ # Assignment to a global variable as in:
95
+ #
96
+ # $x = 1
97
+ #
98
+ class GlobalVariableAssignment < VariableAssignment
99
+
100
+ end
101
+
102
+ # Assignment to a splat (<tt>*some</tt>) as in:
103
+ #
104
+ # *c = *[1, 2]
105
+ #
106
+ class SplatAssignment < Node
107
+
108
+ # The value being assigned to the splat
109
+ #
110
+ attr_accessor :value
111
+
112
+ def initialize(line, value) #:nodoc:
113
+ @line = line
114
+ @value = value
115
+ end
116
+
117
+ end
118
+
119
+ class SplatArray < SplatAssignment #:nodoc:
120
+
121
+ def initialize(line, value, size)
122
+ @line = line
123
+ @value = value
124
+ @size = size
125
+ end
126
+
127
+ end
128
+
129
+ class SplatWrapped < SplatAssignment #:nodoc:
130
+
131
+ end
132
+
133
+ # An empty splat as in:
134
+ #
135
+ # * = 1, 2
136
+ #
137
+ class EmptySplat < Node
138
+
139
+ def initialize(line, size) #:nodoc:
140
+ @line = line
141
+ @size = size
142
+ end
143
+
144
+ end
145
+
146
+ # Access of an instance variable as in:
147
+ #
148
+ # puts @var
149
+ #
150
+ class InstanceVariableAccess < VariableAccess
151
+
152
+ end
153
+
154
+ # An assignment to an instance variable as in:
155
+ #
156
+ # @var = 1
157
+ #
158
+ class InstanceVariableAssignment < VariableAssignment
159
+
160
+ end
161
+
162
+ # Access of a local variable as in:
163
+ #
164
+ # puts var
165
+ #
166
+ class LocalVariableAccess < VariableAccess
167
+
168
+ include LocalVariable
169
+
170
+ def initialize(line, name) #:nodoc:
171
+ @line = line
172
+ @name = name
173
+ @variable = nil
174
+ end
175
+
176
+ end
177
+
178
+ # An assignment to an instance variable as in:
179
+ #
180
+ # var = 1
181
+ #
182
+ class LocalVariableAssignment < VariableAssignment
183
+
184
+ include LocalVariable
185
+
186
+ def initialize(line, name, value) #:nodoc:
187
+ @line = line
188
+ @name = name
189
+ @value = value
190
+ @variable = nil
191
+ end
192
+
193
+ end
194
+
195
+ # An assignment of multiple values as in:
196
+ #
197
+ # a, b = 1, 2
198
+ #
199
+ class MAsgn < Node
200
+
201
+ # The left side of the assignment
202
+ #
203
+ attr_accessor :left
204
+
205
+ # The right side of the assignment
206
+ #
207
+ attr_accessor :right
208
+
209
+ # TODO: document!
210
+ attr_accessor :splat #:nodoc:
211
+
212
+ # TODO: document!
213
+ attr_accessor :block #:nodoc:
214
+
215
+ def initialize(line, left, right, splat) #:nodoc:
216
+ @line = line
217
+ @left = left
218
+ @right = right
219
+ @splat = nil
220
+ @block = nil # support for |&b|
221
+
222
+ @fixed = right.kind_of?(ArrayLiteral) ? true : false
223
+
224
+ if splat.kind_of? Node
225
+ if @left
226
+ if right
227
+ @splat = SplatAssignment.new line, splat
228
+ else
229
+ @splat = SplatWrapped.new line, splat
230
+ end
231
+ elsif @fixed
232
+ @splat = SplatArray.new line, splat, right.body.size
233
+ elsif right.kind_of? SplatValue
234
+ @splat = splat
235
+ else
236
+ @splat = SplatWrapped.new line, splat
237
+ end
238
+ elsif splat and @fixed
239
+ @splat = EmptySplat.new line, right.body.size
240
+ end
241
+ end
242
+
243
+ def iter_arguments
244
+ @iter_arguments = true
245
+ end
246
+
247
+ end
248
+
249
+ end
250
+
251
+ end
@@ -0,0 +1,22 @@
1
+ base = File.dirname(__FILE__)
2
+
3
+ module Melbourne
4
+
5
+ module AST #:nodoc:
6
+ end
7
+
8
+ end
9
+
10
+ require File.join(base, 'ast/node')
11
+ require File.join(base, 'ast/self')
12
+ require File.join(base, 'ast/constants')
13
+ require File.join(base, 'ast/control_flow')
14
+ require File.join(base, 'ast/definitions')
15
+ require File.join(base, 'ast/exceptions')
16
+ require File.join(base, 'ast/file')
17
+ require File.join(base, 'ast/grapher')
18
+ require File.join(base, 'ast/literals')
19
+ require File.join(base, 'ast/operators')
20
+ require File.join(base, 'ast/sends')
21
+ require File.join(base, 'ast/values')
22
+ require File.join(base, 'ast/variables')
@@ -0,0 +1,38 @@
1
+ module Melbourne
2
+
3
+ class Parser #:nodoc:
4
+
5
+ def self.parse_string(string, name = '(eval)', line = 1)
6
+ new(name, line).parse_string(string)
7
+ end
8
+
9
+ def self.parse_file(name, line=1)
10
+ new(name, line).parse_file
11
+ end
12
+
13
+ def initialize(name, line, transforms=[])
14
+ @name = name
15
+ @line = line > 0 ? line : 1
16
+ end
17
+
18
+ def syntax_error
19
+ raise @exc if @exc
20
+ end
21
+
22
+ def parse_string(string)
23
+ syntax_error unless ast = string_to_ast(string, @name, @line)
24
+ ast
25
+ end
26
+
27
+ def parse_file
28
+ unless @name and File.exists?(@name)
29
+ raise Errno::ENOENT, @name.inspect
30
+ end
31
+
32
+ syntax_error unless ast = file_to_ast(@name, @line)
33
+ ast
34
+ end
35
+
36
+ end
37
+
38
+ end