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_MACRO_EXPANDER_H_ 16 #define COMPILER_PREPROCESSOR_MACRO_EXPANDER_H_ 17 18 #include <memory> 19 #include <vector> 20 21 #include "Lexer.h" 22 #include "Macro.h" 23 #include "pp_utils.h" 24 25 namespace pp 26 { 27 28 class Diagnostics; 29 struct SourceLocation; 30 31 class MacroExpander : public Lexer 32 { 33 public: 34 MacroExpander(Lexer *lexer, MacroSet *macroSet, Diagnostics *diagnostics, bool parseDefined, int allowedMacroExpansionDepth); 35 ~MacroExpander() override; 36 37 void lex(Token *token) override; 38 39 private: 40 PP_DISALLOW_COPY_AND_ASSIGN(MacroExpander); 41 42 void getToken(Token *token); 43 void ungetToken(const Token &token); 44 bool isNextTokenLeftParen(); 45 46 bool pushMacro(std::shared_ptr<Macro> macro, const Token &identifier); 47 void popMacro(); 48 49 bool expandMacro(const Macro ¯o, const Token &identifier, std::vector<Token> *replacements); 50 51 typedef std::vector<Token> MacroArg; 52 bool collectMacroArgs(const Macro ¯o, 53 const Token &identifier, 54 std::vector<MacroArg> *args, 55 SourceLocation *closingParenthesisLocation); 56 void replaceMacroParams(const Macro ¯o, 57 const std::vector<MacroArg> &args, 58 std::vector<Token> *replacements); 59 60 struct MacroContext 61 { 62 MacroContext(); 63 ~MacroContext(); 64 bool empty() const; 65 const Token &get(); 66 void unget(); 67 68 std::shared_ptr<Macro> macro; 69 std::size_t index; 70 std::vector<Token> replacements; 71 }; 72 73 Lexer *mLexer; 74 MacroSet *mMacroSet; 75 Diagnostics *mDiagnostics; 76 const bool mParseDefined; 77 78 std::unique_ptr<Token> mReserveToken; 79 std::vector<MacroContext *> mContextStack; 80 size_t mTotalTokensInContexts; 81 82 int mAllowedMacroExpansionDepth; 83 84 bool mDeferReenablingMacros; 85 std::vector<std::shared_ptr<Macro>> mMacrosToReenable; 86 87 class ScopedMacroReenabler; 88 }; 89 90 } // namespace pp 91 #endif // COMPILER_PREPROCESSOR_MACROEXPANDER_H_ 92 93