shared_ptr<Statement> Parser::parseIf() { shared_ptr<IfStmt> ifstmt = make_shared<IfStmt>(); ifstmt->value = *it; currNode = ifstmt; it++; auto cond = parseExpression(); ifstmt->condition = cond; match(THEN); it++; if (match(BEGIN)) { currNode = ifstmt; shared_ptr<Statement> body = parseStmtList(END); ifstmt->thenBody=body; match(END); it++; match(SEMI); } else { shared_ptr<Statement> body1 = parseStatement(); ifstmt->thenBody = body1; } ifstmt->haveElse = false; while (advance(ELSE)) { ifstmt->haveElse = true; it++; shared_ptr<ElseStmt> elseStmt = static_pointer_cast<ElseStmt>(parseElse()); ifstmt->elseBody = elseStmt; } return ifstmt; }
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); } }