pest 0.2.1

Elegant, efficient grammars
Documentation
#![recursion_limit = "500"]

#[macro_use]
extern crate pest;

use std::collections::LinkedList;

use pest::prelude::*;

#[derive(Debug, PartialEq)]
pub enum Expression {
    Paren(Box<Expression>),
    Letters(LinkedList<char>)
}

impl_rdp! {
    grammar! {
        expression = _{ paren | letter }
        paren      =  { ["("] ~ expression ~ [")"] }
        letter     =  { ['a'..'z'] }
    }

    process! {
        (&self) -> Expression {
            (&letter: letter) => {
                let mut list = LinkedList::new();

                list.push_back(letter.chars().next().unwrap());

                Expression::Letters(list)
            },
            (_: paren, @expression) => {
                Expression::Paren(Box::new(expression))
            }
        }
    }
}

#[test]
fn expression() {
    let mut parser = Rdp::new(StringInput::new("((z))"));

    assert!(parser.expression());
    parser.process();
}