Ejemplo n.º 1
0
 private int GetOperatorLevel(Cherimoya.Expressions.BinaryOperator op)
 {
     if (op == Cherimoya.Expressions.BinaryOperator.Add || op == Cherimoya.Expressions.BinaryOperator.Subtract)
     {
         return(0);
     }
     else
     {
         return(1);
     }
 }
Ejemplo n.º 2
0
        private static BinaryOperator GetBinaryOpeator(Cherimoya.Expressions.BinaryOperator oper)
        {
            BinaryOperator op = BinaryOperator.None;

            if (oper == Cherimoya.Expressions.BinaryOperator.Add)
            {
                op = BinaryOperator.Add;
            }
            else if (oper == Cherimoya.Expressions.BinaryOperator.Subtract)
            {
                op = BinaryOperator.Subtract;
            }
            else if (oper == Cherimoya.Expressions.BinaryOperator.Multiply)
            {
                op = BinaryOperator.Multiply;
            }
            else if (oper == Cherimoya.Expressions.BinaryOperator.Divide)
            {
                op = BinaryOperator.Divide;
            }
            else if (oper == Cherimoya.Expressions.BinaryOperator.Assign)
            {
                op = BinaryOperator.Assign;
            }
            else if (oper == Cherimoya.Expressions.BinaryOperator.LessThan)
            {
                op = BinaryOperator.LessThan;
            }
            else if (oper == Cherimoya.Expressions.BinaryOperator.LessEqualThan)
            {
                op = BinaryOperator.LessEqualThan;
            }
            else if (oper == Cherimoya.Expressions.BinaryOperator.GreaterThan)
            {
                op = BinaryOperator.GreaterThan;
            }
            else if (oper == Cherimoya.Expressions.BinaryOperator.GreaterEqualThan)
            {
                op = BinaryOperator.GreaterEqualThan;
            }
            else if (oper == Cherimoya.Expressions.BinaryOperator.Equal)
            {
                op = BinaryOperator.Equal;
            }
            else if (oper == Cherimoya.Expressions.BinaryOperator.NotEqual)
            {
                op = BinaryOperator.NotEqual;
            }

            return(op);
        }
Ejemplo n.º 3
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
            });
        }