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