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

Download history 57369/week @ 2024-05-03 59088/week @ 2024-05-10 72729/week @ 2024-05-17 68637/week @ 2024-05-24 75805/week @ 2024-05-31 74406/week @ 2024-06-07 73368/week @ 2024-06-14 80919/week @ 2024-06-21 70638/week @ 2024-06-28 62453/week @ 2024-07-05 65560/week @ 2024-07-12 74200/week @ 2024-07-19 61980/week @ 2024-07-26 61404/week @ 2024-08-02 64603/week @ 2024-08-09 64430/week @ 2024-08-16

每月下载量 266,745
用于 少于 164 crates

MIT 许可证 MIT

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

另请参阅

开发

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