39 个版本
0.9.0-alpha.3 | 2023年6月11日 |
---|---|
0.8.2 | 2023年5月15日 |
0.8.0 | 2022年11月24日 |
0.8.0-alpha.5 | 2022年1月22日 |
0.2.1 | 2018年10月30日 |
#5 in #es
每月51次 下载
用于 5 个 crate(4 个直接使用)
345KB
8K SLoC
RESSA
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的人只需要RESAST
和RESW
,要求他们无谓地也引入RESS
和RESSA
似乎很荒谬。
依赖项
~1.5MB
~27K SLoC