Blame src/pyscanner.l

Packit 1c1d7e
/******************************************************************************
Packit 1c1d7e
 *
Packit 1c1d7e
 * 
Packit 1c1d7e
 *
Packit 1c1d7e
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Permission to use, copy, modify, and distribute this software and its
Packit 1c1d7e
 * documentation under the terms of the GNU General Public License is hereby 
Packit 1c1d7e
 * granted. No representations are made about the suitability of this software 
Packit 1c1d7e
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit 1c1d7e
 * See the GNU General Public License for more details.
Packit 1c1d7e
 *
Packit 1c1d7e
 * Documents produced by Doxygen are derivative works derived from the
Packit 1c1d7e
 * input used in their production; they are not affected by this license.
Packit 1c1d7e
 *
Packit 1c1d7e
 */
Packit 1c1d7e
/*  This code is based on the work done by the MoxyPyDoxy team
Packit 1c1d7e
 *  (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada)
Packit 1c1d7e
 *  in Spring 2005 as part of CS 179E: Compiler Design Project
Packit 1c1d7e
 *  at the University of California, Riverside; the course was
Packit 1c1d7e
 *  taught by Peter H. Froehlich <phf@acm.org>.
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
%option never-interactive
Packit 1c1d7e
%option prefix="pyscannerYY"
Packit 1c1d7e
Packit 1c1d7e
%{
Packit 1c1d7e
Packit 1c1d7e
/*
Packit 1c1d7e
 *	includes
Packit 1c1d7e
 */
Packit 1c1d7e
#include <stdio.h>
Packit 1c1d7e
#include <stdlib.h>
Packit 1c1d7e
#include <assert.h>
Packit 1c1d7e
#include <ctype.h>
Packit 1c1d7e
Packit 1c1d7e
#include <qarray.h>
Packit 1c1d7e
#include <qstack.h>
Packit 1c1d7e
#include <qregexp.h>
Packit 1c1d7e
#include <qfile.h>
Packit 1c1d7e
#include <qfileinfo.h>
Packit 1c1d7e
  
Packit 1c1d7e
#include "pyscanner.h"
Packit 1c1d7e
#include "entry.h"
Packit 1c1d7e
#include "message.h"
Packit 1c1d7e
#include "config.h"
Packit 1c1d7e
#include "doxygen.h"
Packit 1c1d7e
#include "util.h"
Packit 1c1d7e
#include "defargs.h"
Packit 1c1d7e
#include "language.h"
Packit 1c1d7e
#include "commentscan.h"
Packit 1c1d7e
#include "pycode.h"
Packit 1c1d7e
#include "arguments.h"
Packit 1c1d7e
Packit 1c1d7e
// Toggle for some debugging info
Packit 1c1d7e
//#define DBG_CTX(x) fprintf x
Packit 1c1d7e
#define DBG_CTX(x) do { } while(0)
Packit 1c1d7e
Packit 1c1d7e
#define YY_NO_INPUT 1
Packit 1c1d7e
#define YY_NO_UNISTD_H 1
Packit 1c1d7e
Packit 1c1d7e
/* -----------------------------------------------------------------
Packit 1c1d7e
 *
Packit 1c1d7e
 *	statics
Packit 1c1d7e
 */
Packit 1c1d7e
Packit 1c1d7e
  
