Beispiel #1
0
        private static IStringEvaluator combineTokens(List <IToken> tokens)
        {
            var  valStack    = new Stack <IStringEvaluator>();
            var  opeStack    = new Stack <OperatorEvaluator>();
            bool valueLasted = false;

            Action <OperatorEvaluator> fnResolveOperator = (OperatorEvaluator ope) => {
                ope.Right = valStack.Pop();
                ope.Left  = valStack.Pop();
                valStack.Push(ope);
            };

            foreach (var token in tokens)
            {
                IStringEvaluator evaluator = token.getEvaluator();
                if (evaluator is ValueEvaluator)
                {
                    if (valueLasted)
                    {
                        throw new FormatException("Value expression duplicated.");
                    }
                    valStack.Push(evaluator);
                    valueLasted = true;
                }
                else if (evaluator is OperatorEvaluator)
                {
                    OperatorEvaluator ope = (OperatorEvaluator)evaluator;
                    if (!valueLasted)
                    {
                        throw new FormatException("Operator expression duplicated.");
                    }
                    if (opeStack.Count > 0)
                    {
                        if (opeStack.Last().getPriority() <= ope.getPriority())
                        {
                            fnResolveOperator(opeStack.Pop());
                        }
                    }
                    opeStack.Push(ope);
                    valueLasted = false;
                }
            }

            while (opeStack.Count > 0)
            {
                fnResolveOperator(opeStack.Pop());
            }

            if (valStack.Count == 0)
            {
                throw new FormatException("Operator expression is none.");
            }

            return(valStack.Last());
        }