Esempio n. 1
0
        private Expression ConvertDiffExpression(Cherimoya.Expressions.FunctionCallExpression e)
        {
            Expression f = Convert(e.Parameters[0]);

            return(new DiffExpression(
                       e.MethodName == "pdiff",
                       f is BinaryExpression ? new ParantheseExpression()
            {
                Body = f
            } : f,
                       new TextExpression((string)(e.Parameters[1] as Cherimoya.Expressions.ConstantExpression).Value, false)));
        }
Esempio n. 2
0
        private Expression ConvertFunctionCallExpression(Cherimoya.Expressions.FunctionCallExpression e, int parantheseLevel)
        {
            if (e.Method.Name == "root")
            {
                if ((e.Parameters[1] is Cherimoya.Expressions.ConstantExpression) &&
                    Types.ConvertValue <int>((e.Parameters[1] as Cherimoya.Expressions.ConstantExpression).Value) == 2)
                {
                    return(new RootExpression()
                    {
                        X = Convert(e.Parameters[0], parantheseLevel)
                    });
                }
                else
                {
                    return(new RootExpression()
                    {
                        X = Convert(e.Parameters[0], parantheseLevel), Root = Convert(e.Parameters[1], parantheseLevel)
                    });
                }
            }
            else if (e.Method.Name == "abs")
            {
                return(new AbsExpression()
                {
                    Operand = Convert(e.Parameters[0], parantheseLevel)
                });
            }
            else if (e.Method.Name == "pow")
            {
                bool hasParanthese = e.Parameters[0] is Cherimoya.Expressions.BinaryExpression;

                Expression operand = Convert(e.Parameters[0], parantheseLevel + (hasParanthese ? 1 : 0));

                if (hasParanthese)
                {
                    operand = new ParantheseExpression()
                    {
                        Body = operand
                    };
                }


                return(new PowExpression()
                {
                    X = operand, Pow = Convert(e.Parameters[1], parantheseLevel)
                });
            }
            else if (e.Method.Name == "sum")
            {
                Cherimoya.Expressions.Expression right = e.Parameters[0];


                bool hasParanthese = right is Cherimoya.Expressions.BinaryExpression;

                Expression operand = Convert(right, parantheseLevel + (hasParanthese ? 1 : 0));

                if (hasParanthese)
                {
                    operand = new ParantheseExpression()
                    {
                        Body = operand
                    };
                }

                return(new SumExpression()
                {
                    Sigmas = new SigmaConfig[] { new SigmaConfig() },
                    Operand = operand
                });
            }
            else if (e.Method.Name == "lg" || e.Method.Name == "ln" || e.Method.Name == "log")
            {
                Cherimoya.Expressions.Expression xExpr = e.Method.Name == "log" ? e.Parameters[1] : e.Parameters[0];

                bool hasParanthese = xExpr is Cherimoya.Expressions.BinaryExpression && (xExpr as Cherimoya.Expressions.BinaryExpression).Operator != Cherimoya.Expressions.BinaryOperator.Divide;

                Expression b = e.Method.Name == "log" ? Convert(e.Parameters[0], parantheseLevel) : null;
                Expression x = hasParanthese ? new ParantheseExpression()
                {
                    Body = Convert(xExpr, parantheseLevel + 1)
                } : Convert(xExpr, parantheseLevel);

                return(new LogExpression(e.Method.Name, b, x));
            }
            else if (e.Method.Name == "transpose")
            {
                return(new SuperscriptExpression()
                {
                    Body = Convert(e.Parameters[0], parantheseLevel), Superscript = new TextExpression("T", false), HasBracket = true
                });
            }
            else if (e.Method.Name == "stdvar")
            {
                return(new SubscriptExpression()
                {
                    Body = new TextExpression("σ", false), Subscript = Convert(e.Parameters[0], parantheseLevel), ShiftOffset = 10
                });
            }
            else if (e.Method.Name == "average")
            {
                return(new UpperlineExpression()
                {
                    Body = Convert(e.Parameters[0], parantheseLevel)
                });
            }
            else if (e.Method.Name == "diff" || e.Method.Name == "pdiff")
            {
                return(ConvertDiffExpression(e));
            }
            else
            {
                return(new FunctionExpression()
                {
                    Name = e.MethodName,
                    Operands = e.Parameters.Select(i => Convert(i, parantheseLevel + 1)).ToArray(),
                    ParantheseLevel = parantheseLevel
                });
            }
        }