Blame src/pycode.l

Packit Service 50c9f2
/******************************************************************************
Packit Service 50c9f2
 *
Packit Service 50c9f2
 * 
Packit Service 50c9f2
 *
Packit Service 50c9f2
 * Copyright (C) 1997-2015 by Dimitri van Heesch.
Packit Service 50c9f2
 *
Packit Service 50c9f2
 * Permission to use, copy, modify, and distribute this software and its
Packit Service 50c9f2
 * documentation under the terms of the GNU General Public License is hereby 
Packit Service 50c9f2
 * granted. No representations are made about the suitability of this software 
Packit Service 50c9f2
 * for any purpose. It is provided "as is" without express or implied warranty.
Packit Service 50c9f2
 * See the GNU General Public License for more details.
Packit Service 50c9f2
 *
Packit Service 50c9f2
 * Documents produced by Doxygen are derivative works derived from the
Packit Service 50c9f2
 * input used in their production; they are not affected by this license.
Packit Service 50c9f2
 *
Packit Service 50c9f2
 */
Packit Service 50c9f2
/*  This code is based on the work done by the MoxyPyDoxy team
Packit Service 50c9f2
 *  (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada)
Packit Service 50c9f2
 *  in Spring 2005 as part of CS 179E: Compiler Design Project
Packit Service 50c9f2
 *  at the University of California, Riverside; the course was
Packit Service 50c9f2
 *  taught by Peter H. Froehlich <phf@acm.org>.
Packit Service 50c9f2
 */
