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