• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_DIRECTIVE_PARSER_H_
8 #define COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_
9 
10 #include "Lexer.h"
11 #include "Macro.h"
12 #include "pp_utils.h"
13 #include "SourceLocation.h"
14 
15 namespace pp
16 {
17 
18 class Diagnostics;
19 class DirectiveHandler;
20 class Tokenizer;
21 
22 class DirectiveParser : public Lexer
23 {
24   public:
25     DirectiveParser(Tokenizer *tokenizer,
26                     MacroSet *macroSet,
27                     Diagnostics *diagnostics,
28                     DirectiveHandler *directiveHandler);
29 
30     virtual void lex(Token *token);
31 
32   private:
33     PP_DISALLOW_COPY_AND_ASSIGN(DirectiveParser);
34 
35     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);
49 
50     bool skipping() const;
51     void parseConditionalIf(Token *token);
52     int parseExpressionIf(Token *token);
53     int parseExpressionIfdef(Token *token);
54 
55     struct ConditionalBlock
56     {
57         std::string type;
58         SourceLocation location;
59         bool skipBlock;
60         bool skipGroup;
61         bool foundValidGroup;
62         bool foundElseGroup;
63 
ConditionalBlockConditionalBlock64         ConditionalBlock()
65             : skipBlock(false),
66               skipGroup(false),
67               foundValidGroup(false),
68               foundElseGroup(false)
69         {
70         }
71     };
72     bool mPastFirstStatement;
73     std::vector<ConditionalBlock> mConditionalStack;
74     Tokenizer *mTokenizer;
75     MacroSet *mMacroSet;
76     Diagnostics *mDiagnostics;
77     DirectiveHandler *mDirectiveHandler;
78 };
79 
80 }  // namespace pp
81 #endif  // COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_
82 
83