Ezno's Parser
Contains "string to AST" parser, AST definitions, AST back to text/string form methods and hooks for traversing/visiting AST. Used in ezno-checker and the Ezno toolchain.
use ;
Also checkout other parsers such as boa, biome, oxc and swc.
Goals
- Keep under 15k lines of code (excluding
/testsand/examplesfolders) - Easy to use API (see
/testsand/examplesfolders for example usage) - Run in WASM
- Keep readable and maintainable
- Designed for analysis and transformations
- See expression identifiers can be used to bind information to
- Retain source positions for use in analysis diagnostics and generating source maps
- All AST should be visitable. Immutably to collect facts or mutable to transform/remove
- Optionally via configuration extend the ECMAScript language definition
- TypeScript type annotations
- Interfaces, enums and type alias statements
- Parameter, return type and variable annotations
-
satisfiesandas😑 - JSX support - Includes HTML comments, special handing of self closing tags from the specification
- Others under
feature = "extras"👀
- TypeScript type annotations
- Interfaces, enums and type alias statements
- Parameter, return type and variable annotations
-
- Transformation and visiting
- See example
ezno-parser-visitable-deriveis a macro that automates/generates the visiting implementation- The generator macro also makes creating AST easy. See example
- Positions in source
- All syntax has reference to where it was in the source using a Span. This uses the source-map crate crate which makes it trivial to build source maps.
- Partial AST
- Most of the parser requires valid input. However under a option you can enable a option which can add marked nodes for cases where a expression might be missing. This allows tools that require an AST to work with a source that is still being edited (such as in a LSP).
- It checks two cases, if either of these cases is encountered, then it adds a marker node: (1) Whether the expression ends in
)etc (useful inifetc) or (2) Whether the next token isconstetc and on the next line
- Output
- Stripping type annotations can be stripped from output using
ToStringOptions { include_types: false, ..Default::default() } - Adding indentation under
pretty: true, not adding whitespace for production builds - Setting
max_line_lengthto a size to wrap certain structures - Support for source map mapping generation
- Stripping type annotations can be stripped from output using
Non-goals
- CSTs, close to source operations etc
- Source with unbalanced parenthesis/brackets
- Increase code size or decrease readability for minor speed improvements
Testing
If in main root rather than this folder, add
-p ezno-parseraftercargo runto the following commands.
For testing whether the parser can lex a file
cargo run --example lex path/to/file.js
and parse
cargo run --example parse path/to/file.js
Note the Ezno CLI includes the
ast-playgroundsubcommand: a more user oriented version of these commands