39 个版本

0.9.0-alpha.32023年6月11日
0.8.2 2023年5月15日
0.8.0 2022年11月24日
0.8.0-alpha.52022年1月22日
0.2.1 2018年10月30日

#5 in #es

Download history 38/week @ 2024-03-11 61/week @ 2024-03-18 47/week @ 2024-03-25 143/week @ 2024-04-01 25/week @ 2024-04-08 24/week @ 2024-04-15 72/week @ 2024-04-22 47/week @ 2024-04-29 37/week @ 2024-05-06 24/week @ 2024-05-13 15/week @ 2024-05-20 9/week @ 2024-05-27 26/week @ 2024-06-03 20/week @ 2024-06-10 5/week @ 2024-06-24

每月51次 下载
用于 5 个 crate(4 个直接使用)

MIT 许可证

345KB
8K SLoC

RESSA

Rust

crates.io last commit master

Rust EcmaScript 语法分析器

本项目是系列 crate 的一部分,旨在帮助开发者使用 Rust 编程语言创建 JavaScript 开发工具。 Rusty ECMA 详情

用户将交互的两个主要部分是 Parser 结构体和由 resast 定义的枚举

解析器

解析器结构体将是将文本转换为 AST 的主要方式。方便的是 Parser 实现了 Iterator over Result<ProgramPart, Error>,这意味着您可以按从上到下的顺序分块评估您的 JS。

注意:默认情况下,Parser 将无法处理 js 模块功能,有关如何解析 js 模块的详细信息,请参阅 模块示例

迭代器示例

use resast::prelude::*;
use ressa::*;

fn main() {
    let js = "function helloWorld() { alert('Hello world'); }";
    let p = Parser::new(&js).unwrap();
    let f = ProgramPart::decl(Decl::Func(Func {
        id: Some(Ident::from("helloWorld")),
        params: vec![],
        body: FuncBody(vec![ProgramPart::Stmt(Stmt::Expr(Expr::Call(CallExpr {
            callee: Box::new(Expr::ident_from("alert")),
            arguments: vec![Expr::Lit(Lit::String(StringLit::Single(Cow::Owned(
                "Hello world".to_string(),
            ))))],
        })))]),
        generator: false,
        is_async: false,
    }));
    for part in p {
        assert_eq!(part.unwrap(), f);
    }
}

Parser 交互的另一种方式是利用 parse 方法。此方法将遍历所有找到的 ProgramParts 并将它们收集到 Program 中,

解析示例

use ressa::{
    Parser,
};
use resast::ref_tree::prelude::*;
fn main() {
    let js = "
function Thing() {
    return 'stuff';
}
";
    let mut parser = Parser::new(js).expect("Failed to create parser");
    let program = parser.parse().expect("Unable to parse text");
    match program {
        Program::Script(_parts) => println!("found a script"),
        Program::Mod(_parts) => println!("found an es6 module"),
    }
}

一旦您到达 Program 的内部 parts,您将有一个 Vec<ProgramPart>,它将像 迭代器示例 一样操作

Rusty ECMA 详情

Rust ECMA Crates

为什么这么多?

尽管每个crate提供的内容与其他crate紧密相连,但主要目标是提供最大的可定制性。例如,编写fuzzer的人只需要RESASTRESW,要求他们无谓地也引入RESSRESSA似乎很荒谬。

依赖项

~1.5MB
~27K SLoC