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::evaluateParenthesis(std::string & _expression, const int index) { std::string tempExpression = isolateParenthesisExpression(_expression, index); size_t expressionLen = tempExpression.length(); priorityOperatorLoop(tempExpression); _expression.replace(index, expressionLen+2, tempExpression); }
bool EXParser::evaluateParenthesis(std::string & _expression, const int index) { std::string tempExpression = isolateParenthesisExpression(_expression, index); size_t expressionLen = tempExpression.length(); if(!priorityOperatorLoop(tempExpression)) return false; _expression.replace(index, expressionLen+2, tempExpression); return true; }
void EXParser::evaluateFormula(std::string &_expression, const int index, EXFormulaSet::iterator foiter) { EXVariableSet formulaVariables; std::vector<std::string> formulaVariableNames, formulaVariableValues; std::string formulaParameters = isolateParenthesisExpression(_expression, index), formulaExpression = foiter->second, token; int formulaParamLen = formulaParameters.length(); priorityLoop(formulaParameters); splitString(formulaVariableNames, foiter->third); splitString(formulaVariableValues, formulaParameters); if(formulaVariableNames.size()!=formulaVariableValues.size()){ throw EXError("formula_parameter_error", ErrorIndex::FORMULA_PARAMETER_ERROR); } for(int i=0; i<formulaVariableNames.size(); i++){ formulaVariables.push_back(EXVariable(formulaVariableNames.at(i), atof(formulaVariableValues.at(i).c_str()))); } findAndReplaceVariables(formulaExpression, formulaVariables); _expression.replace(index-foiter->first.length(), foiter->first.length()+formulaParamLen+2, formulaExpression); }
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::evaluateFormula(std::string &_expression, const int index, EXFormulaSet::iterator foiter) { EXVariableSet formulaVariables; std::vector<std::string> formulaVariableNames, formulaVariableValues; std::string formulaParameters = isolateParenthesisExpression(_expression, index), formulaExpression = foiter->second, token; int formulaParamLen = formulaParameters.length(); priorityLoop(formulaParameters); splitString(formulaVariableNames, foiter->third); splitString(formulaVariableValues, formulaParameters); if(formulaVariableNames.size()!=formulaVariableValues.size()){ mErrorStr = "formula parameter error"; return false; } for(unsigned int i=0; i<formulaVariableNames.size(); i++){ formulaVariables.push_back(EXVariable(formulaVariableNames.at(i), atof(formulaVariableValues.at(i).c_str()))); } findAndReplaceVariables(formulaExpression, formulaVariables); _expression.replace(index-foiter->first.length(), foiter->first.length()+formulaParamLen+2, formulaExpression); return true; }