rdoc 4.2.1 → 6.3.1

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