Beispiel #1
0
        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());
        }
Beispiel #2
0
        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);
        }