Packit Service 50c9f2
Packit Service 50c9f2
%option never-interactive
Packit Service 50c9f2
%option prefix="pycodeYY"
Packit Service 50c9f2
Packit Service 50c9f2
%{
Packit Service 50c9f2
Packit Service 50c9f2
#include <stdio.h>
Packit Service 50c9f2
#include <qvaluestack.h>
Packit Service 50c9f2
Packit Service 50c9f2
#include "pycode.h"
Packit Service 50c9f2
#include "message.h"
Packit Service 50c9f2
Packit Service 50c9f2
#include "scanner.h"
Packit Service 50c9f2
#include "entry.h"
Packit Service 50c9f2
#include "doxygen.h"
Packit Service 50c9f2
#include "outputlist.h"
Packit Service 50c9f2
#include "util.h"
Packit Service 50c9f2
#include "membername.h"
Packit Service 50c9f2
#include "searchindex.h"
Packit Service 50c9f2
#include "config.h"
Packit Service 50c9f2
#include "groupdef.h"
Packit Service 50c9f2
#include "classlist.h"
Packit Service 50c9f2
#include "filedef.h"
Packit Service 50c9f2
#include "namespacedef.h"
Packit Service 50c9f2
#include "tooltip.h"
Packit Service 50c9f2
Packit Service 50c9f2
// Toggle for some debugging info
Packit Service 50c9f2
//#define DBG_CTX(x) fprintf x
Packit Service 50c9f2
#define DBG_CTX(x) do { } while(0)
Packit Service 50c9f2
Packit Service 50c9f2
#define YY_NO_INPUT 1
Packit Service 50c9f2
#define YY_NO_UNISTD_H 1
Packit Service 50c9f2
Packit Service 50c9f2
static ClassSDict    g_codeClassSDict(17);
Packit Service 50c9f2
static QCString      g_curClassName;
Packit Service 50c9f2
static QStrList      g_curClassBases;
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
static CodeOutputInterface * g_code;
Packit Service 50c9f2
static const char *  g_inputString;     //!< the code fragment as text
Packit Service 50c9f2
static int	     g_inputPosition;   //!< read offset during parsing 
Packit Service 50c9f2
static const char *  g_currentFontClass;
Packit Service 50c9f2
static bool          g_needsTermination;
Packit Service 50c9f2
static Definition   *g_searchCtx;
Packit Service 50c9f2
static bool          g_collectXRefs;
Packit Service 50c9f2
static int           g_inputLines;      //!< number of line in the code fragment
Packit Service 50c9f2
static int	     g_yyLineNr;        //!< current line number
Packit Service 50c9f2
static FileDef *     g_sourceFileDef;
Packit Service 50c9f2
static Definition *  g_currentDefinition;
Packit Service 50c9f2
static MemberDef *   g_currentMemberDef;
Packit Service 50c9f2
static bool          g_includeCodeFragment;
Packit Service 50c9f2
static QCString      g_realScope;
Packit Service 50c9f2
//static bool          g_insideBody;
Packit Service 50c9f2
static int           g_bodyCurlyCount;
Packit Service 50c9f2
static bool          g_searchingForBody;
Packit Service 50c9f2
static QCString      g_classScope;
Packit Service 50c9f2
static int           g_paramParens;
Packit Service 50c9f2
//static int           g_anchorCount;
Packit Service 50c9f2
Packit Service 50c9f2
static bool          g_exampleBlock;
Packit Service 50c9f2
static QCString      g_exampleName;
Packit Service 50c9f2
Packit Service 50c9f2
static QCString      g_type;
Packit Service 50c9f2
static QCString      g_name;
Packit Service 50c9f2
Packit Service 50c9f2
static bool          g_doubleStringIsDoc;
Packit Service 50c9f2
static bool          g_doubleQuote;
Packit Service 50c9f2
static bool          g_noSuiteFound;
Packit Service 50c9f2
static int           g_stringContext;
Packit Service 50c9f2
Packit Service 50c9f2
static QValueStack<uint> g_indents;  //!< Tracks indentation levels for scoping in python
Packit Service 50c9f2
Packit Service 50c9f2
static QCString      g_docBlock;     //!< contents of all lines of a documentation block
Packit Service 50c9f2
static bool          g_endComment;
Packit Service 50c9f2
Packit Service 50c9f2
static void endFontClass();
Packit Service 50c9f2
static void adjustScopesAndSuites(unsigned indentLength);
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
/*! Represents a stack of variable to class mappings as found in the
Packit Service 50c9f2
 *  code. Each scope is enclosed in pushScope() and popScope() calls.
Packit Service 50c9f2
 *  Variables are added by calling addVariables() and one can search
Packit Service 50c9f2
 *  for variable using findVariable().
Packit Service 50c9f2
 */
Packit Service 50c9f2
class PyVariableContext 
Packit Service 50c9f2
{
Packit Service 50c9f2
  public:
Packit Service 50c9f2
    static const ClassDef *dummyContext;    
Packit Service 50c9f2
    class Scope : public SDict<ClassDef> 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      public:
Packit Service 50c9f2
	Scope() : SDict<ClassDef>(17) {}
Packit Service 50c9f2
    };
Packit Service 50c9f2
    
Packit Service 50c9f2
    PyVariableContext() 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_scopes.setAutoDelete(TRUE);
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    virtual ~PyVariableContext() 
Packit Service 50c9f2
    {
Packit Service 50c9f2
    }
Packit Service 50c9f2
    
Packit Service 50c9f2
    void pushScope() 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_scopes.append(new Scope);
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    void popScope() 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (m_scopes.count()>0) 
Packit Service 50c9f2
      {
Packit Service 50c9f2
	m_scopes.remove(m_scopes.count()-1);
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    void clear() 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_scopes.clear();
Packit Service 50c9f2
      m_globalScope.clear();
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    void clearExceptGlobal() 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_scopes.clear();
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    void addVariable(const QCString &type,const QCString &name);
Packit Service 50c9f2
    ClassDef *findVariable(const QCString &name);
Packit Service 50c9f2
    
Packit Service 50c9f2
  private:
Packit Service 50c9f2
    Scope        m_globalScope;
Packit Service 50c9f2
    QList<Scope> m_scopes;
Packit Service 50c9f2
};
Packit Service 50c9f2
Packit Service 50c9f2
void PyVariableContext::addVariable(const QCString &type,const QCString &name)
Packit Service 50c9f2
{
Packit Service 50c9f2
  //printf("PyVariableContext::addVariable(%s,%s)\n",type.data(),name.data());
Packit Service 50c9f2
  QCString ltype = type.simplifyWhiteSpace();
Packit Service 50c9f2
  QCString lname = name.simplifyWhiteSpace();
Packit Service 50c9f2
Packit Service 50c9f2
  Scope *scope = m_scopes.count()==0 ? &m_globalScope : m_scopes.getLast();
Packit Service 50c9f2
  ClassDef *varType;
Packit Service 50c9f2
  if (
Packit Service 50c9f2
      (varType=g_codeClassSDict[ltype]) ||  // look for class definitions inside the code block
Packit Service 50c9f2
      (varType=getResolvedClass(g_currentDefinition,g_sourceFileDef,ltype)) // look for global class definitions
Packit Service 50c9f2
     ) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    scope->append(lname,varType); // add it to a list
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (m_scopes.count()>0) // for local variables add a dummy entry so the name 
Packit Service 50c9f2
                            // is hidden to avoid FALSE links to global variables with the same name
Packit Service 50c9f2
                            // TODO: make this work for namespaces as well!
Packit Service 50c9f2
    {
Packit Service 50c9f2
      scope->append(lname,dummyContext);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
ClassDef *PyVariableContext::findVariable(const QCString &name)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (name.isEmpty()) return 0;
Packit Service 50c9f2
  ClassDef *result = 0;
Packit Service 50c9f2
  QListIterator<Scope> sli(m_scopes);
Packit Service 50c9f2
  Scope *scope;
Packit Service 50c9f2
  // search from inner to outer scope
Packit Service 50c9f2
  for (sli.toLast();(scope=sli.current());--sli)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    result = scope->find(name);
Packit Service 50c9f2
    if (result) 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      return result;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  // nothing found -> also try the global scope
Packit Service 50c9f2
  result=m_globalScope.find(name);
Packit Service 50c9f2
  return result;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static PyVariableContext g_theVarContext;
Packit Service 50c9f2
const ClassDef *PyVariableContext::dummyContext = (ClassDef*)0x8;
Packit Service 50c9f2
Packit Service 50c9f2
class PyCallContext
Packit Service 50c9f2
{
Packit Service 50c9f2
  public:
Packit Service 50c9f2
    struct Ctx
Packit Service 50c9f2
    {
Packit Service 50c9f2
      Ctx() : name(g_name), type(g_type), cd(0) {}
Packit Service 50c9f2
      QCString name;
Packit Service 50c9f2
      QCString type;
Packit Service 50c9f2
      ClassDef *cd;
Packit Service 50c9f2
    };
Packit Service 50c9f2
Packit Service 50c9f2
    PyCallContext() 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_classList.append(new Ctx);
Packit Service 50c9f2
      m_classList.setAutoDelete(TRUE);
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    virtual ~PyCallContext() {}
Packit Service 50c9f2
Packit Service 50c9f2
    void setClass(ClassDef *cd)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      Ctx *ctx = m_classList.getLast();
Packit Service 50c9f2
      if (ctx) 
Packit Service 50c9f2
      {
Packit Service 50c9f2
        ctx->cd=cd;
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    void pushScope()
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_classList.append(new Ctx);
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    void popScope()
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (m_classList.count()>1)
Packit Service 50c9f2
      {
Packit Service 50c9f2
	Ctx *ctx = m_classList.getLast();
Packit Service 50c9f2
	if (ctx)
Packit Service 50c9f2
	{
Packit Service 50c9f2
	  g_name = ctx->name;
Packit Service 50c9f2
	  g_type = ctx->type;
Packit Service 50c9f2
	}
Packit Service 50c9f2
	m_classList.removeLast();
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else
Packit Service 50c9f2
      {
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    void clear()
Packit Service 50c9f2
    {
Packit Service 50c9f2
      m_classList.clear();
Packit Service 50c9f2
      m_classList.append(new Ctx);
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
    ClassDef *getClass() const
Packit Service 50c9f2
    {
Packit Service 50c9f2
      Ctx *ctx = m_classList.getLast();
Packit Service 50c9f2
Packit Service 50c9f2
      if (ctx)
Packit Service 50c9f2
        return ctx->cd;
Packit Service 50c9f2
      else
Packit Service 50c9f2
        return 0;
Packit Service 50c9f2
    }
Packit Service 50c9f2
Packit Service 50c9f2
  private:
Packit Service 50c9f2
    QList<Ctx> m_classList;    
Packit Service 50c9f2
};
Packit Service 50c9f2
Packit Service 50c9f2
static PyCallContext g_theCallContext;
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
/*! counts the number of lines in the input */
Packit Service 50c9f2
static int countLines()
Packit Service 50c9f2
{
Packit Service 50c9f2
  const char *p=g_inputString;
Packit Service 50c9f2
  char c;
Packit Service 50c9f2
  int count=1;
Packit Service 50c9f2
  while ((c=*p)) 
Packit Service 50c9f2
  { 
Packit Service 50c9f2
    p++ ; 
Packit Service 50c9f2
    if (c=='\n') count++;  
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (p>g_inputString && *(p-1)!='\n') 
Packit Service 50c9f2
  { // last line does not end with a \n, so we add an extra
Packit Service 50c9f2
    // line and explicitly terminate the line after parsing.
Packit Service 50c9f2
    count++, 
Packit Service 50c9f2
    g_needsTermination=TRUE; 
Packit Service 50c9f2
  } 
Packit Service 50c9f2
  return count;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void setCurrentDoc(const QCString &anchor)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (Doxygen::searchIndex)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (g_searchCtx)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      Doxygen::searchIndex->setCurrentDoc(g_searchCtx,g_searchCtx->anchor(),FALSE);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      Doxygen::searchIndex->setCurrentDoc(g_sourceFileDef,anchor,TRUE);
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void addToSearchIndex(const char *text)
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (Doxygen::searchIndex)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    Doxygen::searchIndex->addWord(text,FALSE);
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
static ClassDef *stripClassName(const char *s,Definition *d=g_currentDefinition)
Packit Service 50c9f2
{
Packit Service 50c9f2
  int pos=0;
Packit Service 50c9f2
  QCString type = s;
Packit Service 50c9f2
  QCString className;
Packit Service 50c9f2
  QCString templSpec;
Packit Service 50c9f2
  while (extractClassNameFromType(type,pos,className,templSpec)!=-1)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    QCString clName=className+templSpec;
Packit Service 50c9f2
Packit Service 50c9f2
    ClassDef *cd=0;
Packit Service 50c9f2
    if (!g_classScope.isEmpty())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      cd=getResolvedClass(d,g_sourceFileDef,g_classScope+"::"+clName);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (cd==0)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      cd=getResolvedClass(d,g_sourceFileDef,clName);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    if (cd)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      return cd;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  return 0;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
/*! start a new line of code, inserting a line number if g_sourceFileDef
Packit Service 50c9f2
 * is TRUE. If a definition starts at the current line, then the line
Packit Service 50c9f2
 * number is linked to the documentation of that definition.
Packit Service 50c9f2
 */
Packit Service 50c9f2
static void startCodeLine()
Packit Service 50c9f2
{
Packit Service 50c9f2
  //if (g_currentFontClass) { g_code->endFontClass(); }
Packit Service 50c9f2
  if (g_sourceFileDef)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    //QCString lineNumber,lineAnchor;
Packit Service 50c9f2
    //lineNumber.sprintf("%05d",g_yyLineNr);
Packit Service 50c9f2
    //lineAnchor.sprintf("l%05d",g_yyLineNr);
Packit Service 50c9f2
   
Packit Service 50c9f2
    Definition *d   = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
Packit Service 50c9f2
    //printf("startCodeLine %d d=%p\n",g_yyLineNr,d);
Packit Service 50c9f2
    //g_code->startLineNumber();
Packit Service 50c9f2
Packit Service 50c9f2
    if (!g_includeCodeFragment && d && d->isLinkableInProject())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      g_currentDefinition = d;
Packit Service 50c9f2
      g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
Packit Service 50c9f2
      //g_insideBody = FALSE;
Packit Service 50c9f2
      g_endComment = FALSE;
Packit Service 50c9f2
      g_searchingForBody = TRUE;
Packit Service 50c9f2
      g_realScope = d->name().copy();
Packit Service 50c9f2
      g_classScope = d->name().copy();
Packit Service 50c9f2
      //printf("Real scope: `%s'\n",g_realScope.data());
Packit Service 50c9f2
      g_bodyCurlyCount = 0;
Packit Service 50c9f2
      QCString lineAnchor;
Packit Service 50c9f2
      lineAnchor.sprintf("l%05d",g_yyLineNr);
Packit Service 50c9f2
      if (g_currentMemberDef)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        g_code->writeLineNumber(g_currentMemberDef->getReference(),
Packit Service 50c9f2
	                        g_currentMemberDef->getOutputFileBase(),
Packit Service 50c9f2
	                        g_currentMemberDef->anchor(),g_yyLineNr);
Packit Service 50c9f2
        setCurrentDoc(lineAnchor);
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else
Packit Service 50c9f2
      {
Packit Service 50c9f2
        g_code->writeLineNumber(d->getReference(),
Packit Service 50c9f2
	                        d->getOutputFileBase(),
Packit Service 50c9f2
	                        0,g_yyLineNr);
Packit Service 50c9f2
        setCurrentDoc(lineAnchor);
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      //g_code->codify(lineNumber);
Packit Service 50c9f2
      g_code->writeLineNumber(0,0,0,g_yyLineNr);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    //g_code->endLineNumber();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  g_code->startCodeLine(g_sourceFileDef); 
Packit Service 50c9f2
  if (g_currentFontClass)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    g_code->startFontClass(g_currentFontClass);
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void codify(const char* text) 
Packit Service 50c9f2
{ 
Packit Service 50c9f2
  g_code->codify(text);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void endCodeLine()
Packit Service 50c9f2
{
Packit Service 50c9f2
  endFontClass();
Packit Service 50c9f2
  g_code->endCodeLine();
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void nextCodeLine()
Packit Service 50c9f2
{
Packit Service 50c9f2
  const char *fc = g_currentFontClass;
Packit Service 50c9f2
  endCodeLine();
Packit Service 50c9f2
  if (g_yyLineNr
Packit Service 50c9f2
  {
Packit Service 50c9f2
    g_currentFontClass = fc;
Packit Service 50c9f2
    startCodeLine();
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
/*! writes a link to a fragment \a text that may span multiple lines, inserting
Packit Service 50c9f2
 * line numbers for each line. If \a text contains newlines, the link will be 
Packit Service 50c9f2
 * split into multiple links with the same destination, one for each line.
Packit Service 50c9f2
 */
Packit Service 50c9f2
static void writeMultiLineCodeLink(CodeOutputInterface &ol,
Packit Service 50c9f2
                  Definition *d,
Packit Service 50c9f2
                  const char *text)
Packit Service 50c9f2
{
Packit Service 50c9f2
  static bool sourceTooltips = Config_getBool(SOURCE_TOOLTIPS);
Packit Service 50c9f2
  TooltipManager::instance()->addTooltip(d);
Packit Service 50c9f2
  QCString ref  = d->getReference();
Packit Service 50c9f2
  QCString file = d->getOutputFileBase();
Packit Service 50c9f2
  QCString anchor = d->anchor();
Packit Service 50c9f2
  QCString tooltip; 
Packit Service 50c9f2
  if (!sourceTooltips) // fall back to simple "title" tooltips
Packit Service 50c9f2
  {
Packit Service 50c9f2
    tooltip = d->briefDescriptionAsTooltip();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  bool done=FALSE;
Packit Service 50c9f2
  char *p=(char *)text;
Packit Service 50c9f2
  while (!done)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    char *sp=p;
Packit Service 50c9f2
    char c;
Packit Service 50c9f2
    while ((c=*p++) && c!='\n') { }
Packit Service 50c9f2
    if (c=='\n')
Packit Service 50c9f2
    {
Packit Service 50c9f2
      g_yyLineNr++;
Packit Service 50c9f2
      *(p-1)='\0';
Packit Service 50c9f2
      //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
Packit Service 50c9f2
      ol.writeCodeLink(ref,file,anchor,sp,tooltip);
Packit Service 50c9f2
      nextCodeLine();
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
Packit Service 50c9f2
      ol.writeCodeLink(ref,file,anchor,sp,tooltip);
Packit Service 50c9f2
      done=TRUE;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void startFontClass(const char *s)
Packit Service 50c9f2
{
Packit Service 50c9f2
  // if font class is already set don't stop and start it.
Packit Service 50c9f2
  // strcmp does not like null pointers as input.
Packit Service 50c9f2
  if (!g_currentFontClass || !s || strcmp(g_currentFontClass,s))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    endFontClass();
Packit Service 50c9f2
    g_code->startFontClass(s);
Packit Service 50c9f2
    g_currentFontClass=s;
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void endFontClass()
Packit Service 50c9f2
{
Packit Service 50c9f2
  if (g_currentFontClass)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    g_code->endFontClass();
Packit Service 50c9f2
    g_currentFontClass=0;
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void codifyLines(char *text)
Packit Service 50c9f2
{
Packit Service 50c9f2
  //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
Packit Service 50c9f2
  char *p=text,*sp=p;
Packit Service 50c9f2
  char c;
Packit Service 50c9f2
  bool done=FALSE;
Packit Service 50c9f2
  const char *  tmp_currentFontClass = g_currentFontClass;
Packit Service 50c9f2
  while (!done)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    sp=p;
Packit Service 50c9f2
    while ((c=*p++) && c!='\n') { }
Packit Service 50c9f2
    if (c=='\n')
Packit Service 50c9f2
    {
Packit Service 50c9f2
      g_yyLineNr++;
Packit Service 50c9f2
      *(p-1)='\0';
Packit Service 50c9f2
      g_code->codify(sp);
Packit Service 50c9f2
      endCodeLine();
Packit Service 50c9f2
      if (g_yyLineNr
Packit Service 50c9f2
      {
Packit Service 50c9f2
        startCodeLine();
Packit Service 50c9f2
      }
Packit Service 50c9f2
      if (tmp_currentFontClass)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        startFontClass(tmp_currentFontClass);
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    else
Packit Service 50c9f2
    {
Packit Service 50c9f2
      g_code->codify(sp);
Packit Service 50c9f2
      done=TRUE;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void codifyLines(const QCString &str)
Packit Service 50c9f2
{
Packit Service 50c9f2
  char *tmp= (char *)malloc(str.length()+1);
Packit Service 50c9f2
  qstrcpy(tmp, str);
Packit Service 50c9f2
  codifyLines(tmp);
Packit Service 50c9f2
  free(tmp);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static bool getLinkInScope(const QCString &c,  // scope
Packit Service 50c9f2
                           const QCString &m,  // member
Packit Service 50c9f2
			   const char *memberText, // exact text
Packit Service 50c9f2
			   CodeOutputInterface &ol,
Packit Service 50c9f2
			   const char *text
Packit Service 50c9f2
			  )
Packit Service 50c9f2
{
Packit Service 50c9f2
  MemberDef    *md;
Packit Service 50c9f2
  ClassDef     *cd;
Packit Service 50c9f2
  FileDef      *fd;
Packit Service 50c9f2
  NamespaceDef *nd;
Packit Service 50c9f2
  GroupDef     *gd;
Packit Service 50c9f2
  //printf("Trying `%s'::`%s'\n",c.data(),m.data());
Packit Service 50c9f2
  if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef) && 
Packit Service 50c9f2
      md->isLinkable())
Packit Service 50c9f2
  {
Packit Service 50c9f2
    //Definition *d=0;
Packit Service 50c9f2
    //if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
Packit Service 50c9f2
Packit Service 50c9f2
    Definition *d = md->getOuterScope()==Doxygen::globalScope ?
Packit Service 50c9f2
	            md->getBodyDef() : md->getOuterScope();
Packit Service 50c9f2
    //printf("Found! d=%s\n",d?d->name().data():"<none>");
Packit Service 50c9f2
    if (md->getGroupDef()) d = md->getGroupDef();
Packit Service 50c9f2
    if (d && d->isLinkable())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope()));
Packit Service 50c9f2
      //printf("g_currentDefinition=%p g_currentMemberDef=%p\n",
Packit Service 50c9f2
      //        g_currentDefinition,g_currentMemberDef);
Packit Service 50c9f2
Packit Service 50c9f2
      if (g_currentDefinition && g_currentMemberDef &&
Packit Service 50c9f2
	  md!=g_currentMemberDef && g_collectXRefs)
Packit Service 50c9f2
      {
Packit Service 50c9f2
	addDocCrossReference(g_currentMemberDef,md);
Packit Service 50c9f2
      }
Packit Service 50c9f2
      //printf("d->getReference()=`%s' d->getOutputBase()=`%s' name=`%s' member name=`%s'\n",d->getReference().data(),d->getOutputFileBase().data(),d->name().data(),md->name().data());
Packit Service 50c9f2
     
Packit Service 50c9f2
      writeMultiLineCodeLink(ol,md, text ? text : memberText);
Packit Service 50c9f2
      addToSearchIndex(text ? text : memberText);
Packit Service 50c9f2
      return TRUE;
Packit Service 50c9f2
    } 
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return FALSE;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static bool getLink(const char *className,
Packit Service 50c9f2
                    const char *memberName,
Packit Service 50c9f2
		    CodeOutputInterface &ol,
Packit Service 50c9f2
		    const char *text=0)
Packit Service 50c9f2
{
Packit Service 50c9f2
  QCString m=removeRedundantWhiteSpace(memberName);
Packit Service 50c9f2
  QCString c=className;
Packit Service 50c9f2
  if (!getLinkInScope(c,m,memberName,ol,text))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (!g_curClassName.isEmpty())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (!c.isEmpty()) c.prepend("::");
Packit Service 50c9f2
      c.prepend(g_curClassName);
Packit Service 50c9f2
      return getLinkInScope(c,m,memberName,ol,text);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    return FALSE;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return TRUE;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
/*
Packit Service 50c9f2
  For a given string in the source code,
Packit Service 50c9f2
  finds its class or global id and links to it.
Packit Service 50c9f2
*/
Packit Service 50c9f2
static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
Packit Service 50c9f2
                                      bool typeOnly=FALSE)
Packit Service 50c9f2
{
Packit Service 50c9f2
  QCString className=clName;
Packit Service 50c9f2
Packit Service 50c9f2
  // Don't do anything for empty text
Packit Service 50c9f2
  if (className.isEmpty()) return;
Packit Service 50c9f2
Packit Service 50c9f2
  DBG_CTX((stderr,"generateClassOrGlobalLink(className=%s)\n",className.data()));
Packit Service 50c9f2
Packit Service 50c9f2
  ClassDef *cd=0,*lcd=0;  /** Class def that we may find */
Packit Service 50c9f2
  MemberDef *md=0;        /** Member def that we may find */
Packit Service 50c9f2
  //bool isLocal=FALSE;
Packit Service 50c9f2
Packit Service 50c9f2
  if ((lcd=g_theVarContext.findVariable(className))==0) // not a local variable
Packit Service 50c9f2
  {
Packit Service 50c9f2
    Definition *d = g_currentDefinition;
Packit Service 50c9f2
    QCString scope = substitute(className,".","::");
Packit Service 50c9f2
Packit Service 50c9f2
    cd = getResolvedClass(d,g_sourceFileDef,substitute(className,".","::"),&md);
Packit Service 50c9f2
Packit Service 50c9f2
    DBG_CTX((stderr,"d=%s g_sourceFileDef=%s\n",
Packit Service 50c9f2
        d?d->displayName().data():"<null>",
Packit Service 50c9f2
        g_currentDefinition?g_currentDefinition->displayName().data():"<null>"));
Packit Service 50c9f2
    DBG_CTX((stderr,"is found as a type %s\n",cd?cd->name().data():"<null>"));
Packit Service 50c9f2
Packit Service 50c9f2
    if (cd==0 && md==0) // also see if it is variable or enum or enum value
Packit Service 50c9f2
    {
Packit Service 50c9f2
      NamespaceDef *nd = getResolvedNamespace(scope);
Packit Service 50c9f2
      if (nd)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        writeMultiLineCodeLink(ol,nd,clName);
Packit Service 50c9f2
        addToSearchIndex(className);
Packit Service 50c9f2
        return;
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else if (getLink(g_classScope,clName,ol,clName))
Packit Service 50c9f2
      {
Packit Service 50c9f2
	return;
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else
Packit Service 50c9f2
  {
Packit Service 50c9f2
    if (lcd!=PyVariableContext::dummyContext) 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      g_theCallContext.setClass(lcd);
Packit Service 50c9f2
    }
Packit Service 50c9f2
    //isLocal=TRUE;
Packit Service 50c9f2
    DBG_CTX((stderr,"is a local variable cd=%p!\n",cd));
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  if (cd && cd->isLinkable()) // is it a linkable class
Packit Service 50c9f2
  {
Packit Service 50c9f2
    writeMultiLineCodeLink(ol,cd,clName);
Packit Service 50c9f2
    addToSearchIndex(className);
Packit Service 50c9f2
    if (md)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      Definition *d = md->getOuterScope()==Doxygen::globalScope ?
Packit Service 50c9f2
                      md->getBodyDef() : md->getOuterScope();
Packit Service 50c9f2
      if (md->getGroupDef()) d = md->getGroupDef();
Packit Service 50c9f2
      if (d && d->isLinkable() && md->isLinkable() && 
Packit Service 50c9f2
          g_currentMemberDef && g_collectXRefs)
Packit Service 50c9f2
      {
Packit Service 50c9f2
        addDocCrossReference(g_currentMemberDef,md);
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else // not a class, maybe a global member
Packit Service 50c9f2
  {
Packit Service 50c9f2
    int scopeEnd = className.findRev(".");
Packit Service 50c9f2
    if (scopeEnd!=-1 && !typeOnly) // name with explicit scope
Packit Service 50c9f2
    {
Packit Service 50c9f2
      QCString scope = substitute(className.left(scopeEnd),".","::");
Packit Service 50c9f2
      QCString locName = className.right(className.length()-scopeEnd-1);
Packit Service 50c9f2
      ClassDef *mcd = getClass(scope);
Packit Service 50c9f2
      DBG_CTX((stderr,"scope=%s locName=%s mcd=%p\n",scope.data(),locName.data(),mcd));
Packit Service 50c9f2
      if (mcd)
Packit Service 50c9f2
      {
Packit Service 50c9f2
	MemberDef *md = mcd->getMemberByName(locName);
Packit Service 50c9f2
	if (md)
Packit Service 50c9f2
	{
Packit Service 50c9f2
          g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope()));
Packit Service 50c9f2
          writeMultiLineCodeLink(ol,md,clName);
Packit Service 50c9f2
          addToSearchIndex(className);
Packit Service 50c9f2
	  Definition *d = md->getOuterScope()==Doxygen::globalScope ?
Packit Service 50c9f2
	                  md->getBodyDef() : md->getOuterScope();
Packit Service 50c9f2
	  if (md->getGroupDef()) d = md->getGroupDef();
Packit Service 50c9f2
	  if (d && d->isLinkable() && md->isLinkable() && 
Packit Service 50c9f2
              g_currentMemberDef && g_collectXRefs)
Packit Service 50c9f2
	  {
Packit Service 50c9f2
	    addDocCrossReference(g_currentMemberDef,md);
Packit Service 50c9f2
	  }
Packit Service 50c9f2
	  return;
Packit Service 50c9f2
	}
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else // check namespace as well
Packit Service 50c9f2
      {
Packit Service 50c9f2
        NamespaceDef *mnd = getResolvedNamespace(scope);
Packit Service 50c9f2
        if (mnd)
Packit Service 50c9f2
        {
Packit Service 50c9f2
  	  MemberDef *md=mnd->getMemberByName(locName);
Packit Service 50c9f2
	  if (md)
Packit Service 50c9f2
          {
Packit Service 50c9f2
	    //printf("name=%s scope=%s\n",locName.data(),scope.data());
Packit Service 50c9f2
	    g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope()));
Packit Service 50c9f2
            writeMultiLineCodeLink(ol,md,clName);
Packit Service 50c9f2
            addToSearchIndex(className);
Packit Service 50c9f2
	    Definition *d = md->getOuterScope()==Doxygen::globalScope ?
Packit Service 50c9f2
	                    md->getBodyDef() : md->getOuterScope();
Packit Service 50c9f2
	    if (md->getGroupDef()) d = md->getGroupDef();
Packit Service 50c9f2
	    if (d && d->isLinkable() && md->isLinkable() && 
Packit Service 50c9f2
                g_currentMemberDef && g_collectXRefs)
Packit Service 50c9f2
	    {
Packit Service 50c9f2
	      addDocCrossReference(g_currentMemberDef,md);
Packit Service 50c9f2
	    }
Packit Service 50c9f2
	    return;
Packit Service 50c9f2
          }
Packit Service 50c9f2
        }
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    
Packit Service 50c9f2
    // nothing found, just write out the word
Packit Service 50c9f2
    codifyLines(clName);
Packit Service 50c9f2
    addToSearchIndex(clName);
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*
Packit Service 50c9f2
   As of June 1, this function seems to work
Packit Service 50c9f2
   for file members, but scopes are not
Packit Service 50c9f2
   being correctly tracked for classes
Packit Service 50c9f2
   so it doesn't work for classes yet.
Packit Service 50c9f2
Packit Service 50c9f2
*/
Packit Service 50c9f2
static void generateFunctionLink(CodeOutputInterface &ol,char *funcName)
Packit Service 50c9f2
{
Packit Service 50c9f2
  //CodeClassDef *ccd=0;
Packit Service 50c9f2
  ClassDef *ccd=0;
Packit Service 50c9f2
  QCString locScope=g_classScope.copy();
Packit Service 50c9f2
  QCString locFunc=removeRedundantWhiteSpace(funcName);
Packit Service 50c9f2
  DBG_CTX((stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data()));
Packit Service 50c9f2
  int i=locFunc.findRev("::");
Packit Service 50c9f2
  if (i>0)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    locScope=locFunc.left(i);
Packit Service 50c9f2
    locFunc=locFunc.right(locFunc.length()-i-2).stripWhiteSpace();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  //printf("generateFunctionLink(%s) classScope=`%s'\n",locFunc.data(),locScope.data());
Packit Service 50c9f2
  if (!locScope.isEmpty() && (ccd=g_codeClassSDict[locScope]))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    //printf("using classScope %s\n",g_classScope.data());
Packit Service 50c9f2
    if (ccd->baseClasses())
Packit Service 50c9f2
    {
Packit Service 50c9f2
      BaseClassListIterator bcli(*ccd->baseClasses());
Packit Service 50c9f2
      for ( ; bcli.current() ; ++bcli)
Packit Service 50c9f2
      {
Packit Service 50c9f2
	if (getLink(bcli.current()->classDef->name(),locFunc,ol,funcName)) 
Packit Service 50c9f2
	{
Packit Service 50c9f2
	  return;
Packit Service 50c9f2
	}
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (!getLink(locScope,locFunc,ol,funcName))
Packit Service 50c9f2
  {
Packit Service 50c9f2
    generateClassOrGlobalLink(ol,funcName);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static bool findMemberLink(CodeOutputInterface &ol,Definition *sym,const char *symName)
Packit Service 50c9f2
{
Packit Service 50c9f2
  //printf("sym %s outerScope=%s equal=%d\n",
Packit Service 50c9f2
  //    sym->name().data(),sym->getOuterScope()->name().data(),
Packit Service 50c9f2
  //    sym->getOuterScope()==g_currentDefinition);
Packit Service 50c9f2
Packit Service 50c9f2
  if (sym->getOuterScope() &&
Packit Service 50c9f2
      sym->getOuterScope()->definitionType()==Definition::TypeClass &&
Packit Service 50c9f2
      g_currentDefinition->definitionType()==Definition::TypeClass)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    ClassDef *cd = (ClassDef*)sym->getOuterScope();
Packit Service 50c9f2
    ClassDef *thisCd = (ClassDef *)g_currentDefinition;
Packit Service 50c9f2
    if (sym->definitionType()==Definition::TypeMember)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (g_currentMemberDef && g_collectXRefs)
Packit Service 50c9f2
      {
Packit Service 50c9f2
	addDocCrossReference(g_currentMemberDef,(MemberDef*)sym);
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
    DBG_CTX((stderr,"cd=%s thisCd=%s\n",cd?cd->name().data():"<none>",thisCd?thisCd->name().data():"<none>"));
Packit Service 50c9f2
Packit Service 50c9f2
    // TODO: find the nearest base class in case cd is a base class of
Packit Service 50c9f2
    // thisCd 
Packit Service 50c9f2
    if (cd==thisCd || (thisCd && thisCd->isBaseClass(cd,TRUE)))
Packit Service 50c9f2
    {
Packit Service 50c9f2
      writeMultiLineCodeLink(ol,sym,symName);
Packit Service 50c9f2
      return TRUE;
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return FALSE;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
static void findMemberLink(CodeOutputInterface &ol,char *symName)
Packit Service 50c9f2
{
Packit Service 50c9f2
  //printf("Member reference: %s scope=%s member=%s\n",
Packit Service 50c9f2
  //    yytext,
Packit Service 50c9f2
  //    g_currentDefinition?g_currentDefinition->name().data():"<none>",
Packit Service 50c9f2
  //    g_currentMemberDef?g_currentMemberDef->name().data():"<none>"
Packit Service 50c9f2
  //    );
Packit Service 50c9f2
  if (g_currentDefinition)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    DefinitionIntf *di = Doxygen::symbolMap->find(symName);
Packit Service 50c9f2
    if (di)
Packit Service 50c9f2
    {
Packit Service 50c9f2
      if (di->definitionType()==DefinitionIntf::TypeSymbolList) // multiple symbols
Packit Service 50c9f2
      {
Packit Service 50c9f2
	DefinitionListIterator dli(*(DefinitionList*)di);
Packit Service 50c9f2
	Definition *sym;
Packit Service 50c9f2
	for (dli.toFirst();(sym=dli.current());++dli)
Packit Service 50c9f2
	{
Packit Service 50c9f2
	  if (findMemberLink(ol,sym,symName)) return;
Packit Service 50c9f2
	}
Packit Service 50c9f2
      }
Packit Service 50c9f2
      else // single symbol
Packit Service 50c9f2
      {
Packit Service 50c9f2
	if (findMemberLink(ol,(Definition*)di,symName)) return;
Packit Service 50c9f2
      }
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
  //printf("sym %s not found\n",&yytext[5]);
Packit Service 50c9f2
  codify(symName);
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
#undef YY_INPUT
Packit Service 50c9f2
#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
Packit Service 50c9f2
Packit Service 50c9f2
static int yyread(char *buf,int max_size)
Packit Service 50c9f2
{
Packit Service 50c9f2
  int c=0;
Packit Service 50c9f2
  while( c < max_size && g_inputString[g_inputPosition] )
Packit Service 50c9f2
  {
Packit Service 50c9f2
    *buf = g_inputString[g_inputPosition++] ;
Packit Service 50c9f2
    c++; buf++;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  return c;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
%}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
BB                [ \t]+
Packit Service 50c9f2
B                 [ \t]*
Packit Service 50c9f2
NEWLINE           \n
Packit Service 50c9f2
Packit Service 50c9f2
DIGIT             [0-9]
Packit Service 50c9f2
LETTER            [A-Za-z\x80-\xFF]
Packit Service 50c9f2
NONEMPTY          [A-Za-z0-9_\x80-\xFF]
Packit Service 50c9f2
EXPCHAR           [#(){}\[\],:.%/\\=`*~|&<>!;+-]
Packit Service 50c9f2
NONEMPTYEXP       [^ \t\n:]
Packit Service 50c9f2
PARAMNONEMPTY     [^ \t\n():]
Packit Service 50c9f2
IDENTIFIER        ({LETTER}|"_")({LETTER}|{DIGIT}|"_")*  
Packit Service 50c9f2
BORDER            ([^A-Za-z0-9])
Packit Service 50c9f2
Packit Service 50c9f2
POUNDCOMMENT      "##"
Packit Service 50c9f2
Packit Service 50c9f2
TRISINGLEQUOTE    "'''"
Packit Service 50c9f2
TRIDOUBLEQUOTE    "\"\"\""
Packit Service 50c9f2
LONGSTRINGCHAR    [^\\"']
Packit Service 50c9f2
ESCAPESEQ         ("\\")(.)
Packit Service 50c9f2
LONGSTRINGITEM    ({LONGSTRINGCHAR}|{ESCAPESEQ})
Packit Service 50c9f2
SMALLQUOTE        ("\"\""|"\""|"'"|"''")
Packit Service 50c9f2
LONGSTRINGBLOCK   ({LONGSTRINGITEM}+|{SMALLQUOTE})
Packit Service 50c9f2
Packit Service 50c9f2
SHORTSTRING       ("'"{SHORTSTRINGITEM}*"'"|'"'{SHORTSTRINGITEM}*'"')
Packit Service 50c9f2
SHORTSTRINGITEM   ({SHORTSTRINGCHAR}|{ESCAPESEQ})
Packit Service 50c9f2
SHORTSTRINGCHAR   [^\\\n"]
Packit Service 50c9f2
STRINGLITERAL     {STRINGPREFIX}?( {SHORTSTRING} | {LONGSTRING})  
Packit Service 50c9f2
STRINGPREFIX      ("r"|"u"|"ur"|"R"|"U"|"UR"|"Ur"|"uR")
Packit Service 50c9f2
KEYWORD ("lambda"|"import"|"class"|"assert"|"as"|"from"|"global"|"def"|"True"|"False")
Packit Service 50c9f2
FLOWKW  ("or"|"and"|"is"|"not"|"print"|"for"|"in"|"if"|"try"|"except"|"yield"|"raise"|"break"|"continue"|"pass"|"if"|"return"|"while"|"elif"|"else"|"finally")
Packit Service 50c9f2
QUOTES            ("\""[^"]*"\"")
Packit Service 50c9f2
SINGLEQUOTES      ("'"[^']*"'")
Packit Service 50c9f2
Packit Service 50c9f2
LONGINTEGER       {INTEGER}("l"|"L")
Packit Service 50c9f2
INTEGER           ({DECIMALINTEGER}|{OCTINTEGER}|{HEXINTEGER})
Packit Service 50c9f2
DECIMALINTEGER    ({NONZERODIGIT}{DIGIT}*|"0")
Packit Service 50c9f2
OCTINTEGER        "0"{OCTDIGIT}+
Packit Service 50c9f2
HEXINTEGER        "0"("x"|"X"){HEXDIGIT}+  
Packit Service 50c9f2
NONZERODIGIT      [1-9]  
Packit Service 50c9f2
OCTDIGIT          [0-7]  
Packit Service 50c9f2
HEXDIGIT          ({DIGIT}|[a-f]|[A-F])
Packit Service 50c9f2
FLOATNUMBER       ({POINTFLOAT}|{EXPONENTFLOAT})
Packit Service 50c9f2
POINTFLOAT        ({INTPART}?{FRACTION}|{INTPART}".")  
Packit Service 50c9f2
EXPONENTFLOAT     ({INTPART}|{POINTFLOAT}){EXPONENT}
Packit Service 50c9f2
INTPART             {DIGIT}+  
Packit Service 50c9f2
FRACTION             "."{DIGIT}+  
Packit Service 50c9f2
EXPONENT             ("e"|"E")("+"|"-")?{DIGIT}+
Packit Service 50c9f2
IMAGNUMBER ({FLOATNUMBER}|{INTPART})("j"|"J")
Packit Service 50c9f2
ATOM              ({IDENTIFIER}|{LITERAL}|{ENCLOSURE})
Packit Service 50c9f2
ENCLOSURE             ({PARENTH_FORM}|{LIST_DISPLAY}|{DICT_DISPLAY}|{STRING_CONVERSION})
Packit Service 50c9f2
LITERAL             ({STRINGLITERAL}|{INTEGER}|{LONGINTEGER}|{FLOATNUMBER}|{IMAGNUMBER})
Packit Service 50c9f2
PARENTH_FORM       "("{EXPRESSION_LIST}?")"
Packit Service 50c9f2
TEST             ({AND_TEST}("or"{AND_TEST})*|{LAMBDA_FORM})
Packit Service 50c9f2
TESTLIST             {TEST}( ","{TEST})*","?
Packit Service 50c9f2
LIST_DISPLAY        "["{LISTMAKER}?"]"  
Packit Service 50c9f2
LISTMAKER             {EXPRESSION}({LIST_FOR}|(","{EXPRESSION})*","?)  
Packit Service 50c9f2
LIST_ITER             ({LIST_FOR}|{LIST_IF})  
Packit Service 50c9f2
LIST_FOR             "for"{EXPRESSION_LIST}"in"{TESTLIST}{LIST_ITER}?
Packit Service 50c9f2
LIST_IF             "if"{TEST}{LIST_ITER}?
Packit Service 50c9f2
DICT_DISPLAY             "\{"{KEY_DATUM_LIST}?"\}"
Packit Service 50c9f2
KEY_DATUM_LIST       {KEY_DATUM}(","{KEY_DATUM})*","? 
Packit Service 50c9f2
KEY_DATUM              {EXPRESSION}":"{EXPRESSION}
Packit Service 50c9f2
STRING_CONVERSION        "`"{EXPRESSION_LIST}"`"
Packit Service 50c9f2
PRIMARY             ({ATOM}|{ATTRIBUTEREF}|{SUBSCRIPTION}|{SLICING}|{CALL})
Packit Service 50c9f2
ATTRIBUTEREF             {PRIMARY}"."{IDENTIFIER}
Packit Service 50c9f2
SUBSCRIPTION             {PRIMARY}"["{EXPRESSION_LIST}"]"
Packit Service 50c9f2
SLICING            ({SIMPLE_SLICING}|{EXTENDED_SLICING})
Packit Service 50c9f2
SIMPLE_SLICING             {PRIMARY}"["{SHORT_SLICE}"]"  
Packit Service 50c9f2
EXTENDED_SLICING           {PRIMARY}"["{SLICE_LIST}"]" 
Packit Service 50c9f2
SLICE_LIST          {SLICE_ITEM}(","{SLICE_ITEM})*","?
Packit Service 50c9f2
SLICE_ITEM           ({EXPRESSION}|{PROPER_SLICE}|{ELLIPSIS})
Packit Service 50c9f2
PROPER_SLICE           ({SHORT_SLICE}|{LONG_SLICE})
Packit Service 50c9f2
SHORT_SLICE              {LOWER_BOUND}?":"{UPPER_BOUND}?  
Packit Service 50c9f2
LONG_SLICE             {SHORT_SLICE}":"{STRIDE}?
Packit Service 50c9f2
LOWER_BOUND             {EXPRESSION}  
Packit Service 50c9f2
UPPER_BOUND             {EXPRESSION}
Packit Service 50c9f2
STRIDE             {EXPRESSION}
Packit Service 50c9f2
ELLIPSIS             "..."
Packit Service 50c9f2
CALL             {PRIMARY}"("({ARGUMENT_LIST}","?)?")"
Packit Service 50c9f2
ARGUMENT_LIST       ({POSITIONAL_ARGUMENTS}(","{KEYWORD_ARGUMENTS})?(",""*"{EXPRESSION})?(",""**"{EXPRESSION})?|{KEYWORD_ARGUMENTS}(",""*"{EXPRESSION})?(",""**"{EXPRESSION})?|"*"{EXPRESSION}(",""**"{EXPRESSION})?|"**"{EXPRESSION})
Packit Service 50c9f2
POSITIONAL_ARGUMENTS             {EXPRESSION}(","{EXPRESSION})*
Packit Service 50c9f2
KEYWORD_ARGUMENTS              {KEYWORD_ITEM}(","{KEYWORD_ITEM})*
Packit Service 50c9f2
KEYWORD_ITEM           {IDENTIFIER}"="{EXPRESSION}
Packit Service 50c9f2
POWER             {PRIMARY}("**"{U_EXPR})?
Packit Service 50c9f2
U_EXPR            ({POWER}|"-"{U_EXPR}|"+"{U_EXPR}|"\~"{U_EXPR})
Packit Service 50c9f2
M_EXPR            ({U_EXPR}|{M_EXPR}"*"{U_EXPR}|{M_EXPR}"//"{U_EXPR}|{M_EXPR}"/"{U_EXPR}|{M_EXPR}"\%"{U_EXPR})
Packit Service 50c9f2
A_EXPR         ({M_EXPR}|{A_EXPR}"+"{M_EXPR}|{A_EXPR}"-"{M_EXPR}
Packit Service 50c9f2
SHIFT_EXPR            ({A_EXPR}|{SHIFT_EXPR}("<<"|">>"){A_EXPR})
Packit Service 50c9f2
AND_EXPR            ({SHIFT_EXPR}|{AND_EXPR}"\;SPMamp;"{SHIFT_EXPR}
Packit Service 50c9f2
XOR_EXPR            ({AND_EXPR}|{XOR_EXPR}"\textasciicircum"{AND_EXPR})
Packit Service 50c9f2
OR_EXPR            ({XOR_EXPR}|{OR_EXPR}"|"{ XOR_EXPR})
Packit Service 50c9f2
Packit Service 50c9f2
COMPARISON             {OR_EXPR}({COMP_OPERATOR}{OR_EXPR})*
Packit Service 50c9f2
COMP_OPERATOR         ("<"|">"|"=="|">="|"<="|"<>"|"!="|"is""not"?|"not"?"in")
Packit Service 50c9f2
EXPRESSION            ({OR_TEST}|{LAMBDA_FORM})
Packit Service 50c9f2
OR_TEST             ({AND_TEST}|{OR_TEST}"or"{AND_TEST})
Packit Service 50c9f2
AND_TEST          ({NOT_TEST}|{AND_TEST}"and"{NOT_TEST})
Packit Service 50c9f2
NOT_TEST           ({COMPARISON}|"not"{NOT_TEST})
Packit Service 50c9f2
LAMBDA_FORM       "lambda"{PARAMETER_LIST}?":"{EXPRESSION}
Packit Service 50c9f2
EXPRESSION_LIST      {EXPRESSION}(","{EXPRESSION})*","?
Packit Service 50c9f2
SIMPLE_STMT       ({EXPRESSION_STMT}|{ASSERT_STMT}|{ASSIGNMENT_STMT}|{AUGMENTED_ASSIGNMENT_STMT}|{PASS_STMT}|{DEL_STMT}|{PRINT_STMT}|{RETURN_STMT}|{YIELD_STMT}|{RAISE_STMT}|{BREAK_STMT}|{CONTINUE_STMT}|{IMPORT_STMT}|{GLOBAL_STMT}|{EXEC_STMT})
Packit Service 50c9f2
EXPRESSION_STMT     {EXPRESSION_LIST}
Packit Service 50c9f2
ASSERT_STMT             "assert"{EXPRESSION}(","{EXPRESSION})?
Packit Service 50c9f2
ASSIGNMENT_STMT     ({TARGET_LIST}"=")+{EXPRESSION_LIST}
Packit Service 50c9f2
TARGET_LIST             {TARGET}(","{TARGET})*","?
Packit Service 50c9f2
TARGET           ({IDENTIFIER}|"("{TARGET_LIST}")"|"["{TARGET_LIST}"]"|{ATTRIBUTEREF}|{SUBSCRIPTION}|{SLICING})
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
%option noyywrap
Packit Service 50c9f2
%option stack
Packit Service 50c9f2
Packit Service 50c9f2
%x Body
Packit Service 50c9f2
Packit Service 50c9f2
%x FunctionDec
Packit Service 50c9f2
%x FunctionParams
Packit Service 50c9f2
Packit Service 50c9f2
%x ClassDec
Packit Service 50c9f2
%x ClassInheritance
Packit Service 50c9f2
Packit Service 50c9f2
%x Suite
Packit Service 50c9f2
%x SuiteCaptureIndent
Packit Service 50c9f2
%x SuiteStart
Packit Service 50c9f2
%x SuiteMaintain
Packit Service 50c9f2
%x SuiteContinuing
Packit Service 50c9f2
Packit Service 50c9f2
%x LongString
Packit Service 50c9f2
Packit Service 50c9f2
%x SingleQuoteString
Packit Service 50c9f2
%x DoubleQuoteString
Packit Service 50c9f2
%x TripleString
Packit Service 50c9f2
Packit Service 50c9f2
%x DocBlock
Packit Service 50c9f2
%%
Packit Service 50c9f2
Packit Service 50c9f2
<Body,Suite>{
Packit Service 50c9f2
      "def"{BB}                     {
Packit Service 50c9f2
				        startFontClass("keyword");
Packit Service 50c9f2
					codify(yytext);
Packit Service 50c9f2
					endFontClass();
Packit Service 50c9f2
					BEGIN( FunctionDec );
Packit Service 50c9f2
		                    }
Packit Service 50c9f2
Packit Service 50c9f2
      "class"{BB}                   {
Packit Service 50c9f2
				        startFontClass("keyword");
Packit Service 50c9f2
					codify(yytext);
Packit Service 50c9f2
					endFontClass();
Packit Service 50c9f2
					BEGIN( ClassDec );
Packit Service 50c9f2
		                    }
Packit Service 50c9f2
      "None"                        {
Packit Service 50c9f2
				        startFontClass("keywordtype");
Packit Service 50c9f2
					codify(yytext);
Packit Service 50c9f2
					endFontClass();
Packit Service 50c9f2
				    }
Packit Service 50c9f2
      "self."{IDENTIFIER}/"."({IDENTIFIER}".")*{IDENTIFIER}"(" {
Packit Service 50c9f2
				        codify("self.");
Packit Service 50c9f2
				        findMemberLink(*g_code,&yytext[5]);
Packit Service 50c9f2
	                            }
Packit Service 50c9f2
      "self."{IDENTIFIER}/"("       {
Packit Service 50c9f2
				        codify("self.");
Packit Service 50c9f2
				        findMemberLink(*g_code,&yytext[5]);
Packit Service 50c9f2
	                            }
Packit Service 50c9f2
      "self."{IDENTIFIER}/"."({IDENTIFIER}".")*{IDENTIFIER} {
Packit Service 50c9f2
				        codify("self.");
Packit Service 50c9f2
				        findMemberLink(*g_code,&yytext[5]);
Packit Service 50c9f2
	                            }
Packit Service 50c9f2
      "self."{IDENTIFIER}           {
Packit Service 50c9f2
				        codify("self.");
Packit Service 50c9f2
				        findMemberLink(*g_code,&yytext[5]);
Packit Service 50c9f2
	                            }
Packit Service 50c9f2
      "cls."{IDENTIFIER}/"."({IDENTIFIER}".")*{IDENTIFIER}"(" {
Packit Service 50c9f2
				        codify("cls.");
Packit Service 50c9f2
				        findMemberLink(*g_code,&yytext[4]);
Packit Service 50c9f2
	                            }
Packit Service 50c9f2
      "cls."{IDENTIFIER}/"("       {
Packit Service 50c9f2
				        codify("cls.");
Packit Service 50c9f2
				        findMemberLink(*g_code,&yytext[4]);
Packit Service 50c9f2
	                            }
Packit Service 50c9f2
      "cls."{IDENTIFIER}/"."({IDENTIFIER}".")*{IDENTIFIER} {
Packit Service 50c9f2
				        codify("cls.");
Packit Service 50c9f2
				        findMemberLink(*g_code,&yytext[4]);
Packit Service 50c9f2
	                            }
Packit Service 50c9f2
      "cls."{IDENTIFIER}           {
Packit Service 50c9f2
				        codify("cls.");
Packit Service 50c9f2
				        findMemberLink(*g_code,&yytext[4]);
Packit Service 50c9f2
	                            }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
<ClassDec>{IDENTIFIER}              {
Packit Service 50c9f2
Packit Service 50c9f2
					generateClassOrGlobalLink(*g_code,yytext);
Packit Service 50c9f2
					// codify(yytext);
Packit Service 50c9f2
					g_curClassName = yytext;
Packit Service 50c9f2
					g_curClassBases.clear();
Packit Service 50c9f2
					BEGIN( ClassInheritance );
Packit Service 50c9f2
		                    }
Packit Service 50c9f2
Packit Service 50c9f2
<ClassInheritance>{
Packit Service 50c9f2
   ({BB}|[(,)])                     {
Packit Service 50c9f2
					codify(yytext);
Packit Service 50c9f2
                                    }
Packit Service 50c9f2
Packit Service 50c9f2
   ({IDENTIFIER}".")*{IDENTIFIER}   {
Packit Service 50c9f2
                                        // The parser
Packit Service 50c9f2
					// is assuming
Packit Service 50c9f2
					// that ALL identifiers
Packit Service 50c9f2
					// in this state
Packit Service 50c9f2
					// are base classes;
Packit Service 50c9f2
					// it doesn't check to see
Packit Service 50c9f2
					// that the first parenthesis
Packit Service 50c9f2
					// has been seen.
Packit Service 50c9f2
Packit Service 50c9f2
					// This is bad - it should
Packit Service 50c9f2
					// probably be more strict
Packit Service 50c9f2
					// about what to accept.
Packit Service 50c9f2
Packit Service 50c9f2
                                        g_curClassBases.inSort(yytext);
Packit Service 50c9f2
					generateClassOrGlobalLink(*g_code,yytext);
Packit Service 50c9f2
					// codify(yytext);
Packit Service 50c9f2
                                    }
Packit Service 50c9f2
Packit Service 50c9f2
    ":"                             {
Packit Service 50c9f2
				      codify(yytext);
Packit Service 50c9f2
Packit Service 50c9f2
				      // Assume this will
Packit Service 50c9f2
				      // be a one-line suite;
Packit Service 50c9f2
				      // found counter-example
Packit Service 50c9f2
				      // in SuiteStart.
Packit Service 50c9f2
Packit Service 50c9f2
                                      // Push a class scope
Packit Service 50c9f2
Packit Service 50c9f2
                                      ClassDef *classDefToAdd = new ClassDef("",1,1,g_curClassName,ClassDef::Class,0,0,FALSE);
Packit Service 50c9f2
                                      g_codeClassSDict.append(g_curClassName,classDefToAdd);
Packit Service 50c9f2
                                      char *s=g_curClassBases.first();
Packit Service 50c9f2
                                      while (s) 
Packit Service 50c9f2
				      {
Packit Service 50c9f2
                                        ClassDef *baseDefToAdd;
Packit Service 50c9f2
                                        baseDefToAdd=g_codeClassSDict[s];
Packit Service 50c9f2
Packit Service 50c9f2
					// Try to find class in global
Packit Service 50c9f2
					// scope
Packit Service 50c9f2
					if (baseDefToAdd==0) 
Packit Service 50c9f2
					{
Packit Service 50c9f2
					  baseDefToAdd=getResolvedClass(g_currentDefinition,g_sourceFileDef,s);
Packit Service 50c9f2
					}
Packit Service 50c9f2
Packit Service 50c9f2
					if (baseDefToAdd && baseDefToAdd!=classDefToAdd) 
Packit Service 50c9f2
					{
Packit Service 50c9f2
				          classDefToAdd->insertBaseClass(baseDefToAdd,s,Public,Normal);
Packit Service 50c9f2
					}
Packit Service 50c9f2
Packit Service 50c9f2
                                        s=g_curClassBases.next();
Packit Service 50c9f2
			              }
Packit Service 50c9f2
Packit Service 50c9f2
				      // Reset class-parsing variables.
Packit Service 50c9f2
				      g_curClassName.resize(0);
Packit Service 50c9f2
				      g_curClassBases.clear();
Packit Service 50c9f2
				      
Packit Service 50c9f2
				      g_noSuiteFound = TRUE;
Packit Service 50c9f2
				      BEGIN( SuiteStart );
Packit Service 50c9f2
                                    }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
<FunctionDec>{
Packit Service 50c9f2
    {IDENTIFIER}                    {
Packit Service 50c9f2
                                        generateFunctionLink(*g_code,yytext);
Packit Service 50c9f2
                                    }
Packit Service 50c9f2
Packit Service 50c9f2
    {B}"("                          {
Packit Service 50c9f2
				        codify(yytext);
Packit Service 50c9f2
					BEGIN( FunctionParams );
Packit Service 50c9f2
		                    }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
<FunctionParams>{
Packit Service 50c9f2
    ({BB}|",")                      {
Packit Service 50c9f2
                                         // Parses delimiters
Packit Service 50c9f2
				         codify(yytext);
Packit Service 50c9f2
                                    }
Packit Service 50c9f2
Packit Service 50c9f2
    ({IDENTIFIER}|{PARAMNONEMPTY}+) {
Packit Service 50c9f2
				         codify(yytext);
Packit Service 50c9f2
                                    }
Packit Service 50c9f2
Packit Service 50c9f2
    ")"                             {
Packit Service 50c9f2
                                         codify(yytext);
Packit Service 50c9f2
                                    }
Packit Service 50c9f2
Packit Service 50c9f2
    "\n"                            {
Packit Service 50c9f2
				         codifyLines(yytext);
Packit Service 50c9f2
                                    }
Packit Service 50c9f2
Packit Service 50c9f2
    ":"                             {
Packit Service 50c9f2
				      codify(yytext);
Packit Service 50c9f2
Packit Service 50c9f2
				      // Assume this will
Packit Service 50c9f2
				      // be a one-line suite;
Packit Service 50c9f2
				      // found counter-example
Packit Service 50c9f2
				      // in SuiteStart.
Packit Service 50c9f2
				      g_noSuiteFound = TRUE;
Packit Service 50c9f2
				      BEGIN( SuiteStart );
Packit Service 50c9f2
                                    }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
<Body,Suite>{
Packit Service 50c9f2
Packit Service 50c9f2
    {KEYWORD}                  {
Packit Service 50c9f2
                                 // Position-sensitive rules!
Packit Service 50c9f2
                                 // Must come AFTER keyword-triggered rules
Packit Service 50c9f2
                                 // Must come BEFORE identifier NONEMPTY-like rules
Packit Service 50c9f2
                                 //   to syntax highlight.
Packit Service 50c9f2
Packit Service 50c9f2
  		                 startFontClass("keyword");
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
		                 endFontClass();
Packit Service 50c9f2
                               }
Packit Service 50c9f2
Packit Service 50c9f2
    {FLOWKW}                   {
Packit Service 50c9f2
  		                 startFontClass("keywordflow");
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
		                 endFontClass();
Packit Service 50c9f2
                               }
Packit Service 50c9f2
    ({IDENTIFIER}".")*{IDENTIFIER}/"("  {
Packit Service 50c9f2
				 generateClassOrGlobalLink(*g_code,yytext);
Packit Service 50c9f2
      			       }
Packit Service 50c9f2
    ({IDENTIFIER}".")+{IDENTIFIER} {
Packit Service 50c9f2
				 generateClassOrGlobalLink(*g_code,yytext,TRUE);
Packit Service 50c9f2
			       }
Packit Service 50c9f2
    {IDENTIFIER}               { codify(yytext); }
Packit Service 50c9f2
		   	
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
<SuiteStart>{
Packit Service 50c9f2
Packit Service 50c9f2
    {BB}                               {
Packit Service 50c9f2
                                         codify(yytext);
Packit Service 50c9f2
                                       }
Packit Service 50c9f2
    "pass"			       {
Packit Service 50c9f2
                                          startFontClass("keyword");
Packit Service 50c9f2
					  codifyLines(yytext);
Packit Service 50c9f2
		                          endFontClass();
Packit Service 50c9f2
					  BEGIN(Body);
Packit Service 50c9f2
      				       }
Packit Service 50c9f2
    {KEYWORD}                          {
Packit Service 50c9f2
                                          startFontClass("keyword");
Packit Service 50c9f2
					  codifyLines(yytext);
Packit Service 50c9f2
		                          endFontClass();
Packit Service 50c9f2
Packit Service 50c9f2
					  // No indentation necessary
Packit Service 50c9f2
					  g_noSuiteFound = FALSE;
Packit Service 50c9f2
                                       }
Packit Service 50c9f2
Packit Service 50c9f2
    {FLOWKW}                           {
Packit Service 50c9f2
                                          startFontClass("keywordflow");
Packit Service 50c9f2
					  codifyLines(yytext);
Packit Service 50c9f2
		                          endFontClass();
Packit Service 50c9f2
Packit Service 50c9f2
					  // No indentation necessary
Packit Service 50c9f2
					  g_noSuiteFound = FALSE;
Packit Service 50c9f2
                                       }
Packit Service 50c9f2
    {IDENTIFIER}                       {
Packit Service 50c9f2
                                         codify(yytext);
Packit Service 50c9f2
				       } 
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
    {POUNDCOMMENT}                     {
Packit Service 50c9f2
  				         if (YY_START==SingleQuoteString || 
Packit Service 50c9f2
				             YY_START==DoubleQuoteString || 
Packit Service 50c9f2
				             YY_START==TripleString
Packit Service 50c9f2
				            )
Packit Service 50c9f2
				         {
Packit Service 50c9f2
				           REJECT;
Packit Service 50c9f2
				         }
Packit Service 50c9f2
                                         yy_push_state(YY_START);
Packit Service 50c9f2
				         BEGIN(DocBlock);
Packit Service 50c9f2
				         g_docBlock=yytext;
Packit Service 50c9f2
                                       }
Packit Service 50c9f2
Packit Service 50c9f2
    {NEWLINE}                          {
Packit Service 50c9f2
					  codifyLines(yytext);
Packit Service 50c9f2
					  if ( g_noSuiteFound ) 
Packit Service 50c9f2
					  {
Packit Service 50c9f2
                                            // printf("New suite to capture! [%d]\n", g_yyLineNr);
Packit Service 50c9f2
					    BEGIN ( SuiteCaptureIndent );
Packit Service 50c9f2
					  }
Packit Service 50c9f2
                                       }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
<SuiteCaptureIndent>{
Packit Service 50c9f2
    "\n"|({BB}"\n")            {
Packit Service 50c9f2
                                 // Blankline - ignore, keep looking for indentation.
Packit Service 50c9f2
				 codifyLines(yytext);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
Packit Service 50c9f2
    {BB}                       {
Packit Service 50c9f2
                                 // This state lasts momentarily,
Packit Service 50c9f2
                                 // to check the indentation
Packit Service 50c9f2
                                 // level that is about to be
Packit Service 50c9f2
                                 // used.
Packit Service 50c9f2
				 codifyLines(yytext);
Packit Service 50c9f2
				 g_indents.push(yyleng);
Packit Service 50c9f2
                                 // printf("Captured indent of %d [line %d]\n", yyleng, g_yyLineNr);
Packit Service 50c9f2
				 BEGIN( Suite );
Packit Service 50c9f2
                               }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
<SuiteMaintain>{
Packit Service 50c9f2
Packit Service 50c9f2
    {BB}/({NONEMPTY}|{EXPCHAR}) {
Packit Service 50c9f2
                                 // This implements poor
Packit Service 50c9f2
				 // indendation-tracking;
Packit Service 50c9f2
                                 // should be improved.
Packit Service 50c9f2
				 // (translate tabs to space, etc)
Packit Service 50c9f2
  		                 codifyLines(yytext);
Packit Service 50c9f2
                                 adjustScopesAndSuites((int)yyleng);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
Packit Service 50c9f2
    "\n"|({BB}"\n")            {
Packit Service 50c9f2
                                 // If this ever succeeds,
Packit Service 50c9f2
				 // it means that this is
Packit Service 50c9f2
				 // a blank line, and
Packit Service 50c9f2
				 // can be ignored.
Packit Service 50c9f2
  		                 codifyLines(yytext);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
Packit Service 50c9f2
    ""/({NONEMPTY}|{EXPCHAR})  {
Packit Service 50c9f2
                                 // Default rule; matches
Packit Service 50c9f2
				 // the empty string, assuming
Packit Service 50c9f2
				 // real text starts here.
Packit Service 50c9f2
				 // Just go straight to Body.
Packit Service 50c9f2
                                 adjustScopesAndSuites(0);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
<Suite>{NEWLINE}               {
Packit Service 50c9f2
                                 codifyLines(yytext);
Packit Service 50c9f2
			         BEGIN( SuiteMaintain );
Packit Service 50c9f2
		               }
Packit Service 50c9f2
<Body>{IDENTIFIER}	       {
Packit Service 50c9f2
  			         codify(yytext);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
<Body>{NEWLINE}                {
Packit Service 50c9f2
  		                 codifyLines(yytext);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
Packit Service 50c9f2
<SingleQuoteString>{ // Single quoted string like 'That\'s a """nice""" string!'
Packit Service 50c9f2
    \\{B}\n                    { // line continuation
Packit Service 50c9f2
  		                 codifyLines(yytext);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
    \\.			       { // espaced char
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
    {STRINGPREFIX}?{TRIDOUBLEQUOTE} { // tripple double quotes
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
      			       }
Packit Service 50c9f2
    "'"			       { // end of the string
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
				 endFontClass();
Packit Service 50c9f2
      		                 BEGIN(g_stringContext);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
    [^"'\n\\]+	               { // normal chars
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
    .			       { // normal char
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
<DoubleQuoteString>{ // Double quoted string like "That's \"a '''nice'''\" string!"
Packit Service 50c9f2
    \\{B}\n                    { // line continuation
Packit Service 50c9f2
  		                 codifyLines(yytext);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
    \\.			       { // espaced char
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
    {STRINGPREFIX}?{TRISINGLEQUOTE} { // tripple single quotes
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
      			       }
Packit Service 50c9f2
    "\""		       { // end of the string
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
				 endFontClass();
Packit Service 50c9f2
      		                 BEGIN(g_stringContext);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
    [^"'\n\\]+	               { // normal chars
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
    .			       { // normal char
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
<TripleString>{
Packit Service 50c9f2
    {TRIDOUBLEQUOTE}   | 
Packit Service 50c9f2
    {TRISINGLEQUOTE}   {
Packit Service 50c9f2
  		          codify(yytext);
Packit Service 50c9f2
			  if (g_doubleQuote==(yytext[0]=='"')) 
Packit Service 50c9f2
			  {
Packit Service 50c9f2
			    endFontClass();
Packit Service 50c9f2
			    BEGIN(g_stringContext);
Packit Service 50c9f2
			  }
Packit Service 50c9f2
		       }
Packit Service 50c9f2
    {LONGSTRINGBLOCK}  {
Packit Service 50c9f2
			 codifyLines(yytext);
Packit Service 50c9f2
		       }
Packit Service 50c9f2
    \n		       {
Packit Service 50c9f2
			 codifyLines(yytext);
Packit Service 50c9f2
                       }
Packit Service 50c9f2
    .		       {
Packit Service 50c9f2
                         codify(yytext);
Packit Service 50c9f2
                       }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
  /*
Packit Service 50c9f2
<*>({NONEMPTY}|{EXPCHAR}|{BB})           { // This should go one character at a time.
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
				 // printf("[pycode] '%s' [ state %d ]  [line %d] no match\n",
Packit Service 50c9f2
				 //       yytext, YY_START, g_yyLineNr);
Packit Service 50c9f2
Packit Service 50c9f2
				 //endFontClass();
Packit Service 50c9f2
				 BEGIN(Body);					
Packit Service 50c9f2
                               }
Packit Service 50c9f2
   */
Packit Service 50c9f2
Packit Service 50c9f2
<*>{STRINGPREFIX}?{TRISINGLEQUOTE} |
Packit Service 50c9f2
<*>{STRINGPREFIX}?{TRIDOUBLEQUOTE} {
Packit Service 50c9f2
  				 startFontClass("stringliteral");
Packit Service 50c9f2
				 g_stringContext=YY_START;
Packit Service 50c9f2
				 g_doubleQuote=yytext[yyleng-1]=='"';
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
				 BEGIN(TripleString);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
<*>{STRINGPREFIX}?"'"	       { // single quoted string
Packit Service 50c9f2
  				 startFontClass("stringliteral");
Packit Service 50c9f2
				 g_stringContext=YY_START;
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
				 BEGIN(SingleQuoteString);
Packit Service 50c9f2
  			       }
Packit Service 50c9f2
<*>{STRINGPREFIX}?"\""         { // double quoted string
Packit Service 50c9f2
  				 startFontClass("stringliteral");
Packit Service 50c9f2
				 g_stringContext=YY_START;
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
				 BEGIN(DoubleQuoteString);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
<DocBlock>.*    	       { // contents of current comment line
Packit Service 50c9f2
                                 g_docBlock+=yytext;
Packit Service 50c9f2
  			       }
Packit Service 50c9f2
<DocBlock>"\n"{B}("#")         { // comment block (next line is also comment line)
Packit Service 50c9f2
				 g_docBlock+=yytext; 
Packit Service 50c9f2
   			       }
Packit Service 50c9f2
<DocBlock>{NEWLINE}            { // comment block ends at the end of this line
Packit Service 50c9f2
                                 // remove special comment (default config)
Packit Service 50c9f2
				 if (Config_getBool(STRIP_CODE_COMMENTS))
Packit Service 50c9f2
				 {
Packit Service 50c9f2
				    g_yyLineNr+=((QCString)g_docBlock).contains('\n');
Packit Service 50c9f2
				    g_endComment=TRUE;
Packit Service 50c9f2
				  }
Packit Service 50c9f2
				  else // do not remove comment
Packit Service 50c9f2
				  {
Packit Service 50c9f2
				    startFontClass("comment");
Packit Service 50c9f2
				    codifyLines(g_docBlock);
Packit Service 50c9f2
				    endFontClass();
Packit Service 50c9f2
				  }
Packit Service 50c9f2
				  unput(*yytext);
Packit Service 50c9f2
				  yy_pop_state();
Packit Service 50c9f2
			       }
Packit Service 50c9f2
<*>{POUNDCOMMENT}.*            {
Packit Service 50c9f2
  				 if (YY_START==SingleQuoteString || 
Packit Service 50c9f2
				     YY_START==DoubleQuoteString || 
Packit Service 50c9f2
				     YY_START==TripleString
Packit Service 50c9f2
				    )
Packit Service 50c9f2
				 {
Packit Service 50c9f2
				   REJECT;
Packit Service 50c9f2
				 }
Packit Service 50c9f2
                                 yy_push_state(YY_START);
Packit Service 50c9f2
				 BEGIN(DocBlock);
Packit Service 50c9f2
				 g_docBlock=yytext;
Packit Service 50c9f2
                               }
Packit Service 50c9f2
<*>"#".*                       { // normal comment
Packit Service 50c9f2
  				 if (YY_START==SingleQuoteString || 
Packit Service 50c9f2
				     YY_START==DoubleQuoteString || 
Packit Service 50c9f2
				     YY_START==TripleString
Packit Service 50c9f2
				    )
Packit Service 50c9f2
				 {
Packit Service 50c9f2
				   REJECT;
Packit Service 50c9f2
				 }
Packit Service 50c9f2
                                 startFontClass("comment");
Packit Service 50c9f2
                                 codifyLines(yytext);
Packit Service 50c9f2
                                 endFontClass();
Packit Service 50c9f2
                               }
Packit Service 50c9f2
<*>{NEWLINE}                   {
Packit Service 50c9f2
				  if (g_endComment)
Packit Service 50c9f2
				  {
Packit Service 50c9f2
				    g_endComment=FALSE;
Packit Service 50c9f2
				  }
Packit Service 50c9f2
				  else
Packit Service 50c9f2
				  {
Packit Service 50c9f2
				    codifyLines(yytext);
Packit Service 50c9f2
				  }
Packit Service 50c9f2
				 //printf("[pycode] %d NEWLINE [line %d] no match\n",
Packit Service 50c9f2
				 //       YY_START, g_yyLineNr);
Packit Service 50c9f2
Packit Service 50c9f2
				 //endFontClass();
Packit Service 50c9f2
				 BEGIN(Body);
Packit Service 50c9f2
                               }
Packit Service 50c9f2
Packit Service 50c9f2
<*>[ \t]+                      {
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
				 BEGIN(Body);					
Packit Service 50c9f2
  			       }
Packit Service 50c9f2
<*>.                           {
Packit Service 50c9f2
  		                 codify(yytext);
Packit Service 50c9f2
				 // printf("[pycode] '%s' [ state %d ]  [line %d] no match\n",
Packit Service 50c9f2
				 //        yytext, YY_START, g_yyLineNr);
Packit Service 50c9f2
Packit Service 50c9f2
				 //endFontClass();
Packit Service 50c9f2
				 BEGIN(Body);					
Packit Service 50c9f2
                               }
Packit Service 50c9f2
Packit Service 50c9f2
<*><<EOF>>                     {
Packit Service 50c9f2
                                 if (YY_START == DocBlock) {
Packit Service 50c9f2
                                   if (!Config_getBool(STRIP_CODE_COMMENTS))
Packit Service 50c9f2
                                   {
Packit Service 50c9f2
                                     startFontClass("comment");
Packit Service 50c9f2
                                     codifyLines(g_docBlock);
Packit Service 50c9f2
                                     endFontClass();
Packit Service 50c9f2
                                   }
Packit Service 50c9f2
                                 }
Packit Service 50c9f2
                                 yyterminate();
Packit Service 50c9f2
                               }
Packit Service 50c9f2
%%
Packit Service 50c9f2
Packit Service 50c9f2
/*@ ----------------------------------------------------------------------------
Packit Service 50c9f2
 */
Packit Service 50c9f2
Packit Service 50c9f2
void resetPythonCodeParserState() 
Packit Service 50c9f2
{
Packit Service 50c9f2
  g_currentDefinition = 0;
Packit Service 50c9f2
  g_currentMemberDef = 0;
Packit Service 50c9f2
  g_doubleStringIsDoc = FALSE;
Packit Service 50c9f2
  g_paramParens = 0;
Packit Service 50c9f2
  g_indents.clear();
Packit Service 50c9f2
  BEGIN( Body );
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
/*!
Packit Service 50c9f2
  Examines current stack of white-space indentations;
Packit Service 50c9f2
  re-syncs the parser with the correct scope.
Packit Service 50c9f2
*/
Packit Service 50c9f2
static void adjustScopesAndSuites(unsigned indentLength) 
Packit Service 50c9f2
{
Packit Service 50c9f2
  // States to pop
Packit Service 50c9f2
  if (!g_indents.isEmpty() && indentLength < g_indents.top()) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    while (!g_indents.isEmpty() && indentLength < g_indents.top()) 
Packit Service 50c9f2
    {
Packit Service 50c9f2
      // printf("Exited scope indent of [%d]\n", g_indents.top());
Packit Service 50c9f2
      g_indents.pop(); // Pop the old suite's indentation
Packit Service 50c9f2
Packit Service 50c9f2
      g_currentMemberDef=0;
Packit Service 50c9f2
      if (g_currentDefinition) 
Packit Service 50c9f2
	g_currentDefinition=g_currentDefinition->getOuterScope();
Packit Service 50c9f2
    }
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  // Are there any remaining indentation levels for suites?
Packit Service 50c9f2
  if (!g_indents.isEmpty()) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    BEGIN( Suite );
Packit Service 50c9f2
  }
Packit Service 50c9f2
  else 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    BEGIN( Body );
Packit Service 50c9f2
  }
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
void parsePythonCode(CodeOutputInterface &od,const char * /*className*/,
Packit Service 50c9f2
                 const QCString &s,bool exBlock, const char *exName,
Packit Service 50c9f2
                 FileDef *fd,int startLine,int endLine,bool inlineFragment,
Packit Service 50c9f2
                 MemberDef *,bool,Definition *searchCtx,bool collectXRefs) 
Packit Service 50c9f2
{
Packit Service 50c9f2
Packit Service 50c9f2
  //printf("***parseCode()\n");
Packit Service 50c9f2
  
Packit Service 50c9f2
  //--------------------------------------
Packit Service 50c9f2
  if (s.isEmpty()) return;
Packit Service 50c9f2
  printlex(yy_flex_debug, TRUE, __FILE__, fd ? fd->fileName().data(): NULL);
Packit Service 50c9f2
  TooltipManager::instance()->clearTooltips();
Packit Service 50c9f2
  g_code = &od;
Packit Service 50c9f2
  g_inputString   = s;
Packit Service 50c9f2
  g_inputPosition = 0;
Packit Service 50c9f2
  g_currentFontClass = 0;
Packit Service 50c9f2
  g_needsTermination = FALSE;
Packit Service 50c9f2
  g_searchCtx=searchCtx;
Packit Service 50c9f2
  g_collectXRefs=collectXRefs;
Packit Service 50c9f2
  if (startLine!=-1)
Packit Service 50c9f2
    g_yyLineNr    = startLine;
Packit Service 50c9f2
  else
Packit Service 50c9f2
    g_yyLineNr    = 1;
Packit Service 50c9f2
  if (endLine!=-1)
Packit Service 50c9f2
    g_inputLines  = endLine+1;
Packit Service 50c9f2
  else
Packit Service 50c9f2
    g_inputLines  = g_yyLineNr + countLines() - 1;
Packit Service 50c9f2
  
Packit Service 50c9f2
  
Packit Service 50c9f2
  g_exampleBlock  = exBlock; 
Packit Service 50c9f2
  g_exampleName   = exName;
Packit Service 50c9f2
  g_sourceFileDef = fd;
Packit Service 50c9f2
Packit Service 50c9f2
  bool cleanupSourceDef = FALSE;
Packit Service 50c9f2
  if (exBlock && fd==0)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    // create a dummy filedef for the example
Packit Service 50c9f2
    g_sourceFileDef = new FileDef("",(exName?exName:"generated"));
Packit Service 50c9f2
    cleanupSourceDef = TRUE;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (g_sourceFileDef) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    setCurrentDoc("l00001");
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  g_includeCodeFragment = inlineFragment;
Packit Service 50c9f2
  // Starts line 1 on the output  
Packit Service 50c9f2
  startCodeLine();
Packit Service 50c9f2
Packit Service 50c9f2
  pycodeYYrestart( pycodeYYin );
Packit Service 50c9f2
Packit Service 50c9f2
  pycodeYYlex();
Packit Service 50c9f2
Packit Service 50c9f2
  if (!g_indents.isEmpty()) 
Packit Service 50c9f2
  {
Packit Service 50c9f2
    // printf("Exited pysourceparser in inconsistent state!\n");
Packit Service 50c9f2
  }
Packit Service 50c9f2
Packit Service 50c9f2
  if (g_needsTermination)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    endCodeLine();
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (fd)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    TooltipManager::instance()->writeTooltips(*g_code);
Packit Service 50c9f2
  }
Packit Service 50c9f2
  if (cleanupSourceDef)
Packit Service 50c9f2
  {
Packit Service 50c9f2
    // delete the temporary file definition used for this example
Packit Service 50c9f2
    delete g_sourceFileDef;
Packit Service 50c9f2
    g_sourceFileDef=0;
Packit Service 50c9f2
  }
Packit Service 50c9f2
  printlex(yy_flex_debug, FALSE, __FILE__, fd ? fd->fileName().data(): NULL);
Packit Service 50c9f2
  return;
Packit Service 50c9f2
}
Packit Service 50c9f2
Packit Service 50c9f2
Packit Service 50c9f2
#if !defined(YY_FLEX_SUBMINOR_VERSION) 
Packit Service 50c9f2
extern "C" { // some bogus code to keep the compiler happy
Packit Service 50c9f2
  void pycodeYYdummy() { yy_flex_realloc(0,0); } 
Packit Service 50c9f2
}
Packit Service 50c9f2
#elif YY_FLEX_MAJOR_VERSION<=2 && YY_FLEX_MINOR_VERSION<=5 && YY_FLEX_SUBMINOR_VERSION<33
Packit Service 50c9f2
#error "You seem to be using a version of flex newer than 2.5.4. These are currently incompatible with 2.5.4, and do NOT work with doxygen! Please use version 2.5.4 or expect things to be parsed wrongly! A bug report has been submitted (#732132)."
Packit Service 50c9f2
#endif
Packit Service 50c9f2