void DirectiveParser::parseDirective(Token *token) { assert(token->type == Token::PP_HASH); mTokenizer->lex(token); if (isEOD(token)) { // Empty Directive. return; } DirectiveType directive = getDirective(token); // While in an excluded conditional block/group, // we only parse conditional directives. if (skipping() && !isConditionalDirective(directive)) { skipUntilEOD(mTokenizer, token); return; } switch(directive) { case DIRECTIVE_NONE: mDiagnostics->report(Diagnostics::PP_DIRECTIVE_INVALID_NAME, token->location, token->text); skipUntilEOD(mTokenizer, token); break; case DIRECTIVE_DEFINE: parseDefine(token); break; case DIRECTIVE_UNDEF: parseUndef(token); break; case DIRECTIVE_IF: parseIf(token); break; case DIRECTIVE_IFDEF: parseIfdef(token); break; case DIRECTIVE_IFNDEF: parseIfndef(token); break; case DIRECTIVE_ELSE: parseElse(token); break; case DIRECTIVE_ELIF: parseElif(token); break; case DIRECTIVE_ENDIF: parseEndif(token); break; case DIRECTIVE_ERROR: parseError(token); break; case DIRECTIVE_PRAGMA: parsePragma(token); break; case DIRECTIVE_EXTENSION: parseExtension(token); break; case DIRECTIVE_VERSION: parseVersion(token); break; case DIRECTIVE_LINE: parseLine(token); break; default: assert(false); break; } skipUntilEOD(mTokenizer, token); if (token->type == Token::LAST) { mDiagnostics->report(Diagnostics::PP_EOF_IN_DIRECTIVE, token->location, token->text); } }
LEXTOKEN Lexan::checkKeyword(void) { // Check keywords if(m_string == "function") return LEX_FUNCTION; if(m_string == "return") return LEX_RETURN; if(m_string == "if") return LEX_IF; if(m_string == "else") return LEX_ELSE; if(m_string == "while") return LEX_WHILE; if(m_string == "for") return LEX_FOR; if(m_string == "foreach") return LEX_FOREACH; if(m_string == "break") return LEX_BREAK; if(m_string == "continue") return LEX_CONTINUE; if(m_string == "null") return LEX_NULL; if(m_string == "true") return LEX_TRUE; if(m_string == "false") return LEX_FALSE; if(m_string == "global") return LEX_GLOBAL; if(m_string == "__FILE__") { m_string = ID2STR(m_source.top()->getFile()); return LEX_STRING; } if(m_string == "__LINE__") { m_int = m_source.top()->getLine(); return LEX_INT; } if(m_string == "__FUNCTION__") { m_string = ID2STR(m_currently_processed_function); return LEX_STRING; } // Check include and define if(m_string == "include") { parseInclude(); return nextToken(); } if(m_string == "define") { parseDefine(); return nextToken(); } // Try to expand a macro if(expandMacro()) return nextToken(); // The string is variable or function name m_identifier = STR2ID(m_string); return LEX_IDENTIFIER; }
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_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); }
// ----------------------------------------------------------------------------- // Reads in a ZDoom-format TEXTURES entry. // Returns true on success, false otherwise // ----------------------------------------------------------------------------- bool TextureXList::readTEXTURESData(ArchiveEntry* textures) { // Check for empty entry if (!textures) { Global::error = "Attempt to read texture data from NULL entry"; return false; } if (textures->size() == 0) { txformat_ = Format::Textures; return true; } // Get text to parse Tokenizer tz; tz.openMem(textures->data(), textures->name()); // Parsing gogo while (!tz.atEnd()) { // Texture definition if (tz.checkNC("Texture")) { auto tex = std::make_unique<CTexture>(); if (tex->parse(tz, "Texture")) addTexture(std::move(tex)); } // Sprite definition else if (tz.checkNC("Sprite")) { auto tex = std::make_unique<CTexture>(); if (tex->parse(tz, "Sprite")) addTexture(std::move(tex)); } // Graphic definition else if (tz.checkNC("Graphic")) { auto tex = std::make_unique<CTexture>(); if (tex->parse(tz, "Graphic")) addTexture(std::move(tex)); } // WallTexture definition else if (tz.checkNC("WallTexture")) { auto tex = std::make_unique<CTexture>(); if (tex->parse(tz, "WallTexture")) addTexture(std::move(tex)); } // Flat definition else if (tz.checkNC("Flat")) { auto tex = std::make_unique<CTexture>(); if (tex->parse(tz, "Flat")) addTexture(std::move(tex)); } // Old HIRESTEX "Define" else if (tz.checkNC("Define")) { auto tex = std::make_unique<CTexture>(); if (tex->parseDefine(tz)) addTexture(std::move(tex)); } tz.adv(); } txformat_ = Format::Textures; return true; }