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

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_tkObject

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_tkreadObject

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_readObject

Peek equivalent for get_tkread


82
83
84
# File 'lib/rdoc/parser/ruby_tools.rb', line 82

def peek_read
  @read.join('')
end

#peek_tkObject

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

#resetObject

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_tkspaceObject

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_nlObject

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