Files
Leviathan/Client/Game/engine/Ui/KTokenParser.h
T
2026-06-01 12:46:52 +02:00

121 lines
3.1 KiB
C++

#ifndef __KTOKENPARSER__H
#define __KTOKENPARSER__H
//#include <string>
#include <map>
#ifndef K_TOKEN_CALL
#define K_TOKEN_CALL
#endif
// KIntface Class Must Derivate this class
class KTokenHandler;
class KStream;
typedef void (K_TOKEN_CALL KTokenHandler::*K_TOKEN_MSG)(DWORD dwTokenID, DWORD dwLineCount, DWORD dwReserve1);
struct KTOKEN_MAP
{
KTOKEN_MAP( int id,K_TOKEN_MSG argFn)
{
tokenID = id; fn = argFn;
}
K_TOKEN_MSG fn;
int tokenID;
};
class KTokenParser
{
public:
KTokenParser();
~KTokenParser();
bool AddToken(LPCSTR lpszToken, short tokenID, K_TOKEN_MSG fn);
void LoadStream(KStream & stream);
void SetHandler(KTokenHandler * pHandler) { m_pTokenHandler = pHandler; }
void SetWhiteSpaceChar(char *pWhiteSpaceChar, int nCount);
void SetTokenChar(char* pTokenChar, int nCount);
protected:
bool _getNextChar( KStream &stream, char *c, int &linecount );
bool _getNextWord( KStream &stream, char *c, bool &isWhiteSpace, int &linecount );
void _checkReservedWord();
bool _getNextString(KStream & stream, std::string & name, int & linecount);
bool _skipline( KStream &stream, int &linecount );
bool _skiptocomment( KStream &stream, int &linecount );
bool _getNextToken( KStream &stream, int &linecount);
int m_nWhiteSpaceCount;
char* m_pWhiteSpaceChar;
int m_nTokenCharCount;
char* m_pTokenChar;
typedef std::map< std::string, KTOKEN_MAP> TokenMap; /// Token <-> Function Mapping
/// string을 통해서 find
TokenMap m_mapTokenList;
KTokenHandler* m_pTokenHandler;
};
namespace KTOKEN_HANDLER
{
const char KTOKEN_EOF = -1;
const char KTOKEN_NAME = 0;
const char KTOKEN_COMMA = 10;
const char KTOKEN_ASSIGN = 11;
const char KTOKEN_OBRACE = 12;
const char KTOKEN_CBRACE = 13;
const char KTOKEN_OBRACKET = 14;
const char KTOKEN_CBRACKET = 15;
const char KTOKEN_ANGLE_OBRACKET = 16;
const char KTOKEN_ANGLE_CBRACKET = 17;
const char KTOKEN_COLON = 18;
const char KTOKEN_SEMI_COLON = 19;
const char KTOKEN_ASTERISK = 20;
}
#define DECLARE_KTOKEN_MAP() \
protected: \
virtual void _InitializeTokenMap(); \
/// Client Can Derivate this class
class KTokenHandler
{
public:
KTokenHandler();
virtual ~KTokenHandler() {}
friend KTokenParser;
protected:
// All token-mapping functions are protected.
/// Called when Parser cannot find Token-match function.
virtual K_TOKEN_CALL void _OnNoTokenFound(DWORD dwStringPointer, DWORD dwLineCount,DWORD dwReserve1) = 0;
/// Called when Parser find special character. (dwCharType-> (KTOKEN_COMMAN, KTOKEN_ASSIGN, KTOKEN_OBRACKET, KTOKEN_CBRACKET) )
virtual K_TOKEN_CALL void _OnCharTokenFound(DWORD dwCharType, DWORD dwLineCount, DWORD dwReserve1) = 0;
/// Callend when Parser encounter end of stream.
virtual K_TOKEN_CALL void _OnTokenEnd() = 0;
virtual void _InitializeTokenMap() = 0;
void _AddToken(LPCSTR lpszToken, short tokenID, K_TOKEN_MSG fn);
KTokenParser m_TokenParser;
};
#define BEGIN_KTOKEN_MAP(theClass) \
void theClass::_InitializeTokenMap() { \
#define END_KTOKEN_MAP() \
}; \
#define ON_KTOKEN(strToken,id , fn) \
_AddToken(strToken,KTOKEN_HANDLER::id,(K_TOKEN_MSG)fn); \
#endif