216 lines
7.6 KiB
C
216 lines
7.6 KiB
C
|
|
#ifndef _LUA_PRE_PROCESS_H_
|
|||
|
|
#define _LUA_PRE_PROCESS_H_
|
|||
|
|
|
|||
|
|
/****************************************************************
|
|||
|
|
|
|||
|
|
ͨ<EFBFBD><EFBFBD>LUA<EFBFBD>ű<EFBFBD><EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>LUA<EFBFBD>ʷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ṩ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڶԽű<EFBFBD><EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD>м<EFBFBD>Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>ʹ
|
|||
|
|
Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lua<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>HTML<EFBFBD><EFBFBD><EFBFBD><EFBFBD>дJavaScript<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>ʽ<EFBFBD><EFBFBD>
|
|||
|
|
ʹ<EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>ע<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>luaԤ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>£<EFBFBD>
|
|||
|
|
--#directive implemente data
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD>ʼ<EFBFBD>ĵ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>ó<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>С<EFBFBD>Ԥ
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>Сд<EFBFBD>ġ<EFBFBD>
|
|||
|
|
|
|||
|
|
Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀǰʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><EFBFBD>ܣ<EFBFBD>
|
|||
|
|
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>á<EFBFBD>--#include "FilePath"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴӵ<EFBFBD>ǰ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>Ŀ¼<EFBFBD><EFBFBD>ʼʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<EFBFBD>н<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD>
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD><EFBFBD><EFBFBD>Ϊ1024<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
2<EFBFBD><EFBFBD><EFBFBD>궨<EFBFBD>壬ʹ<EFBFBD>á<EFBFBD>--#define NAME [VALUE]<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>꣬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
<EFBFBD><EFBFBD>--#undef NAME<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><EFBFBD>塣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD><EFBFBD>Ȳ<EFBFBD><EFBFBD>ó<EFBFBD><EFBFBD><EFBFBD>30<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
<EFBFBD><EFBFBD><EFBFBD>Ȳ<EFBFBD><EFBFBD>ó<EFBFBD><EFBFBD><EFBFBD>126<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣬ʹ<EFBFBD>á<EFBFBD>--#ifdef<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--#ifndef<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--#if MACRO == VALUE<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
<EFBFBD><EFBFBD>--#if MACRO != VALUE<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--#else<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--#elif<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--#endif<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
****************************************************************/
|
|||
|
|
class LuaPreProcessor :
|
|||
|
|
public stream::MemoryStream
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
typedef MemoryStream Inherited;
|
|||
|
|
/* <20><><EFBFBD><EFBFBD>Դ<EFBFBD>ļ<EFBFBD><C4BC>к<EFBFBD><D0BA><EFBFBD>Ϣ */
|
|||
|
|
struct LineRange
|
|||
|
|
{
|
|||
|
|
char sFileName[256]; //Դ<>ļ<EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MAX_PATH<54><48>ʹ<EFBFBD>ö<EFBFBD><C3B6>ļ<EFBFBD><C4BC><EFBFBD>
|
|||
|
|
int nLineStart; //Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>к<EFBFBD>
|
|||
|
|
int nLineEnd; //Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD>к<EFBFBD>
|
|||
|
|
};
|
|||
|
|
class LineRangeList : public container::Vector<LineRange>
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
/* <20><>ȡԤ<C8A1><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>кŶ<D0BA>Ӧ<EFBFBD><D3A6>ԭʼ<D4AD>ļ<EFBFBD>·<EFBFBD><C2B7><EFBFBD>Լ<EFBFBD><D4BC>к<EFBFBD>
|
|||
|
|
* nLineNo Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>кţ<EFBFBD><EFBFBD>кŴ<EFBFBD>1<EFBFBD><EFBFBD>ʼ
|
|||
|
|
* nSrcLineNo <EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD>ԭʼ<EFBFBD>ļ<EFBFBD><EFBFBD>кţ<EFBFBD><EFBFBD>кŴ<EFBFBD>1<EFBFBD><EFBFBD>ʼ
|
|||
|
|
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>кţ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>벢<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nSrcLineNoΪԭʼ<EFBFBD>ļ<EFBFBD><EFBFBD>кţ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL
|
|||
|
|
*/
|
|||
|
|
const char* getSourceLineNumber(int nLineNo, int& nSrcLineNo);
|
|||
|
|
};
|
|||
|
|
public:
|
|||
|
|
LuaPreProcessor(BaseAllocator* alloc);
|
|||
|
|
~LuaPreProcessor();
|
|||
|
|
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>
|
|||
|
|
*sSourceText <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼָ<EFBFBD>룬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>β<EFBFBD><EFBFBD>
|
|||
|
|
*sFilePath <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȱ<EFBFBD><EFBFBD><EFBFBD>Ŀ¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*cNewLine <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD>ֵΪ'\n'
|
|||
|
|
*@return <EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>룬<EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´η<EFBFBD><EFBFBD><EFBFBD>֮ǰһֱ<EFBFBD><EFBFBD>Ч
|
|||
|
|
*/
|
|||
|
|
const char* parse(const char* sSourceText, const char* sFilePath, const char cNewLine = '\n');
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
|
|||
|
|
void addIncludeDirectory(const char* sPath)
|
|||
|
|
{
|
|||
|
|
m_IncludeDirList.add(new String(sPath));
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD>հ<EFBFBD><D5B0><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ŀ¼
|
|||
|
|
void clearIncludeDirectory();
|
|||
|
|
/* <20><><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD>궨<EFBFBD><EAB6A8>
|
|||
|
|
* sName <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* sValue <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
*/
|
|||
|
|
void addMacro(const char* sName, const char* sValue = NULL);
|
|||
|
|
//<2F>Ƴ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>궨<EFBFBD><EAB6A8>
|
|||
|
|
void removeMacro(const char* sName);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD>궨<EFBFBD><EAB6A8>
|
|||
|
|
void clearMacroList();
|
|||
|
|
/* <20><>ȡԴ<C8A1>ļ<EFBFBD><C4BC>кŶ<D0BA><C5B6>ձ<EFBFBD>
|
|||
|
|
* pLineRange <EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD>к<EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* nCount <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>пɴ洢<EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*@return <EFBFBD><EFBFBD><EFBFBD><EFBFBD>pLineRangeΪ<EFBFBD>գ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪʵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>pLineRange<EFBFBD>п<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
int getLineRangeData(LineRange* pLineRange, int nCount);
|
|||
|
|
/* <20><>ȡԤ<C8A1><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>кŶ<D0BA>Ӧ<EFBFBD><D3A6>ԭʼ<D4AD>ļ<EFBFBD>·<EFBFBD><C2B7><EFBFBD>Լ<EFBFBD><D4BC>к<EFBFBD>
|
|||
|
|
* nLineNo Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>кţ<EFBFBD><EFBFBD>кŴ<EFBFBD>1<EFBFBD><EFBFBD>ʼ
|
|||
|
|
* nSrcLineNo <EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD>ԭʼ<EFBFBD>ļ<EFBFBD><EFBFBD>кţ<EFBFBD><EFBFBD>кŴ<EFBFBD>1<EFBFBD><EFBFBD>ʼ
|
|||
|
|
* @return <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>кţ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>·<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>벢<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nSrcLineNoΪԭʼ<EFBFBD>ļ<EFBFBD><EFBFBD>кţ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NULL
|
|||
|
|
*/
|
|||
|
|
const char* getSourceLineNumber(int nLineNo, int& nSrcLineNo);
|
|||
|
|
void clearMacro()
|
|||
|
|
{
|
|||
|
|
m_MacroList.clear();
|
|||
|
|
}
|
|||
|
|
protected:
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>
|
|||
|
|
*sSourceText <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼָ<EFBFBD>룬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>β<EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
const char* ParseSource(const char* sSourceText);
|
|||
|
|
//<2F><><EFBFBD>浱ǰԤ<C7B0><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD>뻷<EFBFBD><EBBBB7>ջ<EFBFBD><D5BB>
|
|||
|
|
inline void SaveParseEnvir()
|
|||
|
|
{
|
|||
|
|
m_ParseEnvirStack.add(m_ParseEnvir);
|
|||
|
|
}
|
|||
|
|
//<2F>ָ<EFBFBD><D6B8><EFBFBD>һ<EFBFBD><D2BB>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>ջ<EFBFBD><D5BB><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
inline void RestorsParseEnvir()
|
|||
|
|
{
|
|||
|
|
m_ParseEnvir = m_ParseEnvirStack[m_ParseEnvirStack.count() - 1];
|
|||
|
|
m_ParseEnvirStack.trunc(m_ParseEnvirStack.count() - 1);
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ԡ<EFBFBD>--#<23><><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>ͷ<EFBFBD><CDB7>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
void ProcessLine(const char* sLineText);
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ֹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><EFBFBD>Ǵ˺<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
void ProcessDirective(const char* sDirective, const char* sData);
|
|||
|
|
//<2F><>#includeԤ<65><D4A4><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>ܵ<EFBFBD>ʵ<EFBFBD><CAB5>
|
|||
|
|
void DirectiveOfInclude(const char* sData);
|
|||
|
|
//<2F><>#defineԤ<65><D4A4><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
|
|||
|
|
void DirectiveOfDefine(const char* sData);
|
|||
|
|
//<2F><>#undefԤ<66><D4A4><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
|
|||
|
|
void DirectiveOfUndef(const char* sData);
|
|||
|
|
//<2F><>#ifdefԤ<66><D4A4><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
|
|||
|
|
void DirectiveOfIfdef(const char* sData);
|
|||
|
|
//<2F><>#ifndefԤ<66><D4A4><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
|
|||
|
|
void DirectiveOfIfndef(const char* sData);
|
|||
|
|
//<2F><>#ifԤ<66><D4A4><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
|
|||
|
|
void DirectiveOfIf(const char* sData);
|
|||
|
|
//<2F><>#elseԤ<65><D4A4><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
|
|||
|
|
void DirectiveOfElse(const char* sData);
|
|||
|
|
//<2F><>#elifԤ<66><D4A4><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
|
|||
|
|
void DirectiveOfElif(const char* sData);
|
|||
|
|
//<2F><>#endifԤ<66><D4A4><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>
|
|||
|
|
void DirectiveOfEndif(const char* sData);
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
//Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʶ<EFBFBD><CAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
typedef char PPToken[128];
|
|||
|
|
|
|||
|
|
/*** <20><EFBFBD><EFB7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ***/
|
|||
|
|
/*
|
|||
|
|
* Comments: <EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD><EFBFBD><EFBFBD>WhiteSpace<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* Param const char* sLinePtr: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
|
|||
|
|
* Param IN OUT const char* * sTokens: <EFBFBD><EFBFBD><EFBFBD>ڴ洢ÿ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* Param IN OUT int & nTokenCount: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><EFBFBD>˲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>ȡ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* @Return const char*: <EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ʺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>sLinePtr<EFBFBD><EFBFBD>λ<EFBFBD>ã<EFBFBD><EFBFBD>Ա<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
const char* delimiteLine(const char* sLinePtr, PPToken* sTokens, int& nTokenCount);
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1>ȫ<EFBFBD><C8AB>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
void refreshCondition();
|
|||
|
|
//<2F><><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD><F3A3ACB1><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
|
|||
|
|
inline void abort()
|
|||
|
|
{
|
|||
|
|
m_boErrorAbort = true;
|
|||
|
|
}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ѱ<EFBFBD><D1B0><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>б<EFBFBD>
|
|||
|
|
void clearIncludedFileList();
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD>
|
|||
|
|
virtual void showError(const char* sError);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĺ<EFBFBD><C4BA><EFBFBD>
|
|||
|
|
virtual void showErrorFormat(const char* sFmt, ...);
|
|||
|
|
private:
|
|||
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ű<EFBFBD><C5B1><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD>ȡ<EFBFBD>ô<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD>Ŀ¼<EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD>Ԥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD>н<EFBFBD>Ŀ¼<EFBFBD>Ƴ<EFBFBD>
|
|||
|
|
*sSourceText <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼָ<EFBFBD>룬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD>β<EFBFBD><EFBFBD>
|
|||
|
|
*sFillFilePath <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
const char* SaveFileDirAndParse(const char* sSourceText, const char* sFillFilePath);
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ذ<EFBFBD><D8B0><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|||
|
|
bool SearchAndLoadIncludeFile(const char* fn, bool mul);
|
|||
|
|
//<2F><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|||
|
|
bool LoadIncludeFile(const char* sIncludeFilePath, bool boEnableMultipleInclude);
|
|||
|
|
|
|||
|
|
protected:
|
|||
|
|
//Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
typedef struct tagPreProcParseEnvir
|
|||
|
|
{
|
|||
|
|
const char* sFilePath; //ԭʼ<D4AD>ļ<EFBFBD>·<EFBFBD><C2B7>
|
|||
|
|
const char* sParsePtr; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD>λ<EFBFBD><CEBB>
|
|||
|
|
const char* sNewLinePtr; //<2F><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
|
|||
|
|
const char* sLineEndPtr; //<2F><>βλ<CEB2><CEBB>
|
|||
|
|
int nLineNo; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>кţ<D0BA><C5A3><EFBFBD>1<EFBFBD><31>ʼ
|
|||
|
|
tagPreProcParseEnvir() : sFilePath(NULL),
|
|||
|
|
sParsePtr(NULL), sNewLinePtr(NULL), sLineEndPtr(NULL),
|
|||
|
|
nLineNo(0)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
} PREPROC_PARSERENVIR, *PPREPROC_PARSERENVIR;
|
|||
|
|
//Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĺ궨<C4BA><EAB6A8>
|
|||
|
|
typedef struct tagMacro
|
|||
|
|
{
|
|||
|
|
char sName[32];
|
|||
|
|
char sValue[128];
|
|||
|
|
} PREPROC_MACRO, *PPREPROC_MACRO;
|
|||
|
|
|
|||
|
|
PREPROC_PARSERENVIR m_ParseEnvir; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
container::Vector<PREPROC_PARSERENVIR> m_ParseEnvirStack; //Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȳ<EFBFBD>
|
|||
|
|
container::Vector<String*> m_FilePathStack; //Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȳ<EFBFBD>
|
|||
|
|
container::Vector<String*> m_IncludeDirList; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF>б<EFBFBD>
|
|||
|
|
container::Vector<PREPROC_MACRO> m_MacroList; //Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
|||
|
|
container::Vector<bool> m_ConditionList; //<2F><>ǰԤ<C7B0><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
container::Vector<const char*> m_IncludedFileList; //Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>б<EFBFBD>
|
|||
|
|
LineRangeList m_LineRangeList; //Դ<>ļ<EFBFBD><C4BC>к<EFBFBD><D0BA><EFBFBD>Ϣ<EFBFBD><CFA2>
|
|||
|
|
int m_nLineNo; //<2F><>ǰ<EFBFBD>ܼ<EFBFBD><DCBC>ļ<EFBFBD><C4BC>к<EFBFBD>
|
|||
|
|
char m_NewLineChar; //<2F><><EFBFBD>з<EFBFBD><D0B7><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD>'\n'
|
|||
|
|
bool m_boErrorAbort; //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD>
|
|||
|
|
bool m_boCurrCondition; //<2F><>ǰ<EFBFBD><C7B0>Ԥ<EFBFBD><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
public:
|
|||
|
|
//ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD>ȡ<EFBFBD><C8A1>ָ<EFBFBD><D6B8>
|
|||
|
|
const PPREPROC_MACRO getMacro(const char* sName);
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#endif
|
|||
|
|
|