#[derive(PartialEq)]
pub enum Expr<Atom, Operator> {
Atom(Atom),
UnExpr {
item: Box<Expr<Atom, Operator>>,
op: Operator,
},
BinExpr {
left: Box<Expr<Atom, Operator>>,
op: Operator,
right: Box<Expr<Atom, Operator>>,
},
TreExpr {
left: Box<Expr<Atom, Operator>>,
lop: Operator,
middle: Box<Expr<Atom, Operator>>,
rop: Operator,
right: Box<Expr<Atom, Operator>>,
}
}
use std::fmt;
impl<Atom, Operator> fmt::Debug for Expr<Atom, Operator>
where Atom: fmt::Debug, Operator: fmt::Debug {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use expr::Expr::*;
match *self {
Atom(ref a) => write!(f, "A({:?})", a),
UnExpr {
ref item,
ref op
} => write!(f, "U({:?} {:?})", op, item),
BinExpr {
ref left,
ref op,
ref right
} => write!(f, "B({:?} {:?} {:?})", left, op, right),
TreExpr{
ref left,
ref lop,
ref middle,
ref rop,
ref right
} => write!(f, "{:?} {:?} {:?} {:?} {:?}",
left, lop, middle, rop, right),
}
}
}