⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hwordstream.cpp

📁 积下的一点C++编程序库源码
💻 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 + -