예제 #1
0
        /// <summary>
        /// 解析通用表达式
        /// </summary>
        /// <param name="expression">表达式字符串</param>
        /// <returns>表达式结点树</returns>
        private ExpressionNode ExpressionParse(string expression)
        {
            int    leftBracketsIndex  = 0;
            int    rightBracketsIndex = -1;
            string subExpression      = string.Empty;
            string subExpressionValue = string.Empty;

            while (true)
            {
                for (int i = 0; i < expression.Length; i++)
                {
                    if (expression[i] == Operators.LeftBrackets)
                    {
                        leftBracketsIndex = i;
                        continue;
                    }
                    if (expression[i] == Operators.RightBrackets)
                    {
                        rightBracketsIndex = i;
                        subExpression      = expression.Substring(leftBracketsIndex + 1, rightBracketsIndex - leftBracketsIndex - 1);
                        subExpressionValue = this.Calculator(this.BlendExpressionParse(subExpression)).ToString();
                        expression         = expression.Remove(leftBracketsIndex + 1, rightBracketsIndex - leftBracketsIndex - 1);
                        expression         = expression.Insert(leftBracketsIndex + 1, subExpressionValue);

                        if (expression[leftBracketsIndex] == Operators.LeftBrackets &&
                            expression[leftBracketsIndex + subExpressionValue.Length + 1] == Operators.RightBrackets)
                        {
                            if (subExpressionValue[0] == Operators.Subtraction)
                            {
                                if (leftBracketsIndex == 0)
                                {
                                    expression = expression.Remove(leftBracketsIndex + subExpressionValue.Length + 1, 1);
                                    expression = expression.Remove(leftBracketsIndex, 1);
                                }
                                else if (leftBracketsIndex > 0)
                                {
                                    switch (expression[leftBracketsIndex - 1])
                                    {
                                    case Operators.Add:
                                        //3-(2+(-2)*4+5)+25
                                        expression = expression.Remove(leftBracketsIndex + subExpressionValue.Length + 1, 1);
                                        expression = expression.Remove(leftBracketsIndex, 2);
                                        expression = expression.Remove(leftBracketsIndex - 1, 1);
                                        expression = expression.Insert(leftBracketsIndex - 1, "-");
                                        //3-(2-2*4+5)+25
                                        break;

                                    case Operators.Subtraction:
                                        //3-(2-(-2)*4+5)+25
                                        expression = expression.Remove(leftBracketsIndex + subExpressionValue.Length + 1, 1);
                                        expression = expression.Remove(leftBracketsIndex, 2);
                                        expression = expression.Remove(leftBracketsIndex - 1, 1);
                                        expression = expression.Insert(leftBracketsIndex - 1, "+");
                                        //3-(2+2*4+5)+25
                                        break;

                                    case Operators.Multiply:
                                    case Operators.Division:
                                        //1.   3-2*(-2)*4+25
                                        //2.   3+2*(-2)*4+25
                                        //3.   6.5/(-2)*0.5
                                        bool isProcessed = false;
                                        for (int j = leftBracketsIndex - 1 - 1; j >= 0; j--)
                                        {
                                            if (expression[j] == Operators.LeftBrackets)
                                            {
                                                expression  = expression.Remove(leftBracketsIndex + subExpressionValue.Length + 1, 1);
                                                expression  = expression.Remove(leftBracketsIndex, 2);
                                                expression  = expression.Insert(j + 1, "-");
                                                isProcessed = true;
                                                break;
                                            }
                                            if (expression[j] == Operators.Add)
                                            {
                                                expression  = expression.Remove(leftBracketsIndex + subExpressionValue.Length + 1, 1);
                                                expression  = expression.Remove(leftBracketsIndex, 2);
                                                expression  = expression.Remove(j, 1);
                                                expression  = expression.Insert(j, "-");
                                                isProcessed = true;
                                                break;
                                                //3-2*2*4+25
                                            }
                                            else if (expression[j] == Operators.Subtraction)
                                            {
                                                expression  = expression.Remove(leftBracketsIndex + subExpressionValue.Length + 1, 1);
                                                expression  = expression.Remove(leftBracketsIndex, 2);
                                                expression  = expression.Remove(j, 1);
                                                expression  = expression.Insert(j, "+");
                                                isProcessed = true;
                                                break;
                                                //3+2*2*4+25
                                            }
                                        }
                                        if (!isProcessed)
                                        {
                                            expression = expression.Remove(leftBracketsIndex + subExpressionValue.Length + 1, 1);
                                            expression = expression.Remove(leftBracketsIndex, 2);
                                            if (expression[0] == Operators.Subtraction)
                                            {
                                                expression = expression.Remove(0, 1);
                                            }
                                            else
                                            {
                                                expression = expression.Insert(0, "-");
                                            }
                                        }
                                        //1.   3+2*2*4+25
                                        //2.   3-2*2*4+25
                                        //3.   -6.5/2*0.5
                                        break;

                                    case Operators.LeftBrackets:
                                        //3-((-2)*4+5)+25
                                        expression = expression.Remove(leftBracketsIndex + subExpressionValue.Length + 1, 1);
                                        expression = expression.Remove(leftBracketsIndex, 1);
                                        //3-(-2*4+5)+25
                                        break;

                                    default:
                                        throw new Exception("未知的运算符:" + expression[leftBracketsIndex - 1 - 1].ToString());
                                    }
                                }
                                else
                                {
                                    throw new Exception("未知索引");
                                }
                            }
                            else
                            {
                                if (leftBracketsIndex == 0)
                                {
                                    expression = expression.Remove(leftBracketsIndex + subExpressionValue.Length + 1, 1);
                                    expression = expression.Remove(leftBracketsIndex, 1);
                                }
                                else if (leftBracketsIndex > 0)
                                {
                                    switch (expression[leftBracketsIndex - 1])
                                    {
                                    case Operators.Add:
                                    case Operators.Subtraction:
                                    case Operators.Multiply:
                                    case Operators.Division:
                                        expression = expression.Remove(leftBracketsIndex + subExpressionValue.Length + 1, 1);
                                        expression = expression.Remove(leftBracketsIndex, 1);
                                        break;

                                    case Operators.LeftBrackets:
                                        expression = expression.Remove(leftBracketsIndex + subExpressionValue.Length + 1, 1);
                                        expression = expression.Remove(leftBracketsIndex - 1, 1);
                                        break;

                                    default:
                                        throw new Exception("未知的运算符:" + expression[leftBracketsIndex - 1 - 1].ToString());
                                    }
                                }
                                else
                                {
                                    throw new Exception("未知索引");
                                }
                            }
                        }
                        break;
                    }
                }

                if (!expression.Contains(Operators.LeftBrackets) && !expression.Contains(Operators.RightBrackets))
                {
                    break;
                }
            }

            ExpressionNode root = this.BlendExpressionParse(expression);

            return(root);
        }
