opal 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (325) hide show
  1. data/.gitignore +5 -10
  2. data/LICENSE +75 -0
  3. data/README.md +55 -3
  4. data/Rakefile +62 -139
  5. data/bin/opal +7 -10
  6. data/gems/core/README.md +5 -0
  7. data/gems/core/Rakefile +7 -0
  8. data/gems/core/core.gemspec +13 -0
  9. data/gems/core/lib/core.rb +33 -0
  10. data/gems/core/lib/core/array.rb +1470 -0
  11. data/gems/core/lib/core/basic_object.rb +15 -0
  12. data/gems/core/lib/core/class.rb +31 -0
  13. data/gems/core/lib/core/dir.rb +26 -0
  14. data/gems/core/lib/core/error.rb +43 -0
  15. data/gems/core/lib/core/false_class.rb +21 -0
  16. data/gems/core/lib/core/file.rb +54 -0
  17. data/gems/core/lib/core/hash.rb +725 -0
  18. data/gems/core/lib/core/kernel.rb +240 -0
  19. data/gems/core/lib/core/module.rb +98 -0
  20. data/gems/core/lib/core/nil_class.rb +41 -0
  21. data/gems/core/lib/core/numeric.rb +370 -0
  22. data/gems/core/lib/core/proc.rb +11 -0
  23. data/gems/core/lib/core/range.rb +17 -0
  24. data/gems/core/lib/core/regexp.rb +18 -0
  25. data/gems/core/lib/core/string.rb +328 -0
  26. data/gems/core/lib/core/symbol.rb +15 -0
  27. data/gems/core/lib/core/top_self.rb +8 -0
  28. data/gems/core/lib/core/true_class.rb +20 -0
  29. data/gems/core/lib/core/vm.rb +16 -0
  30. data/{opals/opal/opal → gems/core}/spec/core/array/append_spec.rb +0 -0
  31. data/{opals/opal/opal → gems/core}/spec/core/array/assoc_spec.rb +0 -0
  32. data/{opals/opal/opal → gems/core}/spec/core/array/at_spec.rb +0 -0
  33. data/{opals/opal/opal → gems/core}/spec/core/array/clear_spec.rb +1 -1
  34. data/{opals/opal/opal → gems/core}/spec/core/array/collect_bang_spec.rb +0 -0
  35. data/{opals/opal/opal → gems/core}/spec/core/array/collect_spec.rb +0 -0
  36. data/gems/core/spec/core/array/compact_spec.rb +41 -0
  37. data/{opals/opal/opal → gems/core}/spec/core/array/concat_spec.rb +0 -0
  38. data/{opals/opal/opal → gems/core}/spec/core/array/constructor_spec.rb +0 -0
  39. data/{opals/opal/opal → gems/core}/spec/core/array/each_spec.rb +0 -0
  40. data/{opals/opal/opal → gems/core}/spec/core/array/element_reference_spec.rb +0 -0
  41. data/{opals/opal/opal → gems/core}/spec/core/array/first_spec.rb +1 -1
  42. data/{opals/opal/opal → gems/core}/spec/core/array/include_spec.rb +0 -0
  43. data/gems/core/spec/core/array/join_spec.rb +6 -0
  44. data/gems/core/spec/core/array/last_spec.rb +51 -0
  45. data/gems/core/spec/core/array/length_spec.rb +6 -0
  46. data/{opals/opal/opal → gems/core}/spec/core/array/map_spec.rb +2 -0
  47. data/gems/core/spec/core/array/reverse_spec.rb +6 -0
  48. data/{opals/opal/opal → gems/core}/spec/core/builtin_constants/builtin_constants_spec.rb +0 -0
  49. data/{opals/opal/opal → gems/core}/spec/core/false/and_spec.rb +0 -0
  50. data/{opals/opal/opal → gems/core}/spec/core/false/inspect_spec.rb +0 -0
  51. data/{opals/opal/opal → gems/core}/spec/core/false/or_spec.rb +0 -0
  52. data/{opals/opal/opal → gems/core}/spec/core/false/to_s_spec.rb +0 -0
  53. data/{opals/opal/opal → gems/core}/spec/core/false/xor_spec.rb +0 -0
  54. data/{opals/opal/opal → gems/core}/spec/core/file/join_spec.rb +1 -1
  55. data/gems/core/spec/core/hash/assoc_spec.rb +32 -0
  56. data/{opals/opal/opal → gems/core}/spec/core/kernel/instance_eval_spec.rb +0 -0
  57. data/{opals/opal/opal → gems/core}/spec/core/kernel/loop_spec.rb +0 -0
  58. data/{opals/opal/opal → gems/core}/spec/core/kernel/raise_spec.rb +0 -0
  59. data/{opals/opal/opal → gems/core}/spec/core/module/attr_accessor_spec.rb +0 -0
  60. data/{opals/opal/opal → gems/core}/spec/core/number/lt_spec.rb +0 -0
  61. data/gems/core/spec/core/string/sub_spec.rb +24 -0
  62. data/{opals/opal/opal → gems/core}/spec/core/true/and_spec.rb +0 -0
  63. data/{opals/opal/opal → gems/core}/spec/core/true/inspect_spec.rb +0 -0
  64. data/{opals/opal/opal → gems/core}/spec/core/true/or_spec.rb +0 -0
  65. data/{opals/opal/opal → gems/core}/spec/core/true/to_s_spec.rb +0 -0
  66. data/{opals/opal/opal → gems/core}/spec/core/true/xor_spec.rb +0 -0
  67. data/{opals/opal/opal → gems/core}/spec/language/and_spec.rb +2 -3
  68. data/{opals/opal/opal → gems/core}/spec/language/array_spec.rb +21 -5
  69. data/gems/core/spec/language/block_spec.rb +38 -0
  70. data/{opals/opal/opal → gems/core}/spec/language/break_spec.rb +0 -0
  71. data/gems/core/spec/language/case_spec.rb +103 -0
  72. data/{opals/opal/opal → gems/core}/spec/language/def_spec.rb +11 -1
  73. data/{opals/opal/opal → gems/core}/spec/language/eigenclass_spec.rb +0 -0
  74. data/gems/core/spec/language/file_spec.rb +13 -0
  75. data/gems/core/spec/language/fixtures/block.rb +21 -0
  76. data/gems/core/spec/language/fixtures/super.rb +293 -0
  77. data/{opals/opal/opal → gems/core}/spec/language/hash_spec.rb +0 -0
  78. data/{opals/opal/opal → gems/core}/spec/language/if_spec.rb +0 -0
  79. data/{opals/opal/opal → gems/core}/spec/language/loop_spec.rb +0 -0
  80. data/gems/core/spec/language/metaclass_spec.rb +21 -0
  81. data/{opals/opal/opal → gems/core}/spec/language/method_spec.rb +60 -0
  82. data/{opals/opal/opal → gems/core}/spec/language/next_spec.rb +0 -0
  83. data/{opals/opal/opal → gems/core}/spec/language/or_spec.rb +0 -0
  84. data/{opals/opal/opal → gems/core}/spec/language/redo_spec.rb +0 -0
  85. data/gems/core/spec/language/regexp_spec.rb +26 -0
  86. data/{opals/opal/opal → gems/core}/spec/language/rescue_spec.rb +0 -0
  87. data/{opals/opal/opal → gems/core}/spec/language/return_spec.rb +0 -0
  88. data/{opals/opal/opal → gems/core}/spec/language/string_spec.rb +0 -0
  89. data/gems/core/spec/language/super_spec.rb +32 -0
  90. data/{opals/opal/opal → gems/core}/spec/language/until_spec.rb +47 -47
  91. data/gems/core/spec/language/variables_spec.rb +155 -0
  92. data/{opals/opal/opal → gems/core}/spec/language/while_spec.rb +47 -47
  93. data/{opals/opal/opal → gems/core}/spec/spec_helper.rb +1 -1
  94. data/gems/core_fs/README.md +19 -0
  95. data/gems/dev/Rakefile +5 -0
  96. data/gems/dev/lib/dev.js +99 -0
  97. data/gems/dev/lib/dev/generator.js +1264 -0
  98. data/gems/dev/lib/dev/parser.js +979 -0
  99. data/gems/dev/lib/dev/ruby_parser.js +1088 -0
  100. data/gems/dev/lib/dev/ruby_parser.y +1267 -0
  101. data/gems/dev/lib/dev/string_scanner.js +38 -0
  102. data/gems/dev/tools/racc2js/README.md +39 -0
  103. data/gems/dev/tools/racc2js/math_parser.js +222 -0
  104. data/gems/dev/tools/racc2js/math_parser.rb +133 -0
  105. data/gems/dev/tools/racc2js/math_parser.y +28 -0
  106. data/gems/dev/tools/racc2js/parser.js +218 -0
  107. data/gems/dev/tools/racc2js/racc2js.rb +153 -0
  108. data/gems/json/README.md +4 -0
  109. data/gems/json/json.gemspec +14 -0
  110. data/gems/json/lib/json.rb +64 -0
  111. data/gems/json/lib/json/ext.rb +51 -0
  112. data/{opals/opal/browser/lib/browser/json_parse.js → gems/json/lib/json/json2.js} +197 -37
  113. data/gems/ospec/README.md +0 -0
  114. data/gems/ospec/lib/ospec.rb +6 -0
  115. data/gems/ospec/lib/ospec/autorun.rb +3 -0
  116. data/gems/ospec/lib/ospec/dsl.rb +15 -0
  117. data/gems/ospec/lib/ospec/example.rb +11 -0
  118. data/gems/ospec/lib/ospec/example/before_and_after_hooks.rb +56 -0
  119. data/gems/ospec/lib/ospec/example/errors.rb +17 -0
  120. data/gems/ospec/lib/ospec/example/example_group.rb +12 -0
  121. data/gems/ospec/lib/ospec/example/example_group_factory.rb +21 -0
  122. data/gems/ospec/lib/ospec/example/example_group_hierarchy.rb +20 -0
  123. data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/example/example_group_methods.rb +26 -68
  124. data/gems/ospec/lib/ospec/example/example_group_proxy.rb +14 -0
  125. data/gems/ospec/lib/ospec/example/example_methods.rb +46 -0
  126. data/gems/ospec/lib/ospec/example/example_proxy.rb +18 -0
  127. data/gems/ospec/lib/ospec/expectations.rb +19 -0
  128. data/gems/ospec/lib/ospec/expectations/errors.rb +8 -0
  129. data/gems/ospec/lib/ospec/expectations/fail_with.rb +8 -0
  130. data/gems/ospec/lib/ospec/expectations/handler.rb +27 -0
  131. data/gems/ospec/lib/ospec/matchers.rb +24 -0
  132. data/{opals/opal/Rakefile → gems/ospec/lib/ospec/matchers/be.rb} +0 -0
  133. data/gems/ospec/lib/ospec/matchers/generated_descriptions.rb +20 -0
  134. data/gems/ospec/lib/ospec/matchers/operator_matcher.rb +52 -0
  135. data/gems/ospec/lib/ospec/runner.rb +40 -0
  136. data/gems/ospec/lib/ospec/runner/example_group_runner.rb +44 -0
  137. data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/runner/formatter/html_formatter.rb +31 -40
  138. data/gems/ospec/lib/ospec/runner/formatter/terminal_formatter.rb +48 -0
  139. data/gems/ospec/lib/ospec/runner/options.rb +36 -0
  140. data/{opals/opal/spec/lib/spec → gems/ospec/lib/ospec}/runner/reporter.rb +23 -55
  141. data/gems/ospec/ospec.gemspec +0 -0
  142. data/gems/rquery/README.md +9 -0
  143. data/gems/rquery/lib/rquery.rb +10 -0
  144. data/gems/rquery/lib/rquery/ajax.rb +4 -0
  145. data/gems/rquery/lib/rquery/css.rb +96 -0
  146. data/gems/rquery/lib/rquery/document.rb +25 -0
  147. data/gems/rquery/lib/rquery/element.rb +292 -0
  148. data/gems/rquery/lib/rquery/event.rb +108 -0
  149. data/gems/rquery/lib/rquery/jquery.js +8177 -0
  150. data/gems/rquery/lib/rquery/request.rb +138 -0
  151. data/gems/rquery/lib/rquery/response.rb +49 -0
  152. data/gems/rquery/rquery.gemspec +16 -0
  153. data/lib/opal.js +1597 -0
  154. data/lib/opal.rb +6 -69
  155. data/lib/opal/builder.rb +115 -0
  156. data/lib/opal/bundle.rb +131 -0
  157. data/lib/opal/command.rb +11 -0
  158. data/lib/opal/context.rb +69 -0
  159. data/lib/opal/context/console.rb +12 -0
  160. data/lib/opal/context/file_system.rb +19 -0
  161. data/lib/opal/context/loader.rb +117 -0
  162. data/lib/opal/gem.rb +153 -0
  163. data/lib/opal/ruby/nodes.rb +1302 -0
  164. data/lib/opal/ruby/parser.rb +780 -0
  165. data/lib/opal/ruby/ruby_parser.rb +5170 -0
  166. data/lib/opal/ruby/ruby_parser.y +1298 -0
  167. data/opal.gemspec +11 -256
  168. metadata +179 -240
  169. data/.gitmodules +0 -6
  170. data/Opalfile +0 -384
  171. data/VERSION +0 -1
  172. data/demos/apps/browser_demo/index.html +0 -11
  173. data/demos/apps/browser_demo/lib/browser_demo.rb +0 -31
  174. data/demos/apps/simple_opal/Opalfile +0 -13
  175. data/demos/apps/simple_opal/index.html +0 -11
  176. data/demos/apps/simple_opal/lib/app_controller.rb +0 -62
  177. data/demos/apps/simple_opal/lib/main_window.rb +0 -146
  178. data/demos/browser/request/index.html +0 -52
  179. data/demos/browser/request/request.rb +0 -48
  180. data/gen/browser/__PROJECT_NAME__/Rakefile +0 -12
  181. data/gen/browser/__PROJECT_NAME__/index.html +0 -11
  182. data/gen/browser/__PROJECT_NAME__/javascripts/opal.debug.js +0 -4687
  183. data/gen/browser/__PROJECT_NAME__/javascripts/opal.min.js +0 -175
  184. data/gen/browser/__PROJECT_NAME__/lib/__PROJECT_NAME__.rb +0 -1
  185. data/lib/opal/builders/base.rb +0 -50
  186. data/lib/opal/builders/css.rb +0 -46
  187. data/lib/opal/builders/javascript.rb +0 -44
  188. data/lib/opal/builders/opal.rb +0 -79
  189. data/lib/opal/builders/ruby.rb +0 -50
  190. data/lib/opal/builders/ruby/generate.rb +0 -1851
  191. data/lib/opal/builders/ruby/nodes.rb +0 -210
  192. data/lib/opal/builders/ruby/ruby.rb +0 -916
  193. data/lib/opal/builders/ruby/ruby_parser.rb +0 -6008
  194. data/lib/opal/builders/ruby/ruby_parser.rb.y +0 -1451
  195. data/lib/opal/models/build_item.rb +0 -104
  196. data/lib/opal/models/hash_struct.rb +0 -40
  197. data/lib/opal/models/project.rb +0 -252
  198. data/lib/opal/models/struct_accessors.rb +0 -58
  199. data/lib/opal/models/target.rb +0 -176
  200. data/lib/opal/opal/build.rb +0 -169
  201. data/lib/opal/opal/env/console.rb +0 -66
  202. data/lib/opal/opal/env/fs.rb +0 -98
  203. data/lib/opal/opal/env/object.rb +0 -48
  204. data/lib/opal/opal/environment.rb +0 -139
  205. data/lib/opal/opal/gen.rb +0 -62
  206. data/lib/opal/opal/opal.rb +0 -75
  207. data/lib/opal/opal/repl.rb +0 -38
  208. data/lib/opal/opalfile/dsl.rb +0 -62
  209. data/lib/opal/opalfile/opalfile.rb +0 -133
  210. data/lib/opal/opalfile/task.rb +0 -96
  211. data/lib/opal/opalfile/task_manager.rb +0 -63
  212. data/lib/opal/opalfile/task_scope.rb +0 -52
  213. data/lib/opal/rack/app_server.rb +0 -119
  214. data/lib/opal/rake/opal_task.rb +0 -34
  215. data/opals/opal/README.md +0 -37
  216. data/opals/opal/browser/Opalfile +0 -11
  217. data/opals/opal/browser/README.md +0 -146
  218. data/opals/opal/browser/SIZZLE_LICESNSE.txt +0 -148
  219. data/opals/opal/browser/lib/browser.rb +0 -118
  220. data/opals/opal/browser/lib/browser/builder.rb +0 -41
  221. data/opals/opal/browser/lib/browser/canvas_context.rb +0 -115
  222. data/opals/opal/browser/lib/browser/dimensions.rb +0 -50
  223. data/opals/opal/browser/lib/browser/document.rb +0 -146
  224. data/opals/opal/browser/lib/browser/element.rb +0 -487
  225. data/opals/opal/browser/lib/browser/element/attributes.rb +0 -88
  226. data/opals/opal/browser/lib/browser/element/css.rb +0 -290
  227. data/opals/opal/browser/lib/browser/element/form.rb +0 -146
  228. data/opals/opal/browser/lib/browser/event/dom_events.rb +0 -81
  229. data/opals/opal/browser/lib/browser/event/event.rb +0 -177
  230. data/opals/opal/browser/lib/browser/event/trigger_events.rb +0 -53
  231. data/opals/opal/browser/lib/browser/geometry.rb +0 -97
  232. data/opals/opal/browser/lib/browser/json.rb +0 -32
  233. data/opals/opal/browser/lib/browser/request/request.rb +0 -201
  234. data/opals/opal/browser/lib/browser/sizzle.js +0 -1068
  235. data/opals/opal/browser/lib/browser/string.rb +0 -42
  236. data/opals/opal/browser/lib/browser/touch.rb +0 -37
  237. data/opals/opal/browser/lib/browser/vml_context.js +0 -33
  238. data/opals/opal/browser/lib/browser/window.rb +0 -36
  239. data/opals/opal/browser/spec/browser/browser_detection_spec.rb +0 -7
  240. data/opals/opal/browser/spec/document/aref_spec.rb +0 -110
  241. data/opals/opal/browser/spec/document/ready_spec.rb +0 -16
  242. data/opals/opal/browser/spec/element/body_spec.rb +0 -11
  243. data/opals/opal/browser/spec/element/clear_spec.rb +0 -26
  244. data/opals/opal/browser/spec/element/empty_spec.rb +0 -29
  245. data/opals/opal/browser/spec/element/has_class_spec.rb +0 -40
  246. data/opals/opal/browser/spec/element/hidden_spec.rb +0 -23
  247. data/opals/opal/browser/spec/element/hide_spec.rb +0 -31
  248. data/opals/opal/browser/spec/element/remove_spec.rb +0 -25
  249. data/opals/opal/browser/spec/element/show_spec.rb +0 -31
  250. data/opals/opal/browser/spec/element/style_spec.rb +0 -69
  251. data/opals/opal/browser/spec/element/toggle_spec.rb +0 -31
  252. data/opals/opal/browser/spec/element/visible_spec.rb +0 -23
  253. data/opals/opal/browser/spec/spec_helper.rb +0 -1
  254. data/opals/opal/opal/Opalfile +0 -14
  255. data/opals/opal/opal/spec/core/array/compact_spec.rb +0 -15
  256. data/opals/opal/opal/spec/fixtures/super.rb +0 -70
  257. data/opals/opal/opal/spec/language/____temp_remove_this.rb +0 -12
  258. data/opals/opal/opal/spec/language/block_spec.rb +0 -18
  259. data/opals/opal/opal/spec/language/case_spec.rb +0 -103
  260. data/opals/opal/opal/spec/language/metaclass_spec.rb +0 -21
  261. data/opals/opal/opal/spec/language/super_spec.rb +0 -26
  262. data/opals/opal/runtime/Opalfile +0 -78
  263. data/opals/opal/runtime/README.md +0 -12
  264. data/opals/opal/runtime/docs/debugging.md +0 -51
  265. data/opals/opal/runtime/lib/array.rb +0 -1516
  266. data/opals/opal/runtime/lib/basic_object.rb +0 -49
  267. data/opals/opal/runtime/lib/class.rb +0 -54
  268. data/opals/opal/runtime/lib/dir.rb +0 -36
  269. data/opals/opal/runtime/lib/error.rb +0 -49
  270. data/opals/opal/runtime/lib/false_class.rb +0 -52
  271. data/opals/opal/runtime/lib/file.rb +0 -79
  272. data/opals/opal/runtime/lib/hash.rb +0 -791
  273. data/opals/opal/runtime/lib/io.rb +0 -39
  274. data/opals/opal/runtime/lib/kernel.rb +0 -288
  275. data/opals/opal/runtime/lib/match_data.rb +0 -36
  276. data/opals/opal/runtime/lib/module.rb +0 -109
  277. data/opals/opal/runtime/lib/nil_class.rb +0 -69
  278. data/opals/opal/runtime/lib/number.rb +0 -398
  279. data/opals/opal/runtime/lib/proc.rb +0 -77
  280. data/opals/opal/runtime/lib/range.rb +0 -63
  281. data/opals/opal/runtime/lib/regexp.rb +0 -111
  282. data/opals/opal/runtime/lib/ruby.rb +0 -30
  283. data/opals/opal/runtime/lib/string.rb +0 -328
  284. data/opals/opal/runtime/lib/symbol.rb +0 -40
  285. data/opals/opal/runtime/lib/top_self.rb +0 -33
  286. data/opals/opal/runtime/lib/true_class.rb +0 -45
  287. data/opals/opal/runtime/runtime/browser.js +0 -287
  288. data/opals/opal/runtime/runtime/debug.js +0 -180
  289. data/opals/opal/runtime/runtime/opal.js +0 -1008
  290. data/opals/opal/runtime/runtime/post_opal.js +0 -1
  291. data/opals/opal/runtime/runtime/pre_opal.js +0 -2
  292. data/opals/opal/runtime/runtime/server_side.js +0 -50
  293. data/opals/opal/spec/LICENSE.txt +0 -26
  294. data/opals/opal/spec/Opalfile +0 -5
  295. data/opals/opal/spec/bin/spec.rb +0 -43
  296. data/opals/opal/spec/lib/spec.rb +0 -33
  297. data/opals/opal/spec/lib/spec/dsl.rb +0 -41
  298. data/opals/opal/spec/lib/spec/example.rb +0 -35
  299. data/opals/opal/spec/lib/spec/example/before_and_after_hooks.rb +0 -81
  300. data/opals/opal/spec/lib/spec/example/errors.rb +0 -42
  301. data/opals/opal/spec/lib/spec/example/example_group.rb +0 -37
  302. data/opals/opal/spec/lib/spec/example/example_group_factory.rb +0 -43
  303. data/opals/opal/spec/lib/spec/example/example_group_hierarchy.rb +0 -45
  304. data/opals/opal/spec/lib/spec/example/example_group_proxy.rb +0 -41
  305. data/opals/opal/spec/lib/spec/example/example_methods.rb +0 -73
  306. data/opals/opal/spec/lib/spec/example/example_proxy.rb +0 -48
  307. data/opals/opal/spec/lib/spec/expectations.rb +0 -46
  308. data/opals/opal/spec/lib/spec/expectations/errors.rb +0 -35
  309. data/opals/opal/spec/lib/spec/expectations/fail_with.rb +0 -37
  310. data/opals/opal/spec/lib/spec/expectations/handler.rb +0 -48
  311. data/opals/opal/spec/lib/spec/matchers.rb +0 -50
  312. data/opals/opal/spec/lib/spec/matchers/be.rb +0 -26
  313. data/opals/opal/spec/lib/spec/matchers/generated_descriptions.rb +0 -47
  314. data/opals/opal/spec/lib/spec/matchers/operator_matcher.rb +0 -66
  315. data/opals/opal/spec/lib/spec/runner.rb +0 -48
  316. data/opals/opal/spec/lib/spec/runner/example_group_runner.rb +0 -71
  317. data/opals/opal/spec/lib/spec/runner/formatter/terminal_formatter.rb +0 -82
  318. data/opals/opal/spec/lib/spec/runner/options.rb +0 -63
  319. data/opals/opal/spec/resources/index.html +0 -25
  320. data/opals/opal/spec/resources/spec.css +0 -132
  321. data/spec/cherry_kit/iseq_spec.rb +0 -38
  322. data/spec/spec_helper.rb +0 -16
  323. data/spec/vienna_spec.rb +0 -7
  324. data/yard/index.html +0 -43
  325. data/yard/style.css +0 -765
