| 851 | |
| 852 | |
| 853 | StateDatabase::Expression StateDatabase::infixToPrefix(const Expression& infix) { |
| 854 | Expression postfix, prefix; |
| 855 | std::stack<ExpressionToken> operators; |
| 856 | |
| 857 | for (Expression::const_iterator i = infix.begin(); i != infix.end(); i++) { |
| 858 | if ((i->getTokenType() == ExpressionToken::variable) || |
| 859 | (i->getTokenType() == ExpressionToken::number)) { |
| 860 | postfix.push_back(*i); |
| 861 | } |
| 862 | else if (i->getTokenType() == ExpressionToken::oper) { |
| 863 | if (i->getOperator() == ExpressionToken::lparen) { |
| 864 | operators.push(*i); |
| 865 | } |
| 866 | else if (i->getOperator() == ExpressionToken::rparen) { |
| 867 | // unstack operators until a matching (is found |
| 868 | while ((operators.size() > 0) && |
| 869 | (operators.top().getOperator() != ExpressionToken::lparen)) { |
| 870 | postfix.push_back(operators.top()); operators.pop(); |
| 871 | } |
| 872 | // discard ( |
| 873 | if (operators.size() > 0) { // handle extra-rparen case |
| 874 | operators.pop(); |
| 875 | } |
| 876 | } |
| 877 | else { |
| 878 | while ((operators.size() > 0) && |
| 879 | (operators.top().getPrecedence() < i->getPrecedence()) && |
| 880 | (operators.top().getOperator() != ExpressionToken::lparen)) { |
| 881 | postfix.push_back(operators.top()); operators.pop(); |
| 882 | } |
| 883 | operators.push(*i); |
| 884 | } |
| 885 | } |
| 886 | } |
| 887 | |
| 888 | while (operators.size() > 0) { |
| 889 | postfix.push_back(operators.top()); operators.pop(); |
| 890 | } |
| 891 | |
| 892 | for (Expression::reverse_iterator ri = postfix.rbegin(); ri != postfix.rend(); ri++) { |
| 893 | prefix.push_back(*ri); |
| 894 | } |
| 895 | |
| 896 | return prefix; |
| 897 | } |
| 898 | |
| 899 | |
| 900 | float StateDatabase::evaluate(Expression e) { |
nothing calls this directly
no test coverage detected