Exemplo n.º 1
0
        private Expression ConvertIterationSumExpression(Mathy.Language.IterationSumExpression e, int parantheseLevel)
        {
            bool hasParanthese = e.Body is Cherimoya.Expressions.BinaryExpression;


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

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


            return(new SumExpression()
            {
                Sigmas = e.Variables.Select(i => new SigmaConfig()
                {
                    To = Convert(i.To, parantheseLevel),
                    From = new BinaryExpression()
                    {
                        Left = new TextExpression(i.Name, true),
                        Right = Convert(i.From, parantheseLevel),
                        Operator = new BinaryOperatorNode()
                        {
                            Operator = BinaryOperator.Equal
                        },
                        ActualOperator = new BinaryOperatorNode()
                        {
                            Operator = BinaryOperator.Equal
                        }
                    }
                }).ToArray(),
                Operand = operand
            });
        }
Exemplo n.º 2
0
        private Expression ConvertBinaryExpression(Cherimoya.Expressions.BinaryExpression e, int parantheseLevel)
        {
            Cherimoya.Expressions.BinaryOperator oper = e.Operator;
            BinaryOperator op     = GetBinaryOpeator(oper);
            BinaryOperator prevOp = op;


            Cherimoya.Expressions.Expression leftExpr  = e.Left;
            Cherimoya.Expressions.Expression rightExpr = e.Right;


            Boolean swap = false;

            if (op == BinaryOperator.Multiply)
            {
                if (IsInvididualExpression(e.Right) && !IsInvididualExpression(e.Left) &&
                    !(e.Left is Cherimoya.Expressions.BinaryExpression))
                {
                    swap = true;
                }
                else if (e.Right is Cherimoya.Expressions.ConstantExpression && !(e.Left is Cherimoya.Expressions.ConstantExpression))
                {
                    swap = true;
                }
            }

            if (swap)
            {
                Cherimoya.Expressions.Expression t = leftExpr;
                leftExpr  = rightExpr;
                rightExpr = t;
            }


            bool leftParanthese  = false;
            bool rightParanthese = false;

            if (op != BinaryOperator.Assign)
            {
                if (op != BinaryOperator.Divide)
                {
                    if (leftExpr is Cherimoya.Expressions.BinaryExpression)
                    {
                        Cherimoya.Expressions.BinaryOperator leftOp = (leftExpr as Cherimoya.Expressions.BinaryExpression).Operator;

                        if (GetOperatorLevel(oper) > GetOperatorLevel(leftOp))
                        {
                            leftParanthese = true;
                        }
                    }

                    if (rightExpr is Cherimoya.Expressions.BinaryExpression)
                    {
                        Cherimoya.Expressions.BinaryOperator rightOp = (rightExpr as Cherimoya.Expressions.BinaryExpression).Operator;

                        if (GetBinaryOpeator(rightOp) == op)
                        {
                            rightParanthese = true;
                        }
                        else if (GetOperatorLevel(oper) > GetOperatorLevel(rightOp))
                        {
                            rightParanthese = true;
                        }
                    }
                }

                if (rightExpr is Cherimoya.Expressions.FunctionCallExpression && (rightExpr as Cherimoya.Expressions.FunctionCallExpression).MethodName == "root")
                {
                    rightParanthese = true;
                }
            }

            if (op == BinaryOperator.Multiply)
            {
                if (!(leftExpr is Cherimoya.Expressions.ConstantExpression & rightExpr is Cherimoya.Expressions.ConstantExpression))
                {
                    op = BinaryOperator.None;
                }
            }


            Expression left  = Convert(leftExpr, parantheseLevel + (leftParanthese ? 1 : 0));
            Expression right = Convert(rightExpr, parantheseLevel + (rightParanthese ? 1 : 0));

            if (leftParanthese)
            {
                left = new ParantheseExpression()
                {
                    Body = left, ParantheseLevel = parantheseLevel
                };
            }

            if (rightParanthese)
            {
                right = new ParantheseExpression()
                {
                    Body = right, ParantheseLevel = parantheseLevel
                };
            }


            return(new BinaryExpression()
            {
                Left = left,
                Operator = new BinaryOperatorNode()
                {
                    Operator = op
                },
                ActualOperator = new BinaryOperatorNode()
                {
                    Operator = prevOp
                },
                Right = right
            });
        }
Exemplo n.º 3
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
                });
            }
        }