17 个版本 (5 个破坏性更新)
使用旧的 Rust 2015
0.6.5 | 2016年3月7日 |
---|---|
0.6.4 | 2016年3月4日 |
0.5.0 | 2016年2月24日 |
0.4.3 | 2016年2月23日 |
0.1.1 | 2016年2月8日 |
253 在 解析工具
每月55次 下载
115KB
2K SLoC
ParseLL:Rust 的 LL(1) 流式解析器组合器库
此库的目标是提供解析器组合器,
- 针对 LL(1) 文法进行了优化,
- 支持流式输入,
- 尽可能减少缓冲或复制,
- 尽可能减少动态方法调度。
它基于
- G. Hutton 和 E. Meijer 的 Monadic Parsing in Haskell,JFP 8(4) 第 437-444 页,
- Nom,逐字节吃数据,G. Couprie。
Rustdoc | 视频 | 幻灯片 | Crate | CI
示例
extern crate parsell;
use parsell::{character,Parser,UncommittedStr,StatefulStr};
use parsell::ParseResult::{Done,Continue};
#[allow(non_snake_case)]
fn main() {
// A sequence of alphanumerics, saved in a string buffer
let ALPHANUMERIC = character(char::is_alphanumeric);
let ALPHANUMERICS = ALPHANUMERIC.plus(String::new);
// If you provide unmatching input to the parser, you'll get back a None response:
match ALPHANUMERICS.init_str("!$?") {
None => (),
_ => panic!("Can't happen."),
}
// If you provide complete input to the parser, you'll get back a Done response:
match ALPHANUMERICS.init_str("abc123!") {
Some(Done(result)) => assert_eq!(result, "abc123"),
_ => panic!("Can't happen."),
}
// If you provide incomplete input to the parser, you'll get back a Continue response:
match ALPHANUMERICS.init_str("abc") {
Some(Continue(parsing)) => match parsing.more_str("123!") {
Done(result) => assert_eq!(result, "abc123"),
_ => panic!("Can't happen."),
},
_ => panic!("Can't happen."),
}
}
示例使用 Skeptic 测试。
无运行时依赖
~150KB