package fr.umlv.poo.visitor;

public class BinOp implements Expr {
  public enum Operator {
    ADD("+"), SUB("-"), MUL("*"), DIV("/");
    
    private final String op;
    
    private Operator(String op) {
      this.op = op;
    }
    
    public String getOp() {
      return op;
    }
  }
  
  private final Operator operator;
  private final Expr left;
  private final Expr right;
  
  public BinOp(Operator operator, Expr left, Expr right) {
    this.operator = operator;
    this.left = left;
    this.right = right;
  }
  
  public Operator getOperator() {
    return operator;
  }
  public Expr getLeft() {
    return left;
  }
  public Expr getRight() {
    return right;
  }
  
  @Override
  public int eval() {
    int leftValue = left.eval();
    int rightValue = right.eval();
    switch(operator) {
    case ADD:
      return leftValue + rightValue;
    case SUB:
      return leftValue - rightValue;
    case MUL:
      return leftValue * rightValue;
    default:
      throw new AssertionError("invalid operator " + operator);
    }
  }
}
