📄 syntax.cpp
字号:
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 + -