#parser-combinator #input #ctx #str #framework #bounds #error

chonk

轻量级解析器组合框架

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")
)));

有关更多信息,请查看 示例目录,位于 git 仓库 中。

依赖项