2015-09-11 06:08:20 -04:00
|
|
|
use std::fmt::{Debug, Formatter, Error};
|
|
|
|
|
|
|
|
pub enum Expr {
|
|
|
|
Number(i32),
|
|
|
|
Op(Box<Expr>, Opcode, Box<Expr>),
|
2016-11-15 09:03:22 +01:00
|
|
|
Error,
|
2015-09-11 06:08:20 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Copy, Clone)]
|
|
|
|
pub enum Opcode {
|
|
|
|
Mul,
|
|
|
|
Div,
|
|
|
|
Add,
|
|
|
|
Sub,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Debug for Expr {
|
|
|
|
fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
|
|
|
|
use self::Expr::*;
|
|
|
|
match *self {
|
|
|
|
Number(n) => write!(fmt, "{:?}", n),
|
|
|
|
Op(ref l, op, ref r) => write!(fmt, "({:?} {:?} {:?})", l, op, r),
|
2016-11-15 09:03:22 +01:00
|
|
|
Error => write!(fmt, "error"),
|
2015-09-11 06:08:20 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Debug for Opcode {
|
|
|
|
fn fmt(&self, fmt: &mut Formatter) -> Result<(), Error> {
|
|
|
|
use self::Opcode::*;
|
|
|
|
match *self {
|
|
|
|
Mul => write!(fmt, "*"),
|
|
|
|
Div => write!(fmt, "/"),
|
|
|
|
Add => write!(fmt, "+"),
|
|
|
|
Sub => write!(fmt, "-"),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|