#parser-generator #peg #grammar #deprecated #syntax #nightly #extension

废弃 nightly peg-syntax-ext

用于Rust nightly的废弃语法扩展插件。有关其他集成选项,请参阅peg crate。

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

MIT许可证

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

另请参阅

开发

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