示例#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;
}
示例#2
0
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);
}
示例#3
0
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;
}
示例#4
0
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);
}
示例#5
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));

}
示例#6
0
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;
}