Esempio n. 1
0
        private Stack <IExpression> opStack       = new Stack <IExpression>(); //堆栈


        //解析表达式,返回后缀表达式
        private bool Parse(string text)
        {
            string expression = text.Trim();

            string      literal       = string.Empty; //变量/常数/函数名等
            IExpression op            = null;         //操作符
            bool        isStringToken = false;

            int pos = 0;

            while (pos < expression.Length)
            {
                isStringToken = false;
                string token = GetToken(expression, ref pos, ref isStringToken);

                if (RegsitryManager.ISOperator(token))
                {
                    InsertPostfixExpression(new OperatorExprssion(token));
                }
                else if (RegsitryManager.IsFunction(token))
                {
                    //函数其实是一种特殊的运算符
                    InsertPostfixExpression(new FuncExpression(token));
                }
                else
                {
                    //值
                    postExpression.Add(new VariableExpression(token, isStringToken));
                }
            }
            //AddPostExpressionLiteral();
            //最后stack中的所有数据弹出加入到对应中
            while (opStack.Count > 0)
            {
                op = opStack.Pop();
                if (op.Identity == RegsitryManager.TOKEN_LEFT)
                {
                    //括号不匹配
                    throw new AddinException(text + "Expression invalid!");
                }
                else
                {
                    postExpression.Add(op);
                }
            }
            //去掉逗号运算符
            postExpression.RemoveAll(item => item.Identity == RegsitryManager.TOKEN_COMMA);
            return(true);
        }
Esempio n. 2
0
        public static OperatorType OpType(string text)
        {
            if (text == RegsitryManager.TOKEN_LEFT)
            {
                return(OperatorType.LEFT);
            }
            if (text == RegsitryManager.TOKEN_RIGHT)
            {
                return(OperatorType.RIGHT);
            }
            if (text == RegsitryManager.TOKEN_ADD)
            {
                return(OperatorType.ADD);
            }
            if (text == RegsitryManager.TOKEN_SUB)
            {
                return(OperatorType.SUB);
            }
            if (text == RegsitryManager.TOKEN_MUL)
            {
                return(OperatorType.MUL);
            }
            if (text == RegsitryManager.TOKEN_DIV)
            {
                return(OperatorType.DIV);
            }

            if (text == RegsitryManager.TOKEN_AND)
            {
                return(OperatorType.AND);
            }
            if (text == RegsitryManager.TOKEN_OR)
            {
                return(OperatorType.OR);
            }
            if (text == RegsitryManager.TOKEN_LT)
            {
                return(OperatorType.LT);
            }
            if (text == RegsitryManager.TOKEN_GT)
            {
                return(OperatorType.GT);
            }
            if (text == RegsitryManager.TOKEN_LE)
            {
                return(OperatorType.LE);
            }

            if (text == RegsitryManager.TOKEN_GE)
            {
                return(OperatorType.GE);
            }
            if (text == RegsitryManager.TOKEN_ET)
            {
                return(OperatorType.ET);
            }
            if (text == RegsitryManager.TOKEN_UT)
            {
                return(OperatorType.UT);
            }

            //返回函数
            if (RegsitryManager.IsFunction(text))
            {
                return(OperatorType.FUNC);
            }


            return(OperatorType.ERR);
        }