Exemplo n.º 1
0
        private CalResult CallResult(BinTree <IExpressPart> calBinTree)
        {
            if (calBinTree.LeftTree == null && calBinTree.RightTree == null)
            {
                if (calBinTree.TreeNode == null)
                {
                    return(new CalResult
                    {
                        Result = ""
                    });
                }
                if (calBinTree.TreeNode is CalExpress)
                {
                    CalExpress ce = calBinTree.TreeNode as CalExpress;

                    return(new CalResult
                    {
                        Result = ce.Value,
                        //ResultType = Comm.GetType(ce.Express)
                    });
                }
            }

            if (calBinTree.TreeNode is IIteratorCollectionFun && this.CalCurrent.CurrentIndex != -1)
            {
                var indx = this.CalCurrent.CurrentIndex;
                (calBinTree.TreeNode as CalSign).OnBeginOperator += () =>
                {
                    this.CalCurrent.CurrentIndex = indx;
                };
                this.CalCurrent.CurrentIndex = -1;
            }

            if (!(calBinTree.TreeNode is CalSign))
            {
                throw new ExpressErrorException(string.Format("未能计算的表达式:{0}。", calBinTree.TreeNode));
            }

            var calSign = (calBinTree.TreeNode as CalSign);
            //var time1 = DateTime.Now;

            CalResult leftResult  = null;
            CalResult rightResult = null;

            if (calBinTree.LeftTree != null)
            {
                //如果左边是赋值的则不调取值方法
                if (calBinTree.TreeNode is SetValueSign)
                {
                    ((VarSign)calBinTree.LeftTree.TreeNode).IsSetValue = true;
                }

                leftResult = CallResult(calBinTree.LeftTree);
            }


            if (calBinTree.RightTree != null)
            {
                if (calBinTree.TreeNode is ConditionSign)
                {
                    if (leftResult.Results != null)
                    {
                        throw new Exception("条件表达式左值太多");
                    }
                    else
                    {
                        if (!(leftResult.Result is bool))
                        {
                            throw new ExpressErrorException("if then的条件表达式条件必须为bool值!");
                        }

                        if (leftResult.Result.ToBool())
                        {
                            if (calBinTree.RightTree.TreeNode is ElseSign)
                            {
                                rightResult = CallResult(calBinTree.RightTree.LeftTree);
                            }
                            else
                            {
                                rightResult = CallResult(calBinTree.RightTree);
                            }
                        }
                        else
                        {
                            if (calBinTree.RightTree.TreeNode is ElseSign)
                            {
                                rightResult = CallResult(calBinTree.RightTree.RightTree);
                            }
                            else
                            {
                                rightResult = new CalResult
                                {
                                    Result     = null,
                                    ResultType = typeof(bool)
                                };
                            }
                        }
                    }
                }
                else
                {
                    rightResult = CallResult(calBinTree.RightTree);
                }
            }

            CalSign cs = calBinTree.TreeNode as CalSign;

            cs.LeftVal  = leftResult;
            cs.RightVal = rightResult;

            var result = cs.Operate();

            //calSign.ExeTicks += DateTime.Now.Subtract(time1).TotalMilliseconds;
            return(result);
        }
Exemplo n.º 2
0
        private BinTree <IExpressPart> ResolveExpress2(IExpressPart[] ss, int line)
        {
            try
            {
                BinTree <IExpressPart> expressTree = new BinTree <IExpressPart>();

                if (ss.Length == 1 && ss[0] is CalExpress)
                {
                    if (ss[0] is StringSign)
                    {
                        expressTree.TreeNode = ss[0];
                        return(expressTree);
                    }

                    IExpressPart[] ios = ResolveCalStep(((CalExpress)ss[0]).Express, line);

                    if (ios == null || ios.Length < 1)
                    {
                        return(expressTree);
                    }

                    if (ios.Length == 1)
                    {
                        if (ios[0] is CalExpress)
                        {
                            expressTree.TreeNode = (CalExpress)ios[0];
                            return(expressTree);
                        }
                        else if (ios[0] is VarSign)
                        {
                            expressTree.TreeNode = ios[0];
                            return(expressTree);
                        }
                    }
                    else if (ios.Length > 1)
                    {
                        ss = ios;
                    }
                }
                else if (ss.Length == 1 && ss[0] is VarSign)
                {
                    expressTree.TreeNode = ss[0];
                    return(expressTree);
                }

                if (ss.Length > 1)
                {
                    int     Priority = ((CalSign)ss.Where(s => s is CalSign).OrderBy((o) => (o as CalSign).Priority).Take(1).First()).Priority;
                    CalSign cs       = (CalSign)ss.Where(s => s is CalSign).Where(w => (w as CalSign).Priority == Priority).OrderByDescending(o => o.ModeID).Take(1).FirstOrDefault();
                    if (cs != default(CalSign))
                    {
                        expressTree.TreeNode = cs;

                        expressTree.LeftTree             = ResolveExpress2(ss.Where(w => w.ModeID < cs.ModeID).ToArray(), line);
                        expressTree.LeftTree.FatherNode  = expressTree;
                        expressTree.RightTree            = ResolveExpress2(ss.Where(w => w.ModeID > cs.ModeID).ToArray(), line);
                        expressTree.RightTree.FatherNode = expressTree;
                    }
                }

                return(expressTree);
            }
            catch (Exception exx)
            {
                throw exx;
            }
        }
Exemplo n.º 3
0
        internal static bool TryCreateSign(string sign, CalCurrent pool, out CalSign calSign)
        {
            calSign = CreateCalSign(sign, pool);

            return(calSign != null);
        }