use std::ops::{Add, Mul, Neg, Not, Sub}; use crate::binary_repr::BinaryRepr; pub enum BinOp { Plus, Sub, Mul, Div, } pub enum UnaryOp { Not, Neg, } pub enum Expr { Constant(BinaryRepr), BinaryOp(Box, BinOp, Box), UnaryOp(UnaryOp, Box), Group(Box), } impl Expr { pub fn into_binary_repr(self) -> BinaryRepr { match self { Self::Constant(binary_repr) => binary_repr, Self::BinaryOp(expr, bin_op, expr1) => { (match bin_op { BinOp::Plus => ::add, BinOp::Sub => ::sub, BinOp::Mul => ::mul, BinOp::Div => todo!(), })(expr.into_binary_repr(), expr1.into_binary_repr()) } Self::UnaryOp(unary_op, expr) => (match unary_op { UnaryOp::Neg => ::neg, UnaryOp::Not => ::not, })(expr.into_binary_repr()), Self::Group(group) => group.into_binary_repr(), } } }