rdoc 7.2.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +3 -4
- data/LICENSE.rdoc +4 -0
- data/README.md +43 -2
- data/doc/markup_reference/markdown.md +104 -3
- data/lib/rdoc/code_object/alias.rb +2 -8
- data/lib/rdoc/code_object/any_method.rb +11 -6
- data/lib/rdoc/code_object/attr.rb +11 -6
- data/lib/rdoc/code_object/class_module.rb +62 -32
- data/lib/rdoc/code_object/constant.rb +29 -3
- data/lib/rdoc/code_object/context/section.rb +4 -35
- data/lib/rdoc/code_object/context.rb +39 -34
- data/lib/rdoc/code_object/method_attr.rb +9 -15
- data/lib/rdoc/code_object/mixin.rb +2 -2
- data/lib/rdoc/code_object/top_level.rb +9 -3
- data/lib/rdoc/code_object.rb +2 -4
- data/lib/rdoc/comment.rb +0 -65
- data/lib/rdoc/cross_reference.rb +7 -27
- data/lib/rdoc/encoding.rb +3 -3
- data/lib/rdoc/generator/aliki.rb +17 -0
- data/lib/rdoc/generator/darkfish.rb +12 -6
- data/lib/rdoc/generator/json_index.rb +2 -2
- data/lib/rdoc/generator/markup.rb +56 -31
- data/lib/rdoc/generator/template/aliki/DESIGN.md +536 -0
- data/lib/rdoc/generator/template/aliki/_aside_toc.rhtml +1 -1
- data/lib/rdoc/generator/template/aliki/_head.rhtml +1 -1
- data/lib/rdoc/generator/template/aliki/_sidebar_extends.rhtml +8 -6
- data/lib/rdoc/generator/template/aliki/_sidebar_includes.rhtml +8 -6
- data/lib/rdoc/generator/template/aliki/_sidebar_installed.rhtml +1 -1
- data/lib/rdoc/generator/template/aliki/_sidebar_pages.rhtml +2 -2
- data/lib/rdoc/generator/template/aliki/_sidebar_sections.rhtml +1 -1
- data/lib/rdoc/generator/template/aliki/_sidebar_toggle.rhtml +1 -1
- data/lib/rdoc/generator/template/aliki/class.rhtml +56 -46
- data/lib/rdoc/generator/template/aliki/css/rdoc.css +337 -111
- data/lib/rdoc/generator/template/aliki/index.rhtml +1 -1
- data/lib/rdoc/generator/template/aliki/js/aliki.js +20 -18
- data/lib/rdoc/generator/template/aliki/page.rhtml +1 -1
- data/lib/rdoc/generator/template/aliki/servlet_not_found.rhtml +1 -1
- data/lib/rdoc/generator/template/aliki/servlet_root.rhtml +2 -2
- data/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +8 -6
- data/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +8 -6
- data/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +1 -1
- data/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +1 -1
- data/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +1 -1
- data/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +5 -5
- data/lib/rdoc/generator/template/darkfish/class.rhtml +18 -21
- data/lib/rdoc/generator/template/darkfish/css/rdoc.css +0 -1
- data/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml +3 -3
- data/lib/rdoc/i18n/text.rb +3 -3
- data/lib/rdoc/markdown.kpeg +15 -10
- data/lib/rdoc/markdown.rb +289 -104
- data/lib/rdoc/markup/document.rb +2 -2
- data/lib/rdoc/markup/formatter.rb +24 -34
- data/lib/rdoc/markup/heading.rb +1 -4
- data/lib/rdoc/markup/indented_paragraph.rb +1 -1
- data/lib/rdoc/markup/list.rb +2 -2
- data/lib/rdoc/markup/list_item.rb +2 -2
- data/lib/rdoc/markup/pre_process.rb +0 -25
- data/lib/rdoc/markup/to_ansi.rb +1 -1
- data/lib/rdoc/markup/to_bs.rb +1 -1
- data/lib/rdoc/markup/to_html.rb +131 -53
- data/lib/rdoc/markup/to_html_crossref.rb +97 -71
- data/lib/rdoc/markup/to_html_snippet.rb +5 -5
- data/lib/rdoc/markup/to_joined_paragraph.rb +0 -5
- data/lib/rdoc/markup/to_label.rb +2 -2
- data/lib/rdoc/markup/to_markdown.rb +1 -1
- data/lib/rdoc/markup/to_rdoc.rb +2 -2
- data/lib/rdoc/markup/to_table_of_contents.rb +1 -1
- data/lib/rdoc/markup/to_tt_only.rb +0 -7
- data/lib/rdoc/markup/verbatim.rb +1 -1
- data/lib/rdoc/options.rb +36 -51
- data/lib/rdoc/parser/c.rb +7 -6
- data/lib/rdoc/parser/rbs.rb +275 -0
- data/lib/rdoc/parser/ruby.rb +954 -2066
- data/lib/rdoc/parser/ruby_colorizer.rb +253 -0
- data/lib/rdoc/parser.rb +3 -2
- data/lib/rdoc/rbs_helper.rb +186 -0
- data/lib/rdoc/rdoc.rb +196 -24
- data/lib/rdoc/ri/driver.rb +8 -2
- data/lib/rdoc/ri/paths.rb +1 -1
- data/lib/rdoc/{servlet.rb → ri/servlet.rb} +5 -5
- data/lib/rdoc/ri.rb +4 -3
- data/lib/rdoc/rubygems_hook.rb +11 -11
- data/lib/rdoc/server.rb +460 -0
- data/lib/rdoc/stats.rb +147 -124
- data/lib/rdoc/store.rb +212 -4
- data/lib/rdoc/task.rb +16 -15
- data/lib/rdoc/text.rb +1 -118
- data/lib/rdoc/token_stream.rb +11 -33
- data/lib/rdoc/version.rb +1 -1
- data/lib/rdoc.rb +35 -7
- data/lib/rubygems_plugin.rb +2 -11
- data/rdoc-logo.svg +43 -0
- data/rdoc.gemspec +6 -4
- metadata +35 -18
- data/lib/rdoc/code_object/anon_class.rb +0 -10
- data/lib/rdoc/code_object/ghost_method.rb +0 -6
- data/lib/rdoc/code_object/meta_method.rb +0 -6
- data/lib/rdoc/parser/prism_ruby.rb +0 -1112
- data/lib/rdoc/parser/ripper_state_lex.rb +0 -302
- data/lib/rdoc/parser/ruby_tools.rb +0 -163
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'ripper'
|
|
3
|
-
|
|
4
|
-
##
|
|
5
|
-
# Wrapper for Ripper lex states
|
|
6
|
-
|
|
7
|
-
class RDoc::Parser::RipperStateLex
|
|
8
|
-
# :stopdoc:
|
|
9
|
-
|
|
10
|
-
Token = Struct.new(:line_no, :char_no, :kind, :text, :state)
|
|
11
|
-
|
|
12
|
-
EXPR_END = Ripper::EXPR_END
|
|
13
|
-
EXPR_ENDFN = Ripper::EXPR_ENDFN
|
|
14
|
-
EXPR_ARG = Ripper::EXPR_ARG
|
|
15
|
-
EXPR_FNAME = Ripper::EXPR_FNAME
|
|
16
|
-
|
|
17
|
-
class InnerStateLex < Ripper::Filter
|
|
18
|
-
def initialize(code)
|
|
19
|
-
super(code)
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def on_default(event, tok, data)
|
|
23
|
-
data << Token.new(lineno, column, event, tok, state)
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def get_squashed_tk
|
|
28
|
-
if @buf.empty?
|
|
29
|
-
tk = @tokens.shift
|
|
30
|
-
else
|
|
31
|
-
tk = @buf.shift
|
|
32
|
-
end
|
|
33
|
-
return nil if tk.nil?
|
|
34
|
-
case tk[:kind]
|
|
35
|
-
when :on_symbeg then
|
|
36
|
-
tk = get_symbol_tk(tk)
|
|
37
|
-
when :on_tstring_beg then
|
|
38
|
-
tk = get_string_tk(tk)
|
|
39
|
-
when :on_backtick then
|
|
40
|
-
if (tk[:state] & (EXPR_FNAME | EXPR_ENDFN)) != 0
|
|
41
|
-
tk[:kind] = :on_ident
|
|
42
|
-
tk[:state] = Ripper::Lexer::State.new(EXPR_ARG)
|
|
43
|
-
else
|
|
44
|
-
tk = get_string_tk(tk)
|
|
45
|
-
end
|
|
46
|
-
when :on_regexp_beg then
|
|
47
|
-
tk = get_regexp_tk(tk)
|
|
48
|
-
when :on_embdoc_beg then
|
|
49
|
-
tk = get_embdoc_tk(tk)
|
|
50
|
-
when :on_heredoc_beg then
|
|
51
|
-
@heredoc_queue << retrieve_heredoc_info(tk)
|
|
52
|
-
when :on_nl, :on_ignored_nl, :on_comment, :on_heredoc_end then
|
|
53
|
-
if !@heredoc_queue.empty?
|
|
54
|
-
get_heredoc_tk(*@heredoc_queue.shift)
|
|
55
|
-
elsif tk[:text].nil? # :on_ignored_nl sometimes gives nil
|
|
56
|
-
tk[:text] = ''
|
|
57
|
-
end
|
|
58
|
-
when :on_words_beg then
|
|
59
|
-
tk = get_words_tk(tk)
|
|
60
|
-
when :on_qwords_beg then
|
|
61
|
-
tk = get_words_tk(tk)
|
|
62
|
-
when :on_symbols_beg then
|
|
63
|
-
tk = get_words_tk(tk)
|
|
64
|
-
when :on_qsymbols_beg then
|
|
65
|
-
tk = get_words_tk(tk)
|
|
66
|
-
when :on_op then
|
|
67
|
-
if '&.' == tk[:text]
|
|
68
|
-
tk[:kind] = :on_period
|
|
69
|
-
else
|
|
70
|
-
tk = get_op_tk(tk)
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
tk
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
private def get_symbol_tk(tk)
|
|
77
|
-
is_symbol = true
|
|
78
|
-
symbol_tk = Token.new(tk.line_no, tk.char_no, :on_symbol)
|
|
79
|
-
if ":'" == tk[:text] or ':"' == tk[:text] or tk[:text].start_with?('%s')
|
|
80
|
-
tk1 = get_string_tk(tk)
|
|
81
|
-
symbol_tk[:text] = tk1[:text]
|
|
82
|
-
symbol_tk[:state] = tk1[:state]
|
|
83
|
-
else
|
|
84
|
-
case (tk1 = get_squashed_tk)[:kind]
|
|
85
|
-
when :on_ident
|
|
86
|
-
symbol_tk[:text] = ":#{tk1[:text]}"
|
|
87
|
-
symbol_tk[:state] = tk1[:state]
|
|
88
|
-
when :on_tstring_content
|
|
89
|
-
symbol_tk[:text] = ":#{tk1[:text]}"
|
|
90
|
-
symbol_tk[:state] = get_squashed_tk[:state] # skip :on_tstring_end
|
|
91
|
-
when :on_tstring_end
|
|
92
|
-
symbol_tk[:text] = ":#{tk1[:text]}"
|
|
93
|
-
symbol_tk[:state] = tk1[:state]
|
|
94
|
-
when :on_op
|
|
95
|
-
symbol_tk[:text] = ":#{tk1[:text]}"
|
|
96
|
-
symbol_tk[:state] = tk1[:state]
|
|
97
|
-
when :on_ivar
|
|
98
|
-
symbol_tk[:text] = ":#{tk1[:text]}"
|
|
99
|
-
symbol_tk[:state] = tk1[:state]
|
|
100
|
-
when :on_cvar
|
|
101
|
-
symbol_tk[:text] = ":#{tk1[:text]}"
|
|
102
|
-
symbol_tk[:state] = tk1[:state]
|
|
103
|
-
when :on_gvar
|
|
104
|
-
symbol_tk[:text] = ":#{tk1[:text]}"
|
|
105
|
-
symbol_tk[:state] = tk1[:state]
|
|
106
|
-
when :on_const
|
|
107
|
-
symbol_tk[:text] = ":#{tk1[:text]}"
|
|
108
|
-
symbol_tk[:state] = tk1[:state]
|
|
109
|
-
when :on_kw
|
|
110
|
-
symbol_tk[:text] = ":#{tk1[:text]}"
|
|
111
|
-
symbol_tk[:state] = tk1[:state]
|
|
112
|
-
else
|
|
113
|
-
is_symbol = false
|
|
114
|
-
tk = tk1
|
|
115
|
-
end
|
|
116
|
-
end
|
|
117
|
-
if is_symbol
|
|
118
|
-
tk = symbol_tk
|
|
119
|
-
end
|
|
120
|
-
tk
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
private def get_string_tk(tk)
|
|
124
|
-
string = tk[:text]
|
|
125
|
-
state = nil
|
|
126
|
-
kind = :on_tstring
|
|
127
|
-
loop do
|
|
128
|
-
inner_str_tk = get_squashed_tk
|
|
129
|
-
if inner_str_tk.nil?
|
|
130
|
-
break
|
|
131
|
-
elsif :on_tstring_end == inner_str_tk[:kind]
|
|
132
|
-
string = string + inner_str_tk[:text]
|
|
133
|
-
state = inner_str_tk[:state]
|
|
134
|
-
break
|
|
135
|
-
elsif :on_label_end == inner_str_tk[:kind]
|
|
136
|
-
string = string + inner_str_tk[:text]
|
|
137
|
-
state = inner_str_tk[:state]
|
|
138
|
-
kind = :on_symbol
|
|
139
|
-
break
|
|
140
|
-
else
|
|
141
|
-
string = string + inner_str_tk[:text]
|
|
142
|
-
if :on_embexpr_beg == inner_str_tk[:kind] then
|
|
143
|
-
kind = :on_dstring if :on_tstring == kind
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
Token.new(tk.line_no, tk.char_no, kind, string, state)
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
private def get_regexp_tk(tk)
|
|
151
|
-
string = tk[:text]
|
|
152
|
-
state = nil
|
|
153
|
-
loop do
|
|
154
|
-
inner_str_tk = get_squashed_tk
|
|
155
|
-
if inner_str_tk.nil?
|
|
156
|
-
break
|
|
157
|
-
elsif :on_regexp_end == inner_str_tk[:kind]
|
|
158
|
-
string = string + inner_str_tk[:text]
|
|
159
|
-
state = inner_str_tk[:state]
|
|
160
|
-
break
|
|
161
|
-
else
|
|
162
|
-
string = string + inner_str_tk[:text]
|
|
163
|
-
end
|
|
164
|
-
end
|
|
165
|
-
Token.new(tk.line_no, tk.char_no, :on_regexp, string, state)
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
private def get_embdoc_tk(tk)
|
|
169
|
-
string = tk[:text]
|
|
170
|
-
until :on_embdoc_end == (embdoc_tk = get_squashed_tk)[:kind] do
|
|
171
|
-
string = string + embdoc_tk[:text]
|
|
172
|
-
end
|
|
173
|
-
string = string + embdoc_tk[:text]
|
|
174
|
-
Token.new(tk.line_no, tk.char_no, :on_embdoc, string, embdoc_tk.state)
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
private def get_heredoc_tk(heredoc_name, indent)
|
|
178
|
-
string = ''
|
|
179
|
-
start_tk = nil
|
|
180
|
-
prev_tk = nil
|
|
181
|
-
until heredoc_end?(heredoc_name, indent, tk = @tokens.shift) do
|
|
182
|
-
start_tk = tk unless start_tk
|
|
183
|
-
if (prev_tk.nil? or "\n" == prev_tk[:text][-1]) and 0 != tk[:char_no]
|
|
184
|
-
string = string + (' ' * tk[:char_no])
|
|
185
|
-
end
|
|
186
|
-
string = string + tk[:text]
|
|
187
|
-
prev_tk = tk
|
|
188
|
-
end
|
|
189
|
-
start_tk = tk unless start_tk
|
|
190
|
-
prev_tk = tk unless prev_tk
|
|
191
|
-
@buf.unshift tk # closing heredoc
|
|
192
|
-
heredoc_tk = Token.new(start_tk.line_no, start_tk.char_no, :on_heredoc, string, prev_tk.state)
|
|
193
|
-
@buf.unshift heredoc_tk
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
private def retrieve_heredoc_info(tk)
|
|
197
|
-
name = tk[:text].gsub(/\A<<[-~]?(['"`]?)(.+)\1\z/, '\2')
|
|
198
|
-
indent = tk[:text] =~ /\A<<[-~]/
|
|
199
|
-
[name, indent]
|
|
200
|
-
end
|
|
201
|
-
|
|
202
|
-
private def heredoc_end?(name, indent, tk)
|
|
203
|
-
result = false
|
|
204
|
-
if :on_heredoc_end == tk[:kind] then
|
|
205
|
-
tk_name = tk[:text].chomp
|
|
206
|
-
tk_name.lstrip! if indent
|
|
207
|
-
if name == tk_name
|
|
208
|
-
result = true
|
|
209
|
-
end
|
|
210
|
-
end
|
|
211
|
-
result
|
|
212
|
-
end
|
|
213
|
-
|
|
214
|
-
private def get_words_tk(tk)
|
|
215
|
-
string = ''
|
|
216
|
-
start_token = tk[:text]
|
|
217
|
-
start_quote = tk[:text].rstrip[-1]
|
|
218
|
-
line_no = tk[:line_no]
|
|
219
|
-
char_no = tk[:char_no]
|
|
220
|
-
state = tk[:state]
|
|
221
|
-
end_quote =
|
|
222
|
-
case start_quote
|
|
223
|
-
when ?( then ?)
|
|
224
|
-
when ?[ then ?]
|
|
225
|
-
when ?{ then ?}
|
|
226
|
-
when ?< then ?>
|
|
227
|
-
else start_quote
|
|
228
|
-
end
|
|
229
|
-
end_token = nil
|
|
230
|
-
loop do
|
|
231
|
-
tk = get_squashed_tk
|
|
232
|
-
if tk.nil?
|
|
233
|
-
end_token = end_quote
|
|
234
|
-
break
|
|
235
|
-
elsif :on_tstring_content == tk[:kind] then
|
|
236
|
-
string += tk[:text]
|
|
237
|
-
elsif :on_words_sep == tk[:kind] or :on_tstring_end == tk[:kind] then
|
|
238
|
-
if end_quote == tk[:text].strip then
|
|
239
|
-
end_token = tk[:text]
|
|
240
|
-
break
|
|
241
|
-
else
|
|
242
|
-
string += tk[:text]
|
|
243
|
-
end
|
|
244
|
-
else
|
|
245
|
-
string += tk[:text]
|
|
246
|
-
end
|
|
247
|
-
end
|
|
248
|
-
text = "#{start_token}#{string}#{end_token}"
|
|
249
|
-
Token.new(line_no, char_no, :on_dstring, text, state)
|
|
250
|
-
end
|
|
251
|
-
|
|
252
|
-
private def get_op_tk(tk)
|
|
253
|
-
redefinable_operators = %w[! != !~ % & * ** + +@ - -@ / < << <= <=> == === =~ > >= >> [] []= ^ ` | ~]
|
|
254
|
-
if redefinable_operators.include?(tk[:text]) and tk[:state] == EXPR_ARG then
|
|
255
|
-
tk[:state] = Ripper::Lexer::State.new(EXPR_ARG)
|
|
256
|
-
tk[:kind] = :on_ident
|
|
257
|
-
elsif tk[:text] =~ /^[-+]$/ then
|
|
258
|
-
tk_ahead = get_squashed_tk
|
|
259
|
-
case tk_ahead[:kind]
|
|
260
|
-
when :on_int, :on_float, :on_rational, :on_imaginary then
|
|
261
|
-
tk[:text] += tk_ahead[:text]
|
|
262
|
-
tk[:kind] = tk_ahead[:kind]
|
|
263
|
-
tk[:state] = tk_ahead[:state]
|
|
264
|
-
when :on_heredoc_beg, :on_tstring, :on_dstring # frozen/non-frozen string literal
|
|
265
|
-
tk[:text] += tk_ahead[:text]
|
|
266
|
-
tk[:kind] = tk_ahead[:kind]
|
|
267
|
-
tk[:state] = tk_ahead[:state]
|
|
268
|
-
else
|
|
269
|
-
@buf.unshift tk_ahead
|
|
270
|
-
end
|
|
271
|
-
end
|
|
272
|
-
tk
|
|
273
|
-
end
|
|
274
|
-
|
|
275
|
-
# :startdoc:
|
|
276
|
-
|
|
277
|
-
# New lexer for +code+.
|
|
278
|
-
def initialize(code)
|
|
279
|
-
@buf = []
|
|
280
|
-
@heredoc_queue = []
|
|
281
|
-
@inner_lex = InnerStateLex.new(code)
|
|
282
|
-
@tokens = @inner_lex.parse([])
|
|
283
|
-
end
|
|
284
|
-
|
|
285
|
-
# Returns tokens parsed from +code+.
|
|
286
|
-
def self.parse(code)
|
|
287
|
-
lex = self.new(code)
|
|
288
|
-
tokens = []
|
|
289
|
-
begin
|
|
290
|
-
while tk = lex.get_squashed_tk
|
|
291
|
-
tokens.push tk
|
|
292
|
-
end
|
|
293
|
-
rescue StopIteration
|
|
294
|
-
end
|
|
295
|
-
tokens
|
|
296
|
-
end
|
|
297
|
-
|
|
298
|
-
# Returns +true+ if lex state will be +END+ after +token+.
|
|
299
|
-
def self.end?(token)
|
|
300
|
-
(token[:state] & EXPR_END)
|
|
301
|
-
end
|
|
302
|
-
end
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
##
|
|
3
|
-
# Collection of methods for writing parsers
|
|
4
|
-
|
|
5
|
-
module RDoc::Parser::RubyTools
|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
# Adds a token listener +obj+, but you should probably use token_listener
|
|
9
|
-
|
|
10
|
-
def add_token_listener(obj)
|
|
11
|
-
@token_listeners ||= []
|
|
12
|
-
@token_listeners << obj
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
##
|
|
16
|
-
# Fetches the next token from the scanner
|
|
17
|
-
|
|
18
|
-
def get_tk
|
|
19
|
-
tk = nil
|
|
20
|
-
|
|
21
|
-
if @tokens.empty? then
|
|
22
|
-
if @scanner_point >= @scanner.size
|
|
23
|
-
return
|
|
24
|
-
else
|
|
25
|
-
tk = @scanner[@scanner_point]
|
|
26
|
-
@scanner_point += 1
|
|
27
|
-
@read.push tk[:text]
|
|
28
|
-
end
|
|
29
|
-
else
|
|
30
|
-
@read.push @unget_read.shift
|
|
31
|
-
tk = @tokens.shift
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
if tk.nil? || :on___end__ == tk[:kind]
|
|
35
|
-
return
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# inform any listeners of our shiny new token
|
|
39
|
-
@token_listeners&.each do |obj|
|
|
40
|
-
obj.add_token(tk)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
tk
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
##
|
|
47
|
-
# Reads and returns all tokens up to one of +tokens+. Leaves the matched
|
|
48
|
-
# token in the token list.
|
|
49
|
-
|
|
50
|
-
def get_tk_until(*tokens)
|
|
51
|
-
read = []
|
|
52
|
-
|
|
53
|
-
loop do
|
|
54
|
-
tk = get_tk
|
|
55
|
-
|
|
56
|
-
case tk
|
|
57
|
-
when *tokens then
|
|
58
|
-
unget_tk tk
|
|
59
|
-
break
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
read << tk
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
read
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
##
|
|
69
|
-
# Retrieves a String representation of the read tokens
|
|
70
|
-
|
|
71
|
-
def get_tkread
|
|
72
|
-
read = @read.join("")
|
|
73
|
-
@read = []
|
|
74
|
-
read
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
##
|
|
78
|
-
# Peek equivalent for get_tkread
|
|
79
|
-
|
|
80
|
-
def peek_read
|
|
81
|
-
@read.join('')
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
##
|
|
85
|
-
# Peek at the next token, but don't remove it from the stream
|
|
86
|
-
|
|
87
|
-
def peek_tk
|
|
88
|
-
unget_tk(tk = get_tk)
|
|
89
|
-
tk
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
##
|
|
93
|
-
# Removes the token listener +obj+
|
|
94
|
-
|
|
95
|
-
def remove_token_listener(obj)
|
|
96
|
-
@token_listeners.delete(obj)
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
##
|
|
100
|
-
# Resets the tools
|
|
101
|
-
|
|
102
|
-
def reset
|
|
103
|
-
@read = []
|
|
104
|
-
@tokens = []
|
|
105
|
-
@unget_read = []
|
|
106
|
-
@nest = 0
|
|
107
|
-
@scanner_point = 0
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
##
|
|
111
|
-
# Skips whitespace tokens including newlines
|
|
112
|
-
|
|
113
|
-
def skip_tkspace
|
|
114
|
-
tokens = []
|
|
115
|
-
|
|
116
|
-
while (tk = get_tk) and (:on_sp == tk[:kind] or :on_nl == tk[:kind] or :on_ignored_nl == tk[:kind]) do
|
|
117
|
-
tokens.push(tk)
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
unget_tk(tk)
|
|
121
|
-
tokens
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
##
|
|
125
|
-
# Skips whitespace tokens excluding newlines
|
|
126
|
-
|
|
127
|
-
def skip_tkspace_without_nl
|
|
128
|
-
tokens = []
|
|
129
|
-
|
|
130
|
-
while (tk = get_tk) and :on_sp == tk[:kind] do
|
|
131
|
-
tokens.push(tk)
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
unget_tk(tk)
|
|
135
|
-
tokens
|
|
136
|
-
end
|
|
137
|
-
|
|
138
|
-
##
|
|
139
|
-
# Has +obj+ listen to tokens
|
|
140
|
-
|
|
141
|
-
def token_listener(obj)
|
|
142
|
-
add_token_listener obj
|
|
143
|
-
yield
|
|
144
|
-
ensure
|
|
145
|
-
remove_token_listener obj
|
|
146
|
-
end
|
|
147
|
-
|
|
148
|
-
##
|
|
149
|
-
# Returns +tk+ to the scanner
|
|
150
|
-
|
|
151
|
-
def unget_tk(tk)
|
|
152
|
-
@tokens.unshift tk
|
|
153
|
-
@unget_read.unshift @read.pop
|
|
154
|
-
|
|
155
|
-
# Remove this token from any listeners
|
|
156
|
-
@token_listeners.each do |obj|
|
|
157
|
-
obj.pop_token
|
|
158
|
-
end if @token_listeners
|
|
159
|
-
|
|
160
|
-
nil
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
end
|