snowball 0.1.21 → 0.1.22

Sign up to get free protection for your applications and to get access to all the features.
Files changed (589) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +1 -3
  3. data/{lib/snowball → bin}/roll.js +0 -0
  4. data/lib/snowball/roller.rb +1 -1
  5. data/lib/snowball/version.rb +1 -1
  6. data/node_modules/.bin/browserify +161 -0
  7. data/node_modules/.bin/cake +7 -0
  8. data/node_modules/.bin/coffee +7 -0
  9. data/node_modules/.bin/jade +168 -0
  10. data/node_modules/browserify/.travis.yml +4 -0
  11. data/node_modules/browserify/LICENSE +63 -0
  12. data/node_modules/browserify/README.markdown +172 -0
  13. data/node_modules/browserify/bin/cmd.js +161 -0
  14. data/node_modules/browserify/builtins/__browserify_process.js +55 -0
  15. data/node_modules/browserify/builtins/assert.js +314 -0
  16. data/node_modules/browserify/builtins/child_process.js +2 -0
  17. data/node_modules/browserify/builtins/events.js +178 -0
  18. data/node_modules/browserify/builtins/fs.js +1 -0
  19. data/node_modules/browserify/builtins/https.js +1 -0
  20. data/node_modules/browserify/builtins/net.js +1 -0
  21. data/node_modules/browserify/builtins/path.js +175 -0
  22. data/node_modules/browserify/builtins/querystring.js +250 -0
  23. data/node_modules/browserify/builtins/stream.js +119 -0
  24. data/node_modules/browserify/builtins/string_decoder.js +161 -0
  25. data/node_modules/browserify/builtins/sys.js +1 -0
  26. data/node_modules/browserify/builtins/timers.js +39 -0
  27. data/node_modules/browserify/builtins/tls.js +1 -0
  28. data/node_modules/browserify/builtins/tty.js +2 -0
  29. data/node_modules/browserify/builtins/url.js +604 -0
  30. data/node_modules/browserify/builtins/util.js +351 -0
  31. data/node_modules/browserify/example/debug/browserify.js +219 -0
  32. data/node_modules/browserify/example/debug/build.sh +3 -0
  33. data/node_modules/browserify/example/debug/index.html +7 -0
  34. data/node_modules/browserify/example/debug/js/entry.js +2 -0
  35. data/node_modules/browserify/example/debug/js/thrower.js +3 -0
  36. data/node_modules/browserify/example/debug/server.js +9 -0
  37. data/node_modules/browserify/example/simple-build/browserify.js +368 -0
  38. data/node_modules/browserify/example/simple-build/build.sh +3 -0
  39. data/node_modules/browserify/example/simple-build/index.html +9 -0
  40. data/node_modules/browserify/example/simple-build/js/bar.js +3 -0
  41. data/node_modules/browserify/example/simple-build/js/entry.js +5 -0
  42. data/node_modules/browserify/example/simple-build/js/foo.js +5 -0
  43. data/node_modules/browserify/example/simple-build/server.js +9 -0
  44. data/node_modules/browserify/example/test/b.js +5 -0
  45. data/node_modules/browserify/example/test/bar.js +3 -0
  46. data/node_modules/browserify/example/test/foo.js +3 -0
  47. data/node_modules/browserify/example/test/m.js +3 -0
  48. data/node_modules/browserify/example/test/n.js +3 -0
  49. data/node_modules/browserify/example/using-http/bundle.js +813 -0
  50. data/node_modules/browserify/example/using-http/entry.js +25 -0
  51. data/node_modules/browserify/example/using-http/index.html +9 -0
  52. data/node_modules/browserify/example/using-http/server.js +28 -0
  53. data/node_modules/browserify/index.js +202 -0
  54. data/node_modules/browserify/lib/watch.js +75 -0
  55. data/node_modules/browserify/lib/wrap.js +580 -0
  56. data/node_modules/browserify/lib/wrappers.js +10 -0
  57. data/node_modules/browserify/node_modules/buffer-browserify/.npmignore +1 -0
  58. data/node_modules/browserify/node_modules/buffer-browserify/README.md +11 -0
  59. data/node_modules/browserify/node_modules/buffer-browserify/buffer_ieee754.js +84 -0
  60. data/node_modules/browserify/node_modules/buffer-browserify/index.js +1317 -0
  61. data/node_modules/browserify/node_modules/buffer-browserify/node_modules/base64-js/README.md +14 -0
  62. data/node_modules/browserify/node_modules/buffer-browserify/node_modules/base64-js/lib/b64.js +84 -0
  63. data/node_modules/browserify/node_modules/buffer-browserify/node_modules/base64-js/package.json +30 -0
  64. data/node_modules/browserify/node_modules/buffer-browserify/node_modules/base64-js/test/runner.js +50 -0
  65. data/node_modules/browserify/node_modules/buffer-browserify/package.json +46 -0
  66. data/node_modules/browserify/node_modules/buffer-browserify/test/buffer.js +218 -0
  67. data/node_modules/browserify/node_modules/commondir/README.markdown +45 -0
  68. data/node_modules/browserify/node_modules/commondir/example/base.js +3 -0
  69. data/node_modules/browserify/node_modules/commondir/example/dir.js +3 -0
  70. data/node_modules/browserify/node_modules/commondir/index.js +29 -0
  71. data/node_modules/browserify/node_modules/commondir/package.json +47 -0
  72. data/node_modules/browserify/node_modules/commondir/test/dirs.js +66 -0
  73. data/node_modules/browserify/node_modules/crypto-browserify/.travis.yml +4 -0
  74. data/node_modules/browserify/node_modules/crypto-browserify/example/bundle.js +637 -0
  75. data/node_modules/browserify/node_modules/crypto-browserify/example/index.html +12 -0
  76. data/node_modules/browserify/node_modules/crypto-browserify/example/test.js +4 -0
  77. data/node_modules/browserify/node_modules/crypto-browserify/index.js +74 -0
  78. data/node_modules/browserify/node_modules/crypto-browserify/md5.js +384 -0
  79. data/node_modules/browserify/node_modules/crypto-browserify/package.json +33 -0
  80. data/node_modules/browserify/node_modules/crypto-browserify/readme.markdown +20 -0
  81. data/node_modules/browserify/node_modules/crypto-browserify/rng.js +37 -0
  82. data/node_modules/browserify/node_modules/crypto-browserify/sha.js +210 -0
  83. data/node_modules/browserify/node_modules/crypto-browserify/test/simple.js +35 -0
  84. data/node_modules/browserify/node_modules/deputy/.travis.yml +4 -0
  85. data/node_modules/browserify/node_modules/deputy/README.markdown +55 -0
  86. data/node_modules/browserify/node_modules/deputy/example/cache.js +5 -0
  87. data/node_modules/browserify/node_modules/deputy/index.js +46 -0
  88. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.npmignore +2 -0
  89. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/.travis.yml +5 -0
  90. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/LICENSE +21 -0
  91. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/examples/pow.js +6 -0
  92. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/index.js +82 -0
  93. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/package.json +34 -0
  94. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/readme.markdown +63 -0
  95. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/chmod.js +38 -0
  96. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/clobber.js +37 -0
  97. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/mkdirp.js +28 -0
  98. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/perm.js +32 -0
  99. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/perm_sync.js +39 -0
  100. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/race.js +41 -0
  101. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/rel.js +32 -0
  102. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/return.js +25 -0
  103. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/return_sync.js +24 -0
  104. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/root.js +18 -0
  105. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/sync.js +32 -0
  106. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/umask.js +28 -0
  107. data/node_modules/browserify/node_modules/deputy/node_modules/mkdirp/test/umask_sync.js +32 -0
  108. data/node_modules/browserify/node_modules/deputy/package.json +47 -0
  109. data/node_modules/browserify/node_modules/deputy/test/cache.js +58 -0
  110. data/node_modules/browserify/node_modules/detective/.travis.yml +4 -0
  111. data/node_modules/browserify/node_modules/detective/README.markdown +66 -0
  112. data/node_modules/browserify/node_modules/detective/example/strings.js +6 -0
  113. data/node_modules/browserify/node_modules/detective/example/strings_src.js +3 -0
  114. data/node_modules/browserify/node_modules/detective/index.js +60 -0
  115. data/node_modules/browserify/node_modules/detective/node_modules/.bin/esparse +42 -0
  116. data/node_modules/browserify/node_modules/detective/node_modules/esprima/.travis.yml +5 -0
  117. data/node_modules/browserify/node_modules/detective/node_modules/esprima/LICENSE.BSD +19 -0
  118. data/node_modules/browserify/node_modules/detective/node_modules/esprima/README.md +74 -0
  119. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/codemirror/codemirror.css +112 -0
  120. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/codemirror/codemirror.js +2972 -0
  121. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/codemirror/javascript.js +360 -0
  122. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/json2.js +487 -0
  123. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/style.css +164 -0
  124. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/yui/treeview-min.js +12 -0
  125. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/yui/treeview-sprite.gif +0 -0
  126. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/yui/treeview.css +7 -0
  127. data/node_modules/browserify/node_modules/detective/node_modules/esprima/assets/yui/yahoo-dom-event.js +14 -0
  128. data/node_modules/browserify/node_modules/detective/node_modules/esprima/bin/esparse.js +42 -0
  129. data/node_modules/browserify/node_modules/detective/node_modules/esprima/changes +92 -0
  130. data/node_modules/browserify/node_modules/detective/node_modules/esprima/cm +696 -0
  131. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/checkenv.js +42 -0
  132. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/collector.html +82 -0
  133. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/collector.js +170 -0
  134. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/functiontrace.html +106 -0
  135. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/functiontrace.js +123 -0
  136. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/parse.css +82 -0
  137. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/parse.html +352 -0
  138. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/precedence.html +225 -0
  139. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/rewrite.html +120 -0
  140. data/node_modules/browserify/node_modules/detective/node_modules/esprima/demo/rewrite.js +71 -0
  141. data/node_modules/browserify/node_modules/detective/node_modules/esprima/esprima.js +3577 -0
  142. data/node_modules/browserify/node_modules/detective/node_modules/esprima/index.html +103 -0
  143. data/node_modules/browserify/node_modules/detective/node_modules/esprima/package.json +42 -0
  144. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/Tokenizer.js +646 -0
  145. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/XMLHttpRequest.js +509 -0
  146. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/ZeParser.js +2185 -0
  147. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/backbone-0.5.3.js +1158 -0
  148. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/benchmark.js +3261 -0
  149. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/escodegen.js +906 -0
  150. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/esmorph.js +240 -0
  151. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/ext-core-3.0.0.js +6579 -0
  152. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/ext-core-3.1.0.js +10255 -0
  153. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/jquery-1.6.4.js +9046 -0
  154. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/jquery-1.7.1.js +9266 -0
  155. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/jquery.mobile-1.0.js +6951 -0
  156. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/jsdefs.js +731 -0
  157. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/jslex.js +588 -0
  158. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/jsparse.js +1921 -0
  159. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/mootools-1.3.2.js +5952 -0
  160. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/mootools-1.4.1.js +6297 -0
  161. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/parse-js.js +1342 -0
  162. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/platform.js +878 -0
  163. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/prototype-1.6.1.js +4874 -0
  164. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/prototype-1.7.0.0.js +6082 -0
  165. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/3rdparty/underscore-1.2.3.js +981 -0
  166. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/benchmarks.html +58 -0
  167. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/benchmarks.js +328 -0
  168. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/compare.html +140 -0
  169. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/compare.js +270 -0
  170. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/compat.html +40 -0
  171. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/compat.js +239 -0
  172. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/coverage.footer.html +3 -0
  173. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/coverage.header.html +37 -0
  174. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/coverage.html +3617 -0
  175. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/index.html +36 -0
  176. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/reflect.js +403 -0
  177. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/run.js +66 -0
  178. data/node_modules/browserify/node_modules/detective/node_modules/esprima/test/test.js +16659 -0
  179. data/node_modules/browserify/node_modules/detective/node_modules/esprima/tools/generate-unicode-regex.py +164 -0
  180. data/node_modules/browserify/node_modules/detective/node_modules/esprima/tools/update-coverage.sh +28 -0
  181. data/node_modules/browserify/node_modules/detective/package.json +47 -0
  182. data/node_modules/browserify/node_modules/detective/test/both.js +11 -0
  183. data/node_modules/browserify/node_modules/detective/test/chained.js +9 -0
  184. data/node_modules/browserify/node_modules/detective/test/files/both.js +4 -0
  185. data/node_modules/browserify/node_modules/detective/test/files/chained.js +5 -0
  186. data/node_modules/browserify/node_modules/detective/test/files/nested.js +22 -0
  187. data/node_modules/browserify/node_modules/detective/test/files/skip.js +7 -0
  188. data/node_modules/browserify/node_modules/detective/test/files/strings.js +13 -0
  189. data/node_modules/browserify/node_modules/detective/test/files/word.js +13 -0
  190. data/node_modules/browserify/node_modules/detective/test/nested.js +9 -0
  191. data/node_modules/browserify/node_modules/detective/test/skip.js +9 -0
  192. data/node_modules/browserify/node_modules/detective/test/strings.js +9 -0
  193. data/node_modules/browserify/node_modules/detective/test/word.js +12 -0
  194. data/node_modules/browserify/node_modules/http-browserify/.npmignore +1 -0
  195. data/node_modules/browserify/node_modules/http-browserify/example/get/index.html +9 -0
  196. data/node_modules/browserify/node_modules/http-browserify/example/get/main.js +14 -0
  197. data/node_modules/browserify/node_modules/http-browserify/example/get/server.js +12 -0
  198. data/node_modules/browserify/node_modules/http-browserify/example/headers/index.html +9 -0
  199. data/node_modules/browserify/node_modules/http-browserify/example/headers/main.js +18 -0
  200. data/node_modules/browserify/node_modules/http-browserify/example/headers/server.js +15 -0
  201. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/data.json +139 -0
  202. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/index.html +9 -0
  203. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/main.js +13 -0
  204. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/.npmignore +2 -0
  205. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/.travis.yml +4 -0
  206. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/LICENSE.APACHE2 +15 -0
  207. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/LICENSE.MIT +24 -0
  208. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/examples/all_docs.js +13 -0
  209. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/index.js +189 -0
  210. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/LICENSE +24 -0
  211. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/README.markdown +11 -0
  212. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/bench.js +26 -0
  213. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/examples/twitterfeed.js +30 -0
  214. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/jsonparse.js +379 -0
  215. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/package.json +36 -0
  216. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/samplejson/basic.json +167 -0
  217. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/samplejson/basic2.json +180 -0
  218. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/test/primitives.js +54 -0
  219. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/node_modules/jsonparse/test/utf8.js +38 -0
  220. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/package.json +40 -0
  221. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/readme.markdown +145 -0
  222. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/bool.js +41 -0
  223. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/destroy_missing.js +22 -0
  224. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/empty.js +44 -0
  225. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/fixtures/all_npm.json +4030 -0
  226. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/fn.js +39 -0
  227. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/memory.js +69 -0
  228. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/multiple_objects.js +42 -0
  229. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/multiple_objects_error.js +35 -0
  230. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/parsejson.js +28 -0
  231. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/stringify.js +41 -0
  232. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/stringify_object.js +47 -0
  233. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/test.js +35 -0
  234. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/test2.js +29 -0
  235. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/node_modules/JSONStream/test/two-ways.js +41 -0
  236. data/node_modules/browserify/node_modules/http-browserify/example/json-stream/server.js +10 -0
  237. data/node_modules/browserify/node_modules/http-browserify/example/post/index.html +9 -0
  238. data/node_modules/browserify/node_modules/http-browserify/example/post/main.js +16 -0
  239. data/node_modules/browserify/node_modules/http-browserify/example/post/server.js +19 -0
  240. data/node_modules/browserify/node_modules/http-browserify/example/streaming/index.html +9 -0
  241. data/node_modules/browserify/node_modules/http-browserify/example/streaming/main.js +16 -0
  242. data/node_modules/browserify/node_modules/http-browserify/example/streaming/server.js +21 -0
  243. data/node_modules/browserify/node_modules/http-browserify/index.js +59 -0
  244. data/node_modules/browserify/node_modules/http-browserify/lib/request.js +128 -0
  245. data/node_modules/browserify/node_modules/http-browserify/lib/response.js +119 -0
  246. data/node_modules/browserify/node_modules/http-browserify/node_modules/concat-stream/index.js +48 -0
  247. data/node_modules/browserify/node_modules/http-browserify/node_modules/concat-stream/package.json +30 -0
  248. data/node_modules/browserify/node_modules/http-browserify/node_modules/concat-stream/readme.md +31 -0
  249. data/node_modules/browserify/node_modules/http-browserify/node_modules/concat-stream/test.js +34 -0
  250. data/node_modules/browserify/node_modules/http-browserify/package.json +46 -0
  251. data/node_modules/browserify/node_modules/http-browserify/readme.markdown +128 -0
  252. data/node_modules/browserify/node_modules/nub/README.markdown +23 -0
  253. data/node_modules/browserify/node_modules/nub/index.js +64 -0
  254. data/node_modules/browserify/node_modules/nub/package.json +46 -0
  255. data/node_modules/browserify/node_modules/nub/test/by.js +51 -0
  256. data/node_modules/browserify/node_modules/nub/test/nub.js +46 -0
  257. data/node_modules/browserify/node_modules/resolve/.travis.yml +4 -0
  258. data/node_modules/browserify/node_modules/resolve/LICENSE +18 -0
  259. data/node_modules/browserify/node_modules/resolve/README.markdown +47 -0
  260. data/node_modules/browserify/node_modules/resolve/index.js +106 -0
  261. data/node_modules/browserify/node_modules/resolve/package.json +45 -0
  262. data/node_modules/browserify/node_modules/resolve/test/core.js +12 -0
  263. data/node_modules/browserify/node_modules/resolve/test/filter.js +15 -0
  264. data/node_modules/browserify/node_modules/resolve/test/mock.js +64 -0
  265. data/node_modules/browserify/node_modules/resolve/test/resolver.js +157 -0
  266. data/node_modules/browserify/node_modules/resolve/test/resolver/bar/node_modules/foo/index.js +1 -0
  267. data/node_modules/browserify/node_modules/resolve/test/resolver/baz/doom.js +0 -0
  268. data/node_modules/browserify/node_modules/resolve/test/resolver/baz/package.json +3 -0
  269. data/node_modules/browserify/node_modules/resolve/test/resolver/baz/quux.js +1 -0
  270. data/node_modules/browserify/node_modules/resolve/test/resolver/biz/node_modules/grux/index.js +1 -0
  271. data/node_modules/browserify/node_modules/resolve/test/resolver/biz/node_modules/tiv/index.js +1 -0
  272. data/node_modules/browserify/node_modules/resolve/test/resolver/cup.coffee +1 -0
  273. data/node_modules/browserify/node_modules/resolve/test/resolver/foo.js +1 -0
  274. data/node_modules/browserify/node_modules/resolve/test/resolver/mug.coffee +0 -0
  275. data/node_modules/browserify/node_modules/resolve/test/resolver/mug.js +0 -0
  276. data/node_modules/browserify/node_modules/resolve/test/resolver/other_path/lib/other-lib.js +0 -0
  277. data/node_modules/browserify/node_modules/resolve/test/resolver/other_path/root.js +0 -0
  278. data/node_modules/browserify/node_modules/syntax-error/.travis.yml +4 -0
  279. data/node_modules/browserify/node_modules/syntax-error/LICENSE +18 -0
  280. data/node_modules/browserify/node_modules/syntax-error/example/check.js +12 -0
  281. data/node_modules/browserify/node_modules/syntax-error/example/src.js +9 -0
  282. data/node_modules/browserify/node_modules/syntax-error/index.js +54 -0
  283. data/node_modules/browserify/node_modules/syntax-error/node_modules/.bin/esparse +42 -0
  284. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/.travis.yml +5 -0
  285. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/LICENSE.BSD +19 -0
  286. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/README.md +74 -0
  287. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/codemirror/codemirror.css +112 -0
  288. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/codemirror/codemirror.js +2972 -0
  289. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/codemirror/javascript.js +360 -0
  290. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/json2.js +487 -0
  291. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/style.css +164 -0
  292. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/yui/treeview-min.js +12 -0
  293. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/yui/treeview-sprite.gif +0 -0
  294. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/yui/treeview.css +7 -0
  295. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/assets/yui/yahoo-dom-event.js +14 -0
  296. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/bin/esparse.js +42 -0
  297. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/changes +92 -0
  298. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/cm +696 -0
  299. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/checkenv.js +42 -0
  300. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/collector.html +82 -0
  301. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/collector.js +170 -0
  302. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/functiontrace.html +106 -0
  303. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/functiontrace.js +123 -0
  304. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/parse.css +82 -0
  305. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/parse.html +352 -0
  306. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/precedence.html +225 -0
  307. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/rewrite.html +120 -0
  308. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/demo/rewrite.js +71 -0
  309. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/esprima.js +3577 -0
  310. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/index.html +103 -0
  311. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/package.json +42 -0
  312. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/Tokenizer.js +646 -0
  313. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/XMLHttpRequest.js +509 -0
  314. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/ZeParser.js +2185 -0
  315. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/backbone-0.5.3.js +1158 -0
  316. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/benchmark.js +3261 -0
  317. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/escodegen.js +906 -0
  318. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/esmorph.js +240 -0
  319. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/ext-core-3.0.0.js +6579 -0
  320. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/ext-core-3.1.0.js +10255 -0
  321. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/jquery-1.6.4.js +9046 -0
  322. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/jquery-1.7.1.js +9266 -0
  323. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/jquery.mobile-1.0.js +6951 -0
  324. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/jsdefs.js +731 -0
  325. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/jslex.js +588 -0
  326. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/jsparse.js +1921 -0
  327. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/mootools-1.3.2.js +5952 -0
  328. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/mootools-1.4.1.js +6297 -0
  329. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/parse-js.js +1342 -0
  330. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/platform.js +878 -0
  331. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/prototype-1.6.1.js +4874 -0
  332. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/prototype-1.7.0.0.js +6082 -0
  333. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/3rdparty/underscore-1.2.3.js +981 -0
  334. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/benchmarks.html +58 -0
  335. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/benchmarks.js +328 -0
  336. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/compare.html +140 -0
  337. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/compare.js +270 -0
  338. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/compat.html +40 -0
  339. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/compat.js +239 -0
  340. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/coverage.footer.html +3 -0
  341. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/coverage.header.html +37 -0
  342. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/coverage.html +3617 -0
  343. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/index.html +36 -0
  344. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/reflect.js +403 -0
  345. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/run.js +66 -0
  346. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/test/test.js +16659 -0
  347. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/tools/generate-unicode-regex.py +164 -0
  348. data/node_modules/browserify/node_modules/syntax-error/node_modules/esprima/tools/update-coverage.sh +28 -0
  349. data/node_modules/browserify/node_modules/syntax-error/package.json +49 -0
  350. data/node_modules/browserify/node_modules/syntax-error/readme.markdown +87 -0
  351. data/node_modules/browserify/node_modules/syntax-error/test/check.js +17 -0
  352. data/node_modules/browserify/node_modules/syntax-error/test/sources/check.js +9 -0
  353. data/node_modules/browserify/node_modules/vm-browserify/README.markdown +103 -0
  354. data/node_modules/browserify/node_modules/vm-browserify/example/run/bundle.js +473 -0
  355. data/node_modules/browserify/node_modules/vm-browserify/example/run/entry.js +6 -0
  356. data/node_modules/browserify/node_modules/vm-browserify/example/run/index.html +9 -0
  357. data/node_modules/browserify/node_modules/vm-browserify/example/run/server.js +6 -0
  358. data/node_modules/browserify/node_modules/vm-browserify/index.js +85 -0
  359. data/node_modules/browserify/node_modules/vm-browserify/package.json +43 -0
  360. data/node_modules/browserify/node_modules/vm-browserify/testling/run.js +22 -0
  361. data/node_modules/browserify/node_modules/vm-browserify/testling/test.sh +11 -0
  362. data/node_modules/browserify/package.json +78 -0
  363. data/node_modules/browserify/test/alias.js +58 -0
  364. data/node_modules/browserify/test/backbone.js +21 -0
  365. data/node_modules/browserify/test/bin.js +39 -0
  366. data/node_modules/browserify/test/buffer.js +99 -0
  367. data/node_modules/browserify/test/bundle.js +32 -0
  368. data/node_modules/browserify/test/cache.js +28 -0
  369. data/node_modules/browserify/test/coffee.js +39 -0
  370. data/node_modules/browserify/test/coffee/bar.js +1 -0
  371. data/node_modules/browserify/test/coffee/baz.coffee +1 -0
  372. data/node_modules/browserify/test/coffee/entry.coffee +1 -0
  373. data/node_modules/browserify/test/coffee/foo.coffee +1 -0
  374. data/node_modules/browserify/test/coffee/index.coffee +5 -0
  375. data/node_modules/browserify/test/coffee/nested/nested.coffee +2 -0
  376. data/node_modules/browserify/test/comment.js +17 -0
  377. data/node_modules/browserify/test/comment/main.js +2 -0
  378. data/node_modules/browserify/test/crypto.js +37 -0
  379. data/node_modules/browserify/test/dnode.js +27 -0
  380. data/node_modules/browserify/test/dollar.js +19 -0
  381. data/node_modules/browserify/test/dollar/dollar/index.js +7 -0
  382. data/node_modules/browserify/test/entry.js +36 -0
  383. data/node_modules/browserify/test/entry/main.js +1 -0
  384. data/node_modules/browserify/test/entry/one.js +1 -0
  385. data/node_modules/browserify/test/entry/two.js +1 -0
  386. data/node_modules/browserify/test/error_code.js +24 -0
  387. data/node_modules/browserify/test/error_code/src.js +2 -0
  388. data/node_modules/browserify/test/export.js +52 -0
  389. data/node_modules/browserify/test/export/entry.js +1 -0
  390. data/node_modules/browserify/test/field.js +64 -0
  391. data/node_modules/browserify/test/field/miss.js +1 -0
  392. data/node_modules/browserify/test/field/node_modules/z-miss/browser.js +1 -0
  393. data/node_modules/browserify/test/field/node_modules/z-miss/main.js +1 -0
  394. data/node_modules/browserify/test/field/node_modules/z-miss/package.json +4 -0
  395. data/node_modules/browserify/test/field/node_modules/z-object/browser.js +1 -0
  396. data/node_modules/browserify/test/field/node_modules/z-object/main.js +1 -0
  397. data/node_modules/browserify/test/field/node_modules/z-object/package.json +6 -0
  398. data/node_modules/browserify/test/field/node_modules/z-string/browser.js +1 -0
  399. data/node_modules/browserify/test/field/node_modules/z-string/main.js +1 -0
  400. data/node_modules/browserify/test/field/node_modules/z-string/package.json +4 -0
  401. data/node_modules/browserify/test/field/node_modules/z-sub/browser/a.js +1 -0
  402. data/node_modules/browserify/test/field/node_modules/z-sub/browser/b.js +1 -0
  403. data/node_modules/browserify/test/field/node_modules/z-sub/main.js +1 -0
  404. data/node_modules/browserify/test/field/node_modules/z-sub/package.json +4 -0
  405. data/node_modules/browserify/test/field/object.js +1 -0
  406. data/node_modules/browserify/test/field/string.js +1 -0
  407. data/node_modules/browserify/test/field/sub.js +1 -0
  408. data/node_modules/browserify/test/global.js +19 -0
  409. data/node_modules/browserify/test/global/main.js +2 -0
  410. data/node_modules/browserify/test/jade.js +35 -0
  411. data/node_modules/browserify/test/json.js +17 -0
  412. data/node_modules/browserify/test/json/beep.json +4 -0
  413. data/node_modules/browserify/test/json/main.js +1 -0
  414. data/node_modules/browserify/test/maxlisteners.js +8 -0
  415. data/node_modules/browserify/test/module.js +22 -0
  416. data/node_modules/browserify/test/multi_entry.js +20 -0
  417. data/node_modules/browserify/test/multi_entry/a.js +2 -0
  418. data/node_modules/browserify/test/multi_entry/b.js +2 -0
  419. data/node_modules/browserify/test/multi_entry/c.js +3 -0
  420. data/node_modules/browserify/test/multi_ignore.js +23 -0
  421. data/node_modules/browserify/test/node_modules/beep/index.js +1 -0
  422. data/node_modules/browserify/test/require_cache.js +18 -0
  423. data/node_modules/browserify/test/retarget.js +27 -0
  424. data/node_modules/browserify/test/seq.js +47 -0
  425. data/node_modules/browserify/test/subdep.js +26 -0
  426. data/node_modules/browserify/test/subdep/index.js +1 -0
  427. data/node_modules/browserify/test/subdep/package.json +6 -0
  428. data/node_modules/browserify/test/util.js +48 -0
  429. data/node_modules/browserify/test/watch.js +91 -0
  430. data/node_modules/browserify/test/watch/a.js +1 -0
  431. data/node_modules/browserify/test/wrap.js +43 -0
  432. data/node_modules/browserify/test/wrap/a.js +2 -0
  433. data/node_modules/browserify/test/wrap/c.js +1 -0
  434. data/node_modules/browserify/test/wrap/node_modules/b/main.js +1 -0
  435. data/node_modules/browserify/test/wrap/node_modules/b/package.json +3 -0
  436. data/node_modules/browserify/test/wrap/node_modules/skipmetoo/index.js +1 -0
  437. data/node_modules/browserify/test/wrap/skipme.js +1 -0
  438. data/node_modules/browserify/test/wrap/x.js +0 -0
  439. data/node_modules/browserify/testling/README.markdown +29 -0
  440. data/node_modules/browserify/testling/test.sh +37 -0
  441. data/node_modules/browserify/testling/tick.js +9 -0
  442. data/node_modules/browserify/testling/timers.js +50 -0
  443. data/node_modules/browserify/testling/util.js +24 -0
  444. data/node_modules/browserify/v2.markdown +41 -0
  445. data/node_modules/browserify/wrappers/alias.js +1 -0
  446. data/node_modules/browserify/wrappers/body.js +2 -0
  447. data/node_modules/browserify/wrappers/body_debug.js +2 -0
  448. data/node_modules/browserify/wrappers/entry.js +3 -0
  449. data/node_modules/browserify/wrappers/entry_debug.js +3 -0
  450. data/node_modules/browserify/wrappers/package.js +3 -0
  451. data/node_modules/browserify/wrappers/prelude.js +196 -0
  452. data/node_modules/coffee-script/.npmignore +11 -0
  453. data/node_modules/coffee-script/CNAME +1 -0
  454. data/node_modules/coffee-script/CONTRIBUTING.md +9 -0
  455. data/node_modules/coffee-script/LICENSE +22 -0
  456. data/node_modules/coffee-script/README +51 -0
  457. data/node_modules/coffee-script/Rakefile +78 -0
  458. data/node_modules/coffee-script/bin/cake +7 -0
  459. data/node_modules/coffee-script/bin/coffee +7 -0
  460. data/node_modules/coffee-script/extras/jsl.conf +44 -0
  461. data/node_modules/coffee-script/lib/coffee-script/browser.js +92 -0
  462. data/node_modules/coffee-script/lib/coffee-script/cake.js +113 -0
  463. data/node_modules/coffee-script/lib/coffee-script/coffee-script.js +171 -0
  464. data/node_modules/coffee-script/lib/coffee-script/command.js +502 -0
  465. data/node_modules/coffee-script/lib/coffee-script/grammar.js +606 -0
  466. data/node_modules/coffee-script/lib/coffee-script/helpers.js +88 -0
  467. data/node_modules/coffee-script/lib/coffee-script/index.js +11 -0
  468. data/node_modules/coffee-script/lib/coffee-script/lexer.js +788 -0
  469. data/node_modules/coffee-script/lib/coffee-script/nodes.js +2971 -0
  470. data/node_modules/coffee-script/lib/coffee-script/optparse.js +138 -0
  471. data/node_modules/coffee-script/lib/coffee-script/parser.js +683 -0
  472. data/node_modules/coffee-script/lib/coffee-script/repl.js +276 -0
  473. data/node_modules/coffee-script/lib/coffee-script/rewriter.js +349 -0
  474. data/node_modules/coffee-script/lib/coffee-script/scope.js +146 -0
  475. data/node_modules/coffee-script/package.json +50 -0
  476. data/node_modules/jade-runtime/.npmignore +15 -0
  477. data/node_modules/jade-runtime/README.md +8 -0
  478. data/node_modules/jade-runtime/globals.js +32 -0
  479. data/node_modules/jade-runtime/index.js +2 -0
  480. data/node_modules/jade-runtime/jade-runtime.js +181 -0
  481. data/node_modules/jade-runtime/package.json +18 -0
  482. data/node_modules/jade/.npmignore +14 -0
  483. data/node_modules/jade/LICENSE +22 -0
  484. data/node_modules/jade/Readme.md +1299 -0
  485. data/node_modules/jade/bin/jade +168 -0
  486. data/node_modules/jade/index.js +4 -0
  487. data/node_modules/jade/jade.js +3586 -0
  488. data/node_modules/jade/jade.md +510 -0
  489. data/node_modules/jade/jade.min.js +2 -0
  490. data/node_modules/jade/lib/compiler.js +654 -0
  491. data/node_modules/jade/lib/doctypes.js +18 -0
  492. data/node_modules/jade/lib/filters.js +97 -0
  493. data/node_modules/jade/lib/inline-tags.js +28 -0
  494. data/node_modules/jade/lib/jade.js +253 -0
  495. data/node_modules/jade/lib/lexer.js +774 -0
  496. data/node_modules/jade/lib/nodes/attrs.js +77 -0
  497. data/node_modules/jade/lib/nodes/block-comment.js +33 -0
  498. data/node_modules/jade/lib/nodes/block.js +122 -0
  499. data/node_modules/jade/lib/nodes/case.js +43 -0
  500. data/node_modules/jade/lib/nodes/code.js +35 -0
  501. data/node_modules/jade/lib/nodes/comment.js +32 -0
  502. data/node_modules/jade/lib/nodes/doctype.js +29 -0
  503. data/node_modules/jade/lib/nodes/each.js +35 -0
  504. data/node_modules/jade/lib/nodes/filter.js +35 -0
  505. data/node_modules/jade/lib/nodes/index.js +20 -0
  506. data/node_modules/jade/lib/nodes/literal.js +32 -0
  507. data/node_modules/jade/lib/nodes/mixin.js +36 -0
  508. data/node_modules/jade/lib/nodes/node.js +25 -0
  509. data/node_modules/jade/lib/nodes/tag.js +95 -0
  510. data/node_modules/jade/lib/nodes/text.js +36 -0
  511. data/node_modules/jade/lib/parser.js +714 -0
  512. data/node_modules/jade/lib/runtime.js +174 -0
  513. data/node_modules/jade/lib/self-closing.js +19 -0
  514. data/node_modules/jade/lib/utils.js +49 -0
  515. data/node_modules/jade/node_modules/commander/.npmignore +4 -0
  516. data/node_modules/jade/node_modules/commander/.travis.yml +4 -0
  517. data/node_modules/jade/node_modules/commander/History.md +107 -0
  518. data/node_modules/jade/node_modules/commander/Makefile +7 -0
  519. data/node_modules/jade/node_modules/commander/Readme.md +262 -0
  520. data/node_modules/jade/node_modules/commander/index.js +2 -0
  521. data/node_modules/jade/node_modules/commander/lib/commander.js +1026 -0
  522. data/node_modules/jade/node_modules/commander/package.json +39 -0
  523. data/node_modules/jade/node_modules/mkdirp/.npmignore +2 -0
  524. data/node_modules/jade/node_modules/mkdirp/.travis.yml +4 -0
  525. data/node_modules/jade/node_modules/mkdirp/LICENSE +21 -0
  526. data/node_modules/jade/node_modules/mkdirp/README.markdown +61 -0
  527. data/node_modules/jade/node_modules/mkdirp/examples/pow.js +6 -0
  528. data/node_modules/jade/node_modules/mkdirp/index.js +82 -0
  529. data/node_modules/jade/node_modules/mkdirp/package.json +37 -0
  530. data/node_modules/jade/node_modules/mkdirp/test/chmod.js +38 -0
  531. data/node_modules/jade/node_modules/mkdirp/test/clobber.js +37 -0
  532. data/node_modules/jade/node_modules/mkdirp/test/mkdirp.js +28 -0
  533. data/node_modules/jade/node_modules/mkdirp/test/perm.js +32 -0
  534. data/node_modules/jade/node_modules/mkdirp/test/perm_sync.js +39 -0
  535. data/node_modules/jade/node_modules/mkdirp/test/race.js +41 -0
  536. data/node_modules/jade/node_modules/mkdirp/test/rel.js +32 -0
  537. data/node_modules/jade/node_modules/mkdirp/test/return.js +25 -0
  538. data/node_modules/jade/node_modules/mkdirp/test/return_sync.js +24 -0
  539. data/node_modules/jade/node_modules/mkdirp/test/root.js +18 -0
  540. data/node_modules/jade/node_modules/mkdirp/test/sync.js +32 -0
  541. data/node_modules/jade/node_modules/mkdirp/test/umask.js +28 -0
  542. data/node_modules/jade/node_modules/mkdirp/test/umask_sync.js +32 -0
  543. data/node_modules/jade/package.json +53 -0
  544. data/node_modules/jade/runtime.js +179 -0
  545. data/node_modules/jade/runtime.min.js +1 -0
  546. data/node_modules/jade/test.jade +7 -0
  547. data/node_modules/jade/testing/head.jade +5 -0
  548. data/node_modules/jade/testing/index.jade +1 -0
  549. data/node_modules/jade/testing/index.js +14 -0
  550. data/node_modules/jade/testing/layout.jade +10 -0
  551. data/node_modules/jade/testing/user.jade +7 -0
  552. data/node_modules/jade/testing/user.js +27 -0
  553. data/node_modules/optimist/.travis.yml +4 -0
  554. data/node_modules/optimist/LICENSE +21 -0
  555. data/node_modules/optimist/README.markdown +487 -0
  556. data/node_modules/optimist/example/bool.js +10 -0
  557. data/node_modules/optimist/example/boolean_double.js +7 -0
  558. data/node_modules/optimist/example/boolean_single.js +7 -0
  559. data/node_modules/optimist/example/default_hash.js +8 -0
  560. data/node_modules/optimist/example/default_singles.js +7 -0
  561. data/node_modules/optimist/example/divide.js +8 -0
  562. data/node_modules/optimist/example/line_count.js +20 -0
  563. data/node_modules/optimist/example/line_count_options.js +29 -0
  564. data/node_modules/optimist/example/line_count_wrap.js +29 -0
  565. data/node_modules/optimist/example/nonopt.js +4 -0
  566. data/node_modules/optimist/example/reflect.js +2 -0
  567. data/node_modules/optimist/example/short.js +3 -0
  568. data/node_modules/optimist/example/string.js +11 -0
  569. data/node_modules/optimist/example/usage-options.js +19 -0
  570. data/node_modules/optimist/example/xup.js +10 -0
  571. data/node_modules/optimist/index.js +475 -0
  572. data/node_modules/optimist/node_modules/wordwrap/.npmignore +1 -0
  573. data/node_modules/optimist/node_modules/wordwrap/README.markdown +70 -0
  574. data/node_modules/optimist/node_modules/wordwrap/example/center.js +10 -0
  575. data/node_modules/optimist/node_modules/wordwrap/example/meat.js +3 -0
  576. data/node_modules/optimist/node_modules/wordwrap/index.js +76 -0
  577. data/node_modules/optimist/node_modules/wordwrap/package.json +45 -0
  578. data/node_modules/optimist/node_modules/wordwrap/test/break.js +30 -0
  579. data/node_modules/optimist/node_modules/wordwrap/test/idleness.txt +63 -0
  580. data/node_modules/optimist/node_modules/wordwrap/test/wrap.js +31 -0
  581. data/node_modules/optimist/package.json +55 -0
  582. data/node_modules/optimist/test/_.js +71 -0
  583. data/node_modules/optimist/test/_/argv.js +2 -0
  584. data/node_modules/optimist/test/_/bin.js +3 -0
  585. data/node_modules/optimist/test/parse.js +420 -0
  586. data/node_modules/optimist/test/usage.js +292 -0
  587. data/snowball.gemspec +1 -2
  588. metadata +601 -21
  589. data/extconf.rb +0 -9
