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; }
bool EXParser::priorityOperatorLoop(std::string &_expression) { for(EXOperatorSet::iterator oiter = operators.begin(); oiter!=operators.end(); ++oiter){ for(size_t index = 0; index<_expression.length(); index++){ if(oiter->first == _expression[index] && !isScientificNotation(_expression, index)){ if(oiter->first != '-' || !isNegitiveSign(_expression, index)){ std::string prevExpression = _expression; if(!evaluateOperator(_expression, index, oiter)) return false; steps.push_back(EXSolveStep(prevExpression.append(" -> ").append(_expression), std::string(&oiter->first, 1))); oiter = operators.begin(); //reset operator loop to beginning } } } } return true; }
std::string EXParser::evaluate(std::string _expression) { steps.clear(); //clear previous solve steps findAndReplaceVariables(_expression, this->variables); try{ prepareExpression(_expression); priorityLoop(_expression); //main calculation loop } catch(EXError &error){ steps.push_back(EXSolveStep(error.first, "stopped_evaluation")); return error.first; } return _expression; }
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)); }