#include "Ogre/Ogre.h" #include "Ogre/OgreScriptLexer.h" #include "Ogre/OgreScriptParser.h" #include <iostream> void visit(const Ogre::ConcreteNodeList &nodes) { for(Ogre::ConcreteNodeList::const_iterator i = nodes.begin(); i != nodes.end(); ++i) { Ogre::ConcreteNode * pNode = (*i).get(); Ogre::String token =pNode->token, file=pNode->file; unsigned int line=pNode->line; Ogre::ConcreteNodeType type=pNode->type; std::cout<<token<<std::endl; if (!pNode->children.empty()) { visit(pNode->children); } } } int main (void) { Ogre::String filename = "smoke.particle"; std::ifstream ifs(filename.c_str(), std::ios::in | std::ios::binary); if (ifs.fail()) { //Cannot open file; return 0; } Ogre::FileStreamDataStream * pFileStream = OGRE_NEW Ogre::FileStreamDataStream(filename, &ifs); Ogre::String str = pFileStream->getAsString(); Ogre::String source = pFileStream->getName(); Ogre::ScriptLexer lexer; Ogre::ScriptTokenListPtr tokenListPtr = lexer.tokenize(str, source); Ogre::ScriptParser parser; Ogre::ConcreteNodeListPtr nodes = parser.parse(tokenListPtr); visit(*nodes); //OGRE_DELETE pFileStream;//为什么删除会有问题呢? return 0; } 后续再深入学习 Ogre::FileStreamDataStream Ogre::ScriptLexer Ogre::ScriptParser