public IToken CreateTree(Stack <IToken> postfix) { postfix = Reverse(postfix); Stack <IToken> stack = new Stack <IToken>(); IToken token; while (postfix.Count > 0) { token = postfix.Pop(); if (token is IOperandToken || token == ControlToken.FuncParamStart) { stack.Push(token); } else if (token is InfixOperationToken) { InfixOperationToken infixOp = (InfixOperationToken)token; infixOp.Operand2 = stack.Pop(); infixOp.Operand1 = stack.Pop(); stack.Push(infixOp); } else if (token is PrefixOperationToken) { PrefixOperationToken prefixOp = (PrefixOperationToken)token; for (IToken t = stack.Pop(); t != ControlToken.FuncParamStart; t = stack.Pop()) { prefixOp.Operands.Insert(0, t); } stack.Push(prefixOp); } } return(stack.Pop()); }
public Stack <IToken> BuildStack(Queue <IToken> queue) { IToken token; Stack <IToken> postfix = new Stack <IToken>(); Stack <IToken> stack = new Stack <IToken>(); while (queue.Count > 0) { token = queue.Dequeue(); if (token == ControlToken.Comma) { //pop stack to postfix until we see left parenthesis while (stack.Count > 0 && stack.Peek() != ControlToken.LeftParenthesis) { postfix.Push(stack.Pop()); } if (stack.Count == 0) { throw new StackException("misplace comma or missing left parenthesis"); } else { continue; } } // if it is an operand, put it on the postfix stack if (token is IOperandToken) { postfix.Push(token); } if (token == ControlToken.LeftParenthesis) { stack.Push(token); } else if (token == ControlToken.RightParenthesis) { while (stack.Count > 0 && stack.Peek() != ControlToken.LeftParenthesis) { postfix.Push(stack.Pop()); } if (stack.Count == 0) { throw new StackException("missing left parenthesis"); } else { stack.Pop(); } } else if (token is PrefixOperationToken) { stack.Push(token); postfix.Push(ControlToken.FuncParamStart); } else if (token is InfixOperationToken) { if (stack.Count == 0 || stack.Peek() == ControlToken.LeftParenthesis) { stack.Push(token); } else { InfixOperationToken infix = (InfixOperationToken)token; while (stack.Count > 0 && stack.Peek() != ControlToken.LeftParenthesis && (stack.Peek() is PrefixOperationToken || stack.Peek() is InfixOperationToken && infix.Precedence <= ((InfixOperationToken)stack.Peek()).Precedence)) { postfix.Push(stack.Pop()); } stack.Push(token); } } } while (stack.Count > 0) { token = stack.Pop(); if (token == ControlToken.LeftParenthesis) { throw new TokenParsingException("unbalance paranthesis"); } else { postfix.Push(token); } } return(postfix); }