3 个版本
0.1.2 | 2023年11月9日 |
---|---|
0.1.1 | 2023年10月24日 |
0.1.0 | 2023年10月24日 |
#57 in #peg
在 pegy 中使用
32KB
696 行
Pegy - 基于 derive 的 Rust 解析器
特性
- 基于 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