In Files

  • rdoc/parser/ruby_tools.rb

Class/Module Index [+]

Quicksearch

RDoc::Parser::RubyTools

Collection of methods for writing parsers against RDoc::RubyLex and RDoc::RubyToken

Public Instance Methods

add_token_listener(obj) click to toggle source

Adds a token listener obj, but you should probably use #token_listener

 
               # File rdoc/parser/ruby_tools.rb, line 12
def add_token_listener(obj)
  @token_listeners ||= []
  @token_listeners << obj
end
            
get_tk() click to toggle source

Fetches the next token from the scanner

 
               # File 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) click to toggle source

Reads and returns all tokens up to one of tokens. Leaves the matched token in the token list.

 
               # File rdoc/parser/ruby_tools.rb, line 67
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
            
get_tkread() click to toggle source

Retrieves a String representation of the read tokens

 
               # File rdoc/parser/ruby_tools.rb, line 88
def get_tkread
  read = @read.join("")
  @read = []
  read
end
            
peek_read() click to toggle source

Peek equivalent for #get_tkread

 
               # File rdoc/parser/ruby_tools.rb, line 97
def peek_read
  @read.join('')
end
            
peek_tk() click to toggle source

Peek at the next token, but don’t remove it from the stream

 
               # File rdoc/parser/ruby_tools.rb, line 104
def peek_tk
  unget_tk(tk = get_tk)
  tk
end
            
remove_token_listener(obj) click to toggle source

Removes the token listener obj

 
               # File rdoc/parser/ruby_tools.rb, line 112
def remove_token_listener(obj)
  @token_listeners.delete(obj)
end
            
reset() click to toggle source

Resets the tools

 
               # File rdoc/parser/ruby_tools.rb, line 119
def reset
  @read       = []
  @tokens     = []
  @unget_read = []
  @nest = 0
end
            
skip_tkspace(skip_nl = true) click to toggle source

Skips whitespace tokens including newlines if skip_nl is true

 
               # File rdoc/parser/ruby_tools.rb, line 129
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
            
token_listener(obj) click to toggle source

Has obj listen to tokens

 
               # File 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) click to toggle source

Returns tk to the scanner

 
               # File 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
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus