Exp类提供了计算器的核心运算代码,Calc类提供了swing界面。
支持进制转换,常用函数,数学常量等功能。
Exp的init初始化时准备好运算符(符号+优先级)、函数(参数个数)、常量(+值)、进制等
// 添加运算符,(符号,优先级,类型)
addOperator("+", 1, OperatorTypes.ADD);
// 添加函数,(函数名,参数个数,类型)
addFunction("abs", 1, FunctionTypes.ABS);
// 添加常量,(常量名,数值)
addConstants("pi", Math.PI);
// 设置进制radix
radix.put(Carriage.HEX, 16);
parse是Exp的核心算法,逐个解析exp表达式的字符,识别并加入堆栈operators和operands,并在合适的时候弹出值执行计算。
public Exp parse() throws ExpException {
if (exp == null) { throw new ExpException("No Expression"); }
operators.clear();
operands.clear();
TokenTypes lastTokenType = null;
for (int i = 0; i < exp.length(); i++) {
if (exp.charAt(i) == '(') {// 左括号
if ((lastTokenType != null)// (1+1)
&& (lastTokenType != TokenTypes.OPERATOR)// 3-(1+1)
&& (lastTokenType != TokenTypes.FUNCTION)) {// sin(1)
throw new ExpException(
"Left parenthese should follow an operator");
} else {
operators.push(String.valueOf('('));
lastTokenType = TokenTypes.LEFTP;
}
} else if (exp.charAt(i) == ')') {// 右括号
if (!operators.contains("(")) {// 没有左括号则异常
throw new ExpException("Miss left parenthese");
} else {