All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.segoia.util.calculator.Calculator Maven / Gradle / Ivy

The newest version!
/**
 * commons - Various Java Utils
 * Copyright (C) 2009  Adrian Cristian Ionescu - https://github.com/acionescu
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.segoia.util.calculator;

import java.util.HashMap;
import java.util.Map;

import net.segoia.util.calculator.event.MathExpressionParserEventHandler;
import net.segoia.util.calculator.operators.AddOperator;
import net.segoia.util.calculator.operators.ConstantOperator;
import net.segoia.util.calculator.operators.DecimalLogarithmOperator;
import net.segoia.util.calculator.operators.DivideOperator;
import net.segoia.util.calculator.operators.MultiplyOperator;
import net.segoia.util.calculator.operators.NaturalLogarithmOperator;
import net.segoia.util.calculator.operators.Operator;
import net.segoia.util.calculator.operators.PowerOperator;
import net.segoia.util.calculator.operators.SqrtOperator;
import net.segoia.util.calculator.operators.SubtractOperator;
import net.segoia.util.parser.Parser;
import net.segoia.util.parser.ParserException;
import net.segoia.util.parser.ParserHandlerFactory;
import net.segoia.util.parser.SymbolType;

public class Calculator {
    private static Map operators;
    private static Parser parser;

    static {
	operators = new HashMap();
	operators.put("+", new AddOperator());
	operators.put("-", new SubtractOperator());
	operators.put("/", new DivideOperator());
	operators.put("*", new MultiplyOperator());
	operators.put("sqrt", new SqrtOperator());
	operators.put("^", new PowerOperator());
	operators.put("ln", new NaturalLogarithmOperator());
	operators.put("lg", new DecimalLogarithmOperator());
	operators.put("const", new ConstantOperator());

	parser = new Parser();
	parser.setHandlerFactory(new ParserHandlerFactory(new MathExpressionParserEventHandler()));
	parser.addSymbol("+", SymbolType.ASSOCIATE, 5);
	parser.addSymbol("-", SymbolType.ASSOCIATE, 5);
	parser.addSymbol("*", SymbolType.ASSOCIATE, 3);
	parser.addSymbol("/", SymbolType.ASSOCIATE, 3);
	parser.addSymbol("sqrt", SymbolType.ASSOCIATE, 2);
	parser.addSymbol("^", SymbolType.ASSOCIATE, 2);
	parser.addSymbol("ln", SymbolType.ASSOCIATE, 2);
	parser.addSymbol("lg", SymbolType.ASSOCIATE, 2);
	parser.addSymbol("const", SymbolType.ASSOCIATE, 2);
	parser.addSymbol("(", SymbolType.GROUP_START, 0);
	parser.addSymbol(")", SymbolType.GROUP_END, 0);
    }

    public Calculator() {
    }

    public Number calculate(Expression expression, Map values) {
	return expression.calculate(operators, values).getNumber();
    }

    public Number evaluate(String string, Map values) throws ParserException {
	Expression expression = parseExpression(string);
	return calculate(expression, values);
    }

    public static Expression buildExpression(String operatorString, Expression exp1, Expression exp2) {
	Operator operator = operators.get(operatorString);
	if (operator.getArgumentsCount() == 2) {
	    return new DoubleOperandExpression(exp1, exp2, operatorString);
	} else if (operator.getArgumentsCount() == 1) {
	    return new SingleOperandExpression(operatorString, exp2);
	}
	return null;
    }

    public static Expression parseExpression(String string) throws ParserException {
	return (Expression) parser.parse(string).getObjects().pop();
    }

    public static void main(String[] args) throws ParserException {
	Calculator calc = new Calculator();
	// Map vals = new HashMap();
	// vals.put("a", 5);
	// Expression exp = new DoubleOperandExpression(new ConstantExpression("a"), new ConstantExpression("3"), "/");
	// System.out.println(calc.calculate(exp, vals));
	Map values = new HashMap();
//	values.put("e", 2);
//	System.out.println(calc.evaluate("(((2+8)*(3-2))+10)/a", values));
	System.out.println(calc.evaluate("const(e)+e", values));
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy