版博士V2.0程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. # Acorn
  2. A tiny, fast JavaScript parser written in JavaScript.
  3. ## Community
  4. Acorn is open source software released under an
  5. [MIT license](https://github.com/acornjs/acorn/blob/master/acorn/LICENSE).
  6. You are welcome to
  7. [report bugs](https://github.com/acornjs/acorn/issues) or create pull
  8. requests on [github](https://github.com/acornjs/acorn). For questions
  9. and discussion, please use the
  10. [Tern discussion forum](https://discuss.ternjs.net).
  11. ## Installation
  12. The easiest way to install acorn is from [`npm`](https://www.npmjs.com/):
  13. ```sh
  14. npm install acorn
  15. ```
  16. Alternately, you can download the source and build acorn yourself:
  17. ```sh
  18. git clone https://github.com/acornjs/acorn.git
  19. cd acorn
  20. npm install
  21. ```
  22. ## Interface
  23. **parse**`(input, options)` is the main interface to the library. The
  24. `input` parameter is a string, `options` must be an object setting
  25. some of the options listed below. The return value will be an abstract
  26. syntax tree object as specified by the [ESTree
  27. spec](https://github.com/estree/estree).
  28. ```javascript
  29. let acorn = require("acorn");
  30. console.log(acorn.parse("1 + 1", {ecmaVersion: 2020}));
  31. ```
  32. When encountering a syntax error, the parser will raise a
  33. `SyntaxError` object with a meaningful message. The error object will
  34. have a `pos` property that indicates the string offset at which the
  35. error occurred, and a `loc` object that contains a `{line, column}`
  36. object referring to that same position.
  37. Options are provided by in a second argument, which should be an
  38. object containing any of these fields (only `ecmaVersion` is
  39. required):
  40. - **ecmaVersion**: Indicates the ECMAScript version to parse. Must be
  41. either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10 (2019),
  42. 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `"latest"` (the
  43. latest the library supports). This influences support for strict
  44. mode, the set of reserved words, and support for new syntax
  45. features.
  46. **NOTE**: Only 'stage 4' (finalized) ECMAScript features are being
  47. implemented by Acorn. Other proposed new features must be
  48. implemented through plugins.
  49. - **sourceType**: Indicate the mode the code should be parsed in. Can be
  50. either `"script"` or `"module"`. This influences global strict mode
  51. and parsing of `import` and `export` declarations.
  52. **NOTE**: If set to `"module"`, then static `import` / `export` syntax
  53. will be valid, even if `ecmaVersion` is less than 6.
  54. - **onInsertedSemicolon**: If given a callback, that callback will be
  55. called whenever a missing semicolon is inserted by the parser. The
  56. callback will be given the character offset of the point where the
  57. semicolon is inserted as argument, and if `locations` is on, also a
  58. `{line, column}` object representing this position.
  59. - **onTrailingComma**: Like `onInsertedSemicolon`, but for trailing
  60. commas.
  61. - **allowReserved**: If `false`, using a reserved word will generate
  62. an error. Defaults to `true` for `ecmaVersion` 3, `false` for higher
  63. versions. When given the value `"never"`, reserved words and
  64. keywords can also not be used as property names (as in Internet
  65. Explorer's old parser).
  66. - **allowReturnOutsideFunction**: By default, a return statement at
  67. the top level raises an error. Set this to `true` to accept such
  68. code.
  69. - **allowImportExportEverywhere**: By default, `import` and `export`
  70. declarations can only appear at a program's top level. Setting this
  71. option to `true` allows them anywhere where a statement is allowed,
  72. and also allows `import.meta` expressions to appear in scripts
  73. (when `sourceType` is not `"module"`).
  74. - **allowAwaitOutsideFunction**: If `false`, `await` expressions can
  75. only appear inside `async` functions. Defaults to `true` for
  76. `ecmaVersion` 2022 and later, `false` for lower versions. Setting this option to
  77. `true` allows to have top-level `await` expressions. They are
  78. still not allowed in non-`async` functions, though.
  79. - **allowSuperOutsideMethod**: By default, `super` outside a method
  80. raises an error. Set this to `true` to accept such code.
  81. - **allowHashBang**: When this is enabled, if the code starts with the
  82. characters `#!` (as in a shellscript), the first line will be
  83. treated as a comment. Defaults to true when `ecmaVersion` >= 2023.
  84. - **locations**: When `true`, each node has a `loc` object attached
  85. with `start` and `end` subobjects, each of which contains the
  86. one-based line and zero-based column numbers in `{line, column}`
  87. form. Default is `false`.
  88. - **onToken**: If a function is passed for this option, each found
  89. token will be passed in same format as tokens returned from
  90. `tokenizer().getToken()`.
  91. If array is passed, each found token is pushed to it.
  92. Note that you are not allowed to call the parser from the
  93. callback—that will corrupt its internal state.
  94. - **onComment**: If a function is passed for this option, whenever a
  95. comment is encountered the function will be called with the
  96. following parameters:
  97. - `block`: `true` if the comment is a block comment, false if it
  98. is a line comment.
  99. - `text`: The content of the comment.
  100. - `start`: Character offset of the start of the comment.
  101. - `end`: Character offset of the end of the comment.
  102. When the `locations` options is on, the `{line, column}` locations
  103. of the comment’s start and end are passed as two additional
  104. parameters.
  105. If array is passed for this option, each found comment is pushed
  106. to it as object in Esprima format:
  107. ```javascript
  108. {
  109. "type": "Line" | "Block",
  110. "value": "comment text",
  111. "start": Number,
  112. "end": Number,
  113. // If `locations` option is on:
  114. "loc": {
  115. "start": {line: Number, column: Number}
  116. "end": {line: Number, column: Number}
  117. },
  118. // If `ranges` option is on:
  119. "range": [Number, Number]
  120. }
  121. ```
  122. Note that you are not allowed to call the parser from the
  123. callback—that will corrupt its internal state.
  124. - **ranges**: Nodes have their start and end characters offsets
  125. recorded in `start` and `end` properties (directly on the node,
  126. rather than the `loc` object, which holds line/column data. To also
  127. add a
  128. [semi-standardized](https://bugzilla.mozilla.org/show_bug.cgi?id=745678)
  129. `range` property holding a `[start, end]` array with the same
  130. numbers, set the `ranges` option to `true`.
  131. - **program**: It is possible to parse multiple files into a single
  132. AST by passing the tree produced by parsing the first file as the
  133. `program` option in subsequent parses. This will add the toplevel
  134. forms of the parsed file to the "Program" (top) node of an existing
  135. parse tree.
  136. - **sourceFile**: When the `locations` option is `true`, you can pass
  137. this option to add a `source` attribute in every node’s `loc`
  138. object. Note that the contents of this option are not examined or
  139. processed in any way; you are free to use whatever format you
  140. choose.
  141. - **directSourceFile**: Like `sourceFile`, but a `sourceFile` property
  142. will be added (regardless of the `location` option) directly to the
  143. nodes, rather than the `loc` object.
  144. - **preserveParens**: If this option is `true`, parenthesized expressions
  145. are represented by (non-standard) `ParenthesizedExpression` nodes
  146. that have a single `expression` property containing the expression
  147. inside parentheses.
  148. **parseExpressionAt**`(input, offset, options)` will parse a single
  149. expression in a string, and return its AST. It will not complain if
  150. there is more of the string left after the expression.
  151. **tokenizer**`(input, options)` returns an object with a `getToken`
  152. method that can be called repeatedly to get the next token, a `{start,
  153. end, type, value}` object (with added `loc` property when the
  154. `locations` option is enabled and `range` property when the `ranges`
  155. option is enabled). When the token's type is `tokTypes.eof`, you
  156. should stop calling the method, since it will keep returning that same
  157. token forever.
  158. In ES6 environment, returned result can be used as any other
  159. protocol-compliant iterable:
  160. ```javascript
  161. for (let token of acorn.tokenizer(str)) {
  162. // iterate over the tokens
  163. }
  164. // transform code to array of tokens:
  165. var tokens = [...acorn.tokenizer(str)];
  166. ```
  167. **tokTypes** holds an object mapping names to the token type objects
  168. that end up in the `type` properties of tokens.
  169. **getLineInfo**`(input, offset)` can be used to get a `{line,
  170. column}` object for a given program string and offset.
  171. ### The `Parser` class
  172. Instances of the **`Parser`** class contain all the state and logic
  173. that drives a parse. It has static methods `parse`,
  174. `parseExpressionAt`, and `tokenizer` that match the top-level
  175. functions by the same name.
  176. When extending the parser with plugins, you need to call these methods
  177. on the extended version of the class. To extend a parser with plugins,
  178. you can use its static `extend` method.
  179. ```javascript
  180. var acorn = require("acorn");
  181. var jsx = require("acorn-jsx");
  182. var JSXParser = acorn.Parser.extend(jsx());
  183. JSXParser.parse("foo(<bar/>)", {ecmaVersion: 2020});
  184. ```
  185. The `extend` method takes any number of plugin values, and returns a
  186. new `Parser` class that includes the extra parser logic provided by
  187. the plugins.
  188. ## Command line interface
  189. The `bin/acorn` utility can be used to parse a file from the command
  190. line. It accepts as arguments its input file and the following
  191. options:
  192. - `--ecma3|--ecma5|--ecma6|--ecma7|--ecma8|--ecma9|--ecma10`: Sets the ECMAScript version
  193. to parse. Default is version 9.
  194. - `--module`: Sets the parsing mode to `"module"`. Is set to `"script"` otherwise.
  195. - `--locations`: Attaches a "loc" object to each node with "start" and
  196. "end" subobjects, each of which contains the one-based line and
  197. zero-based column numbers in `{line, column}` form.
  198. - `--allow-hash-bang`: If the code starts with the characters #! (as
  199. in a shellscript), the first line will be treated as a comment.
  200. - `--allow-await-outside-function`: Allows top-level `await` expressions.
  201. See the `allowAwaitOutsideFunction` option for more information.
  202. - `--compact`: No whitespace is used in the AST output.
  203. - `--silent`: Do not output the AST, just return the exit status.
  204. - `--help`: Print the usage information and quit.
  205. The utility spits out the syntax tree as JSON data.
  206. ## Existing plugins
  207. - [`acorn-jsx`](https://github.com/RReverser/acorn-jsx): Parse [Facebook JSX syntax extensions](https://github.com/facebook/jsx)