bool EXParser::evaluateFunction(std::string &_expression, const int index, EXFunctionSet::iterator fiter) { std::string paramExpression = isolateParenthesisExpression(_expression, index); size_t expressionLen = paramExpression.length(); if(expressionLen == 0){ mErrorStr = "function parameter error"; return false; } if(!priorityLoop(paramExpression)) return false; double value = fiter->second((double)atof(paramExpression.c_str())); if(isInf(value)){ mErrorStr = "infinity error"; return false; } if(isNan(value)){ mErrorStr = "not a number error"; return false; } steps.push_back(EXSolveStep(fiter->first+"("+paramExpression+") -> "+dblToStr(value), "")); _expression.replace(index-fiter->first.length(), fiter->first.length()+expressionLen+2, dblToStr(value)); return true; }
void EXParser::findAndReplaceVariables(std::string &_expression, EXVariableSet &_variables) { for(EXVariableSet::iterator vIter = _variables.begin(); vIter!=_variables.end(); ++vIter){ size_t j, start_index = 0; for(; (j = _expression.find(vIter->first, start_index))!=std::string::npos;){ bool is_var = true; if((int)(j+vIter->first.length())<_expression.length()){ if(isalpha(_expression.at((int)j+vIter->first.length()))){ is_var = false; } } if((int)(j-1)>0){ if(isalpha(_expression.at((int)(j-1)))){ is_var = false;; } } if(is_var){ _expression.replace(j, vIter->first.length(), dblToStr(vIter->second)); } else{ start_index = j+vIter->first.length(); } } } }
void EXParser::evaluateFunction(std::string &_expression, const int index, EXFunctionSet::iterator fiter) { std::string paramExpression = isolateParenthesisExpression(_expression, index); size_t expressionLen = paramExpression.length(); if(expressionLen == 0){ throw EXError("function_parameter_error", ErrorIndex::FUNCTION_PARAMETER_ERROR); } priorityLoop(paramExpression); double value = fiter->second((double)atof(paramExpression.c_str())); if(isInf(value)){ throw EXError("infinity_error", ErrorIndex::INFINITY_ERROR); } if(isNan(value)){ throw EXError("not_a_number", ErrorIndex::NAN_ERROR); } steps.push_back(EXSolveStep(fiter->first+"("+paramExpression+") -> "+dblToStr(value), "")); _expression.replace(index-fiter->first.length(), fiter->first.length()+expressionLen+2, dblToStr(value)); }
bool EXParser::evaluateOperator(std::string & _expression, const int index, EXOperatorSet::iterator oiter) { if(oiter->first!='('){ std::string leftVal, rightVal, strVal; if((leftVal = getLeftOfOperator(_expression, index-1)).empty() || (rightVal = getRightOfOperator(_expression, index+1)).empty()){ mErrorStr = "operator logic error"; return false; } double value = oiter->second(strToDbl(leftVal.c_str()), strToDbl(rightVal.c_str())); if(isInf(value)){ mErrorStr = "infinity error"; return false; } if(isNan(value)){ mErrorStr = "not a number"; return false; } _expression.replace(index-leftVal.length(), leftVal.length() + rightVal.length()+1, dblToStr(value)); } else{ evaluateParenthesis(_expression, index); } return true; }
void EXParser::evaluateOperator(std::string & _expression, const int index, EXOperatorSet::iterator oiter) { if(oiter->first!='('){ std::string leftVal, rightVal, strVal; if((leftVal = getLeftOfOperator(_expression, index-1)).empty() || (rightVal = getRightOfOperator(_expression, index+1)).empty()){ throw EXError("operator_logic_error", ErrorIndex::OPERATOR_LOGIC_ERROR); } double value = oiter->second(strToDbl(leftVal.c_str()), strToDbl(rightVal.c_str())); if(isInf(value)){ throw EXError("infinity_error", ErrorIndex::INFINITY_ERROR); } if(isNan(value)){ throw EXError("not_a_number", ErrorIndex::NAN_ERROR); } _expression.replace(index-leftVal.length(), leftVal.length() + rightVal.length()+1, dblToStr(value)); } else{ evaluateParenthesis(_expression, index); } }