Exemple #1
0
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;
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
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));

}