public class BinOpNode extends Node
{
public TokenType op;
public Node left;
public Node right;
public BinOpNode() {}
public BinOpNode(TokenType op, Node left, Node right)
{
this.op = op;
this.left = left;
this.right = right;
}
public int ToInt(Node node)
{
Object res = node.eval();
return ((Integer) res).intValue();
}
public boolean ToBoolean(Node node)
{
Object res = node.eval();
return ((Boolean) res).booleanValue();
}
public Object ToObject(Node node)
{
return node.eval();
}
public Object eval()
{
Object result = null;
switch(op)
{
case ADD:
result = new Integer(ToInt(left) + ToInt(right));
break;
case SUBTRACT:
result = new Integer(ToInt(left) - ToInt(right));
break;
case MULTIPLY:
result = new Integer(ToInt(left) * ToInt(right));
break;
case DIVIDE:
if (ToInt(right) == 0)
{
System.out.println("Error: Division by Zero!");
System.exit(0);
}
result = new Integer(ToInt(left) / ToInt(right));
break;
case LESS:
result = new Boolean(ToInt(left) < ToInt(right));
break;
case GREATER:
result = new Boolean(ToInt(left) > ToInt(right));
break;
// != and == work as equal and !equal for strings
case EQUAL:
result = new Boolean(ToObject(left).equals(ToObject(right)));
break;
case NOTEQUAL:
result = new Boolean(!ToObject(left).equals(ToObject(right)));
break;
case LESSEQUAL:
result = new Boolean(ToInt(left) <= ToInt(right));
break;
case GREATEREQUAL:
result = new Boolean(ToInt(left) >= ToInt(right));
break;
case OR:
result = new Boolean(ToBoolean(left) || ToBoolean(right));
break;
case AND:
result = new Boolean(ToBoolean(left) && ToBoolean(right));
break;
}
return result;
}
}