📄 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 + -