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

📄 syntax.cpp

📁 VC++设计语法编辑器
💻 CPP
📖 第 1 页 / 共 5 页
字号:
						goto cmpnextchar; //继续处理strLine的下一个字符
					}
				}
			}
			goto cmpnextchar; //如果没有结束定义字符继续处理strLine的下一个字符
		}

		//如果当前正处于多行注释中,则应检查是否有结束多行注释的字符串
		if (dwCookie & COOKIE_EXT_COMMENT)	{
			for (int i = 0; i < g_nEndCommentExStrCount; i++ )	{
				if(g_EndCommentExStr[i]==NULL)
					continue;
				bMatch = TRUE;
				int nlen = strlen(g_EndCommentExStr[i]); 
				if(I >= nlen - 1)
				{
					for(int k=0; k<nlen; k++) {
						if(strLine[I-nlen+1+k]!=g_EndCommentExStr[i][k]) {
							bMatch = FALSE;
							break;
						}
					}
					if(bMatch) {
						dwCookie &= ~COOKIE_EXT_COMMENT;
						bRedefineBlock = TRUE;
						goto cmpnextchar;
					}
				}
			}
			goto cmpnextchar;
		}
	
		//处理单行注释
		for (i = 0; i < g_nLineCommentStrCount; i++ )	{
			if(g_LineCommentStr[i]==NULL)
				continue;
			int nlen = strlen(g_LineCommentStr[i]); 
			bMatch = TRUE;
			if(I >= nlen - 1)
			{
				for(int k=0; k<nlen; k++) {
					if(strLine[I-nlen+1+k]!=g_LineCommentStr[i][k]) {
						bMatch = FALSE;
						break;
					}
				}
				if(bMatch) {
					DEFINE_BLOCK(I - nlen + 1, COLORINDEX_COMMENT);
					dwCookie |= COOKIE_COMMENT;
					goto Out; //只要发现有单行注释的字符串则退出
				}
			}
		}

		//处理字符串变量的开始
		for (i = 0; i < g_nBeginStringStrCount; i++ )	{
			if(g_BeginStringStr[i]==NULL)
				continue;
			int nlen = strlen(g_BeginStringStr[i]); 
			bMatch = TRUE;
			if(I >= nlen - 1)
			{
				for(int k=0; k<nlen; k++) {
					if(strLine[I-nlen+1+k]!=g_BeginStringStr[i][k]) {
						bMatch = FALSE;
						break;
					}
				}
				if(bMatch) {
					DEFINE_BLOCK(I - nlen + 1, COLORINDEX_STRING);
					dwCookie |= COOKIE_STRING;
					goto cmpnextchar;
				}
			}
		}

		//处理字符型变量的开始
		for (i = 0; i < g_nBeginCharStrCount; i++ )	{
			if(g_BeginCharStr[i]==NULL)
				continue;
			int nlen = strlen(g_BeginCharStr[i]); 
			bMatch = TRUE;
			if(I >= nlen - 1)
			{
				for(int k=0; k<nlen; k++) {
					if(strLine[I-nlen+1+k]!=g_BeginCharStr[i][k]) {
						bMatch = FALSE;
						break;
					}
				}
				if(bMatch) {
					DEFINE_BLOCK(I - nlen + 1, COLORINDEX_CHAR);
					dwCookie |= COOKIE_CHAR;
					goto cmpnextchar;
				}
			}
		}

		//处理多行注释的开始
		for (i = 0; i < g_nBeginCommentExStrCount; i++ ) {
			if(g_BeginCommentExStr[i]==NULL)
				continue;
			int nlen = strlen(g_BeginCommentExStr[i]); 
			bMatch = TRUE;
			if(I >= nlen - 1)
			{
				for(int k=0; k<nlen; k++) {
					if(strLine[I-nlen+1+k]!=g_BeginCommentExStr[i][k]) {
						bMatch = FALSE;
						break;
					}
				}
				if(bMatch) {
					DEFINE_BLOCK(I - nlen + 1, COLORINDEX_COMMENT);
					dwCookie |= COOKIE_EXT_COMMENT;
					if(nlen>1) {
						if ( ++I>= nLength) // 考虑"/*/"的情况
							goto Out;
					}
					goto cmpnextchar;
				}
			}
		}
		
		bInString = FALSE;
		for ( i = 0; i < g_nstrInStringCount; i++ )  {
			 BOOL b = ( strLine[I] == g_strInString.GetAt(i) ) ; 
			 bInString |= b;
			 if(bInString)
				 break;
		}
		if (isalnum(strLine[I]) || strLine[I] == '_' || bInString)
		{
			if (nIdentBegin == -1)
				nIdentBegin = I;
		}
		else
		{
			if (nIdentBegin >= 0)
			{
				CString strtmp= strLine.Mid(nIdentBegin, I - nIdentBegin); 
				if (IsSynWord(m_strArrayKeyWords, strtmp))
				{
					DEFINE_BLOCK(nIdentBegin, COLORINDEX_SYNTAX);
				}
				else if (IsNumber(strtmp))
				{
					DEFINE_BLOCK(nIdentBegin, COLORINDEX_NUMBER);
				}
				bRedefineBlock = TRUE;
				bDecIndex = TRUE;
				nIdentBegin = -1;
			}
		}
