?? hwordstream.cpp
字號:
// HWordStream.cpp: implementation of the HWordStream class.
//
//////////////////////////////////////////////////////////////////////
//#include "stdafx.h"
#include "HWordStream.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//可做標識符開頭的字符范圍
CHAR_RANG HWordStream::g_RangeLetter[]={
{'a','z'},
{'A','Z'},
{(char)0x80,(char)0xff},////漢字的字符范圍
{'_','_'}
};
//數字1到9的字符范圍
CHAR_RANG HWordStream::g_Range1_9[]={
{'1','9'}
};
//數字0到9的字符范圍
CHAR_RANG HWordStream::g_Range0_9[]={
{'0','9'}
};
//十六進制的字符范圍
CHAR_RANG HWordStream::g_Range16[]={
{'0','9'},
{'A','F'},
{'a','f'}
};
//浮點數(出現小數點之后)
BEGIN_STATE_MAP(g_FloatTable,HWordStream)
MAP_STATE_RANGE(g_Range0_9, WORD_FLOAT, g_FloatTable) //十進制數字
END_STATE_MAP()
//十進制數字
BEGIN_STATE_MAP(g_Num10Table,HWordStream)
MAP_STATE_RANGE(g_Range0_9, WORD_NUM10, g_Num10Table) //十進制數字
MAP_STATE_SET (".", WORD_FLOAT, g_FloatTable) //浮點數(出現小數點)
END_STATE_MAP()
//八進制數字
BEGIN_STATE_MAP(g_Num8Table,HWordStream)
MAP_STATE_RANGE(g_Range0_9, WORD_NUM8, g_Num8Table) //八進制數字
MAP_STATE_SET (".", WORD_FLOAT, g_FloatTable) //浮點數(出現小數點)
END_STATE_MAP()
//十六進制數字
BEGIN_STATE_MAP(g_Num16Table,HWordStream)
MAP_STATE_RANGE(g_Range16, WORD_NUM16, g_Num16Table) //十六進制數字
END_STATE_MAP()
//只有一個'0'的數字狀態
BEGIN_STATE_MAP(g_Num0Table,HWordStream)
MAP_STATE_RANGE(g_Range0_9, WORD_NUM8, g_Num8Table) //八進制數字
MAP_STATE_SET ("Xx", WORD_NUM16, g_Num16Table) //十六進制數字
MAP_STATE_SET (".", WORD_FLOAT, g_FloatTable) //浮點數(出現小數點)
END_STATE_MAP()
//標識符
BEGIN_STATE_MAP(g_NameTable,HWordStream)
MAP_STATE_RANGE(g_RangeLetter, WORD_VAR_NAME, g_NameTable) //標識符
MAP_STATE_RANGE(g_Range0_9, WORD_VAR_NAME, g_NameTable) //標識符
END_STATE_MAP()
//!
BEGIN_STATE_MAP(g_NotTable,HWordStream)
MAP_STATE_SET ("=", WORD_NOTEQU, NULL) // "!="
END_STATE_MAP()
//<
BEGIN_STATE_MAP(g_LessTable,HWordStream)
MAP_STATE_SET ("=", WORD_LESSEQU, NULL) // "<="
END_STATE_MAP()
//>
BEGIN_STATE_MAP(g_BigerTable,HWordStream)
MAP_STATE_SET ("=", WORD_BIGEREQU, NULL) // ">="
END_STATE_MAP()
//-
BEGIN_STATE_MAP(g_SubTable,HWordStream)
MAP_STATE_SET (">", WORD_ARROW, NULL) // "->"
END_STATE_MAP()
//=
BEGIN_STATE_MAP(g_EQUTable,HWordStream)
MAP_STATE_SET ("=", WORD_DOUBLE_EQU, NULL) // "=="
END_STATE_MAP()
//\n
BEGIN_STATE_MAP(g_LFnTable,HWordStream)
MAP_STATE_SET ("\r", WORD_LF, NULL) // "\n\r"
END_STATE_MAP()
//\r
BEGIN_STATE_MAP(g_LFrTable,HWordStream)
MAP_STATE_SET ("\n", WORD_LF, NULL) // "\r\n"
END_STATE_MAP()
//"/"
BEGIN_STATE_MAP(g_DivTable,HWordStream)
MAP_STATE_SET ("/", WORD_REM, NULL) // "//"
END_STATE_MAP()
//":"
BEGIN_STATE_MAP(g_ColonTable,HWordStream)
MAP_STATE_SET (":", WORD_DOUBLE_COLON, NULL) // "::"
END_STATE_MAP()
BEGIN_STATE_MAP(g_NULL,HWordStream)
//結束字符
MAP_STATE_SET ("\0", WORD_NULL, NULL)
///////////////////////////////////////////////////////////////////////////
MAP_STATE_RANGE(g_RangeLetter, WORD_VAR_NAME, g_NameTable) //標識符
MAP_STATE_RANGE(g_Range1_9, WORD_NUM10, g_Num10Table) //十進制數字
MAP_STATE_SET ("0", WORD_NUM10, g_Num0Table) //只有一個'0'的數字狀態
//雙目操作符
MAP_STATE_SET ("!", WORD_NOT, g_NotTable) // "!", "!="
MAP_STATE_SET ("<", WORD_LESS, g_LessTable)// "<", "<="
MAP_STATE_SET (">", WORD_BIGER, g_BigerTable)// ">", ">="
MAP_STATE_SET ("-", WORD_SUB, g_SubTable) //"-", "->"
MAP_STATE_SET ("=", WORD_EQU, g_EQUTable) //"=", "=="
MAP_STATE_SET ("\n", WORD_LF, g_LFnTable) //"\n", "\n\r"
MAP_STATE_SET ("\r", WORD_LF, g_LFrTable) //"\r", "\r\n"
MAP_STATE_SET ("/", WORD_DIV, g_DivTable) //"/", "//"
MAP_STATE_SET (":", WORD_COLON, g_ColonTable)//":", "::"
//單目操作符
MAP_STATE_SET ("+", WORD_ADD, NULL)//加號
MAP_STATE_SET ("*", WORD_MUL, NULL)//乘
MAP_STATE_SET ("&", WORD_AND, NULL)//與
MAP_STATE_SET ("|", WORD_OR, NULL)//或
MAP_STATE_SET ("%", WORD_MOD, NULL)//求余
MAP_STATE_SET ("^", WORD_POWER, NULL)//冪
MAP_STATE_SET ("(", WORD_PAREN_FONT, NULL)//小括號
MAP_STATE_SET (")", WORD_PAREN_BACK, NULL)//小括號
MAP_STATE_SET ("[", WORD_BRACKET_SQUARE1, NULL)//中括號
MAP_STATE_SET ("]", WORD_BRACKET_SQUARE2, NULL)//中括號
MAP_STATE_SET ("{", WORD_BRACE_FONT, NULL)//大括號
MAP_STATE_SET ("}", WORD_BRACE_BACK, NULL)//大括號
MAP_STATE_SET (";", WORD_SEMI, NULL) //分號
MAP_STATE_SET (".", WORD_DOT, NULL) //點
MAP_STATE_SET (",", WORD_COMMA, NULL) //逗號
MAP_STATE_SET ("\t", WORD_TAB, NULL) //TAB
MAP_STATE_SET (" ", WORD_SPACE, NULL) //空格 0X20
MAP_STATE_SET ("\"", WORD_DOUBLE_QUOTE, NULL)//雙引號
MAP_STATE_SET ("'", WORD_SINGEL_QUOTE, NULL)//單引號
END_STATE_MAP()
HWordStream::HWordStream()
{
m_BufChar=0;
m_pStream=0;
m_bHadBuf=false;
}
HWordStream::~HWordStream()
{
}
/*
* newState[in,out],輸入舊狀態,輸出新狀態,如返回NULL則是最終狀態
如果輸入為“#”則在任何范圍內都找不到合適的狀態,這種情況只有輸入狀態是NULL才不能回退并且newState置為WORD_UNKNOWN
*/
PCHAR_MAPITEM HWordStream::FindNextState(PCHAR_MAPITEM pMap,char c,WORDSTATE *newState)
{
PCHAR_RANG pRange;
PCHAR_MAPITEM pMapTemp;
char *pSet;
pMapTemp=pMap;
while(pMapTemp->nCount)//范圍或集合元素的數量
{
if(pMapTemp->type==E_RANG)//范圍
{
pRange=pMapTemp->CharRang.pRang;
for(int i=0;i<pMapTemp->nCount ;i++)
{
if(pRange->MaxChar >=c &&
pRange->MinChar<=c)
{
*newState = pMapTemp->CurState;
return pMapTemp->pNextTable;
}
pRange++;
}
}
else////集合
{
pSet=pMapTemp->CharRang.pCharSet;
for(int i=0;i<pMapTemp->nCount;i++)
{
if(pSet[i]==c)
{
*newState = pMapTemp->CurState;
return pMapTemp->pNextTable;
}
}
}
pMapTemp++;
}
if(pMap!=g_NULL)
{
this->BackOneChar(c);
}
else
{
*newState = WORD_UNKNOWN;
}
return NULL;
}
int HWordStream::GetOneWord(H_WORD &word)
{
char c;
PCHAR_MAPITEM pMap;
word.type=WORD_NULL;
word.dwWordLen =0;
word.dwStringLen =0;
pMap=g_NULL;
do {
c=this->GetOneChar();
if(word.dwWordLen<MAX_NAME_LEN)
{
word.szWord[word.dwWordLen]=c;
word.dwWordLen++;
}
word.dwStringLen ++;
} while(pMap=this->FindNextState(pMap,c,&word.type));
if(this->m_bHadBuf )//在匹配狀態時可能回退一個字符,將它從word中減去!!
{
word.dwStringLen--;
word.dwWordLen--;
}
word.szWord[word.dwWordLen]=0;
word.colum =this->m_Colum;
word.row =this->m_Row;
if(word.type ==WORD_LF)
{
this->m_Row++;
this->m_Colum=1;
}
else
{
this->m_Colum+=word.dwStringLen;
}
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -