rdoc 3.1 → 6.3.3

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rdoc might be problematic. Click here for more details.

Files changed (247) hide show
  1. checksums.yaml +7 -0
  2. data/CONTRIBUTING.rdoc +220 -0
  3. data/CVE-2013-0256.rdoc +49 -0
  4. data/ExampleMarkdown.md +37 -0
  5. data/ExampleRDoc.rdoc +208 -0
  6. data/Gemfile +12 -0
  7. data/History.rdoc +1666 -0
  8. data/LEGAL.rdoc +50 -0
  9. data/LICENSE.rdoc +57 -0
  10. data/README.rdoc +129 -0
  11. data/RI.rdoc +57 -0
  12. data/Rakefile +84 -81
  13. data/TODO.rdoc +59 -0
  14. data/bin/console +7 -0
  15. data/bin/setup +6 -0
  16. data/{bin → exe}/rdoc +11 -2
  17. data/exe/ri +12 -0
  18. data/lib/rdoc/alias.rb +1 -2
  19. data/lib/rdoc/anon_class.rb +3 -2
  20. data/lib/rdoc/any_method.rb +234 -40
  21. data/lib/rdoc/attr.rb +79 -11
  22. data/lib/rdoc/class_module.rb +443 -71
  23. data/lib/rdoc/code_object.rb +216 -20
  24. data/lib/rdoc/code_objects.rb +4 -21
  25. data/lib/rdoc/comment.rb +250 -0
  26. data/lib/rdoc/constant.rb +110 -9
  27. data/lib/rdoc/context/section.rb +232 -0
  28. data/lib/rdoc/context.rb +392 -172
  29. data/lib/rdoc/cross_reference.rb +202 -0
  30. data/lib/rdoc/encoding.rb +83 -28
  31. data/lib/rdoc/erb_partial.rb +19 -0
  32. data/lib/rdoc/erbio.rb +8 -3
  33. data/lib/rdoc/extend.rb +10 -0
  34. data/lib/rdoc/generator/darkfish.rb +507 -84
  35. data/lib/rdoc/generator/json_index.rb +300 -0
  36. data/lib/rdoc/generator/markup.rb +27 -74
  37. data/lib/rdoc/generator/pot/message_extractor.rb +68 -0
  38. data/lib/rdoc/generator/pot/po.rb +84 -0
  39. data/lib/rdoc/generator/pot/po_entry.rb +141 -0
  40. data/lib/rdoc/generator/pot.rb +98 -0
  41. data/lib/rdoc/generator/ri.rb +8 -62
  42. data/lib/rdoc/generator/template/darkfish/_footer.rhtml +5 -0
  43. data/lib/rdoc/generator/template/darkfish/_head.rhtml +22 -0
  44. data/lib/rdoc/generator/template/darkfish/_sidebar_VCS_info.rhtml +19 -0
  45. data/lib/rdoc/generator/template/darkfish/_sidebar_classes.rhtml +9 -0
  46. data/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +15 -0
  47. data/lib/rdoc/generator/template/darkfish/_sidebar_in_files.rhtml +9 -0
  48. data/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +15 -0
  49. data/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +15 -0
  50. data/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml +12 -0
  51. data/lib/rdoc/generator/template/darkfish/_sidebar_navigation.rhtml +11 -0
  52. data/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +12 -0
  53. data/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml +11 -0
  54. data/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtml +14 -0
  55. data/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +11 -0
  56. data/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +18 -0
  57. data/lib/rdoc/generator/template/darkfish/class.rhtml +172 -0
  58. data/lib/rdoc/generator/template/darkfish/css/fonts.css +167 -0
  59. data/lib/rdoc/generator/template/darkfish/css/rdoc.css +639 -0
  60. data/lib/rdoc/generator/template/darkfish/fonts/Lato-Light.ttf +0 -0
  61. data/lib/rdoc/generator/template/darkfish/fonts/Lato-LightItalic.ttf +0 -0
  62. data/lib/rdoc/generator/template/darkfish/fonts/Lato-Regular.ttf +0 -0
  63. data/lib/rdoc/generator/template/darkfish/fonts/Lato-RegularItalic.ttf +0 -0
  64. data/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Bold.ttf +0 -0
  65. data/lib/rdoc/generator/template/darkfish/fonts/SourceCodePro-Regular.ttf +0 -0
  66. data/lib/rdoc/generator/template/darkfish/images/add.png +0 -0
  67. data/lib/rdoc/generator/template/darkfish/images/arrow_up.png +0 -0
  68. data/lib/rdoc/generator/template/darkfish/images/delete.png +0 -0
  69. data/lib/rdoc/generator/template/darkfish/images/tag_blue.png +0 -0
  70. data/lib/rdoc/generator/template/darkfish/images/transparent.png +0 -0
  71. data/lib/rdoc/generator/template/darkfish/index.rhtml +18 -60
  72. data/lib/rdoc/generator/template/darkfish/js/darkfish.js +51 -83
  73. data/lib/rdoc/generator/template/darkfish/js/search.js +110 -0
  74. data/lib/rdoc/generator/template/darkfish/page.rhtml +18 -0
  75. data/lib/rdoc/generator/template/darkfish/servlet_not_found.rhtml +18 -0
  76. data/lib/rdoc/generator/template/darkfish/servlet_root.rhtml +62 -0
  77. data/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml +58 -0
  78. data/lib/rdoc/generator/template/json_index/.document +1 -0
  79. data/lib/rdoc/generator/template/json_index/js/navigation.js +105 -0
  80. data/lib/rdoc/generator/template/json_index/js/searcher.js +229 -0
  81. data/lib/rdoc/generator.rb +24 -13
  82. data/lib/rdoc/ghost_method.rb +1 -2
  83. data/lib/rdoc/i18n/locale.rb +102 -0
  84. data/lib/rdoc/i18n/text.rb +126 -0
  85. data/lib/rdoc/i18n.rb +10 -0
  86. data/lib/rdoc/include.rb +5 -95
  87. data/lib/rdoc/known_classes.rb +5 -2
  88. data/lib/rdoc/markdown/entities.rb +2132 -0
  89. data/lib/rdoc/markdown/literals.kpeg +23 -0
  90. data/lib/rdoc/markdown/literals.rb +416 -0
  91. data/lib/rdoc/markdown.kpeg +1237 -0
  92. data/lib/rdoc/markdown.rb +16684 -0
  93. data/lib/rdoc/markup/attr_changer.rb +23 -0
  94. data/lib/rdoc/markup/attr_span.rb +36 -0
  95. data/lib/rdoc/markup/attribute_manager.rb +135 -62
  96. data/lib/rdoc/markup/attributes.rb +71 -0
  97. data/lib/rdoc/markup/blank_line.rb +1 -0
  98. data/lib/rdoc/markup/block_quote.rb +15 -0
  99. data/lib/rdoc/markup/document.rb +96 -9
  100. data/lib/rdoc/markup/formatter.rb +138 -25
  101. data/lib/rdoc/markup/hard_break.rb +32 -0
  102. data/lib/rdoc/markup/heading.rb +61 -2
  103. data/lib/rdoc/markup/include.rb +43 -0
  104. data/lib/rdoc/markup/indented_paragraph.rb +48 -0
  105. data/lib/rdoc/markup/list.rb +25 -4
  106. data/lib/rdoc/markup/list_item.rb +18 -4
  107. data/lib/rdoc/markup/paragraph.rb +15 -0
  108. data/lib/rdoc/markup/parser.rb +180 -88
  109. data/lib/rdoc/markup/pre_process.rb +183 -38
  110. data/lib/rdoc/markup/raw.rb +6 -5
  111. data/lib/rdoc/markup/regexp_handling.rb +41 -0
  112. data/lib/rdoc/markup/rule.rb +1 -0
  113. data/lib/rdoc/markup/table.rb +47 -0
  114. data/lib/rdoc/markup/to_ansi.rb +17 -7
  115. data/lib/rdoc/markup/to_bs.rb +5 -8
  116. data/lib/rdoc/markup/to_html.rb +238 -137
  117. data/lib/rdoc/markup/to_html_crossref.rb +125 -152
  118. data/lib/rdoc/markup/to_html_snippet.rb +285 -0
  119. data/lib/rdoc/markup/to_joined_paragraph.rb +47 -0
  120. data/lib/rdoc/markup/to_label.rb +75 -0
  121. data/lib/rdoc/markup/to_markdown.rb +192 -0
  122. data/lib/rdoc/markup/to_rdoc.rb +85 -15
  123. data/lib/rdoc/markup/to_table_of_contents.rb +89 -0
  124. data/lib/rdoc/markup/to_test.rb +2 -4
  125. data/lib/rdoc/markup/to_tt_only.rb +121 -0
  126. data/lib/rdoc/markup/verbatim.rb +39 -0
  127. data/lib/rdoc/markup.rb +388 -110
  128. data/lib/rdoc/meta_method.rb +1 -2
  129. data/lib/rdoc/method_attr.rb +87 -21
  130. data/lib/rdoc/mixin.rb +121 -0
  131. data/lib/rdoc/normal_class.rb +39 -10
  132. data/lib/rdoc/normal_module.rb +22 -7
  133. data/lib/rdoc/options.rb +613 -73
  134. data/lib/rdoc/parser/c.rb +621 -287
  135. data/lib/rdoc/parser/changelog.rb +335 -0
  136. data/lib/rdoc/parser/markdown.rb +24 -0
  137. data/lib/rdoc/parser/rd.rb +23 -0
  138. data/lib/rdoc/parser/ripper_state_lex.rb +590 -0
  139. data/lib/rdoc/parser/ruby.rb +1368 -762
  140. data/lib/rdoc/parser/ruby_tools.rb +42 -35
  141. data/lib/rdoc/parser/simple.rb +23 -11
  142. data/lib/rdoc/parser/text.rb +12 -0
  143. data/lib/rdoc/parser.rb +162 -89
  144. data/lib/rdoc/rd/block_parser.rb +1056 -0
  145. data/lib/rdoc/rd/block_parser.ry +639 -0
  146. data/lib/rdoc/rd/inline.rb +72 -0
  147. data/lib/rdoc/rd/inline_parser.rb +1208 -0
  148. data/lib/rdoc/rd/inline_parser.ry +593 -0
  149. data/lib/rdoc/rd.rb +100 -0
  150. data/lib/rdoc/rdoc.rb +208 -115
  151. data/lib/rdoc/require.rb +1 -2
  152. data/lib/rdoc/ri/driver.rb +734 -239
  153. data/lib/rdoc/ri/formatter.rb +1 -0
  154. data/lib/rdoc/ri/paths.rb +91 -48
  155. data/lib/rdoc/ri/store.rb +3 -261
  156. data/lib/rdoc/ri/task.rb +71 -0
  157. data/lib/rdoc/ri.rb +5 -2
  158. data/lib/rdoc/rubygems_hook.rb +246 -0
  159. data/lib/rdoc/servlet.rb +451 -0
  160. data/lib/rdoc/single_class.rb +14 -2
  161. data/lib/rdoc/stats/normal.rb +19 -12
  162. data/lib/rdoc/stats/quiet.rb +1 -0
  163. data/lib/rdoc/stats/verbose.rb +1 -0
  164. data/lib/rdoc/stats.rb +262 -104
  165. data/lib/rdoc/store.rb +979 -0
  166. data/lib/rdoc/task.rb +84 -44
  167. data/lib/rdoc/text.rb +117 -72
  168. data/lib/rdoc/token_stream.rb +73 -4
  169. data/lib/rdoc/tom_doc.rb +263 -0
  170. data/lib/rdoc/top_level.rb +111 -261
  171. data/lib/rdoc/version.rb +8 -0
  172. data/lib/rdoc.rb +127 -64
  173. data/man/ri.1 +247 -0
  174. data/rdoc.gemspec +249 -0
  175. metadata +171 -291
  176. data/.autotest +0 -16
  177. data/.document +0 -5
  178. data/History.txt +0 -594
  179. data/LICENSE.txt +0 -57
  180. data/Manifest.txt +0 -158
  181. data/README.txt +0 -45
  182. data/RI.txt +0 -58
  183. data/bin/ri +0 -5
  184. data/lib/rdoc/gauntlet.rb +0 -52
  185. data/lib/rdoc/generator/template/darkfish/classpage.rhtml +0 -296
  186. data/lib/rdoc/generator/template/darkfish/filepage.rhtml +0 -124
  187. data/lib/rdoc/generator/template/darkfish/js/jquery.js +0 -32
  188. data/lib/rdoc/generator/template/darkfish/js/quicksearch.js +0 -114
  189. data/lib/rdoc/generator/template/darkfish/js/thickbox-compressed.js +0 -10
  190. data/lib/rdoc/generator/template/darkfish/rdoc.css +0 -706
  191. data/lib/rdoc/markup/formatter_test_case.rb +0 -689
  192. data/lib/rdoc/markup/inline.rb +0 -137
  193. data/lib/rdoc/markup/text_formatter_test_case.rb +0 -116
  194. data/lib/rdoc/ruby_lex.rb +0 -1291
  195. data/lib/rdoc/ruby_token.rb +0 -416
  196. data/test/README +0 -1
  197. data/test/binary.dat +0 -0
  198. data/test/hidden.zip.txt +0 -1
  199. data/test/test.ja.rdoc +0 -10
  200. data/test/test.ja.txt +0 -8
  201. data/test/test.txt +0 -1
  202. data/test/test_attribute_manager.rb +0 -120
  203. data/test/test_rdoc_alias.rb +0 -13
  204. data/test/test_rdoc_any_method.rb +0 -126
  205. data/test/test_rdoc_attr.rb +0 -61
  206. data/test/test_rdoc_class_module.rb +0 -233
  207. data/test/test_rdoc_code_object.rb +0 -165
  208. data/test/test_rdoc_constant.rb +0 -15
  209. data/test/test_rdoc_context.rb +0 -370
  210. data/test/test_rdoc_encoding.rb +0 -166
  211. data/test/test_rdoc_generator_darkfish.rb +0 -119
  212. data/test/test_rdoc_generator_ri.rb +0 -76
  213. data/test/test_rdoc_include.rb +0 -96
  214. data/test/test_rdoc_markup.rb +0 -37
  215. data/test/test_rdoc_markup_attribute_manager.rb +0 -240
  216. data/test/test_rdoc_markup_document.rb +0 -51
  217. data/test/test_rdoc_markup_paragraph.rb +0 -9
  218. data/test/test_rdoc_markup_parser.rb +0 -1395
  219. data/test/test_rdoc_markup_pre_process.rb +0 -185
  220. data/test/test_rdoc_markup_raw.rb +0 -27
  221. data/test/test_rdoc_markup_to_ansi.rb +0 -328
  222. data/test/test_rdoc_markup_to_bs.rb +0 -341
  223. data/test/test_rdoc_markup_to_html.rb +0 -335
  224. data/test/test_rdoc_markup_to_html_crossref.rb +0 -169
  225. data/test/test_rdoc_markup_to_rdoc.rb +0 -327
  226. data/test/test_rdoc_method_attr.rb +0 -122
  227. data/test/test_rdoc_normal_class.rb +0 -17
  228. data/test/test_rdoc_normal_module.rb +0 -31
  229. data/test/test_rdoc_options.rb +0 -342
  230. data/test/test_rdoc_parser.rb +0 -83
  231. data/test/test_rdoc_parser_c.rb +0 -912
  232. data/test/test_rdoc_parser_ruby.rb +0 -1754
  233. data/test/test_rdoc_parser_simple.rb +0 -99
  234. data/test/test_rdoc_rdoc.rb +0 -164
  235. data/test/test_rdoc_require.rb +0 -25
  236. data/test/test_rdoc_ri_driver.rb +0 -846
  237. data/test/test_rdoc_ri_paths.rb +0 -43
  238. data/test/test_rdoc_ri_store.rb +0 -352
  239. data/test/test_rdoc_ruby_lex.rb +0 -23
  240. data/test/test_rdoc_stats.rb +0 -38
  241. data/test/test_rdoc_task.rb +0 -92
  242. data/test/test_rdoc_text.rb +0 -251
  243. data/test/test_rdoc_top_level.rb +0 -120
  244. data/test/xref_data.rb +0 -62
  245. data/test/xref_test_case.rb +0 -61
  246. data.tar.gz.sig +0 -3
  247. metadata.gz.sig +0 -0
data/lib/rdoc/ruby_lex.rb DELETED
@@ -1,1291 +0,0 @@
1
- #--
2
- # irb/ruby-lex.rb - ruby lexcal analyzer
3
- # $Release Version: 0.9.5$
4
- # $Revision: 17979 $
5
- # $Date: 2008-07-09 10:17:05 -0700 (Wed, 09 Jul 2008) $
6
- # by Keiju ISHITSUKA(keiju@ruby-lang.org)
7
- #
8
- #++
9
-
10
- require "e2mmap"
11
- require "irb/slex"
12
- require "rdoc/ruby_token"
13
- require "stringio"
14
-
15
- ##
16
- # Ruby lexer adapted from irb.
17
- #
18
- # The internals are not documented because they are scary.
19
-
20
- class RDoc::RubyLex
21
-
22
- # :stopdoc:
23
-
24
- extend Exception2MessageMapper
25
-
26
- def_exception(:AlreadyDefinedToken, "Already defined token(%s)")
27
- def_exception(:TkReading2TokenNoKey, "key nothing(key='%s')")
28
- def_exception(:TkSymbol2TokenNoKey, "key nothing(key='%s')")
29
- def_exception(:TkReading2TokenDuplicateError,
30
- "key duplicate(token_n='%s', key='%s')")
31
- def_exception(:SyntaxError, "%s")
32
-
33
- def_exception(:TerminateLineInput, "Terminate Line Input")
34
-
35
- include RDoc::RubyToken
36
- include IRB
37
-
38
- attr_reader :continue
39
- attr_reader :lex_state
40
- attr_reader :reader
41
-
42
- class << self
43
- attr_accessor :debug_level
44
- end
45
-
46
- def self.debug?
47
- @debug_level > 0
48
- end
49
-
50
- self.debug_level = 0
51
-
52
- def initialize(content, options)
53
- lex_init
54
-
55
- if /\t/ =~ content then
56
- tab_width = options.tab_width
57
- content = content.split(/\n/).map do |line|
58
- 1 while line.gsub!(/\t+/) {
59
- ' ' * (tab_width*$&.length - $`.length % tab_width)
60
- } && $~
61
- line
62
- end.join("\n")
63
- end
64
-
65
- content << "\n" unless content[-1, 1] == "\n"
66
-
67
- set_input StringIO.new content
68
-
69
- @base_char_no = 0
70
- @char_no = 0
71
- @exp_line_no = @line_no = 1
72
- @here_readed = []
73
- @readed = []
74
- @rests = []
75
- @seek = 0
76
-
77
- @here_header = false
78
- @indent = 0
79
- @indent_stack = []
80
- @lex_state = EXPR_BEG
81
- @space_seen = false
82
-
83
- @continue = false
84
- @line = ""
85
-
86
- @skip_space = false
87
- @readed_auto_clean_up = false
88
- @exception_on_syntax_error = true
89
-
90
- @prompt = nil
91
- @prev_seek = nil
92
- end
93
-
94
- def inspect # :nodoc:
95
- "#<%s:0x%x pos %d lex_state %p space_seen %p>" % [
96
- self.class, object_id,
97
- @io.pos, @lex_state, @space_seen,
98
- ]
99
- end
100
-
101
- attr_accessor :skip_space
102
- attr_accessor :readed_auto_clean_up
103
- attr_accessor :exception_on_syntax_error
104
-
105
- attr_reader :seek
106
- attr_reader :char_no
107
- attr_reader :line_no
108
- attr_reader :indent
109
-
110
- # io functions
111
- def set_input(io, p = nil, &block)
112
- @io = io
113
- if p.respond_to?(:call)
114
- @input = p
115
- elsif block_given?
116
- @input = block
117
- else
118
- @input = Proc.new{@io.gets}
119
- end
120
- end
121
-
122
- def get_readed
123
- if idx = @readed.reverse.index("\n")
124
- @base_char_no = idx
125
- else
126
- @base_char_no += @readed.size
127
- end
128
-
129
- readed = @readed.join("")
130
- @readed = []
131
- readed
132
- end
133
-
134
- def getc
135
- while @rests.empty?
136
- # return nil unless buf_input
137
- @rests.push nil unless buf_input
138
- end
139
- c = @rests.shift
140
- if @here_header
141
- @here_readed.push c
142
- else
143
- @readed.push c
144
- end
145
- @seek += 1
146
- if c == "\n"
147
- @line_no += 1
148
- @char_no = 0
149
- else
150
- @char_no += 1
151
- end
152
-
153
- c
154
- end
155
-
156
- def gets
157
- l = ""
158
- while c = getc
159
- l.concat(c)
160
- break if c == "\n"
161
- end
162
- return nil if l == "" and c.nil?
163
- l
164
- end
165
-
166
- def eof?
167
- @io.eof?
168
- end
169
-
170
- def getc_of_rests
171
- if @rests.empty?
172
- nil
173
- else
174
- getc
175
- end
176
- end
177
-
178
- def ungetc(c = nil)
179
- if @here_readed.empty?
180
- c2 = @readed.pop
181
- else
182
- c2 = @here_readed.pop
183
- end
184
- c = c2 unless c
185
- @rests.unshift c #c =
186
- @seek -= 1
187
- if c == "\n"
188
- @line_no -= 1
189
- if idx = @readed.reverse.index("\n")
190
- @char_no = @readed.size - idx
191
- else
192
- @char_no = @base_char_no + @readed.size
193
- end
194
- else
195
- @char_no -= 1
196
- end
197
- end
198
-
199
- def peek_equal?(str)
200
- chrs = str.split(//)
201
- until @rests.size >= chrs.size
202
- return false unless buf_input
203
- end
204
- @rests[0, chrs.size] == chrs
205
- end
206
-
207
- def peek_match?(regexp)
208
- while @rests.empty?
209
- return false unless buf_input
210
- end
211
- regexp =~ @rests.join("")
212
- end
213
-
214
- def peek(i = 0)
215
- while @rests.size <= i
216
- return nil unless buf_input
217
- end
218
- @rests[i]
219
- end
220
-
221
- def buf_input
222
- prompt
223
- line = @input.call
224
- return nil unless line
225
- @rests.concat line.split(//)
226
- true
227
- end
228
- private :buf_input
229
-
230
- def set_prompt(p = nil, &block)
231
- p = block if block_given?
232
- if p.respond_to?(:call)
233
- @prompt = p
234
- else
235
- @prompt = Proc.new{print p}
236
- end
237
- end
238
-
239
- def prompt
240
- if @prompt
241
- @prompt.call(@ltype, @indent, @continue, @line_no)
242
- end
243
- end
244
-
245
- def initialize_input
246
- @ltype = nil
247
- @quoted = nil
248
- @indent = 0
249
- @indent_stack = []
250
- @lex_state = EXPR_BEG
251
- @space_seen = false
252
- @here_header = false
253
-
254
- @continue = false
255
- prompt
256
-
257
- @line = ""
258
- @exp_line_no = @line_no
259
- end
260
-
261
- def each_top_level_statement
262
- initialize_input
263
- catch(:TERM_INPUT) do
264
- loop do
265
- begin
266
- @continue = false
267
- prompt
268
- unless l = lex
269
- throw :TERM_INPUT if @line == ''
270
- else
271
- #p l
272
- @line.concat l
273
- if @ltype or @continue or @indent > 0
274
- next
275
- end
276
- end
277
- if @line != "\n"
278
- yield @line, @exp_line_no
279
- end
280
- break unless l
281
- @line = ''
282
- @exp_line_no = @line_no
283
-
284
- @indent = 0
285
- @indent_stack = []
286
- prompt
287
- rescue TerminateLineInput
288
- initialize_input
289
- prompt
290
- get_readed
291
- end
292
- end
293
- end
294
- end
295
-
296
- def lex
297
- until (((tk = token).kind_of?(TkNL) || tk.kind_of?(TkEND_OF_SCRIPT)) &&
298
- !@continue or
299
- tk.nil?)
300
- #p tk
301
- #p @lex_state
302
- #p self
303
- end
304
- line = get_readed
305
- # print self.inspect
306
- if line == "" and tk.kind_of?(TkEND_OF_SCRIPT) || tk.nil?
307
- nil
308
- else
309
- line
310
- end
311
- end
312
-
313
- def token
314
- # require "tracer"
315
- # Tracer.on
316
- @prev_seek = @seek
317
- @prev_line_no = @line_no
318
- @prev_char_no = @char_no
319
- begin
320
- begin
321
- tk = @OP.match(self)
322
- @space_seen = tk.kind_of?(TkSPACE)
323
- rescue SyntaxError => e
324
- raise RDoc::Error, "syntax error: #{e.message}" if
325
- @exception_on_syntax_error
326
-
327
- tk = TkError.new(@seek, @line_no, @char_no)
328
- end
329
- end while @skip_space and tk.kind_of?(TkSPACE)
330
-
331
- if @readed_auto_clean_up
332
- get_readed
333
- end
334
- # Tracer.off
335
- tk
336
- end
337
-
338
- ENINDENT_CLAUSE = [
339
- "case", "class", "def", "do", "for", "if",
340
- "module", "unless", "until", "while", "begin" #, "when"
341
- ]
342
-
343
- DEINDENT_CLAUSE = ["end" #, "when"
344
- ]
345
-
346
- PERCENT_LTYPE = {
347
- "q" => "\'",
348
- "Q" => "\"",
349
- "x" => "\`",
350
- "r" => "/",
351
- "w" => "]",
352
- "W" => "]",
353
- "s" => ":"
354
- }
355
-
356
- PERCENT_PAREN = {
357
- "{" => "}",
358
- "[" => "]",
359
- "<" => ">",
360
- "(" => ")"
361
- }
362
-
363
- PERCENT_PAREN_REV = PERCENT_PAREN.invert
364
-
365
- Ltype2Token = {
366
- "\'" => TkSTRING,
367
- "\"" => TkSTRING,
368
- "\`" => TkXSTRING,
369
- "/" => TkREGEXP,
370
- "]" => TkDSTRING,
371
- ":" => TkSYMBOL
372
- }
373
- DLtype2Token = {
374
- "\"" => TkDSTRING,
375
- "\`" => TkDXSTRING,
376
- "/" => TkDREGEXP,
377
- }
378
-
379
- def lex_init()
380
- @OP = IRB::SLex.new
381
- @OP.def_rules("\0", "\004", "\032") do |op, io|
382
- Token(TkEND_OF_SCRIPT)
383
- end
384
-
385
- @OP.def_rules(" ", "\t", "\f", "\r", "\13") do |op, io|
386
- @space_seen = true
387
- str = op
388
- while (ch = getc) =~ /[ \t\f\r\13]/ do
389
- str << ch
390
- end
391
- ungetc
392
- Token TkSPACE, str
393
- end
394
-
395
- @OP.def_rule("#") do |op, io|
396
- identify_comment
397
- end
398
-
399
- @OP.def_rule("=begin",
400
- proc{|op, io| @prev_char_no == 0 && peek(0) =~ /\s/}) do
401
- |op, io|
402
- @ltype = "="
403
- res = ''
404
- until (ch = getc) == "\n" do res << ch end
405
- until peek_equal?("=end") && peek(4) =~ /\s/ do
406
- until (ch = getc) == "\n" do res << ch end
407
- end
408
- res << gets
409
- @ltype = nil
410
- Token(TkRD_COMMENT, res)
411
- end
412
-
413
- @OP.def_rule("\n") do |op, io|
414
- print "\\n\n" if RDoc::RubyLex.debug?
415
- case @lex_state
416
- when EXPR_BEG, EXPR_FNAME, EXPR_DOT
417
- @continue = true
418
- else
419
- @continue = false
420
- @lex_state = EXPR_BEG
421
- until (@indent_stack.empty? ||
422
- [TkLPAREN, TkLBRACK, TkLBRACE,
423
- TkfLPAREN, TkfLBRACK, TkfLBRACE].include?(@indent_stack.last))
424
- @indent_stack.pop
425
- end
426
- end
427
- @here_header = false
428
- @here_readed = []
429
- Token(TkNL)
430
- end
431
-
432
- @OP.def_rules("*", "**",
433
- "=", "==", "===",
434
- "=~", "<=>",
435
- "<", "<=",
436
- ">", ">=", ">>") do
437
- |op, io|
438
- case @lex_state
439
- when EXPR_FNAME, EXPR_DOT
440
- @lex_state = EXPR_ARG
441
- else
442
- @lex_state = EXPR_BEG
443
- end
444
- Token(op)
445
- end
446
-
447
- @OP.def_rules("!", "!=", "!~") do
448
- |op, io|
449
- @lex_state = EXPR_BEG
450
- Token(op)
451
- end
452
-
453
- @OP.def_rules("<<") do
454
- |op, io|
455
- tk = nil
456
- if @lex_state != EXPR_END && @lex_state != EXPR_CLASS &&
457
- (@lex_state != EXPR_ARG || @space_seen)
458
- c = peek(0)
459
- if /\S/ =~ c && (/["'`]/ =~ c || /\w/ =~ c || c == "-")
460
- tk = identify_here_document
461
- end
462
- end
463
- unless tk
464
- tk = Token(op)
465
- case @lex_state
466
- when EXPR_FNAME, EXPR_DOT
467
- @lex_state = EXPR_ARG
468
- else
469
- @lex_state = EXPR_BEG
470
- end
471
- end
472
- tk
473
- end
474
-
475
- @OP.def_rules("'", '"') do
476
- |op, io|
477
- identify_string(op)
478
- end
479
-
480
- @OP.def_rules("`") do
481
- |op, io|
482
- if @lex_state == EXPR_FNAME
483
- @lex_state = EXPR_END
484
- Token(op)
485
- else
486
- identify_string(op)
487
- end
488
- end
489
-
490
- @OP.def_rules('?') do
491
- |op, io|
492
- if @lex_state == EXPR_END
493
- @lex_state = EXPR_BEG
494
- Token(TkQUESTION)
495
- else
496
- ch = getc
497
- if @lex_state == EXPR_ARG && ch =~ /\s/
498
- ungetc
499
- @lex_state = EXPR_BEG;
500
- Token(TkQUESTION)
501
- else
502
- str = ch
503
- if ch == '\\'
504
- str << read_escape
505
- end
506
- @lex_state = EXPR_END
507
- str << (ch.respond_to?(:ord) ? ch.ord : ch[0])
508
- Token(TkINTEGER, str)
509
- end
510
- end
511
- end
512
-
513
- @OP.def_rules("&", "&&", "|", "||") do
514
- |op, io|
515
- @lex_state = EXPR_BEG
516
- Token(op)
517
- end
518
-
519
- @OP.def_rules("+=", "-=", "*=", "**=",
520
- "&=", "|=", "^=", "<<=", ">>=", "||=", "&&=") do
521
- |op, io|
522
- @lex_state = EXPR_BEG
523
- op =~ /^(.*)=$/
524
- Token(TkOPASGN, $1)
525
- end
526
-
527
- @OP.def_rule("+@", proc{|op, io| @lex_state == EXPR_FNAME}) do
528
- |op, io|
529
- @lex_state = EXPR_ARG
530
- Token(op)
531
- end
532
-
533
- @OP.def_rule("-@", proc{|op, io| @lex_state == EXPR_FNAME}) do
534
- |op, io|
535
- @lex_state = EXPR_ARG
536
- Token(op)
537
- end
538
-
539
- @OP.def_rules("+", "-") do
540
- |op, io|
541
- catch(:RET) do
542
- if @lex_state == EXPR_ARG
543
- if @space_seen and peek(0) =~ /[0-9]/
544
- throw :RET, identify_number(op)
545
- else
546
- @lex_state = EXPR_BEG
547
- end
548
- elsif @lex_state != EXPR_END and peek(0) =~ /[0-9]/
549
- throw :RET, identify_number(op)
550
- else
551
- @lex_state = EXPR_BEG
552
- end
553
- Token(op)
554
- end
555
- end
556
-
557
- @OP.def_rule(".") do
558
- |op, io|
559
- @lex_state = EXPR_BEG
560
- if peek(0) =~ /[0-9]/
561
- ungetc
562
- identify_number
563
- else
564
- # for "obj.if" etc.
565
- @lex_state = EXPR_DOT
566
- Token(TkDOT)
567
- end
568
- end
569
-
570
- @OP.def_rules("..", "...") do
571
- |op, io|
572
- @lex_state = EXPR_BEG
573
- Token(op)
574
- end
575
-
576
- lex_int2
577
- end
578
-
579
- def lex_int2
580
- @OP.def_rules("]", "}", ")") do
581
- |op, io|
582
- @lex_state = EXPR_END
583
- @indent -= 1
584
- @indent_stack.pop
585
- Token(op)
586
- end
587
-
588
- @OP.def_rule(":") do
589
- |op, io|
590
- if @lex_state == EXPR_END || peek(0) =~ /\s/
591
- @lex_state = EXPR_BEG
592
- Token(TkCOLON)
593
- else
594
- @lex_state = EXPR_FNAME;
595
- Token(TkSYMBEG)
596
- end
597
- end
598
-
599
- @OP.def_rule("::") do
600
- |op, io|
601
- # p @lex_state.id2name, @space_seen
602
- if @lex_state == EXPR_BEG or @lex_state == EXPR_ARG && @space_seen
603
- @lex_state = EXPR_BEG
604
- Token(TkCOLON3)
605
- else
606
- @lex_state = EXPR_DOT
607
- Token(TkCOLON2)
608
- end
609
- end
610
-
611
- @OP.def_rule("/") do
612
- |op, io|
613
- if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
614
- identify_string(op)
615
- elsif peek(0) == '='
616
- getc
617
- @lex_state = EXPR_BEG
618
- Token(TkOPASGN, "/") #/)
619
- elsif @lex_state == EXPR_ARG and @space_seen and peek(0) !~ /\s/
620
- identify_string(op)
621
- else
622
- @lex_state = EXPR_BEG
623
- Token("/") #/)
624
- end
625
- end
626
-
627
- @OP.def_rules("^") do
628
- |op, io|
629
- @lex_state = EXPR_BEG
630
- Token("^")
631
- end
632
-
633
- # @OP.def_rules("^=") do
634
- # @lex_state = EXPR_BEG
635
- # Token(OP_ASGN, :^)
636
- # end
637
-
638
- @OP.def_rules(",") do
639
- |op, io|
640
- @lex_state = EXPR_BEG
641
- Token(op)
642
- end
643
-
644
- @OP.def_rules(";") do
645
- |op, io|
646
- @lex_state = EXPR_BEG
647
- until (@indent_stack.empty? ||
648
- [TkLPAREN, TkLBRACK, TkLBRACE,
649
- TkfLPAREN, TkfLBRACK, TkfLBRACE].include?(@indent_stack.last))
650
- @indent_stack.pop
651
- end
652
- Token(op)
653
- end
654
-
655
- @OP.def_rule("~") do
656
- |op, io|
657
- @lex_state = EXPR_BEG
658
- Token("~")
659
- end
660
-
661
- @OP.def_rule("~@", proc{|op, io| @lex_state == EXPR_FNAME}) do
662
- |op, io|
663
- @lex_state = EXPR_BEG
664
- Token("~")
665
- end
666
-
667
- @OP.def_rule("(") do
668
- |op, io|
669
- @indent += 1
670
- if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
671
- @lex_state = EXPR_BEG
672
- tk_c = TkfLPAREN
673
- else
674
- @lex_state = EXPR_BEG
675
- tk_c = TkLPAREN
676
- end
677
- @indent_stack.push tk_c
678
- Token tk_c
679
- end
680
-
681
- @OP.def_rule("[]", proc{|op, io| @lex_state == EXPR_FNAME}) do
682
- |op, io|
683
- @lex_state = EXPR_ARG
684
- Token("[]")
685
- end
686
-
687
- @OP.def_rule("[]=", proc{|op, io| @lex_state == EXPR_FNAME}) do
688
- |op, io|
689
- @lex_state = EXPR_ARG
690
- Token("[]=")
691
- end
692
-
693
- @OP.def_rule("[") do
694
- |op, io|
695
- @indent += 1
696
- if @lex_state == EXPR_FNAME
697
- tk_c = TkfLBRACK
698
- else
699
- if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
700
- tk_c = TkLBRACK
701
- elsif @lex_state == EXPR_ARG && @space_seen
702
- tk_c = TkLBRACK
703
- else
704
- tk_c = TkfLBRACK
705
- end
706
- @lex_state = EXPR_BEG
707
- end
708
- @indent_stack.push tk_c
709
- Token(tk_c)
710
- end
711
-
712
- @OP.def_rule("{") do
713
- |op, io|
714
- @indent += 1
715
- if @lex_state != EXPR_END && @lex_state != EXPR_ARG
716
- tk_c = TkLBRACE
717
- else
718
- tk_c = TkfLBRACE
719
- end
720
- @lex_state = EXPR_BEG
721
- @indent_stack.push tk_c
722
- Token(tk_c)
723
- end
724
-
725
- @OP.def_rule('\\') do
726
- |op, io|
727
- if getc == "\n"
728
- @space_seen = true
729
- @continue = true
730
- Token(TkSPACE)
731
- else
732
- ungetc
733
- Token("\\")
734
- end
735
- end
736
-
737
- @OP.def_rule('%') do
738
- |op, io|
739
- if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
740
- identify_quotation
741
- elsif peek(0) == '='
742
- getc
743
- Token(TkOPASGN, :%)
744
- elsif @lex_state == EXPR_ARG and @space_seen and peek(0) !~ /\s/
745
- identify_quotation
746
- else
747
- @lex_state = EXPR_BEG
748
- Token("%") #))
749
- end
750
- end
751
-
752
- @OP.def_rule('$') do
753
- |op, io|
754
- identify_gvar
755
- end
756
-
757
- @OP.def_rule('@') do
758
- |op, io|
759
- if peek(0) =~ /[\w@]/
760
- ungetc
761
- identify_identifier
762
- else
763
- Token("@")
764
- end
765
- end
766
-
767
- # @OP.def_rule("def", proc{|op, io| /\s/ =~ io.peek(0)}) do
768
- # |op, io|
769
- # @indent += 1
770
- # @lex_state = EXPR_FNAME
771
- # # @lex_state = EXPR_END
772
- # # until @rests[0] == "\n" or @rests[0] == ";"
773
- # # rests.shift
774
- # # end
775
- # end
776
-
777
- @OP.def_rule("_") do
778
- if peek_match?(/_END__/) and @lex_state == EXPR_BEG then
779
- Token(TkEND_OF_SCRIPT)
780
- else
781
- ungetc
782
- identify_identifier
783
- end
784
- end
785
-
786
- @OP.def_rule("") do
787
- |op, io|
788
- printf "MATCH: start %s: %s\n", op, io.inspect if RDoc::RubyLex.debug?
789
- if peek(0) =~ /[0-9]/
790
- t = identify_number
791
- else
792
- t = identify_identifier
793
- end
794
- printf "MATCH: end %s: %s\n", op, io.inspect if RDoc::RubyLex.debug?
795
- t
796
- end
797
-
798
- p @OP if RDoc::RubyLex.debug?
799
- end
800
-
801
- def identify_gvar
802
- @lex_state = EXPR_END
803
-
804
- case ch = getc
805
- when /[~_*$?!@\/\\;,=:<>".]/ #"
806
- Token(TkGVAR, "$" + ch)
807
- when "-"
808
- Token(TkGVAR, "$-" + getc)
809
- when "&", "`", "'", "+"
810
- Token(TkBACK_REF, "$"+ch)
811
- when /[1-9]/
812
- ref = ch
813
- while (ch = getc) =~ /[0-9]/ do ref << ch end
814
- ungetc
815
- Token(TkNTH_REF, "$#{ref}")
816
- when /\w/
817
- ungetc
818
- ungetc
819
- identify_identifier
820
- else
821
- ungetc
822
- Token("$")
823
- end
824
- end
825
-
826
- IDENT_RE = if defined? Encoding then
827
- /[\w\u0080-\uFFFF]/u
828
- else
829
- /[\w\x80-\xFF]/
830
- end
831
-
832
- def identify_identifier
833
- token = ""
834
- if peek(0) =~ /[$@]/
835
- token.concat(c = getc)
836
- if c == "@" and peek(0) == "@"
837
- token.concat getc
838
- end
839
- end
840
-
841
- while (ch = getc) =~ IDENT_RE do
842
- print " :#{ch}: " if RDoc::RubyLex.debug?
843
- token.concat ch
844
- end
845
-
846
- ungetc
847
-
848
- if (ch == "!" || ch == "?") && token[0,1] =~ /\w/ && peek(0) != "="
849
- token.concat getc
850
- end
851
-
852
- # almost fix token
853
-
854
- case token
855
- when /^\$/
856
- return Token(TkGVAR, token)
857
- when /^\@\@/
858
- @lex_state = EXPR_END
859
- # p Token(TkCVAR, token)
860
- return Token(TkCVAR, token)
861
- when /^\@/
862
- @lex_state = EXPR_END
863
- return Token(TkIVAR, token)
864
- end
865
-
866
- if @lex_state != EXPR_DOT
867
- print token, "\n" if RDoc::RubyLex.debug?
868
-
869
- token_c, *trans = TkReading2Token[token]
870
- if token_c
871
- # reserved word?
872
-
873
- if (@lex_state != EXPR_BEG &&
874
- @lex_state != EXPR_FNAME &&
875
- trans[1])
876
- # modifiers
877
- token_c = TkSymbol2Token[trans[1]]
878
- @lex_state = trans[0]
879
- else
880
- if @lex_state != EXPR_FNAME
881
- if ENINDENT_CLAUSE.include?(token)
882
- # check for ``class = val'' etc.
883
- valid = true
884
- case token
885
- when "class"
886
- valid = false unless peek_match?(/^\s*(<<|\w|::)/)
887
- when "def"
888
- valid = false if peek_match?(/^\s*(([+-\/*&\|^]|<<|>>|\|\||\&\&)=|\&\&|\|\|)/)
889
- when "do"
890
- valid = false if peek_match?(/^\s*([+-\/*]?=|\*|<|>|\&)/)
891
- when *ENINDENT_CLAUSE
892
- valid = false if peek_match?(/^\s*([+-\/*]?=|\*|<|>|\&|\|)/)
893
- else
894
- # no nothing
895
- end
896
- if valid
897
- if token == "do"
898
- if ![TkFOR, TkWHILE, TkUNTIL].include?(@indent_stack.last)
899
- @indent += 1
900
- @indent_stack.push token_c
901
- end
902
- else
903
- @indent += 1
904
- @indent_stack.push token_c
905
- end
906
- end
907
-
908
- elsif DEINDENT_CLAUSE.include?(token)
909
- @indent -= 1
910
- @indent_stack.pop
911
- end
912
- @lex_state = trans[0]
913
- else
914
- @lex_state = EXPR_END
915
- end
916
- end
917
- return Token(token_c, token)
918
- end
919
- end
920
-
921
- if @lex_state == EXPR_FNAME
922
- @lex_state = EXPR_END
923
- if peek(0) == '='
924
- token.concat getc
925
- end
926
- elsif @lex_state == EXPR_BEG || @lex_state == EXPR_DOT
927
- @lex_state = EXPR_ARG
928
- else
929
- @lex_state = EXPR_END
930
- end
931
-
932
- if token[0, 1] =~ /[A-Z]/
933
- return Token(TkCONSTANT, token)
934
- elsif token[token.size - 1, 1] =~ /[!?]/
935
- return Token(TkFID, token)
936
- else
937
- return Token(TkIDENTIFIER, token)
938
- end
939
- end
940
-
941
- def identify_here_document
942
- ch = getc
943
- # if lt = PERCENT_LTYPE[ch]
944
- if ch == "-"
945
- ch = getc
946
- indent = true
947
- end
948
- if /['"`]/ =~ ch
949
- lt = ch
950
- quoted = ""
951
- while (c = getc) && c != lt
952
- quoted.concat c
953
- end
954
- else
955
- lt = '"'
956
- quoted = ch.dup
957
- while (c = getc) && c =~ /\w/
958
- quoted.concat c
959
- end
960
- ungetc
961
- end
962
-
963
- ltback, @ltype = @ltype, lt
964
- reserve = []
965
- while ch = getc
966
- reserve.push ch
967
- if ch == "\\"
968
- reserve.push ch = getc
969
- elsif ch == "\n"
970
- break
971
- end
972
- end
973
-
974
- @here_header = false
975
- doc = ''
976
- while l = gets
977
- l = l.sub(/(:?\r)?\n\z/, '')
978
- if (indent ? l.strip : l) == quoted
979
- break
980
- end
981
- doc << l
982
- end
983
-
984
- @here_header = true
985
- @here_readed.concat reserve
986
- while ch = reserve.pop
987
- ungetc ch
988
- end
989
-
990
- @ltype = ltback
991
- @lex_state = EXPR_END
992
- Token(Ltype2Token[lt], doc)
993
- end
994
-
995
- def identify_quotation
996
- ch = getc
997
- if lt = PERCENT_LTYPE[ch]
998
- ch = getc
999
- elsif ch =~ /\W/
1000
- lt = "\""
1001
- else
1002
- raise RDoc::Error, "unknown type of %string #{ch.inspect}"
1003
- end
1004
- # if ch !~ /\W/
1005
- # ungetc
1006
- # next
1007
- # end
1008
- #@ltype = lt
1009
- @quoted = ch unless @quoted = PERCENT_PAREN[ch]
1010
- identify_string(lt, @quoted)
1011
- end
1012
-
1013
- def identify_number(op = "")
1014
- @lex_state = EXPR_END
1015
-
1016
- num = op
1017
-
1018
- if peek(0) == "0" && peek(1) !~ /[.eE]/
1019
- num << getc
1020
-
1021
- case peek(0)
1022
- when /[xX]/
1023
- ch = getc
1024
- match = /[0-9a-fA-F_]/
1025
- when /[bB]/
1026
- ch = getc
1027
- match = /[01_]/
1028
- when /[oO]/
1029
- ch = getc
1030
- match = /[0-7_]/
1031
- when /[dD]/
1032
- ch = getc
1033
- match = /[0-9_]/
1034
- when /[0-7]/
1035
- match = /[0-7_]/
1036
- when /[89]/
1037
- raise RDoc::Error, "Illegal octal digit"
1038
- else
1039
- return Token(TkINTEGER, num)
1040
- end
1041
-
1042
- num << ch if ch
1043
-
1044
- len0 = true
1045
- non_digit = false
1046
- while ch = getc
1047
- num << ch
1048
- if match =~ ch
1049
- if ch == "_"
1050
- if non_digit
1051
- raise RDoc::Error, "trailing `#{ch}' in number"
1052
- else
1053
- non_digit = ch
1054
- end
1055
- else
1056
- non_digit = false
1057
- len0 = false
1058
- end
1059
- else
1060
- ungetc
1061
- num[-1, 1] = ''
1062
- if len0
1063
- raise RDoc::Error, "numeric literal without digits"
1064
- end
1065
- if non_digit
1066
- raise RDoc::Error, "trailing `#{non_digit}' in number"
1067
- end
1068
- break
1069
- end
1070
- end
1071
- return Token(TkINTEGER, num)
1072
- end
1073
-
1074
- type = TkINTEGER
1075
- allow_point = true
1076
- allow_e = true
1077
- non_digit = false
1078
- while ch = getc
1079
- num << ch
1080
- case ch
1081
- when /[0-9]/
1082
- non_digit = false
1083
- when "_"
1084
- non_digit = ch
1085
- when allow_point && "."
1086
- if non_digit
1087
- raise RDoc::Error, "trailing `#{non_digit}' in number"
1088
- end
1089
- type = TkFLOAT
1090
- if peek(0) !~ /[0-9]/
1091
- type = TkINTEGER
1092
- ungetc
1093
- num[-1, 1] = ''
1094
- break
1095
- end
1096
- allow_point = false
1097
- when allow_e && "e", allow_e && "E"
1098
- if non_digit
1099
- raise RDoc::Error, "trailing `#{non_digit}' in number"
1100
- end
1101
- type = TkFLOAT
1102
- if peek(0) =~ /[+-]/
1103
- num << getc
1104
- end
1105
- allow_e = false
1106
- allow_point = false
1107
- non_digit = ch
1108
- else
1109
- if non_digit
1110
- raise RDoc::Error, "trailing `#{non_digit}' in number"
1111
- end
1112
- ungetc
1113
- num[-1, 1] = ''
1114
- break
1115
- end
1116
- end
1117
-
1118
- Token(type, num)
1119
- end
1120
-
1121
- def identify_string(ltype, quoted = ltype)
1122
- @ltype = ltype
1123
- @quoted = quoted
1124
-
1125
- str = if ltype == quoted then
1126
- ltype.dup
1127
- else
1128
- "%#{PERCENT_PAREN_REV[quoted]}"
1129
- end
1130
-
1131
- subtype = nil
1132
- begin
1133
- nest = 0
1134
-
1135
- while ch = getc
1136
- str << ch
1137
-
1138
- if @quoted == ch and nest == 0
1139
- break
1140
- elsif @ltype != "'" && @ltype != "]" && @ltype != ":" and ch == "#"
1141
- ch = getc
1142
- subtype = true
1143
- if ch == "{" then
1144
- str << ch << skip_inner_expression
1145
- next
1146
- else
1147
- ungetc
1148
- end
1149
- elsif ch == '\\' and @ltype == "'" #'
1150
- case ch = getc
1151
- when "\\", "\n", "'"
1152
- else
1153
- ungetc
1154
- end
1155
- elsif ch == '\\' #'
1156
- str << read_escape
1157
- end
1158
-
1159
- if PERCENT_PAREN.values.include?(@quoted)
1160
- if PERCENT_PAREN[ch] == @quoted
1161
- nest += 1
1162
- elsif ch == @quoted
1163
- nest -= 1
1164
- end
1165
- end
1166
- end
1167
-
1168
- if @ltype == "/"
1169
- if peek(0) =~ /i|m|x|o|e|s|u|n/
1170
- getc
1171
- end
1172
- end
1173
-
1174
- if subtype
1175
- Token(DLtype2Token[ltype], str)
1176
- else
1177
- Token(Ltype2Token[ltype], str)
1178
- end
1179
- ensure
1180
- @ltype = nil
1181
- @quoted = nil
1182
- @lex_state = EXPR_END
1183
- end
1184
- end
1185
-
1186
- def skip_inner_expression
1187
- res = ""
1188
- nest = 0
1189
- while ch = getc
1190
- res << ch
1191
- if ch == '}'
1192
- break if nest.zero?
1193
- nest -= 1
1194
- elsif ch == '{'
1195
- nest += 1
1196
- end
1197
- end
1198
- res
1199
- end
1200
-
1201
- def identify_comment
1202
- @ltype = "#"
1203
-
1204
- comment = '#'
1205
-
1206
- while ch = getc
1207
- # if ch == "\\" #"
1208
- # read_escape
1209
- # end
1210
- if ch == "\n"
1211
- @ltype = nil
1212
- ungetc
1213
- break
1214
- end
1215
-
1216
- comment << ch
1217
- end
1218
-
1219
- return Token(TkCOMMENT, comment)
1220
- end
1221
-
1222
- def read_escape
1223
- escape = ''
1224
- ch = getc
1225
- escape << ch
1226
-
1227
- case ch
1228
- when "\n", "\r", "\f"
1229
- when "\\", "n", "t", "r", "f", "v", "a", "e", "b", "s" #"
1230
- when /[0-7]/
1231
- ungetc ch
1232
- 3.times do
1233
- ch = getc
1234
- escape << ch
1235
- case ch
1236
- when /[0-7]/
1237
- when nil
1238
- break
1239
- else
1240
- ungetc
1241
- break
1242
- end
1243
- end
1244
-
1245
- when "x"
1246
- 2.times do
1247
- ch = getc
1248
- escape << ch
1249
- case ch
1250
- when /[0-9a-fA-F]/
1251
- when nil
1252
- break
1253
- else
1254
- ungetc
1255
- break
1256
- end
1257
- end
1258
-
1259
- when "M"
1260
- ch = getc
1261
- escape << ch
1262
- if ch != '-'
1263
- ungetc
1264
- else
1265
- ch = getc
1266
- escape << ch
1267
- if ch == "\\" #"
1268
- escape << read_escape
1269
- end
1270
- end
1271
-
1272
- when "C", "c" #, "^"
1273
- if ch == "C" and (ch = getc) != "-"
1274
- escape << ch
1275
- ungetc
1276
- elsif (ch = getc) == "\\" #"
1277
- escape << ch << read_escape
1278
- end
1279
- else
1280
- # other characters
1281
- end
1282
-
1283
- escape
1284
- end
1285
-
1286
- # :startdoc:
1287
-
1288
- end
1289
-
1290
- #RDoc::RubyLex.debug_level = 1
1291
-