cmpnextchar:
		i=0;  //没有意义,为编译通过而准备
	}
	
Out: //当遇到单行注释时会直接跳到这儿
	if (nIdentBegin >= 0)
	{
		CString strtmp = strLine.Mid(nIdentBegin, I - nIdentBegin); 
		if (IsSynWord(m_strArrayKeyWords, strtmp))
		{
			DEFINE_BLOCK(nIdentBegin, COLORINDEX_SYNTAX);
		}
		else if (IsNumber(strtmp))
		{
			DEFINE_BLOCK(nIdentBegin, COLORINDEX_NUMBER);
		}
	}

	return dwCookie;
}


DWORD ParseLineForHtml(CStringArray &m_strArrayKeyWords, 
					  DWORD dwCookie, 
					  CString &strLine, 
					  COLORINFO *ColorInfo, 
					  int &nActualItems)
{	
	//对于无多行注释的语法在只取当前行的解析结果时可直接返回
	if(g_nBeginCommentExStrCount==0 && ColorInfo==NULL) 
		return dwCookie;

	int nLength = strLine.GetLength(); 
	int nIdentBegin = -1;
	int i;
	BOOL bMatch;
	BOOL bInString; //定义一个字符串的界限
	BOOL bRedefineBlock = TRUE;
	BOOL bDecIndex  = FALSE;

	if(nLength == 0)
		return dwCookie;

	for (int I = 0; ; I++)
	{
		if (bRedefineBlock) //如果开始定义颜色块向下做
		{
			int nPos = I;
			if (bDecIndex)
				nPos--;
			if (dwCookie & COOKIE_EXT_COMMENT)
			{
				DEFINE_BLOCK(nPos, COLORINDEX_COMMENT);
			}
			else if (dwCookie & COOKIE_STRING)
			{
				DEFINE_BLOCK(nPos, COLORINDEX_STRING);
			}
			else if (dwCookie & COOKIE_SCRIPT)
			{
				DEFINE_BLOCK(nPos, COLORINDEX_STRING);
			}
			else
			{
				DEFINE_BLOCK(nPos, COLORINDEX_NORMAL);
			}
			bRedefineBlock = FALSE;
			bDecIndex      = FALSE;
		}
		
		if (I >= nLength)
			goto Out;		
		
		//遇到双字节字体如中文直接跳过
		if(IsDBCSLeadByte(strLine[I])) //检查是不是中文字符
		{
			I += 2;
			if (I >= nLength)
				goto Out;
			else
				goto cmpnextchar; //继续处理strLine的下一个字符
		}
		//////////////////////////////

		if ( !(dwCookie & COOKIE_TAG) ) 
		{
			if (dwCookie & COOKIE_SCRIPT) 
			{
				if ( I + 7 < nLength)
				{// the string "</script" length is 7;
					if (strLine[I] != '<')
						continue;
					if (strLine[I+1] != '/')
						continue;
					if (strLine[I+2] != 's' && strLine[I+2] != 'S')
						continue;
					if (strLine[I+3] != 'c' && strLine[I+3] != 'C')
						continue;
					if (strLine[I+4] != 'r' && strLine[I+4] != 'R')
						continue;
					if (strLine[I+5] != 'i' && strLine[I+5] != 'I')
						continue;
					if (strLine[I+6] != 'p' && strLine[I+6] != 'P')
						continue;
					if (strLine[I+7] != 't' && strLine[I+7] != 'T')
						continue;
					dwCookie &= ~COOKIE_SCRIPT;
					goto con;
				}
				continue;
			}
		}
con:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -