Expression parser updates
[debian/openrocket] / core / src / net / sf / openrocket / util / ExpressionParser.java
1 package net.sf.openrocket.util;
2
3 import de.congrace.exp4j.Calculable;
4 import de.congrace.exp4j.ExpressionBuilder;
5 import de.congrace.exp4j.UnknownFunctionException;
6 import de.congrace.exp4j.UnparsableExpressionException;
7
8 public class ExpressionParser {
9         
10         
11         public double parse(String expression) throws InvalidExpressionException {
12                 try {
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);
24                 }
25         }
26         
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);
33                 }
34                 return exp;
35         }
36         
37 }