blob: f0e889c8a081603ff399d98379a5c58f0a9b6a75 [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"
12#include "compiler/preprocessor/SourceLocation.h"
alokp@chromium.org04d7d222012-05-16 19:24:07 +000013
14namespace pp
15{
16
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000017class Diagnostics;
alokp@chromium.org36124de82012-05-24 02:17:43 +000018class DirectiveHandler;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000019class Tokenizer;
20
21class DirectiveParser : public Lexer
22{
23 public:
Zhenyao Mod526f982014-05-13 14:51:19 -070024 DirectiveParser(Tokenizer *tokenizer,
25 MacroSet *macroSet,
26 Diagnostics *diagnostics,
27 DirectiveHandler *directiveHandler);
alokp@chromium.org04d7d222012-05-16 19:24:07 +000028
Corentin Walleze5a1f272015-08-21 02:58:25 +020029 void lex(Token *token) override;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000030
31 private:
alokp@chromium.org04d7d222012-05-16 19:24:07 +000032
Zhenyao Mod526f982014-05-13 14:51:19 -070033 void parseDirective(Token *token);
34 void parseDefine(Token *token);
35 void parseUndef(Token *token);
36 void parseIf(Token *token);
37 void parseIfdef(Token *token);
38 void parseIfndef(Token *token);
39 void parseElse(Token *token);
40 void parseElif(Token *token);
41 void parseEndif(Token *token);
42 void parseError(Token *token);
43 void parsePragma(Token *token);
44 void parseExtension(Token *token);
45 void parseVersion(Token *token);
46 void parseLine(Token *token);
alokp@chromium.org04d7d222012-05-16 19:24:07 +000047
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +000048 bool skipping() const;
Zhenyao Mod526f982014-05-13 14:51:19 -070049 void parseConditionalIf(Token *token);
50 int parseExpressionIf(Token *token);
51 int parseExpressionIfdef(Token *token);
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +000052
53 struct ConditionalBlock
54 {
55 std::string type;
56 SourceLocation location;
57 bool skipBlock;
58 bool skipGroup;
59 bool foundValidGroup;
60 bool foundElseGroup;
61
Zhenyao Mod526f982014-05-13 14:51:19 -070062 ConditionalBlock()
63 : skipBlock(false),
64 skipGroup(false),
65 foundValidGroup(false),
66 foundElseGroup(false)
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +000067 {
68 }
69 };
alokp@chromium.orgd0d9f872012-07-03 16:06:40 +000070 bool mPastFirstStatement;
Geoff Lang06e24a72015-04-27 14:48:59 -040071 bool mSeenNonPreprocessorToken; // Tracks if a non-preprocessor token has been seen yet. Some macros, such as
72 // #extension must be declared before all shader code.
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +000073 std::vector<ConditionalBlock> mConditionalStack;
Zhenyao Mod526f982014-05-13 14:51:19 -070074 Tokenizer *mTokenizer;
75 MacroSet *mMacroSet;
76 Diagnostics *mDiagnostics;
77 DirectiveHandler *mDirectiveHandler;
Geoff Langb3a6a8f2015-06-23 16:10:14 -040078 int mShaderVersion;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000079};
80
81} // namespace pp
alokp@chromium.org04d7d222012-05-16 19:24:07 +000082
Geoff Lang0a73dd82014-11-19 16:18:08 -050083#endif // COMPILER_PREPROCESSOR_DIRECTIVEPARSER_H_