Edit

kc3-lang/angle/src/compiler/preprocessor/MacroExpander.h

Branch :

  • Show log

    Commit

  • Author : daniel@transgaming.com
    Date : 2012-10-26 18:58:24
    Hash : b401a92b
    Message : Move the new preprocessor out of the 'new' directory. TRAC #21966 Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@1326 736b8ea6-26fd-11df-bfd4-992fa37f6226

  • src/compiler/preprocessor/MacroExpander.h
  • //
    // 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 <cassert>
    #include <memory>
    #include <vector>
    
    #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<Token>* replacements);
    
        typedef std::vector<Token> MacroArg;
        bool collectMacroArgs(const Macro& macro,
                              const Token& identifier,
                              std::vector<MacroArg>* args);
        void replaceMacroParams(const Macro& macro,
                                const std::vector<MacroArg>& args,
                                std::vector<Token>* replacements);
    
        struct MacroContext
        {
            const Macro* macro;
            size_t index;
            std::vector<Token> 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<Token> mReserveToken;
        std::vector<MacroContext*> mContextStack;
    };
    
    }  // namespace pp
    #endif  // COMPILER_PREPROCESSOR_MACRO_EXPANDER_H_