|
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=¤t->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=¤t->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=¤t->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=¤t->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=¤t->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=¤t->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=¤t->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=¤t->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=¤t->initializer;
|
|
Packit |
1c1d7e |
BEGIN( SingleQuoteString );
|
|
Packit |
1c1d7e |
}
|
|
Packit |
1c1d7e |
"\"" {
|
|
Packit |
1c1d7e |
g_stringContext=YY_START;
|
|
Packit |
1c1d7e |
current->initializer+="\"";
|
|
Packit |
1c1d7e |
g_copyString=¤t->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 |
|