8个版本
使用旧的Rust 2015
0.5.7 | 2018年10月6日 |
---|---|
0.5.6 | 2018年8月21日 |
0.5.5 | 2017年12月17日 |
0.5.2 | 2017年4月29日 |
0.4.2 | 2016年11月25日 |
#60 in #peg
27KB
108 行
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 | 在语法中 | proc宏(块) | &str 、&[T] 、自定义 |
是 | 是 | 否 |
pest | 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
错误信息会更改,因此仅在最低支持的 Rust 版本上运行 compile-fail
测试,以避免虚假失败。
使用 cargo test
来运行整个套件,或使用 cargo test -- trybuild trybuild=lifetimes.rs
仅测试指定的文件。添加 --features trace
来跟踪这些测试。
依赖关系
~93KB