50个发布版本
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.1.0 | 2014年11月23日 |
在 解析工具 中排名 25
每月下载量 266,745
用于 少于 164 crates
65KB
782 行
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] 、自定义 |
是 | 是 | 否 |
pest | 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
的错误信息会变化,所以compile-fail
测试只在最低支持的Rust版本上运行,以避免虚假失败。
使用cargo test
来运行整个测试套件,或者使用cargo test -- trybuild trybuild=lifetimes.rs
来仅测试指定的文件。添加--features trace
来跟踪这些测试。
依赖关系
~81KB