package test;
import org.nfunk.jep.ParseException;
import org.nfunk.jep.function.Add;
public class StrictAdd extends Add {
public Object add(Object d1, Object d2) throws ParseException {
if(d1 instanceof Integer && d2 instanceof Integer) {
Integer I1 = (Integer) d1;
Integer I2 = (Integer) d2;
int i3 = I1.intValue() + I2.intValue();
return Integer.valueOf(i3);
}
return super.add(d1, d2);
}
}
package test;
import org.nfunk.jep.ParseException;import org.nfunk.jep.type.Complex;import org.nfunk.jep.type.NumberFactory;
public class StrictNumberFactory implements NumberFactory {
/** * This is the only important method. It defines what to do with literal numbers * encountered during parsing. If the input text is an integer like "3" it will return an integer, * otherwise it will return a double, i.e. for an input like "3.14". */ public Object createNumber(String value) throws ParseException { double d = Double.parseDouble(value); int i = (int) d; if( i == d) return Integer.valueOf(i); return Double.valueOf(d); }
public Object createNumber(double value) throws ParseException { return Double.valueOf(value); }
public Object createNumber(int value) throws ParseException { return Integer.valueOf(value); }
public Object createNumber(short value) throws ParseException { return Integer.valueOf(value); }
public Object createNumber(float value) throws ParseException { return Double.valueOf(value); }
public Object createNumber(boolean value) throws ParseException { return Boolean.valueOf(value); }
// Not actually used so can just use null public Object createNumber(Number value) throws ParseException { return null; }
// Not actually used so can just use null public Object createNumber(Complex value) throws ParseException { return null; }
public Object getZero() { return Integer.valueOf(0); }
public Object getOne() { return Integer.valueOf(1); }
public Object getMinusOne() { return Integer.valueOf(-1); }
public Object getTwo() { return Integer.valueOf(2); }}
public static void main(String[] args) {
// TODO Auto-generated method stub
JEP jep = new JEP(false,true,false,new StrictNumberFactory());
jep.addStandardFunctions();
jep.addStandardConstants();
jep.setImplicitMul(false);
jep.setAllowUndeclared(true);
jep.setAllowAssignment(true);
// Now use our custom type
jep.getOperatorSet().getAdd().setPFMC(new StrictAdd());
jep.addVariable("i", new Integer(5));
jep.addVariable("j", new Integer(7));
jep.addVariable("x", new Double(9.3));
jep.addVariable("y", new Double(11.3));
Node n;
try {
n = jep.parse("i+j");
Object res = jep.evaluate(n);
System.out.println("Result "+res+" type "+res.getClass().getSimpleName());
n = jep.parse("i+3");
res = jep.evaluate(n);
System.out.println("Result "+res+" type "+res.getClass().getSimpleName());
n = jep.parse("i+x");
res = jep.evaluate(n);
System.out.println("Result "+res+" type "+res.getClass().getSimpleName());
n = jep.parse("i+3.14");
res = jep.evaluate(n);
System.out.println("Result "+res+" type "+res.getClass().getSimpleName());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Vector v = new Vector();
v.add(new Double(2));
v.add(new Double(3));
v.add(new Double(4));
jep.addVariable("v",v);
Node n = jep.parse("w = [3,2,1]");
n = jep.parse("v[3]");
n = jep.parse("v[1]=1");