2个版本
0.1.2 | 2023年11月9日 |
---|---|
0.1.1 | 2023年10月24日 |
0.1.0 |
|
#298 in 解析工具
105KB
2.5K SLoC
Pegy - Rust中的基于derive的解析器
特性
- 基于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