Packit 1c1d7e
static ParserInterface *g_thisParser;
Packit 1c1d7e
static const char *     inputString;
Packit 1c1d7e
static int		inputPosition;
Packit 1c1d7e
static QFile            inputFile;
Packit 1c1d7e
Packit 1c1d7e
static Protection	protection;
Packit 1c1d7e
Packit 1c1d7e
static Entry*		current_root = 0 ;
Packit 1c1d7e
static Entry*		current      = 0 ;
Packit 1c1d7e
static Entry*		previous     = 0 ;
Packit 1c1d7e
static Entry*		bodyEntry    = 0 ;
Packit 1c1d7e
static int		yyLineNr     = 1 ;
Packit 1c1d7e
static QCString		yyFileName;
Packit 1c1d7e
static MethodTypes 	mtype;
Packit 1c1d7e
static bool    		gstat;
Packit 1c1d7e
static Specifier 	virt;
Packit 1c1d7e
Packit 1c1d7e
static int              docBlockContext;
Packit 1c1d7e
static QCString         docBlock;
Packit 1c1d7e
static bool             docBlockInBody;
Packit 1c1d7e
static bool             docBlockJavaStyle;
Packit 1c1d7e
static bool             docBrief;
Packit 1c1d7e
static bool             docBlockSpecial;
Packit 1c1d7e
Packit 1c1d7e
static bool             g_doubleQuote;
Packit 1c1d7e
static bool             g_specialBlock;
Packit 1c1d7e
static int              g_stringContext;
Packit 1c1d7e
static QGString *       g_copyString;
Packit 1c1d7e
static int              g_indent = 0;
Packit 1c1d7e
static int              g_curIndent = 0;
Packit 1c1d7e
Packit 1c1d7e
static QDict<QCString>  g_packageNameCache(257);
Packit 1c1d7e
Packit 1c1d7e
static char             g_atomStart;
Packit 1c1d7e
static char             g_atomEnd;
Packit 1c1d7e
static int              g_atomCount;
Packit 1c1d7e
Packit 1c1d7e
//static bool             g_insideConstructor;
Packit 1c1d7e
Packit 1c1d7e
static QCString         g_moduleScope;
Packit 1c1d7e
static QCString         g_packageName;
Packit 1c1d7e
Packit 1c1d7e
//static bool             g_hideClassDocs;
Packit 1c1d7e
Packit 1c1d7e
static QCString         g_defVal;
Packit 1c1d7e
static int              g_braceCount;
Packit 1c1d7e
Packit 1c1d7e
static bool             g_lexInit = FALSE;
Packit 1c1d7e
static bool             g_packageCommentAllowed;
Packit 1c1d7e
Packit 1c1d7e
static bool             g_start_init = FALSE;
Packit 1c1d7e
static int              g_search_count = 0;
Packit 1c1d7e
Packit 1c1d7e
//-----------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static void initParser()
Packit 1c1d7e
{
Packit 1c1d7e
  protection = Public;
Packit 1c1d7e
  mtype = Method;
Packit 1c1d7e
  gstat = FALSE;
Packit 1c1d7e
  virt = Normal;
Packit 1c1d7e
  previous = 0;
Packit 1c1d7e
  g_packageCommentAllowed = TRUE;
Packit 1c1d7e
  g_packageNameCache.setAutoDelete(TRUE);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void initEntry()
Packit 1c1d7e
{
Packit 1c1d7e
  //current->python = TRUE;
Packit 1c1d7e
  current->protection = protection ;
Packit 1c1d7e
  current->mtype      = mtype;
Packit 1c1d7e
  current->virt       = virt;
Packit 1c1d7e
  current->stat       = gstat;
Packit 1c1d7e
  current->lang       = SrcLangExt_Python; 
Packit 1c1d7e
  current->setParent(current_root);
Packit 1c1d7e
  initGroupInfo(current);
Packit 1c1d7e
  gstat = FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void newEntry()
Packit 1c1d7e
{
Packit 1c1d7e
  previous = current;
Packit 1c1d7e
  current_root->addSubEntry(current);
Packit 1c1d7e
  current = new Entry ;
Packit 1c1d7e
  initEntry();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void newVariable()
Packit 1c1d7e
{
Packit 1c1d7e
  if (!current->name.isEmpty() && current->name.at(0)=='_') // mark as private
Packit 1c1d7e
  {
Packit 1c1d7e
    current->protection=Private;
Packit 1c1d7e
  }
Packit 1c1d7e
  if (current_root->section&Entry::COMPOUND_MASK) // mark as class variable
Packit 1c1d7e
  {
Packit 1c1d7e
    current->stat = TRUE;
Packit 1c1d7e
  }
Packit 1c1d7e
  newEntry();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void newFunction()
Packit 1c1d7e
{
Packit 1c1d7e
  if (current->name.left(2)=="__" && current->name.right(2)=="__")
Packit 1c1d7e
  {
Packit 1c1d7e
    // special method name, see
Packit 1c1d7e
    // http://docs.python.org/ref/specialnames.html
Packit 1c1d7e
    current->protection=Public;
Packit 1c1d7e
  }
Packit 1c1d7e
  else if (current->name.at(0)=='_')
Packit 1c1d7e
  {
Packit 1c1d7e
    current->protection=Private;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static inline int computeIndent(const char *s)
Packit 1c1d7e
{
Packit 1c1d7e
  int col=0;
Packit 1c1d7e
  static int tabSize=Config_getInt(TAB_SIZE);
Packit 1c1d7e
  const char *p=s;
Packit 1c1d7e
  char c;
Packit 1c1d7e
  while ((c=*p++))
Packit 1c1d7e
  {
Packit 1c1d7e
    if (c==' ') col++;
Packit 1c1d7e
    else if (c=='\t') col+=tabSize-(col%tabSize);
Packit 1c1d7e
    else break;
Packit 1c1d7e
  }
Packit 1c1d7e
  return col;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QCString findPackageScopeFromPath(const QCString &path)
Packit 1c1d7e
{
Packit 1c1d7e
  QCString *pScope = g_packageNameCache.find(path);
Packit 1c1d7e
  if (pScope)
Packit 1c1d7e
  {
Packit 1c1d7e
    return *pScope;
Packit 1c1d7e
  }
Packit 1c1d7e
  QFileInfo pf(path+"/__init__.py"); // found package initialization file
Packit 1c1d7e
  if (pf.exists())
Packit 1c1d7e
  {
Packit 1c1d7e
    int i=path.findRev('/');
Packit 1c1d7e
    if (i!=-1)
Packit 1c1d7e
    {
Packit 1c1d7e
      QCString scope = findPackageScopeFromPath(path.left(i));
Packit 1c1d7e
      if (!scope.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
	scope+="::";
Packit 1c1d7e
      }
Packit 1c1d7e
      scope+=path.mid(i+1);
Packit 1c1d7e
      g_packageNameCache.insert(path,new QCString(scope));
Packit 1c1d7e
      return scope;
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  return "";
Packit 1c1d7e
}
Packit 1c1d7e
  
Packit 1c1d7e
static QCString findPackageScope(const char *fileName)
Packit 1c1d7e
{
Packit 1c1d7e
  if (fileName==0) return "";
Packit 1c1d7e
  QFileInfo fi(fileName);
Packit 1c1d7e
  return findPackageScopeFromPath(fi.dirPath(TRUE).data());
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//-----------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
static void lineCount()
Packit 1c1d7e
{
Packit 1c1d7e
  DBG_CTX((stderr,"yyLineNr=%d\n",yyLineNr));
Packit 1c1d7e
  for (const char *p = yytext; *p; ++p)
Packit 1c1d7e
  {
Packit 1c1d7e
    yyLineNr += (*p == '\n') ;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void incLineNr()
Packit 1c1d7e
{
Packit 1c1d7e
  DBG_CTX((stderr,"yyLineNr=%d\n",yyLineNr));
Packit 1c1d7e
  yyLineNr++;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
#if 0
Packit 1c1d7e
// Appends the current-name to current-type;
Packit 1c1d7e
// Destroys current-name.
Packit 1c1d7e
// Destroys current->args and current->argList
Packit 1c1d7e
static void addType( Entry* current )
Packit 1c1d7e
{
Packit 1c1d7e
    uint tl=current->type.length();
Packit 1c1d7e
    if ( tl>0 && !current->name.isEmpty() && current->type.at(tl-1)!='.') 
Packit 1c1d7e
    {
Packit 1c1d7e
      current->type += ' ' ;
Packit 1c1d7e
    }
Packit 1c1d7e
    current->type += current->name ;
Packit 1c1d7e
    current->name.resize(0) ;
Packit 1c1d7e
    tl=current->type.length();
Packit 1c1d7e
    if ( tl>0 && !current->args.isEmpty() && current->type.at(tl-1)!='.') 
Packit 1c1d7e
    {
Packit 1c1d7e
      current->type += ' ' ;
Packit 1c1d7e
    }
Packit 1c1d7e
    current->type += current->args ;
Packit 1c1d7e
    current->args.resize(0) ;
Packit 1c1d7e
    current->argList->clear();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static QCString stripQuotes(const char *s)
Packit 1c1d7e
{
Packit 1c1d7e
  QCString name;
Packit 1c1d7e
  if (s==0 || *s==0) return name;
Packit 1c1d7e
  name=s;
Packit 1c1d7e
  if (name.at(0)=='"' && name.at(name.length()-1)=='"')
Packit 1c1d7e
  {
Packit 1c1d7e
    name=name.mid(1,name.length()-2);
Packit 1c1d7e
  }
Packit 1c1d7e
  return name;
Packit 1c1d7e
}
Packit 1c1d7e
#endif
Packit 1c1d7e
//-----------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
//-----------------------------------------------------------------
Packit 1c1d7e
static void startCommentBlock(bool brief)
Packit 1c1d7e
{
Packit 1c1d7e
  if (brief)
Packit 1c1d7e
  {
Packit 1c1d7e
    current->briefFile = yyFileName;
Packit 1c1d7e
    current->briefLine = yyLineNr;
Packit 1c1d7e
  }
Packit 1c1d7e
  else
Packit 1c1d7e
  {
Packit 1c1d7e
    current->docFile = yyFileName;
Packit 1c1d7e
    current->docLine = yyLineNr;
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
/*
Packit 1c1d7e
static void appendDocBlock() {
Packit 1c1d7e
  previous = current;
Packit 1c1d7e
  current_root->addSubEntry(current);
Packit 1c1d7e
  current = new Entry;
Packit 1c1d7e
  initEntry();
Packit 1c1d7e
}
Packit 1c1d7e
*/
Packit 1c1d7e
Packit 1c1d7e
static void handleCommentBlock(const QCString &doc,bool brief)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("handleCommentBlock(doc=[%s] brief=%d docBlockInBody=%d docBlockJavaStyle=%d\n",
Packit 1c1d7e
  //    doc.data(),brief,docBlockInBody,docBlockJavaStyle);
Packit 1c1d7e
Packit 1c1d7e
  // TODO: Fix me
Packit 1c1d7e
  docBlockInBody=FALSE;
Packit 1c1d7e
  
Packit 1c1d7e
  if (docBlockInBody && previous && !previous->doc.isEmpty())
Packit 1c1d7e
  {
Packit 1c1d7e
    previous->doc=previous->doc.stripWhiteSpace()+"\n\n";
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  int position = 0;
Packit 1c1d7e
  bool needsEntry;
Packit 1c1d7e
  int lineNr = brief ? current->briefLine : current->docLine;
Packit 1c1d7e
  while (parseCommentBlock(
Packit 1c1d7e
	g_thisParser,
Packit 1c1d7e
	(docBlockInBody && previous) ? previous : current,
Packit 1c1d7e
	doc,     // text
Packit 1c1d7e
	yyFileName, // file
Packit 1c1d7e
	lineNr,
Packit 1c1d7e
	docBlockInBody ? FALSE : brief, 
Packit 1c1d7e
    docBlockJavaStyle, // javadoc style // or FALSE,
Packit 1c1d7e
	docBlockInBody,
Packit 1c1d7e
	protection,
Packit 1c1d7e
        position,
Packit 1c1d7e
        needsEntry)
Packit 1c1d7e
     ) // need to start a new entry
Packit 1c1d7e
  {
Packit 1c1d7e
    if (needsEntry)
Packit 1c1d7e
    {
Packit 1c1d7e
      newEntry();
Packit 1c1d7e
    }
Packit 1c1d7e
  }
Packit 1c1d7e
  if (needsEntry)
Packit 1c1d7e
  {
Packit 1c1d7e
    newEntry();
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void endOfDef(int correction=0)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("endOfDef at=%d\n",yyLineNr);
Packit 1c1d7e
  if (bodyEntry)
Packit 1c1d7e
  {
Packit 1c1d7e
    bodyEntry->endBodyLine  = yyLineNr-correction;
Packit 1c1d7e
    bodyEntry = 0;
Packit 1c1d7e
  }
Packit 1c1d7e
  newEntry();
Packit 1c1d7e
  //g_insideConstructor = FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static inline void addToString(const char *s)
Packit 1c1d7e
{
Packit 1c1d7e
  if (g_copyString) (*g_copyString)+=s;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void initTriDoubleQuoteBlock()
Packit 1c1d7e
{
Packit 1c1d7e
  docBlockContext   = YY_START;
Packit 1c1d7e
  docBlockInBody    = FALSE;
Packit 1c1d7e
  docBlockJavaStyle = TRUE;
Packit 1c1d7e
  docBlockSpecial   = yytext[strlen(yytext) - 1]=='!';
Packit 1c1d7e
  docBlock.resize(0);
Packit 1c1d7e
  g_doubleQuote = TRUE;
Packit 1c1d7e
  startCommentBlock(FALSE);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void initTriSingleQuoteBlock()
Packit 1c1d7e
{
Packit 1c1d7e
  docBlockContext   = YY_START;
Packit 1c1d7e
  docBlockInBody    = FALSE;
Packit 1c1d7e
  docBlockJavaStyle = TRUE;
Packit 1c1d7e
  docBlockSpecial   = yytext[strlen(yytext) - 1]=='!';
Packit 1c1d7e
  docBlock.resize(0);
Packit 1c1d7e
  g_doubleQuote = FALSE;
Packit 1c1d7e
  startCommentBlock(FALSE);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void initSpecialBlock()
Packit 1c1d7e
{
Packit 1c1d7e
  docBlockContext   = YY_START;
Packit 1c1d7e
  docBlockInBody    = FALSE;
Packit 1c1d7e
  docBlockJavaStyle = TRUE;
Packit 1c1d7e
  docBrief = TRUE;
Packit 1c1d7e
  docBlock.resize(0);
Packit 1c1d7e
  startCommentBlock(TRUE);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void searchFoundDef()
Packit 1c1d7e
{
Packit 1c1d7e
  current->fileName  = yyFileName;
Packit 1c1d7e
  current->startLine = yyLineNr;
Packit 1c1d7e
  current->bodyLine  = yyLineNr;
Packit 1c1d7e
  current->section = Entry::FUNCTION_SEC;
Packit 1c1d7e
  current->lang = SrcLangExt_Python;
Packit 1c1d7e
  current->virt = Normal;
Packit 1c1d7e
  current->stat = gstat;
Packit 1c1d7e
  current->mtype = mtype = Method;
Packit 1c1d7e
  current->type.resize(0);
Packit 1c1d7e
  current->name.resize(0);
Packit 1c1d7e
  current->args.resize(0);
Packit 1c1d7e
  current->argList->clear();
Packit 1c1d7e
  g_packageCommentAllowed = FALSE;
Packit 1c1d7e
  gstat=FALSE;
Packit 1c1d7e
  //printf("searchFoundDef at=%d\n",yyLineNr);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
static void searchFoundClass()
Packit 1c1d7e
{
Packit 1c1d7e
  current->section = Entry::CLASS_SEC;
Packit 1c1d7e
  current->argList->clear();
Packit 1c1d7e
  current->type += "class" ;
Packit 1c1d7e
  current->fileName  = yyFileName;
Packit 1c1d7e
  current->startLine  = yyLineNr;
Packit 1c1d7e
  current->bodyLine  = yyLineNr;
Packit 1c1d7e
  g_packageCommentAllowed = FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//-----------------------------------------------------------------------------
Packit 1c1d7e
/* ----------------------------------------------------------------- */
Packit 1c1d7e
#undef	YY_INPUT
Packit 1c1d7e
#define	YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
Packit 1c1d7e
Packit 1c1d7e
static int yyread(char *buf,int max_size)
Packit 1c1d7e
{
Packit 1c1d7e
  int c=0;
Packit 1c1d7e
  while ( c < max_size && inputString[inputPosition] )
Packit 1c1d7e
  {
Packit 1c1d7e
    *buf = inputString[inputPosition++] ;
Packit 1c1d7e
    //printf("%d (%c)\n",*buf,*buf);
Packit 1c1d7e
    c++; buf++;
Packit 1c1d7e
  }
Packit 1c1d7e
  return c;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
%}
Packit 1c1d7e
Packit 1c1d7e
       /* start command character */
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
BB                [ \t]+
Packit 1c1d7e
B                 [ \t]*
Packit 1c1d7e
NEWLINE           \n
Packit 1c1d7e
BN                [ \t\n]
Packit 1c1d7e
Packit 1c1d7e
DIGIT             [0-9]
Packit 1c1d7e
Packit 1c1d7e
HEXNUMBER         "0"[xX][0-9a-fA-F]+[lL]?
Packit 1c1d7e
OCTNUMBER         "0"[0-7]+[lL]?
Packit 1c1d7e
NUMBER            {DIGIT}+[lLjJ]?
Packit 1c1d7e
INTNUMBER         {HEXNUMBER}|{OCTNUMBER}|{NUMBER}
Packit 1c1d7e
FLOATNUMBER       {DIGIT}+"."{DIGIT}+([eE][+\-]?{DIGIT}+)?[jJ]?
Packit 1c1d7e
BOOL              ("True"|"False")
Packit 1c1d7e
LETTER            [A-Za-z\x80-\xFF]
Packit 1c1d7e
NONEMPTY          [A-Za-z0-9_\x80-\xFF]
Packit 1c1d7e
EXPCHAR           [#(){}\[\],:.%/\\=`*~|&<>!;+-]
Packit 1c1d7e
NONEMPTYEXP       [^ \t\n:]
Packit 1c1d7e
PARAMNONEMPTY     [^ \t\n():]
Packit 1c1d7e
IDENTIFIER        ({LETTER}|"_")({LETTER}|{DIGIT}|"_")*  
Packit 1c1d7e
SCOPE             {IDENTIFIER}("."{IDENTIFIER})*
Packit 1c1d7e
BORDER            ([^A-Za-z0-9])
Packit 1c1d7e
Packit 1c1d7e
TRISINGLEQUOTE    {STRINGPREFIX}?"'''"(!)?
Packit 1c1d7e
TRIDOUBLEQUOTE    {STRINGPREFIX}?"\"\"\""(!)?
Packit 1c1d7e
ENDTRISINGLEQUOTE "'''"
Packit 1c1d7e
ENDTRIDOUBLEQUOTE "\"\"\""
Packit 1c1d7e
LONGSTRINGCHAR    [^\\"']
Packit 1c1d7e
ESCAPESEQ         ("\\")(.)
Packit 1c1d7e
LONGSTRINGITEM    ({LONGSTRINGCHAR}|{ESCAPESEQ})
Packit 1c1d7e
SMALLQUOTE        ("\"\""|"\""|"'"|"''")
Packit 1c1d7e
LONGSTRINGBLOCK   ({LONGSTRINGITEM}+|{SMALLQUOTE})
Packit 1c1d7e
Packit 1c1d7e
SHORTSTRING       ("'"{SHORTSTRINGITEM}*"'"|'"'{SHORTSTRINGITEM}*'"')
Packit 1c1d7e
SHORTSTRINGITEM   ({SHORTSTRINGCHAR}|{ESCAPESEQ})
Packit 1c1d7e
SHORTSTRINGCHAR   [^\\\n"]
Packit 1c1d7e
STRINGLITERAL     {STRINGPREFIX}?( {SHORTSTRING} | {LONGSTRING})  
Packit 1c1d7e
STRINGPREFIX      ("r"|"u"|"ur"|"R"|"U"|"UR"|"Ur"|"uR")
Packit 1c1d7e
KEYWORD           ("lambda"|"import"|"class"|"assert"|"as"|"from"|"global"|"def"|"True"|"False")
Packit 1c1d7e
FLOWKW            ("or"|"and"|"is"|"not"|"print"|"for"|"in"|"if"|"try"|"except"|"yield"|"raise"|"break"|"continue"|"pass"|"if"|"return"|"while"|"elif"|"else"|"finally")
Packit 1c1d7e
POUNDCOMMENT      "#"[^#\n][^\n]* 
Packit 1c1d7e
SCRIPTCOMMENT      "#!".* 
Packit 1c1d7e
Packit 1c1d7e
STARTDOCSYMS      "##"
Packit 1c1d7e
Packit 1c1d7e
%option noyywrap
Packit 1c1d7e
Packit 1c1d7e
  /* Main start state */
Packit 1c1d7e
Packit 1c1d7e
%x Search
Packit 1c1d7e
%x SearchMemVars
Packit 1c1d7e
Packit 1c1d7e
  /* Mid-comment states */
Packit 1c1d7e
Packit 1c1d7e
  /* %x FuncDoubleComment */
Packit 1c1d7e
  /* %x ClassDoubleComment */
Packit 1c1d7e
%x TryClassDocString
Packit 1c1d7e
%x TripleComment
Packit 1c1d7e
%x SpecialComment
Packit 1c1d7e
Packit 1c1d7e
  /* Function states */
Packit 1c1d7e
Packit 1c1d7e
%x FunctionDec
Packit 1c1d7e
%x FunctionParams
Packit 1c1d7e
%x FunctionBody
Packit 1c1d7e
%x FunctionParamDefVal
Packit 1c1d7e
Packit 1c1d7e
  /* Class states */
Packit 1c1d7e
Packit 1c1d7e
%x ClassDec
Packit 1c1d7e
%x ClassInheritance
Packit 1c1d7e
%x ClassCaptureIndent
Packit 1c1d7e
%x ClassBody
Packit 1c1d7e
Packit 1c1d7e
  /* Variable states */
Packit 1c1d7e
%x VariableDec
Packit 1c1d7e
%x VariableEnd
Packit 1c1d7e
%x VariableAtom
Packit 1c1d7e
Packit 1c1d7e
  /* String states */
Packit 1c1d7e
Packit 1c1d7e
%x SingleQuoteString
Packit 1c1d7e
%x DoubleQuoteString
Packit 1c1d7e
%x TripleString
Packit 1c1d7e
Packit 1c1d7e
  /* import */
Packit 1c1d7e
%x FromMod
Packit 1c1d7e
%x FromModItem
Packit 1c1d7e
%x Import
Packit 1c1d7e
Packit 1c1d7e
%%
Packit 1c1d7e
Packit 1c1d7e
  /* ------------ Function recognition rules -------------- */
Packit 1c1d7e
Packit 1c1d7e
<Search>{
Packit 1c1d7e
Packit 1c1d7e
    ^{B}"def"{BB}       { // start of a function/method definition with indent
Packit 1c1d7e
      			  DBG_CTX((stderr,"Found def at %d\n",yyLineNr));
Packit 1c1d7e
      			  g_indent=computeIndent(yytext);
Packit 1c1d7e
			  searchFoundDef();
Packit 1c1d7e
			  BEGIN( FunctionDec );
Packit 1c1d7e
      			}
Packit 1c1d7e
    "def"{BB}           { // start of a function/method definition
Packit 1c1d7e
			  searchFoundDef();
Packit 1c1d7e
			  BEGIN( FunctionDec );
Packit 1c1d7e
                        }
Packit 1c1d7e
Packit 1c1d7e
     ^{B}"class"{BB}	{ // start of a class definition with indent
Packit 1c1d7e
       			  DBG_CTX((stderr,"Found class at %d\n",yyLineNr));
Packit 1c1d7e
      			  g_indent=computeIndent(yytext);
Packit 1c1d7e
			  searchFoundClass();
Packit 1c1d7e
			  BEGIN( ClassDec ) ;
Packit 1c1d7e
       			}
Packit 1c1d7e
     "class"{BB}        {  // start of a class definition
Packit 1c1d7e
			  searchFoundClass();
Packit 1c1d7e
			  BEGIN( ClassDec ) ;
Packit 1c1d7e
                       }
Packit 1c1d7e
     ^{B}"from"{BB}    |
Packit 1c1d7e
     "from"{BB}	       { // start of an from import
Packit 1c1d7e
			  g_packageCommentAllowed = FALSE;
Packit 1c1d7e
                          BEGIN( FromMod );
Packit 1c1d7e
                       }
Packit 1c1d7e
Packit 1c1d7e
     ^{B}"import"{BB}  |
Packit 1c1d7e
     "import"{BB}      { // start of an import statement
Packit 1c1d7e
			  g_packageCommentAllowed = FALSE;
Packit 1c1d7e
                          BEGIN( Import );
Packit 1c1d7e
                       }
Packit 1c1d7e
     ^{B}{IDENTIFIER}/{B}"="{B}"property" { // property
Packit 1c1d7e
      			current->section   = Entry::VARIABLE_SEC;
Packit 1c1d7e
  			current->mtype     = Property;
Packit 1c1d7e
			current->name      = QCString(yytext).stripWhiteSpace();
Packit 1c1d7e
			current->fileName  = yyFileName;
Packit 1c1d7e
			current->startLine = yyLineNr;
Packit 1c1d7e
			current->bodyLine  = yyLineNr;
Packit 1c1d7e
			g_packageCommentAllowed = FALSE;
Packit 1c1d7e
			BEGIN(VariableDec);
Packit 1c1d7e
       	              }
Packit 1c1d7e
     ^{B}{IDENTIFIER}/{B}"="[^=] { // variable
Packit 1c1d7e
                        if (g_search_count) REJECT;
Packit 1c1d7e
      			g_indent=computeIndent(yytext);
Packit 1c1d7e
      			current->section   = Entry::VARIABLE_SEC;
Packit 1c1d7e
			current->name      = QCString(yytext).stripWhiteSpace();
Packit 1c1d7e
			current->fileName  = yyFileName;
Packit 1c1d7e
			current->startLine = yyLineNr;
Packit 1c1d7e
			current->bodyLine  = yyLineNr;
Packit 1c1d7e
			g_packageCommentAllowed = FALSE;
Packit 1c1d7e
			BEGIN(VariableDec);
Packit 1c1d7e
      		      }
Packit 1c1d7e
     {B}{IDENTIFIER}/({B},{B}{IDENTIFIER})*{B}")"*{B}"="[^=] { // list of variables, we cannot place the default value
Packit 1c1d7e
                                                               // so we will skip it later on in a general rule
Packit 1c1d7e
                                                               // Also note ")" this is to catch also (a,b). the "("
Packit 1c1d7e
                                                               // is caught in the rule: [(], the ")" will be handled in [)]
Packit 1c1d7e
                        if (g_search_count > 1) REJECT;
Packit 1c1d7e
      			g_indent=computeIndent(yytext);
Packit 1c1d7e
      			current->section   = Entry::VARIABLE_SEC;
Packit 1c1d7e
			current->name      = QCString(yytext).stripWhiteSpace();
Packit 1c1d7e
			current->fileName  = yyFileName;
Packit 1c1d7e
			current->startLine = yyLineNr;
Packit 1c1d7e
			current->bodyLine  = yyLineNr;
Packit 1c1d7e
			g_packageCommentAllowed = FALSE;
Packit 1c1d7e
			newVariable();
Packit 1c1d7e
      		      }
Packit 1c1d7e
     "'"	      { // start of a single quoted string
Packit 1c1d7e
       		        g_stringContext=YY_START;
Packit 1c1d7e
		        g_copyString=0;
Packit 1c1d7e
			g_packageCommentAllowed = FALSE;
Packit 1c1d7e
                        BEGIN( SingleQuoteString );
Packit 1c1d7e
                      }
Packit 1c1d7e
     "\""	      { // start of a double quoted string
Packit 1c1d7e
       	                g_stringContext=YY_START;
Packit 1c1d7e
			g_copyString=0;
Packit 1c1d7e
			g_packageCommentAllowed = FALSE;
Packit 1c1d7e
                        BEGIN( DoubleQuoteString );
Packit 1c1d7e
                      }
Packit 1c1d7e
    "@staticmethod"  {
Packit 1c1d7e
       			gstat=TRUE;
Packit 1c1d7e
      		      }
Packit 1c1d7e
    {SCRIPTCOMMENT}   { // Unix type script comment
Packit 1c1d7e
                        if (yyLineNr != 1) REJECT;
Packit 1c1d7e
      		      }
Packit 1c1d7e
    {POUNDCOMMENT}    { // normal comment 
Packit 1c1d7e
			g_packageCommentAllowed = FALSE;
Packit 1c1d7e
      		      }
Packit 1c1d7e
    {IDENTIFIER}      { // some other identifier
Packit 1c1d7e
			g_packageCommentAllowed = FALSE;
Packit 1c1d7e
		      }
Packit 1c1d7e
    ^{BB}	      {
Packit 1c1d7e
      			g_curIndent=computeIndent(yytext);
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
    {NEWLINE}+        { // new line
Packit 1c1d7e
                        lineCount();
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
    {TRIDOUBLEQUOTE}  { // start of a comment block
Packit 1c1d7e
			initTriDoubleQuoteBlock();
Packit 1c1d7e
			BEGIN(TripleComment);
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
    {TRISINGLEQUOTE}  { // start of a comment block
Packit 1c1d7e
			initTriSingleQuoteBlock();
Packit 1c1d7e
			BEGIN(TripleComment);
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
    {STARTDOCSYMS}/[^#]    {  // start of a special comment
Packit 1c1d7e
      			g_curIndent=computeIndent(yytext);
Packit 1c1d7e
			g_packageCommentAllowed = FALSE;
Packit 1c1d7e
			initSpecialBlock();
Packit 1c1d7e
			BEGIN(SpecialComment);
Packit 1c1d7e
                      }
Packit 1c1d7e
    [(]               { // we have to do something with (
Packit 1c1d7e
                        g_search_count += 1;
Packit 1c1d7e
                      }
Packit 1c1d7e
    [)]               { // we have to do something with )
Packit 1c1d7e
                        g_search_count -= 1;
Packit 1c1d7e
                      }
Packit 1c1d7e
    [^\n]             { // any other character...
Packit 1c1d7e
                        // This is the major default
Packit 1c1d7e
                        // that should catch everything
Packit 1c1d7e
                        // else in Body.
Packit 1c1d7e
                      }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
<FromMod>{
Packit 1c1d7e
  "."                 { // python3 style imports
Packit 1c1d7e
                      }
Packit 1c1d7e
  {IDENTIFIER}({B}"."{B}{IDENTIFIER})* { // from package import 
Packit 1c1d7e
                        g_packageName=yytext;
Packit 1c1d7e
		      }
Packit 1c1d7e
  "import"{B}	      {
Packit 1c1d7e
    			BEGIN(FromModItem);
Packit 1c1d7e
    		      }
Packit 1c1d7e
  \n		      {
Packit 1c1d7e
                        incLineNr();
Packit 1c1d7e
                        BEGIN(Search);
Packit 1c1d7e
                      }
Packit 1c1d7e
  {B}		      {
Packit 1c1d7e
		      }
Packit 1c1d7e
  .                   {
Packit 1c1d7e
                        unput(*yytext);
Packit 1c1d7e
                        BEGIN(Search);
Packit 1c1d7e
                      }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
<FromModItem>{
Packit 1c1d7e
  "*"		{ // import all
Packit 1c1d7e
                  QCString item=g_packageName;
Packit 1c1d7e
		  current->name=removeRedundantWhiteSpace(substitute(item,".","::"));
Packit 1c1d7e
		  current->fileName = yyFileName; 
Packit 1c1d7e
		  //printf("Adding using directive: found:%s:%d name=%s\n",yyFileName.data(),yyLineNr,current->name.data());
Packit 1c1d7e
		  current->section=Entry::USINGDIR_SEC;
Packit 1c1d7e
		  current_root->addSubEntry(current);
Packit 1c1d7e
		  current = new Entry ;
Packit 1c1d7e
		  initEntry();
Packit 1c1d7e
                  BEGIN(Search);
Packit 1c1d7e
    		}
Packit 1c1d7e
  {IDENTIFIER}/{B}","{B} {
Packit 1c1d7e
                  QCString item=g_packageName+"."+yytext;
Packit 1c1d7e
		  current->name=removeRedundantWhiteSpace(substitute(item,".","::"));
Packit 1c1d7e
		  current->fileName = yyFileName; 
Packit 1c1d7e
		  //printf("Adding using declaration: found:%s:%d name=%s\n",yyFileName.data(),yyLineNr,current->name.data());
Packit 1c1d7e
		  current->section=Entry::USINGDECL_SEC;
Packit 1c1d7e
		  current_root->addSubEntry(current);
Packit 1c1d7e
		  current = new Entry ;
Packit 1c1d7e
		  initEntry();
Packit 1c1d7e
		}
Packit 1c1d7e
  {IDENTIFIER}  {
Packit 1c1d7e
                  QCString item=g_packageName+"."+yytext;
Packit 1c1d7e
		  current->name=removeRedundantWhiteSpace(substitute(item,".","::"));
Packit 1c1d7e
		  current->fileName = yyFileName; 
Packit 1c1d7e
		  //printf("Adding using declaration: found:%s:%d name=%s\n",yyFileName.data(),yyLineNr,current->name.data());
Packit 1c1d7e
		  current->section=Entry::USINGDECL_SEC;
Packit 1c1d7e
		  current_root->addSubEntry(current);
Packit 1c1d7e
		  current = new Entry ;
Packit 1c1d7e
		  initEntry();
Packit 1c1d7e
                  BEGIN(Search);
Packit 1c1d7e
		}
Packit 1c1d7e
  \n		{
Packit 1c1d7e
                  incLineNr();
Packit 1c1d7e
                  BEGIN(Search);
Packit 1c1d7e
                }
Packit 1c1d7e
  {B}		{
Packit 1c1d7e
		}
Packit 1c1d7e
  ","		{ 
Packit 1c1d7e
  		}
Packit 1c1d7e
  .             {
Packit 1c1d7e
                  unput(*yytext);
Packit 1c1d7e
                  BEGIN(Search);
Packit 1c1d7e
                }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
<Import>{
Packit 1c1d7e
  {IDENTIFIER}({B}"."{B}{IDENTIFIER})* {
Packit 1c1d7e
			current->name=removeRedundantWhiteSpace(substitute(yytext,".","::"));
Packit 1c1d7e
			current->fileName = yyFileName; 
Packit 1c1d7e
			//printf("Adding using declaration: found:%s:%d name=%s\n",yyFileName.data(),yyLineNr,current->name.data());
Packit 1c1d7e
			current->section=Entry::USINGDECL_SEC;
Packit 1c1d7e
			current_root->addSubEntry(current);
Packit 1c1d7e
			current = new Entry ;
Packit 1c1d7e
			initEntry();
Packit 1c1d7e
			BEGIN(Search);
Packit 1c1d7e
                      }
Packit 1c1d7e
  \n		{
Packit 1c1d7e
                  incLineNr();
Packit 1c1d7e
                  BEGIN(Search);
Packit 1c1d7e
                }
Packit 1c1d7e
  {B}		{
Packit 1c1d7e
		}
Packit 1c1d7e
  .             {
Packit 1c1d7e
                  unput(*yytext);
Packit 1c1d7e
                  BEGIN(Search);
Packit 1c1d7e
                }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
<SearchMemVars>{
Packit 1c1d7e
    "self."{IDENTIFIER}/{B}"=" {
Packit 1c1d7e
                        DBG_CTX((stderr,"Found instance method variable %s in %s at %d\n",&yytext[5],current_root->name.data(),yyLineNr));
Packit 1c1d7e
			current->name=&yytext[5];
Packit 1c1d7e
			current->section=Entry::VARIABLE_SEC;
Packit 1c1d7e
			current->fileName  = yyFileName;
Packit 1c1d7e
			current->startLine = yyLineNr;
Packit 1c1d7e
			current->bodyLine  = yyLineNr;
Packit 1c1d7e
			current->type.resize(0);
Packit 1c1d7e
			if (current->name.at(0)=='_') // mark as private
Packit 1c1d7e
			{
Packit 1c1d7e
			  current->protection=Private;
Packit 1c1d7e
			}
Packit 1c1d7e
			newEntry();
Packit 1c1d7e
                      }
Packit 1c1d7e
    "cls."{IDENTIFIER}/{B}"=" {
Packit 1c1d7e
                        DBG_CTX((stderr,"Found class method variable %s in %s at %d\n",&yytext[4],current_root->name.data(),yyLineNr));
Packit 1c1d7e
			current->name=&yytext[4];
Packit 1c1d7e
			current->section=Entry::VARIABLE_SEC;
Packit 1c1d7e
			current->fileName  = yyFileName;
Packit 1c1d7e
			current->startLine = yyLineNr;
Packit 1c1d7e
			current->bodyLine  = yyLineNr;
Packit 1c1d7e
			current->type.resize(0);
Packit 1c1d7e
			if (current->name.at(0)=='_') // mark as private
Packit 1c1d7e
			{
Packit 1c1d7e
			  current->protection=Private;
Packit 1c1d7e
			}
Packit 1c1d7e
			newEntry();
Packit 1c1d7e
                      }
Packit 1c1d7e
    {TRIDOUBLEQUOTE}  { // start of a comment block
Packit 1c1d7e
			initTriDoubleQuoteBlock();
Packit 1c1d7e
			BEGIN(TripleComment);
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
    {TRISINGLEQUOTE}  { // start of a comment block
Packit 1c1d7e
			initTriSingleQuoteBlock();
Packit 1c1d7e
			BEGIN(TripleComment);
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
    {STARTDOCSYMS}/[^#]    {  // start of a special comment
Packit 1c1d7e
			initSpecialBlock();
Packit 1c1d7e
			BEGIN(SpecialComment);
Packit 1c1d7e
                      }
Packit 1c1d7e
    {POUNDCOMMENT}    { // #
Packit 1c1d7e
	              }
Packit 1c1d7e
    "'"	              { // start of a single quoted string
Packit 1c1d7e
       			g_stringContext=YY_START;
Packit 1c1d7e
			g_copyString=0;
Packit 1c1d7e
                        BEGIN( SingleQuoteString );
Packit 1c1d7e
                      }
Packit 1c1d7e
    "\""              { // start of a double quoted string
Packit 1c1d7e
       			g_stringContext=YY_START;
Packit 1c1d7e
			g_copyString=0;
Packit 1c1d7e
                        BEGIN( DoubleQuoteString );
Packit 1c1d7e
                      }
Packit 1c1d7e
    \n		      { incLineNr(); }
Packit 1c1d7e
    {IDENTIFIER}      // identifiers
Packit 1c1d7e
    [^'"\.#a-z_A-Z\n]+  // other uninteresting stuff
Packit 1c1d7e
    .                 // anything else
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
<FunctionBody>{
Packit 1c1d7e
    \n{B}/{IDENTIFIER}{BB}  {
Packit 1c1d7e
                        DBG_CTX((stderr,"indent %d<=%d\n",computeIndent(&yytext[1]),g_indent));
Packit 1c1d7e
                        if (computeIndent(&yytext[1])<=g_indent) 
Packit 1c1d7e
			{
Packit 1c1d7e
			  int i;
Packit 1c1d7e
			  for (i=(int)yyleng-1;i>=0;i--)
Packit 1c1d7e
			  {
Packit 1c1d7e
			    unput(yytext[i]);
Packit 1c1d7e
			  }
Packit 1c1d7e
			  endOfDef();
Packit 1c1d7e
			  //YY_CURRENT_BUFFER->yy_at_bol=TRUE;
Packit 1c1d7e
                          BEGIN(Search);
Packit 1c1d7e
			}
Packit 1c1d7e
			else
Packit 1c1d7e
			{
Packit 1c1d7e
                          incLineNr();
Packit 1c1d7e
      		          current->program+=yytext;
Packit 1c1d7e
			}
Packit 1c1d7e
                      }
Packit 1c1d7e
    \n{B}/"##"	      {
Packit 1c1d7e
                        if (computeIndent(&yytext[1])<=g_indent)
Packit 1c1d7e
			{
Packit 1c1d7e
			  int i;
Packit 1c1d7e
			  for (i=(int)yyleng-1;i>=0;i--)
Packit 1c1d7e
			  {
Packit 1c1d7e
			    unput(yytext[i]);
Packit 1c1d7e
			  }
Packit 1c1d7e
			  endOfDef();
Packit 1c1d7e
			  //YY_CURRENT_BUFFER->yy_at_bol=TRUE;
Packit 1c1d7e
                          BEGIN(Search);
Packit 1c1d7e
			}
Packit 1c1d7e
			else
Packit 1c1d7e
			{
Packit 1c1d7e
			  incLineNr();
Packit 1c1d7e
      		          current->program+=yytext;
Packit 1c1d7e
			}
Packit 1c1d7e
      		      }
Packit 1c1d7e
    <<EOF>>	      {
Packit 1c1d7e
			endOfDef();
Packit 1c1d7e
			yyterminate();
Packit 1c1d7e
      		      }
Packit 1c1d7e
    ^{BB}/\n	      { // skip empty line
Packit 1c1d7e
      		        current->program+=yytext;
Packit 1c1d7e
      	              }
Packit 1c1d7e
    ^{BB}	      { // something at indent >0
Packit 1c1d7e
      		        current->program+=yytext;
Packit 1c1d7e
			g_curIndent = computeIndent(yytext);
Packit 1c1d7e
                        if (g_curIndent<=g_indent) 
Packit 1c1d7e
			  // jumped out of the function
Packit 1c1d7e
			{
Packit 1c1d7e
			  endOfDef(1);
Packit 1c1d7e
                          BEGIN(Search);
Packit 1c1d7e
			}
Packit 1c1d7e
      		      }
Packit 1c1d7e
    "'"	              { // start of a single quoted string
Packit 1c1d7e
      		        current->program+=yytext;
Packit 1c1d7e
       			g_stringContext=YY_START;
Packit 1c1d7e
		        g_specialBlock = FALSE; 
Packit 1c1d7e
			g_copyString=&current->program;
Packit 1c1d7e
                        BEGIN( SingleQuoteString );
Packit 1c1d7e
                      }
Packit 1c1d7e
    "\""              { // start of a double quoted string
Packit 1c1d7e
      		        current->program+=yytext;
Packit 1c1d7e
       			g_stringContext=YY_START;
Packit 1c1d7e
		        g_specialBlock = FALSE; 
Packit 1c1d7e
			g_copyString=&current->program;
Packit 1c1d7e
                        BEGIN( DoubleQuoteString );
Packit 1c1d7e
                      }
Packit 1c1d7e
    [^ \t\n#'".]+     { // non-special stuff
Packit 1c1d7e
      		        current->program+=yytext;
Packit 1c1d7e
		        g_specialBlock = FALSE; 
Packit 1c1d7e
                      }
Packit 1c1d7e
    ^{POUNDCOMMENT}   { // normal comment 
Packit 1c1d7e
      		        current->program+=yytext;
Packit 1c1d7e
      		      }
Packit 1c1d7e
    "#".*             { // comment half way
Packit 1c1d7e
      		        current->program+=yytext;
Packit 1c1d7e
                      }
Packit 1c1d7e
    {NEWLINE}	      { 
Packit 1c1d7e
			incLineNr(); 
Packit 1c1d7e
      		        current->program+=yytext;
Packit 1c1d7e
		      }
Packit 1c1d7e
    .                 { // any character
Packit 1c1d7e
      		        current->program+=*yytext;
Packit 1c1d7e
		        g_specialBlock = FALSE; 
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
    {TRIDOUBLEQUOTE}  { // start of a comment block
Packit 1c1d7e
			current->program+=yytext;
Packit 1c1d7e
			initTriDoubleQuoteBlock();
Packit 1c1d7e
			BEGIN(TripleComment);
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
    {TRISINGLEQUOTE}  { // start of a comment block
Packit 1c1d7e
			current->program+=yytext;
Packit 1c1d7e
			initTriSingleQuoteBlock();
Packit 1c1d7e
			BEGIN(TripleComment);
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
    {STARTDOCSYMS}/[^#]  {  // start of a special comment
Packit 1c1d7e
			initSpecialBlock();
Packit 1c1d7e
			BEGIN(SpecialComment);
Packit 1c1d7e
                      }
Packit 1c1d7e
    
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
<FunctionDec>{
Packit 1c1d7e
Packit 1c1d7e
    {IDENTIFIER}            {
Packit 1c1d7e
			      //found function name
Packit 1c1d7e
			      if (current->type.isEmpty()) 
Packit 1c1d7e
			      {
Packit 1c1d7e
				  current->type = "def";
Packit 1c1d7e
			      }
Packit 1c1d7e
			      current->name = yytext;
Packit 1c1d7e
			      current->name = current->name.stripWhiteSpace();
Packit 1c1d7e
			      newFunction();
Packit 1c1d7e
                            }
Packit 1c1d7e
    {B}":"		    { // function without arguments
Packit 1c1d7e
			      g_specialBlock = TRUE; // expecting a docstring
Packit 1c1d7e
			      bodyEntry = current;
Packit 1c1d7e
                              current->bodyLine  = yyLineNr;
Packit 1c1d7e
                              BEGIN( FunctionBody );
Packit 1c1d7e
			    }
Packit 1c1d7e
Packit 1c1d7e
    {B}"("                  {
Packit 1c1d7e
			       BEGIN( FunctionParams );
Packit 1c1d7e
		            }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
<FunctionParams>{
Packit 1c1d7e
    ({BB}|",")          {
Packit 1c1d7e
                        }
Packit 1c1d7e
Packit 1c1d7e
    {IDENTIFIER}        { // Name of parameter
Packit 1c1d7e
			  lineCount();
Packit 1c1d7e
			  Argument *a = new Argument;
Packit 1c1d7e
			  current->argList->append(a);
Packit 1c1d7e
			  current->argList->getLast()->name = QCString(yytext).stripWhiteSpace();
Packit 1c1d7e
			  current->argList->getLast()->type = "";
Packit 1c1d7e
                        }
Packit 1c1d7e
    "="		        { // default value
Packit 1c1d7e
                          // TODO: this rule is too simple, need to be able to
Packit 1c1d7e
                          // match things like =")" as well!
Packit 1c1d7e
			  g_defVal.resize(0);
Packit 1c1d7e
			  g_braceCount=0;
Packit 1c1d7e
			  BEGIN(FunctionParamDefVal);
Packit 1c1d7e
      			}
Packit 1c1d7e
Packit 1c1d7e
     ")"                { // end of parameter list
Packit 1c1d7e
        		  current->args = argListToString(current->argList);
Packit 1c1d7e
                        }
Packit 1c1d7e
Packit 1c1d7e
     ":"{B}             {
Packit 1c1d7e
			  g_specialBlock = TRUE; // expecting a docstring
Packit 1c1d7e
			  bodyEntry = current;
Packit 1c1d7e
                          current->bodyLine  = yyLineNr;
Packit 1c1d7e
                          BEGIN( FunctionBody );
Packit 1c1d7e
                        }
Packit 1c1d7e
    {POUNDCOMMENT}	{ // a comment
Packit 1c1d7e
			}
Packit 1c1d7e
    {PARAMNONEMPTY}     { // Default rule inside arguments.
Packit 1c1d7e
                        }
Packit 1c1d7e
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
<FunctionParamDefVal>{
Packit 1c1d7e
     "("		{ // internal opening brace
Packit 1c1d7e
       			  g_braceCount++;
Packit 1c1d7e
			  g_defVal+=*yytext;
Packit 1c1d7e
       			}
Packit 1c1d7e
     ","		| 
Packit 1c1d7e
     ")"		{
Packit 1c1d7e
       			  if (g_braceCount==0)  // end of default argument
Packit 1c1d7e
			  {
Packit 1c1d7e
			    if (current->argList->getLast())
Packit 1c1d7e
			    {
Packit 1c1d7e
			      current->argList->getLast()->defval=g_defVal.stripWhiteSpace();
Packit 1c1d7e
			    }
Packit 1c1d7e
			    if (*yytext == ')')
Packit 1c1d7e
			      current->args = argListToString(current->argList);
Packit 1c1d7e
			    BEGIN(FunctionParams);
Packit 1c1d7e
			  }
Packit 1c1d7e
			  else // continue
Packit 1c1d7e
			  {
Packit 1c1d7e
			    if (*yytext == ')')g_braceCount--;
Packit 1c1d7e
			    g_defVal+=*yytext;
Packit 1c1d7e
			  }
Packit 1c1d7e
       			}
Packit 1c1d7e
     .			{
Packit 1c1d7e
			    g_defVal+=*yytext;
Packit 1c1d7e
       			}
Packit 1c1d7e
     \n                 {
Packit 1c1d7e
       			    g_defVal+=*yytext;
Packit 1c1d7e
			    incLineNr();
Packit 1c1d7e
       			}
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<ClassBody>{
Packit 1c1d7e
    \n/{IDENTIFIER}{BB}  { // new def at indent 0
Packit 1c1d7e
                        incLineNr();
Packit 1c1d7e
			endOfDef();
Packit 1c1d7e
			//g_hideClassDocs = FALSE;
Packit 1c1d7e
			//YY_CURRENT_BUFFER->yy_at_bol=TRUE;
Packit 1c1d7e
                        BEGIN(Search);
Packit 1c1d7e
                      }
Packit 1c1d7e
    \n/"##"[^#]       {  // start of a special comment at indent 0
Packit 1c1d7e
                        incLineNr();
Packit 1c1d7e
			endOfDef();
Packit 1c1d7e
			//g_hideClassDocs = FALSE;
Packit 1c1d7e
			//YY_CURRENT_BUFFER->yy_at_bol=TRUE;
Packit 1c1d7e
                        BEGIN(Search);
Packit 1c1d7e
                      }
Packit 1c1d7e
    ^{BB}/\n	      { // skip empty line
Packit 1c1d7e
      		        current->program+=yytext;
Packit 1c1d7e
      	              }
Packit 1c1d7e
    <<EOF>>	      {
Packit 1c1d7e
			endOfDef();
Packit 1c1d7e
			yyterminate();
Packit 1c1d7e
      		      }
Packit 1c1d7e
    ^{BB}	      { // something at indent >0
Packit 1c1d7e
                        g_curIndent=computeIndent(yytext);
Packit 1c1d7e
			DBG_CTX((stderr,"g_curIndent=%d g_indent=%d\n",g_curIndent,g_indent));
Packit 1c1d7e
                        if (g_curIndent<=g_indent) 
Packit 1c1d7e
			  // jumped out of the class/method
Packit 1c1d7e
			{
Packit 1c1d7e
			  endOfDef(1);
Packit 1c1d7e
			  g_indent=g_curIndent;
Packit 1c1d7e
			  // make sure the next rule matches ^...
Packit 1c1d7e
			  //YY_CURRENT_BUFFER->yy_at_bol=TRUE;
Packit 1c1d7e
			  //g_hideClassDocs = FALSE;
Packit 1c1d7e
                          BEGIN(Search);
Packit 1c1d7e
			}
Packit 1c1d7e
			else
Packit 1c1d7e
			{
Packit 1c1d7e
      		          current->program+=yytext;
Packit 1c1d7e
			}
Packit 1c1d7e
      		      }
Packit 1c1d7e
    "'"	              { // start of a single quoted string
Packit 1c1d7e
      		        current->program+=*yytext;
Packit 1c1d7e
       			g_stringContext=YY_START;
Packit 1c1d7e
		        g_specialBlock = FALSE; 
Packit 1c1d7e
			g_copyString=&current->program;
Packit 1c1d7e
                        BEGIN( SingleQuoteString );
Packit 1c1d7e
                      }
Packit 1c1d7e
    "\""              { // start of a double quoted string
Packit 1c1d7e
      		        current->program+=*yytext;
Packit 1c1d7e
       			g_stringContext=YY_START;
Packit 1c1d7e
		        g_specialBlock = FALSE; 
Packit 1c1d7e
			g_copyString=&current->program;
Packit 1c1d7e
                        BEGIN( DoubleQuoteString );
Packit 1c1d7e
                      }
Packit 1c1d7e
    [^ \t\n#'"]+      { // non-special stuff
Packit 1c1d7e
      		        current->program+=yytext;
Packit 1c1d7e
		        g_specialBlock = FALSE; 
Packit 1c1d7e
			//g_hideClassDocs = FALSE;
Packit 1c1d7e
                      }
Packit 1c1d7e
    {NEWLINE}	      { 
Packit 1c1d7e
      		        current->program+=*yytext;
Packit 1c1d7e
			incLineNr(); 
Packit 1c1d7e
		      }
Packit 1c1d7e
    {POUNDCOMMENT}    { // normal comment
Packit 1c1d7e
      		        current->program+=yytext;
Packit 1c1d7e
                      }
Packit 1c1d7e
    .                 { // any character
Packit 1c1d7e
		        g_specialBlock = FALSE; 
Packit 1c1d7e
      		        current->program+=*yytext;
Packit 1c1d7e
                      }
Packit 1c1d7e
    {TRIDOUBLEQUOTE}  { // start of a comment block
Packit 1c1d7e
      		        //if (!g_hideClassDocs) 
Packit 1c1d7e
			current->program+=yytext;
Packit 1c1d7e
			initTriDoubleQuoteBlock();
Packit 1c1d7e
			BEGIN(TripleComment);
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
    {TRISINGLEQUOTE}  { // start of a comment block
Packit 1c1d7e
      		        //if (!g_hideClassDocs) 
Packit 1c1d7e
			current->program+=yytext;
Packit 1c1d7e
			initTriSingleQuoteBlock();
Packit 1c1d7e
			BEGIN(TripleComment);
Packit 1c1d7e
                      }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
<ClassDec>{IDENTIFIER} {
Packit 1c1d7e
			  if (current->type.isEmpty()) 
Packit 1c1d7e
			  {
Packit 1c1d7e
			      current->type = "class";
Packit 1c1d7e
			  }
Packit 1c1d7e
Packit 1c1d7e
			  current->section = Entry::CLASS_SEC;
Packit 1c1d7e
			  current->name = yytext;
Packit 1c1d7e
Packit 1c1d7e
			  // prepend scope in case of nested classes
Packit 1c1d7e
			  if (current_root->section&Entry::SCOPE_MASK)
Packit 1c1d7e
			  {
Packit 1c1d7e
			    //printf("*** Prepending scope %s to class %s\n",current_root->name.data(),current->name.data());
Packit 1c1d7e
			    current->name.prepend(current_root->name+"::");
Packit 1c1d7e
			  }
Packit 1c1d7e
			  
Packit 1c1d7e
			  current->name = current->name.stripWhiteSpace();
Packit 1c1d7e
			  current->fileName = yyFileName;        
Packit 1c1d7e
			  docBlockContext   = YY_START;
Packit 1c1d7e
			  docBlockInBody    = FALSE;
Packit 1c1d7e
			  docBlockJavaStyle = FALSE;
Packit 1c1d7e
			  docBlock.resize(0);
Packit 1c1d7e
Packit 1c1d7e
			  BEGIN(ClassInheritance);                 
Packit 1c1d7e
                        }
Packit 1c1d7e
Packit 1c1d7e
<ClassInheritance>{
Packit 1c1d7e
   ({BB}|[\(,\)])      { // syntactic sugar for the list
Packit 1c1d7e
                       }
Packit 1c1d7e
Packit 1c1d7e
    ":"                { // begin of the class definition
Packit 1c1d7e
			 g_specialBlock = TRUE; // expecting a docstring
Packit 1c1d7e
                         current->bodyLine  = yyLineNr;
Packit 1c1d7e
			 current->program.resize(0);
Packit 1c1d7e
      			 BEGIN(ClassCaptureIndent);
Packit 1c1d7e
                       }
Packit 1c1d7e
Packit 1c1d7e
    {SCOPE}            {
Packit 1c1d7e
                         current->extends->append(
Packit 1c1d7e
					      new BaseInfo(substitute(yytext,".","::"),Public,Normal)
Packit 1c1d7e
					    );
Packit 1c1d7e
                         //Has base class-do stuff
Packit 1c1d7e
                       }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<ClassCaptureIndent>{
Packit 1c1d7e
    "\n"|({BB}"\n")            {
Packit 1c1d7e
                                 // Blankline - ignore, keep looking for indentation.
Packit 1c1d7e
				 lineCount();
Packit 1c1d7e
      				 current->program+=yytext;
Packit 1c1d7e
                               }
Packit 1c1d7e
Packit 1c1d7e
    {TRIDOUBLEQUOTE}           { // start of a comment block
Packit 1c1d7e
				 initTriDoubleQuoteBlock();
Packit 1c1d7e
      				 current->program+=yytext;
Packit 1c1d7e
			 	 BEGIN(TripleComment);
Packit 1c1d7e
                      	       }
Packit 1c1d7e
Packit 1c1d7e
    {TRISINGLEQUOTE}           { // start of a comment block
Packit 1c1d7e
			         initTriSingleQuoteBlock();
Packit 1c1d7e
      				 current->program+=yytext;
Packit 1c1d7e
			         BEGIN(TripleComment);
Packit 1c1d7e
                               }
Packit 1c1d7e
Packit 1c1d7e
    ^{BB} 		       {
Packit 1c1d7e
      				 current->program+=yytext;
Packit 1c1d7e
			         //current->startLine = yyLineNr;
Packit 1c1d7e
				 g_curIndent=computeIndent(yytext);
Packit 1c1d7e
				 bodyEntry = current;
Packit 1c1d7e
				 DBG_CTX((stderr,"setting indent %d\n",g_curIndent));
Packit 1c1d7e
				 //printf("current->program=[%s]\n",current->program.data());
Packit 1c1d7e
				 //g_hideClassDocs = TRUE;
Packit 1c1d7e
			         BEGIN(ClassBody);
Packit 1c1d7e
                               }
Packit 1c1d7e
Packit 1c1d7e
    ""/({NONEMPTY}|{EXPCHAR})  {
Packit 1c1d7e
				 
Packit 1c1d7e
				 // Just pushback an empty class, and
Packit 1c1d7e
				 // resume parsing the body.
Packit 1c1d7e
                                 newEntry();
Packit 1c1d7e
      				 current->program+=yytext;
Packit 1c1d7e
Packit 1c1d7e
				 // printf("Failed to find indent - skipping!");
Packit 1c1d7e
				 BEGIN( Search );
Packit 1c1d7e
                               }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
<VariableDec>{
Packit 1c1d7e
   "="                { // the assignment operator
Packit 1c1d7e
                        //printf("====== VariableDec at line %d\n",yyLineNr);
Packit 1c1d7e
                        g_start_init = TRUE;
Packit 1c1d7e
			current->initializer = yytext;
Packit 1c1d7e
			current->initializer += " ";
Packit 1c1d7e
                      }
Packit 1c1d7e
   {B}                { // spaces
Packit 1c1d7e
			current->initializer += yytext;
Packit 1c1d7e
	              }
Packit 1c1d7e
   {INTNUMBER}	      { // integer value
Packit 1c1d7e
			if (current-> type.isEmpty()) current->type = "int";
Packit 1c1d7e
			current->initializer += yytext;
Packit 1c1d7e
		      }
Packit 1c1d7e
   {FLOATNUMBER}      { // floating point value
Packit 1c1d7e
			if (current->type.isEmpty()) current->type = "float";
Packit 1c1d7e
			current->initializer += yytext;
Packit 1c1d7e
		      }
Packit 1c1d7e
   {BOOL}             { // boolean value
Packit 1c1d7e
			if (current->type.isEmpty()) current->type = "bool";
Packit 1c1d7e
			current->initializer += yytext;
Packit 1c1d7e
		      }
Packit 1c1d7e
   {STRINGPREFIX}?"'" { // string
Packit 1c1d7e
			if (current->type.isEmpty()) current->type = "string";
Packit 1c1d7e
			current->initializer += yytext;
Packit 1c1d7e
			g_copyString=&current->initializer;
Packit 1c1d7e
       			g_stringContext=VariableDec;
Packit 1c1d7e
                        BEGIN( SingleQuoteString );
Packit 1c1d7e
     		      }
Packit 1c1d7e
   {STRINGPREFIX}?"\"" { // string
Packit 1c1d7e
			if (current->type.isEmpty()) current->type = "string";
Packit 1c1d7e
			current->initializer += yytext;
Packit 1c1d7e
			g_copyString=&current->initializer;
Packit 1c1d7e
       			g_stringContext=VariableDec;
Packit 1c1d7e
                        BEGIN( DoubleQuoteString );
Packit 1c1d7e
     		      }
Packit 1c1d7e
   {TRIDOUBLEQUOTE}   { // start of a comment block
Packit 1c1d7e
			if (current->type.isEmpty()) current->type = "string";
Packit 1c1d7e
			current->initializer += yytext;
Packit 1c1d7e
			g_doubleQuote=TRUE;
Packit 1c1d7e
			g_copyString=&current->initializer;
Packit 1c1d7e
       			g_stringContext=VariableDec;
Packit 1c1d7e
			BEGIN(TripleString);
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
   {TRISINGLEQUOTE}   { // start of a comment block
Packit 1c1d7e
			if (current->type.isEmpty()) current->type = "string";
Packit 1c1d7e
			current->initializer += yytext;
Packit 1c1d7e
			g_doubleQuote=FALSE;
Packit 1c1d7e
			g_copyString=&current->initializer;
Packit 1c1d7e
       			g_stringContext=VariableDec;
Packit 1c1d7e
			BEGIN(TripleString);
Packit 1c1d7e
                      }
Packit 1c1d7e
   "("		      { // tuple, only when direct after =
Packit 1c1d7e
                        if (current->mtype!=Property && g_start_init)
Packit 1c1d7e
			{
Packit 1c1d7e
			  current->type = "tuple";
Packit 1c1d7e
			}
Packit 1c1d7e
      		        current->initializer+=*yytext;
Packit 1c1d7e
                        g_atomStart='(';
Packit 1c1d7e
			g_atomEnd=')';
Packit 1c1d7e
			g_atomCount=1;
Packit 1c1d7e
			BEGIN( VariableAtom );
Packit 1c1d7e
                      }
Packit 1c1d7e
   "["                { // list
Packit 1c1d7e
                        if (g_start_init) current->type = "list";
Packit 1c1d7e
      		        current->initializer+=*yytext;
Packit 1c1d7e
                        g_atomStart='[';
Packit 1c1d7e
			g_atomEnd=']';
Packit 1c1d7e
			g_atomCount=1;
Packit 1c1d7e
			BEGIN( VariableAtom );
Packit 1c1d7e
                      }
Packit 1c1d7e
   "{"		      { // dictionary
Packit 1c1d7e
                        if (g_start_init) current->type = "dictionary";
Packit 1c1d7e
      		        current->initializer+=*yytext;
Packit 1c1d7e
                        g_atomStart='{';
Packit 1c1d7e
			g_atomEnd='}';
Packit 1c1d7e
			g_atomCount=1;
Packit 1c1d7e
			BEGIN( VariableAtom );
Packit 1c1d7e
                      }
Packit 1c1d7e
   "#".*              { // comment
Packit 1c1d7e
                        BEGIN( VariableEnd ); 
Packit 1c1d7e
                      }
Packit 1c1d7e
   {IDENTIFIER}	      {
Packit 1c1d7e
			// do something based on the type of the IDENTIFIER
Packit 1c1d7e
			if (current->type.isEmpty())
Packit 1c1d7e
                        {
Packit 1c1d7e
                          QListIterator<Entry> eli(*(current_root->children()));
Packit 1c1d7e
                          Entry *child;
Packit 1c1d7e
                          for (eli.toFirst();(child=eli.current());++eli)
Packit 1c1d7e
                          {
Packit 1c1d7e
                            if (child->name == QCString(yytext))
Packit 1c1d7e
                            {
Packit 1c1d7e
                               current->type = child->type;
Packit 1c1d7e
                               break;
Packit 1c1d7e
                            }
Packit 1c1d7e
                          }
Packit 1c1d7e
                        }
Packit 1c1d7e
                        g_start_init = FALSE;
Packit 1c1d7e
      		        current->initializer+=yytext;
Packit 1c1d7e
	              }
Packit 1c1d7e
   .		      {
Packit 1c1d7e
                        g_start_init = FALSE;
Packit 1c1d7e
      		        current->initializer+=*yytext;
Packit 1c1d7e
                      }
Packit 1c1d7e
   \n		      {
Packit 1c1d7e
     		        unput('\n');
Packit 1c1d7e
     			BEGIN( VariableEnd );
Packit 1c1d7e
     		      }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
<VariableAtom>{
Packit 1c1d7e
    [\(\[\{]	      {
Packit 1c1d7e
      		        current->initializer+=*yytext;
Packit 1c1d7e
                        if (g_atomStart==*yytext)
Packit 1c1d7e
			{
Packit 1c1d7e
			  g_atomCount++;
Packit 1c1d7e
			}
Packit 1c1d7e
                      }
Packit 1c1d7e
    [\)\]\}]	      {
Packit 1c1d7e
      		        current->initializer+=*yytext;
Packit 1c1d7e
                        if (g_atomEnd==*yytext)
Packit 1c1d7e
			{
Packit 1c1d7e
			  g_atomCount--;
Packit 1c1d7e
			}
Packit 1c1d7e
			if (g_atomCount==0)
Packit 1c1d7e
			{
Packit 1c1d7e
                          g_start_init = FALSE;
Packit 1c1d7e
			  BEGIN(VariableDec);
Packit 1c1d7e
			}
Packit 1c1d7e
                      }
Packit 1c1d7e
    {TRIDOUBLEQUOTE}  { // start of a comment block
Packit 1c1d7e
                        g_specialBlock = FALSE;
Packit 1c1d7e
			current->program+=yytext;
Packit 1c1d7e
			initTriDoubleQuoteBlock();
Packit 1c1d7e
			BEGIN(TripleComment);
Packit 1c1d7e
                      }
Packit 1c1d7e
Packit 1c1d7e
    {TRISINGLEQUOTE}  { // start of a comment block
Packit 1c1d7e
                        g_specialBlock = FALSE;
Packit 1c1d7e
			current->program+=yytext;
Packit 1c1d7e
			initTriSingleQuoteBlock();
Packit 1c1d7e
			BEGIN(TripleComment);
Packit 1c1d7e
                      }
Packit 1c1d7e
   "'"	              {
Packit 1c1d7e
       			g_stringContext=YY_START;
Packit 1c1d7e
			current->initializer+="'";
Packit 1c1d7e
			g_copyString=&current->initializer;
Packit 1c1d7e
                        BEGIN( SingleQuoteString );
Packit 1c1d7e
                      }
Packit 1c1d7e
   "\""	              {
Packit 1c1d7e
       			g_stringContext=YY_START;
Packit 1c1d7e
			current->initializer+="\"";
Packit 1c1d7e
			g_copyString=&current->initializer;
Packit 1c1d7e
                        BEGIN( DoubleQuoteString );
Packit 1c1d7e
                      }
Packit 1c1d7e
   {IDENTIFIER}       {
Packit 1c1d7e
      		        current->initializer+=yytext;
Packit 1c1d7e
	              }
Packit 1c1d7e
   .		      {
Packit 1c1d7e
      		        current->initializer+=*yytext;
Packit 1c1d7e
                      }
Packit 1c1d7e
   \n		      {
Packit 1c1d7e
      		        current->initializer+=*yytext;
Packit 1c1d7e
     			incLineNr();
Packit 1c1d7e
     		      }
Packit 1c1d7e
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
<VariableEnd>{
Packit 1c1d7e
    \n                {
Packit 1c1d7e
                        incLineNr();
Packit 1c1d7e
			newVariable();
Packit 1c1d7e
                        BEGIN(Search);
Packit 1c1d7e
                      }
Packit 1c1d7e
    .		      { 
Packit 1c1d7e
                        unput(*yytext);
Packit 1c1d7e
			newVariable();
Packit 1c1d7e
                        BEGIN(Search);
Packit 1c1d7e
      		      }
Packit 1c1d7e
    <<EOF>>           { yyterminate();
Packit 1c1d7e
                        newEntry();
Packit 1c1d7e
                      }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
<TripleComment>{
Packit 1c1d7e
    {ENDTRIDOUBLEQUOTE}   | 
Packit 1c1d7e
    {ENDTRISINGLEQUOTE}   {
Packit 1c1d7e
			  // printf("Expected module block %d special=%d\n",g_expectModuleDocs,g_specialBlock);
Packit 1c1d7e
			  if (g_doubleQuote==(yytext[0]=='"')) 
Packit 1c1d7e
			  {
Packit 1c1d7e
			    if (g_specialBlock) // expecting a docstring
Packit 1c1d7e
			    {
Packit 1c1d7e
			      QCString actualDoc=docBlock;
Packit 1c1d7e
			      if (!docBlockSpecial) // legacy unformatted docstring
Packit 1c1d7e
			      {
Packit 1c1d7e
			        actualDoc.prepend("\\verbatim ");
Packit 1c1d7e
			        actualDoc.append("\\endverbatim ");
Packit 1c1d7e
			      }
Packit 1c1d7e
			      //printf("-------> current=%p bodyEntry=%p\n",current,bodyEntry);
Packit 1c1d7e
			      handleCommentBlock(actualDoc, FALSE);
Packit 1c1d7e
			    }
Packit 1c1d7e
			    else if (g_packageCommentAllowed) // expecting module docs
Packit 1c1d7e
			    {
Packit 1c1d7e
			      QCString actualDoc=docBlock;
Packit 1c1d7e
			      if (!docBlockSpecial) // legacy unformatted docstring
Packit 1c1d7e
			      {
Packit 1c1d7e
			        actualDoc.prepend("\\verbatim ");
Packit 1c1d7e
			        actualDoc.append("\\endverbatim ");
Packit 1c1d7e
			      }
Packit 1c1d7e
			      actualDoc.prepend("\\namespace "+g_moduleScope+"\\_linebr ");
Packit 1c1d7e
			      handleCommentBlock(actualDoc, FALSE);
Packit 1c1d7e
			    }
Packit 1c1d7e
			    if ((docBlockContext==ClassBody /*&& !g_hideClassDocs*/) ||
Packit 1c1d7e
				docBlockContext==FunctionBody)
Packit 1c1d7e
			    {
Packit 1c1d7e
			      current->program+=docBlock;
Packit 1c1d7e
			      current->program+=yytext;
Packit 1c1d7e
			    }
Packit 1c1d7e
                            //if (g_hideClassDocs)
Packit 1c1d7e
			    //{
Packit 1c1d7e
                            //  current->startLine = yyLineNr;
Packit 1c1d7e
			    //}
Packit 1c1d7e
			    //g_hideClassDocs=FALSE;
Packit 1c1d7e
			    BEGIN(docBlockContext);
Packit 1c1d7e
			  }
Packit 1c1d7e
                          else 
Packit 1c1d7e
			  {
Packit 1c1d7e
                            docBlock += yytext;
Packit 1c1d7e
                          }
Packit 1c1d7e
			  g_packageCommentAllowed = FALSE;
Packit 1c1d7e
                        }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
    ^{BB}		{ // leading whitespace
Packit 1c1d7e
      			  int indent = computeIndent(yytext);
Packit 1c1d7e
			  if (indent>=g_curIndent)
Packit 1c1d7e
			  { // strip g_curIndent amount of whitespace
Packit 1c1d7e
			    int i;
Packit 1c1d7e
			    for (i=0;i
Packit 1c1d7e
			    DBG_CTX((stderr,"stripping indent %d\n",g_curIndent));
Packit 1c1d7e
			  }
Packit 1c1d7e
			  else
Packit 1c1d7e
			  {
Packit 1c1d7e
			    DBG_CTX((stderr,"not stripping: %d<%d\n",indent,g_curIndent));
Packit 1c1d7e
			    docBlock += yytext;
Packit 1c1d7e
			  }
Packit 1c1d7e
      			}
Packit 1c1d7e
    [^"'\n \t\\]+       {
Packit 1c1d7e
			  docBlock += yytext;
Packit 1c1d7e
                        }
Packit 1c1d7e
    \n			{
Packit 1c1d7e
      			  incLineNr();
Packit 1c1d7e
			  docBlock += yytext;
Packit 1c1d7e
      			}
Packit 1c1d7e
    \\.		        { // espaced char
Packit 1c1d7e
			  docBlock += yytext;
Packit 1c1d7e
      			}
Packit 1c1d7e
    .			{
Packit 1c1d7e
			  docBlock += yytext;
Packit 1c1d7e
      			}
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
<SpecialComment>{
Packit 1c1d7e
    ^{B}"#"("#")*	{ // skip leading hashes
Packit 1c1d7e
      			}
Packit 1c1d7e
    \n/{B}"#"		{ // continuation of the comment on the next line
Packit 1c1d7e
      			  docBlock+='\n';
Packit 1c1d7e
			  docBrief = FALSE;
Packit 1c1d7e
                          startCommentBlock(FALSE);
Packit 1c1d7e
			  incLineNr();
Packit 1c1d7e
      			}
Packit 1c1d7e
    [^#\n]+             { // any other stuff
Packit 1c1d7e
      			  docBlock+=yytext;
Packit 1c1d7e
      			}
Packit 1c1d7e
    \n			{ // new line that ends the comment
Packit 1c1d7e
			  handleCommentBlock(docBlock, docBrief);
Packit 1c1d7e
      			  incLineNr();
Packit 1c1d7e
			  BEGIN(docBlockContext);
Packit 1c1d7e
      			}
Packit 1c1d7e
    .			{ // anything we missed
Packit 1c1d7e
      			  docBlock+=*yytext;
Packit 1c1d7e
      			}
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
<SingleQuoteString>{
Packit 1c1d7e
    \\{B}\n                    { // line continuation
Packit 1c1d7e
      			         addToString(yytext);
Packit 1c1d7e
      				 incLineNr();
Packit 1c1d7e
                               }
Packit 1c1d7e
    \\.			       { // espaced char
Packit 1c1d7e
      			         addToString(yytext);
Packit 1c1d7e
                               }
Packit 1c1d7e
    "\"\"\""		       { // tripple double quotes
Packit 1c1d7e
      			         addToString(yytext);
Packit 1c1d7e
      			       }
Packit 1c1d7e
    "'"			       { // end of the string
Packit 1c1d7e
      			         addToString(yytext);
Packit 1c1d7e
      		                 BEGIN(g_stringContext);
Packit 1c1d7e
                               }
Packit 1c1d7e
    [^"'\n\\]+	               { // normal chars
Packit 1c1d7e
      			         addToString(yytext);
Packit 1c1d7e
                               }
Packit 1c1d7e
    .			       { // normal char
Packit 1c1d7e
      			         addToString(yytext);
Packit 1c1d7e
                               }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
<DoubleQuoteString>{
Packit 1c1d7e
    \\{B}\n                    { // line continuation
Packit 1c1d7e
      			         addToString(yytext);
Packit 1c1d7e
      				 incLineNr();
Packit 1c1d7e
                               }
Packit 1c1d7e
    \\.			       { // espaced char
Packit 1c1d7e
      			         addToString(yytext);
Packit 1c1d7e
                               }
Packit 1c1d7e
    "'''"		       { // tripple single quotes
Packit 1c1d7e
      			         addToString(yytext);
Packit 1c1d7e
      			       }
Packit 1c1d7e
    "\""		       { // end of the string
Packit 1c1d7e
      			         addToString(yytext);
Packit 1c1d7e
      		                 BEGIN(g_stringContext);
Packit 1c1d7e
                               }
Packit 1c1d7e
    [^"'\n\\]+	               { // normal chars
Packit 1c1d7e
      			         addToString(yytext);
Packit 1c1d7e
                               }
Packit 1c1d7e
    .			       { // normal char
Packit 1c1d7e
      			         addToString(yytext);
Packit 1c1d7e
                               }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
<TripleString>{
Packit 1c1d7e
    {ENDTRIDOUBLEQUOTE}    | 
Packit 1c1d7e
    {ENDTRISINGLEQUOTE}    {
Packit 1c1d7e
                          *g_copyString += yytext;
Packit 1c1d7e
			  if (g_doubleQuote==(yytext[0]=='"')) 
Packit 1c1d7e
			  {
Packit 1c1d7e
			    BEGIN(g_stringContext);
Packit 1c1d7e
			  }
Packit 1c1d7e
                        }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
    ({LONGSTRINGBLOCK}) {
Packit 1c1d7e
			  lineCount();
Packit 1c1d7e
                          *g_copyString += yytext;
Packit 1c1d7e
                        }
Packit 1c1d7e
    \n			{
Packit 1c1d7e
      			  incLineNr();
Packit 1c1d7e
                          *g_copyString += yytext;
Packit 1c1d7e
      			}
Packit 1c1d7e
    .			{
Packit 1c1d7e
                          *g_copyString += *yytext;
Packit 1c1d7e
      			}
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
  /* ------------ End rules -------------- */
Packit 1c1d7e
Packit 1c1d7e
  /*
Packit 1c1d7e
<*>({NONEMPTY}|{EXPCHAR}|{BB})           { // This should go one character at a time.
Packit 1c1d7e
				 // printf("[pyscanner] '%s' [ state %d ]  [line %d] no match\n",
Packit 1c1d7e
				 //       yytext, YY_START, yyLineNr);
Packit 1c1d7e
Packit 1c1d7e
                               }
Packit 1c1d7e
  */
Packit 1c1d7e
Packit 1c1d7e
<*>{NEWLINE}                   {
Packit 1c1d7e
				 //printf("[pyscanner] %d NEWLINE [line %d] no match\n",
Packit 1c1d7e
				 //       YY_START, yyLineNr);
Packit 1c1d7e
Packit 1c1d7e
                                 lineCount();
Packit 1c1d7e
                               }
Packit 1c1d7e
Packit 1c1d7e
<*>.                           {
Packit 1c1d7e
				 //printf("[pyscanner] '%s' [ state %d ]  [line %d] no match\n",
Packit 1c1d7e
				 //       yytext, YY_START, yyLineNr);
Packit 1c1d7e
Packit 1c1d7e
                               }
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
%%
Packit 1c1d7e
Packit 1c1d7e
//----------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
static void parseCompounds(Entry *rt)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("parseCompounds(%s)\n",rt->name.data());
Packit 1c1d7e
  EntryListIterator eli(*rt->children());
Packit 1c1d7e
  Entry *ce;
Packit 1c1d7e
  for (;(ce=eli.current());++eli)
Packit 1c1d7e
  {
Packit 1c1d7e
    if (!ce->program.isEmpty())
Packit 1c1d7e
    {
Packit 1c1d7e
      //printf("-- %s ---------\n%s\n---------------\n",
Packit 1c1d7e
      //  ce->name.data(),ce->program.data());
Packit 1c1d7e
      // init scanner state
Packit 1c1d7e
      inputString = ce->program;
Packit 1c1d7e
      inputPosition = 0;
Packit 1c1d7e
      pyscannerYYrestart( pyscannerYYin ) ;
Packit 1c1d7e
      if (ce->section&Entry::COMPOUND_MASK)
Packit 1c1d7e
      {
Packit 1c1d7e
        current_root = ce ;
Packit 1c1d7e
        BEGIN( Search );
Packit 1c1d7e
      }
Packit 1c1d7e
      else if (ce->parent())
Packit 1c1d7e
      {
Packit 1c1d7e
        current_root = ce->parent();
Packit 1c1d7e
	//printf("Searching for member variables in %s parent=%s\n",
Packit 1c1d7e
	//    ce->name.data(),ce->parent->name.data());
Packit 1c1d7e
	BEGIN( SearchMemVars );
Packit 1c1d7e
      }
Packit 1c1d7e
      yyFileName = ce->fileName;
Packit 1c1d7e
      yyLineNr   = ce->bodyLine ;
Packit 1c1d7e
      if (current) delete current;
Packit 1c1d7e
      current = new Entry;
Packit 1c1d7e
      initEntry();
Packit 1c1d7e
Packit 1c1d7e
      groupEnterCompound(yyFileName,yyLineNr,ce->name);
Packit 1c1d7e
      
Packit 1c1d7e
      pyscannerYYlex() ;
Packit 1c1d7e
      g_lexInit=TRUE;
Packit 1c1d7e
      delete current; current=0;
Packit 1c1d7e
      ce->program.resize(0);
Packit 1c1d7e
Packit 1c1d7e
      groupLeaveCompound(yyFileName,yyLineNr,ce->name);
Packit 1c1d7e
Packit 1c1d7e
    }
Packit 1c1d7e
    parseCompounds(ce);
Packit 1c1d7e
  }
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//----------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
Packit 1c1d7e
{
Packit 1c1d7e
  initParser();
Packit 1c1d7e
Packit 1c1d7e
  inputString = fileBuf;
Packit 1c1d7e
  inputPosition = 0;
Packit 1c1d7e
Packit 1c1d7e
  protection    = Public;
Packit 1c1d7e
  mtype         = Method;
Packit 1c1d7e
  gstat         = FALSE;
Packit 1c1d7e
  virt          = Normal;
Packit 1c1d7e
  current_root  = rt;
Packit 1c1d7e
  g_specialBlock = FALSE;
Packit 1c1d7e
Packit 1c1d7e
Packit 1c1d7e
  inputFile.setName(fileName);
Packit 1c1d7e
  if (inputFile.open(IO_ReadOnly))
Packit 1c1d7e
  {
Packit 1c1d7e
    yyLineNr= 1 ; 
Packit 1c1d7e
    yyFileName = fileName;
Packit 1c1d7e
    //setContext();
Packit 1c1d7e
    msg("Parsing file %s...\n",yyFileName.data());
Packit 1c1d7e
Packit 1c1d7e
    QFileInfo fi(fileName);
Packit 1c1d7e
    g_moduleScope = findPackageScope(fileName);
Packit 1c1d7e
    QCString baseName=fi.baseName().utf8();
Packit 1c1d7e
    if (baseName!="__init__") // package initializer file is not a package itself
Packit 1c1d7e
    {
Packit 1c1d7e
      if (!g_moduleScope.isEmpty())
Packit 1c1d7e
      {
Packit 1c1d7e
	g_moduleScope+="::";
Packit 1c1d7e
      }
Packit 1c1d7e
      g_moduleScope+=baseName;
Packit 1c1d7e
    }
Packit 1c1d7e
Packit 1c1d7e
    current            = new Entry;
Packit 1c1d7e
    initEntry();
Packit 1c1d7e
    current->name      = g_moduleScope;
Packit 1c1d7e
    current->section   = Entry::NAMESPACE_SEC;
Packit 1c1d7e
    current->type      = "namespace";
Packit 1c1d7e
    current->fileName  = yyFileName;
Packit 1c1d7e
    current->startLine = yyLineNr;
Packit 1c1d7e
    current->bodyLine  = yyLineNr;
Packit 1c1d7e
Packit 1c1d7e
    rt->addSubEntry(current);
Packit 1c1d7e
Packit 1c1d7e
    current_root  = current ;
Packit 1c1d7e
    initParser();
Packit 1c1d7e
    current       = new Entry;
Packit 1c1d7e
Packit 1c1d7e
    groupEnterFile(yyFileName,yyLineNr);
Packit 1c1d7e
    
Packit 1c1d7e
    current->reset();
Packit 1c1d7e
    initEntry();
Packit 1c1d7e
    pyscannerYYrestart( pyscannerYYin );
Packit 1c1d7e
    BEGIN( Search );
Packit 1c1d7e
    pyscannerYYlex();
Packit 1c1d7e
    g_lexInit=TRUE;
Packit 1c1d7e
Packit 1c1d7e
    groupLeaveFile(yyFileName,yyLineNr);
Packit 1c1d7e
Packit 1c1d7e
    current_root->program.resize(0);
Packit 1c1d7e
    delete current; current=0;
Packit 1c1d7e
Packit 1c1d7e
    parseCompounds(current_root);
Packit 1c1d7e
Packit 1c1d7e
    inputFile.close();
Packit 1c1d7e
  }
Packit 1c1d7e
  
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//----------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
static void parsePrototype(const QCString &text)
Packit 1c1d7e
{
Packit 1c1d7e
  //printf("**** parsePrototype(%s) begin\n",text.data());
Packit 1c1d7e
  if (text.isEmpty()) 
Packit 1c1d7e
  {
Packit 1c1d7e
    warn(yyFileName,yyLineNr,"Empty prototype found!");
Packit 1c1d7e
    return;
Packit 1c1d7e
  }
Packit 1c1d7e
Packit 1c1d7e
  g_specialBlock = FALSE;
Packit 1c1d7e
  g_packageCommentAllowed = FALSE;
Packit 1c1d7e
Packit 1c1d7e
  const char *orgInputString;
Packit 1c1d7e
  int orgInputPosition;
Packit 1c1d7e
  YY_BUFFER_STATE orgState;
Packit 1c1d7e
  
Packit 1c1d7e
  // save scanner state
Packit 1c1d7e
  orgState = YY_CURRENT_BUFFER;
Packit 1c1d7e
  yy_switch_to_buffer(yy_create_buffer(pyscannerYYin, YY_BUF_SIZE));
Packit 1c1d7e
  orgInputString = inputString; 
Packit 1c1d7e
  orgInputPosition = inputPosition;
Packit 1c1d7e
Packit 1c1d7e
  // set new string
Packit 1c1d7e
  inputString = text;
Packit 1c1d7e
  inputPosition = 0;
Packit 1c1d7e
  pyscannerYYrestart( pyscannerYYin );
Packit 1c1d7e
Packit 1c1d7e
  BEGIN( FunctionDec );
Packit 1c1d7e
Packit 1c1d7e
  pyscannerYYlex();
Packit 1c1d7e
  g_lexInit=TRUE;
Packit 1c1d7e
Packit 1c1d7e
  current->name = current->name.stripWhiteSpace();
Packit 1c1d7e
  if (current->section == Entry::MEMBERDOC_SEC && current->args.isEmpty())
Packit 1c1d7e
    current->section = Entry::VARIABLEDOC_SEC;
Packit 1c1d7e
Packit 1c1d7e
  // restore original scanner state
Packit 1c1d7e
Packit 1c1d7e
  YY_BUFFER_STATE tmpBuf = YY_CURRENT_BUFFER;
Packit 1c1d7e
  yy_switch_to_buffer(orgState);
Packit 1c1d7e
  yy_delete_buffer(tmpBuf);
Packit 1c1d7e
Packit 1c1d7e
  inputString = orgInputString; 
Packit 1c1d7e
  inputPosition = orgInputPosition;
Packit 1c1d7e
Packit 1c1d7e
  //printf("**** parsePrototype end\n");
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void pyscanFreeScanner()
Packit 1c1d7e
{
Packit 1c1d7e
#if defined(YY_FLEX_SUBMINOR_VERSION) 
Packit 1c1d7e
  if (g_lexInit)
Packit 1c1d7e
  {
Packit 1c1d7e
    pyscannerYYlex_destroy();
Packit 1c1d7e
  }
Packit 1c1d7e
#endif
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//----------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
void PythonLanguageScanner::parseInput(const char *fileName,
Packit 1c1d7e
                                       const char *fileBuf,
Packit 1c1d7e
                                       Entry *root,
Packit 1c1d7e
                                       bool /*sameTranslationUnit*/,
Packit 1c1d7e
                                       QStrList & /*filesInSameTranslationUnit*/)
Packit 1c1d7e
{
Packit 1c1d7e
  g_thisParser = this;
Packit 1c1d7e
  printlex(yy_flex_debug, TRUE, __FILE__, fileName);
Packit 1c1d7e
  ::parseMain(fileName,fileBuf,root);
Packit 1c1d7e
  printlex(yy_flex_debug, FALSE, __FILE__, fileName);
Packit 1c1d7e
Packit 1c1d7e
  // May print the AST for debugging purposes
Packit 1c1d7e
  // printAST(global_root);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
bool PythonLanguageScanner::needsPreprocessing(const QCString &)
Packit 1c1d7e
{
Packit 1c1d7e
  return FALSE;
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void PythonLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf,
Packit 1c1d7e
    const char *scopeName,
Packit 1c1d7e
    const QCString &input,
Packit 1c1d7e
    SrcLangExt /*lang*/,
Packit 1c1d7e
    bool isExampleBlock,
Packit 1c1d7e
    const char *exampleName,
Packit 1c1d7e
    FileDef *fileDef,
Packit 1c1d7e
    int startLine,
Packit 1c1d7e
    int endLine,
Packit 1c1d7e
    bool inlineFragment,
Packit 1c1d7e
    MemberDef *memberDef,
Packit 1c1d7e
    bool showLineNumbers,
Packit 1c1d7e
    Definition *searchCtx,
Packit 1c1d7e
    bool collectXRefs
Packit 1c1d7e
    )
Packit 1c1d7e
{
Packit 1c1d7e
  ::parsePythonCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
Packit 1c1d7e
                    fileDef,startLine,endLine,inlineFragment,memberDef,
Packit 1c1d7e
                    showLineNumbers,searchCtx,collectXRefs);
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void PythonLanguageScanner::parsePrototype(const char *text)
Packit 1c1d7e
{
Packit 1c1d7e
  ::parsePrototype(text);
Packit 1c1d7e
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
void PythonLanguageScanner::resetCodeParserState()
Packit 1c1d7e
{
Packit 1c1d7e
  ::resetPythonCodeParserState();
Packit 1c1d7e
}
Packit 1c1d7e
Packit 1c1d7e
//----------------------------------------------------------------------------
Packit 1c1d7e
Packit 1c1d7e
#if !defined(YY_FLEX_SUBMINOR_VERSION) 
Packit 1c1d7e
//----------------------------------------------------------------------------
Packit 1c1d7e
extern "C" { // some bogus code to keep the compiler happy
Packit 1c1d7e
  void pyscannerYYdummy() { yy_flex_realloc(0,0); } 
Packit 1c1d7e
}
Packit 1c1d7e
#endif
Packit 1c1d7e