#![feature(proc_macro_hygiene)]
#[macro_use]
extern crate nom;
extern crate nom_peg;
use nom_peg::grammar;
#[test]
fn peg_test() {
let arithmetic = grammar! {
parse: i64 = <expr> "="
expr: i64 = <l: product> "+" <r: expr> => { l + r }
| <l: product> "+" <r: expr> => { l - r }
| product
product: i64 = <l: value> "*" <r: product> => { l * r }
| <l: value> "/" <r: product> => { l / r }
| value
value: i64 = ("0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9")+ => { result.join("").parse::<i64>().unwrap() }
| "(" <expr> ")"
};
assert_eq!(arithmetic.parse("123="), Ok(("", 123 as i64)));
assert_eq!(arithmetic.parse("1+1="), Ok(("", 2 as i64)));
assert_eq!(arithmetic.parse("12+(3*7)="), Ok(("", 33 as i64)));
assert_eq!(arithmetic.parse("3*7/2="), Ok(("", 9 as i64)));
let parser = grammar! {
p = &"a"* "a"* => { "yay" }
q: String = a ("b" | "c") => { result.0 }
| a "d" => { result.0 }
a: String = "a"* => { result.join("") }
};
assert_eq!(parser.p("abc"), Ok(("bc", "yay")));
assert_eq!(parser.p("aaaaaaab"), Ok(("b", "yay")));
assert_eq!(parser.q("aaabcc"), Ok(("cc", String::from("aaa"))));
assert_eq!(parser.q("aac"), Ok(("", String::from("aa"))));
}