606 个版本 (144 个重大更改)
新 0.149.1 | 2024年8月23日 |
---|---|
0.148.3 | 2024年8月1日 |
0.148.1 | 2024年7月21日 |
0.143.11 | 2024年3月26日 |
0.5.4 | 2018年11月26日 |
161 在 解析实现 中
183,396 每月下载量
用于 290 个crate(101 个直接使用)
2.5MB
70K SLoC
Rust编程语言的EcmaScript/TypeScript解析器。
功能
高度测试
通过几乎所有来自 tc39/test262 的测试。
错误报告
error: 'implements', 'interface', 'let', 'package', 'private', 'protected', 'public', 'static', or 'yield' cannot be used as an identifier in strict mode
--> invalid.js:3:10
|
3 | function yield() {
| ^^^^^
错误恢复
解析器可以从某些解析错误中恢复。例如,对于下面的代码,解析器返回 Ok(Module)
,同时向处理器发出错误。
const CONST = 9000 % 2;
const enum D {
// Comma is required, but parser can recover because of the newline.
d = 10
g = CONST
}
示例(词法分析器)
请参阅示例目录中的 lexer.rs
。
示例(解析器)
#[macro_use]
extern crate swc_common;
extern crate swc_ecma_parser;
use swc_common::sync::Lrc;
use swc_common::{
errors::{ColorConfig, Handler},
FileName, FilePathMapping, SourceMap,
};
use swc_ecma_parser::{lexer::Lexer, Parser, StringInput, Syntax};
fn main() {
let cm: Lrc<SourceMap> = Default::default();
let handler =
Handler::with_tty_emitter(ColorConfig::Auto, true, false,
Some(cm.clone()));
// Real usage
// let fm = cm
// .load_file(Path::new("test.js"))
// .expect("failed to load test.js");
let fm = cm.new_source_file(
FileName::Custom("test.js".into()).into(),
"function foo() {}".into(),
);
let lexer = Lexer::new(
// We want to parse ecmascript
Syntax::Es(Default::default()),
// EsVersion defaults to es5
Default::default(),
StringInput::from(&*fm),
None,
);
let mut parser = Parser::new_from(lexer);
for e in parser.take_errors() {
e.into_diagnostic(&handler).emit();
}
let _module = parser
.parse_module()
.map_err(|mut e| {
// Unrecoverable fatal error occurred
e.into_diagnostic(&handler).emit()
})
.expect("failed to parser module");
}
Cargo功能
typescript
启用TypeScript解析器。
verify
使用 swc_ecma_visit
验证更多错误。
已知问题
在 \
后面有null字符
由于Rust的 [String] 应仅包含有效的UTF-8字符,而JavaScript允许非UTF-8字符,因此解析器将无效的UTF-8字符存储为转义形式。
因此,swc需要一种方法来区分无效的UTF-8代码点和用户指定的输入。解析器在 \\
后面存储一个null字符以表示非UTF-8代码点。请注意,swc的其他部分已经知道这一点。
请注意,这可以随时通过破坏性更改进行更改。
依赖项
~5–16MB
~180K SLoC