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