Program Listing for File preproc.h#

Return to documentation for file (sdv_idl_compiler\preproc.h)

#ifndef PREPROC_H
#define PREPROC_H

#include "token.h"
#include "codepos.h"
#include "environment.h"
#include <filesystem>

// Forward declaration
class CLexer;
class CParser;

class CPreprocessor
{
public:
    CPreprocessor(CParser& rParser);

    CToken ProcessPreproc(CCodePos& rCode, const CContextPtr& rptrContext);

    void FinalProcessing(const CCodePos& rCode);

    bool CurrentSectionEnabled() const;

    virtual void IncludeFile(const std::filesystem::path& rpath, bool bLocal) = 0;

    virtual CIdlCompilerEnvironment& GetEnvironment() = 0;

private:
    void ProcessDefine(CLexer& rLexer, CCodePos& rCode, const CContextPtr& rptrContext);

    void ProcessUndef(CLexer& rLexer, CCodePos& rCode, const CContextPtr& rptrContext);

    void ProcessInclude(CLexer& rLexer, CCodePos& rCode, const CContextPtr& rptrContext, bool& rbLocal);

    void ProcessIf(CLexer& rLexer, CCodePos& rCode, const CContextPtr& rptrContext);

    void ProcessIfDef(CLexer& rLexer, CCodePos& rCode, const CContextPtr& rptrContext, bool bInverted);

    void ProcessElif(CLexer& rLexer, CCodePos& rCode, const CContextPtr& rptrContext);

    void ProcessElse(CLexer& rLexer, const CCodePos& rCode, const CContextPtr& rptrContext);

    void ProcessEndif(CLexer& rLexer, const CCodePos& rCode, const CContextPtr& rptrContext);

    void ProcessVerbatim(CLexer& rLexer, CCodePos& rCode, const CContextPtr& rptrContext);

    void ProcessVerbatimBlock(CLexer& rLexer, CCodePos& rCode, const CContextPtr& rptrContext);

    int64_t ConditionalCalc(CLexer& rLexer, CCodePos& rCode, const CContextPtr& rptrContext, uint32_t uiPrecedence = 100);

    enum class EConditionalInclusion
    {
        if_section,
        else_section
    };

    enum class EConditionalProcessing
    {
        disabled,
        current,
        previous,
        future
    };

    struct SConditionalControl
    {
        EConditionalInclusion   m_eInclusionControl;
        EConditionalProcessing  m_eProcessingControl;
    };

    CParser&                            m_rParser;
    std::stack<SConditionalControl>     m_stackConditional;
};


#endif // !defined PREPROC_H