// | |
// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style license that can be | |
// found in the LICENSE file. | |
// | |
#ifndef COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_ | |
#define COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_ | |
#include "Lexer.h" | |
#include "Macro.h" | |
#include "pp_utils.h" | |
#include "SourceLocation.h" | |
namespace pp | |
{ | |
class Diagnostics; | |
class DirectiveHandler; | |
class Tokenizer; | |
class DirectiveParser : public Lexer | |
{ | |
public: | |
DirectiveParser(Tokenizer* tokenizer, | |
MacroSet* macroSet, | |
Diagnostics* diagnostics, | |
DirectiveHandler* directiveHandler); | |
virtual void lex(Token* token); | |
private: | |
PP_DISALLOW_COPY_AND_ASSIGN(DirectiveParser); | |
void parseDirective(Token* token); | |
void parseDefine(Token* token); | |
void parseUndef(Token* token); | |
void parseIf(Token* token); | |
void parseIfdef(Token* token); | |
void parseIfndef(Token* token); | |
void parseElse(Token* token); | |
void parseElif(Token* token); | |
void parseEndif(Token* token); | |
void parseError(Token* token); | |
void parsePragma(Token* token); | |
void parseExtension(Token* token); | |
void parseVersion(Token* token); | |
void parseLine(Token* token); | |
bool skipping() const; | |
void parseConditionalIf(Token* token); | |
int parseExpressionIf(Token* token); | |
int parseExpressionIfdef(Token* token); | |
struct ConditionalBlock | |
{ | |
std::string type; | |
SourceLocation location; | |
bool skipBlock; | |
bool skipGroup; | |
bool foundValidGroup; | |
bool foundElseGroup; | |
ConditionalBlock() : | |
skipBlock(false), | |
skipGroup(false), | |
foundValidGroup(false), | |
foundElseGroup(false) | |
{ | |
} | |
}; | |
bool mPastFirstStatement; | |
std::vector<ConditionalBlock> mConditionalStack; | |
Tokenizer* mTokenizer; | |
MacroSet* mMacroSet; | |
Diagnostics* mDiagnostics; | |
DirectiveHandler* mDirectiveHandler; | |
}; | |
} // namespace pp | |
#endif // COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_ | |