if (left.type == STRING || right.type == STRING) {
ret.type = STRING;
if (f.value.equals("+")) {
ret.value = getStringArithmeticResult(left, right);
} else {
throw new ExpressionError("The operation is not supported: " + left.type + " " + f.value + " " + right.type);
}
} else if (left.type == DOUBLE || right.type == DOUBLE) {
ret.type = DOUBLE;
ret.value = getFloatArithmeticResult(left, right, f.value, false);
} else if (left.type == FLOAT || right.type == FLOAT) {
ret.type = FLOAT;
ret.value = getFloatArithmeticResult(left, right, f.value, true);
} else if (left.type == LONG || right.type == LONG) {
ret.type = LONG;
ret.value = getIntegerArithmeticResult(left, right, f.value, false);
} else if (left.type == INTEGER || right.type == INTEGER) {
ret.type = INTEGER;
ret.value = getIntegerArithmeticResult(left, right, f.value, true);
} else {
if (f.value.equals("+")) {
ret.type = STRING;
ret.value = getStringArithmeticResult(left, right);
} else if (f.value.equals("/")) {
ret.type = DOUBLE;
ret.value = getFloatArithmeticResult(left, right, f.value, false);
} else {
ret.type = LONG;
ret.value = getIntegerArithmeticResult(left, right, f.value, false);
}
}
break;
case LOGICAL_OPERATOR:
ret.type = BOOLEAN;
ret.value = getLogicalResult(left, right, f.value);
if (ret.value == null)
throw new ExpressionError("The operation is not supported: " + left.type + " " + f.value + " " + right.type);
break;
case ARITHMETIC_OR_LOGICAL_OPERATOR:
if (left.type == LONG || right.type == LONG) {
ret.type = LONG;
ret.value = getIntegerArithmeticResult(left, right, f.value, false);
} else if (left.type == INTEGER || right.type == INTEGER) {
ret.type = INTEGER;
ret.value = getIntegerArithmeticResult(left, right, f.value, true);
} else {
ret.type = BOOLEAN;
ret.value = getLogicalResult(left, right, f.value);
}
if (ret.value == null)
throw new ExpressionError("The operation is not supported: " + left.type + " " + f.value + " " + right.type);
break;
case CONDITIONAL_OPERATOR:
ret.type = BOOLEAN;
if (f.value.equals("==") || f.value.equals("!=")) {
ret.value = getEqResult(left, right, f.value);
} else {
if (left.type == DOUBLE || right.type == DOUBLE) {
ret.value = getFloatArithmeticResult(left, right, f.value, false);
} else if (left.type == FLOAT || right.type == FLOAT) {
ret.value = getFloatArithmeticResult(left, right, f.value, true);
} else if (left.type == LONG || right.type == LONG) {
ret.value = getIntegerArithmeticResult(left, right, f.value, false);
} else if (left.type == INTEGER || right.type == INTEGER) {
ret.value = getIntegerArithmeticResult(left, right, f.value, true);
} else if (left.type == VARIABLE && right.type == VARIABLE) {
left.value = getVariable(left.value, "Comparable");
right.value = right.type == VARIABLE ? getVariable(right.value, "Comparable") : right.value;
ret.value = left.value + ".compareTo(" + right.value + ") " + f.value + " 0";
} else {
throw new ExpressionError(left.type + " and " + right.type + " can not do arithmetic.");
}
}
break;
default:
throw new ExpressionError("The operation is not supported: " + left.value + " " + f.value + " " + right.value);
}
d.push(ret);
} else {
d.push(f);
}
}
if (d.size() != 1)
throw new ExpressionError("RPN error: " + content);
return d.pop().value;
}