10 个版本
| 0.8.4 | 2024 年 7 月 21 日 |
|---|---|
| 0.8.2 | 2023 年 10 月 11 日 |
| 0.8.1 | 2022 年 9 月 26 日 |
| 0.8.0 | 2022 年 1 月 4 日 |
| 0.6.0 | 2019 年 10 月 6 日 |
1707 在 过程宏 中
264,558 每月下载量
用于 peg
340KB
5.5K SLoC
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 | 外部 | 进程宏(文件) | &str |
是 | 否 | 否 |
| nom | 组合子 | 在源代码中 | 库 | &[u8],自定义 |
否 | 是 | 是 |
| lalrpop | LR(1) | 在语法中 | 构建脚本 | &str |
否 | 是 | 否 |
另请参阅
- pegviz是一个用于可视化rust-peg的跟踪输出的用户界面,以调试解析器。
- 存在几个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错误消息会改变,所以只在对最小支持的Rust版本运行compile-fail测试,以避免虚假失败。
使用cargo test来运行整个套件,或者使用cargo test -- trybuild trybuild=lifetimes.rs仅测试指定的文件。添加--features trace来跟踪这些测试。
依赖项
~79KB