Collection of methods for writing parsers against RDoc::RubyLex and RDoc::RubyToken
Adds a token listener obj
, but you should probably use #token_listener
# File lib/rdoc/parser/ruby_tools.rb, line 12
def add_token_listener(obj)
@token_listeners ||= []
@token_listeners << obj
end
Fetches the next token from the scanner
# File lib/rdoc/parser/ruby_tools.rb, line 20
def get_tk
tk = nil
if @tokens.empty? then
tk = @scanner.token
@read.push @scanner.get_readed
puts "get_tk1 => #{tk.inspect}" if $TOKEN_DEBUG
else
@read.push @unget_read.shift
tk = @tokens.shift
puts "get_tk2 => #{tk.inspect}" if $TOKEN_DEBUG
end
tk = nil if TkEND_OF_SCRIPT === tk
if TkSYMBEG === tk then
set_token_position tk.line_no, tk.char_no
case tk1 = get_tk
when TkId, TkOp, TkSTRING, TkDSTRING, TkSTAR, TkAMPER then
if tk1.respond_to?(:name) then
tk = Token(TkSYMBOL).set_text(":" + tk1.name)
else
tk = Token(TkSYMBOL).set_text(":" + tk1.text)
end
# remove the identifier we just read (we're about to replace it with a
# symbol)
@token_listeners.each do |obj|
obj.pop_token
end if @token_listeners
else
tk = tk1
end
end
# inform any listeners of our shiny new token
@token_listeners.each do |obj|
obj.add_token(tk)
end if @token_listeners
tk
end
Reads and returns all tokens up to one of tokens
. Leaves the
matched token in the token list.
# File lib/rdoc/parser/ruby_tools.rb, line 68
def get_tk_until(*tokens)
read = []
loop do
tk = get_tk
case tk when *tokens then unget_tk tk; break end
read << tk
end
read
end
Retrieves a String representation of the read tokens
# File lib/rdoc/parser/ruby_tools.rb, line 83
def get_tkread
read = @read.join("")
@read = []
read
end
Peek equivalent for #get_tkread
# File lib/rdoc/parser/ruby_tools.rb, line 92
def peek_read
@read.join('')
end
Peek at the next token, but don’t remove it from the stream
# File lib/rdoc/parser/ruby_tools.rb, line 99
def peek_tk
unget_tk(tk = get_tk)
tk
end
Removes the token listener obj
# File lib/rdoc/parser/ruby_tools.rb, line 107
def remove_token_listener(obj)
@token_listeners.delete(obj)
end
Resets the tools
# File lib/rdoc/parser/ruby_tools.rb, line 114
def reset
@read = []
@tokens = []
@unget_read = []
@nest = 0
end
Skips whitespace tokens including newlines if skip_nl
is true
# File lib/rdoc/parser/ruby_tools.rb, line 124
def skip_tkspace(skip_nl = true) # HACK dup
tokens = []
while TkSPACE === (tk = get_tk) or (skip_nl and TkNL === tk) do
tokens.push tk
end
unget_tk tk
tokens
end
Has obj
listen to tokens
# File lib/rdoc/parser/ruby_tools.rb, line 138
def token_listener(obj)
add_token_listener obj
yield
ensure
remove_token_listener obj
end
Returns tk
to the scanner
# File lib/rdoc/parser/ruby_tools.rb, line 148
def unget_tk(tk)
@tokens.unshift tk
@unget_read.unshift @read.pop
# Remove this token from any listeners
@token_listeners.each do |obj|
obj.pop_token
end if @token_listeners
nil
end
/ | Search |
---|---|
? | Show this help |