Tuesday, April 8, 2008

BabyDoc

One of the fun thigs about updating the PickAxe is getting to come up with examples to show the various APIs in action. Here’s a very silly example of using Ripper’s event-based API to extract comments that are associated with basic class definitions. It clearly has holes (it doesn’t handle class A::B::C, for instance) but it’s fairly easy to see how to add a proper state machine and produce something that might be interesting to play with…


require 'ripper'

# This class handles parser events, extracting
# comments and attaching them to class definitions
class BabyRDoc < Ripper::Filter
def initialize(*)
super
reset_state
end

def on_default(event, token, output)
reset_state
output
end

def on_sp(token, output) output end
alias on_nil on_sp

def on_comment(comment, output)
@comment << comment.sub(/^\s*#\s*/, " ")
output
end

def on_kw(name, output)
@expecting_class_name = (name == 'class')
output
end

def on_const(name, output)
if @expecting_class_name
output << "#{name}:\n"
output << @comment
end
reset_state
output
end

private

def reset_state
@comment = ""
@expecting_class_name = false
end
end

BabyRDoc.new(File.read(__FILE__)).parse(STDOUT)

Run this with Ruby 1.9 (or, I guess, 1.8 with Ripper installed), and you’ll see


BabyRDoc: 
This class handles parser events, extracting
comments and attaching them to class definitions

No comments:

Post a Comment