示例#1
0
        /// <summary>
        /// 将表达式中的操作数和运算符分割出来
        /// </summary>
        /// <param name="expression">文本表达式</param>
        /// <returns>操作数与运算符表</returns>
        internal static List <IOperatorOrOperand> SplitExpression(string expression)
        {
            List <IOperatorOrOperand> output      = new List <IOperatorOrOperand>();
            StringBuilder             operandbuf  = new StringBuilder();
            StringBuilder             operatorbuf = new StringBuilder();

            // 记录刚才最后输出的表达式项
            IOperatorOrOperand lastItem = null;

            // 在尾部添加一个空格,帮助分离最后一个操作数或运算符
            expression = expression + " ";

            double result = 0;

            for (int i = 0; i < expression.Length; i++)
            {
                if (char.IsDigit(expression[i]) == true || expression[i] == '.')
                {
                    // 如果是数字或小数点(操作数成份)

                    // 结束前一个运算符
                    if (operatorbuf.Length > 0)
                    {
                        // 尝试获取运算符
                        OperatorBase opr = TryGetOperator(operatorbuf.ToString(), lastItem);
                        if (opr != null)
                        {
                            output.Add(opr);
                            lastItem           = opr;
                            operatorbuf.Length = 0;
                        }
                        else
                        {
                            throw new InvalidCastException(operatorbuf.ToString() + " 无法解析为合法的运算符。");
                        }
                    }

                    // 合并入当前操作数项
                    operandbuf.Append(expression[i]);
                }
                else
                {
                    // 不是数字或小数点(运算符成份)

                    // 结束前一个操作数
                    if (operandbuf.Length > 0)
                    {
                        if (double.TryParse(operandbuf.ToString(), out result) == false)
                        {
                            throw new FormatException(operandbuf.ToString() + " 无法解析为合法的操作数。");
                        }

                        // 输出操作数
                        OperandInfo operand = new OperandInfo(double.Parse(operandbuf.ToString()));
                        output.Add(operand);
                        lastItem          = operand;
                        operandbuf.Length = 0;
                    }

                    // 合并非空白字符到当前运算符项
                    if (char.IsWhiteSpace(expression[i]) == false)
                    {
                        operatorbuf.Append(expression[i]);
                    }

                    // 分析并输出运算符
                    if (operatorbuf.Length > 0)
                    {
                        // 尝试获取运算符
                        OperatorBase opr = TryGetOperator(operatorbuf.ToString(), lastItem);
                        if (opr != null)
                        {
                            output.Add(opr);
                            lastItem           = opr;
                            operatorbuf.Length = 0;
                        }
                    }
                }
            }

            return(output);
        }
示例#2
0
        /// <summary>
        /// 尝试返回一个运算符对象
        /// </summary>
        /// <param name="exp">要测试的字符串</param>
        /// <param name="leftItem"></param>
        /// <returns>如果成功,返回一个运算符对象实例;否则返回空</returns>
        private static OperatorBase TryGetOperator(string exp, IOperatorOrOperand leftItem)
        {
            // 判断左侧是否是操作数
            bool hasLeftOperand = false;

            if (leftItem == null)
            {
                // 没有左项
                hasLeftOperand = false;
            }
            else if (leftItem.IsOperand)
            {
                // 左项是操作数
                hasLeftOperand = true;
            }
            else if (leftItem.GetType() == typeof(OperatorCloseBracket))
            {
                // 左项是闭括号
                hasLeftOperand = true;
            }
            else
            {
                // 其它情况
                hasLeftOperand = false;
            }

            // 根据符号文本判断
            string symbol = exp.ToUpper();

            switch (symbol)
            {
            case "(":
                return(new OperatorOpenBracket());

            case ")":
                return(new OperatorCloseBracket());
            }

            // 根据左操作数情况判断
            if (hasLeftOperand == true)
            {
                // 有左操作数者
                switch (exp.ToUpper())
                {
                case "+":
                    return(new OperatorPlus());

                case "-":
                    return(new OperatorMinus());

                case "*":
                    return(new OperatorMultiply());

                case "/":
                    return(new OperatorDivide());

                case "%":
                    return(new OperatorMod());

                case "^":
                    return(new OperatorPower());

                case "AND":
                    return(new OperatorBitAnd());

                case "OR":
                    return(new OperatorBitOr());

                case "XOR":
                    return(new OperatorBitXor());

                case "<<":
                    return(new OperatorBitShiftLeft());

                case ">>":
                    return(new OperatorBitShiftRight());
                }
            }
            else
            {
                // 没有左操作数
                switch (exp.ToUpper())
                {
                case "+":
                    return(new OperatorPositive());

                case "-":
                    return(new OperatorNegative());

                case "~":
                    return(new OperatorBitReverse());
                }
            }

            // 不可判断者,返回空
            return(null);
        }
示例#3
0
        /// <summary>
        /// ���Է���һ�����������
        /// </summary>
        /// <param name="exp">Ҫ���Ե��ַ���</param>
        /// <param name="leftItem"></param>
        /// <returns>����ɹ�������һ�����������ʵ�������򷵻ؿ�</returns>
        private static OperatorBase TryGetOperator(string exp, IOperatorOrOperand leftItem)
        {
            // �ж�����Ƿ��Dz�����
            bool hasLeftOperand = false;
            if (leftItem == null)
            {
                // û������
                hasLeftOperand = false;
            }
            else if (leftItem.IsOperand)
            {
                // �����Dz�����
                hasLeftOperand = true;
            }
            else if (leftItem.GetType() == typeof(OperatorCloseBracket))
            {
                // �����DZ�����
                hasLeftOperand = true;
            }
            else
            {
                // �������
                hasLeftOperand = false;
            }

            // ���ݷ����ı��ж�
            string symbol = exp.ToUpper();
            switch (symbol)
            {
                case "(":
                    return new OperatorOpenBracket();
                case ")":
                    return new OperatorCloseBracket();
            }

            // ���������������ж�
            if (hasLeftOperand == true)
            {
                // �����������
                switch (exp.ToUpper())
                {
                    case "+":
                        return new OperatorPlus();
                    case "-":
                        return new OperatorMinus();
                    case "*":
                        return new OperatorMultiply();
                    case "/":
                        return new OperatorDivide();
                    case "%":
                        return new OperatorMod();
                    case "^":
                        return new OperatorPower();
                    case "AND":
                        return new OperatorBitAnd();
                    case "OR":
                        return new OperatorBitOr();
                    case "XOR":
                        return new OperatorBitXor();
                    case "<<":
                        return new OperatorBitShiftLeft();
                    case ">>":
                        return new OperatorBitShiftRight();
                }
            }
            else
            {
                // û���������
                switch (exp.ToUpper())
                {
                    case "+":
                        return new OperatorPositive();
                    case "-":
                        return new OperatorNegative();
                    case "~":
                        return new OperatorBitReverse();
                }
            }

            // �����ж��ߣ����ؿ�
            return null;
        }