pomelo 0.2.3

Implementation of the Lemon parser generator as a Rust procedural macro
Documentation
use pomelo::*;

pomelo! {
    %syntax_error { Err(()) }
    %type input i32;
    %type Two i32;
    input ::= One Two?(X) Three Two?(Y) Four end? { X.unwrap_or(1) + Y.unwrap_or(1) }
    end ::= End;
}

use parser::*;

#[test]
fn without_optional() -> Result<(), ()> {
    let mut parse = Parser::new();
    parse.parse(Token::One)?;
    parse.parse(Token::Three)?;
    parse.parse(Token::Four)?;
    let res = parse.end_of_input()?;
    assert_eq!(res, 2);
    Ok(())
}

#[test]
fn with_optional() -> Result<(), ()> {
    let mut parse = Parser::new();
    parse.parse(Token::One)?;
    parse.parse(Token::Two(42))?;
    parse.parse(Token::Three)?;
    parse.parse(Token::Two(24))?;
    parse.parse(Token::Four)?;
    parse.parse(Token::End)?;
    let res = parse.end_of_input()?;
    assert_eq!(res, 42 + 24);
    Ok(())
}