void ConfigLoader::parseScript(std::ifstream &stream) { //Get first token _nextToken(stream); if (tok == TOKEN_EOF) { stream.close(); return; } //Parse the script _parseNodes(stream, 0); stream.close(); }
void ConfigLoader::_parseNodes(std::ifstream &stream, ConfigNode *parent) { typedef std::pair<std::string, ConfigNode*> ScriptItem; while (true) { switch (tok) { //Node case TOKEN_Text: //Add the new node ConfigNode *newNode; if (parent) { newNode = parent->addChild(tokVal); } else { newNode = new ConfigNode(0, tokVal); } //Get values _nextToken(stream); while (tok == TOKEN_Text) { newNode->addValue(tokVal); _nextToken(stream); } //Add root nodes to scriptList if (!parent){ std::string key; if (newNode->getValues().empty()) { key = newNode->getName() + ' '; } else { key = newNode->getName() + ' ' + newNode->getValues().front(); } m_scriptList.insert(ScriptItem(key, newNode)); } _skipNewLines(stream); //Add any sub-nodes if (tok == TOKEN_OpenBrace) { //Parse nodes _nextToken(stream); _parseNodes(stream, newNode); //Check for matching closing brace if (tok != TOKEN_CloseBrace) { throw std::runtime_error("Parse Error: Expecting closing brace"); } _nextToken(stream); _skipNewLines(stream); } break; //Out of place brace case TOKEN_OpenBrace: throw std::runtime_error("Parse Error: Opening brace out of plane"); break; //Return if end of nodes have been reached case TOKEN_CloseBrace: return; //Return if reached end of file case TOKEN_EOF: return; case TOKEN_NewLine: _nextToken(stream); break; } }; }
void ScriptLoader::_parseNodes(std::ifstream &stream, ScriptNode *parent) { typedef std::pair<std::string, ScriptNode*> ScriptItem; while (true) { switch (mToken) { //Node case TOKEN_Text: { //Add the new node ScriptNode *newNode; if (parent) { newNode = parent->addChild(mTokenValue); } else { newNode = new ScriptNode(0, mTokenValue); } //Get values _nextToken(stream); std::string valueStr; int i=0; while (mToken == TOKEN_Text) { if (i == 0) valueStr += mTokenValue; else valueStr += " " + mTokenValue; _nextToken(stream); ++i; } newNode->setValue(valueStr); //Add root nodes to scriptList if (!parent) { std::string key; if (newNode->getValue() == "") throw std::runtime_error("Root node must have a name (\"" + newNode->getName() + "\")"); key = newNode->getValue(); m_scriptList.insert(ScriptItem(key, newNode)); } _skipNewLines(stream); //Add any sub-nodes if (mToken == TOKEN_OpenBrace) { //Parse nodes _nextToken(stream); _parseNodes(stream, newNode); //Check for matching closing brace if (mToken != TOKEN_CloseBrace) { throw std::runtime_error("Parse Error: Expecting closing brace"); } _nextToken(stream); _skipNewLines(stream); } newNode->mFileName = mCurrentFileName; break; } //Out of place brace case TOKEN_OpenBrace: throw std::runtime_error("Parse Error: Opening brace out of plane"); break; //Return if end of nodes have been reached case TOKEN_CloseBrace: return; //Return if reached end of file case TOKEN_EOF: return; case TOKEN_NewLine: _nextToken(stream); break; } }; }