private int GetOperatorLevel(Cherimoya.Expressions.BinaryOperator op) { if (op == Cherimoya.Expressions.BinaryOperator.Add || op == Cherimoya.Expressions.BinaryOperator.Subtract) { return(0); } else { return(1); } }
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); }
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 }); }