(模板参数)
template<class T> T Max(T t1, T t2) { }
template<class T1, class T2> class Pair{ };
类定义1
class X { public : int i; };
类定义2
class A : public virtual X { public : int j ; };
类定义3
class B : public virtual X { public : double d; } ;
类定义4
class
C
{
};
类定义5
class String : public Str<A>{};
类定义6
class CC : public std::string{}
类前置声明:
class xx;
分析代码:
未执行效果图:
执行效果图:
if (sWord == _t("class") || sWord == _t("struct")) //分析类定义
{
//template<class T> T Max(T t1, T t2) { }
// template<class T1, class T2> v
//class X { public : int i; };
//class A : public virtual X { public : int j ; };
//class B : public virtual X { public : double d; } ;
//class C : public A, public B { public : int k; };
//class D : public C { };
//class Str : public Str<A>{};
//class
//bb{ };
//class CC : public std::string{}
//class cc{};
//template<class T> class Int{}; //先出现 >
bool bLess = false; //小于号
bool bFind = false;
int j = i + 1;
int iStart = -1;
_string sClassName(_t(""), 50);
while (j < iTextLength)
{
if (p[j] == '(') break; //模板函数
if (p[j] == '<')
{
bLess = true;
break; //模板类
}
if (p[j] == '>')
{
if (!bLess) //小于号没出现,先出现大小于号,是模板参数
{
break;
}
}
if (p[j] == _t('{') || p[j] == _t(':'))
{
bFind = true;
break;
}
if (p[j] != _t(' ') && p[j] != _t('\t') && p[j] != _t('\n'))
{
if (iStart == -1) iStart = j;
sClassName.add(p[j]);
}
++j;
}
if (bFind)
{
s_class s;
s.Name = sClassName;
s.DefinitionPos = i + 1;
dtResult.Add(TextColor(iStart, sClassName.length(), Color_::自定义类));
sd.Class.Add(s); //添加自定义类
i = j;
//log::d(sClassName);
}
}
else if (sWord == _t("typedef")) //分析别名
{
}
// <summary>
/// 一次性记录关键字,注释,字符串值,运算符,宏,括号配对,预处理命令的位置,并设置自定义数据颜色
/// </summary>
/// <param name="CustomData">生成自定义数据列表</param>
/// <returns></returns>
/// 创建时间: 2022-12-24 最后一次修改时间:2022-12-27
DList<TextColor> Syntax::GetTextColorPos_C(SyntaxData &sd)
{
sd.Clear(); //清空原来的数据
DList<TextColor> dtResult;
//可见字符开始位置
const _char* p = _code.c_str();
//可见字符长度
const int iTextLength = _code.length();
if (iTextLength <= 0) return dtResult;
_string sWord(_t(""), 50); //50个_char缓冲
Color_ cKeyWordColor = GetColor(SyntaxType::关键字);
Color_ cExplanatoryNote = GetColor(SyntaxType::注释);
Color_ cOS = GetColor(SyntaxType::运算符号);
for (int i = 0; i < iTextLength; ++i)
{
if (p[i] == _t('/'))
{
++i;
if (i < iTextLength)
{
if (p[i] == _t('/')) //是"//"注释,查找注释结束位置 \n ,跳过注释
{
int iStart = i - 1;
++i;
bool bFind = false; //查找下一个 "\n"
while (i < iTextLength)
{
if (p[i] == '\n')
{
bFind = true;
break;
}
++i;
}
if (!bFind)
{
return dtResult;
}
else
{
dtResult.Add(TextColor(iStart, i - iStart, cExplanatoryNote));
}
}
else if (p[i] == _t('*')) //是"/*"注释,查找注释结束位置 */ ,跳过注释
{
int iStart = i - 1;
++i;
bool bFind = false;
while (i + 1 < iTextLength ) //查找下一个 "*/"
{
if (p[i] == '*' && p[i + 1] == '/')
{
i += 1;
bFind = true;
break;
}
++i;
}
if (!bFind)
{
return dtResult;
}
else
{
dtResult.Add(TextColor(iStart, i - iStart + 1, cExplanatoryNote));
}
}
}
else
{
return dtResult;
}
}
else if (p[i] == _t('\"')) { //字符串开始
if (i - 1 > 0 && p[i - 1] != _t('\\'))
{
int iStart = i;
++i;
bool bFind = false; //查找下一个 "\""
while (i < iTextLength )
{
if (p[i] == '\"' && p[i - 1] != _t('\\'))
{
bFind = true;
break;
}
else if (p[i] == _t('\n')) //当前行已结束,还未找到引号配对
{
bFind = true;
break;
}
++i;
}
if (!bFind)
{
return dtResult;
}
else
{
dtResult.Add(TextColor(iStart, i - iStart + 1, Color_::字符串));
}
}
else
{
++i;
}
}
else if (p[i] == _t('\'')) { //字符开始
if (i - 1 > 0 && p[i - 1] != _t('\\'))
{
int iStart = i;
++i;
bool bFind = false; //查找下一个 "\'"
while (i < iTextLength )
{
if (p[i] == _t('\'') && p[i - 1] != _t('\\'))
{
bFind = true;
break;
}
else if (p[i] == _t('\n')) //当前行已结束,还未找到引号配对
{
bFind = true;
break;
}
++i;
}
if (!bFind)
{
return dtResult;
}
else
{
dtResult.Add(TextColor(iStart, i - iStart + 1, Color_::字符串));
}
}
else
{
++i;
}
}
else if (Syntax::C_OperationalCharacter.IndexOf(p[i]) != -1)
{
dtResult.Add(TextColor(i, 1, cOS));
}
else if (p[i] == _t('{')) //大括号查找全部文本
{
int iFlag = 0;
for (int j = i + 1; j < iTextLength ; ++j) //查找配对,直到遇到分号;
{
_char cRight = p[j];
if (cRight == _t('}'))
{
if (iFlag == 0)
{
Color_ c = Color_::RedRandom();
dtResult.Add(TextColor(i, 1, c));
dtResult.Add(TextColor(j, 1, c));
break;
}
--iFlag;
}
else if (cRight == _t('{'))
{
++iFlag;
}
}
}
else if ( p[i] == _t('['))
{
int iFlag = 0;
for (int j = i + 1; j < iTextLength; ++j) //查找配对,直到遇到分号;
{
_char cRight = p[j];
if (cRight == _t(']'))
{
if (iFlag == 0)
{
Color_ c = Color_::RedRandom();
dtResult.Add(TextColor(i, 1, c));
dtResult.Add(TextColor(j, 1, c));
break;
}
--iFlag;
}
else if (cRight == _t('['))
{
++iFlag;
}
else if (ga.c_IsPunctuation(cRight)) //遇到标点符号停止
{
break;
}
}
}
else if (p[i] == _t('('))
{
int iFlag = 0;
for (int j = i + 1; j < iTextLength; ++j) //查找配对,直到遇到分号;
{
_char cRight = p[j];
if (cRight == _t(')'))
{
if (iFlag == 0)
{
Color_ c = Color_::RedRandom();
dtResult.Add(TextColor(i, 1, c));
dtResult.Add(TextColor(j, 1, c));
break;
}
--iFlag;
}
else if (cRight == _t('('))
{
++iFlag;
}
else if (cRight == _t(';'))
{
break;
}
}
}
else if (p[i] == _t('<')) //这里究竟是小于号还是尖括号
{
int iFlag = 0;
for (int j = i + 1; j < iTextLength; ++j) //查找配对,直到遇到分号;
{
_char cRight = p[j];
if (cRight == _t('>'))
{
if (iFlag == 0)
{
Color_ c = Color_::RedRandom();
dtResult.Add(TextColor(i, 1, c));
dtResult.Add(TextColor(j, 1, c));
break;
}
--iFlag;
}
else if (cRight == _t('<'))
{
++iFlag;
}
else if (cRight == _t(';'))
{
break;
}
}
}
else if (p[i] == _t('#'))
{ //这里开始分析C++宏定义语法
//#ifndef _MS_WINDOWS_ 正确
//# ifndef _MS_WINDOWS_ 正确
//#include<test.h">
//# include <test.h> 正确
// # + 预处理命令 + ?
int j = i + 1;
while (j < iTextLength)
{
if (p[j] != _t(' '))
{
sWord.Clear();
while (j < iTextLength)
{
if (gs.s_Syntax_IsIdentifierSeparator(p[j]))
{
if (this->C_Preprocessor.indexOf(sWord) != -1) //预处理关键字
{
dtResult.Add(TextColor(i, sWord.length() + 1, Color_::Red));
sWord.Clear();
}
i = j;
break;
}
else
{
sWord.add(p[j]);
}
++j;
}
break;
}
++j;
}
}
//开始查找,关键字,自定义类、等等
if (gs.s_Syntax_IsWordSeparator(p[i]))
{
if (sWord.length() > 0)
{
bool bFind = false;
//自定义类
DListNote<s_class>* pClass = sd.Class.First();
while (pClass != null)
{
if (pClass->Data.Name == sWord)
{
dtResult.Add(TextColor(i - sWord.length(), sWord.length(), Color_::自定义类));
bFind = true;
break;
}
pClass = pClass->Next;
}
//自定义函数
DListNote<s_function> *pFun = sd.Function.First();
while (pFun != null)
{
if (pFun->Data.Name == sWord)
{
dtResult.Add(TextColor(i - sWord.length(), sWord.length(), Color_::自定义函数));
bFind = true;
break;
}
pFun = pFun->Next;
}
if(!bFind) //自定义类和函数不能是关键字
{
//关键字最小长度大于2,且全是小写字母
if (sWord.length() >= 2)
{
if (C_Keyword.indexOf(sWord) != -1) //是关键字,记录位置
{
dtResult.Add(TextColor(i - sWord.length(), sWord.length(), cKeyWordColor));
if (sWord == _t("class") || sWord == _t("struct")) //分析类定义
{
//template<class T> T Max(T t1, T t2) { }
// template<class T1, class T2> v
//class X { public : int i; };
//class A : public virtual X { public : int j ; };
//class B : public virtual X { public : double d; } ;
//class C : public A, public B { public : int k; };
//class D : public C { };
//class Str : public Str<A>{};
//class
//bb{ };
//class CC : public std::string{}
//class cc{};
//template<class T> class Int{}; //先出现 >
bool bLess = false; //小于号
bool bFind = false;
int j = i + 1;
int iStart = -1;
_string sClassName(_t(""), 50);
while (j < iTextLength)
{
if (p[j] == '(') break; //模板函数
if (p[j] == '<')
{
bLess = true;
break; //模板类
}
if (p[j] == '>')
{
if (!bLess) //小于号没出现,先出现大小于号,是模板参数
{
break;
}
}
if (p[j] == _t('{') || p[j] == _t(':'))
{
bFind = true;
break;
}
if (p[j] != _t(' ') && p[j] != _t('\t') && p[j] != _t('\n'))
{
if (iStart == -1) iStart = j;
sClassName.add(p[j]);
}
++j;
}
if (bFind)
{
s_class s;
s.Name = sClassName;
s.DefinitionPos = i + 1;
dtResult.Add(TextColor(iStart, sClassName.length(), Color_::自定义类));
sd.Class.Add(s); //添加自定义类
i = j;
//log::d(sClassName);
}
}
else if (sWord == _t("typedef")) //分析别名
{
}
}
}
}
//log::d(_getc(sWord));
sWord.Clear(); //清空
}
}
else
{
sWord.add(p[i]);
}
}
return dtResult;
}