right.value.length() - 1)
+ "\"";
else
ret.value = left.value + " + " + right.value;
} 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 {
throw new ExpressionError(left.type + " and "
+ right.type + " can not do arithmetic.");
}
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 {
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;
}