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

chonk

A lightweight parser combinator framework

6 releases (breaking)

0.5.0 Sep 17, 2020
0.4.0 Jul 29, 2020
0.3.1 Jul 29, 2020
0.2.0 Jul 24, 2020
0.1.0 Jul 22, 2020

#181 in Parser tooling

34 downloads per month
Used in intext

Custom license

51KB
1K SLoC

Chonk 0.5

A lightweight parser combinator framework.

Usage

Use the test method to see if your input matches a parser:

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

Use the parse method to extract information from your input:

assert_eq!(parser().parse("foobar"), Ok((
    ParserContext {
        input: "foobar",
        bounds: 0..6,
    },
    "foobar"
)))

Write your own parser functions with custom result types:

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

For more information, look in the examples directory in the git repository.

Dependencies