コード例 #1
0
	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();
	}
コード例 #2
0
	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;
			}
		};
	}
コード例 #3
0
ファイル: ScriptLoader.cpp プロジェクト: 0xmono/openmw
	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;
			}
		};
	}