opal 0.3.11 → 0.3.15

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.
Files changed (282) hide show
  1. data/.gitignore +13 -0
  2. data/Gemfile +10 -0
  3. data/LICENSE +20 -0
  4. data/README.md +11 -116
  5. data/Rakefile +126 -0
  6. data/bin/opal +1 -2
  7. data/docs/spec_runner.html +16 -0
  8. data/index.html +434 -0
  9. data/lib/opal.rb +14 -15
  10. data/lib/opal/builder.rb +46 -148
  11. data/lib/opal/command.rb +45 -115
  12. data/lib/opal/context.rb +139 -78
  13. data/lib/opal/dependency_builder.rb +34 -0
  14. data/lib/opal/environment.rb +92 -0
  15. data/lib/opal/parser/grammar.rb +4915 -0
  16. data/lib/opal/{parser.y → parser/grammar.y} +430 -284
  17. data/lib/opal/parser/lexer.rb +1329 -0
  18. data/lib/opal/parser/parser.rb +1460 -0
  19. data/lib/opal/parser/scope.rb +140 -0
  20. data/lib/opal/parser/sexp.rb +17 -0
  21. data/lib/opal/version.rb +2 -1
  22. data/opal.gemspec +23 -0
  23. data/opal.js +3149 -4162
  24. data/runtime/README.md +25 -0
  25. data/runtime/corelib/alpha.rb +10 -0
  26. data/runtime/corelib/array.rb +962 -0
  27. data/runtime/corelib/basic_object.rb +66 -0
  28. data/runtime/corelib/boolean.rb +44 -0
  29. data/runtime/corelib/class.rb +43 -0
  30. data/runtime/corelib/comparable.rb +25 -0
  31. data/runtime/corelib/complex.rb +2 -0
  32. data/runtime/corelib/dir.rb +29 -0
  33. data/runtime/corelib/enumerable.rb +316 -0
  34. data/runtime/corelib/enumerator.rb +80 -0
  35. data/runtime/corelib/error.rb +25 -0
  36. data/runtime/corelib/file.rb +80 -0
  37. data/runtime/corelib/hash.rb +503 -0
  38. data/runtime/corelib/io.rb +44 -0
  39. data/runtime/corelib/kernel.rb +237 -0
  40. data/runtime/corelib/load_order +29 -0
  41. data/runtime/corelib/match_data.rb +37 -0
  42. data/runtime/corelib/module.rb +171 -0
  43. data/runtime/corelib/native.rb +50 -0
  44. data/runtime/corelib/nil_class.rb +47 -0
  45. data/runtime/corelib/numeric.rb +219 -0
  46. data/runtime/corelib/object.rb +21 -0
  47. data/runtime/corelib/proc.rb +42 -0
  48. data/runtime/corelib/range.rb +38 -0
  49. data/runtime/corelib/rational.rb +16 -0
  50. data/runtime/corelib/regexp.rb +63 -0
  51. data/runtime/corelib/string.rb +185 -0
  52. data/runtime/corelib/struct.rb +97 -0
  53. data/runtime/corelib/time.rb +196 -0
  54. data/runtime/corelib/top_self.rb +7 -0
  55. data/runtime/gemlib/alpha.rb +5 -0
  56. data/runtime/gemlib/kernel.rb +17 -0
  57. data/runtime/gemlib/load_order +2 -0
  58. data/runtime/kernel/class.js +256 -0
  59. data/runtime/kernel/debug.js +42 -0
  60. data/runtime/kernel/init.js +114 -0
  61. data/runtime/kernel/load_order +5 -0
  62. data/runtime/kernel/loader.js +151 -0
  63. data/runtime/kernel/runtime.js +414 -0
  64. data/runtime/spec/README.md +34 -0
  65. data/runtime/spec/core/array/allocate_spec.rb +15 -0
  66. data/runtime/spec/core/array/append_spec.rb +31 -0
  67. data/runtime/spec/core/array/assoc_spec.rb +29 -0
  68. data/runtime/spec/core/array/at_spec.rb +38 -0
  69. data/runtime/spec/core/array/clear_spec.rb +22 -0
  70. data/runtime/spec/core/array/collect_spec.rb +3 -0
  71. data/runtime/spec/core/array/compact_spec.rb +42 -0
  72. data/runtime/spec/core/array/concat_spec.rb +21 -0
  73. data/runtime/spec/core/array/constructor_spec.rb +24 -0
  74. data/runtime/spec/core/array/count_spec.rb +11 -0
  75. data/runtime/spec/core/array/delete_at_spec.rb +31 -0
  76. data/runtime/spec/core/array/delete_if_spec.rb +24 -0
  77. data/runtime/spec/core/array/delete_spec.rb +26 -0
  78. data/runtime/spec/core/array/each_index_spec.rb +33 -0
  79. data/runtime/spec/core/array/each_spec.rb +11 -0
  80. data/runtime/spec/core/array/element_reference_spec.rb +136 -0
  81. data/runtime/spec/core/array/element_set_spec.rb +7 -0
  82. data/runtime/spec/core/array/empty_spec.rb +10 -0
  83. data/runtime/spec/core/array/eql_spec.rb +3 -0
  84. data/runtime/spec/core/array/equal_value_spec.rb +3 -0
  85. data/runtime/spec/core/array/fetch_spec.rb +26 -0
  86. data/runtime/spec/core/array/first_spec.rb +54 -0
  87. data/runtime/spec/core/array/fixtures/classes.rb +8 -0
  88. data/runtime/spec/core/array/flatten_spec.rb +41 -0
  89. data/runtime/spec/core/array/include_spec.rb +20 -0
  90. data/runtime/spec/core/array/insert_spec.rb +59 -0
  91. data/runtime/spec/core/array/last_spec.rb +57 -0
  92. data/runtime/spec/core/array/length_spec.rb +3 -0
  93. data/runtime/spec/core/array/map_spec.rb +3 -0
  94. data/runtime/spec/core/array/plus_spec.rb +16 -0
  95. data/runtime/spec/core/array/pop_spec.rb +79 -0
  96. data/runtime/spec/core/array/push_spec.rb +19 -0
  97. data/runtime/spec/core/array/rassoc_spec.rb +12 -0
  98. data/runtime/spec/core/array/reject_spec.rb +54 -0
  99. data/runtime/spec/core/array/replace_spec.rb +3 -0
  100. data/runtime/spec/core/array/reverse_each_spec.rb +18 -0
  101. data/runtime/spec/core/array/reverse_spec.rb +9 -0
  102. data/runtime/spec/core/array/shared/collect.rb +53 -0
  103. data/runtime/spec/core/array/shared/eql.rb +19 -0
  104. data/runtime/spec/core/array/shared/length.rb +6 -0
  105. data/runtime/spec/core/array/shared/replace.rb +31 -0
  106. data/runtime/spec/core/class/new_spec.rb +19 -0
  107. data/runtime/spec/core/enumerable/all_spec.rb +102 -0
  108. data/runtime/spec/core/enumerable/any_spec.rb +115 -0
  109. data/runtime/spec/core/enumerable/collect_spec.rb +3 -0
  110. data/runtime/spec/core/enumerable/count_spec.rb +29 -0
  111. data/runtime/spec/core/enumerable/detect_spec.rb +3 -0
  112. data/runtime/spec/core/enumerable/find_spec.rb +3 -0
  113. data/runtime/spec/core/enumerable/fixtures/classes.rb +26 -0
  114. data/runtime/spec/core/enumerable/shared/collect.rb +12 -0
  115. data/runtime/spec/core/enumerable/shared/entries.rb +7 -0
  116. data/runtime/spec/core/enumerable/shared/find.rb +49 -0
  117. data/runtime/spec/core/enumerable/to_a_spec.rb +7 -0
  118. data/runtime/spec/core/false/and_spec.rb +11 -0
  119. data/runtime/spec/core/false/inspect_spec.rb +7 -0
  120. data/runtime/spec/core/false/or_spec.rb +11 -0
  121. data/runtime/spec/core/false/to_s_spec.rb +7 -0
  122. data/runtime/spec/core/false/xor_spec.rb +11 -0
  123. data/runtime/spec/core/hash/allocate_spec.rb +15 -0
  124. data/runtime/spec/core/hash/assoc_spec.rb +29 -0
  125. data/runtime/spec/core/hash/clear_spec.rb +21 -0
  126. data/runtime/spec/core/hash/clone_spec.rb +12 -0
  127. data/runtime/spec/core/hash/default_spec.rb +6 -0
  128. data/runtime/spec/core/hash/delete_if_spec.rb +15 -0
  129. data/runtime/spec/core/hash/element_reference_spec.rb +16 -0
  130. data/runtime/spec/core/hash/element_set_spec.rb +8 -0
  131. data/runtime/spec/core/hash/new_spec.rb +13 -0
  132. data/runtime/spec/core/matchdata/to_a_spec.rb +7 -0
  133. data/runtime/spec/core/nil/and_spec.rb +12 -0
  134. data/runtime/spec/core/nil/inspect_spec.rb +8 -0
  135. data/runtime/spec/core/nil/nil_spec.rb +8 -0
  136. data/runtime/spec/core/nil/or_spec.rb +12 -0
  137. data/runtime/spec/core/nil/to_a_spec.rb +8 -0
  138. data/runtime/spec/core/nil/to_f_spec.rb +12 -0
  139. data/runtime/spec/core/nil/to_i_spec.rb +12 -0
  140. data/runtime/spec/core/nil/to_s_spec.rb +8 -0
  141. data/runtime/spec/core/nil/xor_spec.rb +12 -0
  142. data/runtime/spec/core/numeric/equal_value_spec.rb +11 -0
  143. data/runtime/spec/core/object/is_a_spec.rb +2 -0
  144. data/runtime/spec/core/object/shared/kind_of.rb +0 -0
  145. data/runtime/spec/core/regexp/match_spec.rb +23 -0
  146. data/runtime/spec/core/regexp/shared/match.rb +11 -0
  147. data/runtime/spec/core/symbol/to_proc_spec.rb +8 -0
  148. data/runtime/spec/core/true/and_spec.rb +11 -0
  149. data/runtime/spec/core/true/inspect_spec.rb +7 -0
  150. data/runtime/spec/core/true/or_spec.rb +11 -0
  151. data/runtime/spec/core/true/to_s_spec.rb +7 -0
  152. data/runtime/spec/core/true/xor_spec.rb +11 -0
  153. data/runtime/spec/language/alias_spec.rb +25 -0
  154. data/runtime/spec/language/and_spec.rb +62 -0
  155. data/runtime/spec/language/array_spec.rb +68 -0
  156. data/runtime/spec/language/block_spec.rb +105 -0
  157. data/runtime/spec/language/break_spec.rb +49 -0
  158. data/runtime/spec/language/case_spec.rb +165 -0
  159. data/runtime/spec/language/defined_spec.rb +80 -0
  160. data/runtime/spec/language/ensure_spec.rb +82 -0
  161. data/runtime/spec/language/fixtures/block.rb +19 -0
  162. data/runtime/spec/language/fixtures/break.rb +39 -0
  163. data/runtime/spec/language/fixtures/defined.rb +9 -0
  164. data/runtime/spec/language/fixtures/ensure.rb +37 -0
  165. data/runtime/spec/language/fixtures/next.rb +46 -0
  166. data/runtime/spec/language/fixtures/send.rb +36 -0
  167. data/runtime/spec/language/fixtures/super.rb +43 -0
  168. data/runtime/spec/language/hash_spec.rb +43 -0
  169. data/runtime/spec/language/if_spec.rb +278 -0
  170. data/runtime/spec/language/loop_spec.rb +32 -0
  171. data/runtime/spec/language/next_spec.rb +128 -0
  172. data/runtime/spec/language/or_spec.rb +65 -0
  173. data/runtime/spec/language/predefined_spec.rb +21 -0
  174. data/runtime/spec/language/regexp/interpolation_spec.rb +9 -0
  175. data/runtime/spec/language/regexp_spec.rb +7 -0
  176. data/runtime/spec/language/send_spec.rb +105 -0
  177. data/runtime/spec/language/string_spec.rb +4 -0
  178. data/runtime/spec/language/super_spec.rb +18 -0
  179. data/runtime/spec/language/symbol_spec.rb +41 -0
  180. data/runtime/spec/language/undef_spec.rb +16 -0
  181. data/runtime/spec/language/unless_spec.rb +44 -0
  182. data/runtime/spec/language/until_spec.rb +137 -0
  183. data/runtime/spec/language/variables_spec.rb +28 -0
  184. data/runtime/spec/language/versions/hash_1.9.rb +20 -0
  185. data/runtime/spec/language/while_spec.rb +175 -0
  186. data/runtime/spec/library/stringscanner/scan_spec.rb +36 -0
  187. data/runtime/spec/opal/forwardable/def_instance_delegator_spec.rb +49 -0
  188. data/runtime/spec/opal/opal/defined_spec.rb +15 -0
  189. data/runtime/spec/opal/opal/function_spec.rb +11 -0
  190. data/runtime/spec/opal/opal/native_spec.rb +16 -0
  191. data/runtime/spec/opal/opal/null_spec.rb +10 -0
  192. data/runtime/spec/opal/opal/number_spec.rb +11 -0
  193. data/runtime/spec/opal/opal/object_spec.rb +16 -0
  194. data/runtime/spec/opal/opal/string_spec.rb +11 -0
  195. data/runtime/spec/opal/opal/typeof_spec.rb +9 -0
  196. data/runtime/spec/opal/opal/undefined_spec.rb +10 -0
  197. data/runtime/spec/opal/true/case_compare_spec.rb +12 -0
  198. data/runtime/spec/opal/true/class_spec.rb +10 -0
  199. data/runtime/spec/spec_helper.rb +25 -0
  200. data/runtime/stdlib/base64.rb +91 -0
  201. data/runtime/stdlib/date.rb +4 -0
  202. data/{stdlib → runtime/stdlib}/dev.rb +0 -0
  203. data/runtime/stdlib/forwardable.rb +33 -0
  204. data/runtime/stdlib/optparse.rb +0 -0
  205. data/runtime/stdlib/pp.rb +6 -0
  206. data/{stdlib → runtime/stdlib}/racc/parser.rb +0 -0
  207. data/runtime/stdlib/rbconfig.rb +0 -0
  208. data/runtime/stdlib/si.rb +17 -0
  209. data/runtime/stdlib/strscan.rb +53 -0
  210. data/runtime/stdlib/uri.rb +111 -0
  211. data/runtime/stdlib/uri/common.rb +1014 -0
  212. data/runtime/stdlib/uri/ftp.rb +261 -0
  213. data/runtime/stdlib/uri/generic.rb +1599 -0
  214. data/runtime/stdlib/uri/http.rb +106 -0
  215. data/runtime/stdlib/uri/https.rb +22 -0
  216. data/runtime/stdlib/uri/ldap.rb +260 -0
  217. data/runtime/stdlib/uri/ldaps.rb +20 -0
  218. data/runtime/stdlib/uri/mailto.rb +280 -0
  219. data/spec/builder/build_source_spec.rb +52 -0
  220. data/spec/builder/fixtures/build_source/adam.rb +0 -0
  221. data/spec/builder/fixtures/build_source/bar/a.rb +0 -0
  222. data/spec/builder/fixtures/build_source/bar/wow/b.rb +0 -0
  223. data/spec/builder/fixtures/build_source/bar/wow/cow/c.rb +0 -0
  224. data/spec/builder/fixtures/build_source/beynon.rb +0 -0
  225. data/spec/builder/fixtures/build_source/charles.js +0 -0
  226. data/spec/builder/fixtures/build_source/foo/a.rb +0 -0
  227. data/spec/builder/fixtures/build_source/foo/b.rb +0 -0
  228. data/spec/builder/fixtures/build_source/foo/x.js +0 -0
  229. data/spec/builder/fixtures/build_source/foo/y.js +0 -0
  230. data/spec/builder/output_path_spec.rb +50 -0
  231. data/spec/grammar/alias_spec.rb +26 -0
  232. data/spec/grammar/and_spec.rb +13 -0
  233. data/spec/grammar/array_spec.rb +22 -0
  234. data/spec/grammar/attrasgn_spec.rb +28 -0
  235. data/spec/grammar/begin_spec.rb +38 -0
  236. data/spec/grammar/block_spec.rb +12 -0
  237. data/spec/grammar/break_spec.rb +17 -0
  238. data/spec/grammar/call_spec.rb +58 -0
  239. data/spec/grammar/class_spec.rb +35 -0
  240. data/spec/grammar/const_spec.rb +13 -0
  241. data/spec/grammar/cvar_spec.rb +11 -0
  242. data/spec/grammar/def_spec.rb +60 -0
  243. data/spec/grammar/false_spec.rb +17 -0
  244. data/spec/grammar/file_spec.rb +7 -0
  245. data/spec/grammar/gvar_spec.rb +13 -0
  246. data/spec/grammar/hash_spec.rb +17 -0
  247. data/spec/grammar/iasgn_spec.rb +9 -0
  248. data/spec/grammar/if_spec.rb +26 -0
  249. data/spec/grammar/iter_spec.rb +59 -0
  250. data/spec/grammar/ivar_spec.rb +9 -0
  251. data/spec/grammar/lasgn_spec.rb +8 -0
  252. data/spec/grammar/line_spec.rb +8 -0
  253. data/spec/grammar/lvar_spec.rb +38 -0
  254. data/spec/grammar/module_spec.rb +27 -0
  255. data/spec/grammar/nil_spec.rb +17 -0
  256. data/spec/grammar/not_spec.rb +27 -0
  257. data/spec/grammar/op_asgn1_spec.rb +23 -0
  258. data/spec/grammar/op_asgn2_spec.rb +23 -0
  259. data/spec/grammar/or_spec.rb +13 -0
  260. data/spec/grammar/return_spec.rb +17 -0
  261. data/spec/grammar/sclass_spec.rb +20 -0
  262. data/spec/grammar/self_spec.rb +17 -0
  263. data/spec/grammar/str_spec.rb +96 -0
  264. data/spec/grammar/super_spec.rb +20 -0
  265. data/spec/grammar/true_spec.rb +17 -0
  266. data/spec/grammar/undef_spec.rb +15 -0
  267. data/spec/grammar/unless_spec.rb +13 -0
  268. data/spec/grammar/while_spec.rb +15 -0
  269. data/spec/grammar/xstr_spec.rb +116 -0
  270. data/spec/grammar/yield_spec.rb +20 -0
  271. data/spec/spec_helper.rb +9 -0
  272. metadata +346 -21
  273. data/lib/opal/bundle.rb +0 -34
  274. data/lib/opal/lexer.rb +0 -902
  275. data/lib/opal/nodes.rb +0 -2150
  276. data/lib/opal/parser.rb +0 -4894
  277. data/lib/opal/rake/bundle_task.rb +0 -63
  278. data/opal-parser.js +0 -8343
  279. data/stdlib/strscan.rb +0 -52
  280. data/templates/init/Rakefile +0 -7
  281. data/templates/init/index.html +0 -17
  282. data/templates/init/lib/__NAME__.rb +0 -2
