Commit 38059b8b authored by Dimitri van Heesch's avatar Dimitri van Heesch
Browse files

Merge pull request #7 from ogbash/experimental/prototype

Fortran: parse prototype in out-of-place documentation
parents 9bfa0dd1 be4c107a
Loading
Loading
Loading
Loading
+37 −2
Original line number Diff line number Diff line
@@ -187,6 +187,7 @@ static InterfaceType ifType = IF_NONE;
static bool              functionLine = FALSE;

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

//! Accumulated modifiers of current statement, eg variable declaration.
static SymbolModifiers currentModifiers;
@@ -265,6 +266,7 @@ ATTR_STMT {ATTR_SPEC}|DIMENSION|{ACCESS_SPEC}

CONTAINS  CONTAINS
PREFIX    (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTAL)?
SCOPENAME ({ID}{BS}"::"{BS})*

%option noyywrap
%option stack
@@ -307,6 +309,12 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA
%x	EndDoc

%x      BlockData

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

%%

 /*-----------------------------------------------------------------------------------*/
@@ -1099,6 +1107,24 @@ private {
                                          yy_pop_state();                                          
  					}

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

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

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

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

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

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

static void scanner_abort()