#解析生成器 #解析错误 #语法 #运行时 #错误报告 #表达式 #解析输入

无需std peg-runtime

为rust-peg语法提供运行时支持。要使用rust-peg,请参阅peg包。

9个版本

0.8.3 2024年4月27日
0.8.2 2023年10月11日
0.8.1 2022年9月26日
0.8.0 2022年1月4日
0.6.0 2019年10月6日

#161解析工具

Download history 52270/week @ 2024-04-22 58687/week @ 2024-04-29 55881/week @ 2024-05-06 59907/week @ 2024-05-13 74502/week @ 2024-05-20 66332/week @ 2024-05-27 77854/week @ 2024-06-03 72982/week @ 2024-06-10 74305/week @ 2024-06-17 81630/week @ 2024-06-24 64736/week @ 2024-07-01 63826/week @ 2024-07-08 76091/week @ 2024-07-15 62545/week @ 2024-07-22 60786/week @ 2024-07-29 60730/week @ 2024-08-05

每月下载量 262,858
用于 416 个包 (3 直接)

MIT 协议

11KB
238

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 外部 proc宏(文件) &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 来跟踪这些测试。

无运行时依赖

功能