#ifndef __KTOKENPARSER__H #define __KTOKENPARSER__H //#include #include #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