//static Command* Command::parseTokens( Tokens& tokens, bool helpMode ) { if (tokens.empty()) THROW( CWDB_ERR_PARSER, "Bad syntax: no tokens to parse"); Command* result = 0; try { switch(tokens.front().m_angen) { case ANGEN_CREATE: parseCreate( tokens, helpMode, result ); break; case ANGEN_DESCR: parseDescr( tokens, helpMode, result ); break; case ANGEN_DROP: parseDrop( tokens, helpMode, result ); break; case ANGEN_DUMP: parseDump( tokens, helpMode, result ); break; case ANGEN_GET: case ANGEN_SET: case ANGEN_PUT: parseInput( tokens, helpMode, result ); break; case ANGEN_QUERY: parseQuery( tokens, helpMode, result ); break; case ANGEN_USE: parseUse( tokens, helpMode, result ); break; case ANGEN_GENERATE: parseGenerate( tokens, helpMode, result ); break; case ANGEN_VERSION: parseVersion( tokens, helpMode, result ); break; case ANGEN_FORMAT: parseFormat( tokens, helpMode, result ); break; case ANGEN_COMPACT: parseCompact( tokens, helpMode, result ); break; case ANGEN_UPDATE: parseUpdate( tokens, helpMode, result ); break; case ANGEN_START: case ANGEN_STOP: parseStart( tokens, helpMode, result ); break; case ANGEN_EXPORT: parseExport( tokens, helpMode, result ); break; case ANGEN_IMPORT: parseImport( tokens, helpMode, result ); break; default: THROW( CWDB_ERR_PARSER, "Bad syntax: unknown command" ); } } catch (CWDBException& e) { if (result != 0) { delete result; result = 0; } throw e; } return result; }
bool Inventory::parse(DATFile &dat) { clear(); if (!ObjectContainer::parse(dat)) return false; Common::Array<Object> &objects = getObjects(); _items.resize(objects.size()); for (uint i = 0; i < objects.size(); i++) { Object &object = objects[i]; Item &item = _items[i]; item.name = object.getName(); // Parse looks Common::List<ScriptChunk *> &lookScripts = object.getScripts(kObjectVerbLook); for (Common::List<ScriptChunk *>::iterator it = lookScripts.begin(); it != lookScripts.end(); ++it) if (!parseLook(item, **it)) return false; // Parse uses Common::List<ScriptChunk *> &useScripts = object.getScripts(kObjectVerbUse); for (Common::List<ScriptChunk *>::iterator it = useScripts.begin(); it != useScripts.end(); ++it) if (!parseUse(item, **it)) return false; // Load sprites for (Common::Array<ItemLook>::iterator it = item.looks.begin(); it != item.looks.end(); ++it) { if (_sprites.contains(it->spriteName)) // Sprite already loaded continue; Sprite *sprite = new Sprite; if (!sprite->loadFromImage(*_resources, it->spriteName)) { delete sprite; return false; } _sprites[it->spriteName] = sprite; } // Load cursors for (Common::Array<ItemUse>::iterator it = item.uses.begin(); it != item.uses.end(); ++it) { it->cursor = _cursors->getCursor(it->cursorName); if (!it->cursor) { warning("Inventory::parse(): Cursor \"%s\" does not exist", it->cursorName.c_str()); return false; } } } assignSprites(); _checkedLast = 0; updateItems(); return true; }
static void enterScope (tokenInfo *const parentToken, const vString *const extraScope, const int parentKind) { tokenInfo *token = newToken (); int origParentKind = parentToken->parentKind; copyToken (token, parentToken, TRUE); if (extraScope) { token->parentKind = parentKind; addToScope (token, extraScope, origParentKind); } readToken (token); while (token->type != TOKEN_EOF && token->type != TOKEN_CLOSE_CURLY) { boolean readNext = TRUE; switch (token->type) { case TOKEN_OPEN_CURLY: enterScope (token, NULL, -1); break; case TOKEN_KEYWORD: switch (token->keyword) { /* handle anonymous classes */ case KEYWORD_new: readToken (token); if (token->keyword != KEYWORD_class) readNext = FALSE; else { char buf[32]; tokenInfo *name = newToken (); copyToken (name, token, TRUE); snprintf (buf, sizeof buf, "AnonymousClass%u", ++AnonymousID); vStringCopyS (name->string, buf); readNext = parseClassOrIface (token, K_CLASS, name); deleteToken (name); } break; case KEYWORD_class: readNext = parseClassOrIface (token, K_CLASS, NULL); break; case KEYWORD_interface: readNext = parseClassOrIface (token, K_INTERFACE, NULL); break; case KEYWORD_trait: readNext = parseTrait (token); break; case KEYWORD_function: readNext = parseFunction (token, NULL); break; case KEYWORD_const: readNext = parseConstant (token); break; case KEYWORD_define: readNext = parseDefine (token); break; case KEYWORD_use: /* aliases are only allowed at root scope, but the keyword * is also used to i.e. "import" traits into a class */ if (vStringLength (token->scope) == 0) readNext = parseUse (token); break; case KEYWORD_namespace: readNext = parseNamespace (token); break; case KEYWORD_private: CurrentStatement.access = ACCESS_PRIVATE; break; case KEYWORD_protected: CurrentStatement.access = ACCESS_PROTECTED; break; case KEYWORD_public: CurrentStatement.access = ACCESS_PUBLIC; break; case KEYWORD_var: CurrentStatement.access = ACCESS_PUBLIC; break; case KEYWORD_abstract: CurrentStatement.impl = IMPL_ABSTRACT; break; default: break; } break; case TOKEN_VARIABLE: readNext = parseVariable (token); break; default: break; } if (readNext) readToken (token); } copyToken (parentToken, token, FALSE); parentToken->parentKind = origParentKind; deleteToken (token); }