snowball 0.1.21 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 : */