@@ -128,8 +128,8 @@ def visit_SLASH(n, seed); terminal(n, seed); end
128
128
def visit_DOT ( n , seed ) ; terminal ( n , seed ) ; end
129
129
130
130
instance_methods ( false ) . each do |pim |
131
- next unless pim =~ /^visit_(.*)$/
132
- DISPATCH_CACHE [ $1 . to_sym ] = pim
131
+ next unless pim . start_with? ( "visit_" )
132
+ DISPATCH_CACHE [ pim . name . delete_prefix ( "visit_" ) . to_sym ] = pim
133
133
end
134
134
end
135
135
@@ -167,32 +167,64 @@ def visit(node, block)
167
167
INSTANCE = new
168
168
end
169
169
170
- class String < FunctionalVisitor # :nodoc:
171
- private
172
- def binary ( node , seed )
173
- visit ( node . right , visit ( node . left , seed ) )
174
- end
175
-
176
- def nary ( node , seed )
170
+ class String # :nodoc:
171
+ def accept ( node , seed )
172
+ case node . type
173
+ when :DOT
174
+ seed << node . left
175
+ when :LITERAL
176
+ seed << node . left
177
+ when :SYMBOL
178
+ seed << node . left
179
+ when :SLASH
180
+ seed << node . left
181
+ when :CAT
182
+ accept ( node . right , accept ( node . left , seed ) )
183
+ when :STAR
184
+ accept ( node . left , seed )
185
+ when :OR
177
186
last_child = node . children . last
178
- node . children . inject ( seed ) { |s , c |
179
- string = visit ( c , s )
180
- string << "|" unless last_child == c
181
- string
182
- }
183
- end
184
-
185
- def terminal ( node , seed )
186
- seed + node . left
187
- end
188
-
189
- def visit_GROUP ( node , seed )
190
- visit ( node . left , seed . dup << "(" ) << ")"
187
+ node . children . each do |c |
188
+ accept ( c , seed )
189
+ seed << "|" unless last_child == c
190
+ end
191
+ seed
192
+ when :GROUP
193
+ accept ( node . left , seed << "(" ) << ")"
194
+ else
195
+ raise "Unknown node type: #{ node . type } "
191
196
end
197
+ end
192
198
193
- INSTANCE = new
199
+ INSTANCE = new
194
200
end
195
201
202
+ # class String < FunctionalVisitor # :nodoc:
203
+ # private
204
+ # def binary(node, seed)
205
+ # visit(node.right, visit(node.left, seed))
206
+ # end
207
+ #
208
+ # def nary(node, seed)
209
+ # last_child = node.children.last
210
+ # node.children.inject(seed) { |s, c|
211
+ # string = visit(c, s)
212
+ # string << "|" unless last_child == c
213
+ # string
214
+ # }
215
+ # end
216
+ #
217
+ # def terminal(node, seed)
218
+ # seed + node.left
219
+ # end
220
+ #
221
+ # def visit_GROUP(node, seed)
222
+ # visit(node.left, seed.dup << "(") << ")"
223
+ # end
224
+ #
225
+ # INSTANCE = new
226
+ # end
227
+
196
228
class Dot < FunctionalVisitor # :nodoc:
197
229
def initialize
198
230
@nodes = [ ]
0 commit comments