blob: 335091781c17e17ff18c9a5969ece32e5828de6c [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
7#ifndef COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_
8#define COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_
9
10#include "Lexer.h"
alokp@chromium.org98d04ec2012-05-21 22:47:20 +000011#include "Macro.h"
alokp@chromium.org04d7d222012-05-16 19:24:07 +000012#include "pp_utils.h"
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +000013#include "SourceLocation.h"
alokp@chromium.org04d7d222012-05-16 19:24:07 +000014
15namespace pp
16{
17
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000018class Diagnostics;
alokp@chromium.org36124de82012-05-24 02:17:43 +000019class DirectiveHandler;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000020class Tokenizer;
21
22class DirectiveParser : public Lexer
23{
24 public:
Zhenyao Mod526f982014-05-13 14:51:19 -070025 DirectiveParser(Tokenizer *tokenizer,
26 MacroSet *macroSet,
27 Diagnostics *diagnostics,
28 DirectiveHandler *directiveHandler);
alokp@chromium.org04d7d222012-05-16 19:24:07 +000029
Zhenyao Mod526f982014-05-13 14:51:19 -070030 virtual void lex(Token *token);
alokp@chromium.org04d7d222012-05-16 19:24:07 +000031
32 private:
33 PP_DISALLOW_COPY_AND_ASSIGN(DirectiveParser);
34
Zhenyao Mod526f982014-05-13 14:51:19 -070035 void parseDirective(Token *token);
36 void parseDefine(Token *token);
37 void parseUndef(Token *token);
38 void parseIf(Token *token);
39 void parseIfdef(Token *token);
40 void parseIfndef(Token *token);
41 void parseElse(Token *token);
42 void parseElif(Token *token);
43 void parseEndif(Token *token);
44 void parseError(Token *token);
45 void parsePragma(Token *token);
46 void parseExtension(Token *token);
47 void parseVersion(Token *token);
48 void parseLine(Token *token);
alokp@chromium.org04d7d222012-05-16 19:24:07 +000049
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +000050 bool skipping() const;
Zhenyao Mod526f982014-05-13 14:51:19 -070051 void parseConditionalIf(Token *token);
52 int parseExpressionIf(Token *token);
53 int parseExpressionIfdef(Token *token);
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +000054
55 struct ConditionalBlock
56 {
57 std::string type;
58 SourceLocation location;
59 bool skipBlock;
60 bool skipGroup;
61 bool foundValidGroup;
62 bool foundElseGroup;
63
Zhenyao Mod526f982014-05-13 14:51:19 -070064 ConditionalBlock()
65 : skipBlock(false),
66 skipGroup(false),
67 foundValidGroup(false),
68 foundElseGroup(false)
alokp@chromium.orgd39ec4c2012-06-26 04:37:55 +000069 {
70 }
71 };
alokp@chromium.orgd0d9f872012-07-03 16:06:40 +000072 bool mPastFirstStatement;
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;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000078};
79
80} // namespace pp
81#endif // COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_
82