Module: RDoc::Parser::RubyTools
- Included in:
- Ruby
- Defined in:
- lib/rdoc/parser/ruby_tools.rb
Overview
Collection of methods for writing parsers
Instance Method Summary collapse
-
#add_token_listener(obj) ⇒ Object
Adds a token listener
obj
, but you should probably use token_listener. -
#get_tk ⇒ Object
Fetches the next token from the scanner.
-
#get_tk_until(*tokens) ⇒ Object
Reads and returns all tokens up to one of
tokens
. -
#get_tkread ⇒ Object
Retrieves a String representation of the read tokens.
-
#peek_read ⇒ Object
Peek equivalent for get_tkread.
-
#peek_tk ⇒ Object
Peek at the next token, but don’t remove it from the stream.
-
#remove_token_listener(obj) ⇒ Object
Removes the token listener
obj
. -
#reset ⇒ Object
Resets the tools.
-
#skip_tkspace ⇒ Object
Skips whitespace tokens including newlines.
-
#skip_tkspace_without_nl ⇒ Object
Skips whitespace tokens excluding newlines.
-
#token_listener(obj) ⇒ Object
Has
obj
listen to tokens. -
#unget_tk(tk) ⇒ Object
Returns
tk
to the scanner.
Instance Method Details
#add_token_listener(obj) ⇒ Object
Adds a token listener obj
, but you should probably use token_listener
10 11 12 13 |
# File 'lib/rdoc/parser/ruby_tools.rb', line 10 def add_token_listener(obj) @token_listeners ||= [] @token_listeners << obj end |
#get_tk ⇒ Object
Fetches the next token from the scanner
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/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] end else @read.push @unget_read.shift tk = @tokens.shift 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 |
#get_tk_until(*tokens) ⇒ Object
Reads and returns all tokens up to one of tokens
. Leaves the matched token in the token list.
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/rdoc/parser/ruby_tools.rb', line 52 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 ⇒ Object
Retrieves a String representation of the read tokens
73 74 75 76 77 |
# File 'lib/rdoc/parser/ruby_tools.rb', line 73 def get_tkread read = @read.join("") @read = [] read end |
#peek_read ⇒ Object
Peek equivalent for get_tkread
82 83 84 |
# File 'lib/rdoc/parser/ruby_tools.rb', line 82 def peek_read @read.join('') end |
#peek_tk ⇒ Object
Peek at the next token, but don’t remove it from the stream
89 90 91 92 |
# File 'lib/rdoc/parser/ruby_tools.rb', line 89 def peek_tk unget_tk(tk = get_tk) tk end |
#remove_token_listener(obj) ⇒ Object
Removes the token listener obj
97 98 99 |
# File 'lib/rdoc/parser/ruby_tools.rb', line 97 def remove_token_listener(obj) @token_listeners.delete(obj) end |
#reset ⇒ Object
Resets the tools
104 105 106 107 108 109 110 |
# File 'lib/rdoc/parser/ruby_tools.rb', line 104 def reset @read = [] @tokens = [] @unget_read = [] @nest = 0 @scanner_point = 0 end |
#skip_tkspace ⇒ Object
Skips whitespace tokens including newlines
115 116 117 118 119 120 121 122 123 124 |
# File 'lib/rdoc/parser/ruby_tools.rb', line 115 def skip_tkspace tokens = [] while (tk = get_tk) and (:on_sp == tk[:kind] or :on_nl == tk[:kind] or :on_ignored_nl == tk[:kind]) do tokens.push(tk) end unget_tk(tk) tokens end |
#skip_tkspace_without_nl ⇒ Object
Skips whitespace tokens excluding newlines
129 130 131 132 133 134 135 136 137 138 |
# File 'lib/rdoc/parser/ruby_tools.rb', line 129 def skip_tkspace_without_nl tokens = [] while (tk = get_tk) and :on_sp == tk[:kind] do tokens.push(tk) end unget_tk(tk) tokens end |
#token_listener(obj) ⇒ Object
Has obj
listen to tokens
143 144 145 146 147 148 |
# 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) ⇒ Object
Returns tk
to the scanner
153 154 155 156 157 158 159 160 161 162 163 |
# 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 |