Example #1
0
        public override double EvaluateVarFunction(VarFuncToken token)
        {
            Func <double, double> func;
            int start;

            switch (token.Symbol)
            {
            case ParserSymbols.Sum:
                func = ExpressionTreeEvaluator.CreateDelegate(token.SubTokens[3],
                                                              token.VariableSymbol, parser, Context.Options);
                start = (int)eval(token.SubTokens[1]);
                return(Enumerable.Range(start, (int)eval(token.SubTokens[2]) - start + 1)
                       .Select(v => func(v)).Sum());

            case ParserSymbols.Prod:
                func = ExpressionTreeEvaluator.CreateDelegate(token.SubTokens[3],
                                                              token.VariableSymbol, parser, Context.Options);
                start = (int)eval(token.SubTokens[1]);
                return(Enumerable.Range(start, (int)eval(token.SubTokens[2]) - start + 1)
                       .Select(v => func(v))
                       .Aggregate((v1, v2) => v1 * v2));

            default:
                if (Context.Options.StrictMode)
                {
                    throw new UnsupportedOperationException(token.Symbol);
                }
                return(double.NaN);
            }
        }
Example #2
0
        public override BigDecimal EvaluateVarFunction(VarFuncToken token)
        {
            if (Context.Options.StrictMode)
            {
                throw new UnsupportedOperationException(token.Symbol);
            }
            double result = token.Evaluate(fallback);

            if (double.IsNaN(result))
            {
                throw new ParserArithmeticException(token.Position);
            }
            else
            {
                return(result);
            }
        }
Example #3
0
        public override string EvaluateVarFunction(VarFuncToken token)
        {
            string symbol = String.Empty;

            switch (token.Symbol)
            {
            case ParserSymbols.Sum:
                symbol = "&sum;";
                break;

            case ParserSymbols.Prod:
                symbol = "&prod;";
                break;
            }
            var sb = new StringBuilder($"<munderover><mo>{symbol}</mo>");

            sb.AppendFormat("<mrow><mi>{0}</mi><mo>=</mo>{1}</mrow>",
                            token.VariableSymbol, evalSub(token, 1));
            sb.AppendFormat("<mrow>{0}</mrow></munderover>", evalSub(token, 2));
            sb.AppendFormat("<mrow>{0}</mrow>", evalSub(token, 3));
            return(sb.ToString());
        }
        public override Expression EvaluateVarFunction(VarFuncToken token)
        {
            Func <double, double> func;

            switch (token.Symbol)
            {
            case ParserSymbols.Sum:
                func = ExpressionTreeEvaluator.CreateDelegate(token.SubTokens[3],
                                                              token.VariableSymbol, parser, Context.Options);
                return(iterateExpr(0, token.SubTokens[1], token.SubTokens[2], (v, i) => v + func(i)));

            case ParserSymbols.Prod:
                func = ExpressionTreeEvaluator.CreateDelegate(token.SubTokens[3],
                                                              token.VariableSymbol, parser, Context.Options);
                return(iterateExpr(1, token.SubTokens[1], token.SubTokens[2], (v, i) => v * func(i)));

            default:
                if (Context.Options.StrictMode)
                {
                    throw new UnsupportedOperationException(token.Symbol);
                }
                return(Expression.Constant(double.NaN));
            }
        }
Example #5
0
 /// <summary>
 /// Evaluates a given iteration function token.
 /// </summary>
 /// <param name="token">The token to be evaluated.</param>
 /// <returns>The evaluated value.</returns>
 public abstract T EvaluateVarFunction(VarFuncToken token);
Example #6
0
 public override string EvaluateVarFunction(VarFuncToken token)
 => EvaluateFunction(token);