예제 #1
0
        private void processOperator(Token t, TokenStack valueStack, ref bool error)
        {
            Token A = null, B = null;

            if (valueStack.isEmpty())
            {
                ((ViewModel)DataContext).Result = ERROR;
                error = true;
            }
            else
            {
                B = valueStack.top();
                valueStack.pop();
            }
            if (valueStack.isEmpty())
            {
                ((ViewModel)DataContext).Result = ERROR;
                error = true;
            }
            else
            {
                A = valueStack.top();
                valueStack.pop();
            }
            Token R = null;

            if (A != null && B != null)
            {
                R = t.operate(A.getValue(), B.getValue());
                if (R.getType() == -1)
                {
                    error = true;
                }
                else
                {
                    valueStack.push(R);
                }
            }
            else
            {
                error = true;
            }
        }
예제 #2
0
        void Result()
        {
            String input          = strFormatter(((ViewModel)DataContext).Result);
            String stockOperation = ((ViewModel)DataContext).Result.Replace(" ", "");
            bool   error          = false;

            if (stockOperation == "")
            {
                error = true;
                ((ViewModel)DataContext).Result = ERROR;
            }
            TokenStack operatorStack = new TokenStack();
            TokenStack valueStack    = new TokenStack();


            // The tokens that make up the input
            String[] parts  = input.Split(' ');
            Token[]  tokens = new Token[parts.Length];
            for (int n = 0; n < parts.Length; n++)
            {
                tokens[n] = new Token(parts[n]);
            }

            // Main loop - process all input tokens
            for (int n = 0; n < tokens.Length; n++)
            {
                Token nextToken = tokens[n];
                if (nextToken.getType() == Token.NUMBER)
                {
                    valueStack.push(nextToken);
                }
                else if (nextToken.getType() == Token.OPERATOR)
                {
                    if (operatorStack.isEmpty() || nextToken.getPrecedence() > operatorStack.top().getPrecedence())
                    {
                        operatorStack.push(nextToken);
                    }
                    else
                    {
                        while (!operatorStack.isEmpty() && nextToken.getPrecedence() <= operatorStack.top().getPrecedence())
                        {
                            Token toProcess = operatorStack.top();
                            operatorStack.pop();
                            processOperator(toProcess, valueStack, ref error);
                        }
                        operatorStack.push(nextToken);
                    }
                }
                else if (nextToken.getType() == Token.LEFT_PARENTHESIS)
                {
                    operatorStack.push(nextToken);
                }
                else if (nextToken.getType() == Token.RIGHT_PARENTHESIS)
                {
                    while (!operatorStack.isEmpty() && operatorStack.top().getType() == Token.OPERATOR)
                    {
                        Token toProcess = operatorStack.top();
                        operatorStack.pop();
                        processOperator(toProcess, valueStack, ref error);
                    }
                    if (!operatorStack.isEmpty() && operatorStack.top().getType() == Token.LEFT_PARENTHESIS)
                    {
                        operatorStack.pop();
                    }
                    else
                    {
                        error = true;
                        ((ViewModel)DataContext).Result = ERROR;
                    }
                }
            }
            // Empty out the operator stack at the end of the input
            while (!operatorStack.isEmpty() && operatorStack.top().getType() == Token.OPERATOR)
            {
                Token toProcess = operatorStack.top();
                operatorStack.pop();
                processOperator(toProcess, valueStack, ref error);
            }
            // Print the result if no error has been seen.
            if (error == false)
            {
                Token result = null;
                if (valueStack.getTokens().Count != 0)
                {
                    result = valueStack.top();
                    valueStack.pop();
                }
                if (!operatorStack.isEmpty() || !valueStack.isEmpty() || result == null)
                {
                    ((ViewModel)DataContext).Result = ERROR;
                }
                else
                {
                    ((ViewModel)DataContext).Result = Convert.ToString(result.getValue());
                }
            }
            else
            {
                ((ViewModel)DataContext).Result = ERROR;
            }
            if (((ViewModel)DataContext).Result != ERROR)
            {
                ((ViewModel)DataContext).AddItem(stockOperation);
                ((ViewModel)DataContext).Calcul         = stockOperation;
                ((ViewModel)DataContext).ResultatCalcul = ((ViewModel)DataContext).Result;
            }
        }