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