1 package net.sf.openrocket.util;
3 import de.congrace.exp4j.Calculable;
4 import de.congrace.exp4j.ExpressionBuilder;
5 import de.congrace.exp4j.UnknownFunctionException;
6 import de.congrace.exp4j.UnparsableExpressionException;
8 public class ExpressionParser {
11 public double parse(String expression) throws InvalidExpressionException {
13 ExpressionBuilder builder = new ExpressionBuilder(modify(expression));
14 Calculable calc = builder.build();
15 return calc.calculate();
16 } catch (java.lang.NumberFormatException e) {
17 throw new InvalidExpressionException("Invalid expression: " + expression, e);
18 } catch (UnknownFunctionException e) {
19 throw new InvalidExpressionException("Invalid expression: " + expression, e);
20 } catch (UnparsableExpressionException e) {
21 throw new InvalidExpressionException("Invalid expression: " + expression, e);
22 } catch (java.util.EmptyStackException e) {
23 throw new InvalidExpressionException("Invalid expression: " + expression, e);
27 private String modify(String exp) throws InvalidExpressionException {
28 exp = exp.replaceAll("(\\d+)\\s+(\\d+)\\s*/\\s*(\\d+)", "($1+$2/$3)");
29 exp = exp.replace(',', '.');
30 // Disallow spaces between numbers - default is to remove spaces!
31 if (exp.matches(".*[0-9.]\\s+[0-9.].*")) {
32 throw new InvalidExpressionException("Invalid expression: " + exp);