diff options
Diffstat (limited to 'src/vhdlscanner.l')
-rw-r--r-- | src/vhdlscanner.l | 2052 |
1 files changed, 0 insertions, 2052 deletions
diff --git a/src/vhdlscanner.l b/src/vhdlscanner.l deleted file mode 100644 index d411325..0000000 --- a/src/vhdlscanner.l +++ /dev/null @@ -1,2052 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1997-2014 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. - * - */ -/****************************************************************************** - * Parser for VHDL subset - * written by M. Kreis - * supports VHDL-87/93 - * does not support VHDL-AMS - ******************************************************************************/ -%{ - - -// global includes -#include <stdio.h> -#include <stdlib.h> -#include <assert.h> -#include <string.h> -#include <qcstring.h> -#include <qfileinfo.h> -#include <qstringlist.h> - -/* --------------------------------------------------------------- */ - -// local includes -#include "vhdlscanner.h" -#include "vhdlcode.h" -#include "vhdldocgen.h" -#include "message.h" -#include "config.h" -#include "doxygen.h" -#include "util.h" -#include "language.h" -#include "commentscan.h" -#include "index.h" -#include "definition.h" -#include "searchindex.h" -#include "outputlist.h" -#include "arguments.h" -/* --------------------------------------------------------------- */ - -#define YY_NEVER_INTERACTIVE 1 -#define YY_NO_INPUT 1 - -//#define theTranslator_vhdlType theTranslator->trVhdlType -#define theTranslator_vhdlType VhdlDocGen::getVhdlType - -static QStringList qrl; -static int openGroups; -static ParserInterface *g_thisParser; -static const char * inputString; -static int inputPosition; -static int inputLen; -static int startComment = 0; -static QFile inputFile; -static QCString inbuf; -static Entry* global_root = 0; -static Entry* current_root = 0; -static Entry* current = 0; -static Entry* previous = 0; -static Entry* functionEntry = 0; -static Entry* lastEntity = 0; -static Entry* lastCompound = 0; -static int genPort = 0; -static QCString yyFileName; -static int iFuncLine = 1; -static bool g_inputFromFile ; -static bool g_lexInit = FALSE; -static int isBody=0; -static int isFunc=0; -static int yyLineNr = 1; -static char * g_buf = 0; -static uint g_bufSize = 0; -static int iTextCounter = 0; -static int iCounter = 0; -static int bropen = 0; -static int scantype = 0; -static int g_lastCommentContext = 0; -static bool docBlockAutoBrief; -static char docBlockTerm; -static int iDocLine = -1; -static Entry gBlock; -static int num_chars; - -//#define YY_A_INTERACTIVE 1 -#define YY_NEVER_INTERACTIVE 1 -//----------------------------------------------------------------------------- -#define YY_USER_ACTION num_chars += yyleng; -static void parserInit(); -static void deleteSpecChars(char* str,char *buf); -static void handleCommentBlock(const QCString &doc,bool brief); -static void newEntry(); -static void initEntry(Entry *e); - -static int iCodeLen; - -static void makeInline() -{ - int diff=num_chars-iCodeLen; - assert(inputLen>iCodeLen+diff); - QCString par(&inputString[iCodeLen],diff); - int index=par.findRev("\\endcode"); - int tt=par.length()-par.find("\n",index); - QCString qc(&inputString[iCodeLen-tt],diff); - index=qc.findRev("--!"); - if (index<=0) return; - par=qc.left(index); - /* - fprintf(stderr,"\n-------------------------------------------------------------------------------- "); - fprintf(stderr,"\n bytes since %d %d \n %s",num_chars,iCodeLen,par.data()); - fprintf(stderr,"\n-------------------------------------------------------------------------------- "); - */ - gBlock.doc=par; - gBlock.section=Entry::VARIABLE_SEC; - gBlock.spec=VhdlDocGen::MISCELLANEOUS; - gBlock.fileName = yyFileName; - gBlock.endBodyLine=yyLineNr-1; - Entry *temp=new Entry(gBlock); - if (lastCompound) - lastCompound->addSubEntry(temp); - else if (lastEntity) - lastEntity->addSubEntry(temp); - else - { - temp->type="misc"; // global code - current_root->addSubEntry(temp); - } - - gBlock.reset(); - -}// makeInline - -static void addSubEntry(Entry* root, Entry* e) -{ - if (e==0 || root==0) return; - //if (isPrevDoc) - //{ - // e->brief=prevDocEntry.brief; - // e->briefLine=prevDocEntry.briefLine; - // prevDocEntry.reset(); - // isPrevDoc=FALSE; - //} - root->addSubEntry(e); -} - -static void bufferClear() -{ - int j; - for (j=0;j<iCounter+1;j++) - { - g_buf[j]=0; - } - - iCounter=0; -} - -static void addText (char *word, int llen) -{ - if ((uint)(iCounter + llen) > g_bufSize) - { - char *pTmp = (char*)realloc(g_buf,iCounter+llen+2048); - if (pTmp) - { - g_buf = pTmp; - } - else - { - fprintf(stderr,"\n not enough memory for realloc\n"); - return; - } - } - while (llen>0) - { - g_buf[iCounter]=*word++; - iCounter++; - llen--; - } - g_buf[iCounter]='\0'; -} - -static void getBufText(QCString& qc,int start) -{ - while (start < iCounter) - { - qc+=(g_buf[start]); - start++; - } -} - -static void lineCount() -{ - for ( const char* c = yytext ; *c ; ++c ) - { - yyLineNr += (*c == '\n') ; - } -} - -static void deleteSpecChars(char* str,char *buf) -{ - while (*str) - { - if ((*str == '\t') || (*str == '\n') || (*str == '\r') || (*str == ' ')) - { - str++; - } - else - { - *buf++ = *str++; - } - } - *buf='\0'; -} - -static void getType(Entry* p,char* text) -{ - QCString name(text); - name=name.stripWhiteSpace(); - if (qstricmp(name.data(),"signal" )==0) - { - p->spec=VhdlDocGen::SIGNAL; - } - else if (qstricmp(name.data(),"type" )==0) - { - p->spec=VhdlDocGen::TYPE; - } - else if (qstricmp(name.data(),"subtype" )==0) - { - p->spec=VhdlDocGen::SUBTYPE; - } - else if (qstricmp(name.data(),"constant" )==0) - { - p->spec=VhdlDocGen::CONSTANT; - } - else if (qstricmp(name.data(),"attribute" )==0) - { - p->spec=VhdlDocGen::ATTRIBUTE; - } - else if (qstricmp(name.data(),"function" )==0) - { - p->spec=VhdlDocGen::FUNCTION; - } - else if (qstricmp(name.data(),"procedure" )==0) - { - p->spec=VhdlDocGen::PROCEDURE; - } - else if (qstricmp(name.data(),"units" )==0) - { - p->spec=VhdlDocGen::UNITS; - } - else if (name.contains("shared",false) && name.contains("variable",false)) - { - p->spec=VhdlDocGen::SHAREDVARIABLE; - } - else if (qstricmp(name.data(),"file" )==0) - { - p->spec=VhdlDocGen::VFILE; - } - else if (qstricmp(name.data(),"group" )==0) - { - p->spec=VhdlDocGen::GROUP; - } - else if (qstricmp(name.data(),"alias" )==0) - { - p->spec=VhdlDocGen::ALIAS; - } - else - { - err("wrong type"); - } - p->section=Entry::VARIABLE_SEC; -} - -//------------------------------------------------------------------------- - -/* - * adds signals found in entities|records|units - */ - -static void addSignals(const char* str,int line, Entry *e,const char *comment=0) -{ - //printf("===> addSignals (%s) comment='%s'\n",str,comment); - QList<QCString> ql; - QCString bufio; - ql.setAutoDelete(TRUE); - - VhdlDocGen::getSigName(ql,str,bufio); - int count = ql.count(); - - QCString brief = current->brief; - QCString doc = current->doc; - Entry *tmpEntry = current; - current = new Entry; - initEntry(current); - handleCommentBlock(comment,TRUE); - if (!current->brief.isEmpty()) - { - if (doc.isEmpty()) - { - doc = brief; - } - else if (!brief.isEmpty()) - { - doc = brief + "<p>" + doc; - } - brief = current->brief; - } - delete current; - current = tmpEntry; - current->brief.resize(0); - current->doc.resize(0); - - if (genPort!=3) // not a unit - { - for (int k=1;k<count;k++) - { - //printf("adding '%s' '%s'\n",ql.at(0)->data(),ql.at(k)->data()); - Entry *pTemp=new Entry; - initEntry(pTemp); - pTemp->startLine = line; - pTemp->bodyLine = line; - pTemp->name = ql.at(k)->data(); - pTemp->section = Entry::VARIABLE_SEC; - pTemp->brief = brief; - pTemp->doc = doc; - pTemp->mGrpId = current->mGrpId; // copy member group id - QCString stSpec = ql.at(0)->data(); - if (genPort==1) // found port - { - pTemp->spec = VhdlDocGen::PORT; - stSpec.stripPrefix(bufio.data()); - stSpec=stSpec.stripWhiteSpace(); - pTemp->args = stSpec; - pTemp->type = bufio; - addSubEntry(e,pTemp); - } - else if (genPort==2) // found record - { - pTemp->spec = VhdlDocGen::RECORD; - pTemp->type = stSpec; - pTemp->name.prepend(VhdlDocGen::getRecordNumber()); - delete current; - current = new Entry(*pTemp); // make a deep copy of pTemp - newEntry(); // add it to lastCompound and make a new current - delete pTemp; - } - else - { - pTemp->spec = VhdlDocGen::GENERIC; - pTemp->type = stSpec; - addSubEntry(e,pTemp); - } - }// for - } - else // found a unit - { - Entry *pTemp=new Entry; - initEntry(pTemp); - QCString tt(str); - QStringList ql=QStringList::split("=",tt,FALSE); - pTemp->spec = VhdlDocGen::UNITS; - pTemp->section = Entry::VARIABLE_SEC; - pTemp->startLine = line; - pTemp->bodyLine = line; - pTemp->brief = brief; // adds brief description to the unit member - pTemp->doc = doc; // adds doc to the unit member - pTemp->type = ql[1].utf8(); - pTemp->name = ql[0].utf8().stripWhiteSpace(); - pTemp->name.prepend(VhdlDocGen::getRecordNumber()); - delete current; - current = new Entry(*pTemp); // make a deep copy - newEntry(); // add it to lastCompound - delete pTemp; - } -} - -/* - * this function parses a process prototype - * and adds the signal to the process - */ - -static void parseProcessProto() -{ - QStringList ql; - QCString qcs; - bool sem=FALSE; - //Entry* ppEntry=new Entry; - //ppEntry->fileName=yyFileName; - //processEntry=ppEntry; - QCString name; - scantype=0; - getBufText(qcs,0); - if (qcs.contains('(') != qcs.contains(')')) return; - VhdlDocGen::deleteAllChars(qcs,'\n'); - VhdlDocGen::parseProcessProto(qcs,name,ql); - current->section=Entry::FUNCTION_SEC; - //current->stat=TRUE; - current->spec=VhdlDocGen::PROCESS; - current->startLine=iFuncLine; - current->bodyLine=iFuncLine; - current->fileName=yyFileName; - if (!name.isEmpty()) - { - current->name=name.stripWhiteSpace(); - } - else // found an anonymous process, so we add a generated name - { - current->name=VhdlDocGen::getProcessNumber(); - } - - current->args+=" ( "; - if (!ql.isEmpty()) - { - QValueList<QString>::Iterator iter = ql.begin(); - for ( ; iter != ql.end(); ++iter) - { - if (sem) - { - current->args+=','; - } - Argument *arg=new Argument; - arg->name=(*iter).utf8().stripWhiteSpace(); - current->argList->append(arg); - current->args+=(*iter).utf8(); - sem = TRUE; - } - } - current->args+=" ) "; - bufferClear(); -}//parseProcessProto - - -/* - * parses a function|procedure protoype - */ - -static void parseFunctionProto() -{ - QCString name,ret,qcs,temp; - bool sem=FALSE; - QList<Argument> ql; - ql.setAutoDelete(TRUE); - getBufText(qcs,0); - if (qcs.contains('(') != qcs.contains(')')) - return; // function without a prototype - if (qcs.contains("function",FALSE)==0 && qcs.contains("procedure",FALSE)==0) - return; - qcs=qcs.stripWhiteSpace(); - temp=qcs.lower(); - if (temp.stripPrefix("impure")) - { - current->exception="impure"; - qcs=qcs.remove(0,6); - } - else if (temp.stripPrefix("pure")) - { - current->exception="pure"; - qcs=qcs.remove(0,4); - } - - VhdlDocGen::parseFuncProto(qcs.data(),ql,name,ret); - //printf("parseFuncProto(%s)=%s,%s\n",qcs.data(),name.data(),ret.data()); - VhdlDocGen::deleteAllChars(name,';'); - current->name=name; - current->startLine=iFuncLine; - current->bodyLine=iFuncLine; - - int count = ql.count(); - - current->args+" ( "; - for (int k=0;k<count;k++) - { - if (sem) - { - current->args+=","; - } - Argument *arg=new Argument; - Argument *hh=(Argument*)ql.at(k); - arg->name=hh->name; - arg->type=hh->type; - arg->defval=hh->defval; - arg->attrib=hh->attrib; - current->argList->append(arg); - current->args+=hh->name; - sem=TRUE; - } - current->args+" )"; - - if (!ret.isEmpty()) - current->spec=VhdlDocGen::FUNCTION; - else - current->spec=VhdlDocGen::PROCEDURE; - - current->section=Entry::FUNCTION_SEC; - current->type=ret; - //addSubEntry(ee,ppEntry); - if (lastCompound) - { - lastCompound->addSubEntry(current); - current = new Entry; - initEntry(current); - } - else - { - newEntry(); - } - bufferClear(); -}//parseFunctionProto - -static Entry* getEntryAtLine(const Entry* ce,int line) -{ - EntryListIterator eli(*ce->children()); - Entry *found=0; - Entry *rt; - for (;(rt=eli.current());++eli) - { - if (rt->bodyLine==line) - { - found=rt; - } // if - if (!found) - { - found=getEntryAtLine(rt,line); - } - } - return found; -}// getEntryAtLine - -//------------------------------------------------------------------------- - -static void parserInit() -{ - iCounter=0; - iTextCounter=0; - yyLineNr=1; - current=0; - previous=0; - isFunc=0; - isBody=0; - scantype=0; - lastCompound=0; - lastEntity=0; - bropen=0; - openGroups=0; - iDocLine=-1; - qrl.clear(); - num_chars=0; - - if (!g_lexInit) - { - VhdlDocGen::init(); - } - - g_bufSize=inputFile.size()+1024; - if (g_buf==0) free(g_buf); - g_buf=(char*)(calloc(g_bufSize,sizeof(char))); - - if (g_buf==0) - { - fprintf(stderr,"\n not enough memory"); - return; - } - g_buf[g_bufSize-1]='\0'; -} - -bool VHDLLanguageScanner::needsPreprocessing(const QCString &) -{ - return FALSE; -} - - -void VHDLLanguageScanner::resetCodeParserState() -{ - -} - -#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; - if (g_inputFromFile) - { - c = inputFile.readBlock(buf,max_size); - if (c==-1) yy_fatal_error("input in flex scanner failed"); - } - else - { - while ( c < max_size && inputString[inputPosition] ) - { - *buf = inputString[inputPosition++] ; - c++; - buf++; - } - } - return c; -} - - - -%} - - - /* start command character */ - /* -------------- VHDL SECTION -----------------------------------*/ - -B [ \t] -CR [\r\n] -BR [ \t\n\r] -DIGIT [0-9] -LOWER_CASE_LETTER [a-z] -UPPER_CASE_LETTER [A-Z] -LETTER [a-zA-Z_0-9] -SPACE_CHARACTER [ \t] -SPECIAL_CHARACTER [#&'()*+,\-\./:;<=>_|] -OTHER_SPECIAL_CHARACTER [~!$ยง%?@\[\\\]^{}] -BASIC_GRAPHIC_CHARACTER {UPPER_CASE_LETTER}|{DIGIT}|{SPECIAL_CHARACTER}|{SPACE_CHARACTER} -GRAPHIC_CHARACTER {BASIC_GRAPHIC_CHARACTER}|{LOWER_CASE_LETTER}|{OTHER_SPECIAL_CHARACTER} -EXTENDED_CHARACTER [\\]{GRAPHIC_CHARACTER}*[\\] - -NAME ({LETTER}[a-zA-Z0-9_.]*)|{EXTENDED_CHARACTER} -STRING_LITERAL \"{GRAPHIC_CHARACTER}*\" -FUNCNAME ([a-zA-Z"][*+\-_a-zA-Z0-9"\/=<>]*)|{EXTENDED_CHARACTER} -DIGITS [0-9]+|[0-9]+"."[0-9]+|[0-9]+"#"[0-9_a-fA-F\+\.]+"#" -COMMENT "--"[^\n]* -LABELID [a-z_A-Z][^\;]*";"({B}*{COMMENT})* -PROTO [ (]* -TEXTT "--"[^\/\@\*\#][^\n]* -PROC ("function"|"procedure") -ENDE ({BR}*("end"){BR}*{PROC}*{BR}*[;]{1}) -ENDEFF ("if"|"case"|"loop"|"generate"){BR}*[;] -ENDE3 ({BR}*("end"){BR}*{PROC}*{BR}*{FUNCNAME}{BR}*[;])|{ENDE} -ENDFUNC {B}*"end"{BR}*{PROC}*{BR}*{FUNCNAME}{BR}*[;] -FUNCIMPURE "impure"|"pure" -FUNCPROC ^{B}*{FUNCIMPURE}*{BR}*("function"|"procedure"){B}* -ARCHITECTURE ("architecture"){BR}+{NAME}{BR}*("of") - /* Removed due to bug 538239 - POST "postponed" - PROCESS ({BR}*{FUNCNAME}{B}*[:]{BR}*({POST}{BR}+)?("process"){BR}*{PROTO})|("process"){BR}*("("){BR}*{PROTO}|[^a-zA-Z]("process"){CR}|[^a-zA-Z]("process"){BR}+("is") - */ -PROCESS ({B}*{FUNCNAME}{B}*:{BR}*)?({B}*("postponed"){BR}+)?{B}*("process"){BR}*{PROTO} - -ENDPROCESS ("end"){BR}*("postponed")*("process"){BR}*{FUNCNAME}*{BR}*[;] -LIBUSE ^{B}*("use"|"library"){BR}+ -ENTITY ^{B}*("component"|"entity"|"package"){BR}+ -PBODY ("package"){B}+("body"){BR}+{NAME} -SHARED ("shared"){BR}+("variable") -SIGTYPES ^{B}*({SHARED}|"alias"|"file"|"group"|"subtype"|"type"|"constant"|"attribute"|"signal"|"units"){BR}+ -CONFIG ("configuration"){BR}+{NAME}{BR}*("of"){BR}+{NAME}{BR}+"is" - -ALLTYPESMAP {B}*[_a-zA-ZA_Z0-9.() ]*{B}* -MAPCOMPONENT ({ALLTYPESMAP}{BR}*[:]{BR}*("component"|"configuration")*{ALLTYPESMAP}{BR}*{TEXTT}*{BR}*("port"|"generic"){BR}*("map"){BR}*("("){1}) -MAPCOMPONENT1 ({ALLTYPESMAP}{BR}*[:]{BR}*("entity"){BR}*{ALLTYPESMAP}{BR}*("port"|"generic"){BR}*("map"){BR}*("("){1}) - -BRACEOPEN [(]{1} -BRACECLOSE [)]{1} - -ALLID [^;()\t ] - -/* VHDL 2001 */ -ENDPROTECTED ("end"{BR}+"protected"{BR}+{NAME}{BR}*";")|("end"{BR}+"protected"{BR}*";") -ENDPROTECEDBODY "end"{BR}+"protected"{BR}+"body"{BR}+{NAME} - - -%option noyywrap - - /* language parsing states */ - -%x Start -%x Comment -%x FindTypeName -%x ParseType -%x ParseRecord -%x ParseUnits -%x ParseProcess -%x ParseFunc -%x FindName -%x FindEntityName -%x FindGenPort -%x FindTypes -%x FindSigName -%x FindFuncName -%x FindBegin - -%% - -<Start>{ENDPROTECTED}|{ENDPROTECEDBODY} { - lineCount(); -} - - - -<Start>{CONFIG} { // found configuration - - QCString qcs(vhdlscannerYYtext); - current->name=VhdlDocGen::getIndexWord(qcs,1); - current->type=VhdlDocGen::getIndexWord(qcs,3); - current->startLine=yyLineNr; - current->bodyLine=yyLineNr; - current->section=Entry::VARIABLE_SEC; - current->spec=VhdlDocGen::CONFIG; - current->args="configuration"; - newEntry(); - BEGIN(Start); -} - -<Start>{SIGTYPES} { // found type constant|type|attribute and so on.. - bropen=0; - lineCount(); - - bufferClear(); - //pEntry=current; - getType(current,yytext); - current->bodyLine=yyLineNr; - if (current->spec==VhdlDocGen::UNITS) - { - //addSubEntry(current,pEntry); - current->startLine=yyLineNr; - current->bodyLine=yyLineNr; - newEntry(); // adds the unit to the lastCompound - genPort=3; - BEGIN(ParseRecord); - } - else - { - BEGIN(FindTypeName); - } - } - -<Start>{ARCHITECTURE} { //found architecure - lineCount(); - bropen=0; - bufferClear(); - isBody=0; - lastCompound = current; - QCString curName=VhdlDocGen::getIndexWord(yytext,1); - current->section=Entry::CLASS_SEC; //Entry::CLASS_SEC; - current->spec=VhdlDocGen::ARCHITECTURE; - current->protection=Private; - current->name=curName; - current->fileName=yyFileName; - current->startLine=yyLineNr; - current->bodyLine=yyLineNr; - //printf("-> Architecture at line %d\n",yyLineNr); - BEGIN(FindName); -} - - -<Start>{PROCESS} { //found process - lineCount(); - iFuncLine=yyLineNr; - bropen=0; - //printf("--> Process: line=%d\n",yyLineNr); - bufferClear(); - addText(yytext,yyleng); - QCString qcs(yytext); - if (qcs.contains('(')) - { - bropen=1; - scantype=2; - BEGIN(ParseType); - } - else - { - // iFuncLine--; - parseProcessProto(); - BEGIN(ParseProcess); - } -} - -<Start>{LIBUSE}{BR}* { // found library or package - bropen=0; - bufferClear(); - isBody=0; - QCString qcs=QCString(yytext); - // lowerString(qcs); - qcs=qcs.stripWhiteSpace(); - if (qstricmp(qcs.data(),"use")==0) - { - current->spec=VhdlDocGen::USE; - current->type="package"; - } - else - { - current->spec=VhdlDocGen::LIBRARY; - current->type="library"; - } - current->section=Entry::VARIABLE_SEC; - current->bodyLine=yyLineNr; - lineCount(); - BEGIN(FindName); -} - -<Start>{FUNCPROC} { // found a new function|procedure - lineCount(); - iFuncLine=yyLineNr; - bropen=0; - bufferClear(); - isFunc=1; - addText(yytext,yyleng); - BEGIN(FindFuncName); -} - -<Start>{ENTITY} { // found entity|component|package - lineCount(); - //printf("--> Entity at line %d\n",yyLineNr); - - bropen=0; - bufferClear(); - QCString word = QCString(yytext).lower().stripWhiteSpace(); - - if (word=="entity") - { - isBody=0; - scantype=0; - lastCompound=0; - current->section=Entry::CLASS_SEC; - current->spec=VhdlDocGen::ENTITY; - current->protection=Public; - current->bodyLine=yyLineNr; - current->fileName=yyFileName; - lastEntity = current; - } - else if (word=="component") - { - current->section=Entry::VARIABLE_SEC; - // current->stat=TRUE; - current->spec=VhdlDocGen::COMPONENT; - current->bodyLine=yyLineNr; - scantype=1; - } - else if (word=="package") - { - isBody=0; - scantype=0; - lastCompound = current; - current->section=Entry::NAMESPACE_SEC; - current->spec=VhdlDocGen::PACKAGE; - current->protection=Package; //VhdlDocGen::PACKAGE; - current->bodyLine=yyLineNr; - current->fileName=yyFileName; - } - else - err("\n found wrong component at line [%d]",yyLineNr); - - BEGIN(FindEntityName); -} - -<Start>{MAPCOMPONENT}|{MAPCOMPONENT1} { // found component instantiation - - // lineCount(); - QCString type; - QCString tt(yytext); - QRegExp regg("[\\s:.()-]"); - QStringList qsl=QStringList::split(regg,tt,false); - - // consider upper/lower-case letters - QStringList qsltemp=QStringList::split(regg,tt.lower(),false); - int index=qsltemp.findIndex(QCString("entity"))+1; - index+=qsltemp.findIndex(QCString("component"))+1; - index+=qsltemp.findIndex(QCString("configuration"))+1; - int len=qsltemp.count(); - - current->spec=VhdlDocGen::COMPONENT_INST; - current->section=Entry::VARIABLE_SEC; - current->startLine=yyLineNr; - current->bodyLine=yyLineNr; - - if (index!=0 && tt.contains(')')==0) // found component instantiation xxx: configuration/component/entity yyy - { - current->type=qsl[len-3].utf8(); - } - else if (index!=0 && tt.contains(')')) // found component instantiation xxx: entity www.yyy(zzz) - { - current->type=qsl[len-4].utf8(); - } - else - { - current->type=qsl[1].utf8(); // found component instantiation xxx:yyy - } - - current->name=qsl[0].utf8(); -#if 0 - if (lastCompound) - { - if (!VhdlDocGen::foundInsertedComponent(current->type,lastCompound)) - { - printf("** %s: new BaseInfo(%s)\n",lastCompound->name.data(),current->type.data()); - BaseInfo *bb=new BaseInfo(current->type,Public,Normal); - lastCompound->extends->append(bb); - } - lastCompound->addSubEntry(current); - current = new Entry; - initEntry(current); - } - else -#endif - { - newEntry(); - } - lineCount(); - -} - -<Start>{CR}* { - lineCount(); - addText(yytext,yyleng); - BEGIN(Start); -} - -<ParseProcess>[^;()] { - // eat process body - lineCount(); - BEGIN(ParseProcess); -} - -<ParseProcess,ParseType>{ENDPROCESS} { // find end of process - lineCount(); - current->endBodyLine=yyLineNr; - //printf("Process: start=%d end=%d\n",current->bodyLine,current->endBodyLine); - if (lastCompound) - { - lastCompound->addSubEntry(current); - current = new Entry; - initEntry(current); - } - else - { - newEntry(); - } - BEGIN(Start); -} - - -<ParseUnits>{BR}* { - lineCount(); -} - -<ParseUnits>{B}*[a-z_][^\n;]* { // parse record|unit body - lineCount(); - QCString zz(yytext); - addSignals(zz.data(),yyLineNr,current); - BEGIN(ParseUnits); -} - -<FindName>{NAME} { // found entity|architecture|component name - lineCount(); - - QCString qcs(yytext); - qcs=qcs.stripWhiteSpace(); - if (current->spec==VhdlDocGen::USE || current->spec==VhdlDocGen::LIBRARY) - { - int j=qcs.length(); - int i=qcs.find("."); - if (i>0) - qcs=qcs.right(j-i-1); - i=qcs.find("."); - if (i>0) - qcs=qcs.left(i); - /* - -- Consider the case we have more than one entity in one file.Each entity has its own package/library - -- declaration. In this case package yyy will be added [with newEntry()] to architecture aaa !! instead to entity - -- bbb. We must place these constructs to current_root and the function mapLibPackage() will finish the rest. - - -- package xxx; - -- entity aaa - -- .... - -- end entity aaa; - -- architecture aaa - -- ... - -- end architecture aaa; - -- package yyy; - -- entity bbb; - */ - - current->name=qcs; - Entry *copy=new Entry(*current); - current->reset(); - addSubEntry(current_root,copy); // insert into entry list with mapLibPackage() - } - else if (current->spec==VhdlDocGen::ARCHITECTURE) - { - //current->name+=qcs.lower(); - current->name.prepend(qcs+"::"); - - //if (lastEntity) - //{ - // inherit private inheritance relation between entity and architecture - //if (!VhdlDocGen::foundInsertedComponent(current->name,lastEntity)) - //{ - // BaseInfo *bb=new BaseInfo(current->name,Private,Normal); - // lastEntity->extends->append(bb); - //} - //} - - } - else if (current->spec==VhdlDocGen::PACKAGE_BODY) - { - current->name+=qcs; - } - else - { - current->name+=qcs; - } - if (!(current->spec==VhdlDocGen::USE || current->spec==VhdlDocGen::LIBRARY)) - newEntry(); - - BEGIN(Start); -} - -<FindFuncName>{FUNCNAME} { // found name of a process|function|procedure - lineCount(); - - addText(yytext,yyleng); - BEGIN(ParseType); -} - -<FindTypeName>{NAME}{BR}* { - lineCount(); - current->name=QCString(yytext); - BEGIN(ParseType); -} - - -<ParseType>("is"){BR}+("protected"){BR}+("body") {lineCount(); BEGIN(Start); } - -<ParseType>("is"){BR}+("protected"){BR}+ { - lineCount(); - current->section=Entry::VARIABLE_SEC; - current->spec=VhdlDocGen::TYPE; - current->type="protected"; - newEntry(); - BEGIN(Start); -} - - - - -<ParseType>("is"){BR}*("record") { // find record - lineCount(); - if (isFunc) - { - BEGIN(Start); - } - - genPort=2; - current->section=Entry::VARIABLE_SEC; - current->spec=VhdlDocGen::RECORD; - addText(yytext,yyleng); - newEntry(); // adds the record to the last compound - BEGIN(ParseRecord); -} - -<ParseRecord>{BR}* { - lineCount(); - } - -<ParseRecord>("end"){BR}*("record"){BR}*{LETTER}*{BR}*[;]|("end"){BR}*("units"){BR}*[;] { - lineCount(); - genPort=0; - bufferClear(); - BEGIN(Start); -} - -<ParseRecord>[a-z_A-Z0-9][^\n;]*";"({B}*{COMMENT})* { // parse record body - lineCount(); - QCString comment; - QCString zz(yytext); - VhdlDocGen::deleteAllChars(zz,';'); //delete ; in unit construct - if (zz.contains("--!")) - { - QStringList ql=QStringList::split("--!",zz,FALSE); - comment = ql[1].utf8(); - zz = ql[0].utf8(); - } - else if (zz.contains("--")) - { - QStringList ql=QStringList::split("--",zz,FALSE); - zz = ql[0].utf8(); - } - initEntry(current); - addSignals(zz,yyLineNr,current,comment); - addText(yytext,yyleng); - BEGIN(ParseRecord); -} - -<ParseType>{BR}+("is"){BR}+|{BR}+("is"){B}*"--" { // found a new function in an architecture ? - addText(yytext,yyleng); - lineCount(); - QCString ttt; - bool bb=TRUE; - getBufText(ttt,0); - if (ttt.contains("--")) - { - unput('-');unput('-'); - VhdlDocGen::deleteCharRev(ttt,'-'); - VhdlDocGen::deleteCharRev(ttt,'-'); - } - if (ttt.contains('(') != ttt.contains(')')) - { - bb=FALSE; - } - bool ss = VhdlDocGen::isFunctionProto(ttt); - //printf("VhdlDocGen::isFunctionProto(%s)=%d\n",ttt.data(),ss); - if (ss && bb) - { - bufferClear(); - addText(ttt.data(),ttt.length()); - functionEntry=0; - //eFuncBody=new Entry; - ::parseFunctionProto(); - } - bufferClear(); - BEGIN(ParseType); -} - - -<ParseType>[^;()\t ] { - lineCount(); - addText(yytext,yyleng); - BEGIN(ParseType); -} - -<ParseType>{BRACEOPEN} { - lineCount(); - bropen++; - addText(yytext,yyleng); - BEGIN(ParseType); -} - -<ParseType>{BRACECLOSE} { - lineCount(); - bropen--; - addText(yytext,yyleng); - if (bropen==0 && scantype==2) // process - { - ::parseProcessProto(); - BEGIN(ParseProcess); - } // if - else - { - BEGIN(ParseType); - } -} - - -<ParseType>{ENDE}|{ENDFUNC} { // found end of function|process - QRegExp regg("[\\s;]"); - lineCount(); - QCString tt(yytext); - tt=tt.lower(); - QStringList ql=QStringList::split(regg,tt,FALSE); - int index=ql.findIndex(QCString("if"))+1; - index+=ql.findIndex(QCString("case"))+1; - index+=ql.findIndex(QCString("loop"))+1; - index+=ql.findIndex(QCString("generate"))+1; - bufferClear(); - if (index==0) - { - if (isFunc) - { - Entry* pFunc=getEntryAtLine(current_root,iFuncLine); - if (pFunc && pFunc->section==Entry::FUNCTION_SEC) - { - pFunc->endBodyLine=yyLineNr; - } - isFunc=0; - BEGIN(Start); - } - } -} - -<ParseFunc>[^;()] { - // eat process body - lineCount(); - BEGIN(ParseFunc); - } - -<ParseFunc>{ENDE3} { - QRegExp regg("[\\s;]"); - lineCount(); - QCString tt(yytext); - tt=tt.lower(); - QStringList ql=QStringList::split(regg,tt,FALSE); - int index=ql.findIndex(QCString("if"))+1; - index+=ql.findIndex(QCString("case"))+1; - index+=ql.findIndex(QCString("loop"))+1; - index+=ql.findIndex(QCString("generate"))+1; - bufferClear(); - if (index==0 && isFunc) - { - Entry* pFunc=getEntryAtLine(current_root,iFuncLine); - if (pFunc && pFunc->section==Entry::FUNCTION_SEC) - { - pFunc->endBodyLine=yyLineNr; - } - isFunc=0; - BEGIN(Start); - } -} - -<ParseType>";" { - lineCount(); - addText(yytext,yyleng); - if (bropen==0 && !(isFunc==1 && isBody==1) ) - { - if (isFunc) - { - parseFunctionProto(); - bufferClear(); - if (lastCompound && lastCompound->spec==VhdlDocGen::PACKAGE) - { - isFunc=0; - BEGIN(Start); - } - else - { - BEGIN(ParseFunc); - } - }//if - else - { - QCString qcs; - getBufText(qcs,0); - qcs=qcs.stripWhiteSpace(); - current->section=Entry::VARIABLE_SEC; - current->type+=qcs.data(); - - if ((current->spec==VhdlDocGen::SIGNAL || - current->spec==VhdlDocGen::CONSTANT || - current->spec==VhdlDocGen::TYPE || - current->spec==VhdlDocGen::SUBTYPE || - current->spec==VhdlDocGen::SHAREDVARIABLE - ) && - qcs.stripPrefix(",")) - { - QList<QCString> ql; - ql.setAutoDelete(TRUE); - QCString buffer; - if (current->spec==VhdlDocGen::SUBTYPE || - current->spec==VhdlDocGen::TYPE - ) - { - VhdlDocGen::getSigTypeName(ql,qcs.data(),buffer); - } - else - { - VhdlDocGen::getSigName(ql,qcs.data(),buffer); - } - QCString doc = current->doc; - QCString brief = current->brief; - if (ql.count()>0) - { - for (uint j=1;j<ql.count();j++) - { - Entry *ppt = new Entry; - initEntry(ppt); - ppt->type += ql.at(0)->data(); - ppt->section = Entry::VARIABLE_SEC; - ppt->spec = current->spec; - ppt->name += ql.at(j)->data(); - ppt->bodyLine = yyLineNr; - ppt->startLine = yyLineNr; - ppt->brief = brief; - ppt->doc = doc; - if (lastCompound) - { - lastCompound->addSubEntry(ppt); - } - else - { - current->addSubEntry(ppt); - } - } - current->type=ql.at(0)->data(); - ql.clear(); - } - } - if (lastCompound) - { - lastCompound->addSubEntry(current); - current = new Entry; - initEntry(current); - } - else - { - newEntry(); - } - isFunc=0; - bufferClear(); - BEGIN(Start); - } - } - else - { - BEGIN(ParseType); - } -} - -<ParseType>{BR}* { - lineCount(); - addText(yytext,yyleng); - BEGIN(ParseType); -} - -<FindEntityName>{NAME} { // found name of an entity/architecture/package - lineCount(); - QCString qcs(yytext); - qcs=qcs.stripWhiteSpace(); - qcs=qcs.lower(); - if (qcs=="body") // found package body - { - current->spec=VhdlDocGen::PACKAGE_BODY; - current->section=Entry::CLASS_SEC; - current->protection=Protected; - current->name+=QCString("_"); - isBody=1; - BEGIN(FindName); - } - else if (scantype==1) // found a component - { - QCString qq(yytext); - qq=qq.stripWhiteSpace(); - //qq=qq.lower(); - - current->name=qq; - qq=qq.lower(); - if (lastCompound) - { - if (lastCompound->spec==VhdlDocGen::PACKAGE) - { - if (!VhdlDocGen::foundInsertedComponent(qq,lastCompound)) - { - BaseInfo *bb=new BaseInfo(qq,Private,Normal); - lastCompound->extends->append(bb); - } - } - - lastCompound->addSubEntry(current); - current = new Entry; - initEntry(current); - } - else - { - newEntry(); - } - BEGIN(Start); - } - else - { - QCString qq(yytext); - qq=qq.stripWhiteSpace(); - current->name=qq; - newEntry(); - //QCString qreal=QCString(yytext); - BEGIN(Start); - } -} - -<Start>{B}*("generic"|"port"){BR}*[(]+ { // found generic|port in entity - QCString genp(yyleng+1); - deleteSpecChars(yytext,genp.data()); - VhdlDocGen::deleteCharRev(genp,'('); - - if (qstricmp(genp.data(),"port" )==0) - { - genPort=1; - } - else - { - genPort=0; - } - - bropen=1; - bufferClear(); - lineCount(); - BEGIN(FindSigName); -} - -<FindSigName>{BRACECLOSE} { - lineCount(); - bropen--; - addText(yytext,yyleng); - if (bropen==0) - { - bufferClear(); - BEGIN(Start); - } - else - { - BEGIN(FindSigName); - } -} - -<FindSigName>{LABELID} { // found signals in entity - QCString line(yytext); - - // note that line can be something like: - // "var1, var2, var3 : in std_logic_vector(8 downto 0); --! Some comment" - - // but also - // "var4 --! Some comment - // );" - // which marks the end of a port - - // and also - // "-- Some comment - // var1 : in std_logic;" - - //printf("--> labelid='%s'\n",line.data()); - QStringList ql; - QCString comment; - int openCount=line.contains('('); - int closeCount=line.contains(')'); - int semi = line.find(';'); - int pos = line.find("--"); - int pos1 = line.find("--!"); - if (pos!=-1 && pos<pos1) // strip normal comment before special one - { - line = line.remove(pos,pos1-pos); - } - //printf("=> signal: line='%s'\n",line.data()); - if (semi!=-1 && pos!=-1) - { - int eol = line.findRev('\n'); - //printf("pos=%d eol=%d\n",pos,eol); - if (eol>=pos+2) - { - QRegExp re("\\n[\\s]*--!"); // comment continuation - comment=line.mid(pos+2,eol-pos-2); - //printf("Comment: '%s'\n",comment.data()); - int p,l; - while ((p=re.match(comment,0,&l))!=-1) - { - comment.remove(p,l); - } - line=line.left(pos)+line.right(line.length()-eol); - } - else - { - comment=line.mid(pos+2); - line=line.left(pos); - } - comment.stripWhiteSpace(); - // must subtract "(" and ")" in comments because they are used for determining the - // end of a port/generic construct - openCount-=comment.contains('('); - closeCount-=comment.contains(')'); - if (!comment.stripPrefix("!")) // not a special comment - { - comment.resize(0); - } - } - else - { - //printf("no ; or --: pos=%d semi=%d\n",pos,semi); - } - int diff=openCount-closeCount; - if (diff<0) - { - VhdlDocGen::deleteCharRev(line,')'); - } - - if (scantype!=1) // not a component - { - addText(yytext,yyleng); - addSignals(line,yyLineNr,lastEntity,comment); - } - - lineCount(); - - if ((bropen+openCount-closeCount)==0) - { - bufferClear(); - BEGIN(Start); - } -} - - -<FindSigName>{BRACEOPEN} { - lineCount(); - bropen++; - addText(yytext,yyleng); -} - - -<FindSigName>{CR} { - lineCount(); - addText(yytext,yyleng); - //BEGIN(FindSigName); -} - - -<*>^{B}*("for ")[^;]* { - //printf("\n found for[%s] [%d]",yytext,yyLineNr); - lineCount(); -} - -<*>{DIGITS} { // found digit - addText(yytext,yyleng); - lineCount(); -} - -<*>{STRING_LITERAL} { - // Make sure string literals get transfered to the output - // We have to match these because the comment characters (--) - // can exist inside a string literal. - // We shouldn't have to call lineCount because newlines - // are not allowed inside string literals - addText(yytext,yyleng); -} - - /* -<*>{BR}*"--!"{B}*"@}" { // end group - if (current) - { - Entry *pg=new Entry; - addSubEntry(current,pg); - pg->startLine=yyLineNr; - pg->name="endgroup"; - } - lineCount(); -} - -<*>{BR}*"--!"{B}*"@{" { // start group - if (current) - { - Entry *pg=new Entry; - addSubEntry(current,pg); - pg->startLine=yyLineNr; - pg->name="startgroup"; - } - lineCount(); -} - */ - -<*>{BR}*"--!"[^{}\n][^\n]*\n/{B}*"--!" { // multi line comment - if (iDocLine==-1) iDocLine=yyLineNr; - // signal clk :in std_logic; --!@brief global clock - // --!@brief global reset - // signal reset:in std_logic; - // these two comments are detected as a multi line comment - QCString qc(yytext); - int len=qc.contains('\n')+yyLineNr-1; - - if (YY_START!=Comment) // Start of the comment block - { - bufferClear(); - iTextCounter=0; - startComment=yyLineNr; - g_lastCommentContext=YY_START; - } - - Entry* pTemp=getEntryAtLine(current_root,len); - if (pTemp) - { // found one line comment, add it to the entry on this line - pTemp->briefLine=yyLineNr; - pTemp->brief+=yytext; - VhdlDocGen::prepareComment(pTemp->brief); - } - else - { - addText(yytext,yyleng); - } - lineCount(); - BEGIN(Comment); -} - -<Comment>^{B}*"--!"[^\n]* { - if (iDocLine==-1) iDocLine=yyLineNr; - addText(yytext,yyleng); - lineCount(); -} - -<Comment>.|\n { - // found end of comment block - QCString qcs; - getBufText(qcs,iTextCounter); - VhdlDocGen::prepareComment(qcs); - int ii =qcs.find("\\code"); - if (ii>0) - { - iCodeLen=num_chars; - - gBlock.reset(); - int len=qcs.length(); - QCString name=qcs.right(len-ii); - name=VhdlDocGen::getIndexWord(name.data(),1); - if (!name) - gBlock.name="misc"+ VhdlDocGen::getRecordNumber(); - else - gBlock.name=name; - qcs=qcs.left(ii); - gBlock.startLine=yyLineNr+1; - gBlock.bodyLine=yyLineNr+1; - gBlock.brief+=qcs; - iTextCounter=0; - } - - if (ii==-1) - { - handleCommentBlock(qcs,FALSE); - } - bufferClear(); - unput(*yytext); - BEGIN(g_lastCommentContext); -} - -<*>"--!"[^\n]* { // one line comment - if (iDocLine==-1) iDocLine=yyLineNr; - QCString qcs(yytext); - int j=qcs.find("--!"); - qcs=qcs.right(qcs.length()-3-j); - bool isEndCode=qcs.contains("\\endcode"); - - if (isEndCode) - makeInline(); - //printf("--> handleCommentBlock line %d\n",yyLineNr); - Entry* pTemp=getEntryAtLine(current_root,yyLineNr); - - if (!isEndCode) - { - if (pTemp) - { - pTemp->briefLine=yyLineNr; - pTemp->brief+=qcs; - iDocLine=-1; - } - else - { - handleCommentBlock(qcs,TRUE); - } - } - - bufferClear(); -}// one line - - -<*>{COMMENT} { -} - -<*>\n { - lineCount(); - addText(yytext,yyleng); - // printf("\n new-line [%d]",yyLineNr); - BEGIN(Start); -} - -<*>{NAME} { - addText(yytext,yyleng); - lineCount(); -} - -<*>{B}* { - addText(yytext,yyleng); - lineCount(); -} - -<*>. { - addText(yytext,yyleng); - lineCount(); -} - - -%% - -static void initEntry(Entry *e) -{ - e->fileName = yyFileName; - e->lang = SrcLangExt_VHDL; - initGroupInfo(e); -} - -static void newEntry() -{ - // Add only enties/architectures/packages to root - // and signals to classes where they were found - // ENTITY dlatch_93 IS -- VHDL'93-Syntax !!! - // PORT (d, clk : IN bit; - // q, qbar : OUT bit); - // GROUP path IS (SIGNAL, SIGNAL); - // GROUP d_to_q : path (d, q); - // ATTRIBUTE propagation : time; - // END dlatch_93; - - if (current->spec==VhdlDocGen::ENTITY || - current->spec==VhdlDocGen::PACKAGE || - current->spec==VhdlDocGen::ARCHITECTURE || - current->spec==VhdlDocGen::PACKAGE_BODY) - { - current_root->addSubEntry(current); - } - else - { - if (lastCompound) - { - lastCompound->addSubEntry(current); - } - else - { - if (lastEntity) - { - lastEntity->addSubEntry(current); - } - else - { - current_root->addSubEntry(current); // should not happen! - } - } - } - previous = current; - current = new Entry ; - initEntry(current); -} - -static void handleCommentBlock(const QCString &doc,bool brief) -{ - int position=0; - bool needsEntry=FALSE; - Protection protection=Public; - int lineNr = iDocLine; - if (brief) - current->briefLine = iDocLine; - else - current->docLine = iDocLine; - - //printf("parseCommentBlock %p [%s]\n",current,doc.data()); - while (parseCommentBlock( - g_thisParser, - current, - doc, // text - yyFileName, // file - lineNr, // line of block start - brief, - docBlockAutoBrief, - FALSE, - protection, - position, - needsEntry - ) - ) - { - //printf("parseCommentBlock position=%d [%s]\n",position,doc.data()+position); - if (needsEntry) newEntry(); - } - if (needsEntry) - { - newEntry(); - } - - if (docBlockTerm) - { - unput(docBlockTerm); - docBlockTerm=0; - } - iDocLine=-1; -} - -#if 0 -/*! - * adds grouping to the entries - */ -static void mergeGrouping(const Entry* ce,int) -{ - EntryListIterator eli(*ce->children()); - Entry *rt; - for (;(rt=eli.current());++eli) - { - if (rt->section==Entry::GROUPDOC_SEC) - { - if (openGroups) - { - QCString tt=(QCString)qrl.last(); - if (!tt.isEmpty()) - { - rt->groups->append(new Grouping(tt.data(),Grouping::GROUPING_LOWEST)); - } - } - qrl.append(rt->name); - } - - if ((strcmp(rt->name.data(),"endgroup")==0) && !qrl.isEmpty()) - { - qrl.remove((QCString)qrl.last()); - openGroups--; - } - - if ((strcmp(rt->name.data(),"startgroup")==0)) - { - openGroups++; - } - - if (rt->section!=Entry::GROUPDOC_SEC && openGroups && !qrl.isEmpty()) - { - rt->groups->append(new Grouping(qrl.last().data(),Grouping::GROUPING_LOWEST)); - } - - mergeGrouping(rt,openGroups); - } -} -#endif - -/* - * adds the library|use statements to the next class (entity|package|architecture|package body - * library ieee - * entity xxx - * ..... - * library - * package - * enity zzz - * ..... - * and so on.. - */ - -static void mapLibPackage(const Entry* ce) -{ - Entry *lastComp=0; - while (TRUE) - { - bool found = FALSE; - Entry *rt=0; - //const QList<Entry> *epp=ce->children(); - EntryListIterator eli(*ce->children()); - EntryListIterator eli1=eli; - for (;(rt=eli.current()),eli1=eli;++eli) - { - if (rt->spec==VhdlDocGen::LIBRARY || rt->spec==VhdlDocGen::USE) - // top level library or use statement - { - Entry *temp=0; - for (;(temp=eli1.current());++eli1) // find next entity - { - if (temp->spec==VhdlDocGen::ENTITY || temp->spec==VhdlDocGen::PACKAGE || temp->spec==VhdlDocGen::ARCHITECTURE || temp->spec==VhdlDocGen::PACKAGE_BODY) - { - Entry *ee=new Entry(*rt); //append a copy to entries sublist - temp->addSubEntry(ee); - found=TRUE; - rt->spec=-1; //nullify entry - rt->section=0; - lastComp=temp; - break; - } - }//for - if (lastComp && rt->spec) - { - Entry *ee=new Entry(*rt); //append a copy to entries sublist - lastComp->addSubEntry(ee); - found=TRUE; - rt->spec=-1; //nullify entry - rt->section=0; - } - }//if - }//for - if (!found) // nothing left to do - { - return; - } - }//while -}//MapLib - -#if 0 -/*! - * merges a brief descriptions to the next entry - */ -void mergeBrief(const Entry* ce) -{ - EntryListIterator eli(*ce->children()); - Entry *rt; - for (;(rt=eli.current());++eli) - { - - if (found && (!eMerge.brief.isEmpty() || !eMerge.doc.isEmpty())) - { - rt->doc+=eMerge.doc.data(); - rt->docLine=eMerge.docLine; - rt->brief+=eMerge.brief.data(); - rt->briefLine=eMerge.briefLine; - found=FALSE; - } - - if ((strcmp(rt->name.data(),"string")==0)) - { - eMerge.reset(); - eMerge.doc+=rt->doc.data(); - eMerge.docLine=rt->docLine; - eMerge.brief+=rt->brief.data(); - eMerge.briefLine=rt->briefLine; - - found=TRUE; - } - MergeBrief(rt); - } -} -#endif - - - -void vhdlscanFreeScanner() -{ -#if defined(YY_FLEX_SUBMINOR_VERSION) - if (g_lexInit) - { - vhdlscannerYYlex_destroy(); - } - - if (g_buf) - { - free(g_buf); - } - - g_buf=0; -#endif - -} - -void VHDLLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root, - bool,QStrList&) -{ - inputFile.setName(fileName); - //uint jfile=inputFile.size(); - ::parserInit(); - yyFileName=QCString(fileName); - groupEnterFile(fileName,yyLineNr); - g_thisParser = this; - g_inputFromFile = FALSE; - inputPosition = 0; - assert(root!=0); - - inputString=fileBuf; - inputLen=strlen(fileBuf); - current_root = root; - global_root = root; - current=new Entry; - initEntry(current); - //current_root->name=QCString("XXX"); // dummy name for root - if (!inputFile.open(IO_ReadOnly)) - { - err("\n\n could not open file: %s !!\n\n",yyFileName.data()); - return ; - } - - if (g_lexInit) - { - vhdlscannerYYrestart(vhdlscannerYYin); - unput(' '); - BEGIN(Start); - } - vhdlscannerYYlex(); - g_lexInit=TRUE; - - free(g_buf); - g_buf=0; - - delete current; - current=0; - - groupLeaveFile(yyFileName,yyLineNr); - inputFile.close(); - - //mergeBrief(current_root); - //mergeGrouping(current_root,0); - mapLibPackage(current_root); -} - - -void VHDLLanguageScanner::parsePrototype(const char *text) -{ - // will be called when a \fn command is found in a comment block - - QCString ss,ret; - bool sem=FALSE; - bool func=FALSE; - QList<Argument> qs; - qs.setAutoDelete(TRUE); - VhdlDocGen::parseFuncProto(text,qs,ss,ret,TRUE); - int count=qs.count(); - if (qstricmp(ret.data(),"function")==0) - { - func=TRUE; - } - if (count<1 && !func) - { - return; - } - Entry *pp = new Entry; - initEntry(pp); - pp->name=ss.stripWhiteSpace(); - pp->args+='('; - for (int j=0;j<count;j++) - { - if (sem) - { - pp->args+=','; - } - - Argument *ars=(Argument*)(qs.at(j)); - Argument *arg=new Argument; - arg->attrib = ars->attrib; - arg->name = ars->name; - arg->type = ars->type; - pp->args+=ars->name.data(); - pp->args+=" "; - pp->args+=ars->type.data(); - pp->argList->append(arg); - sem=TRUE; - } - pp->args+=')'; - - if (!ret.isEmpty()) - pp->spec=VhdlDocGen::FUNCTION; - else - pp->spec=VhdlDocGen::PROCEDURE; - - if (pp->section == Entry::MEMBERDOC_SEC && pp->args.isEmpty()) - pp->section = Entry::VARIABLEDOC_SEC; - - pp->type=ret; - current_root->addSubEntry(pp); -} - -void VHDLLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf, - const char *scopeName, - const QCString &input, - SrcLangExt lang, - bool isExampleBlock, - const char *exampleName, - FileDef *fileDef, - int startLine, - int endLine, - bool inlineFragment, - MemberDef *memberDef, - bool showLineNumbers, - Definition *searchCtx, - bool collectXRefs - ) -{ - (void)lang; - ::parseVhdlCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName, - fileDef,startLine,endLine,inlineFragment,memberDef, - showLineNumbers,searchCtx,collectXRefs); -} - |