#语法 #解析器生成器 #过程宏 #过程 #表达式 #定义 #递归

二进制 peg-macros

为 rust-peg 提供过程宏。要使用 rust-peg,请参阅 peg 包。

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过程宏

Download history 52072/week @ 2024-04-22 58504/week @ 2024-04-29 55686/week @ 2024-05-06 59769/week @ 2024-05-13 74514/week @ 2024-05-20 66302/week @ 2024-05-27 77860/week @ 2024-06-03 73027/week @ 2024-06-10 74286/week @ 2024-06-17 81618/week @ 2024-06-24 64728/week @ 2024-07-01 63801/week @ 2024-07-08 76213/week @ 2024-07-15 63393/week @ 2024-07-22 61119/week @ 2024-07-29 61129/week @ 2024-08-05

264,558 每月下载量
用于 peg

MIT 许可证

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

另请参阅

开发

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