@@ -0,0 +1,120 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Esprima: Full Source Rewrite Demo</title>
6
+ <script src="../test/3rdparty/platform.js"></script>
7
+ <script src="../test/3rdparty/escodegen.js"></script>
8
+ <script src="checkenv.js"></script>
9
+ <script src="rewrite.js"></script>
10
+ <script src="../esprima.js"></script>
11
+ <script src="../assets/codemirror/codemirror.js"></script>
12
+ <script src="../assets/codemirror/javascript.js"></script>
13
+ <link rel="stylesheet" type="text/css" href="../assets/codemirror/codemirror.css"/>
14
+ <link rel="stylesheet" type="text/css" href="../assets/style.css"/>
15
+ <style>
16
+ .CodeMirror-scroll {
17
+ height: 300px;
18
+ }
19
+ </style>
20
+ </head>
21
+ <body>
22
+ <div class="container">
23
+
24
+ <div class="topbar">
25
+ <ul class="nav">
26
+ <li><a href="../index.html">&larr; Home</a></li>
27
+ <li><a href="http://github.com/ariya/esprima">Code</a></li>
28
+ <li><a href="http://wiki.esprima.org">Documentation</a></li>
29
+ <li><a href="http://issues.esprima.org">Issues</a></li>
30
+ </ul>
31
+ </div>
32
+
33
+ <h1>Source Rewrite <small>cleans up and reformats everything</small></h1>
34
+
35
+ <p>Type ECMAScript code in the editor. Press <b>Rewrite</b> button to get the code
36
+ parsed and reconstructed.</p>
37
+
38
+ <p><textarea id="code" autofocus="autofocus" cols="70" rows="25" spellcheck="false">
39
+ // Example of messy code with confusing and inconsistent indentations
40
+
41
+ function bubbleSort (list) {
42
+ var items = list.slice(0), swapped =false,
43
+ p, q;
44
+ for ( p= 1;p &lt; items.length; ++p) {
45
+ for (q=0; q &lt; items.length - p; ++q) {
46
+ if (items[q + 1 ] &lt; items[q]) {
47
+ swapped =true;
48
+ let temp = items[q];
49
+ items[q] = items[ q+1]; items[q+1] = temp;
50
+ }
51
+ }
52
+ if (!swapped)
53
+ break;
54
+ }
55
+ return items;
56
+ }
57
+ </textarea></p>
58
+
59
+ <p>Indent with:
60
+ <label><input type="radio" name="indent" id="onetab" value="onetab"> tab</label>
61
+ <label><input type="radio" name="indent" id="twospaces" value="twospaces"> 2 spaces</label>
62
+ <label><input checked type="radio" name="indent" id="fourspaces" value="fourspaces"> 4 spaces</label>
63
+ </p>
64
+
65
+ <p><input type="button" value="Rewrite" id="rewrite"></p>
66
+
67
+ <p id="codemirror" align="right"><small>The above code editor is based on <a href="http://codemirror.net" target="_blank">CodeMirror</a>.</small></p>
68
+
69
+ <p id="error"></p>
70
+
71
+ <p><b>Notes</b>:</p>
72
+ <ul>
73
+ <li>Only valid syntax is accepted.</li>
74
+ <li>Comments are <em>not</em> preserved.</li>
75
+ <li>It is still experimental (see the <a href="https://github.com/Constellation/escodegen">escodegen project</a>).</li>
76
+ </ul>
77
+
78
+ <p style="margin-top: 50px;">Using Esprima version <span id="version"></span>.</p>
79
+
80
+ <div class="footer"><strong>Esprima</strong> is created by
81
+ <a href="http://ariya.ofilabs.com/about" target="_blank">Ariya Hidayat</a>. Follow <a href="http://twitter.com/ariyahidayat">@ariyahidayat</a> on Twitter.
82
+ </div>
83
+
84
+ <p id="testbox" style="visibility: hidden;"><textarea id="test"></textarea></p>
85
+ </div>
86
+ <script>
87
+ /*jslint sloppy:true browser:true */
88
+ /*global sourceRewrite:true, CodeMirror:true */
89
+ window.onload = function () {
90
+ var el;
91
+
92
+ el = document.getElementById('version');
93
+ if (typeof el.innerText === 'string') {
94
+ el.innerText = window.esprima.version;
95
+ } else {
96
+ el.textContent = window.esprima.version;
97
+ }
98
+
99
+ document.getElementById('rewrite').onclick = sourceRewrite;
100
+ };
101
+
102
+ try {
103
+ window.checkEnv();
104
+
105
+ // This is just testing, to detect whether CodeMirror would fail or not
106
+ window.editor = CodeMirror.fromTextArea(document.getElementById("test"));
107
+
108
+ window.editor = CodeMirror.fromTextArea(document.getElementById("code"), {
109
+ lineNumbers: true,
110
+ matchBrackets: true
111
+ });
112
+ } catch (e) {
113
+ // CodeMirror failed to initialize, possible in e.g. old IE.
114
+ document.getElementById('codemirror').innerHTML = '';
115
+ } finally {
116
+ document.getElementById('testbox').parentNode.removeChild(document.getElementById('testbox'));
117
+ }
118
+ </script>
119
+ </body>
120
+ </html>
@@ -0,0 +1,71 @@
1
+ /*
2
+ Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright
8
+ notice, this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright
10
+ notice, this list of conditions and the following disclaimer in the
11
+ documentation and/or other materials provided with the distribution.
12
+
13
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
14
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16
+ ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
17
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
18
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
20
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23
+ */
24
+
25
+ /*jslint browser:true evil:true */
26
+
27
+ function sourceRewrite() {
28
+ 'use strict';
29
+
30
+ var code, syntax, indent;
31
+
32
+ function setText(id, str) {
33
+ var el = document.getElementById(id);
34
+ if (typeof el.innerText === 'string') {
35
+ el.innerText = str;
36
+ } else {
37
+ el.textContent = str;
38
+ }
39
+ }
40
+
41
+ setText('error', '');
42
+ if (typeof window.editor !== 'undefined') {
43
+ // Using CodeMirror.
44
+ code = window.editor.getValue();
45
+ } else {
46
+ // Plain textarea, likely in a situation where CodeMirror does not work.
47
+ code = document.getElementById('code').value;
48
+ }
49
+
50
+ indent = '';
51
+ if (document.getElementById('onetab').checked) {
52
+ indent = '\t';
53
+ } else if (document.getElementById('twospaces').checked) {
54
+ indent = ' ';
55
+ } else if (document.getElementById('fourspaces').checked) {
56
+ indent = ' ';
57
+ }
58
+
59
+ try {
60
+ syntax = window.esprima.parse(code, { raw: true });
61
+ code = window.escodegen.generate(syntax, { indent: indent });
62
+ } catch (e) {
63
+ setText('error', e.toString());
64
+ } finally {
65
+ if (typeof window.editor !== 'undefined') {
66
+ window.editor.setValue(code);
67
+ } else {
68
+ document.getElementById('code').value = code;
69
+ }
70
+ }
71
+ }
@@ -0,0 +1,3577 @@
1
+ /*
2
+ Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
3
+ Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>
4
+ Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>
5
+ Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>
6
+ Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>
7
+ Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>
8
+ Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>
9
+
10
+ Redistribution and use in source and binary forms, with or without
11
+ modification, are permitted provided that the following conditions are met:
12
+
13
+ * Redistributions of source code must retain the above copyright
14
+ notice, this list of conditions and the following disclaimer.
15
+ * Redistributions in binary form must reproduce the above copyright
16
+ notice, this list of conditions and the following disclaimer in the
17
+ documentation and/or other materials provided with the distribution.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
+ ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
23
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ */
30
+
31
+ /*jslint bitwise:true plusplus:true */
32
+ /*global esprima:true, exports:true,
33
+ throwError: true, createLiteral: true, generateStatement: true,
34
+ parseAssignmentExpression: true, parseBlock: true, parseExpression: true,
35
+ parseFunctionDeclaration: true, parseFunctionExpression: true,
36
+ parseFunctionSourceElements: true, parseVariableIdentifier: true,
37
+ parseLeftHandSideExpression: true,
38
+ parseStatement: true, parseSourceElement: true */
39
+
40
+ (function (exports) {
41
+ 'use strict';
42
+
43
+ var Token,
44
+ TokenName,
45
+ Syntax,
46
+ PropertyKind,
47
+ Messages,
48
+ Regex,
49
+ source,
50
+ allowIn,
51
+ lastParenthesized,
52
+ strict,
53
+ index,
54
+ lineNumber,
55
+ lineStart,
56
+ length,
57
+ buffer,
58
+ extra,
59
+ labelSet,
60
+ inIteration,
61
+ inSwitch,
62
+ inFunctionBody;
63
+
64
+ Token = {
65
+ BooleanLiteral: 1,
66
+ EOF: 2,
67
+ Identifier: 3,
68
+ Keyword: 4,
69
+ NullLiteral: 5,
70
+ NumericLiteral: 6,
71
+ Punctuator: 7,
72
+ StringLiteral: 8
73
+ };
74
+
75
+ TokenName = {};
76
+ TokenName[Token.BooleanLiteral] = 'Boolean';
77
+ TokenName[Token.EOF] = '<end>';
78
+ TokenName[Token.Identifier] = 'Identifier';
79
+ TokenName[Token.Keyword] = 'Keyword';
80
+ TokenName[Token.NullLiteral] = 'Null';
81
+ TokenName[Token.NumericLiteral] = 'Numeric';
82
+ TokenName[Token.Punctuator] = 'Punctuator';
83
+ TokenName[Token.StringLiteral] = 'String';
84
+
85
+ Syntax = {
86
+ AssignmentExpression: 'AssignmentExpression',
87
+ ArrayExpression: 'ArrayExpression',
88
+ BlockStatement: 'BlockStatement',
89
+ BinaryExpression: 'BinaryExpression',
90
+ BreakStatement: 'BreakStatement',
91
+ CallExpression: 'CallExpression',
92
+ CatchClause: 'CatchClause',
93
+ ConditionalExpression: 'ConditionalExpression',
94
+ ContinueStatement: 'ContinueStatement',
95
+ DoWhileStatement: 'DoWhileStatement',
96
+ DebuggerStatement: 'DebuggerStatement',
97
+ EmptyStatement: 'EmptyStatement',
98
+ ExpressionStatement: 'ExpressionStatement',
99
+ ForStatement: 'ForStatement',
100
+ ForInStatement: 'ForInStatement',
101
+ FunctionDeclaration: 'FunctionDeclaration',
102
+ FunctionExpression: 'FunctionExpression',
103
+ Identifier: 'Identifier',
104
+ IfStatement: 'IfStatement',
105
+ Literal: 'Literal',
106
+ LabeledStatement: 'LabeledStatement',
107
+ LogicalExpression: 'LogicalExpression',
108
+ MemberExpression: 'MemberExpression',
109
+ NewExpression: 'NewExpression',
110
+ ObjectExpression: 'ObjectExpression',
111
+ Program: 'Program',
112
+ Property: 'Property',
113
+ ReturnStatement: 'ReturnStatement',
114
+ SequenceExpression: 'SequenceExpression',
115
+ SwitchStatement: 'SwitchStatement',
116
+ SwitchCase: 'SwitchCase',
117
+ ThisExpression: 'ThisExpression',
118
+ ThrowStatement: 'ThrowStatement',
119
+ TryStatement: 'TryStatement',
120
+ UnaryExpression: 'UnaryExpression',
121
+ UpdateExpression: 'UpdateExpression',
122
+ VariableDeclaration: 'VariableDeclaration',
123
+ VariableDeclarator: 'VariableDeclarator',
124
+ WhileStatement: 'WhileStatement',
125
+ WithStatement: 'WithStatement'
126
+ };
127
+
128
+ PropertyKind = {
129
+ Data: 1,
130
+ Get: 2,
131
+ Set: 4
132
+ };
133
+
134
+ // Error messages should be identical to V8.
135
+ Messages = {
136
+ UnexpectedToken: 'Unexpected token %0',
137
+ UnexpectedNumber: 'Unexpected number',
138
+ UnexpectedString: 'Unexpected string',
139
+ UnexpectedIdentifier: 'Unexpected identifier',
140
+ UnexpectedReserved: 'Unexpected reserved word',
141
+ UnexpectedEOS: 'Unexpected end of input',
142
+ NewlineAfterThrow: 'Illegal newline after throw',
143
+ InvalidRegExp: 'Invalid regular expression',
144
+ UnterminatedRegExp: 'Invalid regular expression: missing /',
145
+ InvalidLHSInAssignment: 'Invalid left-hand side in assignment',
146
+ InvalidLHSInForIn: 'Invalid left-hand side in for-in',
147
+ NoCatchOrFinally: 'Missing catch or finally after try',
148
+ UnknownLabel: 'Undefined label \'%0\'',
149
+ Redeclaration: '%0 \'%1\' has already been declared',
150
+ IllegalContinue: 'Illegal continue statement',
151
+ IllegalBreak: 'Illegal break statement',
152
+ IllegalReturn: 'Illegal return statement',
153
+ StrictModeWith: 'Strict mode code may not include a with statement',
154
+ StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',
155
+ StrictVarName: 'Variable name may not be eval or arguments in strict mode',
156
+ StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',
157
+ StrictParamDupe: 'Strict mode function may not have duplicate parameter names',
158
+ StrictFunctionName: 'Function name may not be eval or arguments in strict mode',
159
+ StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',
160
+ StrictDelete: 'Delete of an unqualified identifier in strict mode.',
161
+ StrictDuplicateProperty: 'Duplicate data property in object literal not allowed in strict mode',
162
+ AccessorDataProperty: 'Object literal may not have data and accessor property with the same name',
163
+ AccessorGetSet: 'Object literal may not have multiple get/set accessors with the same name',
164
+ StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',
165
+ StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',
166
+ StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',
167
+ StrictReservedWord: 'Use of future reserved word in strict mode'
168
+ };
169
+
170
+ // See also tools/generate-unicode-regex.py.
171
+ Regex = {
172
+ NonAsciiIdentifierStart: new RegExp('[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]'),
173
+ NonAsciiIdentifierPart: new RegExp('[\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0300-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u0483-\u0487\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u05d0-\u05ea\u05f0-\u05f2\u0610-\u061a\u0620-\u0669\u066e-\u06d3\u06d5-\u06dc\u06df-\u06e8\u06ea-\u06fc\u06ff\u0710-\u074a\u074d-\u07b1\u07c0-\u07f5\u07fa\u0800-\u082d\u0840-\u085b\u08a0\u08a2-\u08ac\u08e4-\u08fe\u0900-\u0963\u0966-\u096f\u0971-\u0977\u0979-\u097f\u0981-\u0983\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bc-\u09c4\u09c7\u09c8\u09cb-\u09ce\u09d7\u09dc\u09dd\u09df-\u09e3\u09e6-\u09f1\u0a01-\u0a03\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a59-\u0a5c\u0a5e\u0a66-\u0a75\u0a81-\u0a83\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abc-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ad0\u0ae0-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3c-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5c\u0b5d\u0b5f-\u0b63\u0b66-\u0b6f\u0b71\u0b82\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd0\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c58\u0c59\u0c60-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbc-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0cde\u0ce0-\u0ce3\u0ce6-\u0cef\u0cf1\u0cf2\u0d02\u0d03\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d-\u0d44\u0d46-\u0d48\u0d4a-\u0d4e\u0d57\u0d60-\u0d63\u0d66-\u0d6f\u0d7a-\u0d7f\u0d82\u0d83\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb9\u0ebb-\u0ebd\u0ec0-\u0ec4\u0ec6\u0ec8-\u0ecd\u0ed0-\u0ed9\u0edc-\u0edf\u0f00\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e-\u0f47\u0f49-\u0f6c\u0f71-\u0f84\u0f86-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1049\u1050-\u109d\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u135d-\u135f\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176c\u176e-\u1770\u1772\u1773\u1780-\u17d3\u17d7\u17dc\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1820-\u1877\u1880-\u18aa\u18b0-\u18f5\u1900-\u191c\u1920-\u192b\u1930-\u193b\u1946-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u19d0-\u19d9\u1a00-\u1a1b\u1a20-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1aa7\u1b00-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1bf3\u1c00-\u1c37\u1c40-\u1c49\u1c4d-\u1c7d\u1cd0-\u1cd2\u1cd4-\u1cf6\u1d00-\u1de6\u1dfc-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u200c\u200d\u203f\u2040\u2054\u2071\u207f\u2090-\u209c\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d7f-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2de0-\u2dff\u2e2f\u3005-\u3007\u3021-\u302f\u3031-\u3035\u3038-\u303c\u3041-\u3096\u3099\u309a\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua62b\ua640-\ua66f\ua674-\ua67d\ua67f-\ua697\ua69f-\ua6f1\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua827\ua840-\ua873\ua880-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f7\ua8fb\ua900-\ua92d\ua930-\ua953\ua960-\ua97c\ua980-\ua9c0\ua9cf-\ua9d9\uaa00-\uaa36\uaa40-\uaa4d\uaa50-\uaa59\uaa60-\uaa76\uaa7a\uaa7b\uaa80-\uaac2\uaadb-\uaadd\uaae0-\uaaef\uaaf2-\uaaf6\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabea\uabec\uabed\uabf0-\uabf9\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\ufe70-\ufe74\ufe76-\ufefc\uff10-\uff19\uff21-\uff3a\uff3f\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]')
174
+ };
175
+
176
+ // Ensure the condition is true, otherwise throw an error.
177
+ // This is only to have a better contract semantic, i.e. another safety net
178
+ // to catch a logic error. The condition shall be fulfilled in normal case.
179
+ // Do NOT use this to enforce a certain condition on any user input.
180
+
181
+ function assert(condition, message) {
182
+ if (!condition) {
183
+ throw new Error('ASSERT: ' + message);
184
+ }
185
+ }
186
+
187
+ function sliceSource(from, to) {
188
+ return source.slice(from, to);
189
+ }
190
+
191
+ if (typeof 'esprima'[0] === 'undefined') {
192
+ sliceSource = function sliceArraySource(from, to) {
193
+ return source.slice(from, to).join('');
194
+ };
195
+ }
196
+
197
+ function isDecimalDigit(ch) {
198
+ return '0123456789'.indexOf(ch) >= 0;
199
+ }
200
+
201
+ function isHexDigit(ch) {
202
+ return '0123456789abcdefABCDEF'.indexOf(ch) >= 0;
203
+ }
204
+
205
+ function isOctalDigit(ch) {
206
+ return '01234567'.indexOf(ch) >= 0;
207
+ }
208
+
209
+
210
+ // 7.2 White Space
211
+
212
+ function isWhiteSpace(ch) {
213
+ return (ch === ' ') || (ch === '\u0009') || (ch === '\u000B') ||
214
+ (ch === '\u000C') || (ch === '\u00A0') ||
215
+ (ch.charCodeAt(0) >= 0x1680 &&
216
+ '\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\uFEFF'.indexOf(ch) >= 0);
217
+ }
218
+
219
+ // 7.3 Line Terminators
220
+
221
+ function isLineTerminator(ch) {
222
+ return (ch === '\n' || ch === '\r' || ch === '\u2028' || ch === '\u2029');
223
+ }
224
+
225
+ // 7.6 Identifier Names and Identifiers
226
+
227
+ function isIdentifierStart(ch) {
228
+ return (ch === '$') || (ch === '_') || (ch === '\\') ||
229
+ (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
230
+ ((ch.charCodeAt(0) >= 0x80) && Regex.NonAsciiIdentifierStart.test(ch));
231
+ }
232
+
233
+ function isIdentifierPart(ch) {
234
+ return (ch === '$') || (ch === '_') || (ch === '\\') ||
235
+ (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
236
+ ((ch >= '0') && (ch <= '9')) ||
237
+ ((ch.charCodeAt(0) >= 0x80) && Regex.NonAsciiIdentifierPart.test(ch));
238
+ }
239
+
240
+ // 7.6.1.2 Future Reserved Words
241
+
242
+ function isFutureReservedWord(id) {
243
+ switch (id) {
244
+
245
+ // Future reserved words.
246
+ case 'class':
247
+ case 'enum':
248
+ case 'export':
249
+ case 'extends':
250
+ case 'import':
251
+ case 'super':
252
+ return true;
253
+ }
254
+
255
+ return false;
256
+ }
257
+
258
+ function isStrictModeReservedWord(id) {
259
+ switch (id) {
260
+
261
+ // Strict Mode reserved words.
262
+ case 'implements':
263
+ case 'interface':
264
+ case 'package':
265
+ case 'private':
266
+ case 'protected':
267
+ case 'public':
268
+ case 'static':
269
+ case 'yield':
270
+ case 'let':
271
+ return true;
272
+ }
273
+
274
+ return false;
275
+ }
276
+
277
+ function isRestrictedWord(id) {
278
+ return id === 'eval' || id === 'arguments';
279
+ }
280
+
281
+ // 7.6.1.1 Keywords
282
+
283
+ function isKeyword(id) {
284
+ var keyword = false;
285
+ switch (id.length) {
286
+ case 2:
287
+ keyword = (id === 'if') || (id === 'in') || (id === 'do');
288
+ break;
289
+ case 3:
290
+ keyword = (id === 'var') || (id === 'for') || (id === 'new') || (id === 'try');
291
+ break;
292
+ case 4:
293
+ keyword = (id === 'this') || (id === 'else') || (id === 'case') || (id === 'void') || (id === 'with');
294
+ break;
295
+ case 5:
296
+ keyword = (id === 'while') || (id === 'break') || (id === 'catch') || (id === 'throw');
297
+ break;
298
+ case 6:
299
+ keyword = (id === 'return') || (id === 'typeof') || (id === 'delete') || (id === 'switch');
300
+ break;
301
+ case 7:
302
+ keyword = (id === 'default') || (id === 'finally');
303
+ break;
304
+ case 8:
305
+ keyword = (id === 'function') || (id === 'continue') || (id === 'debugger');
306
+ break;
307
+ case 10:
308
+ keyword = (id === 'instanceof');
309
+ break;
310
+ }
311
+
312
+ if (keyword) {
313
+ return true;
314
+ }
315
+
316
+ switch (id) {
317
+ // Future reserved words.
318
+ // 'const' is specialized as Keyword in V8.
319
+ case 'const':
320
+ return true;
321
+
322
+ // For compatiblity to SpiderMonkey and ES.next
323
+ case 'yield':
324
+ case 'let':
325
+ return true;
326
+ }
327
+
328
+ if (strict && isStrictModeReservedWord(id)) {
329
+ return true;
330
+ }
331
+
332
+ return isFutureReservedWord(id);
333
+ }
334
+
335
+ // Return the next character and move forward.
336
+
337
+ function nextChar() {
338
+ return source[index++];
339
+ }
340
+
341
+ // 7.4 Comments
342
+
343
+ function skipComment() {
344
+ var ch, blockComment, lineComment;
345
+
346
+ blockComment = false;
347
+ lineComment = false;
348
+
349
+ while (index < length) {
350
+ ch = source[index];
351
+
352
+ if (lineComment) {
353
+ ch = nextChar();
354
+ if (isLineTerminator(ch)) {
355
+ lineComment = false;
356
+ if (ch === '\r' && source[index] === '\n') {
357
+ ++index;
358
+ }
359
+ ++lineNumber;
360
+ lineStart = index;
361
+ }
362
+ } else if (blockComment) {
363
+ if (isLineTerminator(ch)) {
364
+ if (ch === '\r' && source[index + 1] === '\n') {
365
+ ++index;
366
+ }
367
+ ++lineNumber;
368
+ ++index;
369
+ lineStart = index;
370
+ if (index >= length) {
371
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
372
+ }
373
+ } else {
374
+ ch = nextChar();
375
+ if (index >= length) {
376
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
377
+ }
378
+ if (ch === '*') {
379
+ ch = source[index];
380
+ if (ch === '/') {
381
+ ++index;
382
+ blockComment = false;
383
+ }
384
+ }
385
+ }
386
+ } else if (ch === '/') {
387
+ ch = source[index + 1];
388
+ if (ch === '/') {
389
+ index += 2;
390
+ lineComment = true;
391
+ } else if (ch === '*') {
392
+ index += 2;
393
+ blockComment = true;
394
+ if (index >= length) {
395
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
396
+ }
397
+ } else {
398
+ break;
399
+ }
400
+ } else if (isWhiteSpace(ch)) {
401
+ ++index;
402
+ } else if (isLineTerminator(ch)) {
403
+ ++index;
404
+ if (ch === '\r' && source[index] === '\n') {
405
+ ++index;
406
+ }
407
+ ++lineNumber;
408
+ lineStart = index;
409
+ } else {
410
+ break;
411
+ }
412
+ }
413
+ }
414
+
415
+ function scanHexEscape(prefix) {
416
+ var i, len, ch, code = 0;
417
+
418
+ len = (prefix === 'u') ? 4 : 2;
419
+ for (i = 0; i < len; ++i) {
420
+ if (index < length && isHexDigit(source[index])) {
421
+ ch = nextChar();
422
+ code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase());
423
+ } else {
424
+ return '';
425
+ }
426
+ }
427
+ return String.fromCharCode(code);
428
+ }
429
+
430
+ function scanIdentifier() {
431
+ var ch, start, id, restore;
432
+
433
+ ch = source[index];
434
+ if (!isIdentifierStart(ch)) {
435
+ return;
436
+ }
437
+
438
+ start = index;
439
+ if (ch === '\\') {
440
+ ++index;
441
+ if (source[index] !== 'u') {
442
+ return;
443
+ }
444
+ ++index;
445
+ restore = index;
446
+ ch = scanHexEscape('u');
447
+ if (ch) {
448
+ if (ch === '\\' || !isIdentifierStart(ch)) {
449
+ return;
450
+ }
451
+ id = ch;
452
+ } else {
453
+ index = restore;
454
+ id = 'u';
455
+ }
456
+ } else {
457
+ id = nextChar();
458
+ }
459
+
460
+ while (index < length) {
461
+ ch = source[index];
462
+ if (!isIdentifierPart(ch)) {
463
+ break;
464
+ }
465
+ if (ch === '\\') {
466
+ ++index;
467
+ if (source[index] !== 'u') {
468
+ return;
469
+ }
470
+ ++index;
471
+ restore = index;
472
+ ch = scanHexEscape('u');
473
+ if (ch) {
474
+ if (ch === '\\' || !isIdentifierPart(ch)) {
475
+ return;
476
+ }
477
+ id += ch;
478
+ } else {
479
+ index = restore;
480
+ id += 'u';
481
+ }
482
+ } else {
483
+ id += nextChar();
484
+ }
485
+ }
486
+
487
+ // There is no keyword or literal with only one character.
488
+ // Thus, it must be an identifier.
489
+ if (id.length === 1) {
490
+ return {
491
+ type: Token.Identifier,
492
+ value: id,
493
+ lineNumber: lineNumber,
494
+ lineStart: lineStart,
495
+ range: [start, index]
496
+ };
497
+ }
498
+
499
+ if (isKeyword(id)) {
500
+ return {
501
+ type: Token.Keyword,
502
+ value: id,
503
+ lineNumber: lineNumber,
504
+ lineStart: lineStart,
505
+ range: [start, index]
506
+ };
507
+ }
508
+
509
+ // 7.8.1 Null Literals
510
+
511
+ if (id === 'null') {
512
+ return {
513
+ type: Token.NullLiteral,
514
+ value: id,
515
+ lineNumber: lineNumber,
516
+ lineStart: lineStart,
517
+ range: [start, index]
518
+ };
519
+ }
520
+
521
+ // 7.8.2 Boolean Literals
522
+
523
+ if (id === 'true' || id === 'false') {
524
+ return {
525
+ type: Token.BooleanLiteral,
526
+ value: id,
527
+ lineNumber: lineNumber,
528
+ lineStart: lineStart,
529
+ range: [start, index]
530
+ };
531
+ }
532
+
533
+ return {
534
+ type: Token.Identifier,
535
+ value: id,
536
+ lineNumber: lineNumber,
537
+ lineStart: lineStart,
538
+ range: [start, index]
539
+ };
540
+ }
541
+
542
+ // 7.7 Punctuators
543
+
544
+ function scanPunctuator() {
545
+ var start = index,
546
+ ch1 = source[index],
547
+ ch2,
548
+ ch3,
549
+ ch4;
550
+
551
+ // Check for most common single-character punctuators.
552
+
553
+ if (ch1 === ';' || ch1 === '{' || ch1 === '}') {
554
+ ++index;
555
+ return {
556
+ type: Token.Punctuator,
557
+ value: ch1,
558
+ lineNumber: lineNumber,
559
+ lineStart: lineStart,
560
+ range: [start, index]
561
+ };
562
+ }
563
+
564
+ if (ch1 === ',' || ch1 === '(' || ch1 === ')') {
565
+ ++index;
566
+ return {
567
+ type: Token.Punctuator,
568
+ value: ch1,
569
+ lineNumber: lineNumber,
570
+ lineStart: lineStart,
571
+ range: [start, index]
572
+ };
573
+ }
574
+
575
+ // Dot (.) can also start a floating-point number, hence the need
576
+ // to check the next character.
577
+
578
+ ch2 = source[index + 1];
579
+ if (ch1 === '.' && !isDecimalDigit(ch2)) {
580
+ return {
581
+ type: Token.Punctuator,
582
+ value: nextChar(),
583
+ lineNumber: lineNumber,
584
+ lineStart: lineStart,
585
+ range: [start, index]
586
+ };
587
+ }
588
+
589
+ // Peek more characters.
590
+
591
+ ch3 = source[index + 2];
592
+ ch4 = source[index + 3];
593
+
594
+ // 4-character punctuator: >>>=
595
+
596
+ if (ch1 === '>' && ch2 === '>' && ch3 === '>') {
597
+ if (ch4 === '=') {
598
+ index += 4;
599
+ return {
600
+ type: Token.Punctuator,
601
+ value: '>>>=',
602
+ lineNumber: lineNumber,
603
+ lineStart: lineStart,
604
+ range: [start, index]
605
+ };
606
+ }
607
+ }
608
+
609
+ // 3-character punctuators: === !== >>> <<= >>=
610
+
611
+ if (ch1 === '=' && ch2 === '=' && ch3 === '=') {
612
+ index += 3;
613
+ return {
614
+ type: Token.Punctuator,
615
+ value: '===',
616
+ lineNumber: lineNumber,
617
+ lineStart: lineStart,
618
+ range: [start, index]
619
+ };
620
+ }
621
+
622
+ if (ch1 === '!' && ch2 === '=' && ch3 === '=') {
623
+ index += 3;
624
+ return {
625
+ type: Token.Punctuator,
626
+ value: '!==',
627
+ lineNumber: lineNumber,
628
+ lineStart: lineStart,
629
+ range: [start, index]
630
+ };
631
+ }
632
+
633
+ if (ch1 === '>' && ch2 === '>' && ch3 === '>') {
634
+ index += 3;
635
+ return {
636
+ type: Token.Punctuator,
637
+ value: '>>>',
638
+ lineNumber: lineNumber,
639
+ lineStart: lineStart,
640
+ range: [start, index]
641
+ };
642
+ }
643
+
644
+ if (ch1 === '<' && ch2 === '<' && ch3 === '=') {
645
+ index += 3;
646
+ return {
647
+ type: Token.Punctuator,
648
+ value: '<<=',
649
+ lineNumber: lineNumber,
650
+ lineStart: lineStart,
651
+ range: [start, index]
652
+ };
653
+ }
654
+
655
+ if (ch1 === '>' && ch2 === '>' && ch3 === '=') {
656
+ index += 3;
657
+ return {
658
+ type: Token.Punctuator,
659
+ value: '>>=',
660
+ lineNumber: lineNumber,
661
+ lineStart: lineStart,
662
+ range: [start, index]
663
+ };
664
+ }
665
+
666
+ // 2-character punctuators: <= >= == != ++ -- << >> && ||
667
+ // += -= *= %= &= |= ^= /=
668
+
669
+ if (ch2 === '=') {
670
+ if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {
671
+ index += 2;
672
+ return {
673
+ type: Token.Punctuator,
674
+ value: ch1 + ch2,
675
+ lineNumber: lineNumber,
676
+ lineStart: lineStart,
677
+ range: [start, index]
678
+ };
679
+ }
680
+ }
681
+
682
+ if (ch1 === ch2 && ('+-<>&|'.indexOf(ch1) >= 0)) {
683
+ if ('+-<>&|'.indexOf(ch2) >= 0) {
684
+ index += 2;
685
+ return {
686
+ type: Token.Punctuator,
687
+ value: ch1 + ch2,
688
+ lineNumber: lineNumber,
689
+ lineStart: lineStart,
690
+ range: [start, index]
691
+ };
692
+ }
693
+ }
694
+
695
+ // The remaining 1-character punctuators.
696
+
697
+ if ('[]<>+-*%&|^!~?:=/'.indexOf(ch1) >= 0) {
698
+ return {
699
+ type: Token.Punctuator,
700
+ value: nextChar(),
701
+ lineNumber: lineNumber,
702
+ lineStart: lineStart,
703
+ range: [start, index]
704
+ };
705
+ }
706
+ }
707
+
708
+ // 7.8.3 Numeric Literals
709
+
710
+ function scanNumericLiteral() {
711
+ var number, start, ch;
712
+
713
+ ch = source[index];
714
+ assert(isDecimalDigit(ch) || (ch === '.'),
715
+ 'Numeric literal must start with a decimal digit or a decimal point');
716
+
717
+ start = index;
718
+ number = '';
719
+ if (ch !== '.') {
720
+ number = nextChar();
721
+ ch = source[index];
722
+
723
+ // Hex number starts with '0x'.
724
+ // Octal number starts with '0'.
725
+ if (number === '0') {
726
+ if (ch === 'x' || ch === 'X') {
727
+ number += nextChar();
728
+ while (index < length) {
729
+ ch = source[index];
730
+ if (!isHexDigit(ch)) {
731
+ break;
732
+ }
733
+ number += nextChar();
734
+ }
735
+
736
+ if (number.length <= 2) {
737
+ // only 0x
738
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
739
+ }
740
+
741
+ if (index < length) {
742
+ ch = source[index];
743
+ if (isIdentifierStart(ch)) {
744
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
745
+ }
746
+ }
747
+ return {
748
+ type: Token.NumericLiteral,
749
+ value: parseInt(number, 16),
750
+ lineNumber: lineNumber,
751
+ lineStart: lineStart,
752
+ range: [start, index]
753
+ };
754
+ } else if (isOctalDigit(ch)) {
755
+ number += nextChar();
756
+ while (index < length) {
757
+ ch = source[index];
758
+ if (!isOctalDigit(ch)) {
759
+ break;
760
+ }
761
+ number += nextChar();
762
+ }
763
+
764
+ if (index < length) {
765
+ ch = source[index];
766
+ if (isIdentifierStart(ch) || isDecimalDigit(ch)) {
767
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
768
+ }
769
+ }
770
+ return {
771
+ type: Token.NumericLiteral,
772
+ value: parseInt(number, 8),
773
+ octal: true,
774
+ lineNumber: lineNumber,
775
+ lineStart: lineStart,
776
+ range: [start, index]
777
+ };
778
+ }
779
+
780
+ // decimal number starts with '0' such as '09' is illegal.
781
+ if (isDecimalDigit(ch)) {
782
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
783
+ }
784
+ }
785
+
786
+ while (index < length) {
787
+ ch = source[index];
788
+ if (!isDecimalDigit(ch)) {
789
+ break;
790
+ }
791
+ number += nextChar();
792
+ }
793
+ }
794
+
795
+ if (ch === '.') {
796
+ number += nextChar();
797
+ while (index < length) {
798
+ ch = source[index];
799
+ if (!isDecimalDigit(ch)) {
800
+ break;
801
+ }
802
+ number += nextChar();
803
+ }
804
+ }
805
+
806
+ if (ch === 'e' || ch === 'E') {
807
+ number += nextChar();
808
+
809
+ ch = source[index];
810
+ if (ch === '+' || ch === '-') {
811
+ number += nextChar();
812
+ }
813
+
814
+ ch = source[index];
815
+ if (isDecimalDigit(ch)) {
816
+ number += nextChar();
817
+ while (index < length) {
818
+ ch = source[index];
819
+ if (!isDecimalDigit(ch)) {
820
+ break;
821
+ }
822
+ number += nextChar();
823
+ }
824
+ } else {
825
+ ch = 'character ' + ch;
826
+ if (index >= length) {
827
+ ch = '<end>';
828
+ }
829
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
830
+ }
831
+ }
832
+
833
+ if (index < length) {
834
+ ch = source[index];
835
+ if (isIdentifierStart(ch)) {
836
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
837
+ }
838
+ }
839
+
840
+ return {
841
+ type: Token.NumericLiteral,
842
+ value: parseFloat(number),
843
+ lineNumber: lineNumber,
844
+ lineStart: lineStart,
845
+ range: [start, index]
846
+ };
847
+ }
848
+
849
+ // 7.8.4 String Literals
850
+
851
+ function scanStringLiteral() {
852
+ var str = '', quote, start, ch, code, unescaped, restore, octal = false;
853
+
854
+ quote = source[index];
855
+ assert((quote === '\'' || quote === '"'),
856
+ 'String literal must starts with a quote');
857
+
858
+ start = index;
859
+ ++index;
860
+
861
+ while (index < length) {
862
+ ch = nextChar();
863
+
864
+ if (ch === quote) {
865
+ quote = '';
866
+ break;
867
+ } else if (ch === '\\') {
868
+ ch = nextChar();
869
+ if (!isLineTerminator(ch)) {
870
+ switch (ch) {
871
+ case 'n':
872
+ str += '\n';
873
+ break;
874
+ case 'r':
875
+ str += '\r';
876
+ break;
877
+ case 't':
878
+ str += '\t';
879
+ break;
880
+ case 'u':
881
+ case 'x':
882
+ restore = index;
883
+ unescaped = scanHexEscape(ch);
884
+ if (unescaped) {
885
+ str += unescaped;
886
+ } else {
887
+ index = restore;
888
+ str += ch;
889
+ }
890
+ break;
891
+ case 'b':
892
+ str += '\b';
893
+ break;
894
+ case 'f':
895
+ str += '\f';
896
+ break;
897
+ case 'v':
898
+ str += '\v';
899
+ break;
900
+
901
+ default:
902
+ if (isOctalDigit(ch)) {
903
+ code = '01234567'.indexOf(ch);
904
+
905
+ // \0 is not octal escape sequence
906
+ if (code !== 0) {
907
+ octal = true;
908
+ }
909
+
910
+ if (index < length && isOctalDigit(source[index])) {
911
+ octal = true;
912
+ code = code * 8 + '01234567'.indexOf(nextChar());
913
+
914
+ // 3 digits are only allowed when string starts
915
+ // with 0, 1, 2, 3
916
+ if ('0123'.indexOf(ch) >= 0 &&
917
+ index < length &&
918
+ isOctalDigit(source[index])) {
919
+ code = code * 8 + '01234567'.indexOf(nextChar());
920
+ }
921
+ }
922
+ str += String.fromCharCode(code);
923
+ } else {
924
+ str += ch;
925
+ }
926
+ break;
927
+ }
928
+ } else {
929
+ ++lineNumber;
930
+ if (ch === '\r' && source[index] === '\n') {
931
+ ++index;
932
+ }
933
+ }
934
+ } else if (isLineTerminator(ch)) {
935
+ break;
936
+ } else {
937
+ str += ch;
938
+ }
939
+ }
940
+
941
+ if (quote !== '') {
942
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
943
+ }
944
+
945
+ return {
946
+ type: Token.StringLiteral,
947
+ value: str,
948
+ octal: octal,
949
+ lineNumber: lineNumber,
950
+ lineStart: lineStart,
951
+ range: [start, index]
952
+ };
953
+ }
954
+
955
+ function scanRegExp() {
956
+ var str = '', ch, start, pattern, flags, value, classMarker = false, restore;
957
+
958
+ buffer = null;
959
+ skipComment();
960
+
961
+ start = index;
962
+ ch = source[index];
963
+ assert(ch === '/', 'Regular expression literal must start with a slash');
964
+ str = nextChar();
965
+
966
+ while (index < length) {
967
+ ch = nextChar();
968
+ str += ch;
969
+ if (classMarker) {
970
+ if (ch === ']') {
971
+ classMarker = false;
972
+ }
973
+ } else {
974
+ if (ch === '\\') {
975
+ str += nextChar();
976
+ }
977
+ if (ch === '/') {
978
+ break;
979
+ }
980
+ if (ch === '[') {
981
+ classMarker = true;
982
+ }
983
+ if (isLineTerminator(ch)) {
984
+ throwError({}, Messages.UnterminatedRegExp);
985
+ }
986
+ }
987
+ }
988
+
989
+ if (str.length === 1) {
990
+ throwError({}, Messages.UnterminatedRegExp);
991
+ }
992
+
993
+ // Exclude leading and trailing slash.
994
+ pattern = str.substr(1, str.length - 2);
995
+
996
+ flags = '';
997
+ while (index < length) {
998
+ ch = source[index];
999
+ if (!isIdentifierPart(ch)) {
1000
+ break;
1001
+ }
1002
+
1003
+ ++index;
1004
+ if (ch === '\\' && index < length) {
1005
+ ch = source[index];
1006
+ if (ch === 'u') {
1007
+ ++index;
1008
+ restore = index;
1009
+ ch = scanHexEscape('u');
1010
+ if (ch) {
1011
+ flags += ch;
1012
+ str += '\\u';
1013
+ for (; restore < index; ++restore) {
1014
+ str += source[restore];
1015
+ }
1016
+ } else {
1017
+ index = restore;
1018
+ flags += 'u';
1019
+ str += '\\u';
1020
+ }
1021
+ } else {
1022
+ str += '\\';
1023
+ }
1024
+ } else {
1025
+ flags += ch;
1026
+ str += ch;
1027
+ }
1028
+ }
1029
+
1030
+ try {
1031
+ value = new RegExp(pattern, flags);
1032
+ } catch (e) {
1033
+ throwError({}, Messages.InvalidRegExp);
1034
+ }
1035
+
1036
+ return {
1037
+ literal: str,
1038
+ value: value,
1039
+ range: [start, index]
1040
+ };
1041
+ }
1042
+
1043
+ function isIdentifierName(token) {
1044
+ return token.type === Token.Identifier ||
1045
+ token.type === Token.Keyword ||
1046
+ token.type === Token.BooleanLiteral ||
1047
+ token.type === Token.NullLiteral;
1048
+ }
1049
+
1050
+ function advance() {
1051
+ var ch, token;
1052
+
1053
+ skipComment();
1054
+
1055
+ if (index >= length) {
1056
+ return {
1057
+ type: Token.EOF,
1058
+ lineNumber: lineNumber,
1059
+ lineStart: lineStart,
1060
+ range: [index, index]
1061
+ };
1062
+ }
1063
+
1064
+ token = scanPunctuator();
1065
+ if (typeof token !== 'undefined') {
1066
+ return token;
1067
+ }
1068
+
1069
+ ch = source[index];
1070
+
1071
+ if (ch === '\'' || ch === '"') {
1072
+ return scanStringLiteral();
1073
+ }
1074
+
1075
+ if (ch === '.' || isDecimalDigit(ch)) {
1076
+ return scanNumericLiteral();
1077
+ }
1078
+
1079
+ token = scanIdentifier();
1080
+ if (typeof token !== 'undefined') {
1081
+ return token;
1082
+ }
1083
+
1084
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
1085
+ }
1086
+
1087
+ function lex() {
1088
+ var token;
1089
+
1090
+ if (buffer) {
1091
+ index = buffer.range[1];
1092
+ lineNumber = buffer.lineNumber;
1093
+ lineStart = buffer.lineStart;
1094
+ token = buffer;
1095
+ buffer = null;
1096
+ return token;
1097
+ }
1098
+
1099
+ buffer = null;
1100
+ return advance();
1101
+ }
1102
+
1103
+ function lookahead() {
1104
+ var pos, line, start;
1105
+
1106
+ if (buffer !== null) {
1107
+ return buffer;
1108
+ }
1109
+
1110
+ pos = index;
1111
+ line = lineNumber;
1112
+ start = lineStart;
1113
+ buffer = advance();
1114
+ index = pos;
1115
+ lineNumber = line;
1116
+ lineStart = start;
1117
+
1118
+ return buffer;
1119
+ }
1120
+
1121
+ // Return true if there is a line terminator before the next token.
1122
+
1123
+ function peekLineTerminator() {
1124
+ var pos, line, start, found;
1125
+
1126
+ pos = index;
1127
+ line = lineNumber;
1128
+ start = lineStart;
1129
+ skipComment();
1130
+ found = lineNumber !== line;
1131
+ index = pos;
1132
+ lineNumber = line;
1133
+ lineStart = start;
1134
+
1135
+ return found;
1136
+ }
1137
+
1138
+ // Throw an exception
1139
+
1140
+ function throwError(token, messageFormat) {
1141
+ var error,
1142
+ args = Array.prototype.slice.call(arguments, 2),
1143
+ msg = messageFormat.replace(
1144
+ /%(\d)/g,
1145
+ function (whole, index) {
1146
+ return args[index] || '';
1147
+ }
1148
+ );
1149
+
1150
+ if (typeof token.lineNumber === 'number') {
1151
+ error = new Error('Line ' + token.lineNumber + ': ' + msg);
1152
+ error.index = token.range[0];
1153
+ error.lineNumber = token.lineNumber;
1154
+ error.column = token.range[0] - lineStart + 1;
1155
+ } else {
1156
+ error = new Error('Line ' + lineNumber + ': ' + msg);
1157
+ error.index = index;
1158
+ error.lineNumber = lineNumber;
1159
+ error.column = index - lineStart + 1;
1160
+ }
1161
+
1162
+ throw error;
1163
+ }
1164
+
1165
+ function throwErrorTolerant() {
1166
+ var error;
1167
+ try {
1168
+ throwError.apply(null, arguments);
1169
+ } catch (e) {
1170
+ if (extra.errors) {
1171
+ extra.errors.push(e);
1172
+ } else {
1173
+ throw e;
1174
+ }
1175
+ }
1176
+ }
1177
+
1178
+
1179
+ // Throw an exception because of the token.
1180
+
1181
+ function throwUnexpected(token) {
1182
+ var s;
1183
+
1184
+ if (token.type === Token.EOF) {
1185
+ throwError(token, Messages.UnexpectedEOS);
1186
+ }
1187
+
1188
+ if (token.type === Token.NumericLiteral) {
1189
+ throwError(token, Messages.UnexpectedNumber);
1190
+ }
1191
+
1192
+ if (token.type === Token.StringLiteral) {
1193
+ throwError(token, Messages.UnexpectedString);
1194
+ }
1195
+
1196
+ if (token.type === Token.Identifier) {
1197
+ throwError(token, Messages.UnexpectedIdentifier);
1198
+ }
1199
+
1200
+ if (token.type === Token.Keyword) {
1201
+ if (isFutureReservedWord(token.value)) {
1202
+ throwError(token, Messages.UnexpectedReserved);
1203
+ } else if (strict && isStrictModeReservedWord(token.value)) {
1204
+ throwError(token, Messages.StrictReservedWord);
1205
+ }
1206
+ throwError(token, Messages.UnexpectedToken, token.value);
1207
+ }
1208
+
1209
+ // BooleanLiteral, NullLiteral, or Punctuator.
1210
+ throwError(token, Messages.UnexpectedToken, token.value);
1211
+ }
1212
+
1213
+ // Expect the next token to match the specified punctuator.
1214
+ // If not, an exception will be thrown.
1215
+
1216
+ function expect(value) {
1217
+ var token = lex();
1218
+ if (token.type !== Token.Punctuator || token.value !== value) {
1219
+ throwUnexpected(token);
1220
+ }
1221
+ }
1222
+
1223
+ // Expect the next token to match the specified keyword.
1224
+ // If not, an exception will be thrown.
1225
+
1226
+ function expectKeyword(keyword) {
1227
+ var token = lex();
1228
+ if (token.type !== Token.Keyword || token.value !== keyword) {
1229
+ throwUnexpected(token);
1230
+ }
1231
+ }
1232
+
1233
+ // Return true if the next token matches the specified punctuator.
1234
+
1235
+ function match(value) {
1236
+ var token = lookahead();
1237
+ return token.type === Token.Punctuator && token.value === value;
1238
+ }
1239
+
1240
+ // Return true if the next token matches the specified keyword
1241
+
1242
+ function matchKeyword(keyword) {
1243
+ var token = lookahead();
1244
+ return token.type === Token.Keyword && token.value === keyword;
1245
+ }
1246
+
1247
+ // Return true if the next token is an assignment operator
1248
+
1249
+ function matchAssign() {
1250
+ var token = lookahead(),
1251
+ op = token.value;
1252
+
1253
+ if (token.type !== Token.Punctuator) {
1254
+ return false;
1255
+ }
1256
+ return op === '=' ||
1257
+ op === '*=' ||
1258
+ op === '/=' ||
1259
+ op === '%=' ||
1260
+ op === '+=' ||
1261
+ op === '-=' ||
1262
+ op === '<<=' ||
1263
+ op === '>>=' ||
1264
+ op === '>>>=' ||
1265
+ op === '&=' ||
1266
+ op === '^=' ||
1267
+ op === '|=';
1268
+ }
1269
+
1270
+ function consumeSemicolon() {
1271
+ var token, line;
1272
+
1273
+ // Catch the very common case first.
1274
+ if (source[index] === ';') {
1275
+ lex();
1276
+ return;
1277
+ }
1278
+
1279
+ line = lineNumber;
1280
+ skipComment();
1281
+ if (lineNumber !== line) {
1282
+ return;
1283
+ }
1284
+
1285
+ if (match(';')) {
1286
+ lex();
1287
+ return;
1288
+ }
1289
+
1290
+ token = lookahead();
1291
+ if (token.type !== Token.EOF && !match('}')) {
1292
+ throwUnexpected(token);
1293
+ }
1294
+ return;
1295
+ }
1296
+
1297
+ // Return true if provided expression is LeftHandSideExpression
1298
+
1299
+ function isLeftHandSide(expr) {
1300
+ switch (expr.type) {
1301
+ case 'AssignmentExpression':
1302
+ case 'BinaryExpression':
1303
+ case 'ConditionalExpression':
1304
+ case 'LogicalExpression':
1305
+ case 'SequenceExpression':
1306
+ case 'UnaryExpression':
1307
+ case 'UpdateExpression':
1308
+ return false;
1309
+ }
1310
+ return true;
1311
+ }
1312
+
1313
+ // 11.1.4 Array Initialiser
1314
+
1315
+ function parseArrayInitialiser() {
1316
+ var elements = [],
1317
+ undef;
1318
+
1319
+ expect('[');
1320
+
1321
+ while (!match(']')) {
1322
+ if (match(',')) {
1323
+ lex();
1324
+ elements.push(undef);
1325
+ } else {
1326
+ elements.push(parseAssignmentExpression());
1327
+
1328
+ if (!match(']')) {
1329
+ expect(',');
1330
+ }
1331
+ }
1332
+ }
1333
+
1334
+ expect(']');
1335
+
1336
+ return {
1337
+ type: Syntax.ArrayExpression,
1338
+ elements: elements
1339
+ };
1340
+ }
1341
+
1342
+ // 11.1.5 Object Initialiser
1343
+
1344
+ function parsePropertyFunction(param, first) {
1345
+ var previousStrict, body;
1346
+
1347
+ previousStrict = strict;
1348
+ body = parseFunctionSourceElements();
1349
+ if (first && strict && isRestrictedWord(param[0].name)) {
1350
+ throwError(first, Messages.StrictParamName);
1351
+ }
1352
+ strict = previousStrict;
1353
+
1354
+ return {
1355
+ type: Syntax.FunctionExpression,
1356
+ id: null,
1357
+ params: param,
1358
+ body: body
1359
+ };
1360
+ }
1361
+
1362
+ function parseObjectPropertyKey() {
1363
+ var token = lex(),
1364
+ key;
1365
+
1366
+ switch (token.type) {
1367
+
1368
+ case Token.StringLiteral:
1369
+ case Token.NumericLiteral:
1370
+ if (strict && token.octal) {
1371
+ throwError(token, Messages.StrictOctalLiteral);
1372
+ }
1373
+ key = createLiteral(token);
1374
+ break;
1375
+
1376
+ case Token.Identifier:
1377
+ case Token.Keyword:
1378
+ case Token.BooleanLiteral:
1379
+ case Token.NullLiteral:
1380
+ key = {
1381
+ type: Syntax.Identifier,
1382
+ name: token.value
1383
+ };
1384
+ break;
1385
+
1386
+ default:
1387
+ // Unreachable, since parseObjectProperty() will not call this
1388
+ // function with any other type of token.
1389
+ }
1390
+
1391
+ return key;
1392
+ }
1393
+
1394
+ function parseObjectProperty() {
1395
+ var token, property, key, id, param;
1396
+
1397
+ token = lookahead();
1398
+
1399
+ switch (token.type) {
1400
+
1401
+ case Token.Identifier:
1402
+ id = parseObjectPropertyKey();
1403
+
1404
+ // Property Assignment: Getter and Setter.
1405
+
1406
+ if (token.value === 'get' && !match(':')) {
1407
+ key = parseObjectPropertyKey();
1408
+ expect('(');
1409
+ expect(')');
1410
+ property = {
1411
+ type: Syntax.Property,
1412
+ key: key,
1413
+ value: parsePropertyFunction([]),
1414
+ kind: 'get'
1415
+ };
1416
+ } else if (token.value === 'set' && !match(':')) {
1417
+ key = parseObjectPropertyKey();
1418
+ expect('(');
1419
+ token = lookahead();
1420
+ if (token.type !== Token.Identifier) {
1421
+ throwUnexpected(lex());
1422
+ }
1423
+ param = [ parseVariableIdentifier() ];
1424
+ expect(')');
1425
+ property = {
1426
+ type: Syntax.Property,
1427
+ key: key,
1428
+ value: parsePropertyFunction(param, token),
1429
+ kind: 'set'
1430
+ };
1431
+ } else {
1432
+ expect(':');
1433
+ property = {
1434
+ type: Syntax.Property,
1435
+ key: id,
1436
+ value: parseAssignmentExpression(),
1437
+ kind: 'init'
1438
+ };
1439
+ }
1440
+ break;
1441
+
1442
+ case Token.Keyword:
1443
+ case Token.BooleanLiteral:
1444
+ case Token.NullLiteral:
1445
+ case Token.StringLiteral:
1446
+ case Token.NumericLiteral:
1447
+ key = parseObjectPropertyKey();
1448
+ expect(':');
1449
+ property = {
1450
+ type: Syntax.Property,
1451
+ key: key,
1452
+ value: parseAssignmentExpression(),
1453
+ kind: 'init'
1454
+ };
1455
+ break;
1456
+
1457
+ default:
1458
+ throwUnexpected(token);
1459
+ }
1460
+
1461
+ return property;
1462
+ }
1463
+
1464
+ function parseObjectInitialiser() {
1465
+ var token, properties = [], property, name, kind, map = {}, toString = String;
1466
+
1467
+ expect('{');
1468
+
1469
+ while (!match('}')) {
1470
+ property = parseObjectProperty();
1471
+
1472
+ if (property.key.type === Syntax.Identifier) {
1473
+ name = property.key.name;
1474
+ } else {
1475
+ name = toString(property.key.value);
1476
+ }
1477
+ kind = (property.kind === 'init') ? PropertyKind.Data : (property.kind === 'get') ? PropertyKind.Get : PropertyKind.Set;
1478
+ if (Object.prototype.hasOwnProperty.call(map, name)) {
1479
+ if (map[name] === PropertyKind.Data) {
1480
+ if (strict && kind === PropertyKind.Data) {
1481
+ throwError({}, Messages.StrictDuplicateProperty);
1482
+ } else if (kind !== PropertyKind.Data) {
1483
+ throwError({}, Messages.AccessorDataProperty);
1484
+ }
1485
+ } else {
1486
+ if (kind === PropertyKind.Data) {
1487
+ throwError({}, Messages.AccessorDataProperty);
1488
+ } else if (map[name] & kind) {
1489
+ throwError({}, Messages.AccessorGetSet);
1490
+ }
1491
+ }
1492
+ map[name] |= kind;
1493
+ } else {
1494
+ map[name] = kind;
1495
+ }
1496
+
1497
+ properties.push(property);
1498
+
1499
+ if (!match('}')) {
1500
+ expect(',');
1501
+ }
1502
+ }
1503
+
1504
+ expect('}');
1505
+
1506
+ return {
1507
+ type: Syntax.ObjectExpression,
1508
+ properties: properties
1509
+ };
1510
+ }
1511
+
1512
+ // 11.1 Primary Expressions
1513
+
1514
+ function parsePrimaryExpression() {
1515
+ var expr,
1516
+ token = lookahead(),
1517
+ type = token.type;
1518
+
1519
+ if (type === Token.Identifier) {
1520
+ return {
1521
+ type: Syntax.Identifier,
1522
+ name: lex().value
1523
+ };
1524
+ }
1525
+
1526
+ if (type === Token.StringLiteral || type === Token.NumericLiteral) {
1527
+ if (strict && token.octal) {
1528
+ throwError(token, Messages.StrictOctalLiteral);
1529
+ }
1530
+ return createLiteral(lex());
1531
+ }
1532
+
1533
+ if (type === Token.Keyword) {
1534
+ if (matchKeyword('this')) {
1535
+ lex();
1536
+ return {
1537
+ type: Syntax.ThisExpression
1538
+ };
1539
+ }
1540
+
1541
+ if (matchKeyword('function')) {
1542
+ return parseFunctionExpression();
1543
+ }
1544
+ }
1545
+
1546
+ if (type === Token.BooleanLiteral) {
1547
+ lex();
1548
+ token.value = (token.value === 'true');
1549
+ return createLiteral(token);
1550
+ }
1551
+
1552
+ if (type === Token.NullLiteral) {
1553
+ lex();
1554
+ token.value = null;
1555
+ return createLiteral(token);
1556
+ }
1557
+
1558
+ if (match('[')) {
1559
+ return parseArrayInitialiser();
1560
+ }
1561
+
1562
+ if (match('{')) {
1563
+ return parseObjectInitialiser();
1564
+ }
1565
+
1566
+ if (match('(')) {
1567
+ lex();
1568
+ lastParenthesized = expr = parseExpression();
1569
+ expect(')');
1570
+ return expr;
1571
+ }
1572
+
1573
+ if (match('/') || match('/=')) {
1574
+ return createLiteral(scanRegExp());
1575
+ }
1576
+
1577
+ return throwUnexpected(lex());
1578
+ }
1579
+
1580
+ // 11.2 Left-Hand-Side Expressions
1581
+
1582
+ function parseArguments() {
1583
+ var args = [];
1584
+
1585
+ expect('(');
1586
+
1587
+ if (!match(')')) {
1588
+ while (index < length) {
1589
+ args.push(parseAssignmentExpression());
1590
+ if (match(')')) {
1591
+ break;
1592
+ }
1593
+ expect(',');
1594
+ }
1595
+ }
1596
+
1597
+ expect(')');
1598
+
1599
+ return args;
1600
+ }
1601
+
1602
+ function parseNonComputedProperty() {
1603
+ var token = lex();
1604
+
1605
+ if (!isIdentifierName(token)) {
1606
+ throwUnexpected(token);
1607
+ }
1608
+
1609
+ return {
1610
+ type: Syntax.Identifier,
1611
+ name: token.value
1612
+ };
1613
+ }
1614
+
1615
+ function parseNonComputedMember(object) {
1616
+ return {
1617
+ type: Syntax.MemberExpression,
1618
+ computed: false,
1619
+ object: object,
1620
+ property: parseNonComputedProperty()
1621
+ };
1622
+ }
1623
+
1624
+ function parseComputedMember(object) {
1625
+ var property, expr;
1626
+
1627
+ expect('[');
1628
+ property = parseExpression();
1629
+ expr = {
1630
+ type: Syntax.MemberExpression,
1631
+ computed: true,
1632
+ object: object,
1633
+ property: property
1634
+ };
1635
+ expect(']');
1636
+ return expr;
1637
+ }
1638
+
1639
+ function parseCallMember(object) {
1640
+ return {
1641
+ type: Syntax.CallExpression,
1642
+ callee: object,
1643
+ 'arguments': parseArguments()
1644
+ };
1645
+ }
1646
+
1647
+ function parseNewExpression() {
1648
+ var expr;
1649
+
1650
+ expectKeyword('new');
1651
+
1652
+ expr = {
1653
+ type: Syntax.NewExpression,
1654
+ callee: parseLeftHandSideExpression(),
1655
+ 'arguments': []
1656
+ };
1657
+
1658
+ if (match('(')) {
1659
+ expr['arguments'] = parseArguments();
1660
+ }
1661
+
1662
+ return expr;
1663
+ }
1664
+
1665
+ function parseLeftHandSideExpressionAllowCall() {
1666
+ var useNew, expr;
1667
+
1668
+ useNew = matchKeyword('new');
1669
+ expr = useNew ? parseNewExpression() : parsePrimaryExpression();
1670
+
1671
+ while (index < length) {
1672
+ if (match('.')) {
1673
+ lex();
1674
+ expr = parseNonComputedMember(expr);
1675
+ } else if (match('[')) {
1676
+ expr = parseComputedMember(expr);
1677
+ } else if (match('(')) {
1678
+ expr = parseCallMember(expr);
1679
+ } else {
1680
+ break;
1681
+ }
1682
+ }
1683
+
1684
+ return expr;
1685
+ }
1686
+
1687
+ function parseLeftHandSideExpression() {
1688
+ var useNew, expr;
1689
+
1690
+ useNew = matchKeyword('new');
1691
+ expr = useNew ? parseNewExpression() : parsePrimaryExpression();
1692
+
1693
+ while (index < length) {
1694
+ if (match('.')) {
1695
+ lex();
1696
+ expr = parseNonComputedMember(expr);
1697
+ } else if (match('[')) {
1698
+ expr = parseComputedMember(expr);
1699
+ } else {
1700
+ break;
1701
+ }
1702
+ }
1703
+
1704
+ return expr;
1705
+ }
1706
+
1707
+ // 11.3 Postfix Expressions
1708
+
1709
+ function parsePostfixExpression() {
1710
+ var expr = parseLeftHandSideExpressionAllowCall();
1711
+
1712
+ if ((match('++') || match('--')) && !peekLineTerminator()) {
1713
+ // 11.3.1, 11.3.2
1714
+ if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {
1715
+ throwError({}, Messages.StrictLHSPostfix);
1716
+ }
1717
+ expr = {
1718
+ type: Syntax.UpdateExpression,
1719
+ operator: lex().value,
1720
+ argument: expr,
1721
+ prefix: false
1722
+ };
1723
+ }
1724
+
1725
+ return expr;
1726
+ }
1727
+
1728
+ // 11.4 Unary Operators
1729
+
1730
+ function parseUnaryExpression() {
1731
+ var token, expr;
1732
+
1733
+ if (match('++') || match('--')) {
1734
+ token = lex();
1735
+ expr = parseUnaryExpression();
1736
+ // 11.4.4, 11.4.5
1737
+ if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {
1738
+ throwError({}, Messages.StrictLHSPrefix);
1739
+ }
1740
+ expr = {
1741
+ type: Syntax.UpdateExpression,
1742
+ operator: token.value,
1743
+ argument: expr,
1744
+ prefix: true
1745
+ };
1746
+ return expr;
1747
+ }
1748
+
1749
+ if (match('+') || match('-') || match('~') || match('!')) {
1750
+ expr = {
1751
+ type: Syntax.UnaryExpression,
1752
+ operator: lex().value,
1753
+ argument: parseUnaryExpression()
1754
+ };
1755
+ return expr;
1756
+ }
1757
+
1758
+ if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {
1759
+ expr = {
1760
+ type: Syntax.UnaryExpression,
1761
+ operator: lex().value,
1762
+ argument: parseUnaryExpression()
1763
+ };
1764
+ if (strict && expr.operator === 'delete' && expr.argument.type === Syntax.Identifier) {
1765
+ throwError({}, Messages.StrictDelete);
1766
+ }
1767
+ return expr;
1768
+ }
1769
+
1770
+ return parsePostfixExpression();
1771
+ }
1772
+
1773
+ // 11.5 Multiplicative Operators
1774
+
1775
+ function parseMultiplicativeExpression() {
1776
+ var expr = parseUnaryExpression();
1777
+
1778
+ while (match('*') || match('/') || match('%')) {
1779
+ expr = {
1780
+ type: Syntax.BinaryExpression,
1781
+ operator: lex().value,
1782
+ left: expr,
1783
+ right: parseUnaryExpression()
1784
+ };
1785
+ }
1786
+
1787
+ return expr;
1788
+ }
1789
+
1790
+ // 11.6 Additive Operators
1791
+
1792
+ function parseAdditiveExpression() {
1793
+ var expr = parseMultiplicativeExpression();
1794
+
1795
+ while (match('+') || match('-')) {
1796
+ expr = {
1797
+ type: Syntax.BinaryExpression,
1798
+ operator: lex().value,
1799
+ left: expr,
1800
+ right: parseMultiplicativeExpression()
1801
+ };
1802
+ }
1803
+
1804
+ return expr;
1805
+ }
1806
+
1807
+ // 11.7 Bitwise Shift Operators
1808
+
1809
+ function parseShiftExpression() {
1810
+ var expr = parseAdditiveExpression();
1811
+
1812
+ while (match('<<') || match('>>') || match('>>>')) {
1813
+ expr = {
1814
+ type: Syntax.BinaryExpression,
1815
+ operator: lex().value,
1816
+ left: expr,
1817
+ right: parseAdditiveExpression()
1818
+ };
1819
+ }
1820
+
1821
+ return expr;
1822
+ }
1823
+ // 11.8 Relational Operators
1824
+
1825
+ function parseRelationalExpression() {
1826
+ var expr, previousAllowIn;
1827
+
1828
+ previousAllowIn = allowIn;
1829
+ allowIn = true;
1830
+ expr = parseShiftExpression();
1831
+ allowIn = previousAllowIn;
1832
+
1833
+ if (match('<') || match('>') || match('<=') || match('>=')) {
1834
+ expr = {
1835
+ type: Syntax.BinaryExpression,
1836
+ operator: lex().value,
1837
+ left: expr,
1838
+ right: parseRelationalExpression()
1839
+ };
1840
+ } else if (allowIn && matchKeyword('in')) {
1841
+ lex();
1842
+ expr = {
1843
+ type: Syntax.BinaryExpression,
1844
+ operator: 'in',
1845
+ left: expr,
1846
+ right: parseRelationalExpression()
1847
+ };
1848
+ } else if (matchKeyword('instanceof')) {
1849
+ lex();
1850
+ expr = {
1851
+ type: Syntax.BinaryExpression,
1852
+ operator: 'instanceof',
1853
+ left: expr,
1854
+ right: parseRelationalExpression()
1855
+ };
1856
+ }
1857
+
1858
+ return expr;
1859
+ }
1860
+
1861
+ // 11.9 Equality Operators
1862
+
1863
+ function parseEqualityExpression() {
1864
+ var expr = parseRelationalExpression();
1865
+
1866
+ while (match('==') || match('!=') || match('===') || match('!==')) {
1867
+ expr = {
1868
+ type: Syntax.BinaryExpression,
1869
+ operator: lex().value,
1870
+ left: expr,
1871
+ right: parseRelationalExpression()
1872
+ };
1873
+ }
1874
+
1875
+ return expr;
1876
+ }
1877
+
1878
+ // 11.10 Binary Bitwise Operators
1879
+
1880
+ function parseBitwiseANDExpression() {
1881
+ var expr = parseEqualityExpression();
1882
+
1883
+ while (match('&')) {
1884
+ lex();
1885
+ expr = {
1886
+ type: Syntax.BinaryExpression,
1887
+ operator: '&',
1888
+ left: expr,
1889
+ right: parseEqualityExpression()
1890
+ };
1891
+ }
1892
+
1893
+ return expr;
1894
+ }
1895
+
1896
+ function parseBitwiseORExpression() {
1897
+ var expr = parseBitwiseANDExpression();
1898
+
1899
+ while (match('|')) {
1900
+ lex();
1901
+ expr = {
1902
+ type: Syntax.BinaryExpression,
1903
+ operator: '|',
1904
+ left: expr,
1905
+ right: parseBitwiseANDExpression()
1906
+ };
1907
+ }
1908
+
1909
+ return expr;
1910
+ }
1911
+
1912
+ function parseBitwiseXORExpression() {
1913
+ var expr = parseBitwiseORExpression();
1914
+
1915
+ while (match('^')) {
1916
+ lex();
1917
+ expr = {
1918
+ type: Syntax.BinaryExpression,
1919
+ operator: '^',
1920
+ left: expr,
1921
+ right: parseBitwiseORExpression()
1922
+ };
1923
+ }
1924
+
1925
+ return expr;
1926
+ }
1927
+
1928
+ // 11.11 Binary Logical Operators
1929
+
1930
+ function parseLogicalANDExpression() {
1931
+ var expr = parseBitwiseXORExpression();
1932
+
1933
+ while (match('&&')) {
1934
+ lex();
1935
+ expr = {
1936
+ type: Syntax.LogicalExpression,
1937
+ operator: '&&',
1938
+ left: expr,
1939
+ right: parseBitwiseXORExpression()
1940
+ };
1941
+ }
1942
+
1943
+ return expr;
1944
+ }
1945
+
1946
+ function parseLogicalORExpression() {
1947
+ var expr = parseLogicalANDExpression();
1948
+
1949
+ while (match('||')) {
1950
+ lex();
1951
+ expr = {
1952
+ type: Syntax.LogicalExpression,
1953
+ operator: '||',
1954
+ left: expr,
1955
+ right: parseLogicalANDExpression()
1956
+ };
1957
+ }
1958
+
1959
+ return expr;
1960
+ }
1961
+
1962
+ // 11.12 Conditional Operator
1963
+
1964
+ function parseConditionalExpression() {
1965
+ var expr, previousAllowIn, consequent;
1966
+
1967
+ expr = parseLogicalORExpression();
1968
+
1969
+ if (match('?')) {
1970
+ lex();
1971
+ previousAllowIn = allowIn;
1972
+ allowIn = true;
1973
+ consequent = parseAssignmentExpression();
1974
+ allowIn = previousAllowIn;
1975
+ expect(':');
1976
+
1977
+ expr = {
1978
+ type: Syntax.ConditionalExpression,
1979
+ test: expr,
1980
+ consequent: consequent,
1981
+ alternate: parseAssignmentExpression()
1982
+ };
1983
+ }
1984
+
1985
+ return expr;
1986
+ }
1987
+
1988
+ // 11.13 Assignment Operators
1989
+
1990
+ function parseAssignmentExpression() {
1991
+ var expr;
1992
+
1993
+ expr = parseConditionalExpression();
1994
+
1995
+ if (matchAssign()) {
1996
+ // LeftHandSideExpression
1997
+ if (lastParenthesized !== expr && !isLeftHandSide(expr)) {
1998
+ throwError({}, Messages.InvalidLHSInAssignment);
1999
+ }
2000
+
2001
+ // 11.13.1
2002
+ if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) {
2003
+ throwError({}, Messages.StrictLHSAssignment);
2004
+ }
2005
+
2006
+ expr = {
2007
+ type: Syntax.AssignmentExpression,
2008
+ operator: lex().value,
2009
+ left: expr,
2010
+ right: parseAssignmentExpression()
2011
+ };
2012
+ }
2013
+
2014
+ return expr;
2015
+ }
2016
+
2017
+ // 11.14 Comma Operator
2018
+
2019
+ function parseExpression() {
2020
+ var expr = parseAssignmentExpression();
2021
+
2022
+ if (match(',')) {
2023
+ expr = {
2024
+ type: Syntax.SequenceExpression,
2025
+ expressions: [ expr ]
2026
+ };
2027
+
2028
+ while (index < length) {
2029
+ if (!match(',')) {
2030
+ break;
2031
+ }
2032
+ lex();
2033
+ expr.expressions.push(parseAssignmentExpression());
2034
+ }
2035
+
2036
+ }
2037
+ return expr;
2038
+ }
2039
+
2040
+ // 12.1 Block
2041
+
2042
+ function parseStatementList() {
2043
+ var list = [],
2044
+ statement;
2045
+
2046
+ while (index < length) {
2047
+ if (match('}')) {
2048
+ break;
2049
+ }
2050
+ statement = parseSourceElement();
2051
+ if (typeof statement === 'undefined') {
2052
+ break;
2053
+ }
2054
+ list.push(statement);
2055
+ }
2056
+
2057
+ return list;
2058
+ }
2059
+
2060
+ function parseBlock() {
2061
+ var block;
2062
+
2063
+ expect('{');
2064
+
2065
+ block = parseStatementList();
2066
+
2067
+ expect('}');
2068
+
2069
+ return {
2070
+ type: Syntax.BlockStatement,
2071
+ body: block
2072
+ };
2073
+ }
2074
+
2075
+ // 12.2 Variable Statement
2076
+
2077
+ function parseVariableIdentifier() {
2078
+ var token = lex();
2079
+
2080
+ if (token.type !== Token.Identifier) {
2081
+ throwUnexpected(token);
2082
+ }
2083
+
2084
+ return {
2085
+ type: Syntax.Identifier,
2086
+ name: token.value
2087
+ };
2088
+ }
2089
+
2090
+ function parseVariableDeclaration(kind) {
2091
+ var id = parseVariableIdentifier(),
2092
+ init = null;
2093
+
2094
+ // 12.2.1
2095
+ if (strict && isRestrictedWord(id.name)) {
2096
+ throwError({}, Messages.StrictVarName);
2097
+ }
2098
+
2099
+ if (kind === 'const') {
2100
+ expect('=');
2101
+ init = parseAssignmentExpression();
2102
+ } else if (match('=')) {
2103
+ lex();
2104
+ init = parseAssignmentExpression();
2105
+ }
2106
+
2107
+ return {
2108
+ type: Syntax.VariableDeclarator,
2109
+ id: id,
2110
+ init: init
2111
+ };
2112
+ }
2113
+
2114
+ function parseVariableDeclarationList(kind) {
2115
+ var list = [];
2116
+
2117
+ while (index < length) {
2118
+ list.push(parseVariableDeclaration(kind));
2119
+ if (!match(',')) {
2120
+ break;
2121
+ }
2122
+ lex();
2123
+ }
2124
+
2125
+ return list;
2126
+ }
2127
+
2128
+ function parseVariableStatement() {
2129
+ var declarations;
2130
+
2131
+ expectKeyword('var');
2132
+
2133
+ declarations = parseVariableDeclarationList();
2134
+
2135
+ consumeSemicolon();
2136
+
2137
+ return {
2138
+ type: Syntax.VariableDeclaration,
2139
+ declarations: declarations,
2140
+ kind: 'var'
2141
+ };
2142
+ }
2143
+
2144
+ // kind may be `const` or `let`
2145
+ // Both are experimental and not in the specification yet.
2146
+ // see http://wiki.ecmascript.org/doku.php?id=harmony:const
2147
+ // and http://wiki.ecmascript.org/doku.php?id=harmony:let
2148
+ function parseConstLetDeclaration(kind) {
2149
+ var declarations;
2150
+
2151
+ expectKeyword(kind);
2152
+
2153
+ declarations = parseVariableDeclarationList(kind);
2154
+
2155
+ consumeSemicolon();
2156
+
2157
+ return {
2158
+ type: Syntax.VariableDeclaration,
2159
+ declarations: declarations,
2160
+ kind: kind
2161
+ };
2162
+ }
2163
+
2164
+ // 12.3 Empty Statement
2165
+
2166
+ function parseEmptyStatement() {
2167
+ expect(';');
2168
+
2169
+ return {
2170
+ type: Syntax.EmptyStatement
2171
+ };
2172
+ }
2173
+
2174
+ // 12.4 Expression Statement
2175
+
2176
+ function parseExpressionStatement() {
2177
+ var expr = parseExpression();
2178
+
2179
+ consumeSemicolon();
2180
+
2181
+ return {
2182
+ type: Syntax.ExpressionStatement,
2183
+ expression: expr
2184
+ };
2185
+ }
2186
+
2187
+ // 12.5 If statement
2188
+
2189
+ function parseIfStatement() {
2190
+ var test, consequent, alternate;
2191
+
2192
+ expectKeyword('if');
2193
+
2194
+ expect('(');
2195
+
2196
+ test = parseExpression();
2197
+
2198
+ expect(')');
2199
+
2200
+ consequent = parseStatement();
2201
+
2202
+ if (matchKeyword('else')) {
2203
+ lex();
2204
+ alternate = parseStatement();
2205
+ } else {
2206
+ alternate = null;
2207
+ }
2208
+
2209
+ return {
2210
+ type: Syntax.IfStatement,
2211
+ test: test,
2212
+ consequent: consequent,
2213
+ alternate: alternate
2214
+ };
2215
+ }
2216
+
2217
+ // 12.6 Iteration Statements
2218
+
2219
+ function parseDoWhileStatement() {
2220
+ var body, test, oldInIteration;
2221
+
2222
+ expectKeyword('do');
2223
+
2224
+ oldInIteration = inIteration;
2225
+ inIteration = true;
2226
+
2227
+ body = parseStatement();
2228
+
2229
+ inIteration = oldInIteration;
2230
+
2231
+ expectKeyword('while');
2232
+
2233
+ expect('(');
2234
+
2235
+ test = parseExpression();
2236
+
2237
+ expect(')');
2238
+
2239
+ if (match(';')) {
2240
+ lex();
2241
+ }
2242
+
2243
+ return {
2244
+ type: Syntax.DoWhileStatement,
2245
+ body: body,
2246
+ test: test
2247
+ };
2248
+ }
2249
+
2250
+ function parseWhileStatement() {
2251
+ var test, body, oldInIteration;
2252
+
2253
+ expectKeyword('while');
2254
+
2255
+ expect('(');
2256
+
2257
+ test = parseExpression();
2258
+
2259
+ expect(')');
2260
+
2261
+ oldInIteration = inIteration;
2262
+ inIteration = true;
2263
+
2264
+ body = parseStatement();
2265
+
2266
+ inIteration = oldInIteration;
2267
+
2268
+ return {
2269
+ type: Syntax.WhileStatement,
2270
+ test: test,
2271
+ body: body
2272
+ };
2273
+ }
2274
+
2275
+ function parseForVariableDeclaration() {
2276
+ var token = lex();
2277
+
2278
+ return {
2279
+ type: Syntax.VariableDeclaration,
2280
+ declarations: parseVariableDeclarationList(),
2281
+ kind: token.value
2282
+ };
2283
+ }
2284
+
2285
+ function parseForStatement() {
2286
+ var init, test, update, left, right, body, oldInIteration;
2287
+
2288
+ init = test = update = null;
2289
+
2290
+ expectKeyword('for');
2291
+
2292
+ expect('(');
2293
+
2294
+ if (match(';')) {
2295
+ lex();
2296
+ } else {
2297
+ if (matchKeyword('var') || matchKeyword('let')) {
2298
+ allowIn = false;
2299
+ init = parseForVariableDeclaration();
2300
+ allowIn = true;
2301
+
2302
+ if (init.declarations.length === 1 && matchKeyword('in')) {
2303
+ lex();
2304
+ left = init;
2305
+ right = parseExpression();
2306
+ init = null;
2307
+ }
2308
+ } else {
2309
+ allowIn = false;
2310
+ init = parseExpression();
2311
+ allowIn = true;
2312
+
2313
+ if (matchKeyword('in')) {
2314
+ // LeftHandSideExpression
2315
+ if (matchKeyword('in') && (lastParenthesized !== init && !isLeftHandSide(init))) {
2316
+ throwError({}, Messages.InvalidLHSInForIn);
2317
+ }
2318
+ lex();
2319
+ left = init;
2320
+ right = parseExpression();
2321
+ init = null;
2322
+ }
2323
+ }
2324
+
2325
+ if (typeof left === 'undefined') {
2326
+ expect(';');
2327
+ }
2328
+ }
2329
+
2330
+ if (typeof left === 'undefined') {
2331
+
2332
+ if (!match(';')) {
2333
+ test = parseExpression();
2334
+ }
2335
+ expect(';');
2336
+
2337
+ if (!match(')')) {
2338
+ update = parseExpression();
2339
+ }
2340
+ }
2341
+
2342
+ expect(')');
2343
+
2344
+ oldInIteration = inIteration;
2345
+ inIteration = true;
2346
+
2347
+ body = parseStatement();
2348
+
2349
+ inIteration = oldInIteration;
2350
+
2351
+ if (typeof left === 'undefined') {
2352
+ return {
2353
+ type: Syntax.ForStatement,
2354
+ init: init,
2355
+ test: test,
2356
+ update: update,
2357
+ body: body
2358
+ };
2359
+ }
2360
+
2361
+ return {
2362
+ type: Syntax.ForInStatement,
2363
+ left: left,
2364
+ right: right,
2365
+ body: body,
2366
+ each: false
2367
+ };
2368
+ }
2369
+
2370
+ // 12.7 The continue statement
2371
+
2372
+ function parseContinueStatement() {
2373
+ var token, label = null;
2374
+
2375
+ expectKeyword('continue');
2376
+
2377
+ // Optimize the most common form: 'continue;'.
2378
+ if (source[index] === ';') {
2379
+ lex();
2380
+
2381
+ if (!inIteration) {
2382
+ throwError({}, Messages.IllegalContinue);
2383
+ }
2384
+
2385
+ return {
2386
+ type: Syntax.ContinueStatement,
2387
+ label: null
2388
+ };
2389
+ }
2390
+
2391
+ if (peekLineTerminator()) {
2392
+ if (!inIteration) {
2393
+ throwError({}, Messages.IllegalContinue);
2394
+ }
2395
+
2396
+ return {
2397
+ type: Syntax.ContinueStatement,
2398
+ label: null
2399
+ };
2400
+ }
2401
+
2402
+ token = lookahead();
2403
+ if (token.type === Token.Identifier) {
2404
+ label = parseVariableIdentifier();
2405
+
2406
+ if (!Object.prototype.hasOwnProperty.call(labelSet, label.name)) {
2407
+ throwError({}, Messages.UnknownLabel, label.name);
2408
+ }
2409
+ }
2410
+
2411
+ consumeSemicolon();
2412
+
2413
+ if (label === null && !inIteration) {
2414
+ throwError({}, Messages.IllegalContinue);
2415
+ }
2416
+
2417
+ return {
2418
+ type: Syntax.ContinueStatement,
2419
+ label: label
2420
+ };
2421
+ }
2422
+
2423
+ // 12.8 The break statement
2424
+
2425
+ function parseBreakStatement() {
2426
+ var token, label = null;
2427
+
2428
+ expectKeyword('break');
2429
+
2430
+ // Optimize the most common form: 'break;'.
2431
+ if (source[index] === ';') {
2432
+ lex();
2433
+
2434
+ if (!(inIteration || inSwitch)) {
2435
+ throwError({}, Messages.IllegalBreak);
2436
+ }
2437
+
2438
+ return {
2439
+ type: Syntax.BreakStatement,
2440
+ label: null
2441
+ };
2442
+ }
2443
+
2444
+ if (peekLineTerminator()) {
2445
+ if (!(inIteration || inSwitch)) {
2446
+ throwError({}, Messages.IllegalBreak);
2447
+ }
2448
+
2449
+ return {
2450
+ type: Syntax.BreakStatement,
2451
+ label: null
2452
+ };
2453
+ }
2454
+
2455
+ token = lookahead();
2456
+ if (token.type === Token.Identifier) {
2457
+ label = parseVariableIdentifier();
2458
+
2459
+ if (!Object.prototype.hasOwnProperty.call(labelSet, label.name)) {
2460
+ throwError({}, Messages.UnknownLabel, label.name);
2461
+ }
2462
+ }
2463
+
2464
+ consumeSemicolon();
2465
+
2466
+ if (label === null && !(inIteration || inSwitch)) {
2467
+ throwError({}, Messages.IllegalBreak);
2468
+ }
2469
+
2470
+ return {
2471
+ type: Syntax.BreakStatement,
2472
+ label: label
2473
+ };
2474
+ }
2475
+
2476
+ // 12.9 The return statement
2477
+
2478
+ function parseReturnStatement() {
2479
+ var token, argument = null;
2480
+
2481
+ expectKeyword('return');
2482
+
2483
+ if (!inFunctionBody) {
2484
+ throwErrorTolerant({}, Messages.IllegalReturn);
2485
+ }
2486
+
2487
+ // 'return' followed by a space and an identifier is very common.
2488
+ if (source[index] === ' ') {
2489
+ if (isIdentifierStart(source[index + 1])) {
2490
+ argument = parseExpression();
2491
+ consumeSemicolon();
2492
+ return {
2493
+ type: Syntax.ReturnStatement,
2494
+ argument: argument
2495
+ };
2496
+ }
2497
+ }
2498
+
2499
+ if (peekLineTerminator()) {
2500
+ return {
2501
+ type: Syntax.ReturnStatement,
2502
+ argument: null
2503
+ };
2504
+ }
2505
+
2506
+ if (!match(';')) {
2507
+ token = lookahead();
2508
+ if (!match('}') && token.type !== Token.EOF) {
2509
+ argument = parseExpression();
2510
+ }
2511
+ }
2512
+
2513
+ consumeSemicolon();
2514
+
2515
+ return {
2516
+ type: Syntax.ReturnStatement,
2517
+ argument: argument
2518
+ };
2519
+ }
2520
+
2521
+ // 12.10 The with statement
2522
+
2523
+ function parseWithStatement() {
2524
+ var object, body;
2525
+
2526
+ if (strict) {
2527
+ throwErrorTolerant({}, Messages.StrictModeWith);
2528
+ }
2529
+
2530
+ expectKeyword('with');
2531
+
2532
+ expect('(');
2533
+
2534
+ object = parseExpression();
2535
+
2536
+ expect(')');
2537
+
2538
+ body = parseStatement();
2539
+
2540
+ return {
2541
+ type: Syntax.WithStatement,
2542
+ object: object,
2543
+ body: body
2544
+ };
2545
+ }
2546
+
2547
+ // 12.10 The swith statement
2548
+
2549
+ function parseSwitchCase(test) {
2550
+ var consequent = [],
2551
+ statement;
2552
+
2553
+ while (index < length) {
2554
+ if (match('}') || matchKeyword('default') || matchKeyword('case')) {
2555
+ break;
2556
+ }
2557
+ statement = parseStatement();
2558
+ if (typeof statement === 'undefined') {
2559
+ break;
2560
+ }
2561
+ consequent.push(statement);
2562
+ }
2563
+
2564
+ return {
2565
+ type: Syntax.SwitchCase,
2566
+ test: test,
2567
+ consequent: consequent
2568
+ };
2569
+ }
2570
+
2571
+ function parseSwitchStatement() {
2572
+ var discriminant, cases, test, oldInSwitch;
2573
+
2574
+ expectKeyword('switch');
2575
+
2576
+ expect('(');
2577
+
2578
+ discriminant = parseExpression();
2579
+
2580
+ expect(')');
2581
+
2582
+ expect('{');
2583
+
2584
+ if (match('}')) {
2585
+ lex();
2586
+ return {
2587
+ type: Syntax.SwitchStatement,
2588
+ discriminant: discriminant
2589
+ };
2590
+ }
2591
+
2592
+ cases = [];
2593
+
2594
+ oldInSwitch = inSwitch;
2595
+ inSwitch = true;
2596
+
2597
+ while (index < length) {
2598
+ if (match('}')) {
2599
+ break;
2600
+ }
2601
+
2602
+ if (matchKeyword('default')) {
2603
+ lex();
2604
+ test = null;
2605
+ } else {
2606
+ expectKeyword('case');
2607
+ test = parseExpression();
2608
+ }
2609
+ expect(':');
2610
+
2611
+ cases.push(parseSwitchCase(test));
2612
+ }
2613
+
2614
+ inSwitch = oldInSwitch;
2615
+
2616
+ expect('}');
2617
+
2618
+ return {
2619
+ type: Syntax.SwitchStatement,
2620
+ discriminant: discriminant,
2621
+ cases: cases
2622
+ };
2623
+ }
2624
+
2625
+ // 12.13 The throw statement
2626
+
2627
+ function parseThrowStatement() {
2628
+ var argument;
2629
+
2630
+ expectKeyword('throw');
2631
+
2632
+ if (peekLineTerminator()) {
2633
+ throwError({}, Messages.NewlineAfterThrow);
2634
+ }
2635
+
2636
+ argument = parseExpression();
2637
+
2638
+ consumeSemicolon();
2639
+
2640
+ return {
2641
+ type: Syntax.ThrowStatement,
2642
+ argument: argument
2643
+ };
2644
+ }
2645
+
2646
+ // 12.14 The try statement
2647
+
2648
+ function parseCatchClause() {
2649
+ var param;
2650
+
2651
+ expectKeyword('catch');
2652
+
2653
+ expect('(');
2654
+ if (!match(')')) {
2655
+ param = parseExpression();
2656
+ // 12.14.1
2657
+ if (strict && param.type === Syntax.Identifier && isRestrictedWord(param.name)) {
2658
+ throwError({}, Messages.StrictCatchVariable);
2659
+ }
2660
+ }
2661
+ expect(')');
2662
+
2663
+ return {
2664
+ type: Syntax.CatchClause,
2665
+ param: param,
2666
+ guard: null,
2667
+ body: parseBlock()
2668
+ };
2669
+ }
2670
+
2671
+ function parseTryStatement() {
2672
+ var block, handlers = [], finalizer = null;
2673
+
2674
+ expectKeyword('try');
2675
+
2676
+ block = parseBlock();
2677
+
2678
+ if (matchKeyword('catch')) {
2679
+ handlers.push(parseCatchClause());
2680
+ }
2681
+
2682
+ if (matchKeyword('finally')) {
2683
+ lex();
2684
+ finalizer = parseBlock();
2685
+ }
2686
+
2687
+ if (handlers.length === 0 && !finalizer) {
2688
+ throwError({}, Messages.NoCatchOrFinally);
2689
+ }
2690
+
2691
+ return {
2692
+ type: Syntax.TryStatement,
2693
+ block: block,
2694
+ handlers: handlers,
2695
+ finalizer: finalizer
2696
+ };
2697
+ }
2698
+
2699
+ // 12.15 The debugger statement
2700
+
2701
+ function parseDebuggerStatement() {
2702
+ expectKeyword('debugger');
2703
+
2704
+ consumeSemicolon();
2705
+
2706
+ return {
2707
+ type: Syntax.DebuggerStatement
2708
+ };
2709
+ }
2710
+
2711
+ // 12 Statements
2712
+
2713
+ function parseStatement() {
2714
+ var token = lookahead(),
2715
+ expr,
2716
+ labeledBody;
2717
+
2718
+ if (token.type === Token.EOF) {
2719
+ throwUnexpected(token);
2720
+ }
2721
+
2722
+ if (token.type === Token.Punctuator) {
2723
+ switch (token.value) {
2724
+ case ';':
2725
+ return parseEmptyStatement();
2726
+ case '{':
2727
+ return parseBlock();
2728
+ case '(':
2729
+ return parseExpressionStatement();
2730
+ default:
2731
+ break;
2732
+ }
2733
+ }
2734
+
2735
+ if (token.type === Token.Keyword) {
2736
+ switch (token.value) {
2737
+ case 'break':
2738
+ return parseBreakStatement();
2739
+ case 'continue':
2740
+ return parseContinueStatement();
2741
+ case 'debugger':
2742
+ return parseDebuggerStatement();
2743
+ case 'do':
2744
+ return parseDoWhileStatement();
2745
+ case 'for':
2746
+ return parseForStatement();
2747
+ case 'function':
2748
+ return parseFunctionDeclaration();
2749
+ case 'if':
2750
+ return parseIfStatement();
2751
+ case 'return':
2752
+ return parseReturnStatement();
2753
+ case 'switch':
2754
+ return parseSwitchStatement();
2755
+ case 'throw':
2756
+ return parseThrowStatement();
2757
+ case 'try':
2758
+ return parseTryStatement();
2759
+ case 'var':
2760
+ return parseVariableStatement();
2761
+ case 'while':
2762
+ return parseWhileStatement();
2763
+ case 'with':
2764
+ return parseWithStatement();
2765
+ default:
2766
+ break;
2767
+ }
2768
+ }
2769
+
2770
+ expr = parseExpression();
2771
+
2772
+ // 12.12 Labelled Statements
2773
+ if ((expr.type === Syntax.Identifier) && match(':')) {
2774
+ lex();
2775
+
2776
+ if (Object.prototype.hasOwnProperty.call(labelSet, expr.name)) {
2777
+ throwError({}, Messages.Redeclaration, 'Label', expr.name);
2778
+ }
2779
+
2780
+ labelSet[expr.name] = true;
2781
+ labeledBody = parseStatement();
2782
+ delete labelSet[expr.name];
2783
+
2784
+ return {
2785
+ type: Syntax.LabeledStatement,
2786
+ label: expr,
2787
+ body: labeledBody
2788
+ };
2789
+ }
2790
+
2791
+ consumeSemicolon();
2792
+
2793
+ return {
2794
+ type: Syntax.ExpressionStatement,
2795
+ expression: expr
2796
+ };
2797
+ }
2798
+
2799
+ // 13 Function Definition
2800
+
2801
+ function parseFunctionSourceElements() {
2802
+ var sourceElement, sourceElements = [], token, directive, firstRestricted, oldLabelSet, oldInIteration, oldInSwitch, oldInFunctionBody;
2803
+
2804
+ expect('{');
2805
+
2806
+ while (index < length) {
2807
+ token = lookahead();
2808
+ if (token.type !== Token.StringLiteral) {
2809
+ break;
2810
+ }
2811
+
2812
+ sourceElement = parseSourceElement();
2813
+ sourceElements.push(sourceElement);
2814
+ if (sourceElement.expression.type !== Syntax.Literal) {
2815
+ // this is not directive
2816
+ break;
2817
+ }
2818
+ directive = sliceSource(token.range[0] + 1, token.range[1] - 1);
2819
+ if (directive === 'use strict') {
2820
+ strict = true;
2821
+ if (firstRestricted) {
2822
+ throwError(firstRestricted, Messages.StrictOctalLiteral);
2823
+ }
2824
+ } else {
2825
+ if (!firstRestricted && token.octal) {
2826
+ firstRestricted = token;
2827
+ }
2828
+ }
2829
+ }
2830
+
2831
+ oldLabelSet = labelSet;
2832
+ oldInIteration = inIteration;
2833
+ oldInSwitch = inSwitch;
2834
+ oldInFunctionBody = inFunctionBody;
2835
+
2836
+ labelSet = {};
2837
+ inIteration = false;
2838
+ inSwitch = false;
2839
+ inFunctionBody = true;
2840
+
2841
+ while (index < length) {
2842
+ if (match('}')) {
2843
+ break;
2844
+ }
2845
+ sourceElement = parseSourceElement();
2846
+ if (typeof sourceElement === 'undefined') {
2847
+ break;
2848
+ }
2849
+ sourceElements.push(sourceElement);
2850
+ }
2851
+
2852
+ expect('}');
2853
+
2854
+ labelSet = oldLabelSet;
2855
+ inIteration = oldInIteration;
2856
+ inSwitch = oldInSwitch;
2857
+ inFunctionBody = oldInFunctionBody;
2858
+
2859
+ return {
2860
+ type: Syntax.BlockStatement,
2861
+ body: sourceElements
2862
+ };
2863
+ }
2864
+
2865
+ function parseFunctionDeclaration() {
2866
+ var id, param, params = [], body, token, firstRestricted, message, previousStrict, paramSet;
2867
+
2868
+ expectKeyword('function');
2869
+ token = lookahead();
2870
+ id = parseVariableIdentifier();
2871
+ if (strict) {
2872
+ if (isRestrictedWord(token.value)) {
2873
+ throwError(token, Messages.StrictFunctionName);
2874
+ }
2875
+ } else {
2876
+ if (isRestrictedWord(token.value)) {
2877
+ firstRestricted = token;
2878
+ message = Messages.StrictFunctionName;
2879
+ } else if (isStrictModeReservedWord(token.value)) {
2880
+ firstRestricted = token;
2881
+ message = Messages.StrictReservedWord;
2882
+ }
2883
+ }
2884
+
2885
+ expect('(');
2886
+
2887
+ if (!match(')')) {
2888
+ paramSet = {};
2889
+ while (index < length) {
2890
+ token = lookahead();
2891
+ param = parseVariableIdentifier();
2892
+ if (strict) {
2893
+ if (isRestrictedWord(token.value)) {
2894
+ throwError(token, Messages.StrictParamName);
2895
+ }
2896
+ if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) {
2897
+ throwError(token, Messages.StrictParamDupe);
2898
+ }
2899
+ } else if (!firstRestricted) {
2900
+ if (isRestrictedWord(token.value)) {
2901
+ firstRestricted = token;
2902
+ message = Messages.StrictParamName;
2903
+ } else if (isStrictModeReservedWord(token.value)) {
2904
+ firstRestricted = token;
2905
+ message = Messages.StrictReservedWord;
2906
+ } else if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) {
2907
+ firstRestricted = token;
2908
+ message = Messages.StrictParamDupe;
2909
+ }
2910
+ }
2911
+ params.push(param);
2912
+ paramSet[param.name] = true;
2913
+ if (match(')')) {
2914
+ break;
2915
+ }
2916
+ expect(',');
2917
+ }
2918
+ }
2919
+
2920
+ expect(')');
2921
+
2922
+ previousStrict = strict;
2923
+ body = parseFunctionSourceElements();
2924
+ if (strict && firstRestricted) {
2925
+ throwError(firstRestricted, message);
2926
+ }
2927
+ strict = previousStrict;
2928
+
2929
+ return {
2930
+ type: Syntax.FunctionDeclaration,
2931
+ id: id,
2932
+ params: params,
2933
+ body: body
2934
+ };
2935
+ }
2936
+
2937
+ function parseFunctionExpression() {
2938
+ var token, id = null, firstRestricted, message, param, params = [], body, previousStrict, paramSet;
2939
+
2940
+ expectKeyword('function');
2941
+
2942
+ if (!match('(')) {
2943
+ token = lookahead();
2944
+ id = parseVariableIdentifier();
2945
+ if (strict) {
2946
+ if (isRestrictedWord(token.value)) {
2947
+ throwError(token, Messages.StrictFunctionName);
2948
+ }
2949
+ } else {
2950
+ if (isRestrictedWord(token.value)) {
2951
+ firstRestricted = token;
2952
+ message = Messages.StrictFunctionName;
2953
+ } else if (isStrictModeReservedWord(token.value)) {
2954
+ firstRestricted = token;
2955
+ message = Messages.StrictReservedWord;
2956
+ }
2957
+ }
2958
+ }
2959
+
2960
+ expect('(');
2961
+
2962
+ if (!match(')')) {
2963
+ paramSet = {};
2964
+ while (index < length) {
2965
+ token = lookahead();
2966
+ param = parseVariableIdentifier();
2967
+ if (strict) {
2968
+ if (isRestrictedWord(token.value)) {
2969
+ throwError(token, Messages.StrictParamName);
2970
+ }
2971
+ if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) {
2972
+ throwError(token, Messages.StrictParamDupe);
2973
+ }
2974
+ } else if (!firstRestricted) {
2975
+ if (isRestrictedWord(token.value)) {
2976
+ firstRestricted = token;
2977
+ message = Messages.StrictParamName;
2978
+ } else if (isStrictModeReservedWord(token.value)) {
2979
+ firstRestricted = token;
2980
+ message = Messages.StrictReservedWord;
2981
+ } else if (Object.prototype.hasOwnProperty.call(paramSet, token.value)) {
2982
+ firstRestricted = token;
2983
+ message = Messages.StrictParamDupe;
2984
+ }
2985
+ }
2986
+ params.push(param);
2987
+ paramSet[param.name] = true;
2988
+ if (match(')')) {
2989
+ break;
2990
+ }
2991
+ expect(',');
2992
+ }
2993
+ }
2994
+
2995
+ expect(')');
2996
+
2997
+ previousStrict = strict;
2998
+ body = parseFunctionSourceElements();
2999
+ if (strict && firstRestricted) {
3000
+ throwError(firstRestricted, message);
3001
+ }
3002
+ strict = previousStrict;
3003
+
3004
+ return {
3005
+ type: Syntax.FunctionExpression,
3006
+ id: id,
3007
+ params: params,
3008
+ body: body
3009
+ };
3010
+ }
3011
+
3012
+ // 14 Program
3013
+
3014
+ function parseSourceElement() {
3015
+ var token = lookahead();
3016
+
3017
+ if (token.type === Token.Keyword) {
3018
+ switch (token.value) {
3019
+ case 'const':
3020
+ case 'let':
3021
+ return parseConstLetDeclaration(token.value);
3022
+ case 'function':
3023
+ return parseFunctionDeclaration();
3024
+ default:
3025
+ return parseStatement();
3026
+ }
3027
+ }
3028
+
3029
+ if (token.type !== Token.EOF) {
3030
+ return parseStatement();
3031
+ }
3032
+ }
3033
+
3034
+ function parseSourceElements() {
3035
+ var sourceElement, sourceElements = [], token, directive, firstRestricted;
3036
+
3037
+ while (index < length) {
3038
+ token = lookahead();
3039
+ if (token.type !== Token.StringLiteral) {
3040
+ break;
3041
+ }
3042
+
3043
+ sourceElement = parseSourceElement();
3044
+ sourceElements.push(sourceElement);
3045
+ if (sourceElement.expression.type !== Syntax.Literal) {
3046
+ // this is not directive
3047
+ break;
3048
+ }
3049
+ directive = sliceSource(token.range[0] + 1, token.range[1] - 1);
3050
+ if (directive === 'use strict') {
3051
+ strict = true;
3052
+ if (firstRestricted) {
3053
+ throwError(firstRestricted, Messages.StrictOctalLiteral);
3054
+ }
3055
+ } else {
3056
+ if (!firstRestricted && token.octal) {
3057
+ firstRestricted = token;
3058
+ }
3059
+ }
3060
+ }
3061
+
3062
+ while (index < length) {
3063
+ sourceElement = parseSourceElement();
3064
+ if (typeof sourceElement === 'undefined') {
3065
+ break;
3066
+ }
3067
+ sourceElements.push(sourceElement);
3068
+ }
3069
+ return sourceElements;
3070
+ }
3071
+
3072
+ function parseProgram() {
3073
+ var program;
3074
+ strict = false;
3075
+ program = {
3076
+ type: Syntax.Program,
3077
+ body: parseSourceElements()
3078
+ };
3079
+ return program;
3080
+ }
3081
+
3082
+ // The following functions are needed only when the option to preserve
3083
+ // the comments is active.
3084
+
3085
+ function addComment(start, end, type, value) {
3086
+ assert(typeof start === 'number', 'Comment must have valid position');
3087
+
3088
+ // Because the way the actual token is scanned, often the comments
3089
+ // (if any) are skipped twice during the lexical analysis.
3090
+ // Thus, we need to skip adding a comment if the comment array already
3091
+ // handled it.
3092
+ if (extra.comments.length > 0) {
3093
+ if (extra.comments[extra.comments.length - 1].range[1] > start) {
3094
+ return;
3095
+ }
3096
+ }
3097
+
3098
+ extra.comments.push({
3099
+ range: [start, end],
3100
+ type: type,
3101
+ value: value
3102
+ });
3103
+ }
3104
+
3105
+ function scanComment() {
3106
+ var comment, ch, start, blockComment, lineComment;
3107
+
3108
+ comment = '';
3109
+ blockComment = false;
3110
+ lineComment = false;
3111
+
3112
+ while (index < length) {
3113
+ ch = source[index];
3114
+
3115
+ if (lineComment) {
3116
+ ch = nextChar();
3117
+ if (index >= length) {
3118
+ lineComment = false;
3119
+ comment += ch;
3120
+ addComment(start, index - 1, 'Line', comment);
3121
+ } else if (isLineTerminator(ch)) {
3122
+ lineComment = false;
3123
+ addComment(start, index - 1, 'Line', comment);
3124
+ if (ch === '\r' && source[index] === '\n') {
3125
+ ++index;
3126
+ }
3127
+ ++lineNumber;
3128
+ lineStart = index;
3129
+ comment = '';
3130
+ } else {
3131
+ comment += ch;
3132
+ }
3133
+ } else if (blockComment) {
3134
+ if (isLineTerminator(ch)) {
3135
+ if (ch === '\r' && source[index + 1] === '\n') {
3136
+ ++index;
3137
+ comment += '\r\n';
3138
+ } else {
3139
+ comment += ch;
3140
+ }
3141
+ ++lineNumber;
3142
+ ++index;
3143
+ lineStart = index;
3144
+ if (index >= length) {
3145
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
3146
+ }
3147
+ } else {
3148
+ ch = nextChar();
3149
+ if (index >= length) {
3150
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
3151
+ }
3152
+ comment += ch;
3153
+ if (ch === '*') {
3154
+ ch = source[index];
3155
+ if (ch === '/') {
3156
+ comment = comment.substr(0, comment.length - 1);
3157
+ blockComment = false;
3158
+ ++index;
3159
+ addComment(start, index - 1, 'Block', comment);
3160
+ comment = '';
3161
+ }
3162
+ }
3163
+ }
3164
+ } else if (ch === '/') {
3165
+ ch = source[index + 1];
3166
+ if (ch === '/') {
3167
+ start = index;
3168
+ index += 2;
3169
+ lineComment = true;
3170
+ } else if (ch === '*') {
3171
+ start = index;
3172
+ index += 2;
3173
+ blockComment = true;
3174
+ if (index >= length) {
3175
+ throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
3176
+ }
3177
+ } else {
3178
+ break;
3179
+ }
3180
+ } else if (isWhiteSpace(ch)) {
3181
+ ++index;
3182
+ } else if (isLineTerminator(ch)) {
3183
+ ++index;
3184
+ if (ch === '\r' && source[index] === '\n') {
3185
+ ++index;
3186
+ }
3187
+ ++lineNumber;
3188
+ lineStart = index;
3189
+ } else {
3190
+ break;
3191
+ }
3192
+ }
3193
+ }
3194
+
3195
+ function collectToken() {
3196
+ var token = extra.advance(),
3197
+ range,
3198
+ value;
3199
+
3200
+ if (token.type !== Token.EOF) {
3201
+ range = [token.range[0], token.range[1] - 1];
3202
+ value = sliceSource(token.range[0], token.range[1]);
3203
+ extra.tokens.push({
3204
+ type: TokenName[token.type],
3205
+ value: value,
3206
+ range: range
3207
+ });
3208
+ }
3209
+
3210
+ return token;
3211
+ }
3212
+
3213
+ function collectRegex() {
3214
+ var pos, regex, token;
3215
+
3216
+ skipComment();
3217
+
3218
+ pos = index;
3219
+ regex = extra.scanRegExp();
3220
+
3221
+ // Pop the previous token, which is likely '/' or '/='
3222
+ if (extra.tokens.length > 0) {
3223
+ token = extra.tokens[extra.tokens.length - 1];
3224
+ if (token.range[0] === pos && token.type === 'Punctuator') {
3225
+ if (token.value === '/' || token.value === '/=') {
3226
+ extra.tokens.pop();
3227
+ }
3228
+ }
3229
+ }
3230
+
3231
+ extra.tokens.push({
3232
+ type: 'RegularExpression',
3233
+ value: regex.literal,
3234
+ range: [pos, index - 1]
3235
+ });
3236
+
3237
+ return regex;
3238
+ }
3239
+
3240
+ function createLiteral(token) {
3241
+ return {
3242
+ type: Syntax.Literal,
3243
+ value: token.value
3244
+ };
3245
+ }
3246
+
3247
+ function createRawLiteral(token) {
3248
+ return {
3249
+ type: Syntax.Literal,
3250
+ value: token.value,
3251
+ raw: sliceSource(token.range[0], token.range[1])
3252
+ };
3253
+ }
3254
+
3255
+ function wrapTrackingFunction(range, loc) {
3256
+
3257
+ return function (parseFunction) {
3258
+
3259
+ function isBinary(node) {
3260
+ return node.type === Syntax.LogicalExpression ||
3261
+ node.type === Syntax.BinaryExpression;
3262
+ }
3263
+
3264
+ function visit(node) {
3265
+ if (isBinary(node.left)) {
3266
+ visit(node.left);
3267
+ }
3268
+ if (isBinary(node.right)) {
3269
+ visit(node.right);
3270
+ }
3271
+
3272
+ if (range && typeof node.range === 'undefined') {
3273
+ node.range = [node.left.range[0], node.right.range[1]];
3274
+ }
3275
+ if (loc && typeof node.loc === 'undefined') {
3276
+ node.loc = {
3277
+ start: node.left.loc.start,
3278
+ end: node.right.loc.end
3279
+ };
3280
+ }
3281
+ }
3282
+
3283
+ return function () {
3284
+ var node, rangeInfo, locInfo;
3285
+
3286
+ skipComment();
3287
+ rangeInfo = [index, 0];
3288
+ locInfo = {
3289
+ start: {
3290
+ line: lineNumber,
3291
+ column: index - lineStart
3292
+ }
3293
+ };
3294
+
3295
+ node = parseFunction.apply(null, arguments);
3296
+ if (typeof node !== 'undefined') {
3297
+
3298
+ if (range) {
3299
+ rangeInfo[1] = index - 1;
3300
+ node.range = rangeInfo;
3301
+ }
3302
+
3303
+ if (loc) {
3304
+ locInfo.end = {
3305
+ line: lineNumber,
3306
+ column: index - lineStart
3307
+ };
3308
+ node.loc = locInfo;
3309
+ }
3310
+
3311
+ if (isBinary(node)) {
3312
+ visit(node);
3313
+ }
3314
+
3315
+ if (node.type === Syntax.MemberExpression) {
3316
+ if (typeof node.object.range !== 'undefined') {
3317
+ node.range[0] = node.object.range[0];
3318
+ }
3319
+ if (typeof node.object.loc !== 'undefined') {
3320
+ node.loc.start = node.object.loc.start;
3321
+ }
3322
+ }
3323
+ return node;
3324
+ }
3325
+ };
3326
+
3327
+ };
3328
+ }
3329
+
3330
+ function patch() {
3331
+
3332
+ var wrapTracking;
3333
+
3334
+ if (extra.comments) {
3335
+ extra.skipComment = skipComment;
3336
+ skipComment = scanComment;
3337
+ }
3338
+
3339
+ if (extra.raw) {
3340
+ extra.createLiteral = createLiteral;
3341
+ createLiteral = createRawLiteral;
3342
+ }
3343
+
3344
+ if (extra.range || extra.loc) {
3345
+
3346
+ wrapTracking = wrapTrackingFunction(extra.range, extra.loc);
3347
+
3348
+ extra.parseAdditiveExpression = parseAdditiveExpression;
3349
+ extra.parseAssignmentExpression = parseAssignmentExpression;
3350
+ extra.parseBitwiseANDExpression = parseBitwiseANDExpression;
3351
+ extra.parseBitwiseORExpression = parseBitwiseORExpression;
3352
+ extra.parseBitwiseXORExpression = parseBitwiseXORExpression;
3353
+ extra.parseBlock = parseBlock;
3354
+ extra.parseFunctionSourceElements = parseFunctionSourceElements;
3355
+ extra.parseCallMember = parseCallMember;
3356
+ extra.parseCatchClause = parseCatchClause;
3357
+ extra.parseComputedMember = parseComputedMember;
3358
+ extra.parseConditionalExpression = parseConditionalExpression;
3359
+ extra.parseConstLetDeclaration = parseConstLetDeclaration;
3360
+ extra.parseEqualityExpression = parseEqualityExpression;
3361
+ extra.parseExpression = parseExpression;
3362
+ extra.parseForVariableDeclaration = parseForVariableDeclaration;
3363
+ extra.parseFunctionDeclaration = parseFunctionDeclaration;
3364
+ extra.parseFunctionExpression = parseFunctionExpression;
3365
+ extra.parseLogicalANDExpression = parseLogicalANDExpression;
3366
+ extra.parseLogicalORExpression = parseLogicalORExpression;
3367
+ extra.parseMultiplicativeExpression = parseMultiplicativeExpression;
3368
+ extra.parseNewExpression = parseNewExpression;
3369
+ extra.parseNonComputedMember = parseNonComputedMember;
3370
+ extra.parseNonComputedProperty = parseNonComputedProperty;
3371
+ extra.parseObjectProperty = parseObjectProperty;
3372
+ extra.parseObjectPropertyKey = parseObjectPropertyKey;
3373
+ extra.parsePostfixExpression = parsePostfixExpression;
3374
+ extra.parsePrimaryExpression = parsePrimaryExpression;
3375
+ extra.parseProgram = parseProgram;
3376
+ extra.parsePropertyFunction = parsePropertyFunction;
3377
+ extra.parseRelationalExpression = parseRelationalExpression;
3378
+ extra.parseStatement = parseStatement;
3379
+ extra.parseShiftExpression = parseShiftExpression;
3380
+ extra.parseSwitchCase = parseSwitchCase;
3381
+ extra.parseUnaryExpression = parseUnaryExpression;
3382
+ extra.parseVariableDeclaration = parseVariableDeclaration;
3383
+ extra.parseVariableIdentifier = parseVariableIdentifier;
3384
+
3385
+ parseAdditiveExpression = wrapTracking(extra.parseAdditiveExpression);
3386
+ parseAssignmentExpression = wrapTracking(extra.parseAssignmentExpression);
3387
+ parseBitwiseANDExpression = wrapTracking(extra.parseBitwiseANDExpression);
3388
+ parseBitwiseORExpression = wrapTracking(extra.parseBitwiseORExpression);
3389
+ parseBitwiseXORExpression = wrapTracking(extra.parseBitwiseXORExpression);
3390
+ parseBlock = wrapTracking(extra.parseBlock);
3391
+ parseFunctionSourceElements = wrapTracking(extra.parseFunctionSourceElements);
3392
+ parseCallMember = wrapTracking(extra.parseCallMember);
3393
+ parseCatchClause = wrapTracking(extra.parseCatchClause);
3394
+ parseComputedMember = wrapTracking(extra.parseComputedMember);
3395
+ parseConditionalExpression = wrapTracking(extra.parseConditionalExpression);
3396
+ parseConstLetDeclaration = wrapTracking(extra.parseConstLetDeclaration);
3397
+ parseEqualityExpression = wrapTracking(extra.parseEqualityExpression);
3398
+ parseExpression = wrapTracking(extra.parseExpression);
3399
+ parseForVariableDeclaration = wrapTracking(extra.parseForVariableDeclaration);
3400
+ parseFunctionDeclaration = wrapTracking(extra.parseFunctionDeclaration);
3401
+ parseFunctionExpression = wrapTracking(extra.parseFunctionExpression);
3402
+ parseLogicalANDExpression = wrapTracking(extra.parseLogicalANDExpression);
3403
+ parseLogicalORExpression = wrapTracking(extra.parseLogicalORExpression);
3404
+ parseMultiplicativeExpression = wrapTracking(extra.parseMultiplicativeExpression);
3405
+ parseNewExpression = wrapTracking(extra.parseNewExpression);
3406
+ parseNonComputedMember = wrapTracking(extra.parseNonComputedMember);
3407
+ parseNonComputedProperty = wrapTracking(extra.parseNonComputedProperty);
3408
+ parseObjectProperty = wrapTracking(extra.parseObjectProperty);
3409
+ parseObjectPropertyKey = wrapTracking(extra.parseObjectPropertyKey);
3410
+ parsePostfixExpression = wrapTracking(extra.parsePostfixExpression);
3411
+ parsePrimaryExpression = wrapTracking(extra.parsePrimaryExpression);
3412
+ parseProgram = wrapTracking(extra.parseProgram);
3413
+ parsePropertyFunction = wrapTracking(extra.parsePropertyFunction);
3414
+ parseRelationalExpression = wrapTracking(extra.parseRelationalExpression);
3415
+ parseStatement = wrapTracking(extra.parseStatement);
3416
+ parseShiftExpression = wrapTracking(extra.parseShiftExpression);
3417
+ parseSwitchCase = wrapTracking(extra.parseSwitchCase);
3418
+ parseUnaryExpression = wrapTracking(extra.parseUnaryExpression);
3419
+ parseVariableDeclaration = wrapTracking(extra.parseVariableDeclaration);
3420
+ parseVariableIdentifier = wrapTracking(extra.parseVariableIdentifier);
3421
+ }
3422
+
3423
+ if (typeof extra.tokens !== 'undefined') {
3424
+ extra.advance = advance;
3425
+ extra.scanRegExp = scanRegExp;
3426
+
3427
+ advance = collectToken;
3428
+ scanRegExp = collectRegex;
3429
+ }
3430
+ }
3431
+
3432
+ function unpatch() {
3433
+ if (typeof extra.skipComment === 'function') {
3434
+ skipComment = extra.skipComment;
3435
+ }
3436
+
3437
+ if (extra.raw) {
3438
+ createLiteral = extra.createLiteral;
3439
+ }
3440
+
3441
+ if (extra.range || extra.loc) {
3442
+ parseAdditiveExpression = extra.parseAdditiveExpression;
3443
+ parseAssignmentExpression = extra.parseAssignmentExpression;
3444
+ parseBitwiseANDExpression = extra.parseBitwiseANDExpression;
3445
+ parseBitwiseORExpression = extra.parseBitwiseORExpression;
3446
+ parseBitwiseXORExpression = extra.parseBitwiseXORExpression;
3447
+ parseBlock = extra.parseBlock;
3448
+ parseFunctionSourceElements = extra.parseFunctionSourceElements;
3449
+ parseCallMember = extra.parseCallMember;
3450
+ parseCatchClause = extra.parseCatchClause;
3451
+ parseComputedMember = extra.parseComputedMember;
3452
+ parseConditionalExpression = extra.parseConditionalExpression;
3453
+ parseConstLetDeclaration = extra.parseConstLetDeclaration;
3454
+ parseEqualityExpression = extra.parseEqualityExpression;
3455
+ parseExpression = extra.parseExpression;
3456
+ parseForVariableDeclaration = extra.parseForVariableDeclaration;
3457
+ parseFunctionDeclaration = extra.parseFunctionDeclaration;
3458
+ parseFunctionExpression = extra.parseFunctionExpression;
3459
+ parseLogicalANDExpression = extra.parseLogicalANDExpression;
3460
+ parseLogicalORExpression = extra.parseLogicalORExpression;
3461
+ parseMultiplicativeExpression = extra.parseMultiplicativeExpression;
3462
+ parseNewExpression = extra.parseNewExpression;
3463
+ parseNonComputedMember = extra.parseNonComputedMember;
3464
+ parseNonComputedProperty = extra.parseNonComputedProperty;
3465
+ parseObjectProperty = extra.parseObjectProperty;
3466
+ parseObjectPropertyKey = extra.parseObjectPropertyKey;
3467
+ parsePrimaryExpression = extra.parsePrimaryExpression;
3468
+ parsePostfixExpression = extra.parsePostfixExpression;
3469
+ parseProgram = extra.parseProgram;
3470
+ parsePropertyFunction = extra.parsePropertyFunction;
3471
+ parseRelationalExpression = extra.parseRelationalExpression;
3472
+ parseStatement = extra.parseStatement;
3473
+ parseShiftExpression = extra.parseShiftExpression;
3474
+ parseSwitchCase = extra.parseSwitchCase;
3475
+ parseUnaryExpression = extra.parseUnaryExpression;
3476
+ parseVariableDeclaration = extra.parseVariableDeclaration;
3477
+ parseVariableIdentifier = extra.parseVariableIdentifier;
3478
+ }
3479
+
3480
+ if (typeof extra.scanRegExp === 'function') {
3481
+ advance = extra.advance;
3482
+ scanRegExp = extra.scanRegExp;
3483
+ }
3484
+ }
3485
+
3486
+ function stringToArray(str) {
3487
+ var length = str.length,
3488
+ result = [],
3489
+ i;
3490
+ for (i = 0; i < length; ++i) {
3491
+ result[i] = str.charAt(i);
3492
+ }
3493
+ return result;
3494
+ }
3495
+
3496
+ function parse(code, options) {
3497
+ var program, toString;
3498
+
3499
+ toString = String;
3500
+ if (typeof code !== 'string' && !(code instanceof String)) {
3501
+ code = toString(code);
3502
+ }
3503
+
3504
+ source = code;
3505
+ index = 0;
3506
+ lineNumber = (source.length > 0) ? 1 : 0;
3507
+ lineStart = 0;
3508
+ length = source.length;
3509
+ buffer = null;
3510
+ allowIn = true;
3511
+ labelSet = {};
3512
+ inSwitch = false;
3513
+ inIteration = false;
3514
+ lastParenthesized = null;
3515
+ inFunctionBody = false;
3516
+
3517
+ extra = {};
3518
+ if (typeof options !== 'undefined') {
3519
+ extra.range = (typeof options.range === 'boolean') && options.range;
3520
+ extra.loc = (typeof options.loc === 'boolean') && options.loc;
3521
+ extra.raw = (typeof options.raw === 'boolean') && options.raw;
3522
+ if (typeof options.tokens === 'boolean' && options.tokens) {
3523
+ extra.tokens = [];
3524
+ }
3525
+ if (typeof options.comment === 'boolean' && options.comment) {
3526
+ extra.comments = [];
3527
+ }
3528
+ if (typeof options.tolerant === 'boolean' && options.tolerant) {
3529
+ extra.errors = [];
3530
+ }
3531
+ }
3532
+
3533
+ if (length > 0) {
3534
+ if (typeof source[0] === 'undefined') {
3535
+ // Try first to convert to a string. This is good as fast path
3536
+ // for old IE which understands string indexing for string
3537
+ // literals only and not for string object.
3538
+ if (code instanceof String) {
3539
+ source = code.valueOf();
3540
+ }
3541
+
3542
+ // Force accessing the characters via an array.
3543
+ if (typeof source[0] === 'undefined') {
3544
+ source = stringToArray(code);
3545
+ }
3546
+ }
3547
+ }
3548
+
3549
+ patch();
3550
+ try {
3551
+ program = parseProgram();
3552
+ if (typeof extra.comments !== 'undefined') {
3553
+ program.comments = extra.comments;
3554
+ }
3555
+ if (typeof extra.tokens !== 'undefined') {
3556
+ program.tokens = extra.tokens;
3557
+ }
3558
+ if (typeof extra.errors !== 'undefined') {
3559
+ program.errors = extra.errors;
3560
+ }
3561
+ } catch (e) {
3562
+ throw e;
3563
+ } finally {
3564
+ unpatch();
3565
+ extra = {};
3566
+ }
3567
+
3568
+ return program;
3569
+ }
3570
+
3571
+ // Sync with package.json.
3572
+ exports.version = '0.9.9';
3573
+
3574
+ exports.parse = parse;
3575
+
3576
+ }(typeof exports === 'undefined' ? (esprima = {}) : exports));
3577
+ /* vim: set sw=4 ts=4 et tw=80 : */