common/src/main/java/com/genexus/util/ExpressionEvaluator.java
/** Evalua la llamada a una funcion
	 *  @param funcName Nombre de la funcion
	 *  @param expr Expresion con los parametros
	 *  @return resultado de la evaluacion
	 */
Evalua la llamada a una funcion
@param funcName Nombre de la funcion
@param expr Expresion con los parametros
@return resultado de la evaluacion
Evalua la llamada a una funcion @param funcName Nombre de la funcion @param expr Expresion con los parametros @return resultado de la evaluacion
private double evalFuncCall(String funcName, String expr)
	{
		if (funcName.equalsIgnoreCase("rnd"))
		{ 
			return Math.random();
		}
		if (funcName.equalsIgnoreCase("abs"))
		{
			return Math.abs(eval(expr).getDecimal().doubleValue());
		}
		if (funcName.equalsIgnoreCase("int"))
		{
			return (double)(eval(expr).getDecimal().longValue());
		}
		if (funcName.equalsIgnoreCase("frac"))
		{
			double value = eval(expr).getDecimal().doubleValue() ;
			return value - (double) ( (long) value);
		}
		if (funcName.equalsIgnoreCase("sin"))
		{
			return Math.sin(eval(expr).getDecimal().doubleValue());
		}
		if (funcName.equalsIgnoreCase("asin"))
		{
			return Math.asin(eval(expr).getDecimal().doubleValue());
		}
		if (funcName.equalsIgnoreCase("cos"))
		{
			return Math.cos(eval(expr).getDecimal().doubleValue());
		}
		if (funcName.equalsIgnoreCase("acos"))
		{
			double x = eval(expr).getDecimal().doubleValue() ;
			if (x > 1 || x < -1)
				throwException(EVALUATION_ERROR, "Invalid range");
			return Math.acos(x);
		}
		if (funcName.equalsIgnoreCase("tan"))
		{
			return Math.tan(eval(expr).getDecimal().doubleValue());
		}
		if (funcName.equalsIgnoreCase("atan"))
		{
			return Math.atan(eval(expr).getDecimal().doubleValue());
		}
		if (funcName.equalsIgnoreCase("floor"))
		{
			return Math.floor(eval(expr).getDecimal().doubleValue() );
		}
		if (funcName.equalsIgnoreCase("round"))
		{
			return Math.round(eval(expr).getDecimal().doubleValue() );
		}
		if (funcName.equalsIgnoreCase("trunc"))
		{
			return Math.floor(eval(expr).getDecimal().doubleValue() );
		}	  
		if (funcName.equalsIgnoreCase("ln") ||  
				funcName.equalsIgnoreCase("log"))
		{
			double val = eval(expr).getDecimal().doubleValue() ;
			if (val <= 0)
			{
				return throwException(EVALUATION_ERROR, "Illegal argument (" + val + ") to function log(" + expr + ")").getDecimal().doubleValue() ;
			}
			return Math.log(val);
		}
		if (funcName.equalsIgnoreCase("exp"))
		{
			return Math.exp(eval(expr).getDecimal().doubleValue() );
		}
		if (funcName.equalsIgnoreCase("sqrt"))
		{
			return Math.sqrt(eval(expr).getDecimal().doubleValue() );
		}
		if(funcName.equalsIgnoreCase("pow") ||
				funcName.equalsIgnoreCase("max") ||
				funcName.equalsIgnoreCase("min"))
		{
			Tokenizer paramTokenizer = new Tokenizer(expr, ",", true);
			String sarg1, sarg2;
			try
			{
				sarg1 = getNextToken(paramTokenizer);
				paramTokenizer.nextToken();
				sarg2 = getNextToken(paramTokenizer);
			}
			catch (NoSuchElementException e)
			{
				return throwException(EVALUATION_ERROR, "The function " + funcName + " needs 2 arguments").getDecimal().doubleValue() ;
			}
			double arg1 = eval(sarg1).getDecimal().doubleValue() ;
			double arg2 = eval(sarg2).getDecimal().doubleValue() ;
			if (funcName.equalsIgnoreCase("pow"))
			{
				return Math.pow(arg1, arg2);
			}
			if (funcName.equalsIgnoreCase("max"))
			{
				return Math.max(arg1, arg2);
			}
			if (funcName.equalsIgnoreCase("min"))
			{
				return Math.min(arg1, arg2);
			}
		}
		if(funcName.equalsIgnoreCase("iif"))
		{ 
			Tokenizer paramTokenizer = new Tokenizer(expr, ",", true);
			String sarg1, sarg2, sarg3;
			try
			{
				sarg1 = getNextToken(paramTokenizer);
				paramTokenizer.nextToken();
				sarg2 = getNextToken(paramTokenizer);
				paramTokenizer.nextToken();
				sarg3 = getNextToken(paramTokenizer);
			}
			catch (NoSuchElementException e)
			{
				return throwException(EVALUATION_ERROR, "The function " + funcName + " needs 3 arguments").getDecimal().doubleValue() ;
			}
			iifContext = true;
			Boolean iif_result = eval(sarg1).isTrue();
			iifContext = false;
			if (errCode != 0)
				return 0;
			double result;
			if(iif_result)
				result = eval(sarg2).getDecimal().doubleValue() ;
			else 
				result = eval(sarg3).getDecimal().doubleValue() ;
			return result;
		}
		return evalExternalFunctionCall(funcName, expr);		 
	}
private double evalFuncCall ( String funcName , String expr ) { if ( funcName . equalsIgnoreCase ( "rnd" ) ) { return Math . random ( ) ; } if ( funcName . equalsIgnoreCase ( "abs" ) ) { return Math . abs ( eval ( expr ) . getDecimal ( ) . doubleValue ( ) ) ; } if ( funcName . equalsIgnoreCase ( "int" ) ) { return ( double ) ( eval ( expr ) . getDecimal ( ) . longValue ( ) ) ; } if ( funcName . equalsIgnoreCase ( "frac" ) ) { double value = eval ( expr ) . getDecimal ( ) . doubleValue ( ) ; return value - ( double ) ( ( long ) value ) ; } if ( funcName . equalsIgnoreCase ( "sin" ) ) { return Math . sin ( eval ( expr ) . getDecimal ( ) . doubleValue ( ) ) ; } if ( funcName . equalsIgnoreCase ( "asin" ) ) { return Math . asin ( eval ( expr ) . getDecimal ( ) . doubleValue ( ) ) ; } if ( funcName . equalsIgnoreCase ( "cos" ) ) { return Math . cos ( eval ( expr ) . getDecimal ( ) . doubleValue ( ) ) ; } if ( funcName . equalsIgnoreCase ( "acos" ) ) { double x = eval ( expr ) . getDecimal ( ) . doubleValue ( ) ; if ( x > 1 || x < - 1 ) throwException ( EVALUATION_ERROR , "Invalid range" ) ; return Math . acos ( x ) ; } if ( funcName . equalsIgnoreCase ( "tan" ) ) { return Math . tan ( eval ( expr ) . getDecimal ( ) . doubleValue ( ) ) ; } if ( funcName . equalsIgnoreCase ( "atan" ) ) { return Math . atan ( eval ( expr ) . getDecimal ( ) . doubleValue ( ) ) ; } if ( funcName . equalsIgnoreCase ( "floor" ) ) { return Math . floor ( eval ( expr ) . getDecimal ( ) . doubleValue ( ) ) ; } if ( funcName . equalsIgnoreCase ( "round" ) ) { return Math . round ( eval ( expr ) . getDecimal ( ) . doubleValue ( ) ) ; } if ( funcName . equalsIgnoreCase ( "trunc" ) ) { return Math . floor ( eval ( expr ) . getDecimal ( ) . doubleValue ( ) ) ; } if ( funcName . equalsIgnoreCase ( "ln" ) || funcName . equalsIgnoreCase ( "log" ) ) { double val = eval ( expr ) . getDecimal ( ) . doubleValue ( ) ; if ( val <= 0 ) { return throwException ( EVALUATION_ERROR , "Illegal argument (" + val + ") to function log(" + expr + ")" ) . getDecimal ( ) . doubleValue ( ) ; } return Math . log ( val ) ; } if ( funcName . equalsIgnoreCase ( "exp" ) ) { return Math . exp ( eval ( expr ) . getDecimal ( ) . doubleValue ( ) ) ; } if ( funcName . equalsIgnoreCase ( "sqrt" ) ) { return Math . sqrt ( eval ( expr ) . getDecimal ( ) . doubleValue ( ) ) ; } if ( funcName . equalsIgnoreCase ( "pow" ) || funcName . equalsIgnoreCase ( "max" ) || funcName . equalsIgnoreCase ( "min" ) ) { Tokenizer paramTokenizer = new Tokenizer ( expr , "," , true ) ; String sarg1 , sarg2 ; try { sarg1 = getNextToken ( paramTokenizer ) ; paramTokenizer . nextToken ( ) ; sarg2 = getNextToken ( paramTokenizer ) ; } catch ( NoSuchElementException e ) { return throwException ( EVALUATION_ERROR , "The function " + funcName + " needs 2 arguments" ) . getDecimal ( ) . doubleValue ( ) ; } double arg1 = eval ( sarg1 ) . getDecimal ( ) . doubleValue ( ) ; double arg2 = eval ( sarg2 ) . getDecimal ( ) . doubleValue ( ) ; if ( funcName . equalsIgnoreCase ( "pow" ) ) { return Math . pow ( arg1 , arg2 ) ; } if ( funcName . equalsIgnoreCase ( "max" ) ) { return Math . max ( arg1 , arg2 ) ; } if ( funcName . equalsIgnoreCase ( "min" ) ) { return Math . min ( arg1 , arg2 ) ; } } if ( funcName . equalsIgnoreCase ( "iif" ) ) { Tokenizer paramTokenizer = new Tokenizer ( expr , "," , true ) ; String sarg1 , sarg2 , sarg3 ; try { sarg1 = getNextToken ( paramTokenizer ) ; paramTokenizer . nextToken ( ) ; sarg2 = getNextToken ( paramTokenizer ) ; paramTokenizer . nextToken ( ) ; sarg3 = getNextToken ( paramTokenizer ) ; } catch ( NoSuchElementException e ) { return throwException ( EVALUATION_ERROR , "The function " + funcName + " needs 3 arguments" ) . getDecimal ( ) . doubleValue ( ) ; } iifContext = true ; Boolean iif_result = eval ( sarg1 ) . isTrue ( ) ; iifContext = false ; if ( errCode != 0 ) return 0 ; double result ; if ( iif_result ) result = eval ( sarg2 ) . getDecimal ( ) . doubleValue ( ) ; else result = eval ( sarg3 ) . getDecimal ( ) . doubleValue ( ) ; return result ; } return evalExternalFunctionCall ( funcName , expr ) ; }
Evalua la llamada a una funcion
  @param funcName Nombre de la funcion
  @param expr Expresion con los parametros
  @return resultado de la evaluacion
Evalua la llamada a una funcion @param funcName Nombre de la funcion @param expr Expresion con los parametros @return resultado de la evaluacion
// Si se trata de la funcion random // Primero veo si es una funcion de 1 sola variable // tanto ln como log calculan el logaritmo neperiano // Ahora veo si es una de las funciones internas de 2 variables // Si se trata de un iif