blob: 84c6ec4692dbc55e9dd47a43fedd121fc034fb89 [file] [log] [blame]
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001//
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
Geoff Lang0a73dd82014-11-19 16:18:08 -05007#ifndef COMPILER_PREPROCESSOR_DIRECTIVEPARSER_H_
8#define COMPILER_PREPROCESSOR_DIRECTIVEPARSER_H_
alokp@chromium.org04d7d222012-05-16 19:24:07 +00009
Corentin Wallez054f7ed2016-09-20 17:15:59 -040010#include "compiler/preprocessor/Lexer.h"
11#include "compiler/preprocessor/Macro.h"
Jamie Madillc3bef3e2018-10-03 07:35:09 -040012#include "compiler/preprocessor/Preprocessor.h"
Corentin Wallez054f7ed2016-09-20 17:15:59 -040013#include "compiler/preprocessor/SourceLocation.h"
alokp@chromium.org04d7d222012-05-16 19:24:07 +000014
Geoff Lang197d5292018-04-25 14:29:00 -040015namespace angle
16{
17
alokp@chromium.org04d7d222012-05-16 19:24:07 +000018namespace pp
19{
20
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000021class Diagnostics;
alokp@chromium.org36124de82012-05-24 02:17:43 +000022class DirectiveHandler;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000023class Tokenizer;
24
25class DirectiveParser : public Lexer
26{
27 public:
Zhenyao Mod526f982014-05-13 14:51:19 -070028 DirectiveParser(Tokenizer *tokenizer,
29 MacroSet *macroSet,
30 Diagnostics *diagnostics,
Olli Etuahof1cf5e62016-11-22 17:36:49 +000031 DirectiveHandler *directiveHandler,
Jamie Madillc3bef3e2018-10-03 07:35:09 -040032 const PreprocessorSettings &settings);
Jamie Madillacf2f3a2017-11-21 19:22:44 -050033 ~DirectiveParser() override;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000034
Corentin Walleze5a1f272015-08-21 02:58:25 +020035 void lex(Token *token) override;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000036
37 private:
Zhenyao Mod526f982014-05-13 14:51:19 -070038 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);
alokp@chromium.org04d7d222012-05-16 19:24:07 +000052
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +000053 bool skipping() const;
Zhenyao Mod526f982014-05-13 14:51:19 -070054 void parseConditionalIf(Token *token);
55 int parseExpressionIf(Token *token);
56 int parseExpressionIfdef(Token *token);
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +000057
58 struct ConditionalBlock
59 {
60 std::string type;
61 SourceLocation location;
62 bool skipBlock;
63 bool skipGroup;
64 bool foundValidGroup;
65 bool foundElseGroup;
66
Zhenyao Mod526f982014-05-13 14:51:19 -070067 ConditionalBlock()
Jamie Madillf832c9d2016-12-12 17:38:48 -050068 : skipBlock(false), skipGroup(false), foundValidGroup(false), foundElseGroup(false)
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +000069 {
70 }
71 };
alokp@chromium.orgd0d9f872012-07-03 16:06:40 +000072 bool mPastFirstStatement;
Jamie Madillf832c9d2016-12-12 17:38:48 -050073 bool mSeenNonPreprocessorToken; // Tracks if a non-preprocessor token has been seen yet. Some
74 // macros, such as
75 // #extension must be declared before all shader code.
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +000076 std::vector<ConditionalBlock> mConditionalStack;
Zhenyao Mod526f982014-05-13 14:51:19 -070077 Tokenizer *mTokenizer;
78 MacroSet *mMacroSet;
79 Diagnostics *mDiagnostics;
80 DirectiveHandler *mDirectiveHandler;
Geoff Langb3a6a8f2015-06-23 16:10:14 -040081 int mShaderVersion;
Jamie Madillc3bef3e2018-10-03 07:35:09 -040082 const PreprocessorSettings mSettings;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000083};
84
85} // namespace pp
alokp@chromium.org04d7d222012-05-16 19:24:07 +000086
Geoff Lang197d5292018-04-25 14:29:00 -040087} // namespace angle
88
Geoff Lang0a73dd82014-11-19 16:18:08 -050089#endif // COMPILER_PREPROCESSOR_DIRECTIVEPARSER_H_