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