121 lines
3.1 KiB
C++
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
|