#parser-generator #proc-macro #lemon #yacc #bison

no-std pomelo

Implementation of the Lemon parser generator as a Rust procedural macro

7 releases

0.1.5 Jan 8, 2021
0.1.4 Mar 17, 2020
0.1.3 Aug 21, 2019
0.1.2 Jul 12, 2019
0.0.1 Jun 12, 2019

#48 in Parser tooling

Download history 2567/week @ 2024-07-19 2642/week @ 2024-07-26 2629/week @ 2024-08-02 2909/week @ 2024-08-09 4258/week @ 2024-08-16 4379/week @ 2024-08-23 3938/week @ 2024-08-30 4151/week @ 2024-09-06 4412/week @ 2024-09-13 4500/week @ 2024-09-20 5819/week @ 2024-09-27 5246/week @ 2024-10-04 4163/week @ 2024-10-11 4734/week @ 2024-10-18 4578/week @ 2024-10-25 4415/week @ 2024-11-01

19,090 downloads per month
Used in 14 crates (4 directly)

MIT/Apache

135KB
2K SLoC

pomelo

A procedural macro to create Lemon-like parsers.

Travis-CI Status Latest version Documentation

Pomelo is a port to Rust of the Lemon Parser Generator (from now on, Lemon_C) originally written by D. Richard Hipp for his SQLite parser. It is based on a previous attempt to port Lemon to Rust (Lemon_Rust), but now it is written as a Rust procedural macro, so it does not contain any of the original C code (although it uses the same algorithms). Thus the change in name to a different citrus fruit.

Getting Started

It is recommended to go to crates.io for the newest released version, as well as links to the newest builds of the docs.

Just add the following dependency to your Cargo manifest:

[dependencies]
pomelo = "*"

Example

use pomelo::pomelo;

pomelo! {
    %type input Vec<i32>;
    %type numbers Vec<i32>;
    %type Number i32;

    input ::= numbers?(A) { A.unwrap_or_else(Vec::new) };
    numbers ::= Number(N) { vec![N] }
    numbers ::= numbers(mut L) Comma Number(N) { L.push(N); L }
}
fn main() -> Result<(), ()> {
    use parser::{Parser, Token};
    //Real world code would use a tokenizer
    let tokens = vec![
        Token::Number(1),
        Token::Comma,
        Token::Number(2),
        Token::Comma,
        Token::Number(3),
    ];
    let mut p = Parser::new();
    for tok in tokens.into_iter() {
        p.parse(tok)?;
    }
    let data = p.end_of_input()?;
    assert_eq!(data, vec![1, 2, 3]);
    Ok(())
}

See more examples in the github repo folder.

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~1.5MB
~37K SLoC