Commit f138b8f3 authored by Oleg Batrashev's avatar Oleg Batrashev
Browse files

Prototype scan for function, does not yet catch parameter types.

parent 3e8a7fbd
Loading
Loading
Loading
Loading
+35 −2
Original line number Original line Diff line number Diff line
@@ -187,6 +187,7 @@ static InterfaceType ifType = IF_NONE;
static bool              functionLine = FALSE;
static bool              functionLine = FALSE;


static char              stringStartSymbol; // single or double quote
static char              stringStartSymbol; // single or double quote
static bool 		 parsingPrototype = FALSE; // see parsePrototype()


//! Accumulated modifiers of current statement, eg variable declaration.
//! Accumulated modifiers of current statement, eg variable declaration.
static SymbolModifiers currentModifiers;
static SymbolModifiers currentModifiers;
@@ -307,6 +308,12 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
%x	EndDoc
%x	EndDoc


%x      BlockData
%x      BlockData

/** prototype parsing */
%x  	Prototype
%x  	PrototypeSubprog
%x	PrototypeArgs

%%
%%


 /*-----------------------------------------------------------------------------------*/
 /*-----------------------------------------------------------------------------------*/
@@ -1099,6 +1106,23 @@ private {
                                          yy_pop_state();                                          
                                          yy_pop_state();                                          
  					}
  					}


 /*-----Prototype parsing -------------------------------------------------------------------------*/
<Prototype>{BS}{SUBPROG}{BS_}		{
					  BEGIN(PrototypeSubprog);
					}
<PrototypeSubprog>{ID}{BS}		{ current->name = yytext;
					  current->name.stripWhiteSpace();
					  BEGIN(PrototypeArgs);
					 }
<PrototypeArgs>{
"("|")"|","|{BS_}			{ current->args += yytext; }
{ID}					{ current->args += yytext; 
					  Argument *a = new Argument;
					  a->name = yytext;
					  current->argList->append(a);
					}
}

 /*------------------------------------------------------------------------------------------------*/
 /*------------------------------------------------------------------------------------------------*/


<*>"\n"                                 {
<*>"\n"                                 {
@@ -1111,7 +1135,10 @@ private {
 /*---- error: EOF in wrong state --------------------------------------------------------------------*/
 /*---- error: EOF in wrong state --------------------------------------------------------------------*/


<*><<EOF>>                              {
<*><<EOF>>                              {
                                          if ( include_stack_ptr <= 0 ) {
					  if (parsingPrototype) {
					    yyterminate();

					  } else if ( include_stack_ptr <= 0 ) {
                                            if (YY_START!=INITIAL && YY_START!=Start) {
                                            if (YY_START!=INITIAL && YY_START!=Start) {
                                              DBG_CTX((stderr,"==== Error: EOF reached in wrong state (end missing)"));
                                              DBG_CTX((stderr,"==== Error: EOF reached in wrong state (end missing)"));
                                              scanner_abort();
                                              scanner_abort();
@@ -2304,7 +2331,13 @@ void FortranLanguageScanner::resetCodeParserState()


void FortranLanguageScanner::parsePrototype(const char *text)
void FortranLanguageScanner::parsePrototype(const char *text)
{
{
  current->name = QCString(text).lower();
  QCString buffer = QCString(text).lower();
  pushBuffer(buffer);
  parsingPrototype = TRUE;
  BEGIN(Prototype);
  fscanYYlex();
  parsingPrototype = FALSE;
  popBuffer();
}
}


static void scanner_abort() 
static void scanner_abort()