#![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();
}