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