Line data Source code
1 : //
2 : // Copyright (c) 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/SourceLocation.h"
13 :
14 : namespace pp
15 : {
16 :
17 : class Diagnostics;
18 : class DirectiveHandler;
19 : class Tokenizer;
20 :
21 0 : class DirectiveParser : public Lexer
22 : {
23 : public:
24 : DirectiveParser(Tokenizer *tokenizer,
25 : MacroSet *macroSet,
26 : Diagnostics *diagnostics,
27 : DirectiveHandler *directiveHandler,
28 : int maxMacroExpansionDepth);
29 :
30 : void lex(Token *token) override;
31 :
32 : private:
33 :
34 : void parseDirective(Token *token);
35 : void parseDefine(Token *token);
36 : void parseUndef(Token *token);
37 : void parseIf(Token *token);
38 : void parseIfdef(Token *token);
39 : void parseIfndef(Token *token);
40 : void parseElse(Token *token);
41 : void parseElif(Token *token);
42 : void parseEndif(Token *token);
43 : void parseError(Token *token);
44 : void parsePragma(Token *token);
45 : void parseExtension(Token *token);
46 : void parseVersion(Token *token);
47 : void parseLine(Token *token);
48 :
49 : bool skipping() const;
50 : void parseConditionalIf(Token *token);
51 : int parseExpressionIf(Token *token);
52 : int parseExpressionIfdef(Token *token);
53 :
54 0 : struct ConditionalBlock
55 : {
56 : std::string type;
57 : SourceLocation location;
58 : bool skipBlock;
59 : bool skipGroup;
60 : bool foundValidGroup;
61 : bool foundElseGroup;
62 :
63 0 : ConditionalBlock()
64 0 : : skipBlock(false),
65 : skipGroup(false),
66 : foundValidGroup(false),
67 0 : foundElseGroup(false)
68 : {
69 0 : }
70 : };
71 : bool mPastFirstStatement;
72 : bool mSeenNonPreprocessorToken; // Tracks if a non-preprocessor token has been seen yet. Some macros, such as
73 : // #extension must be declared before all shader code.
74 : std::vector<ConditionalBlock> mConditionalStack;
75 : Tokenizer *mTokenizer;
76 : MacroSet *mMacroSet;
77 : Diagnostics *mDiagnostics;
78 : DirectiveHandler *mDirectiveHandler;
79 : int mShaderVersion;
80 : int mMaxMacroExpansionDepth;
81 : };
82 :
83 : } // namespace pp
84 :
85 : #endif // COMPILER_PREPROCESSOR_DIRECTIVEPARSER_H_
|