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