예제 #2
0
        /// <summary>
        /// 仅加法和减法或仅乘法和除法(不能有加减和乘除混合)表达式解析生成树
        /// </summary>
        /// <param name="expression">要计算的表达式字符串</param>
        /// <returns>表达式节点树</returns>
        private ExpressionNode BaseExpressionParse(string expression)
        {
            ExpressionNode root             = new ExpressionNode();
            int            valueStaratIndex = 0;
            string         value            = string.Empty;
            char           chDefaultValue   = default(char);
            char           currentOperator  = chDefaultValue;

            for (int i = 0; i < expression.Length; i++)
            {
                if (BaseCalate.IsOperator(expression[i]))
                {
                    value            = expression.Substring(valueStaratIndex, i - valueStaratIndex);
                    valueStaratIndex = i + 1;

                    currentOperator = expression[i];
                    continue;
                }
                else
                {
                    if (!string.IsNullOrEmpty(value) && currentOperator != chDefaultValue)
                    {
                        if (root.Left == null)
                        {
                            var lefttLeafNode = new ExpressionNode();
                            lefttLeafNode.Value  = double.Parse(value.Trim());
                            lefttLeafNode.Parent = root;

                            root.Operator = currentOperator;
                            root.Left     = lefttLeafNode;
                        }
                        else if (root.Left != null && root.Right == null)
                        {
                            var rightLeafNode = new ExpressionNode();
                            rightLeafNode.Value  = double.Parse(value.Trim());
                            rightLeafNode.Parent = root;

                            root.Right = rightLeafNode;

                            var parentNode = new ExpressionNode();
                            parentNode.Operator = currentOperator;
                            parentNode.Left     = root;
                            root.Parent         = parentNode;
                            root = parentNode;
                        }

                        value = string.Empty;
                    }
                }
            }

            value = expression.Substring(valueStaratIndex, expression.Length - valueStaratIndex);
            if (root.Left != null)
            {
                var endLeaf = new ExpressionNode();
                endLeaf.Value  = double.Parse(value.Trim());
                endLeaf.Parent = root;
                root.Right     = endLeaf;
            }
            else
            {
                root.Value = double.Parse(value.Trim());
            }
            return(root);
        }
예제 #3
0
        /// <summary>
        /// 无括号的加减乘除混合表达式运算
        /// </summary>
        /// <param name="expression">要计算的表达式字符串</param>
        /// <returns>表达式节点树</returns>
        private ExpressionNode BlendExpressionParse(string expression)
        {
            int    startSubExpressionIndex = 0;
            int    endSubExpressionIndex   = -1;
            string subExpression           = string.Empty;
            double subExpressionValue      = 0.0d;

            if (expression[0] == Operators.Subtraction)
            {
                expression = "0" + expression;
            }

            while (true)
            {
                for (int i = 0; i < expression.Length; i++)
                {
                    if (expression[i] == Operators.Multiply || expression[i] == Operators.Division)
                    {
                        if (i + 1 == expression.Length)
                        {
                            endSubExpressionIndex = i + 1;
                        }
                        else
                        {
                            for (int j = i + 1; j < expression.Length; j++)
                            {
                                if (BaseCalate.IsOperator(expression[j]))
                                {
                                    endSubExpressionIndex = j;
                                    break;;
                                }
                            }
                            if (endSubExpressionIndex == -1)
                            {
                                endSubExpressionIndex = expression.Length;
                            }
                        }

                        subExpression      = expression.Substring(startSubExpressionIndex, endSubExpressionIndex - startSubExpressionIndex);
                        subExpressionValue = BaseCalate.BaseCal(subExpression);
                        expression         = expression.Remove(startSubExpressionIndex, endSubExpressionIndex - startSubExpressionIndex);
                        expression         = expression.Insert(startSubExpressionIndex, subExpressionValue.ToString());

                        endSubExpressionIndex = -1;
                        break;
                    }
                    if (expression[i] == Operators.Add || expression[i] == Operators.Subtraction)
                    {
                        startSubExpressionIndex = i + 1;
                    }
                }

                if (!expression.Contains(Operators.Multiply) && !expression.Contains(Operators.Division))
                {
                    break;
                }
            }

            ExpressionNode root = BaseExpressionParse(expression);

            return(root);
        }