use super::{Address, Val};
pub enum Op {
Literal(Val),
Push(String),
Pop(String),
For(Address),
If(Address),
Jump(Address),
Return,
Clear,
List,
End,
Print,
Neg,
Exp,
Mul,
Div,
DivInt,
Mod,
Add,
Sub,
Eq,
NotEq,
Lt,
LtEq,
Gt,
GtEq,
Not,
And,
Or,
Xor,
Imp,
Eqv,
}
impl std::fmt::Debug for Op {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.to_string())
}
}
impl std::fmt::Display for Op {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
use Op::*;
match self {
Literal(v) => write!(f, "{}", format!("{:?}", v).to_ascii_uppercase()),
Push(s) => write!(f, "PUSH({})", s),
Pop(s) => write!(f, "POP({})", s),
For(a) => write!(f, "FOR({})", a),
If(a) => write!(f, "IF({})", a),
Jump(a) => write!(f, "JUMP({})", a),
Return => write!(f, "RETURN"),
Clear => write!(f, "CLEAR"),
List => write!(f, "LIST"),
End => write!(f, "END"),
Print => write!(f, "PRINT"),
Neg => write!(f, "NEG"),
Exp => write!(f, "EXP"),
Mul => write!(f, "MUL"),
Div => write!(f, "DIV"),
DivInt => write!(f, "DIVINT"),
Mod => write!(f, "MOD"),
Add => write!(f, "ADD"),
Sub => write!(f, "SUB"),
Eq => write!(f, "EQ"),
NotEq => write!(f, "NOTEQ"),
Lt => write!(f, "LT"),
LtEq => write!(f, "LTEQ"),
Gt => write!(f, "GT"),
GtEq => write!(f, "GTEQ"),
Not => write!(f, "NOT"),
And => write!(f, "AND"),
Or => write!(f, "OR"),
Xor => write!(f, "XOR"),
Imp => write!(f, "IMP"),
Eqv => write!(f, "EQV"),
}
}
}