Example #1
0
void
XmlConfig::XmlConfigData::resolveVariables(std::string &val) const {
    size_t pos_begin = std::string::npos;
    while(true) {
        pos_begin = val.rfind("${", pos_begin);
        if (pos_begin == std::string::npos) {
            return;
        }
        size_t pos_end = val.find('}', pos_begin);
        std::string name = val.substr(pos_begin + 2, pos_end - pos_begin - 2);
        if (checkVariableName(name)) {
            val.replace(pos_begin, pos_end - pos_begin + 1, findVariable(name));
        }
        else {
            throw std::runtime_error("incorrect variable name format: " + name);
        }
    }
}
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function Name: build
// Purpose:
// Inputs:
// Output:
// Notes:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
RPNExpression ExpressionBuilder::build() {
	for (map<string, CustomOperator *>::iterator iter = m_customOperators.begin(); iter != m_customOperators.end(); ++iter) {
		CustomOperator *pop = (*iter).second;
		for (int i = 0; i < (int)(pop -> symbol().length()); i++) {
			list<char>::iterator iter = find(m_validOperatorSymbols.begin(), m_validOperatorSymbols.end(), pop -> symbol()[i]);
			if (iter == m_validOperatorSymbols.end())
				throw new UnparsableExpressionException("" + pop -> symbol() + " is not a valid symbol for an operator please choose from: !,#,ยง,$,&,;,:,~,<,>,|,=");
		}
		m_builtInOperators.insert(*iter);
	}

	for (map<string, double>::iterator iter = m_variables.begin(); iter != m_variables.end(); ++iter) {
		string varName = (*iter).first;
		checkVariableName(varName);
		if (m_customFunctions.find(varName) != m_customFunctions.end())
			throw new UnparsableExpressionException("Variable '" + varName + "' cannot have the same name as a function");
	}
	RPNConverter rpnConverter;
	RPNExpression rpnExpr = rpnConverter.toRPNExpression(m_expression, m_variables, m_customFunctions, m_builtInOperators);
	return rpnExpr;
}