• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  // Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2  //
3  // Licensed under the Apache License, Version 2.0 (the "License");
4  // you may not use this file except in compliance with the License.
5  // You may obtain a copy of the License at
6  //
7  //    http://www.apache.org/licenses/LICENSE-2.0
8  //
9  // Unless required by applicable law or agreed to in writing, software
10  // distributed under the License is distributed on an "AS IS" BASIS,
11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  // See the License for the specific language governing permissions and
13  // limitations under the License.
14  
15  #ifndef COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_
16  #define COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_
17  
18  #include "Lexer.h"
19  #include "Macro.h"
20  #include "pp_utils.h"
21  #include "SourceLocation.h"
22  
23  namespace pp
24  {
25  
26  class Diagnostics;
27  class DirectiveHandler;
28  class Tokenizer;
29  
30  class DirectiveParser : public Lexer
31  {
32  public:
33  	DirectiveParser(Tokenizer* tokenizer,
34  	                MacroSet* macroSet,
35  	                Diagnostics* diagnostics,
36  	                DirectiveHandler* directiveHandler);
37  
38  	virtual void lex(Token* token);
39  
40  private:
41  	PP_DISALLOW_COPY_AND_ASSIGN(DirectiveParser);
42  
43  	void parseDirective(Token* token);
44  	void parseDefine(Token* token);
45  	void parseUndef(Token* token);
46  	void parseIf(Token* token);
47  	void parseIfdef(Token* token);
48  	void parseIfndef(Token* token);
49  	void parseElse(Token* token);
50  	void parseElif(Token* token);
51  	void parseEndif(Token* token);
52  	void parseError(Token* token);
53  	void parsePragma(Token* token);
54  	void parseExtension(Token* token);
55  	void parseVersion(Token* token);
56  	void parseLine(Token* token);
57  
58  	bool skipping() const;
59  	void parseConditionalIf(Token* token);
60  	int parseExpressionIf(Token* token);
61  	int parseExpressionIfdef(Token* token);
62  
63  	struct ConditionalBlock
64  	{
65  		std::string type;
66  		SourceLocation location;
67  		bool skipBlock;
68  		bool skipGroup;
69  		bool foundValidGroup;
70  		bool foundElseGroup;
71  
ConditionalBlockConditionalBlock72  		ConditionalBlock() :
73  			skipBlock(false),
74  			skipGroup(false),
75  			foundValidGroup(false),
76  			foundElseGroup(false)
77  		{
78  		}
79  	};
80  	bool mPastFirstStatement;
81  	std::vector<ConditionalBlock> mConditionalStack;
82  	Tokenizer* mTokenizer;
83  	MacroSet* mMacroSet;
84  	Diagnostics* mDiagnostics;
85  	DirectiveHandler* mDirectiveHandler;
86  };
87  
88  }  // namespace pp
89  #endif  // COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_
90  
91