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

📄 defargs.l

📁 doxygen(一个自动从源代码生成文档的工具)的源代码
💻 L
字号:
/****************************************************************************** * * $Id: declinfo.l,v 1.1 1998/09/09 21:32:20 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. * *//*! \file *  This scanner is used to convert a string into a list of function or  *  template arguments. Each parsed argument results in a Argument struct, *  that is put into an ArgumentList in declaration order. *  Comment blocks for arguments can also be included in the string. *  The argument string does not contain new-lines (except inside any *  comment blocks). *  An Argument consists of the string fields:  *                 type,name,default value, and documentation *  The Argument list as a whole can be pure, constant or volatile. * *  Examples of input strings are: *  \code *    "(int a,int b) const" *    "(const char *s="hello world",int=5) = 0" *    "<class T,class N>" *    "(char c,const char)" *  \endcode * *  Note: It is not always possible to distinguish between the name and  *        type of an argument. In case of doubt the name is added to the *        type, and the matchArgumentList in util.cpp is be used to *        further determine the correct separation. */%{/* *	includes */#include "qtbc.h"#include <stdio.h>//#include <iostream.h>#include <assert.h>#include <ctype.h>#include <qregexp.h>#include "defargs.h"#include "entry.h"#include "util.h"  #define YY_NEVER_INTERACTIVE 1  /* ----------------------------------------------------------------- *	state variables */static const char      *g_inputString;static int	        g_inputPosition;static ArgumentList    *g_argList;static QCString        *g_copyArgValue;static QCString         g_curArgTypeName;static QCString         g_curArgDefValue;static QCString		g_curArgName;static QCString		g_curArgDocs;static QCString		g_curArgAttrib;static QCString		g_curArgArray;static int              g_argRoundCount;static int              g_argSharpCount;static int              g_argCurlyCount;static int              g_readArgContext;static int              g_lastDocContext;static int              g_lastDocChar;/* ----------------------------------------------------------------- */#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 && g_inputString[g_inputPosition] )    {	*buf = g_inputString[g_inputPosition++] ;	c++; buf++;    }    return c;}%}B       [ \t]ID	[a-z_A-Z][a-z_A-Z0-9]*%option noyywrap%x      Start%x      CopyArgString%x	CopyArgRound%x	CopyArgRound2%x	CopyArgSharp%x	CopyArgCurly%x	ReadFuncArgType%x	ReadFuncArgDef%x	ReadFuncArgPtr%x	FuncQual%x	ReadDocBlock%x	ReadDocLine%%<Start>[<(]				{ BEGIN(ReadFuncArgType); }<ReadFuncArgType>{B}*			{  					  g_curArgTypeName+=" ";  					}<ReadFuncArgType>"["[^\]]*"]"		{ 					  if (g_curArgTypeName.stripWhiteSpace().isEmpty())					  {					    g_curArgAttrib=yytext; // for M$-IDL					  }					  else // array type					  {					    g_curArgArray+=yytext;					  }					}<ReadFuncArgDef>"'"\\[0-7]{1,3}"'"	{ g_curArgDefValue+=yytext; }<ReadFuncArgDef>"'"\\."'"		{ g_curArgDefValue+=yytext; }<ReadFuncArgDef>"'"."'"			{ g_curArgDefValue+=yytext; }<ReadFuncArgDef>\"			{  					  g_curArgDefValue+=*yytext;  					  BEGIN( CopyArgString );  					}<ReadFuncArgType>"("([^:)]+{B}*"::")*{B}*[&*]+{B}*/{ID} {   					  // function pointer as argument					  g_curArgTypeName+=yytext;					  //g_curArgTypeName=g_curArgTypeName.simplifyWhiteSpace();					  BEGIN( ReadFuncArgPtr );  					}<ReadFuncArgPtr>{ID}			{					  g_curArgName=yytext;  					}<ReadFuncArgPtr>")"{B}*"("		{					  g_curArgTypeName+=yytext;					  //g_curArgTypeName=g_curArgTypeName.simplifyWhiteSpace();					  g_readArgContext = ReadFuncArgType;					  g_copyArgValue=&g_curArgTypeName;					  g_argRoundCount=0;					  BEGIN( CopyArgRound2 );					}<ReadFuncArgPtr>")"			{ // redundant braces detected / remove them					  int i=g_curArgTypeName.findRev('('),l=g_curArgTypeName.length();					  if (i!=-1)					    g_curArgTypeName=g_curArgTypeName.left(i)+					                   g_curArgTypeName.right(l-i-1);					  g_curArgTypeName+=g_curArgName;					  BEGIN( ReadFuncArgType );					}<ReadFuncArgType,ReadFuncArgDef>[({<]	{	 					  if (YY_START==ReadFuncArgType)					  {					    g_curArgTypeName+=*yytext;					    g_copyArgValue=&g_curArgTypeName;					  }					  else // YY_START==ReadFuncArgDef					  {					    g_curArgDefValue+=*yytext;					    g_copyArgValue=&g_curArgDefValue;					  }  					  g_readArgContext = YY_START; 					  if (*yytext=='(')					  {  					    g_argRoundCount=0; 					    BEGIN( CopyArgRound ); 					  }					  else if (*yytext=='{')					  {					    g_argCurlyCount=0; 					    BEGIN( CopyArgCurly ); 					  }					  else // yytext=='<'					  {					    g_argSharpCount=0; 					    BEGIN( CopyArgSharp ); 					  }					}<CopyArgRound,CopyArgRound2>"("		{  					  g_argRoundCount++;					  *g_copyArgValue += *yytext;  					}<CopyArgRound,CopyArgRound2>")"		{					  *g_copyArgValue += *yytext;					  if (g_argRoundCount>0) 					  {					    g_argRoundCount--;					  }					  else 					  {					    if (YY_START==CopyArgRound2)					    {					      *g_copyArgValue+=" "+g_curArgName;					    }					    BEGIN( g_readArgContext );					  }  					}<CopyArgSharp>"<"			{  					  g_argSharpCount++;					  *g_copyArgValue += *yytext;  					}<CopyArgSharp>">"			{					  *g_copyArgValue += *yytext;					  if (g_argSharpCount>0) g_argSharpCount--;					  else BEGIN( g_readArgContext );  					}<CopyArgCurly>"{"			{  					  g_argCurlyCount++;					  *g_copyArgValue += *yytext;  					}<CopyArgSharp>"}"			{					  *g_copyArgValue += *yytext;					  if (g_argCurlyCount>0) g_argCurlyCount--;					  else BEGIN( g_readArgContext );  					}<CopyArgString>\\.			{					  g_curArgDefValue+=yytext;  					}<CopyArgString>\"			{					  g_curArgDefValue+=*yytext;					  BEGIN( ReadFuncArgDef );  					}<ReadFuncArgType>"="			{					  BEGIN( ReadFuncArgDef );  					}<ReadFuncArgType,ReadFuncArgDef>[,)>]{B}*("/*"[*!]|"//"[/!])"<" {					  g_lastDocContext=YY_START;					  g_lastDocChar=*yytext;  					  QCString text=yytext;					  if (text.find("//")!=-1)					    BEGIN( ReadDocLine );					  else					    BEGIN( ReadDocBlock );  					}<ReadFuncArgType,ReadFuncArgDef>[,)>]	{					  g_curArgTypeName=removeRedundantWhiteSpace(g_curArgTypeName);					  g_curArgDefValue=g_curArgDefValue.stripWhiteSpace();					  int l=g_curArgTypeName.length();					  if (l>0)					  {					    int i=l-1;					    while (i>=0 && isspace(g_curArgTypeName.at(i))) i--;					    while (i>=0 && isId(g_curArgTypeName.at(i))) i--;					    //printf("g_curArgTypeName=`%s' i=%d\n",g_curArgTypeName.data(),i);					    Argument *a = new Argument; 					    a->attrib = g_curArgAttrib.copy();					    if (i>=0 && g_curArgTypeName.at(i)!=':')					    { // type contains a name					      a->type = removeRedundantWhiteSpace(g_curArgTypeName.left(i+1));					      a->name = g_curArgTypeName.right(g_curArgTypeName.length()-i-1);					    }					    else // assume only the type was specified, try to determine name later 					    {					      a->type = removeRedundantWhiteSpace(g_curArgTypeName);  					    }					    a->array  = removeRedundantWhiteSpace(g_curArgArray);					    a->defval = g_curArgDefValue.copy();					    a->docs   = g_curArgDocs.stripWhiteSpace();					    //printf("Argument `%s' `%s' adding docs=`%s'\n",a->type.data(),a->name.data(),a->docs.data());					    g_argList->append(a);					  }					  g_curArgAttrib.resize(0);					  g_curArgTypeName.resize(0);  					  g_curArgDefValue.resize(0);					  g_curArgArray.resize(0);					  g_curArgDocs.resize(0);					  if (*yytext==')')					  {					    BEGIN(FuncQual);					    //printf(">>> end of argument list\n");					  }					  else					  {					    BEGIN( ReadFuncArgType );					  }  					}<ReadFuncArgType,ReadFuncArgPtr>{ID}	{   					  QCString name=yytext; //resolveDefines(yytext);					  //printf("resolveName `%s'->`%s'\n",yytext,name.data());  					  g_curArgTypeName+=name;					}<ReadFuncArgType,ReadFuncArgPtr>.	{   					  g_curArgTypeName+=*yytext;					}<ReadFuncArgDef,CopyArgString>.		{					  g_curArgDefValue+=*yytext;  					}<CopyArgRound,CopyArgRound2,CopyArgSharp,CopyArgCurly>{ID}  {  					  QCString name=yytext; //resolveDefines(yytext);					  *g_copyArgValue+=name;					}<CopyArgRound,CopyArgRound2,CopyArgSharp,CopyArgCurly>.  {					  *g_copyArgValue += *yytext;					}<FuncQual>"const"		       	{ 					  g_argList->constSpecifier=TRUE;					}<FuncQual>"volatile"		    	{ 					  g_argList->volatileSpecifier=TRUE;					}<FuncQual>"="{B}*"0"		  	{ 					  g_argList->pureSpecifier=TRUE;					}<ReadDocBlock>[^\*\n]+			{  					  g_curArgDocs+=yytext;  					}<ReadDocLine>[^\n]+			{  					  g_curArgDocs+=yytext;  					}<ReadDocBlock>"*/"			{   					  if (g_lastDocChar!=0)					    unput(g_lastDocChar);  					  BEGIN(g_lastDocContext); 					}<ReadDocLine>\n				{  					  if (g_lastDocChar!=0)					    unput(g_lastDocChar);					  BEGIN(g_lastDocContext);  					}<ReadDocBlock>\n			{  					  g_curArgDocs+=*yytext;  					}<ReadDocBlock>.				{  					  g_curArgDocs+=*yytext;  					}<*>("/*"[*!]|"//"[/!])("<"?)		{  					  g_lastDocContext=YY_START;					  g_lastDocChar=0;  					  if (yytext[1]=='/')					    BEGIN( ReadDocLine );					  else  					    BEGIN( ReadDocBlock );  					}<*>\n<*>.%%/* ---------------------------------------------------------------------------- *//*! Converts an argument string into an ArgumentList. *  \param argsString the list of Arguments. *  \param al a reference to resulting argument list pointer. */ void stringToArgumentList(const char *argsString,ArgumentList* &al){  if (al==0) return;   if (argsString==0) return;  g_inputString   = argsString;  g_inputPosition = 0;  g_curArgTypeName.resize(0);  g_curArgDefValue.resize(0);  g_curArgName.resize(0);  g_argList = al;  defargsYYrestart( defargsYYin );  BEGIN( Start );  defargsYYlex();  //printf("stringToArgumentList(%s) result=%s\n",argsString,argListToString(al).data());}extern "C" { // some bogus code to keep the compiler happy  void defargsYYdummy() { yy_flex_realloc(0,0); } }

⌨️ 快捷键说明

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