xref: /aosp_15_r20/external/angle/src/compiler/preprocessor/DirectiveParser.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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