@@ -0,0 +1,979 @@
1
+ // if (typeof require !== 'undefined') {
2
+ // var RubyParser = require('./ruby_parser').RubyParser,
3
+ // // Lexer = require('./lexer').Lexer,
4
+ // StringScanner = require('./string_scanner').StringScanner;
5
+ // } else {
6
+ // // var RubyParser = parser;
7
+ // }
8
+
9
+ var RubyParser = require('opal_dev/ruby_parser').RubyParser;
10
+ var StringScanner = require('opal_dev/string_scanner').StringScanner;
11
+ var RubyGenerator = require('opal_dev/generator');
12
+
13
+ for (var prop in RubyGenerator) {
14
+ if (RubyGenerator.hasOwnProperty(prop)) {
15
+ // console.log("adding prop " + prop);
16
+ RubyParser.prototype[prop] = RubyGenerator[prop];
17
+ }
18
+ }
19
+
20
+ exports.compile = function(source) {
21
+ var nodes = exports.RubyParser.parse(source);
22
+ // print('nodes are:');
23
+ // print(nodes);
24
+ // print('generating:');
25
+ // var g = new RubyGenerator(nodes, {});
26
+ // var res = g.generate_main_context();
27
+ // var res = RubyGenerator.generate_main_context(nodes, {});
28
+ var res = nodes.generateTop();
29
+ // print("GOT RESULT");
30
+ // print(res[0]);
31
+ // print('WOWOWOWOWOWOWOW');
32
+ return res;
33
+ };
34
+
35
+ var EXPR_BEG = 0, EXPR_END = 1, EXPR_ENDARG = 2, EXPR_ARG = 3,
36
+ EXPR_CMDARG = 4, EXPR_MID = 5, EXPR_FNAME = 6, EXPR_DOT = 7,
37
+ EXPR_CLASS = 8, EXPR_VALUE = 9;
38
+
39
+ RubyParser.prototype.parse = function(source) {
40
+ // print('1. Lexing...');
41
+ var token;
42
+
43
+ this._string = source;
44
+ this._scanner = new StringScanner(source);
45
+ this.lex_state = EXPR_BEG;
46
+ this._tokens = [];
47
+ this._string_parse_stack = [];
48
+ this._line_number = 1;
49
+
50
+ // cond stack
51
+ this._cond = 0;
52
+ // cmd arg stack
53
+ this._cmdarg = 0;
54
+
55
+ // while ((token = this.next_token()) && token[0] !== false) {
56
+ // token[2] = this._line_number;
57
+ // this._tokens.push(token);
58
+ // }
59
+
60
+ // console.log("## Pre Optimize:\n");
61
+ // for (var i = 0; i < this._tokens.length; i++) {
62
+ // console.log(this._tokens[i]);
63
+ // }
64
+ //
65
+ // this._tokens = new Optimizer(this._tokens).optimize();
66
+ // console.log("\n## Post Optimize:\n")
67
+ // for (var i = 0; i < this._tokens.length; i++) {
68
+ // console.log(this._tokens[i]);
69
+ // }
70
+ // console.log("\n");
71
+ // return this._tokens;
72
+ // print('parsing some codeeeeez');
73
+
74
+ // print('1. lexing');
75
+ // this._lexer = new Lexer();
76
+ // this._tokens = this._lexer.tokenize(source + '\n');
77
+ // add [false, false] to singnify EOF
78
+ // this._tokens.push([false, false]);
79
+ // print(this._tokens);
80
+
81
+ // console.log('2. parsing');
82
+ try {
83
+ var result = this.do_parse();
84
+ // console.log(result);
85
+ return result;
86
+ } catch (e) {
87
+ e.message += " on line: " + this._line_number;
88
+ throw e;
89
+ }
90
+ };
91
+
92
+ // Tokens are fed into the parser as an array. The 0 index is the token type,
93
+ // and the index 1 is an object, with the line number the token was found on,
94
+ // and the value. e.g.
95
+ //
96
+ // ['IDENTIFIER', { value: 'wow', line: 1 }]
97
+ //
98
+ RubyParser.prototype.next_token = function() {
99
+ var token = this.get_next_token();
100
+ // console.log('[' + token.join(', ') + '] - ' + this._line_number);
101
+ token[1] = { value: token[1], line: this._line_number };
102
+ return token;
103
+ };
104
+
105
+ RubyParser.prototype.cond_push = function(n) {
106
+ // print('cond_push ' + n);
107
+ return this._cond = (this._cond << 1) | ((n) & 1);
108
+ };
109
+
110
+ RubyParser.prototype.cond_pop = function() {
111
+ // print('cond_pop');
112
+ return this._cond = this._cond >> 1;
113
+ };
114
+
115
+ RubyParser.prototype.cond_lexpop = function() {
116
+ // print('cond_lexpop');
117
+ return this._cond = (this._cond >> 1) | (this._cond & 1);
118
+ };
119
+
120
+ RubyParser.prototype.cond_p = function() {
121
+ // print('cond_p');
122
+ return this._cond & 1;
123
+ };
124
+
125
+ RubyParser.prototype.cmdarg_push = function(n) {
126
+ // print('cmdarg_push ' + n);
127
+ return this._cmdarg = (this._cmdarg << 1) | ((n) & 1);
128
+ };
129
+
130
+ RubyParser.prototype.cmdarg_pop = function() {
131
+ // print('cmdarg_pop');
132
+ return this._cmdarg = this._cmdarg >> 1;
133
+ };
134
+
135
+ RubyParser.prototype.cmdarg_lexpop = function() {
136
+ // print('cmdarg_lexpop');
137
+ return this._cmdarg = (this._cmdarg >> 1) | (this._cmdarg & 1);
138
+ };
139
+
140
+ RubyParser.prototype.cmdarg_p = function() {
141
+ // print('cmdarg_p');
142
+ return this._cmdarg & 1;
143
+ };
144
+
145
+ RubyParser.prototype.current_string_parse = function() {
146
+ if (this._string_parse_stack.length == 0) return null;
147
+ return this._string_parse_stack[this._string_parse_stack.length - 1];
148
+ };
149
+
150
+ RubyParser.prototype.push_string_parse = function(o) {
151
+ this._string_parse_stack.push(o);
152
+ };
153
+
154
+ RubyParser.prototype.pop_string_parse = function() {
155
+ this._string_parse_stack.pop();
156
+ };
157
+
158
+ RubyParser.prototype.next_string_token = function() {
159
+ var str_parse = this.current_string_parse(), scanner = this._scanner;
160
+
161
+ // everything bar single quote and lower case barewords can interpolate
162
+ var interpolate = (str_parse.beg !== "'" && str_parse.beg !== '%w');
163
+
164
+ // see if we can read end of string/xstring/regexp markers
165
+ if (scanner.scan( new RegExp('^\\' + str_parse.end))) {
166
+ this.pop_string_parse();
167
+ if (str_parse.beg == '"' || str_parse.beg == "'") {
168
+ this.lex_state = EXPR_END;
169
+ return ['STRING_END', scanner.matched];
170
+ }
171
+ else if (str_parse.beg == '`') {
172
+ // assume to be xstring
173
+ this.lex_state = EXPR_END;
174
+ return ['STRING_END', scanner.matched];
175
+ }
176
+ else if (str_parse.beg == '/') {
177
+ var result = "";
178
+ if (scanner.scan(/^\w+/)) {
179
+ result = scanner.matched;
180
+ }
181
+ this.lex_state = EXPR_END;
182
+ return ['REGEXP_END', result];
183
+ }
184
+ else { // words?
185
+ this.lex_state = EXPR_END;
186
+ return ['STRING_END', scanner.matched];
187
+ }
188
+ }
189
+
190
+ // not end of string, so we must be parsing contents
191
+ var str_buffer = [];
192
+
193
+ if (scanner.scan(/^#(\$|\@)\w+/)) {
194
+ if (interpolate) {
195
+ return ['STRING_DVAR', scanner.matched.substr(2)];
196
+ }
197
+ else {
198
+ str_buffer.push(scanner.matched);
199
+ }
200
+ }
201
+ else if (scanner.scan(/^#\{/)) {
202
+ if (interpolate) {
203
+ // we are into ruby code, so stop parsing content (for the moment)
204
+ str_parse.content = false;
205
+ return ['STRING_DBEG', scanner.matched];
206
+ }
207
+ else {
208
+ str_buffer.push(scanner.matched);
209
+ }
210
+ }
211
+ // causes error, so we will just collect it later on with other text
212
+ else if (scanner.scan(/^#/)) {
213
+ str_buffer.push('#');
214
+ }
215
+
216
+ this.add_string_content(str_buffer, str_parse);
217
+ var complete_str = str_buffer.join('');
218
+
219
+ return ['STRING_CONTENT', complete_str];
220
+ };
221
+
222
+ RubyParser.prototype.add_string_content = function(str_buffer, str_parse) {
223
+ var scanner = this._scanner;
224
+ // regexp for end of string/regexp
225
+ var end_str_re = new RegExp('^' + str_parse.end);
226
+ // can we interpolate?
227
+ var interpolate = ['"', '%W', '/', '`'].indexOf(str_parse.beg) != -1;
228
+
229
+ while (!scanner.eos()) {
230
+ var c = null, handled = true;
231
+ if (scanner.check(end_str_re)) {
232
+ //throw new Error("EOS");
233
+ break;
234
+
235
+ } else if (interpolate && scanner.check(/^#(?=[\@\{])/)) {
236
+ break;
237
+
238
+ } else if (scanner.scan(/^\\\\/)) {
239
+ c = scanner.matched;
240
+
241
+ } else if (scanner.scan(/^\\/)) {
242
+ c = scanner.matched;
243
+ if (scanner.scan(end_str_re)) {
244
+ c += scanner.matched;
245
+ }
246
+
247
+ } else {
248
+ handled = false;
249
+ }
250
+
251
+ if (!handled) {
252
+ var reg = new RegExp("^[^\\" + str_parse.end + "\#\0\\\\]+|.");
253
+ scanner.scan(reg);
254
+ c = scanner.matched;
255
+ }
256
+
257
+ c = c || scanner.matched;
258
+ str_buffer.push(c);
259
+ }
260
+
261
+ if (scanner.eos()) {
262
+ throw new Error("reached end of file when in string")
263
+ }
264
+ };
265
+
266
+
267
+
268
+ RubyParser.prototype.get_next_token = function() {
269
+ var string_scanner;
270
+ if ((string_scanner = this.current_string_parse()) && string_scanner.content){
271
+ return this.next_string_token();
272
+ }
273
+
274
+ var scanner = this._scanner,
275
+ space_seen = false,
276
+ c = '',
277
+ cmd_start = false;
278
+
279
+
280
+ while (true) {
281
+ if (scanner.scan(/^(\ |\t|\r)/)) {
282
+ space_seen = true;
283
+ continue;
284
+ }
285
+ else if (scanner.scan(/^(\n|#)/)) {
286
+ c = scanner.matched;
287
+ if (c == '#') {
288
+ scanner.scan(/^(.*)/);
289
+ }
290
+ else {
291
+ this._line_number++;
292
+ }
293
+
294
+ scanner.scan(/^(\n+)/);
295
+ this._line_number += scanner.matched.length;
296
+
297
+ if ([EXPR_BEG, EXPR_DOT].indexOf(this.lex_state) !== -1) {
298
+ continue;
299
+ }
300
+ cmd_start = true;
301
+ this.lex_state = EXPR_BEG;
302
+ return ["\\n", "\\n"];
303
+ }
304
+
305
+ else if (scanner.scan(/^\;/)) {
306
+ this.lex_state = EXPR_BEG;
307
+ return [";", ";"];
308
+ }
309
+
310
+ else if (scanner.scan(/^\"/)) {
311
+ this.push_string_parse({ beg: '"', content: true, end:'"' });
312
+ return ['STRING_BEG', scanner.matched];
313
+ }
314
+ else if (scanner.scan(/^\'/)) {
315
+ this.push_string_parse({ beg: "'", content: true, end:"'" });
316
+ return ['STRING_BEG', scanner.matched];
317
+ }
318
+ else if (scanner.scan(/^\`/)) {
319
+ this.push_string_parse({ beg: "`", content: true, end: "`" });
320
+ return ["XSTRING_BEG", scanner.matched];
321
+ }
322
+ else if (scanner.scan(/^\%[Ww]/)) {
323
+ var start_word = scanner.scan(/^./),
324
+ end_word = { '(': ')', '[': ']', '{': '}'}[start_word],
325
+ end_word = end_word || start_word;
326
+
327
+ this.push_string_parse({ beg: start_word, content: true, end: end_word });
328
+ return ["WORDS_BEG", scanner.matched];
329
+ }
330
+ else if (scanner.scan(/^\%[Qq]/)) {
331
+ var start_word = scanner.scan(/^./),
332
+ end_word = { '(': ')', '[': ']', '{': '}'}[start_word],
333
+ end_word = end_word || start_word;
334
+
335
+ this.push_string_parse({ beg: start_word, content: true, end: end_word });
336
+ return ["STRING_BEG", scanner.matched];
337
+ }
338
+ else if (scanner.scan(/^\%[Rr]/)) {
339
+ var start_word = scanner.scan(/^./),
340
+ end_word = { '(': ')', '{': '}', '[': ']' }[start_word],
341
+ end_word = end_word || start_word;
342
+
343
+ this.push_string_parse({ beg: '/', content: true, end: end_word });
344
+ return ['REGEXP_BEG', scanner.matched];
345
+ }
346
+
347
+ else if (scanner.scan(/^\//)) {
348
+ if (this.lex_state == EXPR_BEG || this.lex_state == EXPR_MID) {
349
+ this.push_string_parse({ beg: "/", content: true, end: "/" });
350
+ return ["REGEXP_BEG", scanner.matched];
351
+ }
352
+ else if (scanner.scan(/^\=/)) {
353
+ this.lex_state = EXPR_BEG;
354
+ return ["OP_ASGN", "/"];
355
+ }
356
+ else if (this.lex_state == EXPR_FNAME) {
357
+ this.lex_state = EXPR_END;
358
+ }
359
+ return ["/", '/'];
360
+ }
361
+
362
+ else if (scanner.scan(/^\%/)) {
363
+ // if (scanner.scan(/^\=/)) {
364
+ // this.lex_state = EXPR_BEG;
365
+ // return ["OP_ASGN", "%"];
366
+ // }
367
+ if (this.lex_state == EXPR_FNAME) {
368
+ this.lex_state = EXPR_END;
369
+ }
370
+ else {
371
+ this.lex_state = EXPR_BEG;
372
+ }
373
+ return ["%", '%'];
374
+ }
375
+
376
+ else if (scanner.scan(/^\(/)) {
377
+ var result = '(';
378
+ if (this.lex_state == EXPR_BEG || this.lex_state == EXPR_MID) {
379
+ result = 'PAREN_BEG';
380
+ }
381
+ else if (space_seen) {
382
+ result = '(';
383
+ }
384
+ this.lex_state = EXPR_BEG;
385
+ this.cond_push(0);
386
+ this.cmdarg_push(0);
387
+ return [result, scanner.matched];
388
+ }
389
+
390
+ else if (scanner.scan(/^\)/)) {
391
+ this.cond_lexpop();
392
+ this.cmdarg_lexpop();
393
+ this.lex_state = EXPR_END;
394
+ return [")", scanner.matched];
395
+ }
396
+
397
+ else if (scanner.scan(/^\[/)) {
398
+ var result = scanner.matched;
399
+
400
+ if (this.lex_state == EXPR_FNAME || this.lex_state == EXPR_DOT) {
401
+ this.lex_state = EXPR_ARG;
402
+ if (scanner.scan(/^\]\=/)) {
403
+ return ["[]=", "[]="];
404
+ }
405
+ else if (scanner.scan(/^\]/)) {
406
+ return ["[]", "[]"];
407
+ }
408
+ else {
409
+ throw "error - unexpected '[' token"
410
+ }
411
+ }
412
+ else if (this.lex_state == EXPR_BEG || this.lex_state == EXPR_MID || space_seen) {
413
+ this.lex_state = EXPR_BEG;
414
+ this.cond_push(0);
415
+ this.cmdarg_push(0);
416
+ return ["[", scanner.matched];
417
+ }
418
+ else {
419
+ this.lex_state = EXPR_BEG;
420
+ this.cond_push(0);
421
+ this.cmdarg_push(0);
422
+ return ["[@", scanner.matched];
423
+ }
424
+ }
425
+
426
+ else if (scanner.scan(/^\]/)) {
427
+ this.cond_lexpop();
428
+ this.cmdarg_lexpop();
429
+ this.lex_state = EXPR_END;
430
+ return ["]", scanner.matched];
431
+ }
432
+ else if (scanner.scan(/^\}/)) {
433
+ this.cond_lexpop();
434
+ this.cmdarg_lexpop();
435
+ this.lex_state = EXPR_END;
436
+
437
+ if (this.current_string_parse()) {
438
+ this.current_string_parse().content = true
439
+ }
440
+ // if (string_parse) string_parse.content = true;
441
+ return ["}", scanner.matched];
442
+ }
443
+
444
+ else if (scanner.scan(/^\.\.\./)) {
445
+ this.lex_state = EXPR_BEG;
446
+ return ["...", scanner.matched];
447
+ }
448
+ else if (scanner.scan(/^\.\./)) {
449
+ this.lex_state = EXPR_BEG;
450
+ return ["..", scanner.matched];
451
+ }
452
+ else if (scanner.scan(/^\./)) {
453
+ if (this.lex_state !== EXPR_FNAME) this.lex_state = EXPR_DOT;
454
+ return [".", scanner.matched];
455
+ }
456
+
457
+ else if (scanner.scan(/^\*\*\=/)) {
458
+ this.lex_state = EXPR_BEG;
459
+ return ["OP_ASGN", "**"];
460
+ }
461
+ else if (scanner.scan(/^\*\*/)) {
462
+ return ["**", "**"];
463
+ }
464
+ else if (scanner.scan(/^\*\=/)) {
465
+ this.lex_state = EXPR_BEG;
466
+ return ["OP_ASGN", "*"];
467
+ }
468
+ else if (scanner.scan(/^\*/)) {
469
+ if (this.lex_state == EXPR_FNAME) {
470
+ this.lex_state = EXPR_END;
471
+ return ["*", scanner.matched];
472
+ }
473
+ else if (space_seen && scanner.check(/^\S/)) {
474
+ this.lex_state = EXPR_BEG;
475
+ return ["SPLAT", scanner.matched];
476
+ }
477
+ else if (this.lex_state == EXPR_BEG || this.lex_state == EXPR_MID) {
478
+ this.lex_state = EXPR_BEG;
479
+ return ["SPLAT", scanner.matched];
480
+ }
481
+ else {
482
+ this.lex_state = EXPR_BEG;
483
+ return ["*", scanner.matched];
484
+ }
485
+ }
486
+
487
+ else if (scanner.scan(/^\:\:/)) {
488
+ if ([EXPR_BEG, EXPR_MID, EXPR_CLASS].indexOf(this.lex_state) !== -1) {
489
+ this.lex_state = EXPR_BEG;
490
+ return ["::@", scanner.matched];
491
+ }
492
+ this.lex_state = EXPR_DOT;
493
+ return ["::", scanner.matched];
494
+ }
495
+ else if (scanner.scan(/^\:/)) {
496
+ if (this.lex_state == EXPR_END || this.lex_state == EXPR_ENDARG || scanner.check(/^\s/)) {
497
+ if (!scanner.check(/^\w/)) {
498
+ this.lex_state = EXPR_BEG;
499
+ return [":", scanner.matched];
500
+ }
501
+
502
+ this.lex_state = EXPR_FNAME;
503
+ return ["SYMBOL_BEG", scanner.matched];
504
+ }
505
+
506
+ if (scanner.scan(/^\'/)) {
507
+ this.push_string_parse({ beg: "'", content: true, end: "'" });
508
+ }
509
+ else if (scanner.scan(/^\"/)) {
510
+ this.push_string_parse({ beg: '"', content: true, end: '"' });
511
+ }
512
+
513
+ this.lex_state = EXPR_FNAME;
514
+ return ["SYMBOL_BEG", scanner.matched];
515
+ }
516
+
517
+ else if (scanner.check(/^\|/)) {
518
+ if (scanner.scan(/^\|\|\=/)) {
519
+ this.lex_state = EXPR_BEG;
520
+ return ["OP_ASGN", "||"];
521
+ }
522
+ else if (scanner.scan(/^\|\|/)) {
523
+ this.lex_state = EXPR_BEG;
524
+ return ["||", scanner.matched];
525
+ }
526
+ else if (scanner.scan(/^\|\=/)) {
527
+ this.lex_state = EXPR_BEG;
528
+ return ["OP_ASGN", "|"];
529
+ }
530
+ else if (scanner.scan(/^\|/)) {
531
+ if (this.lex_state == EXPR_FNAME) {
532
+ this.lex_state = EXPR_END;
533
+ return ["|", scanner.matched];
534
+ }
535
+ this.lex_state = EXPR_BEG;
536
+ return ["|", scanner.matched];
537
+ }
538
+ }
539
+
540
+ else if (scanner.scan(/^\^/)) {
541
+ if (this.lex_state == EXPR_FNAME) {
542
+ this.lex_state = EXPR_END;
543
+ return ["^", scanner.matched];
544
+ }
545
+ this.lex_state = EXPR_BEG;
546
+ return ["^", scanner.matched];
547
+ }
548
+
549
+ else if (scanner.scan(/^\&\&\=/)) {
550
+ this.lex_state = EXPR_BEG;
551
+ return ["OP_ASGN", "&&"];
552
+ }
553
+ else if (scanner.scan(/^\&\&/)) {
554
+ this.lex_state = EXPR_BEG;
555
+ return ["&&", scanner.matched];
556
+ }
557
+ else if (scanner.scan(/^\&\=/)) {
558
+ this.lex_state = EXPR_BEG;
559
+ return ["OP_ASGN", "&"];
560
+ }
561
+ else if (scanner.scan(/^\&/)) {
562
+ // print(this.lex_state);
563
+ if (space_seen && !scanner.check(/^\s/) && this.lex_state == EXPR_CMDARG){
564
+ return ["&@", scanner.matched];
565
+ }
566
+ else if (this.lex_state == EXPR_BEG || this.lex_state == EXPR_MID) {
567
+ return ["&@", scanner.matched];
568
+ }
569
+ else {
570
+ return ["&", scanner.matched];
571
+ }
572
+ }
573
+
574
+ else if (scanner.scan(/^\<\<\=/)) {
575
+ this.lex_state = EXPR_BEG;
576
+ return ["OP_ASGN", "<<"];
577
+ }
578
+ else if (scanner.scan(/^\<\</)) {
579
+ if (this.lex_state == EXPR_FNAME) {
580
+ this.lex_state = EXPR_END;
581
+ return ["<<", "<<"];
582
+ }
583
+ if ([EXPR_END, EXPR_DOT, EXPR_ENDARG, EXPR_CLASS].indexOf(this.lex_state) == -1 && space_seen) {
584
+ this.lex_state = EXPR_BEG;
585
+ return ["<<", "<<"];
586
+ }
587
+ this.lex_state = EXPR_BEG;
588
+ return ["<<", "<<"];
589
+ }
590
+ else if (scanner.scan(/^\<\=\>/)) {
591
+ if (this.lex_state == EXPR_FNAME) this.lex_state = EXPR_END
592
+ else this.lex_state = EXPR_BEG;
593
+ return ["<=>", "<=>"];
594
+ }
595
+ else if (scanner.scan(/^\<\=/)) {
596
+ if (this.lex_state == EXPR_FNAME) this.lex_state = EXPR_END
597
+ else this.lex_state = EXPR_BEG;
598
+ return ["<=", "<="];
599
+ }
600
+ else if (scanner.scan(/^\</)) {
601
+ if (this.lex_state == EXPR_FNAME) this.lex_state = EXPR_END
602
+ else this.lex_state = EXPR_BEG;
603
+ return ["<", "<"];
604
+ }
605
+
606
+ else if (scanner.scan(/^\>\=/)) {
607
+ if (this.lex_state == EXPR_FNAME) this.lex_state = EXPR_END
608
+ else this.lex_state = EXPR_BEG;
609
+ return [">=", scanner.matched];
610
+ }
611
+ else if (scanner.scan(/^\>\>\=/)) {
612
+ return ["OP_ASGN", ">>"];
613
+ }
614
+ else if (scanner.scan(/^\>\>/)) {
615
+ return [">>", scanner.matched];
616
+ }
617
+ else if (scanner.scan(/^\>/)) {
618
+ if (this.lex_state == EXPR_FNAME) this.lex_state = EXPR_END
619
+ else this.lex_state = EXPR_BEG;
620
+ return [">", ">"];
621
+ }
622
+
623
+ else if (scanner.scan(/^[+-]/)) {
624
+ var result = scanner.matched;
625
+ // var sign = (result == '+') ? 'UPLUS' : 'UMINUS';
626
+ var sign = result + '@';
627
+
628
+ if (this.lex_state == EXPR_BEG || this.lex_state == EXPR_MID) {
629
+ this.lex_state = EXPR_BEG;
630
+ return [sign, sign];
631
+ }
632
+ else if (this.lex_state == EXPR_FNAME) {
633
+ this.lex_state = EXPR_END;
634
+ if (scanner.scan(/^@/)) {
635
+ return ['IDENTIFIER', result + scanner.matched];
636
+ }
637
+ return [result, result];
638
+ }
639
+
640
+ if (scanner.scan(/^\=/)) {
641
+ this.lex_state = EXPR_BEG;
642
+ return ["OP_ASGN", result];
643
+ }
644
+ this.lex_state = EXPR_BEG;
645
+ return [result, result];
646
+ }
647
+
648
+ else if (scanner.scan(/^\?/)) {
649
+ if (this.lex_state = EXPR_END || this.lex_state == EXPR_ENDARG) {
650
+ this.lex_state = EXPR_BEG;
651
+ }
652
+ return ["?", scanner.matched];
653
+ }
654
+
655
+ else if (scanner.scan(/^\=\=\=/)) {
656
+ if (this.lex_state == EXPR_FNAME) {
657
+ this.lex_state = EXPR_END;
658
+ return ["===", "==="];
659
+ }
660
+ this.lex_state = EXPR_BEG;
661
+ return ["===", "==="];
662
+ }
663
+ else if (scanner.scan(/^\=\=/)) {
664
+ if (this.lex_state == EXPR_FNAME) {
665
+ this.lex_state = EXPR_END;
666
+ return ["==", "=="];
667
+ }
668
+ this.lex_state = EXPR_BEG;
669
+ return ["==", "=="];
670
+ }
671
+ else if (scanner.scan(/^\=\~/)) {
672
+ if (this.lex_state == EXPR_FNAME) {
673
+ this.lex_state = EXPR_END;
674
+ return ["=~", "=~"];
675
+ }
676
+ this.lex_state = EXPR_BEG;
677
+ return ["=~", "=~"];
678
+ }
679
+ else if (scanner.scan(/^\=\>/)) {
680
+ this.lex_state = EXPR_BEG;
681
+ return ["=>", scanner.matched];
682
+ }
683
+ else if (scanner.scan(/^\=/)) {
684
+ this.lex_state = EXPR_BEG;
685
+ return ["=", "="];
686
+ }
687
+
688
+ else if (scanner.scan(/^\!\=/)) {
689
+ if (this.lex_state == EXPR_FNAME) {
690
+ this.lex_state = EXPR_END;
691
+ return ["!=", "!="];
692
+ }
693
+ this.lex_state = EXPR_BEG;
694
+ return ["!=", scanner.matched];
695
+ }
696
+ else if (scanner.scan(/^\!\~/)) {
697
+ if (this.lex_state == EXPR_FNAME) {
698
+ this.lex_state = EXPR_END;
699
+ return ["!~", "!~"];
700
+ }
701
+ this.lex_state = EXPR_BEG;
702
+ return ["!~", "!~"];
703
+ }
704
+ else if (scanner.scan(/^\!/)) {
705
+ if (this.lex_state == EXPR_FNAME) {
706
+ this.lex_state = EXPR_END;
707
+ return ["!", "!"];
708
+ }
709
+ this.lex_state = EXPR_BEG;
710
+ return ["!", "!"];
711
+ }
712
+
713
+ else if (scanner.scan(/^\~/)) {
714
+ if (this.lex_state == EXPR_FNAME) {
715
+ this.lex_state = EXPR_END;
716
+ return ["~", "~"];
717
+ }
718
+ this.lex_state = EXPR_BEG;
719
+ return ["~", "~"];
720
+ }
721
+
722
+ // FIXME: do we really need to differentiate between these. generates the
723
+ // same code. our checks will be in the gvar getters (for the relative
724
+ // parts..)
725
+ //
726
+ // else if (scanner.scan(/^\$([1-9]\d*)/)) {
727
+ // this.lex_state = EXPR_END;
728
+ // return ["NTH_REF", scanner.matched];
729
+ // }
730
+ // else if (scanner.scan(/^\$([\+\'\&\`])/)) {
731
+ // this.lex_state = EXPR_END;
732
+ // return ["BACK_REF", scanner.matched];
733
+ // }
734
+ // else if (scanner.scan(/^\$[!@\"~*$?\/\\:;=.,<>_]/)) {
735
+ // this.lex_state = EXPR_END;
736
+ // return ["GVAR", scanner.matched];
737
+ // }
738
+ else if (scanner.scan(/^\$[\+\'\`\&!@\"~*$?\/\\:;=.,<>_]/)) {
739
+ this.lex_state = EXPR_END;
740
+ return ["GVAR", scanner.matched];
741
+ }
742
+ else if (scanner.scan(/^\$\w+/)) {
743
+ this.lex_state = EXPR_END;
744
+ return ["GVAR", scanner.matched];
745
+ }
746
+ else if (scanner.scan(/^\@\@\w*/)) {
747
+ this.lex_state = EXPR_END;
748
+ return ["CVAR", scanner.matched];
749
+ }
750
+ else if (scanner.scan(/^\@\w*/)) {
751
+ this.lex_state = EXPR_END;
752
+ return ["IVAR", scanner.matched];
753
+ }
754
+
755
+ else if (scanner.scan(/^\,/)) {
756
+ this.lex_state = EXPR_BEG;
757
+ return [",", scanner.matched];
758
+ }
759
+
760
+ else if (scanner.scan(/^\{/)) {
761
+ var result;
762
+ // print(this.lex_state);
763
+ if (this.lex_state == EXPR_END || this.lex_state == EXPR_CMDARG) {
764
+ result = '{@';
765
+ }
766
+ else if (this.lex_state == EXPR_ENDARG) {
767
+ result = 'LBRACE_ARG';
768
+ }
769
+ else {
770
+ result = '{';
771
+ }
772
+
773
+ this.lex_state = EXPR_BEG;
774
+ this.cond_push(0);
775
+ this.cmdarg_push(0);
776
+
777
+ return [result, scanner.matched];
778
+ }
779
+
780
+ else if (scanner.check(/^[0-9]/)) {
781
+ this.lex_state = EXPR_END;
782
+ if (scanner.scan(/^[\d_]+\.[\d_]+\b/)) {
783
+ return ['FLOAT', scanner.matched.replace(/_/g, '')];
784
+ }
785
+ else if (scanner.scan(/^[\d_]+\b/)) {
786
+ return ['INTEGER', scanner.matched.replace(/_/g, '')];
787
+ }
788
+ else if (scanner.scan(/^0(x|X)(\d|[a-f]|[A-F])+/)) {
789
+ return ['INTEGER', scanner.matched.replace(/_/g, '')];
790
+ }
791
+ else {
792
+ // console.log('unexpected number type');
793
+ return [false, false];
794
+ }
795
+ }
796
+
797
+ else if (scanner.scan(/^(\w)+[\?\!]?/)) {
798
+ switch (scanner.matched) {
799
+ case 'class':
800
+ if (this.lex_state == EXPR_DOT) {
801
+ this.lex_state = EXPR_END;
802
+ return ["IDENTIFIER", scanner.matched];
803
+ }
804
+ this.lex_state = EXPR_CLASS;
805
+ return ["CLASS", scanner.matched];
806
+ case 'module':
807
+ if (this.lex_state == EXPR_DOT) return ["IDENITFIER", scanner.matched];
808
+ this.lex_state = EXPR_CLASS;
809
+ return ["MODULE", scanner.matched];
810
+ case 'def':
811
+ this.lex_state = EXPR_FNAME;
812
+ return ["DEF", scanner.matched];
813
+ case 'end':
814
+ this.lex_state = EXPR_END;
815
+ return ["END", scanner.matched];
816
+
817
+ case 'do':
818
+ if (this.cond_p()) {
819
+ this.lex_state = EXPR_BEG;
820
+ return ["DO_COND", scanner.matched];
821
+ }
822
+ else if (this.cmdarg_p() && this.lex_state != EXPR_CMDARG) {
823
+ this.lex_state = EXPR_BEG;
824
+ return ["DO_BLOCK", scanner.matched];
825
+ }
826
+
827
+ else if (this.lex_state == EXPR_ENDARG) {
828
+ return ["DO_BLOCK", scanner.matched];
829
+ }
830
+ else {
831
+ this.lex_state = EXPR_BEG;
832
+ return ["DO", scanner.matched];
833
+ }
834
+
835
+ // this.lex_state = EXPR_BEG;
836
+ // return ["DO", scanner.matched];
837
+ // }
838
+ // this.lex_state = EXPR_BEG;
839
+ // return ["DO_BLOCK", scanner.matched];
840
+ case 'if':
841
+ if (this.lex_state == EXPR_BEG) return ["IF", scanner.matched];
842
+ this.lex_state = EXPR_BEG;
843
+ return ["IF_MOD", scanner.matched];
844
+ case 'unless':
845
+ if (this.lex_state == EXPR_BEG) return ["UNLESS", scanner.matched];
846
+ this.lex_state = EXPR_BEG;
847
+ return ["UNLESS_MOD", scanner.matched];
848
+ case 'else':
849
+ return ["ELSE", scanner.matched];
850
+ case 'elsif':
851
+ return ["ELSIF", scanner.matched];
852
+ case 'self':
853
+ if (this.lex_state !== EXPR_FNAME) this.lex_state = EXPR_END;
854
+ return ["SELF", scanner.matched];
855
+ case 'true':
856
+ this.lex_state = EXPR_END;
857
+ return ["TRUE", scanner.matched];
858
+ case 'false':
859
+ this.lex_state = EXPR_END;
860
+ return ["FALSE", scanner.matched];
861
+ case 'nil':
862
+ this.lex_state = EXPR_END;
863
+ return ["NIL", scanner.matched];
864
+ case '__LINE__':
865
+ this.lex_state = EXPR_END;
866
+ return ["LINE", this._line_number.toString()];
867
+ case '__FILE__':
868
+ this.lex_state = EXPR_END;
869
+ return ["FILE", scanner.matched];
870
+ case 'begin':
871
+ this.lex_state = EXPR_BEG;
872
+ return ["BEGIN", scanner.matched];
873
+ case 'rescue':
874
+ if (this.lex_state == EXPR_DOT || this.lex_state == EXPR_FNAME) return ["IDENTIFIER", scanner.matched];
875
+ if (this.lex_state == EXPR_BEG) return ["RESCUE", scanner.matched];
876
+ this.lex_state = EXPR_BEG;
877
+ return ["RESCUE_MOD", scanner.matched];
878
+ case 'ensure':
879
+ this.lex_state = EXPR_BEG;
880
+ return ["ENSURE", scanner.matched];
881
+ case 'case':
882
+ this.lex_state = EXPR_BEG;
883
+ return ["CASE", scanner.matched];
884
+ case 'when':
885
+ this.lex_state = EXPR_BEG;
886
+ return ["WHEN", scanner.matched];
887
+ case 'or':
888
+ this.lex_state = EXPR_BEG;
889
+ return ["OR", scanner.matched];
890
+ case 'and':
891
+ this.lex_state = EXPR_BEG;
892
+ return ["AND", scanner.matched];
893
+ case 'not':
894
+ this.lex_state = EXPR_BEG;
895
+ return ["NOT", scanner.matched];
896
+ case 'return':
897
+ this.lex_state = EXPR_MID;
898
+ return ["RETURN", scanner.matched];
899
+ case 'next':
900
+ if (this.lex_state == EXPR_DOT) return ["IDENTIFIER", scanner.matched];
901
+ this.lex_state = EXPR_MID;
902
+ return ["NEXT", scanner.matched];
903
+ case 'break':
904
+ this.lex_state = EXPR_MID;
905
+ return ["BREAK", scanner.matched];
906
+ case 'super':
907
+ this.lex_state = EXPR_ARG;
908
+ return ["SUPER", scanner.matched];
909
+ case 'then':
910
+ return ["THEN", scanner.matched];
911
+ case 'while':
912
+ if (this.lex_state == EXPR_BEG) return ["WHILE", scanner.matched];
913
+ this.lex_state = EXPR_BEG;
914
+ return ["WHILE_MOD", scanner.matched];
915
+ case 'until':
916
+ // generator determines between while and until (mod)
917
+ if (this.lex_state == EXPR_BEG) return ["WHILE", scanner.matched];
918
+ this.lex_state = EXPR_BEG;
919
+ return ["WHILE_MOD", scanner.matched];
920
+ case 'block_given?':
921
+ this.lex_state = EXPR_END;
922
+ return ["BLOCK_GIVEN", scanner.matched];
923
+ case 'yield':
924
+ this.lex_state = EXPR_ARG;
925
+ return ["YIELD", scanner.matched];
926
+ // case 'require':
927
+ // if (this.lex_state == EXPR_DOT || this.lex_state == EXPR_FNAME) {
928
+ // return ["IDENTIFIER", scanner.matched];
929
+ // }
930
+ // this.lex_state = EXPR_MID;
931
+ // return ['REQUIRE', scanner.matched];
932
+ }
933
+
934
+ var matched = scanner.matched;
935
+
936
+ if (scanner.peek(2) !== '::' && scanner.scan(/^\:/)) {
937
+ return["LABEL", matched];
938
+ }
939
+
940
+ if (this.lex_state == EXPR_FNAME) {
941
+ if (scanner.scan(/^=/)) {
942
+ this.lex_state = EXPR_END;
943
+ return ["IDENTIFIER", matched + scanner.matched];
944
+ }
945
+
946
+ // this.lex_state = EXPR_END;
947
+ // return ["IDENTIFIER", matched];
948
+ }
949
+
950
+ // IDENTIFIER2, when we have identifer() .. when we dont preceed identifier
951
+ // with :: or .
952
+ // this makes our parser easier and removes conflicts
953
+ // if (this.lex_state !== EXPR_DOT && scanner.peek(1) == '(') {
954
+ // this.lex_state = EXPR_CMDARG;
955
+ // return ["IDENTIFIER2", matched];
956
+ // }
957
+
958
+ if ([EXPR_BEG, EXPR_DOT, EXPR_MID, EXPR_ARG, EXPR_CMDARG].indexOf(this.lex_state) !== -1) {
959
+ this.lex_state = EXPR_CMDARG;
960
+ }
961
+ else {
962
+ this.lex_state = EXPR_END;
963
+ }
964
+
965
+ return [/^[A-Z]/.exec(matched) ? "CONSTANT" : "IDENTIFIER", matched];
966
+ }
967
+
968
+ else {
969
+
970
+ return [false, false];
971
+ }
972
+
973
+ return [false, false];
974
+ }
975
+ };
976
+
977
+
978
+
979
+ exports.RubyParser = new RubyParser();