#grammar #parser #parser-generator #peg

pegy-derive

基于 derive 的解析生成器

3 个版本

0.1.2 2023年11月9日
0.1.1 2023年10月24日
0.1.0 2023年10月24日

#57 in #peg


pegy 中使用

MIT 许可证

32KB
696

Pegy - 基于 derive 的 Rust 解析器

Docs Crates.io Crates.io

特性

  • 基于 derive 的解析生成
  • 异步解析 API
  • 从 str、异步读取器或自定义输入类型解析输入。
  • 运行时生成 AST
  • 对语法定义中的错误提供有意义的错误信息
  • 支持 no_std

MSRV

当前支持的 MSRV 是 1.75

示例

use pegy::Parse;

#[derive(Debug, Default, Parse)]
#[grammar($item0:['a'-'z''A'-'Z''0'-'9'])]
pub struct AlphaDigit(char);

#[derive(Debug, Default, Parse)]
#[grammar($item0:['0'-'9'])]
pub struct Digit(char);

#[derive(Debug, Default, Parse)]
#[grammar(!Digit $item0:AlphaDigit+)]
pub struct Ident(Vec<AlphaDigit>);

pub fn main(){
    let re: pegy::Result<Ident> = pegy::parse_blocking::<Ident, _>("myIdent");
    assert!(re.is_ok());
}

与类似特质的比较

crate 操作代码 集成 输入类型 流输入
pegy 在语法中 proc 宏(derive) &str, AsyncRead, 自定义
peg 在语法中 proc 宏(block) &str, &[T], 自定义
pest 外部 proc 宏(file) &str

表达式参考

  • "some string" - 字符串字面量:匹配 str 切片。返回 &'static str
  • 'c' - 字符字面量:匹配一个字符。返回 char
  • Ident - 规则:匹配一个解析规则。它必须是一个有效的类型,并实现 pegy::Parse。返回 Ident 类型。
  • ['a'-'z''A'-'Z''$'] - 字符类别:匹配字符范围。返回 char

量词

  • ? - 可选:匹配零个或一个项。返回 Option<T>
  • * - 重复:匹配零个或多个项。返回 Vec<T>
  • + - 至少重复:匹配一个或多个项。返回 Vec<T>
  • {min, max} - 重复范围:至少匹配 min 个项,最多匹配 max 个项。返回 Vec<T>

特殊

  • $ident:term - 字段绑定:将项的结果绑定到结果的字段 ident。返回 ()
  • ( alternatives ) - 组:匹配项并返回一个 Span
  • terms | terms | terms - 可选:尝试匹配第一个项,如果失败,则匹配第二个,依此类推,直到找到匹配。返回一个 Span
  • !term - 负向前瞻:匹配项而不消耗任何字符。
  • _ term - 静默:匹配项并返回 ()

依赖

~280–730KB
~17K SLoC