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

org.nfunk.jep.function.If Maven / Gradle / Ivy

Go to download

JEP is a Java library for parsing and evaluating mathematical expressions. Use groupId org.fudaa to deploy it in maven central

The newest version!
/* @author rich
 * Created on 18-Nov-2003
 */
package org.nfunk.jep.function;

import org.nfunk.jep.*;
import org.nfunk.jep.type.*;
/**
 * The if(condExpr,posExpr,negExpr) function.
 * The value of trueExpr will be returned if condExpr is >0 or Boolean.TRUE
 * and value of negExpr will be returned if condExpr is <= 0 or Boolean.TRUE.
 * 

* This function performs lazy evaluation so that * only posExpr or negExpr will be evaluated. * For Complex numbers only the real part is used. *

* An alternate form if(condExpr,posExpr,negExpr,zeroExpr) * is also available. Note most computations * are carried out over floating point doubles so * testing for zero can be dangerous. *

* This function implements the SpecialEvaluationI interface * so that it handles setting the value of a variable. * @author Rich Morris * Created on 18-Nov-2003 * @version 2.3.0 beta 1 now supports a Boolean first argument. * @since Feb 05 Handles Number arguments, so works with Integers rather than just Doubles */ public class If extends PostfixMathCommand implements CallbackEvaluationI { /** * */ public If() { super(); numberOfParameters = -1; } /* * Performs the specified action on an expression tree. * Serves no function in standard JEP but * @param node top node of the tree * @param pv The visitor, can be used evaluate the children. * @return top node of the results. * @throws ParseException public Node process(Node node,Object data,ParserVisitor pv) throws ParseException { return null; } */ /** * Checks the number of parameters of the call. * */ public boolean checkNumberOfParameters(int n) { return (n == 3 || n == 4); } /** * */ public Object evaluate(Node node,EvaluatorI pv) throws ParseException { int num = node.jjtGetNumChildren(); if( !checkNumberOfParameters(num)) throw new ParseException("If operator must have 3 or 4 arguments."); // get value of argument Object condVal = pv.eval(node.jjtGetChild(0)); // convert to double double val; if(condVal instanceof Boolean) { if(((Boolean) condVal).booleanValue()) return pv.eval(node.jjtGetChild(1)); return pv.eval(node.jjtGetChild(2)); } else if(condVal instanceof Complex) val = ((Complex) condVal).re(); else if(condVal instanceof Number) val = ((Number) condVal).doubleValue(); else throw new ParseException("Condition in if operator must be double or complex"); if(val>0.0) return pv.eval(node.jjtGetChild(1)); else if(num ==3 || val <0.0) return pv.eval(node.jjtGetChild(2)); return pv.eval(node.jjtGetChild(3)); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy