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

📄 declinfo.l

📁 doxygen(一个自动从源代码生成文档的工具)的源代码
💻 L
字号:
/****************************************************************************** * * $Id: declinfo.l,v 1.26 2001/03/19 19:27:40 root Exp $ * * Copyright (C) 1997-2001 by Dimitri van Heesch. * * Permission to use, copy, modify, and distribute this software and its * documentation under the terms of the GNU General Public License is hereby  * granted. No representations are made about the suitability of this software  * for any purpose. It is provided "as is" without express or implied warranty. * See the GNU General Public License for more details. * * Documents produced by Doxygen are derivative works derived from the * input used in their production; they are not affected by this license. * */%{/* *	includes */#include <stdio.h>//#include <iostream.h>#include <assert.h>#include <ctype.h>#include "declinfo.h"#include "util.h"#include "message.h"    #define YY_NO_UNPUT  /* ----------------------------------------------------------------- * *	statics */  static const char * inputString;static int	    inputPosition;static QCString      scope;static QCString      className;static QCString      classTempList;static QCString      funcTempList;static QCString      type;static QCString      name;static QCString      args;static QCString      tmpType;static int          sharpCount;static bool         classTempListFound;static bool         funcTempListFound;static QCString      exceptionString;static void addType(){  //printf("addType() type=`%s' scope=`%s' name=`%s'\n",  //       type.data(),scope.data(),name.data());  if (name.isEmpty() && scope.isEmpty()) return;  if (!type.isEmpty()) type+=" ";  if (!scope.isEmpty()) type+=scope+"::";  type+=name;  scope.resize(0);  name.resize(0);}  static void addTypeName(){  //printf("addTypeName() type=`%s' scope=`%s' name=`%s'\n",  //       type.data(),scope.data(),name.data());  if (name.isEmpty()) return;  if (!type.isEmpty()) type+=' ';  type+=name;  name.resize(0);}  #define YY_NEVER_INTERACTIVE 1  /* ----------------------------------------------------------------- */#undef	YY_INPUT#define	YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);static int yyread(char *buf,int max_size){    int c=0;    while( c < max_size && inputString[inputPosition] )    {	*buf = inputString[inputPosition++] ;	c++; buf++;    }    return c;}%}B       [ \t]ID	([a-z_A-Z][a-z_A-Z0-9]*)|(@[0-9]+)%option noyywrap%x      Start%x	Template%x	ReadArgs%x	Operator%x	FuncPtr%x	EndTemplate%x	StripTempArgs%x	SkipSharp%x      ReadExceptions%%<Start>"operator"		{ // operator rule must be before {ID} rule  				  name += yytext;  				  BEGIN(Operator);  				}<Start>(~{B}*)?{ID}({B}*"["{B}*"]")* { // the []'s are for Java  				  addTypeName();				  name += yytext;  				}<Start>{B}*"::"{B}*		{ // found a scope specifier 				  if (!scope.isEmpty())				  {				    scope+="::"+name; // add name to scope				  }				  else				  {  				    scope = name.copy(); // scope becomes name				  }				  name.resize(0);  				}<Start>[*&]+			{  				  addType();  				  type+=yytext;  				}<Start>{B}+			{  				  addType();  				}<Start>{B}*"("({ID}"::")*{B}*"*"({B}*("const"|"volatile"){B}+)?	{  				  addType();				  QCString text=yytext;				  type+=text.stripWhiteSpace();  				}<Start>{B}*")"			{  				  type+=")";  				}<Start>{B}*"("			{ // TODO: function pointers  				  args+="(";  				  BEGIN(ReadArgs);  				}<Start>{B}*"["			{  				  args+="[";				  BEGIN(ReadArgs);  				}<Start>{B}*"<"			{  				  name+="<";				  sharpCount=0;  				  BEGIN(Template);  				}<Template>"<<"			{ name+="<<"; }<Template>">>"			{ name+=">>"; }<Template>"<"			{  				  name+="<";  				  sharpCount++;  				}<Template>">"			{  				  name+=">";  				  if (sharpCount)				    --sharpCount;				  else				  {				    BEGIN(Start);				  }  				}<Template>.			{  				  name+=*yytext;  				}<Operator>{B}*"("{B}*")"{B}*"<>"{B}*/"("	{  				  name+="() <>";				  BEGIN(ReadArgs);  				}<Operator>{B}*"("{B}*")"{B}*/"("	{  				  name+="()";				  BEGIN(ReadArgs);  				}<Operator>[^(]*{B}*("<>"{B}*)?/"(" {  				  name+=yytext;				  BEGIN(ReadArgs);  				}<ReadArgs>"throw"{B}*"("	{  				  exceptionString="throw(";				  BEGIN(ReadExceptions);  				}<ReadArgs>.			{  				  args+=*yytext;  				}<ReadExceptions>.		{  				  exceptionString+=*yytext;  				}<*>.<*>\n%%/*@ ---------------------------------------------------------------------------- */void parseFuncDecl(const QCString &decl,QCString &cl,QCString &t,                   QCString &n,QCString &a,QCString &ftl,QCString &exc){  inputString   = decl;  //printf("Input=`%s'\n",inputString);  if (inputString==0) return;  inputPosition      = 0;  classTempListFound = FALSE;  funcTempListFound  = FALSE;  scope.resize(0);  className.resize(0);  classTempList.resize(0);  funcTempList.resize(0);  name.resize(0);  type.resize(0);  args.resize(0);  exceptionString.resize(0);  // first we try to find the type, scope, name and arguments  declinfoYYrestart( declinfoYYin );  BEGIN( Start );  declinfoYYlex();  //printf("type=`%s' class=`%s' name=`%s' args=`%s'\n",  //        type.data(),scope.data(),name.data(),args.data());  int nb = name.findRev('[');  if (nb!=-1 && args.isEmpty()) // correct for [] in name ambigity (due to Java return type allowing [])  {    args.prepend(name.right(name.length()-nb));    name=name.left(nb);  }#if 0  {    int l=scope.length();    int i=0;    int skipCount=0;    cl.resize(0);    ctl.resize(0);    for (i=0;i<l;i++)    {      char c=scope.at(i);      if (c=='<') 	skipCount++;      else if (c=='>') 	skipCount--;      else if (skipCount==0) 	cl+=c;    }  }  cl=stripTemplateSpecifiersFromScope(removeRedundantWhiteSpace(scope),FALSE);   ctl.resize(0);#endif  cl=scope;  n=removeRedundantWhiteSpace(name);  int il,ir;  if ((il=n.find('<'))!=-1 && (ir=n.findRev('>'))!=-1)    // TODO: handle cases like where n="operator<< <T>"   {    ftl=removeRedundantWhiteSpace(n.right(n.length()-il));    n=n.left(il);  }    //ctl=classTempList.copy();  //ftl=funcTempList.copy();  t=removeRedundantWhiteSpace(type);  a=removeRedundantWhiteSpace(args);  exc=removeRedundantWhiteSpace(exceptionString);    if (!t.isEmpty() && t.at(t.length()-1)==')') // for function pointers  {    a.prepend(")");    t=t.left(t.length()-1);  }  //printf("type=`%s' class=`%s' name=`%s' args=`%s'\n",  //        t.data(),cl.data(),n.data(),a.data());  return;    }//extern "C" { // some bogus code to keep the compiler happy//  int  declinfoYYwrap() { return 1 ; }//  void declinfoYYdummy() { yy_flex_realloc(0,0); } //}#if 0void dumpDecl(const char *s){  QCString className;  QCString classTNames;  QCString type;  QCString name;  QCString args;  QCString funcTNames;  msg("-----------------------------------------\n");  parseFuncDecl(s,className,classTNames,type,name,args,funcTNames);  msg("type=`%s' class=`%s' classTempl=`%s' name=`%s' "         "funcTemplateNames=`%s' args=`%s'\n",	    type.data(),className.data(),classTNames.data(),	    name.data(),funcTNames.data(),args.data()	);}// some test codeint main(){  dumpDecl("A < T > :: Value * A < T > :: getValue < S > ( const A < T > & a )");  dumpDecl("const A<T>::Value* A<T>::getValue<S>(const A<T>&a)");  dumpDecl("func()");  dumpDecl("friend void bla<>()");  dumpDecl("name< T > :: operator () (int bla)");  dumpDecl("name< T > :: operator << (int bla)");  dumpDecl("name< T > :: operator << <> (int bla)");  dumpDecl("className::func()");  dumpDecl("void ( * Name < T > :: bla ) ( int, char * )"); }#endif

⌨️ 快捷键说明

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