6 个版本 (破坏性更新)
0.5.0 | 2020年9月17日 |
---|---|
0.4.0 | 2020年7月29日 |
0.3.1 | 2020年7月29日 |
0.2.0 | 2020年7月24日 |
0.1.0 | 2020年7月22日 |
#181 in 解析工具
每月34次下载
用于 intext
51KB
1K SLoC
Chonk 0.5
轻量级解析器组合框架。
用法
使用 test
方法检查输入是否与解析器匹配
use chonk::prelude::*;
fn parser<'a>() -> impl Parser<'a, &'a str, ()> {
move |ctx| {
take(1.., is(alphabetic)).parse(ctx)
}
}
if parser().test("abcd") {
println!("One or more alphabetic characters found!");
}
使用 parse
方法从输入中提取信息
assert_eq!(parser().parse("foobar"), Ok((
ParserContext {
input: "foobar",
bounds: 0..6,
},
"foobar"
)))
编写带有自定义结果类型的自定义解析器函数
use chonk::prelude::*;
#[derive(Debug, PartialEq)]
enum Token<'a> {
Identifier(&'a str),
}
#[derive(Debug, PartialEq)]
enum Message {
ExpectedIdentifier
}
fn identifier<'a>() -> impl Parser<'a, Token<'a>, Message> {
move |ctx| {
take(1.., is(alphabetic)).parse(ctx)
.map_result(|token| Token::Identifier(token))
.map_error(|error| error.with_message(Message::ExpectedIdentifier))
}
}
assert_eq!(identifier().parse("foobar"), Ok((
ParserContext {
input: "foobar",
bounds: 0..6,
},
Token::Identifier("foobar")
)));