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解析实现

Download history 47818/week @ 2024-05-03 51297/week @ 2024-05-10 56433/week @ 2024-05-17 52888/week @ 2024-05-24 46795/week @ 2024-05-31 52469/week @ 2024-06-07 47105/week @ 2024-06-14 50802/week @ 2024-06-21 46399/week @ 2024-06-28 42015/week @ 2024-07-05 42021/week @ 2024-07-12 44386/week @ 2024-07-19 43007/week @ 2024-07-26 42588/week @ 2024-08-02 48896/week @ 2024-08-09 40677/week @ 2024-08-16

183,396 每月下载量
用于 290 个crate(101 个直接使用)

Apache-2.0

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