00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "expr_evaluator.hpp"
00025
00026
00027 void ExprEvaluator::parse( const string &rExpr )
00028 {
00029 m_stack.clear();
00030
00031 const char *pString = rExpr.c_str();
00032 list<string> opStack;
00033 string token;
00034
00035
00036 int begin = 0, end = 0;
00037 while( pString[begin] )
00038 {
00039
00040 while( pString[begin] == ' ' )
00041 {
00042 begin++;
00043 }
00044
00045 if( pString[begin] == '(' )
00046 {
00047
00048 opStack.push_back( "(" );
00049 begin++;
00050 }
00051 else if( pString[begin] == ')' )
00052 {
00053
00054 while( !opStack.empty() )
00055 {
00056
00057 string lastOp = opStack.back();
00058 opStack.pop_back();
00059 if( lastOp == "(" )
00060 {
00061 break;
00062 }
00063
00064 m_stack.push_back( lastOp );
00065 }
00066 begin++;
00067 }
00068 else
00069 {
00070
00071 end = begin;
00072 while( pString[end] && pString[end] != ' ' && pString[end] != ')' )
00073 {
00074 end++;
00075 }
00076
00077 token = rExpr.substr( begin, end - begin );
00078 begin = end;
00079
00080
00081 if( token == "not" || token == "or" || token == "and" )
00082 {
00083
00084
00085 while( !opStack.empty() &&
00086 hasPrecedency( token, opStack.back() ) )
00087 {
00088
00089 string lastOp = opStack.back();
00090 opStack.pop_back();
00091 m_stack.push_back( lastOp );
00092 }
00093 opStack.push_back( token );
00094 }
00095 else
00096 {
00097 m_stack.push_back( token );
00098 }
00099 }
00100 }
00101
00102 while( !opStack.empty() )
00103 {
00104 string lastOp = opStack.back();
00105 opStack.pop_back();
00106 m_stack.push_back( lastOp );
00107 }
00108 }
00109
00110
00111 string ExprEvaluator::getToken()
00112 {
00113 if( !m_stack.empty() )
00114 {
00115 string token = m_stack.front();
00116 m_stack.pop_front();
00117 return token;
00118 }
00119 return "";
00120 }
00121
00122
00123 bool ExprEvaluator::hasPrecedency( const string &op1, const string &op2 ) const
00124 {
00125
00126 if( op1 == "(" )
00127 {
00128 return true;
00129 }
00130 if( op1 == "and" )
00131 {
00132 return (op2 == "or") || (op2 == "not" );
00133 }
00134 if( op1 == "or" )
00135 {
00136 return (op2 == "not" );
00137 }
00138 return false;
00139 }
00140