📄 code.l
字号:
%x SkipInits%x ClassName%x ClassVar%x Bases%x SkipSharp%x ReadInclude%x TemplDecl%%<*>\x0d<Body>^([ \t]*"#"[ \t]*"include"[ \t]*)("<"|"\"") { startFontClass("preprocessor"); g_code->codify(yytext); BEGIN( ReadInclude ); }<Body>("class"|"struct"|"union"|"namespace")[ \t\n]+ { startFontClass("keyword"); codifyLines(yytext); endFontClass(); //g_code->codify(yytext); if (!g_insideTemplate) BEGIN( ClassName ); }<ReadInclude>[^\n\"\>]+/(">"|"\"") { //FileInfo *f; bool ambig; FileDef *fd; if ((fd=findFileDef(Doxygen::inputNameDict,yytext,ambig)) && fd->isLinkable()) { g_code->writeCodeLink(fd->getReference(),fd->getOutputFileBase(),0,yytext); } else { g_code->codify(yytext); } char c=yyinput(); QCString text; text+=c; g_code->codify(text); endFontClass(); BEGIN( Body ); }<Body>^[ \t]*"#" { startFontClass("preprocessor"); g_code->codify(yytext); BEGIN( SkipCPP ) ; }<SkipCPP>. { g_code->codify(yytext); }<SkipCPP>\\[\r]?\n { codifyLines(yytext); }<SkipCPP>\n/.*\n { codifyLines(yytext); endFontClass(); BEGIN( Body ) ; }<SkipCPP>"//" { g_code->codify(yytext); }<Body>"{" { g_theVarContext.pushScope(); g_scopeStack.push(INNERBLOCK); if (g_searchingForBody) { g_searchingForBody=FALSE; g_insideBody=TRUE; } g_code->codify(yytext); g_curlyCount++; if (g_insideBody) { g_bodyCurlyCount++; } g_type.resize(0); g_name.resize(0); }<Body>"}" { g_theVarContext.popScope(); if (g_scopeStack.pop()==SCOPEBLOCK) { popScope(); } g_code->codify(yytext); // TODO: remove g_inClass=FALSE; if (--g_curlyCount<=0) { //g_classScope.resize(0); //g_codeParmList.clear(); } if (--g_bodyCurlyCount<=0) { g_insideBody=FALSE; } }<ClassName,ClassVar>";" { g_code->codify(yytext); g_searchingForBody=FALSE; BEGIN( Body ); }<ClassName,ClassVar>[*&]+ { addType(); g_code->codify(yytext); }<ClassName>{ID} { //g_ccd.name=yytext; g_curClassName=yytext; addType(); generateClassOrGlobalLink(*g_code,yytext); BEGIN( ClassVar ); }<ClassVar>"=" { g_code->codify(yytext); unput(*yytext); BEGIN( Body ); }<ClassVar>{ID} { g_type = g_curClassName.copy(); g_name = yytext; g_theVarContext.addVariable(g_type,g_name); generateClassOrGlobalLink(*g_code,yytext); }<ClassName,ClassVar>[ \t\n]*":"[ \t\n]* { codifyLines(yytext); g_curClassBases.clear(); BEGIN( Bases ); }<Bases,ClassName,ClassVar>[ \t]*"{"[ \t]* { g_theVarContext.pushScope(); g_code->codify(yytext); g_curlyCount++; g_inClass=TRUE; if (g_searchingForBody) { g_searchingForBody=FALSE; g_insideBody=TRUE; } if (g_insideBody) g_bodyCurlyCount++; if (!g_curClassName.isEmpty()) // valid class name { g_scopeStack.push(SCOPEBLOCK); pushScope(g_curClassName); //CodeClassDef *cd=new CodeClassDef(g_ccd); //g_codeClassDict.insert(cd->name,cd); if (getResolvedClass(g_currentDefinition,g_curClassName)==0) { g_curClassDef=new ClassDef("<code>",1, g_curClassName,ClassDef::Class); g_codeClassSDict.append(g_curClassName,g_curClassDef); // insert base classes. char *s=g_curClassBases.first(); while (s) { ClassDef *bcd; bcd=g_codeClassSDict[s]; if (bcd==0) bcd=getResolvedClass(g_currentDefinition,s); if (bcd) { g_curClassDef->insertBaseClass(bcd,s,Public,Normal); } s=g_curClassBases.next(); } } //printf("g_codeClassList.count()=%d\n",g_codeClassList.count()); } else // not a class name -> assume inner block { g_scopeStack.push(INNERBLOCK); } g_curClassName.resize(0); g_curClassBases.clear(); BEGIN( Body ); }<Bases>"virtual"|"public"|"protected"|"private" { startFontClass("keyword"); g_code->codify(yytext); endFontClass(); }<Bases>{ID} { //printf("%s:addBase(%s)\n",g_ccd.name.data(),yytext); g_curClassBases.inSort(yytext); generateClassOrGlobalLink(*g_code,yytext); }<Bases>"<" { g_code->codify(yytext); g_sharpCount=1; BEGIN ( SkipSharp ); }<SkipSharp>"<" { g_code->codify(yytext); ++g_sharpCount; }<SkipSharp>">" { g_code->codify(yytext); if (--g_sharpCount<=0) BEGIN ( Bases ); }<Bases>"," { g_code->codify(yytext); } <Body>{SCOPEPREFIX}?"operator"{B}*"()"{B}*/"(" { addType(); generateFunctionLink(*g_code,yytext); g_bracketCount=0; g_args.resize(0); g_name+=yytext; BEGIN( FuncCall ); }<Body>{SCOPEPREFIX}?"operator"{B}*[^\(\n]+/"(" { addType(); generateFunctionLink(*g_code,yytext); g_bracketCount=0; g_args.resize(0); g_name+=yytext; BEGIN( FuncCall ); }<Body,TemplDecl>"template"/([^a-zA-Z0-9]) { startFontClass("keyword"); codifyLines(yytext); endFontClass(); g_insideTemplate=TRUE; g_sharpCount=0; }<Body>{KEYWORD}/([^a-z_A-Z0-9]) { startFontClass("keyword"); codifyLines(yytext); endFontClass(); }<Body>{KEYWORD}/{B}* { startFontClass("keyword"); codifyLines(yytext); endFontClass(); }<Body>{KEYWORD}/{B}*"(" { startFontClass("keyword"); codifyLines(yytext); endFontClass(); g_name.resize(0);g_type.resize(0); }<Body>{FLOWKW}/([^a-z_A-Z0-9]) { startFontClass("keywordflow"); codifyLines(yytext); endFontClass(); }<Body>{FLOWKW}/{B}* { startFontClass("keywordflow"); codifyLines(yytext); endFontClass(); }<Body>{FLOWKW}/{B}*"(" { startFontClass("keywordflow"); codifyLines(yytext); endFontClass(); g_name.resize(0);g_type.resize(0); }<Body>[\\|\)\+\-\/\%\~\!] { g_code->codify(yytext); g_name.resize(0);g_type.resize(0); if (*yytext==')') { g_theCallContext.popScope(); } }<Body,TemplDecl>{TYPEKW}/{B}* { startFontClass("keywordtype"); g_code->codify(yytext); endFontClass(); addType(); g_name+=yytext; }<Body>"template"/{B}*"<"[^\n\/\-\.\{\"\>]*">"{B}* { // template<...> startFontClass("keyword"); g_code->codify(yytext); endFontClass(); g_sharpCount=0; BEGIN(TemplDecl); }<TemplDecl>"class"|"typename" { startFontClass("keyword"); codifyLines(yytext); endFontClass(); }<TemplDecl>"<" { g_code->codify(yytext); g_sharpCount++; }<TemplDecl>">" { g_code->codify(yytext); g_sharpCount--; if (g_sharpCount<=0) { BEGIN(Body); } }<Body>{SCOPENAME}{B}*"<"[^\n\/\-\.\{\"\>]*">"/{B}* { // A<T> *pt; generateClassOrGlobalLink(*g_code,yytext); addType(); g_name+=yytext; }<Body>{SCOPENAME}/{B}* { // p->func() generateClassOrGlobalLink(*g_code,yytext); addType(); g_name+=yytext; }<Body>"("{B}*("*"{B}*)*{SCOPENAME}*{B}*")"/{B}* { // (*p)->func() g_code->codify(yytext); int s=0;while (!isId(yytext[s])) s++; int e=yyleng-1;while (!isId(yytext[e])) e--; QCString varname = ((QCString)yytext).mid(s,e-s+1); addType(); g_name=varname; }<Body>{SCOPETNAME}/{B}*"(" { // a() or c::a() or t<A,B>::a() addType(); generateFunctionLink(*g_code,yytext); g_theVarContext.addVariable(g_type,yytext); g_bracketCount=0; g_args.resize(0); g_name+=yytext; BEGIN( FuncCall ); }<FuncCall,Body,MemberCall,MemberCall2>\" { startFontClass("stringliteral"); g_code->codify(yytext); g_lastStringContext=YY_START; BEGIN( SkipString ); }<SkipString>[^\"\\\r\n]* { g_code->codify(yytext); }<SkipString>"//"|"/*" { g_code->codify(yytext); }<SkipString>\" { g_code->codify(yytext); endFontClass(); BEGIN( g_lastStringContext ); }<SkipString>\\. { g_code->codify(yytext); }<Body>":" { g_code->codify(yytext); g_name.resize(0);g_type.resize(0); }<Body>"<" { if (g_insideTemplate) { g_sharpCount++; } g_code->codify(yytext); }<Body>">" { if (g_insideTemplate) { if (--g_sharpCount<=0) { g_insideTemplate=FALSE; } } g_code->codify(yytext); }<Body,MemberCall,MemberCall2,FuncCall>"'"((\\0[Xx0-9]+)|(\\.)|(.))"'" { startFontClass("charliteral"); g_code->codify(yytext); endFontClass(); }<Body>"this->" { g_code->codify(yytext); }<Body>"."|"->" { g_code->codify(yytext); g_memCallContext = YY_START; BEGIN( MemberCall ); }<MemberCall>{SCOPETNAME}/{B}*"(" { if (g_theCallContext.getClass()) { if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext)) { g_code->codify(yytext); } g_name.resize(0); } else { g_code->codify(yytext); g_name.resize(0); } g_type.resize(0); g_bracketCount=0; if (g_memCallContext==Body) { BEGIN(FuncCall); } else { BEGIN(g_memCallContext); } }<MemberCall>{SCOPENAME}/{B}* { if (g_theCallContext.getClass()) { if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext)) { g_code->codify(yytext); } g_name.resize(0); } else { g_code->codify(yytext); g_name.resize(0); } g_type.resize(0); BEGIN(g_memCallContext); }<MemberCall>[^a-z_A-Z0-9(\n] { g_code->codify(yytext); g_type.resize(0); g_name.resize(0); BEGIN(g_memCallContext); }<Body>[,=;\[] { g_code->codify(yytext); g_saveName = g_name.copy(); g_saveType = g_type.copy(); if (!g_type.isEmpty()) { g_theVarContext.addVariable(g_type,g_name); g_name.resize(0); } if (*yytext==';') { g_type.resize(0); g_name.resize(0); } g_args.resize(0); }<Body>"]" { g_code->codify(yytext); // TODO: nested arrays like: a[b[0]->func()]->func() g_name = g_saveName.copy(); g_type = g_saveType.copy(); }<Body>[0-9]+ { g_code->codify(yytext); }<Body>[0-9]+[xX][0-9A-Fa-f]+ { g_code->codify(yytext); }<MemberCall2,FuncCall>{KEYWORD}/([^a-z_A-Z0-9]) { addParmType(); g_parmName=yytext; startFontClass("keyword"); g_code->codify(yytext); endFontClass(); }<MemberCall2,FuncCall>{TYPEKW}/([^a-z_A-Z0-9]) { addParmType(); g_parmName=yytext; startFontClass("keywordtype"); g_code->codify(yytext); endFontClass(); }<MemberCall2,FuncCall>{FLOWKW}/([^a-z_A-Z0-9]) { addParmType(); g_parmName=yytext; startFontClass("keywordflow"); g_code->codify(yytext); endFontClass(); }<MemberCall2,FuncCall>[a-z_A-Z][:a-z_A-Z0-9]*({B}*"<"[^\n\<\>]*">")? { addParmType(); g_parmName=yytext; generateClassOrGlobalLink(*g_code,yytext); }<MemberCall2,FuncCall>, { g_code->codify(yytext); g_theVarContext.addVariable(g_parmType,g_parmName); g_parmType.resize(0);g_parmName.resize(0); }<MemberCall2,FuncCall>"(" { g_code->codify(yytext); g_bracketCount++; g_theCallContext.pushScope();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -