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 中使用

MIT 许可证

545KB
16K SLoC

Ezno的解析器

包含"字符串到AST"的解析器、AST定义、AST转回文本/字符串形式的方法以及遍历/访问AST的钩子。用于ezno-checker和Ezno工具链。

parser lines of code crates.io badge docs.rs badge

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:#?}");
	}
}

还可以查看其他解析器,如boabiomeoxcswc

目标

  • 保持代码行数在15k以下(不包括/tests/examples文件夹)
  • 易于使用的API(请参阅/tests/examples文件夹中的示例用法)
  • 在WASM上运行
  • 保持可读性和可维护性
  • 专为分析和转换而设计
    • 可以使用表达式标识符来绑定信息
    • 保留源位置以用于分析诊断和生成源映射
    • 所有AST都应该是可访问的。不可变地收集事实或可变地转换/删除
  • 通过配置可选地扩展ECMAScript语言定义
    • TypeScript类型注解 - 接口、枚举和类型别名语句 - 参数、返回类型和变量注解 - satisfiesas 😑
    • JSX支持 - 包括HTML注释,对自闭合标签的特殊处理
    • 其他功能在feature = "extras"下 👀
  • 转换和访问
    • 请参阅示例
    • ezno-parser-visitable-derive是一个宏,它自动/生成访问实现的代码
    • 生成器宏还使创建AST变得简单。请参阅示例
  • 源代码中的位置
    • 所有语法都参考其在源代码中的位置,使用一个 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