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()); }