Module: RDoc::Parser::RubyTools
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Included In:
| |
Defined in: | lib/rdoc/parser/ruby_tools.rb |
Overview
Collection of methods for writing parsers against ::RDoc::RubyLex and ::RDoc::RubyToken
Instance Method Summary
-
#add_token_listener(obj)
Adds a token listener
obj
, but you should probably use token_listener. -
#get_tk
Fetches the next token from the scanner.
-
#get_tk_until(*tokens)
Reads and returns all tokens up to one of
tokens
. -
#get_tkread
Retrieves a String representation of the read tokens.
-
#peek_read
Peek equivalent for get_tkread.
-
#peek_tk
Peek at the next token, but don't remove it from the stream.
-
#remove_token_listener(obj)
Removes the token listener
obj
-
#reset
Resets the tools.
-
#skip_tkspace(skip_nl = true)
Skips whitespace tokens including newlines if
skip_nl
is true. -
#token_listener(obj)
Has
obj
listen to tokens. -
#unget_tk(tk)
Returns
tk
to the scanner.
Instance Method Details
#add_token_listener(obj)
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
#get_tk
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 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
#get_tk_until(*tokens)
Reads and returns all tokens up to one of tokens
. Leaves the matched token in the token list.
#get_tkread
Retrieves a String representation of the read tokens
# File 'lib/rdoc/parser/ruby_tools.rb', line 88
def get_tkread read = @read.join("") @read = [] read end
#peek_read
Peek equivalent for get_tkread
# File 'lib/rdoc/parser/ruby_tools.rb', line 97
def peek_read @read.join('') end
#peek_tk
Peek at the next token, but don't remove it from the stream
#remove_token_listener(obj)
Removes the token listener obj
# File 'lib/rdoc/parser/ruby_tools.rb', line 112
def remove_token_listener(obj) @token_listeners.delete(obj) end
#reset
Resets the tools
# File 'lib/rdoc/parser/ruby_tools.rb', line 119
def reset @read = [] @tokens = [] @unget_read = [] @nest = 0 end
#skip_tkspace(skip_nl = true)
Skips whitespace tokens including newlines if skip_nl
is true
#token_listener(obj)
Has obj
listen to tokens
# File 'lib/rdoc/parser/ruby_tools.rb', line 143
def token_listener(obj) add_token_listener obj yield ensure remove_token_listener obj end
#unget_tk(tk)
Returns tk
to the scanner
# File 'lib/rdoc/parser/ruby_tools.rb', line 153
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