use oak::oak;
oak! {
r = "a" r
/ "b"
factor
= integer
/ unary_arith_expr
unary_arith_expr
= "+" factor > id
/ "-" factor > make_neg_expr
integer
= ["0-9"]+ > make_integer
use std::str::FromStr;
pub enum Expr {
Number(u64),
NegExpr(PExpr)
}
pub type PExpr = Box<Expr>;
fn id(e: PExpr) -> PExpr { e }
fn make_integer(raw_number: Vec<char>) -> PExpr {
match u64::from_str(&*to_string(raw_number)).ok() {
Some(x) => Box::new(Expr::Number(x)),
None => panic!("int literal is too large")
}
}
fn to_string(raw_text: Vec<char>) -> String {
raw_text.into_iter().collect()
}
fn make_neg_expr(expr: PExpr) -> PExpr {
Box::new(Expr::NegExpr(expr))
}
}