1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2012 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker #ifndef COMPILER_PREPROCESSOR_DIRECTIVEPARSER_H_ 8*8975f5c5SAndroid Build Coastguard Worker #define COMPILER_PREPROCESSOR_DIRECTIVEPARSER_H_ 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #include "compiler/preprocessor/Lexer.h" 11*8975f5c5SAndroid Build Coastguard Worker #include "compiler/preprocessor/Macro.h" 12*8975f5c5SAndroid Build Coastguard Worker #include "compiler/preprocessor/Preprocessor.h" 13*8975f5c5SAndroid Build Coastguard Worker #include "compiler/preprocessor/SourceLocation.h" 14*8975f5c5SAndroid Build Coastguard Worker 15*8975f5c5SAndroid Build Coastguard Worker namespace angle 16*8975f5c5SAndroid Build Coastguard Worker { 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard Worker namespace pp 19*8975f5c5SAndroid Build Coastguard Worker { 20*8975f5c5SAndroid Build Coastguard Worker 21*8975f5c5SAndroid Build Coastguard Worker class Diagnostics; 22*8975f5c5SAndroid Build Coastguard Worker class DirectiveHandler; 23*8975f5c5SAndroid Build Coastguard Worker class Tokenizer; 24*8975f5c5SAndroid Build Coastguard Worker 25*8975f5c5SAndroid Build Coastguard Worker class DirectiveParser : public Lexer 26*8975f5c5SAndroid Build Coastguard Worker { 27*8975f5c5SAndroid Build Coastguard Worker public: 28*8975f5c5SAndroid Build Coastguard Worker DirectiveParser(Tokenizer *tokenizer, 29*8975f5c5SAndroid Build Coastguard Worker MacroSet *macroSet, 30*8975f5c5SAndroid Build Coastguard Worker Diagnostics *diagnostics, 31*8975f5c5SAndroid Build Coastguard Worker DirectiveHandler *directiveHandler, 32*8975f5c5SAndroid Build Coastguard Worker const PreprocessorSettings &settings); 33*8975f5c5SAndroid Build Coastguard Worker ~DirectiveParser() override; 34*8975f5c5SAndroid Build Coastguard Worker 35*8975f5c5SAndroid Build Coastguard Worker void lex(Token *token) override; 36*8975f5c5SAndroid Build Coastguard Worker 37*8975f5c5SAndroid Build Coastguard Worker private: 38*8975f5c5SAndroid Build Coastguard Worker void parseDirective(Token *token); 39*8975f5c5SAndroid Build Coastguard Worker void parseDefine(Token *token); 40*8975f5c5SAndroid Build Coastguard Worker void parseUndef(Token *token); 41*8975f5c5SAndroid Build Coastguard Worker void parseIf(Token *token); 42*8975f5c5SAndroid Build Coastguard Worker void parseIfdef(Token *token); 43*8975f5c5SAndroid Build Coastguard Worker void parseIfndef(Token *token); 44*8975f5c5SAndroid Build Coastguard Worker void parseElse(Token *token); 45*8975f5c5SAndroid Build Coastguard Worker void parseElif(Token *token); 46*8975f5c5SAndroid Build Coastguard Worker void parseEndif(Token *token); 47*8975f5c5SAndroid Build Coastguard Worker void parseError(Token *token); 48*8975f5c5SAndroid Build Coastguard Worker void parsePragma(Token *token); 49*8975f5c5SAndroid Build Coastguard Worker void parseExtension(Token *token); 50*8975f5c5SAndroid Build Coastguard Worker void parseVersion(Token *token); 51*8975f5c5SAndroid Build Coastguard Worker void parseLine(Token *token); 52*8975f5c5SAndroid Build Coastguard Worker 53*8975f5c5SAndroid Build Coastguard Worker bool skipping() const; 54*8975f5c5SAndroid Build Coastguard Worker void parseConditionalIf(Token *token); 55*8975f5c5SAndroid Build Coastguard Worker int parseExpressionIf(Token *token); 56*8975f5c5SAndroid Build Coastguard Worker int parseExpressionIfdef(Token *token); 57*8975f5c5SAndroid Build Coastguard Worker void handleVersion(const SourceLocation &location); 58*8975f5c5SAndroid Build Coastguard Worker 59*8975f5c5SAndroid Build Coastguard Worker struct ConditionalBlock 60*8975f5c5SAndroid Build Coastguard Worker { 61*8975f5c5SAndroid Build Coastguard Worker std::string type; 62*8975f5c5SAndroid Build Coastguard Worker SourceLocation location; 63*8975f5c5SAndroid Build Coastguard Worker bool skipBlock; 64*8975f5c5SAndroid Build Coastguard Worker bool skipGroup; 65*8975f5c5SAndroid Build Coastguard Worker bool foundValidGroup; 66*8975f5c5SAndroid Build Coastguard Worker bool foundElseGroup; 67*8975f5c5SAndroid Build Coastguard Worker ConditionalBlockConditionalBlock68*8975f5c5SAndroid Build Coastguard Worker ConditionalBlock() 69*8975f5c5SAndroid Build Coastguard Worker : skipBlock(false), skipGroup(false), foundValidGroup(false), foundElseGroup(false) 70*8975f5c5SAndroid Build Coastguard Worker {} 71*8975f5c5SAndroid Build Coastguard Worker }; 72*8975f5c5SAndroid Build Coastguard Worker bool mHandledVersion; 73*8975f5c5SAndroid Build Coastguard Worker bool mPastFirstStatement; 74*8975f5c5SAndroid Build Coastguard Worker bool mSeenNonPreprocessorToken; // Tracks if a non-preprocessor token has been seen yet. Some 75*8975f5c5SAndroid Build Coastguard Worker // macros, such as 76*8975f5c5SAndroid Build Coastguard Worker // #extension must be declared before all shader code. 77*8975f5c5SAndroid Build Coastguard Worker std::vector<ConditionalBlock> mConditionalStack; 78*8975f5c5SAndroid Build Coastguard Worker Tokenizer *mTokenizer; 79*8975f5c5SAndroid Build Coastguard Worker MacroSet *mMacroSet; 80*8975f5c5SAndroid Build Coastguard Worker Diagnostics *mDiagnostics; 81*8975f5c5SAndroid Build Coastguard Worker DirectiveHandler *mDirectiveHandler; 82*8975f5c5SAndroid Build Coastguard Worker int mShaderVersion; 83*8975f5c5SAndroid Build Coastguard Worker const PreprocessorSettings mSettings; 84*8975f5c5SAndroid Build Coastguard Worker }; 85*8975f5c5SAndroid Build Coastguard Worker 86*8975f5c5SAndroid Build Coastguard Worker } // namespace pp 87*8975f5c5SAndroid Build Coastguard Worker 88*8975f5c5SAndroid Build Coastguard Worker } // namespace angle 89*8975f5c5SAndroid Build Coastguard Worker 90*8975f5c5SAndroid Build Coastguard Worker #endif // COMPILER_PREPROCESSOR_DIRECTIVEPARSER_H_ 91