#ifndef _SymbolTable_H_ #define _SymbolTable_H_ #include "STL.h" #include "BaseDef.h" #include "Message.h" #define SYSVAR_SWITCHTEMP "" #define SYSVAR_FLOATUNIT "" #define SYSVAR_FLOATTEMP "" #define SYSVAR_TRUE "" #define SYSVAR_FALSE "" #define SYSVAR_CONVBUFFER "" /////////////////////////////////////////////////////////////////////////////////// // ÇÔ¼öÀÇ ÀÎÀÚ´Â 7°³¸¦ ³Ñ¾î¼± ¾ÈµÈ´Ù. struct SFuncType { public: unsigned long m_data; public: SFuncType(); SFuncType( unsigned long ); void SetArgType( int nth, eDataType arg ) { m_data |= ( 0x0000000f & arg ) << (nth*4); } void SetReturnType( eDataType retType ) { m_data |= ( 0x0000000f & retType ) << 28; } eDataType GetArgType( int nth ) { return (eDataType)(m_data >> (nth*4) & 0x0000000f); } eDataType GetReturnType() { return (eDataType)(m_data >> 28 & 0x0000000f); } int GetArgCount(); const char* ToString( const char * szFuncName ); bool operator==( const SFuncType & rhs ) { return (m_data & 0x0fffffff) == (rhs.m_data & 0x0fffffff); } bool operator!=( const SFuncType & rhs ) { return (m_data & 0x0fffffff) != (rhs.m_data & 0x0fffffff); } }; /////////////////////////////////////////////////////////////////////////////////// // class CSymbolTable { public: typedef map< int, int > OFFSETMAP; typedef unsigned char byte; typedef struct ConstInfo CONSTINFO; typedef map CONST_CONTAINER; typedef struct VarInfo VARINFO; typedef map VAR_CONTAINER; typedef struct SLocalVarInfo LOCALVARINFO; typedef list LOCALVAR_CONTAINER; typedef pair FUNCINFO; typedef multimap FUNC_CONTAINER; protected: CONST_CONTAINER * m_pConstants; VAR_CONTAINER * m_pGlobalVar; LOCALVAR_CONTAINER* m_pLocalVars; VAR_CONTAINER * m_pCurNameSpace; VAR_CONTAINER * m_pNameSpace2; //CurNameSpace¿Í ½ÖÀ» ÀÌ·ë( CurNameSpace°¡ ArgContainerÀÏ ¶§ À̰ÍÀº VarContainer, VarContainerÀÏ ¶§ ArgContainer ) FUNC_CONTAINER * m_pFunctions; LOCALVARINFO * m_pCurrentLocalVar; eDataType m_eCurrentType; int m_iVarOffset, m_iVarOffsetGlobal; int m_iOffsetFactor; int m_iStringOffset; public: CSymbolTable(); ~CSymbolTable(); void Create(); void Destroy(); int AddConst( const char * szName, eDataType type ); int AddArrVar( const char * szName, eDataType, int nArray ); int AddArrVar( const char * szName, int nArray ) { return AddArrVar( szName, m_eCurrentType, nArray ); } int AddVar( const char * szName, eDataType type ) { return AddArrVar( szName, type, 1 ); } int AddVar( const char * szName ) { return AddVar( szName, m_eCurrentType ); } int AddFunc( bool hasDef, const char * szName, SFuncType ); void SetCurrentType( eDataType type ) { m_eCurrentType = type; } eDataType GetCurrentType() { return m_eCurrentType; } int FindConst( const char * szName ); int FindVar( const char * szName ); int FindFunc( const char * szname, SFuncType ); void BeginLocalNameSpace(); void EndLocalNameSpace( int ); //ÀÎÀڷδ ÇÔ¼öÀÇ ID¸¦ ³Ñ°ÜÁØ´Ù. void EndArgument(); const char* GetNameOfConst( int ); eDataType GetTypeOfConst( int ); int GetOffsetOfConst( int ); const char* GetNameOfVar( int ); eDataType GetTypeOfVar( int ); int GetCountOfVar( int ); int GetOffsetOfVar( int ); //Áö¿ª º¯¼öÀÏ °æ¿ì EBP¸¦ ±âÁØÀ¸·ÎÇÑ ¿ÀÇÁ¼ÂÀ» ¸®ÅÏÇÔ. //Àü¿ª º¯¼öÀÏ °æ¿ì ½ÃÀÛ ÁÖ¼Ò¿¡ ´ëÇÑ ¿ÀÇÁ¼ÂÀ» ¸®ÅÏÇÑ´Ù. const char* GetNameOfFunc( int ); const char* GetTypeStringOfFunc( int ); SFuncType GetTypeOfFunc( int ); bool IsFuncDefined( int ); int GetLocalVarSize( int ); int GetGlobalVarSize(); int GetStringBufferSize(); void StringBuffer( void * ); void Show( MESSAGE_FUNCTION2 Print ); }; /////////////////////////////////////////////////////////////////////////////////// #endif