9个版本
0.8.3 | 2024年4月27日 |
---|---|
0.8.2 | 2023年10月11日 |
0.8.1 | 2022年9月26日 |
0.8.0 | 2022年1月4日 |
0.6.0 | 2019年10月6日 |
#161 在 解析工具
每月下载量 262,858
用于 416 个包 (3 直接)
11KB
238 行
Rust中的解析表达式语法
rust-peg
是一个简单而灵活的解析生成器,它使编写健壮的解析器变得容易。它基于 解析表达式语法 形式化方法,提供了一个Rust宏,可以从语法的简洁定义中构建递归下降解析器。
功能
- 从
&str
、&[u8]
、&[T]
或自定义类型实现特性中解析输入 - 自定义解析错误报告
- 规则可以接受参数以创建可重用的规则模板
- 前缀/后缀/中缀表达式的优先级提升
- 在语法定义或嵌入的Rust代码中的错误时,提供有用的
rustc
错误信息 - 规则级别的跟踪以调试语法
示例
解析括号内以逗号分隔的数字列表到 Vec<u32>
peg::parser!{
grammar list_parser() for str {
rule number() -> u32
= n:$(['0'..='9']+) {? n.parse().or(Err("u32")) }
pub rule list() -> Vec<u32>
= "[" l:(number() ** ",") "]" { l }
}
}
pub fn main() {
assert_eq!(list_parser::list("[1,1,2,3,5,8]"), Ok(vec![1, 1, 2, 3, 5, 8]));
}
查看测试以获取更多示例
在rustdoc中查看语法规则语法参考
与类似的解析生成器进行比较
crate | 解析器类型 | 操作代码 | 集成 | 输入类型 | 优先级提升 | 参数化规则 | 流输入 |
---|---|---|---|---|---|---|---|
peg | PEG | 语法中 | 过程宏(块) | &str ,&[T] ,自定义 |
是 | 是 | 否 |
害虫 | PEG | 外部 | proc宏(文件) | &str |
是 | 否 | 否 |
nom | 组合器 | 在源代码中 | 库 | &[u8] ,自定义 |
否 | 是 | 是 |
lalrpop | LR(1) | 语法中 | 构建脚本 | &str |
否 | 是 | 否 |
另请参阅
- pegviz 是一个用于可视化 rust-peg 跟踪输出的 UI,以调试解析器。
- 存在几个crate,用于在终端中对源代码片段的诊断消息进行格式化,包括 chic,annotate-snippets,codespan-reporting 和 codemap-diagnostic。
开发
rust-peg 语法是用 rust-peg
编写的: peg-macros/grammar.rustpeg
。为了避免循环依赖,预编译的语法作为 peg-macros/grammar.rs
检入。要重新生成此文件,运行 ./bootstrap.sh
脚本。
有一个大型测试套件,它使用 trybuild
来测试功能(tests/run-pass
)和错误消息(tests/compile-fail
)。因为 rustc
的错误消息会变化,所以 compile-fail
测试只在最低支持的 Rust 版本上运行,以避免虚假失败。
使用 cargo test
来运行整个套件,或 cargo test -- trybuild trybuild=lifetimes.rs
仅测试指定的文件。添加 --features trace
来跟踪这些测试。