Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/angle
Path: blob/main_old/src/compiler/preprocessor/DirectiveParser.h
1693 views
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
58
struct ConditionalBlock
59
{
60
std::string type;
61
SourceLocation location;
62
bool skipBlock;
63
bool skipGroup;
64
bool foundValidGroup;
65
bool foundElseGroup;
66
67
ConditionalBlock()
68
: skipBlock(false), skipGroup(false), foundValidGroup(false), foundElseGroup(false)
69
{}
70
};
71
bool mPastFirstStatement;
72
bool mSeenNonPreprocessorToken; // Tracks if a non-preprocessor token has been seen yet. Some
73
// macros, such as
74
// #extension must be declared before all shader code.
75
std::vector<ConditionalBlock> mConditionalStack;
76
Tokenizer *mTokenizer;
77
MacroSet *mMacroSet;
78
Diagnostics *mDiagnostics;
79
DirectiveHandler *mDirectiveHandler;
80
int mShaderVersion;
81
const PreprocessorSettings mSettings;
82
};
83
84
} // namespace pp
85
86
} // namespace angle
87
88
#endif // COMPILER_PREPROCESSOR_DIRECTIVEPARSER_H_
89
90