Collection of methods for writing parsers
Adds a token listener obj
, but you should probably use token_listener
# File rdoc/parser/ruby_tools.rb, line 10 def add_token_listener(obj) @token_listeners ||= [] @token_listeners << obj end
Fetches the next token from the scanner
# File rdoc/parser/ruby_tools.rb, line 18 def get_tk tk = nil if @tokens.empty? then if @scanner_point >= @scanner.size return nil else tk = @scanner[@scanner_point] @scanner_point += 1 @read.push tk[:text] puts "get_tk1 => #{tk.inspect}" if $TOKEN_DEBUG end else @read.push @unget_read.shift tk = @tokens.shift puts "get_tk2 => #{tk.inspect}" if $TOKEN_DEBUG end if tk == nil || :on___end__ == tk[:kind] tk = nil end return nil unless tk # 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 rdoc/parser/ruby_tools.rb, line 54 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 rdoc/parser/ruby_tools.rb, line 75 def get_tkread read = @read.join("") @read = [] read end
Peek equivalent for get_tkread
# File rdoc/parser/ruby_tools.rb, line 84 def peek_read @read.join('') end
Peek at the next token, but don't remove it from the stream
# File rdoc/parser/ruby_tools.rb, line 91 def peek_tk unget_tk(tk = get_tk) tk end
Removes the token listener obj
# File rdoc/parser/ruby_tools.rb, line 99 def remove_token_listener(obj) @token_listeners.delete(obj) end
Resets the tools
# File rdoc/parser/ruby_tools.rb, line 106 def reset @read = [] @tokens = [] @unget_read = [] @nest = 0 @scanner_point = 0 end
Skips whitespace tokens including newlines if skip_nl
is true
# File rdoc/parser/ruby_tools.rb, line 121 def skip_tkspace(skip_nl = true) tokens = [] while (tk = get_tk) and (:on_sp == tk[:kind] or (skip_nl and tk_nl?(tk))) do tokens.push(tk) end unget_tk(tk) tokens end
# File rdoc/parser/ruby_tools.rb, line 114 def tk_nl?(tk) :on_nl == tk[:kind] or :on_ignored_nl == tk[:kind] end