14个版本
0.1.5 | 2024年5月31日 |
---|---|
0.1.3 | 2024年1月3日 |
0.1.2 | 2023年12月20日 |
0.1.1 | 2023年11月20日 |
0.0.3 | 2023年3月20日 |
#1211 in 解析器实现
在 3 crates 中使用
545KB
16K SLoC
Ezno的解析器
包含"字符串到AST"的解析器、AST定义、AST转回文本/字符串形式的方法以及遍历/访问AST的钩子。用于ezno-checker
和Ezno工具链。
use ezno_parser::{ASTNode, Expression};
fn main() {
let expressions = [
"4 + 2 * 5",
"4 * 2 + 5",
"4 * 2 * 5",
"console.log(4 * 2, t ? true : `Hi`) == 2 && 4 == 2",
];
for expression in expressions {
let expression = Expression::from_string(expression.to_owned(), Default::default());
println!("{expression:#?}");
}
}
目标
- 保持代码行数在15k以下(不包括
/tests
和/examples
文件夹) - 易于使用的API(请参阅
/tests
和/examples
文件夹中的示例用法) - 在WASM上运行
- 保持可读性和可维护性
- 专为分析和转换而设计
- 可以使用表达式标识符来绑定信息
- 保留源位置以用于分析诊断和生成源映射
- 所有AST都应该是可访问的。不可变地收集事实或可变地转换/删除
- 通过配置可选地扩展ECMAScript语言定义
- TypeScript类型注解 - 接口、枚举和类型别名语句 - 参数、返回类型和变量注解 -
satisfies
和as
😑 - JSX支持 - 包括HTML注释,对自闭合标签的特殊处理
- 其他功能在
feature = "extras"
下 👀
- TypeScript类型注解 - 接口、枚举和类型别名语句 - 参数、返回类型和变量注解 -
- 转换和访问
- 源代码中的位置
- 所有语法都参考其在源代码中的位置,使用一个 Span。这使用了 source-map crate crate,这使得构建源映射变得非常简单。
- 部分AST
- 大多数解析器需要有效输入。然而,在某个选项下,你可以启用一个选项,为可能缺少表达式的情况添加标记节点。这允许需要AST的工具与仍在编辑中的源代码一起工作(例如在LSP中)。
- 它检查两种情况,如果遇到以下任一情况,则添加标记节点:(1)表达式是否以
)
等结束(在if
等中很有用)或(2)下一个标记是否是const
等并且位于下一行。
- 输出
- 可以使用
ToStringOptions { include_types: false, ..Default::default() }
从输出中移除类型注释。 - 在
pretty: true
下添加缩进,对于生产构建不添加空格。 - 支持源映射映射生成
- 可以使用
非目标
- CSTs、接近源的操作等
- 带有不平衡括号/括号的源
- 为了微小的速度提升而增加代码大小或降低可读性
测试
如果主要根目录而不是此文件夹,请在以下命令中的
-p ezno-parser
后添加cargo run
。
用于测试解析器是否可以扫描文件
cargo run --example lex path/to/file.js
和解析
cargo run --example parse path/to/file.js
注意,Ezno CLI 包含
ast-playground
子命令:这些命令的更用户友好的版本。
依赖关系
~0.6–8MB
~66K SLoC