data/lib/opal/bundle.rb DELETED
@@ -1,34 +0,0 @@
1
- require 'opal/builder'
2
-
3
- module Opal
4
- class Bundle
5
- attr_accessor :name
6
- attr_accessor :version
7
- attr_accessor :options
8
-
9
- def initialize
10
- @builder = Builder.new
11
- @options = {}
12
- end
13
-
14
- def build
15
- lib_files = Dir["{lib}/**/*.rb"].map do |lib|
16
- code = @builder.parse File.read(lib), options
17
- path = lib[4, lib.length - 7]
18
- "\"#{path}\": #{code}"
19
- end
20
-
21
- bundle = []
22
- bundle << %[opal.gem({\n]
23
- bundle << %[ name: "#{@name}",\n]
24
- bundle << %[ version: "#{@version}",\n]
25
- bundle << %[ libs: {\n]
26
- bundle << %[ #{lib_files.join ",\n "}\n]
27
- bundle << %[ }\n]
28
- bundle << %[});\n]
29
-
30
- bundle.join ''
31
- end
32
- end
33
- end
34
-
data/lib/opal/lexer.rb DELETED
@@ -1,902 +0,0 @@
1
- require 'opal/parser'
2
- require 'opal/nodes'
3
-
4
- require 'strscan'
5
-
6
- module Opal
7
- # This class is used for parsing ruby content and then generating
8
- # javascript content.
9
- #
10
- # Usage:
11
- #
12
- # parser = Opal::Parser.new
13
- #
14
- # parser.parse "self.do_something 1, 2, 3"
15
- # # => "compiled javascript"
16
- class Parser < Racc::Parser
17
-
18
- # Thrown on parsing error
19
- class RubyLexingError < StandardError; end
20
-
21
- # Parse the given ruby code in `source` and returns a string of
22
- # compiled javascript. `options` may be passed as a hash, and
23
- # include a set of various lexing and generator options.
24
- #
25
- # All options:
26
- #
27
- # `:method_missing` - dictates if the generated javascript has
28
- # support for rubys method_missing. Defaults to `false`. It
29
- # is recomended only to use method_missing in debug mode as
30
- # it adds overhead to **every** method call.
31
- #
32
- # `:main_scope` - whether the code is to run in the main scope.
33
- # `true` means that all local variables will be available
34
- # in future bindings. `false` means its just a normal scope,
35
- # i.e. top. This is only needed in [Context] for irb.
36
- #
37
- # `:overload_arithmetic` - whether to overload arithmetic operators
38
- # or not. This defaults to `false` so that all method calls for
39
- # `+`, `-`, `*`, `/`, `%`, `-@`, `-@` are just compiled directly
40
- # into their javascript ops. Set to `true` to use ruby style
41
- # operator overloading.
42
- #
43
- # `:overload_bitwise` - whether to overload bitwise operators. This
44
- # applies to `&`, `|`, `^` and `~`. Defaults to `false`.
45
- #
46
- # `:overload_shift` - whether to overload shift bitwise operators.
47
- # This applies to `<<` and `>>`. `<<` is generally useful for
48
- # arrays so we keep it seperate. Defaults to `true`.
49
- #
50
- # `:overload_equal` - whether to overload `==` and `!==` operators.
51
- # This defaults to `false`.
52
- #
53
- # `:overload_comparison` - whether to overload `<`, `<=`, `>` and
54
- # `>=` operators. Defaults to `false`.
55
- #
56
- # @param [String] source ruby source code to parse
57
- # @param [Hash] options parsing options to use
58
- def parse(source, options = {})
59
- @lex_state = :expr_beg
60
- @cond = 0
61
- @cmdarg = 0
62
- @line_number = 1
63
- @string_parse_stack = []
64
- @scanner = StringScanner.new source
65
- nodes = do_parse
66
-
67
- return nodes.generate_top(options)
68
- end
69
-
70
- def next_token
71
- t = get_next_token
72
- t[1] = { :value => t[1], :line => @line_number }
73
- t
74
- end
75
-
76
- def cond_push(n)
77
- @cond = (@cond << 1) | (n & 1)
78
- end
79
-
80
- def cond_pop
81
- @cond = @cond >> 1
82
- end
83
-
84
- def cond_lexpop
85
- @cond = (@cond >> 1) | (@cond & 1)
86
- end
87
-
88
- def cond?
89
- (@cond & 1) != 0
90
- end
91
-
92
- def cmdarg_push(n)
93
- @cmdarg = (@cmdarg << 1) | (n & 1)
94
- end
95
-
96
- def cmdarg_pop
97
- @cmdarg = @cmdarg >> 1
98
- end
99
-
100
- def cmdarg_lexpop
101
- @cmdarg = (@cmdarg >> 1) | (@cmdarg & 1)
102
- end
103
-
104
- def cmdarg?
105
- (@cmdarg & 1) != 0
106
- end
107
-
108
- def push_string_parse(hash)
109
- @string_parse_stack << hash
110
- end
111
-
112
- def pop_string_parse
113
- @string_parse_stack.pop
114
- end
115
-
116
- def current_string_parse
117
- @string_parse_stack.last
118
- end
119
-
120
- def next_string_token
121
- # str_parse, scanner = current_string_parse, @scanner
122
- str_parse = current_string_parse
123
- scanner = @scanner
124
- space = false
125
-
126
- # everything bar single quote and lower case bare wrds can interpolate
127
- interpolate = (str_parse[:beg] != "'" && str_parse[:beg] != 'w')
128
-
129
- words = ['w', 'W'].include? str_parse[:beg]
130
-
131
- space = true if ['w', 'W'].include?(str_parse[:beg]) and scanner.scan(/\s+/)
132
-
133
- # see if we can read end of string/xstring/regecp markers
134
- # if scanner.scan /#{str_parse[:end]}/
135
- if scanner.scan Regexp.new(Regexp.escape(str_parse[:end]))
136
- if words && !str_parse[:done_last_space]#&& space
137
- str_parse[:done_last_space] = true
138
- scanner.pos -= 1
139
- return :SPACE, ' '
140
- end
141
- pop_string_parse
142
-
143
- # return :SPACE, ' ' if words && space
144
-
145
- if ['"', "'"].include? str_parse[:beg]
146
- @lex_state = :expr_end
147
- return :STRING_END, scanner.matched
148
-
149
- elsif str_parse[:beg] == '`'
150
- @lex_state = :expr_end
151
- return :STRING_END, scanner.matched
152
-
153
- elsif str_parse[:beg] == '/'
154
- result = scanner.matched if scanner.scan(/\w+/)
155
- @lex_state = :expr_end
156
- return :REGEXP_END, result
157
-
158
- else
159
- @lex_state = :expr_end
160
- return :STRING_END, scanner.matched
161
- end
162
- end
163
-
164
- return :SPACE, ' ' if space
165
-
166
- # not end of string, so we must be parsing contents
167
- str_buffer = []
168
-
169
- if scanner.scan(/#(\$\@)\w+/)
170
- if interpolate
171
- return :STRING_DVAR, scanner.matched.slice(2)
172
- else
173
- str_buffer << scanner.matched
174
- end
175
-
176
- elsif scanner.scan(/#\{/)
177
- if interpolate
178
- # we are into ruby code, so stop parsing content (for now)
179
- str_parse[:content] = false
180
- return :STRING_DBEG, scanner.matched
181
- else
182
- str_buffer << scanner.matched
183
- end
184
-
185
- # causes error, so we will just collect it later on with other text
186
- elsif scanner.scan(/\#/)
187
- str_buffer << '#'
188
- end
189
-
190
- add_string_content str_buffer, str_parse
191
- complete_str = str_buffer.join ''
192
- return :STRING_CONTENT, complete_str
193
- end
194
-
195
- def add_string_content(str_buffer, str_parse)
196
- scanner = @scanner
197
- # regexp for end of string/regexp
198
- # end_str_re = /#{str_parse[:end]}/
199
- end_str_re = Regexp.new(Regexp.escape(str_parse[:end]))
200
- # can be interpolate
201
- interpolate = ['"', 'W', '/', '`'].include? str_parse[:beg]
202
-
203
- words = ['W', 'w'].include? str_parse[:beg]
204
-
205
- until scanner.eos?
206
- c = nil
207
- handled = true
208
-
209
- if scanner.check end_str_re
210
- # eos
211
- break
212
-
213
- elsif words && scanner.scan(/\s/)
214
- scanner.pos -= 1
215
- break
216
-
217
- elsif interpolate && scanner.check(/#(?=[\@\{])/)
218
- break
219
-
220
- elsif scanner.scan(/\\\\/)
221
- c = scanner.matched
222
-
223
- elsif scanner.scan(/\\/)
224
- c = scanner.matched
225
- c += scanner.matched if scanner.scan end_str_re
226
-
227
- else
228
- handled = false
229
- end
230
-
231
- unless handled
232
- reg = words ? Regexp.new("[^#{Regexp.escape str_parse[:end]}\#\0\n\ \\\\]+|.") : Regexp.new("[^#{Regexp.escape str_parse[:end]}\#\0\\\\]+|.")
233
- scanner.scan reg
234
- c = scanner.matched
235
- end
236
-
237
- c ||= scanner.matched
238
- str_buffer << c
239
- end
240
-
241
- raise "reached EOF while in string" if scanner.eos?
242
- end
243
-
244
- def get_next_token
245
- string_scanner = current_string_parse
246
-
247
- if string_scanner && string_scanner[:content]
248
- return next_string_token
249
- end
250
-
251
- # scanner, space_seen, cmd_start, c = @scanner, false, false, ''
252
- scanner = @scanner
253
- space_seen = false
254
- cmd_start = false
255
- c = ''
256
-
257
- while true
258
- if scanner.scan(/\ |\t|\r/)
259
- space_seen = true
260
- next
261
-
262
- elsif scanner.scan(/(\n|#)/)
263
- c = scanner.matched
264
- if c == '#' then scanner.scan(/(.*)/) else @line_number += 1; end
265
-
266
- scanner.scan(/(\n+)/)
267
- @line_number += scanner.matched.length if scanner.matched
268
-
269
- next if [:expr_beg, :expr_dot].include? @lex_state
270
-
271
- cmd_start = true
272
- @lex_state = :expr_beg
273
- return '\\n', '\\n'
274
-
275
- elsif scanner.scan(/\;/)
276
- @lex_state = :expr_beg
277
- return ';', ';'
278
-
279
- elsif scanner.scan(/\"/)
280
- push_string_parse :beg => '"', :content => true, :end => '"'
281
- return :STRING_BEG, scanner.matched
282
-
283
- elsif scanner.scan(/\'/)
284
- push_string_parse :beg => "'", :content => true, :end => "'"
285
- return :STRING_BEG, scanner.matched
286
-
287
- elsif scanner.scan(/\`/)
288
- push_string_parse :beg => "`", :content => true, :end => "`"
289
- return :XSTRING_BEG, scanner.matched
290
-
291
- elsif scanner.scan(/\%W/)
292
- start_word = scanner.scan(/./)
293
- end_word = { '(' => ')', '[' => ']', '{' => '}' }[start_word] || start_word
294
- push_string_parse :beg => 'W', :content => true, :end => end_word
295
- return :WORDS_BEG, scanner.matched
296
-
297
- elsif scanner.scan(/\%w/)
298
- start_word = scanner.scan(/./)
299
- end_word = { '(' => ')', '[' => ']', '{' => '}' }[start_word] || start_word
300
- push_string_parse :beg => 'w', :content => true, :end => end_word
301
- return :AWORDS_BEG, scanner.matched
302
-
303
- elsif scanner.scan(/\%[Qq]/)
304
- start_word = scanner.scan(/./)
305
- end_word = { '(' => ')', '[' => ']', '{' => '}' }[start_word] || start_word
306
- push_string_parse :beg => start_word, :content => true, :end => end_word
307
- return :STRING_BEG, scanner.matched
308
-
309
- elsif scanner.scan(/\//)
310
- if [:expr_beg, :expr_mid].include? @lex_state
311
- push_string_parse :beg => '/', :content => true, :end => '/'
312
- return :REGEXP_BEG, scanner.matched
313
- elsif scanner.scan(/\=/)
314
- @lex_state = :expr_beg
315
- return :OP_ASGN, '/'
316
- elsif @lex_state == :expr_fname
317
- @lex_state = :expr_end
318
- end
319
-
320
- return '/', '/'
321
-
322
- elsif scanner.scan(/\%/)
323
- @lex_state = @lex_state == :expr_fname ? :expr_end : :expr_beg
324
- return '%', '%'
325
-
326
- elsif scanner.scan(/\(/)
327
- result = scanner.matched
328
- if [:expr_beg, :expr_mid].include? @lex_state
329
- result = :PAREN_BEG
330
- elsif space_seen
331
- result = '('
332
- end
333
-
334
- @lex_state = :expr_beg
335
- cond_push 0
336
- cmdarg_push 0
337
-
338
- return result, scanner.matched
339
-
340
- elsif scanner.scan(/\)/)
341
- cond_lexpop
342
- cmdarg_lexpop
343
- @lex_state = :expr_end
344
- return ')', scanner.matched
345
-
346
- elsif scanner.scan(/\[/)
347
- result = scanner.matched
348
-
349
- if [:expr_fname, :expr_dot].include? @lex_state
350
- @lex_state = :expr_arg
351
- if scanner.scan(/\]=/)
352
- return '[]=', '[]='
353
- elsif scanner.scan(/\]/)
354
- return '[]', '[]'
355
- else
356
- raise "Unexpected '[' token"
357
- end
358
- elsif [:expr_beg, :expr_mid].include?(@lex_state) || space_seen
359
- @lex_state = :expr_beg
360
- cond_push 0
361
- cmdarg_push 0
362
- return '[', scanner.matched
363
- else
364
- @lex_state = :expr_beg
365
- cond_push 0
366
- cmdarg_push 0
367
- return '[@', scanner.matched
368
- end
369
-
370
- elsif scanner.scan(/\]/)
371
- cond_lexpop
372
- cmdarg_lexpop
373
- @lex_state = :expr_end
374
- return ']', scanner.matched
375
-
376
- elsif scanner.scan(/\}/)
377
- cond_lexpop
378
- cmdarg_lexpop
379
- @lex_state = :expr_end
380
-
381
- current_string_parse[:content] = true if current_string_parse
382
- return '}', scanner.matched
383
-
384
- elsif scanner.scan(/\.\.\./)
385
- @lex_state = :expr_beg
386
- return '...', scanner.matched
387
-
388
- elsif scanner.scan(/\.\./)
389
- @lex_state = :expr_beg
390
- return '..', scanner.matched
391
-
392
- elsif scanner.scan(/\./)
393
- @lex_state = :expr_dot unless @lex_state == :expr_fname
394
- return '.', scanner.matched
395
-
396
- elsif scanner.scan(/\*\*\=/)
397
- @lex_state = :expr_beg
398
- return :OP_ASGN, '**'
399
-
400
- elsif scanner.scan(/\*\*/)
401
- return '**', '**'
402
-
403
- elsif scanner.scan(/\*\=/)
404
- @lex_state = :expr_beg
405
- return :OP_ASGN, '*'
406
-
407
- elsif scanner.scan(/\*/)
408
- result = scanner.matched
409
- if @lex_state == :expr_fname
410
- @lex_state = :expr_end
411
- return '*', result
412
- elsif space_seen && scanner.check(/\S/)
413
- @lex_state = :expr_beg
414
- return :SPLAT, result
415
- elsif [:expr_beg, :expr_mid].include? @lex_state
416
- @lex_state = :expr_beg
417
- return :SPLAT, result
418
- else
419
- @lex_state = :expr_beg
420
- return '*', result
421
- end
422
-
423
- elsif scanner.scan(/\:\:/)
424
- if [:expr_beg, :expr_mid, :expr_class].include? @lex_state
425
- @lex_state = :expr_beg
426
- return '::@', scanner.matched
427
- end
428
-
429
- @lex_state = :expr_dot
430
- return '::', scanner.matched
431
-
432
- elsif scanner.scan(/\:/)
433
- if [:expr_end, :expr_endarg].include?(@lex_state) || scanner.check(/\s/)
434
- unless scanner.check(/\w/)
435
- @lex_state = :expr_beg
436
- return ':', ':'
437
- end
438
-
439
- @lex_state = :expr_fname
440
- return :SYMBOL_BEG, ':'
441
- end
442
-
443
- if scanner.scan(/\'/)
444
- push_string_parse :beg => "'", :content => true, :end => "'"
445
- elsif scanner.scan(/\"/)
446
- push_string_parse :beg => '"', :content => true, :end => '"'
447
- end
448
-
449
- @lex_state = :expr_fname
450
- return :SYMBOL_BEG, ':'
451
-
452
- elsif scanner.check(/\|/)
453
- if scanner.scan(/\|\|\=/)
454
- @lex_state = :expr_beg
455
- return :OP_ASGN, '||'
456
- elsif scanner.scan(/\|\|/)
457
- @lex_state = :expr_beg
458
- return '||', '||'
459
- elsif scanner.scan(/\|\=/)
460
- @lex_state = :expr_beg
461
- return :OP_ASGN, '|'
462
- elsif scanner.scan(/\|/)
463
- if @lex_state == :expr_fname
464
- @lex_state = :expr_end
465
- return '|', scanner.matched
466
- else
467
- @lex_state = :expr_beg
468
- return '|', scanner.matched
469
- end
470
- end
471
-
472
- elsif scanner.scan(/\^/)
473
- if @lex_state == :expr_fname
474
- @lex_state = :expr_end
475
- return '^', scanner.matched
476
- end
477
-
478
- @lex_state = :expr_beg
479
- return '^', scanner.matched
480
-
481
- elsif scanner.check(/\&/)
482
- if scanner.scan(/\&\&\=/)
483
- @lex_state = :expr_beg
484
- return :OP_ASGN, '&&'
485
- elsif scanner.scan(/\&\&/)
486
- @lex_state = :expr_beg
487
- return '&&', scanner.matched
488
- elsif scanner.scan(/\&\=/)
489
- @lex_state = :expr_beg
490
- return :OP_ASGN, '&'
491
- elsif scanner.scan(/\&/)
492
- if space_seen && !scanner.check(/\s/) && @lex_state == :expr_cmdarg
493
- return '&@', '&'
494
- elsif [:expr_beg, :expr_mid].include? @lex_state
495
- return '&@', '&'
496
- else
497
- return '&', '&'
498
- end
499
- end
500
-
501
- elsif scanner.check(/\</)
502
- if scanner.scan(/\<\<\=/)
503
- @lex_state = :expr_beg
504
- return :OP_ASGN, '<<'
505
- elsif scanner.scan(/\<\</)
506
- if @lex_state == :expr_fname
507
- @lex_state = :expr_end
508
- return '<<', '<<'
509
- elsif ![:expr_end, :expr_dot, :expr_endarg, :expr_class].include?(@lex_state) && space_seen
510
- @lex_state = :expr_beg
511
- return '<<', '<<'
512
- end
513
- @lex_state = :expr_beg
514
- return '<<', '<<'
515
- elsif scanner.scan(/\<\=\>/)
516
- if @lex_state == :expr_fname
517
- @lex_state = :expr_end
518
- else
519
- @lex_state = :expr_beg
520
- end
521
- return '<=>', '<=>'
522
- elsif scanner.scan(/\<\=/)
523
- if @lex_state == :expr_fname
524
- @lex_state = :expr_end
525
- else
526
- @lex_state = :expr_beg
527
- end
528
- return '<=', '<='
529
- elsif scanner.scan(/\</)
530
- if @lex_state == :expr_fname
531
- @lex_state = :expr_end
532
- else
533
- @lex_state = :expr_beg
534
- end
535
- return '<', '<'
536
- end
537
-
538
- elsif scanner.check(/\>/)
539
- if scanner.scan(/\>\>\=/)
540
- return :OP_ASGN, '>>'
541
- elsif scanner.scan(/\>\>/)
542
- return '>>', '>>'
543
- elsif scanner.scan(/\>\=/)
544
- if @lex_state == :expr_fname
545
- @lex_state = :expr_end
546
- else
547
- @lex_state = :expr_beg
548
- end
549
- return '>=', scanner.matched
550
- elsif scanner.scan(/\>/)
551
- if @lex_state == :expr_fname
552
- @lex_state = :expr_end
553
- else
554
- @lex_state = :expr_beg
555
- end
556
- return '>', '>'
557
- end
558
-
559
- elsif scanner.scan(/[+-]/)
560
- result = scanner.matched
561
- sign = result + '@'
562
-
563
- if @lex_state == :expr_beg || @lex_state == :expr_mid
564
- @lex_state = :expr_end
565
- return [sign, sign]
566
- elsif @lex_state == :expr_fname
567
- @lex_state = :expr_end
568
- return [:IDENTIFIER, result + scanner.matched] if scanner.scan(/@/)
569
- return [result, result]
570
- end
571
-
572
- if scanner.scan(/\=/)
573
- @lex_state = :expr_beg
574
- return [:OP_ASGN, result]
575
- end
576
-
577
- @lex_state = :expr_beg
578
- return [result, result]
579
-
580
- elsif scanner.scan(/\?/)
581
- @lex_state = :expr_beg if [:expr_end, :expr_endarg].include?(@lex_state)
582
- return '?', scanner.matched
583
-
584
- elsif scanner.scan(/\=\=\=/)
585
- if @lex_state == :expr_fname
586
- @lex_state = :expr_end
587
- return '===', '==='
588
- end
589
- @lex_state = :expr_beg
590
- return '===', '==='
591
-
592
- elsif scanner.scan(/\=\=/)
593
- if @lex_state == :expr_fname
594
- @lex_state = :expr_end
595
- return '==', '=='
596
- end
597
- @lex_state = :expr_beg
598
- return '==', '=='
599
-
600
- elsif scanner.scan(/\=\~/)
601
- if @lex_state == :expr_fname
602
- @lex_state = :expr_end
603
- return '=~', '=~'
604
- end
605
- @lex_state = :expr_beg
606
- return '=~', '=~'
607
-
608
- elsif scanner.scan(/\=\>/)
609
- @lex_state = :expr_beg
610
- return '=>', '=>'
611
-
612
- elsif scanner.scan(/\=/)
613
- @lex_state = :expr_beg
614
- return '=', '='
615
-
616
- elsif scanner.scan(/\!\=/)
617
- if @lex_state == :expr_fname
618
- @lex_state == :expr_end
619
- return '!=', '!='
620
- end
621
- @lex_state = :expr_beg
622
- return '!=', '!='
623
-
624
- elsif scanner.scan(/\!\~/)
625
- @lex_state = :expr_beg
626
- return '!~', '!~'
627
-
628
- elsif scanner.scan(/\!/)
629
- if @lex_state == :expr_fname
630
- @lex_state = :expr_end
631
- return '!', '!'
632
- end
633
- @lex_state = :expr_beg
634
- return '!', '!'
635
-
636
- elsif scanner.scan(/\~/)
637
- if @lex_state == :expr_fname
638
- @lex_state = :expr_end
639
- return '~', '~'
640
- end
641
- @lex_state = :expr_beg
642
- return '~', '~'
643
-
644
- elsif scanner.scan(/\$[\+\'\`\&!@\"~*$?\/\\:;=.,<>_]/)
645
- @lex_state = :expr_end
646
- return :GVAR, scanner.matched
647
-
648
- elsif scanner.scan(/\$\w+/)
649
- @lex_state = :expr_end
650
- return :GVAR, scanner.matched
651
-
652
- elsif scanner.scan(/\@\@\w*/)
653
- @lex_state = :expr_end
654
- return :CVAR, scanner.matched
655
-
656
- elsif scanner.scan(/\@\w*/)
657
- @lex_state = :expr_end
658
- return :IVAR, scanner.matched
659
-
660
- elsif scanner.scan(/\,/)
661
- @lex_state = :expr_beg
662
- return ',', scanner.matched
663
-
664
- elsif scanner.scan(/\{/)
665
- if [:expr_end, :expr_cmdarg].include? @lex_state
666
- result = '{@'
667
- elsif @lex_state == :expr_endarg
668
- result = 'LBRACE_ARG'
669
- else
670
- result = '{'
671
- end
672
-
673
- @lex_state = :expr_beg
674
- cond_push 0
675
- cmdarg_push 0
676
- return result, scanner.matched
677
-
678
- elsif scanner.check(/[0-9]/)
679
- @lex_state = :expr_end
680
- if scanner.scan(/[\d_]+\.[\d_]+\b/)
681
- return [:FLOAT, scanner.matched.gsub(/_/, '')]
682
- elsif scanner.scan(/[\d_]+\b/)
683
- return [:INTEGER, scanner.matched.gsub(/_/, '')]
684
- elsif scanner.scan(/0(x|X)(\d|[a-f]|[A-F])+/)
685
- return [:INTEGER, scanner.matched]
686
- else
687
- raise "Lexing error on numeric type: `#{scanner.peek 5}`"
688
- end
689
-
690
- elsif scanner.scan(/(\w)+[\?\!]?/)
691
- case scanner.matched
692
- when 'class'
693
- if @lex_state == :expr_dot
694
- @lex_state = :expr_end
695
- return :IDENTIFIER, scanner.matched
696
- end
697
- @lex_state = :expr_class
698
- return :CLASS, scanner.matched
699
-
700
- when 'module'
701
- return :IDENTIFIER, scanner.matched if @lex_state == :expr_dot
702
- @lex_state = :expr_class
703
- return :MODULE, scanner.matched
704
-
705
- when 'def'
706
- @lex_state = :expr_fname
707
- return :DEF, scanner.matched
708
-
709
- when 'undef'
710
- @lex_state = :expr_fname
711
- return :UNDEF, scanner.matched
712
-
713
- when 'end'
714
- if [:expr_dot, :expr_fname].include? @lex_state
715
- @lex_state = :expr_end
716
- return :IDENTIFIER, scanner.matched
717
- end
718
-
719
- @lex_state = :expr_end
720
- return :END, scanner.matched
721
-
722
- when 'do'
723
- if cond?
724
- @lex_state = :expr_beg
725
- return :DO_COND, scanner.matched
726
- elsif cmdarg? && @lex_state != :expr_cmdarg
727
- @lex_state = :expr_beg
728
- return :DO_BLOCK, scanner.matched
729
- elsif @lex_state == :expr_endarg
730
- return :DO_BLOCK, scanner.matched
731
- else
732
- @lex_state = :expr_beg
733
- return :DO, scanner.matched
734
- end
735
-
736
- when 'if'
737
- return :IF, scanner.matched if @lex_state == :expr_beg
738
- @lex_state = :expr_beg
739
- return :IF_MOD, scanner.matched
740
-
741
- when 'unless'
742
- return :UNLESS, scanner.matched if @lex_state == :expr_beg
743
- return :UNLESS_MOD, scanner.matched
744
-
745
- when 'else'
746
- return :ELSE, scanner.matched
747
-
748
- when 'elsif'
749
- return :ELSIF, scanner.matched
750
-
751
- when 'self'
752
- @lex_state = :expr_end unless @lex_state == :expr_fname
753
- return :SELF, scanner.matched
754
-
755
- when 'true'
756
- @lex_state = :expr_end
757
- return :TRUE, scanner.matched
758
-
759
- when 'false'
760
- @lex_state = :expr_end
761
- return :FALSE, scanner.matched
762
-
763
- when 'nil'
764
- @lex_state = :expr_end
765
- return :NIL, scanner.matched
766
-
767
- when 'undefined'
768
- @lex_state = :expr_end
769
- return :UNDEFINED, scanner.matched
770
-
771
- when 'null'
772
- @lex_state = :expr_end
773
- return :NULL, scanner.matched
774
-
775
- when '__LINE__'
776
- @lex_state = :expr_end
777
- return :LINE, @line_number.to_s
778
-
779
- when '__FILE__'
780
- @lex_state = :expr_end
781
- return :FILE, scanner.matched
782
-
783
- when 'begin'
784
- if [:expr_dot, :expr_fname].include? @lex_state
785
- @lex_state = :expr_end
786
- return :IDENTIFIER, scanner.matched
787
- end
788
- @lex_state = :expr_beg
789
- return :BEGIN, scanner.matched
790
-
791
- when 'rescue'
792
- return :IDENTIFIER, scanner.matched if [:expr_dot, :expr_fname].include? @lex_state
793
- return :RESCUE, scanner.matched if @lex_state == :expr_beg
794
- @lex_state = :expr_beg
795
- return :RESCUE_MOD, scanner.matched
796
-
797
- when 'ensure'
798
- @lex_state = :expr_beg
799
- return :ENSURE, scanner.matched
800
-
801
- when 'case'
802
- @lex_state = :expr_beg
803
- return :CASE, scanner.matched
804
-
805
- when 'when'
806
- @lex_state = :expr_beg
807
- return :WHEN, scanner.matched
808
-
809
- when 'or'
810
- @lex_state = :expr_beg
811
- return :OR, scanner.matched
812
-
813
- when 'and'
814
- @lex_state = :expr_beg
815
- return :AND, scanner.matched
816
-
817
- when 'not'
818
- @lex_state = :expr_beg
819
- return :NOT, scanner.matched
820
-
821
- when 'return'
822
- @lex_state = :expr_mid
823
- return :RETURN, scanner.matched
824
-
825
- when 'next'
826
- if @lex_state == :expr_dot || @lex_state == :expr_fname
827
- @lex_state = :expr_end
828
- return :IDENTIFIER, scanner.matched
829
- end
830
-
831
- @lex_state = :expr_mid
832
- return :NEXT, scanner.matched
833
-
834
- when 'redo'
835
- if @lex_state == :expr_dot || @lex_state == :expr_fname
836
- @lex_state = :expr_end
837
- return :IDENTIFIER, scanner.matched
838
- end
839
-
840
- @lex_state = :expr_mid
841
- return :REDO, scanner.matched
842
-
843
- when 'break'
844
- @lex_state = :expr_mid
845
- return :BREAK, scanner.matched
846
-
847
- when 'super'
848
- @lex_state = :expr_arg
849
- return :SUPER, scanner.matched
850
-
851
- when 'then'
852
- return :THEN, scanner.matched
853
-
854
- when 'while'
855
- return :WHILE, scanner.matched if @lex_state == :expr_beg
856
- @lex_state = :expr_beg
857
- return :WHILE_MOD, scanner.matched
858
-
859
- when 'for'
860
- @lex_state = :expr_beg
861
- return :FOR, scanner.matched
862
-
863
- when 'in'
864
- @lex_state = :expr_beg
865
- return :IN, scanner.matched
866
-
867
- when 'until'
868
- return :WHILE, scanner.matched if @lex_state == :expr_beg
869
- @lex_state = :expr_beg
870
- return :UNTIL_MOD, scanner.matched
871
-
872
- when 'yield'
873
- @lex_state = :expr_arg
874
- return :YIELD, scanner.matched
875
- end
876
-
877
- matched = scanner.matched
878
- return :LABEL, matched if scanner.peek(2) != '::' && scanner.scan(/\:/)
879
-
880
- if @lex_state == :expr_fname
881
- if scanner.scan(/\=/)
882
- @lex_state = :expr_end
883
- return :IDENTIFIER, matched + scanner.matched
884
- end
885
- end
886
-
887
- if [:expr_beg, :expr_dot, :expr_mid, :expr_arg, :expr_cmdarg].include? @lex_state
888
- @lex_state = :expr_cmdarg
889
- else
890
- @lex_state = :expr_end
891
- end
892
-
893
- return [matched =~ /[A-Z]/ ? :CONSTANT : :IDENTIFIER, matched]
894
-
895
- end
896
- return [false, false] if scanner.eos?
897
-
898
- raise RubyLexingError, "Unexpected content in parsing stream `#{scanner.peek 5}`"
899
- end
900
- end
901
- end
902
- end