// // Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // #ifndef COMPILER_PREPROCESSOR_MACRO_EXPANDER_H_ #define COMPILER_PREPROCESSOR_MACRO_EXPANDER_H_ #include #include #include #include "Lexer.h" #include "Macro.h" #include "pp_utils.h" namespace pp { class Diagnostics; class MacroExpander : public Lexer { public: MacroExpander(Lexer* lexer, MacroSet* macroSet, Diagnostics* diagnostics); virtual ~MacroExpander(); virtual void lex(Token* token); private: PP_DISALLOW_COPY_AND_ASSIGN(MacroExpander); void getToken(Token* token); void ungetToken(const Token& token); bool isNextTokenLeftParen(); bool pushMacro(const Macro& macro, const Token& identifier); void popMacro(); bool expandMacro(const Macro& macro, const Token& identifier, std::vector* replacements); typedef std::vector MacroArg; bool collectMacroArgs(const Macro& macro, const Token& identifier, std::vector* args); void replaceMacroParams(const Macro& macro, const std::vector& args, std::vector* replacements); struct MacroContext { const Macro* macro; std::size_t index; std::vector replacements; MacroContext() : macro(0), index(0) { } bool empty() const { return index == replacements.size(); } const Token& get() { return replacements[index++]; } void unget() { assert(index > 0); --index; } }; Lexer* mLexer; MacroSet* mMacroSet; Diagnostics* mDiagnostics; std::auto_ptr mReserveToken; std::vector mContextStack; }; } // namespace pp #endif // COMPILER_PREPROCESSOR_MACRO_EXPANDER_H_