2个版本

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

#298 in 解析工具

MIT许可

105KB
2.5K SLoC

Pegy - Rust中的基于derive的解析器

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 在语法中 过程宏(derive) &str, AsyncRead, 自定义
peg 在语法中 过程宏(block) &str, &[T], 自定义
pest 外部 过程宏(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 - 静默:匹配项并返回 ()

依赖项

~1–1.6MB
~34K SLoC