diff options
author | DongHun Kwak <dh0128.kwak@samsung.com> | 2021-10-15 10:51:39 +0900 |
---|---|---|
committer | DongHun Kwak <dh0128.kwak@samsung.com> | 2021-10-15 10:51:39 +0900 |
commit | a65b883ee4bf1831f586218430470f0a493bbe5a (patch) | |
tree | 996f4f9fcfe434eb0fab959769d2ba0225397327 | |
parent | b65cb2d67b946445ba89e1938cee8527969922cd (diff) | |
download | doxygen-a65b883ee4bf1831f586218430470f0a493bbe5a.tar.gz doxygen-a65b883ee4bf1831f586218430470f0a493bbe5a.tar.bz2 doxygen-a65b883ee4bf1831f586218430470f0a493bbe5a.zip |
Imported Upstream version 1.8.8upstream/1.8.8
180 files changed, 43160 insertions, 8709 deletions
@@ -17,6 +17,8 @@ /libmd5/Makefile.libmd5 /qtools/Makefile /qtools/Makefile.qtools +/vhdlparser/Makefile +/vhdlparser/Makefile.vhdlparser /src/Makefile.doxygen /src/Makefile.libdoxycfg /src/Makefile.libdoxygen @@ -1,4 +1,4 @@ -# Doxyfile 1.8.3.1 +# Doxyfile 1.8.7 #--------------------------------------------------------------------------- # Project related configuration options @@ -10,6 +10,7 @@ PROJECT_BRIEF = PROJECT_LOGO = OUTPUT_DIRECTORY = doxygen_docs CREATE_SUBDIRS = YES +ALLOW_UNICODE_NAMES = NO OUTPUT_LANGUAGE = English BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES @@ -63,6 +64,7 @@ INTERNAL_DOCS = NO CASE_SENSE_NAMES = NO HIDE_SCOPE_NAMES = NO SHOW_INCLUDE_FILES = YES +SHOW_GROUPED_MEMB_INC = NO FORCE_LOCAL_INCLUDES = NO INLINE_INFO = YES SORT_MEMBER_DOCS = YES @@ -84,7 +86,7 @@ FILE_VERSION_FILTER = LAYOUT_FILE = CITE_BIB_FILES = #--------------------------------------------------------------------------- -# configuration options related to warning and progress messages +# Configuration options related to warning and progress messages #--------------------------------------------------------------------------- QUIET = NO WARNINGS = YES @@ -94,9 +96,10 @@ WARN_NO_PARAMDOC = NO WARN_FORMAT = "$file:$line: $text " WARN_LOGFILE = #--------------------------------------------------------------------------- -# configuration options related to the input files +# Configuration options related to the input files #--------------------------------------------------------------------------- -INPUT = src +INPUT = src \ + vhdlparser INPUT_ENCODING = UTF-8 FILE_PATTERNS = *.h \ *.cpp \ @@ -105,6 +108,7 @@ RECURSIVE = NO EXCLUDE = src/logos.cpp \ src/lodepng.cpp EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = EXCLUDE_SYMBOLS = EXAMPLE_PATH = EXAMPLE_PATTERNS = @@ -116,7 +120,7 @@ FILTER_SOURCE_FILES = NO FILTER_SOURCE_PATTERNS = USE_MDFILE_AS_MAINPAGE = #--------------------------------------------------------------------------- -# configuration options related to source browsing +# Configuration options related to source browsing #--------------------------------------------------------------------------- SOURCE_BROWSER = YES INLINE_SOURCES = NO @@ -124,18 +128,17 @@ STRIP_CODE_COMMENTS = YES REFERENCED_BY_RELATION = YES REFERENCES_RELATION = YES REFERENCES_LINK_SOURCE = YES +SOURCE_TOOLTIPS = YES USE_HTAGS = NO VERBATIM_HEADERS = YES -CLANG_ASSISTED_PARSING = YES -CLANG_OPTIONS = #--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index +# Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- ALPHABETICAL_INDEX = YES COLS_IN_ALPHA_INDEX = 5 IGNORE_PREFIX = #--------------------------------------------------------------------------- -# configuration options related to the HTML output +# Configuration options related to the HTML output #--------------------------------------------------------------------------- GENERATE_HTML = YES HTML_OUTPUT = @@ -173,7 +176,7 @@ QHP_SECT_FILTER_ATTRS = QHG_LOCATION = GENERATE_ECLIPSEHELP = NO ECLIPSE_DOC_ID = org.doxygen.Project -DISABLE_INDEX = YES +DISABLE_INDEX = NO GENERATE_TREEVIEW = YES ENUM_VALUES_PER_LINE = 4 TREEVIEW_WIDTH = 250 @@ -184,6 +187,7 @@ USE_MATHJAX = NO MATHJAX_FORMAT = HTML-CSS MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest MATHJAX_EXTENSIONS = +MATHJAX_CODEFILE = SEARCHENGINE = YES SERVER_BASED_SEARCH = YES EXTERNAL_SEARCH = NO @@ -192,7 +196,7 @@ SEARCHDATA_FILE = searchdata.xml EXTERNAL_SEARCH_ID = EXTRA_SEARCH_MAPPINGS = #--------------------------------------------------------------------------- -# configuration options related to the LaTeX output +# Configuration options related to the LaTeX output #--------------------------------------------------------------------------- GENERATE_LATEX = NO LATEX_OUTPUT = @@ -211,7 +215,7 @@ LATEX_HIDE_INDICES = NO LATEX_SOURCE_CODE = NO LATEX_BIB_STYLE = plain #--------------------------------------------------------------------------- -# configuration options related to the RTF output +# Configuration options related to the RTF output #--------------------------------------------------------------------------- GENERATE_RTF = NO RTF_OUTPUT = @@ -220,31 +224,31 @@ RTF_HYPERLINKS = NO RTF_STYLESHEET_FILE = RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- -# configuration options related to the man page output +# Configuration options related to the man page output #--------------------------------------------------------------------------- GENERATE_MAN = NO MAN_OUTPUT = MAN_EXTENSION = .3 +MAN_SUBDIR = MAN_LINKS = NO #--------------------------------------------------------------------------- -# configuration options related to the XML output +# Configuration options related to the XML output #--------------------------------------------------------------------------- GENERATE_XML = NO XML_OUTPUT = xml -XML_SCHEMA = -XML_DTD = XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- -# configuration options related to the DOCBOOK output +# Configuration options related to the DOCBOOK output #--------------------------------------------------------------------------- GENERATE_DOCBOOK = NO DOCBOOK_OUTPUT = docbook +DOCBOOK_PROGRAMLISTING = NO #--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output +# Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- -# configuration options related to the Perl module output +# Configuration options related to the Perl module output #--------------------------------------------------------------------------- GENERATE_PERLMOD = NO PERLMOD_LATEX = NO @@ -257,13 +261,14 @@ ENABLE_PREPROCESSING = YES MACRO_EXPANSION = YES EXPAND_ONLY_PREDEF = YES SEARCH_INCLUDES = YES -INCLUDE_PATH = qtools libmd5 +INCLUDE_PATH = qtools \ + libmd5 INCLUDE_FILE_PATTERNS = PREDEFINED = EXPAND_AS_DEFINED = SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- -# Configuration::additions related to external references +# Configuration options related to external references #--------------------------------------------------------------------------- TAGFILES = qtools_docs/qtools.tag=../../qtools_docs/html GENERATE_TAGFILE = doxygen.tag @@ -276,6 +281,7 @@ PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- CLASS_DIAGRAMS = NO MSCGEN_PATH = +DIA_PATH = HIDE_UNDOC_RELATIONS = YES HAVE_DOT = YES DOT_NUM_THREADS = 0 @@ -299,6 +305,8 @@ INTERACTIVE_SVG = YES DOT_PATH = DOTFILE_DIRS = MSCFILE_DIRS = +DIAFILE_DIRS = +PLANTUML_JAR_PATH = DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 0 DOT_TRANSPARENT = NO @@ -1,7 +1,7 @@ -DOXYGEN Version 1.8.4 +DOXYGEN Please read the installation section of the manual (http://www.doxygen.org/install.html) for instructions. -------- -Dimitri van Heesch (19 May 2013) +Dimitri van Heesch diff --git a/Makefile.in b/Makefile.in index b5918ba..a83f08b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -21,6 +21,7 @@ clean: FORCE - cd qtools ; $(MAKE) clean - cd src ; $(MAKE) clean - cd libmd5 ; $(MAKE) clean + - cd vhdlparser ; $(MAKE) clean -cd addon/doxywizard ; $(MAKE) clean -cd addon/doxysearch ; $(MAKE) clean -cd addon/doxyapp ; $(MAKE) clean @@ -33,6 +34,7 @@ clean: FORCE distclean: clean -cd src ; $(MAKE) distclean -cd libmd5 ; $(MAKE) distclean + -cd vhdlparser ; $(MAKE) distclean -cd addon/doxywizard ; $(MAKE) distclean -cd addon/doxysearch ; $(MAKE) distclean -cd addon/doxyapp ; $(MAKE) distclean @@ -52,8 +54,9 @@ distclean: clean -rm -f src/Makefile.doxygen src/Makefile.libdoxygen -rm -f src/Makefile.libdoxycfg src/libdoxycfg.t src/libdoxygen.t -rm -f libmd5/Makefile.libmd5 + -rm -f vhdlparser/Makefile.vhdlparser -rm -f .makeconfig .tmakeconfig - -rm -f src/doxygen.pro src/libdoxygen.pro qtools/qtools.pro src/libdoxycfg.pro libmd5/libmd5.pro + -rm -f src/doxygen.pro src/libdoxygen.pro qtools/qtools.pro src/libdoxycfg.pro libmd5/libmd5.pro vhdlparser/vhdlparser.pro -rm -rf generated_src -rm -f addon/doxywizard/doxywizard.pro -rm -f VERSION @@ -95,7 +98,7 @@ docs: FORCE pdf: docs cd latex ; $(MAKE) -DISTFILES = Doxyfile libmd5 addon tmake doc examples bin lib objects testing \ +DISTFILES = Doxyfile vhdlparser libmd5 addon tmake doc examples bin lib objects testing \ qtools src configure configure.bin Makefile.in Makefile.win_nmake.in \ Makefile.win_make.in INSTALL LANGUAGE.HOWTO LICENSE PLATFORMS \ VERSION README.md packages winbuild jquery diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp index 99310a1..26df065 100644 --- a/addon/doxywizard/doxywizard.cpp +++ b/addon/doxywizard/doxywizard.cpp @@ -97,15 +97,15 @@ MainWindow::MainWindow() grid->addLayout(launchLayout,1,0); runTabLayout->addLayout(grid); - QTabWidget *tabs = new QTabWidget; - tabs->addTab(m_wizard,tr("Wizard")); - tabs->addTab(m_expert,tr("Expert")); - tabs->addTab(runTab,tr("Run")); + m_tabs = new QTabWidget; + m_tabs->addTab(m_wizard,tr("Wizard")); + m_tabs->addTab(m_expert,tr("Expert")); + m_tabs->addTab(runTab,tr("Run")); rowLayout->addWidget(new QLabel(tr("Step 1: Specify the working directory from which doxygen will run"))); rowLayout->addLayout(dirLayout); rowLayout->addWidget(new QLabel(tr("Step 2: Configure doxygen using the Wizard and/or Expert tab, then switch to the Run tab to generate the documentation"))); - rowLayout->addWidget(tabs); + rowLayout->addWidget(m_tabs); setCentralWidget(topPart); statusBar()->showMessage(tr("Welcome to Doxygen"),messageTimeout); @@ -115,7 +115,7 @@ MainWindow::MainWindow() m_timer = new QTimer; // connect signals and slots - connect(tabs,SIGNAL(currentChanged(int)),SLOT(selectTab(int))); + connect(m_tabs,SIGNAL(currentChanged(int)),SLOT(selectTab(int))); connect(m_selWorkingDir,SIGNAL(clicked()),SLOT(selectWorkingDir())); connect(m_recentMenu,SIGNAL(triggered(QAction*)),SLOT(openRecent(QAction*))); connect(m_workingDir,SIGNAL(returnPressed()),SLOT(updateWorkingDir())); @@ -127,6 +127,8 @@ MainWindow::MainWindow() connect(m_saveLog,SIGNAL(clicked()),SLOT(saveLog())); connect(showSettings,SIGNAL(clicked()),SLOT(showSettings())); connect(m_expert,SIGNAL(changed()),SLOT(configChanged())); + connect(m_wizard,SIGNAL(done()),SLOT(selectRunTab())); + connect(m_expert,SIGNAL(done()),SLOT(selectRunTab())); loadSettings(); updateLaunchButtonState(); @@ -191,7 +193,7 @@ void MainWindow::about() t << QString::fromAscii("<qt><center>A tool to configure and run doxygen version ")+ QString::fromAscii(versionString)+ QString::fromAscii(" on your source files.</center><p><br>" - "<center>Written by<br> Dimitri van Heesch<br>© 2000-2013</center><p>" + "<center>Written by<br> Dimitri van Heesch<br>© 2000-2014</center><p>" "</qt>"); QMessageBox::about(this,tr("Doxygen GUI"),msg); } @@ -371,6 +373,12 @@ void MainWindow::saveSettings() void MainWindow::selectTab(int id) { if (id==0) m_wizard->refresh(); + else if (id==1) m_expert->refresh(); +} + +void MainWindow::selectRunTab() +{ + m_tabs->setCurrentIndex(2); } void MainWindow::addRecentFile(const QString &fileName) diff --git a/addon/doxywizard/doxywizard.h b/addon/doxywizard/doxywizard.h index 46cd748..189972f 100644 --- a/addon/doxywizard/doxywizard.h +++ b/addon/doxywizard/doxywizard.h @@ -14,6 +14,7 @@ class QTextEdit; class QMenu; class QProcess; class QTimer; +class QTabWidget; class MainWindow : public QMainWindow { @@ -51,6 +52,7 @@ class MainWindow : public QMainWindow void showSettings(); void configChanged(); void clearRecent(); + void selectRunTab(); private: MainWindow(); @@ -77,6 +79,7 @@ class MainWindow : public QMainWindow QStringList m_recentFiles; QProcess *m_runProcess; QTimer *m_timer; + QTabWidget *m_tabs; bool m_running; bool m_modified; }; diff --git a/addon/doxywizard/doxywizard.pro.in b/addon/doxywizard/doxywizard.pro.in index 0c8d049..1ad36a9 100644 --- a/addon/doxywizard/doxywizard.pro.in +++ b/addon/doxywizard/doxywizard.pro.in @@ -15,7 +15,7 @@ RCC_DIR = ../../rcc/doxywizard DEFINES += QT_NO_CAST_FROM_ASCII QT_NO_CAST_TO_ASCII macx-g++ { - CONFIG += x86 + CONFIG += x86 x86_64 } # Input @@ -24,11 +24,10 @@ HEADERS += doxywizard.h version.h expert.h config.h helplabel.h \ SOURCES += doxywizard.cpp expert.cpp wizard.cpp \ inputbool.cpp inputstring.cpp inputint.cpp inputstrlist.cpp RESOURCES += doxywizard.qrc -INCBUFSIZE=$(PYTHON) ../../src/increasebuffer.py win32:RC_FILE += doxywizard.rc config.target = ../../generated_src/doxywizard/config_doxyw.cpp -config.commands = $(LEX) -Pconfig_doxywYY -t ../../addon/doxywizard/config_doxyw.l | $(INCBUFSIZE) >../../generated_src/doxywizard/$*.cpp +config.commands = $(LEX) -Pconfig_doxywYY -t ../../addon/doxywizard/config_doxyw.l | $(PYTHON) ../../src/increasebuffer.py >../../generated_src/doxywizard/$*.cpp config.depends = ../../addon/doxywizard/config_doxyw.l ../../src/increasebuffer.py configdoc.target = ../../generated_src/doxywizard/configdoc.cpp configdoc.commands = $(PYTHON) ../../src/configgen.py -wiz ../../src/config.xml > ../../generated_src/doxywizard/configdoc.cpp diff --git a/addon/doxywizard/expert.cpp b/addon/doxywizard/expert.cpp index fe6609e..1cc5d15 100644 --- a/addon/doxywizard/expert.cpp +++ b/addon/doxywizard/expert.cpp @@ -683,7 +683,7 @@ void Expert::activateTopic(QTreeWidgetItem *item,QTreeWidgetItem *) QWidget *w = m_topics[item->text(0)]; m_topicStack->setCurrentWidget(w); m_prev->setEnabled(m_topicStack->currentIndex()!=0); - m_next->setEnabled(m_topicStack->currentIndex()!=m_topicStack->count()-1); + m_next->setEnabled(true); } } @@ -824,10 +824,17 @@ void Expert::showHelp(Input *option) void Expert::nextTopic() { - m_topicStack->setCurrentIndex(m_topicStack->currentIndex()+1); - m_next->setEnabled(m_topicStack->count()!=m_topicStack->currentIndex()+1); - m_prev->setEnabled(m_topicStack->currentIndex()!=0); - m_treeWidget->setCurrentItem(m_treeWidget->invisibleRootItem()->child(m_topicStack->currentIndex())); + if (m_topicStack->currentIndex()+1==m_topicStack->count()) // last topic + { + done(); + } + else + { + m_topicStack->setCurrentIndex(m_topicStack->currentIndex()+1); + m_next->setEnabled(m_topicStack->count()!=m_topicStack->currentIndex()+1); + m_prev->setEnabled(m_topicStack->currentIndex()!=0); + m_treeWidget->setCurrentItem(m_treeWidget->invisibleRootItem()->child(m_topicStack->currentIndex())); + } } void Expert::prevTopic() @@ -931,3 +938,8 @@ bool Expert::pdfOutputPresent(const QString &workingDir) const return fi.exists() && fi.isFile(); } +void Expert::refresh() +{ + m_treeWidget->setCurrentItem(m_treeWidget->invisibleRootItem()->child(0)); +} + diff --git a/addon/doxywizard/expert.h b/addon/doxywizard/expert.h index 2c65446..ff571cb 100644 --- a/addon/doxywizard/expert.h +++ b/addon/doxywizard/expert.h @@ -42,6 +42,7 @@ class Expert : public QSplitter, public DocIntf public slots: void activateTopic(QTreeWidgetItem *,QTreeWidgetItem *); QWidget *createTopicWidget(QDomElement &elem); + void refresh(); private slots: void showHelp(Input *); @@ -50,6 +51,7 @@ class Expert : public QSplitter, public DocIntf signals: void changed(); + void done(); private: void createTopics(const QDomElement &); diff --git a/addon/doxywizard/inputstring.cpp b/addon/doxywizard/inputstring.cpp index ad258f7..48ede55 100644 --- a/addon/doxywizard/inputstring.cpp +++ b/addon/doxywizard/inputstring.cpp @@ -167,7 +167,7 @@ void InputString::setEnabled(bool state) { m_lab->setEnabled(state); if (m_le) m_le->setEnabled(state); - if (m_im) m_le->setEnabled(state); + if (m_im) m_im->setEnabled(state); if (m_br) m_br->setEnabled(state); if (m_com) m_com->setEnabled(state); updateDefault(); diff --git a/addon/doxywizard/wizard.cpp b/addon/doxywizard/wizard.cpp index 56933e0..a8b7f94 100644 --- a/addon/doxywizard/wizard.cpp +++ b/addon/doxywizard/wizard.cpp @@ -1292,17 +1292,24 @@ void Wizard::activateTopic(QTreeWidgetItem *item,QTreeWidgetItem *) { m_topicStack->setCurrentWidget(m_step4); m_prev->setEnabled(true); - m_next->setEnabled(false); + m_next->setEnabled(true); } } } void Wizard::nextTopic() { - m_topicStack->setCurrentIndex(m_topicStack->currentIndex()+1); - m_next->setEnabled(m_topicStack->count()!=m_topicStack->currentIndex()+1); - m_prev->setEnabled(m_topicStack->currentIndex()!=0); - m_treeWidget->setCurrentItem(m_treeWidget->invisibleRootItem()->child(m_topicStack->currentIndex())); + if (m_topicStack->currentIndex()+1==m_topicStack->count()) // last topic + { + done(); + } + else + { + m_topicStack->setCurrentIndex(m_topicStack->currentIndex()+1); + m_next->setEnabled(m_topicStack->count()!=m_topicStack->currentIndex()+1); + m_prev->setEnabled(m_topicStack->currentIndex()!=0); + m_treeWidget->setCurrentItem(m_treeWidget->invisibleRootItem()->child(m_topicStack->currentIndex())); + } } void Wizard::prevTopic() @@ -1315,6 +1322,7 @@ void Wizard::prevTopic() void Wizard::refresh() { + m_treeWidget->setCurrentItem(m_treeWidget->invisibleRootItem()->child(0)); m_step1->init(); m_step2->init(); m_step3->init(); diff --git a/addon/doxywizard/wizard.h b/addon/doxywizard/wizard.h index a18df62..4d5eb9d 100644 --- a/addon/doxywizard/wizard.h +++ b/addon/doxywizard/wizard.h @@ -238,6 +238,9 @@ class Wizard : public QSplitter void nextTopic(); void prevTopic(); + signals: + void done(); + private: const QHash<QString,Input *> &m_modelData; QTreeWidget *m_treeWidget; @@ -17,7 +17,7 @@ doxygen_version_major=1 doxygen_version_minor=8 -doxygen_version_revision=7 +doxygen_version_revision=8 #NOTE: Setting version_mmn to "NO" will omit mmn info from the package. doxygen_version_mmn=NO @@ -51,7 +51,7 @@ f_libclangstatic=NO # first setup the list with availabe languages, so we cannot forget any # list will be in case as specified (f_langs) and in uppercase (f_ulangs) as used in the internal perl script # -f_langs=`ls -1 src/translator_??.h | sed -e 's%src/translator_%%g' | sed -e 's/\.h//' | tr '\012' ',' | sed -e 's/,$//'` +f_langs=`ls -1 src/translator_??.h | sed -e 's%src/translator_%%g' | sed -e 's/\.h//' | tr '\012' ','` while test -n "$1"; do case $1 in @@ -594,9 +594,10 @@ fi # - check for python ---------------------------------------------------------- +python_version=0 printf " Checking for python... " if test "$f_python" = NO; then - python_names="python2 python" + python_names="python3 python2 python" python_dirs="$bin_dirs /usr/bin /usr/local/bin /bin /sbin" python_prog=NO python_found=NO @@ -604,26 +605,33 @@ if test "$f_python" = NO; then for j in $python_dirs; do if test -x "$j/$i"; then python_found=YES - if test `$j/$i -c "import sys; print sys.version_info[0]"` = 2; then - python_prog="$j/$i" + if test `$j/$i -c "import sys; print(sys.version_info[0])"` = 3; then + python_prog="$j/$i"; + python_version=`$j/$i -c "import platform; print(platform.python_version())"`; break 2 + elif test `$j/$i -c "import sys; print(sys.version_info[0])"` = 2; then + if test `$j/$i -c "import sys; print(sys.version_info[1])"` -ge 6; then + python_prog="$j/$i"; + python_version=`$j/$i -c "import platform; print(platform.python_version())"`; + break 2 + fi fi fi done done - f_python="$python_prog" + f_python="$python_prog" fi if test "$f_python" = NO; then if test "$python_found" = YES; then - echo "version should be python 2." + echo "version should be python 2.6 or higher." else echo "not found!"; fi echo exit 2 fi -echo "using $f_python"; +echo "using $f_python (version $python_version)"; # - check for perl ------------------------------------------------------------ @@ -708,11 +716,11 @@ fi # ----------------------------------------------------------------------------- -if ! test -d "generated_src/doxygen"; then +if test '!' -d "generated_src/doxygen"; then mkdir -p generated_src/doxygen fi if test "$f_wizard" = YES; then - if ! test -d "generated_src/doxywizard"; then + if test '!' -d "generated_src/doxywizard"; then mkdir -p generated_src/doxywizard fi fi @@ -748,6 +756,7 @@ ENV = env TMAKEPATH="\$(TMAKEPATH)" TMAKE = $configPWD/tmake/bin/tmake MAKE = $f_make PYTHON = $f_python +PERL = $f_perl LEX = $f_flex RM = rm -f CP = cp @@ -859,7 +868,7 @@ INCLUDEPATH += $XAPIAN/include EOF fi -f_inmakefiles="Makefile.in qtools/Makefile.in src/Makefile.in examples/Makefile.in doc/Makefile.in addon/doxywizard/Makefile.in addon/doxmlparser/src/Makefile.in addon/doxmlparser/test/Makefile.in addon/doxmlparser/examples/metrics/Makefile.in libmd5/Makefile.in addon/doxyapp/Makefile.in addon/doxysearch/Makefile.in" +f_inmakefiles="Makefile.in qtools/Makefile.in src/Makefile.in examples/Makefile.in doc/Makefile.in addon/doxywizard/Makefile.in addon/doxmlparser/src/Makefile.in addon/doxmlparser/test/Makefile.in addon/doxmlparser/examples/metrics/Makefile.in libmd5/Makefile.in addon/doxyapp/Makefile.in addon/doxysearch/Makefile.in vhdlparser/Makefile.in" for i in $f_inmakefiles ; do SRC=$i @@ -884,7 +893,9 @@ EOF echo "all: generated_src/doxygen/version.cpp $EXTRADEPS" >> $DST echo " \$(MAKE) -C qtools" >> $DST echo " \$(MAKE) -C libmd5" >> $DST + echo " \$(MAKE) -C vhdlparser" >> $DST echo " \$(MAKE) -C src" >> $DST + if test $f_wizard = YES; then echo " \$(MAKE) MAN1DIR=\$(MAN1DIR) -C addon/doxywizard" >> $DST fi @@ -921,7 +932,7 @@ done cat src/libdoxycfg.t.in | sed -e "s|%%FLEX%%|$f_flex|g" -e "s|%%BISON%%|$f_bison|g" -e "s|%%PYTHON%%|$f_python|g" > src/libdoxycfg.t cat src/libdoxygen.t.in | sed -e "s|%%FLEX%%|$f_flex|g" -e "s|%%BISON%%|$f_bison|g" -e "s|%%PYTHON%%|$f_python|g" > src/libdoxygen.t -f_inprofiles="qtools/qtools.pro.in src/libdoxygen.pro.in src/libdoxycfg.pro.in src/doxygen.pro.in addon/doxywizard/doxywizard.pro.in addon/doxmlparser/src/doxmlparser.pro.in addon/doxmlparser/test/xmlparse.pro.in addon/doxmlparser/examples/metrics/metrics.pro.in libmd5/libmd5.pro.in addon/doxyapp/doxyapp.pro.in addon/doxysearch/doxysearch.pro.in addon/doxysearch/doxyindexer.pro.in" +f_inprofiles="qtools/qtools.pro.in src/libdoxygen.pro.in src/libdoxycfg.pro.in src/doxygen.pro.in addon/doxywizard/doxywizard.pro.in addon/doxmlparser/src/doxmlparser.pro.in addon/doxmlparser/test/xmlparse.pro.in addon/doxmlparser/examples/metrics/metrics.pro.in libmd5/libmd5.pro.in addon/doxyapp/doxyapp.pro.in addon/doxysearch/doxysearch.pro.in addon/doxysearch/doxyindexer.pro.in vhdlparser/vhdlparser.pro.in" for i in $f_inprofiles ; do SRC=$i @@ -955,7 +966,7 @@ echo " Generating generated_src/doxygen/lang_cfg.h..." if test "$f_english" = YES; then $f_python src/lang_cfg.py ENONLY > generated_src/doxygen/lang_cfg.h else - f_ulangs=`echo $f_langs | tr '[a-z,]' '[A-Z ]'` + f_ulangs=`echo $f_langs | tr '[a-z]' '[A-Z]' | tr ',' ' '` $f_python src/lang_cfg.py $f_ulangs > generated_src/doxygen/lang_cfg.h fi diff --git a/doc/Makefile.in b/doc/Makefile.in index 1f472e6..f0c3a03 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -17,7 +17,7 @@ all: language config.doc FORCE export DOXYGEN_DOCDIR; \ VERSION=$(VERSION) ; \ export VERSION; \ - $(DOXYGEN)/bin/doxygen + "$(DOXYGEN)/bin/doxygen" @rm -f ../latex/refman.tex @cp doxygen_logo*.gif ../html @cp Makefile.latex ../latex/Makefile diff --git a/doc/changelog.doc b/doc/changelog.doc index e7a8f97..606f63f 100644 --- a/doc/changelog.doc +++ b/doc/changelog.doc @@ -2,49 +2,184 @@ \tableofcontents \section log_1_8 1.8 Series +\subsection log_1_8_8 Release 1.8.8 +\htmlonly +<b>(release date 21-08-2014)</b> +<a name="1.8.8"></a> +<h3>New features</h3> +<ul> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=731947">731947</a> - Support for PlantUML [<a href="http://github.com/doxygen/doxygen/commit/7506404e646f1fcc5a26ca6fca91a7f65154f05a">view</a>]</li> +<li>Add BREAD_CRUMB_TRAIL. [<a href="http://github.com/doxygen/doxygen/commit/4074da5b83d37dd1c72c5df015fb2b41e7725a7e">view</a>]</li> +</ul> +<h3>Bug fixes</h3> +<ul> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=172072">172072</a> $title doesn't work in LateX header [<a href="http://github.com/doxygen/doxygen/commit/790000b90944646702ddd3a183ec166669c18f51">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=583958">583958</a> Class diagrams and class hierarchy don't work for java generic classes [<a href="http://github.com/doxygen/doxygen/commit/c3ddf3331239fb3f41e502a8337eee786ceaad06">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=589707">589707</a> Flex .rule file for Visual Studio build can't cope with spaces in filenames [<a href="http://github.com/doxygen/doxygen/commit/eb3ab2452d8a1ef7a85af7a03e1622c12b40400b">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623299">623299</a> Fortran: quotation after define causes error [<a href="http://github.com/doxygen/doxygen/commit/f083109de116ee2c6e2a31a15ebc17d2dff008e0">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625601">625601</a> FORTRAN: recognition free versus fixed formatted code [<a href="http://github.com/doxygen/doxygen/commit/476d79d31a0534c3d7d07001c47c1212a73d10a5">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700510">700510</a> Bibliography duplicate filenames fails [<a href="http://github.com/doxygen/doxygen/commit/7779bf6d6206bc0f78c22100034c44bfdb7f1bc1">view</a>] and + [<a href="http://github.com/doxygen/doxygen/commit/da029a3c893df22536cb3635e597fd3f5b2a4862">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702584">702584</a> \cite rejects valid BibTeX keys [<a href="http://github.com/doxygen/doxygen/commit/06170de4a166bfad9342f3b957dda82b7fb266b2">view</a>] and + [<a href="http://github.com/doxygen/doxygen/commit/69df2f9d1deb87b79c79f9ea1bf20380ff9b71ad">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705503">705503</a> TCL: Documentation of oo::define is not working [<a href="http://github.com/doxygen/doxygen/commit/5ec66c2286d7cedbdbb0930fe0e293b050c91d24">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=727732">727732</a> Nested C structures/unions does not work with groups [<a href="http://github.com/doxygen/doxygen/commit/f4388dc4a62e183b7ca4457eba7cb978a35804c2">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=728654">728654</a> configuration stops with settings.h missing [<a href="http://github.com/doxygen/doxygen/commit/fd4b42ec54cb8d6faf2b0f16e580f376e8cf6982">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=728740">728740</a> XML Output: Doxygen doesn't escape & characters (included in a hyperlink) in <detaileddescription> [<a href="http://github.com/doxygen/doxygen/commit/cfde6cdd600b21bba6a2eb0ca0e7e208e014ccaf">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=729017">729017</a> function object in member initializer causes documentation loss [<a href="http://github.com/doxygen/doxygen/commit/f4f3e381dba1bc5d46feea3c39e8f076e27463d1">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=729427">729427</a> [PATCH] Propagate configure's perl to makefiles [<a href="http://github.com/doxygen/doxygen/commit/f1a692b019a30f7aa07e0fb3e11402d262af8026">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=730418">730418</a> man page extension is incorrect [<a href="http://github.com/doxygen/doxygen/commit/f25d896d4da9b44c23f89bfdd0379fa97ab2c351">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=730520">730520</a> No documentation generated for method-less C++ struct [<a href="http://github.com/doxygen/doxygen/commit/21178ab40160abf011fa084a10892b5b7821e44c">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=730887">730887</a> [PATCH] Fix potential copy and paste error in inputstring.cpp [<a href="http://github.com/doxygen/doxygen/commit/6f5748e822b009cbe82cc1df8eea43e4769bc44b">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=730888">730888</a> [PATCH] Fix missing '&' in Boolean operation in qstring.cpp [<a href="http://github.com/doxygen/doxygen/commit/27f1e1e9316addcfd0bbc3321b5614ed14f7a1a5">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=731238">731238</a> Dead links in html documentation when using tabs for indentation in c++ [<a href="http://github.com/doxygen/doxygen/commit/2cc3b18da39bde323c5739483e507a133e93ac22">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=731363">731363</a> Callgraphs for C# only generated for methods inside the same class [<a href="http://github.com/doxygen/doxygen/commit/7edbf2b2e705eccc0d99cce86149228473bc7f3e">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=731985">731985</a> Variadic macros failing to expand if trailing ... is empty [<a href="http://github.com/doxygen/doxygen/commit/070c35549da108695074239be3ab4268f3722261">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=732594">732594</a> Two entries for a single member in Doxygen XML [<a href="http://github.com/doxygen/doxygen/commit/ed8ce3cf405204916f9832e26797cb15d1490fd1">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=732768">732768</a> nested html tables cause pdflatex to hang (1.8.4 and 1.8.6) [<a href="http://github.com/doxygen/doxygen/commit/3cb963061343aa5b3b8a044cdfa62848723a02ee">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=733451">733451</a> volatile declaration on member functions is not handled as xml attribute [<a href="http://github.com/doxygen/doxygen/commit/97d12d058a7831adcc8c6f2cfe8c20ddd2ae5bc2">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=733605">733605</a> Incorrect LaTeX generation for private union member in C++ [<a href="http://github.com/doxygen/doxygen/commit/a36ddbe0ee97c5ee248b7b391b4c30fd4b3c884b">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=733722">733722</a> XML Output invalid: XML_PROGRAMLISTING=YES copies Unicode form feed character (U+000C) to XML files [<a href="http://github.com/doxygen/doxygen/commit/b272b4b5077873457a0f6b517ac799f4a5f8c951">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=733856">733856</a> segfault in QGListIterator while parsing fortran code [<a href="http://github.com/doxygen/doxygen/commit/aac81f8bfe8298aa0839bb2d7c70ea75149cdffb">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=733938">733938</a> Explicit links using operator()() not generated. [<a href="http://github.com/doxygen/doxygen/commit/e913d55b2e5a8e37ebd1ffd8fec730886a45fbda">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=734077">734077</a> no uniquely matching class member found for inline function definition where parameter argument names don't match [<a href="http://github.com/doxygen/doxygen/commit/6f0269ef3074bbc4bc16ad63a0e0a8f9b5f0ce31">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=734099">734099</a> Add support for non-parsed language [<a href="http://github.com/doxygen/doxygen/commit/0dd59398b3f62288897c8c3405977a27a94fbfee">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=734245">734245</a> Q_PROPERTY switches the member access from private to public [<a href="http://github.com/doxygen/doxygen/commit/392b48a25e4315528fbb11a5a1bfc9f2bca791c0">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=734331">734331</a> Strong enum members listed in containing namespace [<a href="http://github.com/doxygen/doxygen/commit/4766fdba2ab196844a0bd5ec5e0b64d94df4a74f">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=734704">734704</a> Sigsegv while generating XML output [<a href="http://github.com/doxygen/doxygen/commit/14f88af12bae98859eafe605ddb5f54029e44076">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=734727">734727</a> GENERATE_TAGFILE no longer includes any @*section links [<a href="http://github.com/doxygen/doxygen/commit/7d9d4320f5d183c4e1ebc87a316589c36f0afeed">view</a>] and + [<a href="http://github.com/doxygen/doxygen/commit/8b279c9bc28c70405e61219a6c2b3c6dbc7426e6">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=734828">734828</a> Request: disable building documentation if Python 2.6 or newer not available [<a href="http://github.com/doxygen/doxygen/commit/264ecc9eee1f2b74f0110120574056f0de42a3f9">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735001">735001</a> No output for markdown pages with duplicate label title (different anchor) [<a href="http://github.com/doxygen/doxygen/commit/ebb2fe6d73b4aefc6dadab8eec45adc4ee0c9fd5">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=735037">735037</a> QGDict::hashAsciiKey: Invalid null key [<a href="http://github.com/doxygen/doxygen/commit/def392bf8d0326733c20504dc36168093e087c95">view</a>]</li> +<li>Add FORTRAN 2003 keywords and commands [<a href="http://github.com/doxygen/doxygen/commit/4cbfaa8372beff4bd7070dd840924af8d96b0772">view</a>]</li> +<li>Add type option to FORTRAN select statements [<a href="http://github.com/doxygen/doxygen/commit/db289e2272bfc3b00452cbf7c2a30114fb8b7c58">view</a>]</li> +<li>Added build support for Python3+ and Python2.6+ [<a href="http://github.com/doxygen/doxygen/commit/98a54c576eec4feda606156ae591854311d9cd0e">view</a>]</li> +<li>Added class/procedure vardefs to FORTRAN code highlighting [<a href="http://github.com/doxygen/doxygen/commit/dbd1985de07ccd19caf57ffa36c88811048689a4">view</a>]</li> +<li>Added documentation for some missing HTML commands [<a href="http://github.com/doxygen/doxygen/commit/04c89e604877fa9a4aea160d971c782006872710">view</a>]</li> +<li>Added flatten, listsort and paginate filters [<a href="http://github.com/doxygen/doxygen/commit/edd056308d04d6f445a48e05105d4d9a0ece80a0">view</a>]</li> +<li>Added get filter, unified index properties [<a href="http://github.com/doxygen/doxygen/commit/7e3e890fedfb20e7018fadfa87ed97eef7f2b720">view</a>]</li> +<li>Added groupby filter and some more context info [<a href="http://github.com/doxygen/doxygen/commit/064992b0c901661b49de24ce1a1d9a06e9957a93">view</a>]</li> +<li>Added import keyword to FORTRAN code highlighting [<a href="http://github.com/doxygen/doxygen/commit/558697792cd062b93e8d7b7904fb9897e5f70750">view</a>]</li> +<li>Added lists for indices to template context [<a href="http://github.com/doxygen/doxygen/commit/2d35b9a7c0fe70fa894dc266dd0b5ddd54d4014e">view</a>]</li> +<li>Added mainpage to context and improved page tree [<a href="http://github.com/doxygen/doxygen/commit/2e837e0be05636923ef593c29299ff76c4590a09">view</a>]</li> +<li>Added member indexes to template context [<a href="http://github.com/doxygen/doxygen/commit/b850eb45e80b348cbe8629c354350b051f7ef2ec">view</a>]</li> +<li>Added missing links in changelog when multiple bug ids were on one line [<a href="http://github.com/doxygen/doxygen/commit/b752d01fe2de1668c0a247bc3955d7be6987d046">view</a>]</li> +<li>Added more missing links to the changelog [<a href="http://github.com/doxygen/doxygen/commit/0d50c30becc147918b091c02b41502829b8083a3">view</a>]</li> +<li>Added namespace info to the context [<a href="http://github.com/doxygen/doxygen/commit/a7c14ac74c43e6b372d866deeed77fe69e2a68e0">view</a>]</li> +<li>Addition of module data to context and alphaIndex filter [<a href="http://github.com/doxygen/doxygen/commit/e0c3517ff9369387e00dd596b094a4729cfe789c">view</a>]</li> +<li>Coded coloring of flow statements corrected (regression) [<a href="http://github.com/doxygen/doxygen/commit/ee7194bd73ee3a8142aee6ea59d2e5dc717b18de">view</a>]</li> +<li>Corrected copyright year [<a href="http://github.com/doxygen/doxygen/commit/7652fc8472ac83e26641fb737539e7c87725ed68">view</a>]</li> +<li>Correction of typing error [<a href="http://github.com/doxygen/doxygen/commit/81c99d10dbc41feab4a1aca220b27634ca0ff8cd">view</a>]</li> +<li>Disabled/fixed segments that produced doxygen warnings while running the test [<a href="http://github.com/doxygen/doxygen/commit/3a5e6ac7c6018a7a0da7acd830293da0fcb7a21c">view</a>]</li> +<li>Docbook output improvements [<a href="http://github.com/doxygen/doxygen/commit/12f5ee8a8c3a287f6bcfe81f79ff4332b3987c7e">view</a>]</li> +<li>Documentation generator: added support for C# property accessors visibility modifiers. [<a href="http://github.com/doxygen/doxygen/commit/54ac45bd9f535d13b2bf98e4d71b27b4590c3dc7">view</a>]</li> +<li>Doxywizard: make the Next button on the last page of the expert tab switch to the run tab [<a href="http://github.com/doxygen/doxygen/commit/2277e6e695d785d319cb52a8a8ead2982eac2afa">view</a>]</li> +<li>Doxywizard: make the Next button on the last page of the wizard switch to the run tab [<a href="http://github.com/doxygen/doxygen/commit/fbc60af2298c2668893e2f7045f66765f8e0c63f">view</a>]</li> +<li>Error linking 32-bit windows [<a href="http://github.com/doxygen/doxygen/commit/cce307d96a93515d46068cfdcf5e55c1944ae9e5">view</a>]</li> +<li>Fix FORTRAN code function scope test [<a href="http://github.com/doxygen/doxygen/commit/2030240bc18d32581479306e6fd86211e6f30c73">view</a>]</li> +<li>Fix after rebase from master [<a href="http://github.com/doxygen/doxygen/commit/57eee1777c18caa6d3215ec162da1fd9b2d14eb2">view</a>]</li> +<li>Fix description of USE_PDFLATEX [<a href="http://github.com/doxygen/doxygen/commit/c87cceafe203a11e4074b748469e993d13cd8fb3">view</a>]</li> +<li>Fix highlighting issues [<a href="http://github.com/doxygen/doxygen/commit/be0986e9ab7c1788e3650f1df7e7af70b68f28d8">view</a>]</li> +<li>Fix typo [<a href="http://github.com/doxygen/doxygen/commit/e32121ab1fb261464356ce2352c08930f942f805">view</a>]</li> +<li>Fix unnecessary rules for FORTRAN types [<a href="http://github.com/doxygen/doxygen/commit/1e6323e5bb04f49df9d00e82e5db3e8f301dbfc4">view</a>]</li> +<li>Fix warning about unused functions in qstring.cpp [<a href="http://github.com/doxygen/doxygen/commit/84064ac4db9e487ca4bff9b6c37eb72992050ee3">view</a>]</li> +<li>Fixed keyword type [<a href="http://github.com/doxygen/doxygen/commit/d8221cb7a73efc8f20068636c3d2fec84ce8cb8b">view</a>]</li> +<li>Fixed missing include for Linux [<a href="http://github.com/doxygen/doxygen/commit/88468313289c659088be9beece59a82206153ed8">view</a>]</li> +<li>Fixed test 021 [<a href="http://github.com/doxygen/doxygen/commit/c5c763056535216ccce4bed4892358bf5c8d1fd5">view</a>]</li> +<li>Fixed typo [<a href="http://github.com/doxygen/doxygen/commit/0bb9b762844a2f88043223a29182dd9e7e524cef">view</a>]</li> +<li>Fixed typo and used QString for directory [<a href="http://github.com/doxygen/doxygen/commit/5d00fa5862a1724bbe417e33d6c1a260607281ef">view</a>]</li> +<li>Fixed windows compile issue for is_neutral [<a href="http://github.com/doxygen/doxygen/commit/9278509cf82ed7b0ff37c39e4d6e97f5308f29de">view</a>]</li> +<li>Fixes for ./configure script on Solaris [<a href="http://github.com/doxygen/doxygen/commit/d234115b6f387ff723cb97a4d47b2bcca7f0bc6d">view</a>]</li> +<li>Fixes regression due to PR 169 [<a href="http://github.com/doxygen/doxygen/commit/56143a268898249a63bb0a443e09dc2c77ec9ce9">view</a>]</li> +<li>Language parser: added support for C# property accessors visibility modifiers. [<a href="http://github.com/doxygen/doxygen/commit/f5ff1b8e55b4dad074d2a73f1d003ff2991cf894">view</a>]</li> +<li>Made INSTALL file version and date independent [<a href="http://github.com/doxygen/doxygen/commit/1781094043eb5f8f7b0f0bbe5f720012346123a2">view</a>]</li> +<li>Made bread crumb trails enabled unconditionally [<a href="http://github.com/doxygen/doxygen/commit/c7c7d73c184ee2eebf65e83044cf1e325751cffa">view</a>]</li> +<li>Made setName() virtual so overloading works [<a href="http://github.com/doxygen/doxygen/commit/d1e39098f94487f544a068b7864aa8d1b1f345cd">view</a>]</li> +<li>Make index for faq [<a href="http://github.com/doxygen/doxygen/commit/38dfdcaba3e9130833cd7b695d5e20fec26f5c3f">view</a>]</li> +<li>Messages truncated in warnings file [<a href="http://github.com/doxygen/doxygen/commit/cc4f3b454cae7d3e9eaa44342bcbae1061f5e790">view</a>]</li> +<li>Minor fixes [<a href="http://github.com/doxygen/doxygen/commit/c31a81a85e0396fb276beefd06bb71c2819571ed">view</a>]</li> +<li>Minor fixes to the template context [<a href="http://github.com/doxygen/doxygen/commit/963e0adfd76e6a59ace5e7318f948632322b1e51">view</a>]</li> +<li>Missing word after \n command in Doxygen rtf output, version 1.8.5 & up [<a href="http://github.com/doxygen/doxygen/commit/ea9f3b1d727b22973c0176b2564304fb160aa70b">view</a>]</li> +<li>More robust extraction of scope information from tag files [<a href="http://github.com/doxygen/doxygen/commit/6a60477b418e21dbadd3e62dc557a038e319581b">view</a>]</li> +<li>No warning in case cite definition is missing [<a href="http://github.com/doxygen/doxygen/commit/1f77638174f715f0f2bcf5b2e32ebb329d531f85">view</a>]</li> +<li>Preparations for release 1.8.8 [<a href="http://github.com/doxygen/doxygen/commit/f16be0113f8d47d4f04e69d0c45ccc4b24e3c426">view</a>]</li> +<li>Removed not implemented HTML commands from documentation [<a href="http://github.com/doxygen/doxygen/commit/8199b2d105313efd30367c7a03b57bf7a7d2180b">view</a>]</li> +<li>Removed unsupported HTML commands from the docs [<a href="http://github.com/doxygen/doxygen/commit/16ba4bd5744c2e5fbfabe95b27736b8ca8030390">view</a>]</li> +<li>Set deployment targets for MacOSX 10.5+ versions [<a href="http://github.com/doxygen/doxygen/commit/28f40b3aea1411488832205fae447f4652125cdc">view</a>]</li> +<li>Support multiple extra HTML stylesheets. [<a href="http://github.com/doxygen/doxygen/commit/595943c96860425f9086028b00e1e155e8ec434f">view</a>]</li> +<li>Tcl: add missing file that breaks test 057 [<a href="http://github.com/doxygen/doxygen/commit/73e7c340f555291d4264b2f83caacf59a5a3395f">view</a>]</li> +<li>Tcl: add test code for Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=729092">729092</a> [<a href="http://github.com/doxygen/doxygen/commit/36ce0578065b95cf12b81e5a4edd95dea5707e22">view</a>]</li> +<li>Tcl: collect XRefs also if INLINE_SOURCES = no [<a href="http://github.com/doxygen/doxygen/commit/6245ef410358f332330195f9f2bfa458cfb6a2b8">view</a>]</li> +<li>Tcl: correct namespace resolution in case of INLINE_SOURCES = YES [<a href="http://github.com/doxygen/doxygen/commit/470143192d0c8cf90ad84a66226d48060cc713db">view</a>]</li> +<li>Tcl: recurse for [] [<a href="http://github.com/doxygen/doxygen/commit/9d315a987d7d0ea2f38809aa74e36c92281910df">view</a>]</li> +<li>Tcl: refactor similar code into tcl_codify_token function [<a href="http://github.com/doxygen/doxygen/commit/06bd53ac6acee5fb83d9f2b5ded1c55c8a069b29">view</a>]</li> +<li>Tcl: support eval/catch commands [<a href="http://github.com/doxygen/doxygen/commit/9d24b488add8b4c7c689f58a095184a6ed85e9f1">view</a>]</li> +<li>Tcl: support switch command [<a href="http://github.com/doxygen/doxygen/commit/2984dad86558b4a81e11ce07485057e3903a9304">view</a>]</li> +<li>Tcl: test 057 additionally tests mutual Xrefs for two files [<a href="http://github.com/doxygen/doxygen/commit/c6aaf0a4c35db27f968a7a6d0b9fa25b5b311bc3">view</a>]</li> +<li>Template context support for CREATE_SUBDIRS [<a href="http://github.com/doxygen/doxygen/commit/9282aab5ed2a0cca3858df6e62132f959e99edb5">view</a>]</li> +<li>Update dot.cpp [<a href="http://github.com/doxygen/doxygen/commit/a15c5c89f0b4f97d57474d9ea0e3166709d35534">view</a>]</li> +<li>Update latexgen.cpp [<a href="http://github.com/doxygen/doxygen/commit/1f877b09262f34e6bad6dbfaee4b04b4be03bd4c">view</a>]</li> +<li>Update test 058 because commit 9d315a9 fixes also Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=729135">729135</a> [<a href="http://github.com/doxygen/doxygen/commit/3486bfc158008da1d69d420e57e7a10f1c0d69c3">view</a>]</li> +<li>Replaced the VHDL parser with the VHDL scanner from 1.7.5 to avoid potential licensing issues [<a href="http://github.com/doxygen/doxygen/commit/99433b3d2319916f11608c2c818fe35360256d9e">view</a>]</li> +<li>New VHDL parser implementation [<a href="http://github.com/doxygen/doxygen/commit/36122e49ed1d9e640b1ceca52536ec7c55e10474">view</a>]</li> +<li>Vhdl fixes [<a href="http://github.com/doxygen/doxygen/commit/3b8fea2f1f7f2e6a83a35626e6dec9d114a78c9e">view</a>]</li> +<li>\usepackage{fixltx2e} must come before use \usepackage{float} [<a href="http://github.com/doxygen/doxygen/commit/d8a36bbd404bc9c77689f42cc4bfde8ac393cd8c">view</a>]</li> +<li>cache anonymous into ClassDefImpl::isAnonymous [<a href="http://github.com/doxygen/doxygen/commit/34a5a051a8b91215ae4f93e5541d43c33aa887c1">view</a>]</li> +<li>changed append filter and added index and path attributes to node [<a href="http://github.com/doxygen/doxygen/commit/47bc520ac8c0dde310dcb1999c622c591b373ffc">view</a>]</li> +<li>doc/translator.py -- unification for Python 2.6+ and 3.3+ (not finished) [<a href="http://github.com/doxygen/doxygen/commit/8cac977ddfdc1c77546f5d766387f4a57710c8c0">view</a>]</li> +<li>doc/translator.py unified for Python 2.6+ and Python 3.0+ [<a href="http://github.com/doxygen/doxygen/commit/6212c2d2af12dd9d47459bdecdf79ad106060229">view</a>]</li> +<li>make.bat: change current directory [<a href="http://github.com/doxygen/doxygen/commit/fc386eb107958b4f3214aa2c0c6caf2a91c83177">view</a>] and + [<a href="http://github.com/doxygen/doxygen/commit/feb24c82002ced816bc72eb8f2a6a35c71e25ed7">view</a>]</li> +<li>removeRedundantWhiteSpace micro-optimization [<a href="http://github.com/doxygen/doxygen/commit/d4601735b582b903f1ccb144f59b2030a7797b05">view</a>]</li> +<li>resolves the error of unbalanced tags opened/closed in docbook output: parser error : Opening and ending tag mismatch: para line 358 and tbody [<a href="http://github.com/doxygen/doxygen/commit/d7b0858e079419bb7ea862e16946218a9352d5b5">view</a>]</li> +<li>winbuild/pack_the_distribution_for_windows.py minor updates [<a href="http://github.com/doxygen/doxygen/commit/6d969cab51f4c32784966a28b8b9d5fe2d5b2089">view</a>]</li> +</ul> +\endhtmlonly + \subsection log_1_8_7 Release 1.8.7 \htmlonly <b>(release date 21-04-2014)</b> <a name="1.8.7"></a> <ul> -<li>Bug 436885 - c-source and h-source missing for latex [<a href="http://github.com/doxygen/doxygen/commit/d5d34325fb9bed776cf2b4facc0c341f701e780b">view</a>]</li> -<li>Bug 625601 - FORTRAN: recognition free versus fixed formatted code [<a href="http://github.com/doxygen/doxygen/commit/2dec1060623165057628ee678eb3580351922408">view</a>]</li> -<li>Bug 626172 - Latex $projectname with "&" gets no escaped [<a href="http://github.com/doxygen/doxygen/commit/586b3b69238fb09d55a03c5d50fc1b7d3e65ed97">view</a>]</li> -<li>Bug 643618 - Fortran: variable with name "type" confuses Doxygen [<a href="http://github.com/doxygen/doxygen/commit/17c5b6160d013d118296663e133cf8884c74a939">view</a>]</li> -<li>Bug 674851 - Percent to prevent auto-linking in page title is not removed for navpath [<a href="http://github.com/doxygen/doxygen/commit/5d44acc0a49bd7b990bfe649efa312f5f0bb594b">view</a>]</li> -<li>Bug 678436 - Nested \if messes up list items [<a href="http://github.com/doxygen/doxygen/commit/7f4414b92a1c2147b073dd3cf58e0db7c8a88be6">view</a>]</li> -<li>Bug 678436 - Nested \if messes up list items [<a href="http://github.com/doxygen/doxygen/commit/de502ca71fc1c20ed93209f6a223c488eee38297">view</a>]</li> -<li>Bug 683115 - Command ignored when using umlauts in markdown and also C-comments in markdown didn't work properly [<a href="http://github.com/doxygen/doxygen/commit/b4b40f4c7ea57655d1264e8f72c754526e3a9209">view</a>]</li> -<li>Bug 692985 - Notes in xml output are not correctly separated [<a href="http://github.com/doxygen/doxygen/commit/bc61f00f142792dfbe97c361d9fecd3ea2850f5e">view</a>]</li> -<li>Bug 705220 - Enables using unicode (non ASCII) to name output files [<a href="http://github.com/doxygen/doxygen/commit/d5fb69739a1b2facf32a63ca94c12d097f8278cc">view</a>]</li> -<li>Bug 705499 - Nested namespace causes incorrect display when referenced via .tag file [<a href="http://github.com/doxygen/doxygen/commit/1bdbbc60982f2f61f4e0423c9fc8c4a24cfb2e94">view</a>]</li> -<li>Bug 712251 - Documentation for enumeration not generated [<a href="http://github.com/doxygen/doxygen/commit/1bb36723a522b371810606c2f6504d0374a7b027">view</a>]</li> -<li>Bug 720691 - Code coloring in case of file without extension [<a href="http://github.com/doxygen/doxygen/commit/45934e88fa961686c00be1ad272a088f4e7eac0b">view</a>]</li> -<li>Bug 721032 - Trouble with /cond /endcond [<a href="http://github.com/doxygen/doxygen/commit/2912829ca5bced897a2c063d1883b9cfd39d3bd9">view</a>]</li> -<li>Bug 721169 - Wrong call graph in simple situation [<a href="http://github.com/doxygen/doxygen/commit/e12d6b506862c8ad843b7853bc1c9ceb5d0ccb4d">view</a>]</li> -<li>Bug 721302 - [Latex/PDF] Merging brief and detailed description in file section [<a href="http://github.com/doxygen/doxygen/commit/a99c33838057acba20768ca32681e1f379f36ca0">view</a>]</li> -<li>Bug 721462 - Parsing problem with C++11 empty initializer lists [<a href="http://github.com/doxygen/doxygen/commit/1bfacc3b8e589907352eff923b7b3aa73cfc5138">view</a>]</li> -<li>Bug 721618 - Move contructors and move assignment operators of embedded classes of template classes cannot be matched. [<a href="http://github.com/doxygen/doxygen/commit/1d0c9b6fefb6c2e0a9a2b7a7ea3192ccace33710">view</a>]</li> -<li>Bug 721878 - Dia diagrams not displayed by Firefox [<a href="http://github.com/doxygen/doxygen/commit/5ea2f2a123e473d5964435369fd925d7f103b456">view</a>]</li> -<li>Bug 722457 - regression referencing namespaced type [<a href="http://github.com/doxygen/doxygen/commit/9b76c1a9bb7039962933aeef398bb7aa2f59c3a5">view</a>]</li> -<li>Bug 722603 - doxygen nested \if \endif sample not working [<a href="http://github.com/doxygen/doxygen/commit/cc78b12b0019fbcb17692b231d38ba75d0952201">view</a>]</li> -<li>Bug 722619 - doxygen 1.8.6 sorts the contents of a namespace by group within the Class List [<a href="http://github.com/doxygen/doxygen/commit/f9b80aff6d20524dd0838aff12033fe3df66ba98">view</a>]</li> -<li>Bug 722711 - Link refs with no title swallow an extra newline [<a href="http://github.com/doxygen/doxygen/commit/60ea06a68f2e355e34b61bf45babc6405bfbfe84">view</a>]</li> -<li>Bug 722759 - Documentation for derived classes no longer has an "Additional Inherited Members" section after upgrading Doxygen from 1.8.3.1 to 1.8.6 [<a href="http://github.com/doxygen/doxygen/commit/0e9da9fb27147c5685088019afd428a0aaa901fa">view</a>]</li> -<li>Bug 722786 - configure --prefix=/opt/foo not accepted [<a href="http://github.com/doxygen/doxygen/commit/bc7e6301e2d1474592f6cd6cc07624852d1b5016">view</a>]</li> -<li>Bug 722788 - Command \| not working when last character in markdown table line [<a href="http://github.com/doxygen/doxygen/commit/8309fbd9e639eaf9e763e83ca7a228c659450a57">view</a>]</li> -<li>Bug 723299 - Last line of code block lost if it is only one character and there is no text afterward [<a href="http://github.com/doxygen/doxygen/commit/4d1951ebb648bbc92464904305cafc7fc0dba557">view</a>]</li> -<li>Bug 723314 - Doxygen crashes on incorrect end group /**< @} */ [<a href="http://github.com/doxygen/doxygen/commit/b4d5ef176eced8315523baea464cfda733ecb9aa">view</a>]</li> -<li>Bug 723516 - star is not printed in \code environment [<a href="http://github.com/doxygen/doxygen/commit/0eaf1cd5d2eac57666b5ffea9e0f948b7a3e6b3a">view</a>]</li> -<li>Bug 724241 - Internal inconsistency: namespace in IDL [<a href="http://github.com/doxygen/doxygen/commit/b0456fbefa864b33611f289818deeaaf791c17c9">view</a>]</li> -<li>Bug 724949 - Server side (PHP) search broke in 1.8.3 [<a href="http://github.com/doxygen/doxygen/commit/1d2bb19e394850ecb37bea06ef4e5d15fe06e7b0">view</a>]</li> -<li>Bug 726219 - python3 import style causes doxygen to ignore some inheritances [<a href="http://github.com/doxygen/doxygen/commit/513ce9aafd05add9b5c1e67e843e540f8937cf63">view</a>]</li> -<li>Bug 726294 - Markdown Extra - fenced code block: '>' before tab width parsed as block quote [<a href="http://github.com/doxygen/doxygen/commit/3598e8fdf7ee61a281480fec09f63669710ac35d">view</a>]</li> -<li>Bug 726469 - Tilde sign in combination with <pre> and MARKDOWN_SUPPORT disabled [<a href="http://github.com/doxygen/doxygen/commit/721764a1b3c63c77ff0792beb6c37fbfee0f87bb">view</a>]</li> -<li>Bug 726722 - Blockquote followed by text inserts an extra paragraph [<a href="http://github.com/doxygen/doxygen/commit/518fccbbadba3136a29c895f3606f40fa220fe47">view</a>]</li> -<li>Bug 726734 - alignment of blockquotes in pdf [<a href="http://github.com/doxygen/doxygen/commit/9059295fd6e178804f2f2d95ffe3764645ecc026">view</a>]</li> -<li>Bug 728077 - Build fails when --with-libclang on Fedora [<a href="http://github.com/doxygen/doxygen/commit/837d63319a7b014412cb3cb2b5d27d2474a932c2">view</a>]</li> -<li>Bug 728530 - Crash on \addindex \term [<a href="http://github.com/doxygen/doxygen/commit/653a2a8b123b79835af9f684f8b92ef7f88712aa">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=436885">436885</a> - c-source and h-source missing for latex [<a href="http://github.com/doxygen/doxygen/commit/d5d34325fb9bed776cf2b4facc0c341f701e780b">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625601">625601</a> - FORTRAN: recognition free versus fixed formatted code [<a href="http://github.com/doxygen/doxygen/commit/2dec1060623165057628ee678eb3580351922408">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626172">626172</a> - Latex $projectname with "&" gets no escaped [<a href="http://github.com/doxygen/doxygen/commit/586b3b69238fb09d55a03c5d50fc1b7d3e65ed97">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643618">643618</a> - Fortran: variable with name "type" confuses Doxygen [<a href="http://github.com/doxygen/doxygen/commit/17c5b6160d013d118296663e133cf8884c74a939">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674851">674851</a> - Percent to prevent auto-linking in page title is not removed for navpath [<a href="http://github.com/doxygen/doxygen/commit/5d44acc0a49bd7b990bfe649efa312f5f0bb594b">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678436">678436</a> - Nested \if messes up list items [<a href="http://github.com/doxygen/doxygen/commit/7f4414b92a1c2147b073dd3cf58e0db7c8a88be6">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678436">678436</a> - Nested \if messes up list items [<a href="http://github.com/doxygen/doxygen/commit/de502ca71fc1c20ed93209f6a223c488eee38297">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=683115">683115</a> - Command ignored when using umlauts in markdown and also C-comments in markdown didn't work properly [<a href="http://github.com/doxygen/doxygen/commit/b4b40f4c7ea57655d1264e8f72c754526e3a9209">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692985">692985</a> - Notes in xml output are not correctly separated [<a href="http://github.com/doxygen/doxygen/commit/bc61f00f142792dfbe97c361d9fecd3ea2850f5e">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705220">705220</a> - Enables using unicode (non ASCII) to name output files [<a href="http://github.com/doxygen/doxygen/commit/d5fb69739a1b2facf32a63ca94c12d097f8278cc">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705499">705499</a> - Nested namespace causes incorrect display when referenced via .tag file [<a href="http://github.com/doxygen/doxygen/commit/1bdbbc60982f2f61f4e0423c9fc8c4a24cfb2e94">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=712251">712251</a> - Documentation for enumeration not generated [<a href="http://github.com/doxygen/doxygen/commit/1bb36723a522b371810606c2f6504d0374a7b027">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=720691">720691</a> - Code coloring in case of file without extension [<a href="http://github.com/doxygen/doxygen/commit/45934e88fa961686c00be1ad272a088f4e7eac0b">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=721032">721032</a> - Trouble with /cond /endcond [<a href="http://github.com/doxygen/doxygen/commit/2912829ca5bced897a2c063d1883b9cfd39d3bd9">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=721169">721169</a> - Wrong call graph in simple situation [<a href="http://github.com/doxygen/doxygen/commit/e12d6b506862c8ad843b7853bc1c9ceb5d0ccb4d">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=721302">721302</a> - [Latex/PDF] Merging brief and detailed description in file section [<a href="http://github.com/doxygen/doxygen/commit/a99c33838057acba20768ca32681e1f379f36ca0">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=721462">721462</a> - Parsing problem with C++11 empty initializer lists [<a href="http://github.com/doxygen/doxygen/commit/1bfacc3b8e589907352eff923b7b3aa73cfc5138">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=721618">721618</a> - Move contructors and move assignment operators of embedded classes of template classes cannot be matched. [<a href="http://github.com/doxygen/doxygen/commit/1d0c9b6fefb6c2e0a9a2b7a7ea3192ccace33710">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=721878">721878</a> - Dia diagrams not displayed by Firefox [<a href="http://github.com/doxygen/doxygen/commit/5ea2f2a123e473d5964435369fd925d7f103b456">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=722457">722457</a> - regression referencing namespaced type [<a href="http://github.com/doxygen/doxygen/commit/9b76c1a9bb7039962933aeef398bb7aa2f59c3a5">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=722603">722603</a> - doxygen nested \if \endif sample not working [<a href="http://github.com/doxygen/doxygen/commit/cc78b12b0019fbcb17692b231d38ba75d0952201">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=722619">722619</a> - doxygen 1.8.6 sorts the contents of a namespace by group within the Class List [<a href="http://github.com/doxygen/doxygen/commit/f9b80aff6d20524dd0838aff12033fe3df66ba98">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=722711">722711</a> - Link refs with no title swallow an extra newline [<a href="http://github.com/doxygen/doxygen/commit/60ea06a68f2e355e34b61bf45babc6405bfbfe84">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=722759">722759</a> - Documentation for derived classes no longer has an "Additional Inherited Members" section after upgrading Doxygen from 1.8.3.1 to 1.8.6 [<a href="http://github.com/doxygen/doxygen/commit/0e9da9fb27147c5685088019afd428a0aaa901fa">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=722786">722786</a> - configure --prefix=/opt/foo not accepted [<a href="http://github.com/doxygen/doxygen/commit/bc7e6301e2d1474592f6cd6cc07624852d1b5016">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=722788">722788</a> - Command \| not working when last character in markdown table line [<a href="http://github.com/doxygen/doxygen/commit/8309fbd9e639eaf9e763e83ca7a228c659450a57">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=723299">723299</a> - Last line of code block lost if it is only one character and there is no text afterward [<a href="http://github.com/doxygen/doxygen/commit/4d1951ebb648bbc92464904305cafc7fc0dba557">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=723314">723314</a> - Doxygen crashes on incorrect end group /**< @} */ [<a href="http://github.com/doxygen/doxygen/commit/b4d5ef176eced8315523baea464cfda733ecb9aa">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=723516">723516</a> - star is not printed in \code environment [<a href="http://github.com/doxygen/doxygen/commit/0eaf1cd5d2eac57666b5ffea9e0f948b7a3e6b3a">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=724241">724241</a> - Internal inconsistency: namespace in IDL [<a href="http://github.com/doxygen/doxygen/commit/b0456fbefa864b33611f289818deeaaf791c17c9">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=724949">724949</a> - Server side (PHP) search broke in 1.8.3 [<a href="http://github.com/doxygen/doxygen/commit/1d2bb19e394850ecb37bea06ef4e5d15fe06e7b0">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=726219">726219</a> - python3 import style causes doxygen to ignore some inheritances [<a href="http://github.com/doxygen/doxygen/commit/513ce9aafd05add9b5c1e67e843e540f8937cf63">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=726294">726294</a> - Markdown Extra - fenced code block: '>' before tab width parsed as block quote [<a href="http://github.com/doxygen/doxygen/commit/3598e8fdf7ee61a281480fec09f63669710ac35d">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=726469">726469</a> - Tilde sign in combination with <pre> and MARKDOWN_SUPPORT disabled [<a href="http://github.com/doxygen/doxygen/commit/721764a1b3c63c77ff0792beb6c37fbfee0f87bb">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=726722">726722</a> - Blockquote followed by text inserts an extra paragraph [<a href="http://github.com/doxygen/doxygen/commit/518fccbbadba3136a29c895f3606f40fa220fe47">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=726734">726734</a> - alignment of blockquotes in pdf [<a href="http://github.com/doxygen/doxygen/commit/9059295fd6e178804f2f2d95ffe3764645ecc026">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=728077">728077</a> - Build fails when --with-libclang on Fedora [<a href="http://github.com/doxygen/doxygen/commit/837d63319a7b014412cb3cb2b5d27d2474a932c2">view</a>]</li> +<li>Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=728530">728530</a> - Crash on \addindex \term [<a href="http://github.com/doxygen/doxygen/commit/653a2a8b123b79835af9f684f8b92ef7f88712aa">view</a>]</li> <li>A new files have been added but is not incorporated in the windows build part [<a href="http://github.com/doxygen/doxygen/commit/d9dd873e25fba968ddcbcc79d6643f5df669b626">view</a>]</li> <li>Add docbook directory to be removed as well [<a href="http://github.com/doxygen/doxygen/commit/08ea10029e705a388ab14ee29544d496a203f23f">view</a>]</li> <li>Add extra (documenattion) directories to ignore pattern [<a href="http://github.com/doxygen/doxygen/commit/db358b1f219fecf0d7df96d8c70b47b245471c66">view</a>]</li> @@ -177,69 +312,69 @@ \htmlonly <b>(release date 24-12-2013)</b> <a name="1.8.6"></a> -<h3>Bug fixes (ids refer to the <a href="http://bugzilla.gnome.org/buglist.cgi?product=doxygen&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=NEEDINFO&bug_status=REOPENED&bug_status=RESOLVED&bug_status=VERIFIED&bug_status=CLOSED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&changedin=&chfieldfrom=&chfieldto=Now&chfieldvalue=&short_desc=&short_desc_type=substring&long_desc=&long_desc_type=substring&bug_file_loc=&bug_file_loc_type=substring&status_whiteboard=&status_whiteboard_type=substring&keywords=&keywords_type=anywords&op_sys_details=&op_sys_details_type=substring&version_details=&version_details_type=substring&newqueryname=&form_name=query&order=bugs.bug_id">bugzilla</a> database, lines without bug id refer to commits in <a href="https://github.com/doxygen/doxygen/commits/master">GitHub</a>)</h3> -<ul> -<li> Bug 154880 - if "using namespace" used, call of a static member function in C++ is not recognized or recognized wrong -<li> Bug 647517 - make install prepends a slash to the installation path Removed superfluous / -<li> Bug 668424 - HTML links in RTF output are broken -<li> Bug 683897 - class list not sorted? -<li> Bug 692004 - show includes for free functions -<li> Bug 693537 - Create possibility to keep user comments in Doxyfile -<li> Bug 701949 - Latex: Hyperlinks for \secreflist / \refitem -<li> Bug 702265 - Generated Doxyfile differs from result of doxygen -u (partial fix) -<li> Bug 705910 - Indexing and searching cannot treat non ASCII identifiers -<li> Bug 706520 - Fortran: in body documentation lands on wrong place In some cases, in propriety code, with in body Fortran documentation doxygen crashed. I REOPENED Bug_706520 for this -<li> Bug 706804 - Fortran: Doxygen mixes up function-attributes with the return type test string should not be equal to "function" but should contain "function" -<li> Bug 706813 - RPM build via spec file fails -<li> Bug 706874 - Doxygen crash if missing new-line in a snippet -<li> Bug 706916 - C++ exception specifications are no longer parsed correctly -<li> Bug 707102 - update the Japanese translation -<li> Bug 707353 - Accept IDs using unicode(non ASCII) characters in python codes -<li> Bug 707389 - GENERATE_TREEVIEW=YES disables touch scrolling with Android 3.x -<li> Bug 707431 - Cannot @ref or @link C++ operator overloads -<li> Bug 707483 - Wrong page number and header in pdf output -<li> Bug 707554 - When I use @INCLUDE DoxyWizard is closed Current directory was not changed at the right time so the include files could not be found in the "current" directory (i.e. the directory where the Doxyfile resides too, as this directory is shown as the current directory in the doxywizard). This is also important when the doxywizard is started from a shortcut. -<li> Bug 707567 - Asterisks in comment wrongly displayed for @code -<li> Bug 707641 - `FILTER_SOURCE_FILES=YES` required to build CALL_GRAPHS https://bugzilla.gnome.org/show_bug.cgi?id=707641 -<li> Bug 707685 - Fortran: error message when missing last EOL In case the original buffer in either fixed or free format code does not contain an EOL as last character, add it. -<li> Bug 707713 - Add support for dia diagrams -<li> Bug 707825 - Const treatment -<li> Bug 707925 - False warning for Java "warning: missing ( in exception list on member" -<li> Bug 707985 - Strange output when : appended to an parameter description -<li> Bug 707995 - @copydoc not working for const member overloads -<li> Bug 708446 - Deprecated list breaks HTML tree with xhtml extension -<li> Bug 708455 - Enabling INLINE_SIMPLE_STRUCTS messes up Data Structures in tree -<li> Bug 708806 - Wrong path to graph_legend figure in graph_legend.html when CREATE_SUBDIRS = YES -<li> Bug 709052 - Templated and non-templated method mixup documentation -<li> Bug 709226 - Struct member fields not documented with INLINE_SIMPLE_STRUCTS -<li> Bug 709526 - C++ parsing problem with operators <<, <, >, >> inside templates -<li> Bug 709706 - Terminating C comments within markdown files breaks aliases -<li> Bug 709780 - Copying of files via \image tag can get confused by symlinks at the destination -<li> Bug 709803 - Generated hhc file contains an error for a section of a mainpage -<li> Bug 709845 - Fortran: problem with types with name starting with is -<li> Bug 709870 - Broken links on members HTML page when using BUILTIN_STL_SUPPORT -<li> Bug 709921 - position of linebreak in template argument list affects inheritance relation -<li> Bug 710917 - Segfault while parsing a C file -<li> Bug 710998 - latex_count=5 is not enough -<li> Bug 711004 - Vertical bars cannot be sent straight to makeindex -<li> Bug 711097 - Compiler warnings because char is unsigned on ARM/PPC: "comparison is always false" -<li> Bug 711378 - Nested Aliases fail when the nested alias has two or more arguments. -<li> Bug 711639 - [PATCH] #include does not work with absolute paths -<li> Bug 711723 - Comment /**/ confuses doxygen -<li> Bug 711787 - Long initialization line in C stops doxygen An extra "breakpoint" in the input string has been created in the form of a , (comma), so for initialization lines the line will be shorter and the , (comma) will be copied later on. -<li> Bug 712795 - segmentation fault in memberdef.cpp -<li> Bug 712819 - Some external namespaces appear in list despite having ALLEXTERNALS = NO -<li> Bug 715172 - Consistently document Fortran's equivalent function bodies -<li> Bug 719389 - HTML escaping incorrectly applied in source tooltips -<li> Bug 719422 - private java class is mentioned in inherited by list of super class -<li> Bug 719463 - Invalid null key and segmentation fault -<li> Bug 719489 - Label "abstract" instead of "pure virtual" for Java language -<li> Bug 719525 - Can't build because the definitions of ***YY_flex_debug are missing. -<li> Bug 719591 - expand_as_defined macro does not properly work -<li> Bug 719639 - @xrefitem with empty heading string -<li> Bug 720046 - Document inline objective-C blocks -<li> Bug 720092 - USE_MDFILE_AS_MAINPAGE doesn't work if full path is specified. -<li> Bug 720580 - inline source browser shows wrong code with muilti-line c++11's raw strings +<h3>Bug fixes</h3> +<ul> +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=154880">154880</a> - if "using namespace" used, call of a static member function in C++ is not recognized or recognized wrong +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=647517">647517</a> - make install prepends a slash to the installation path Removed superfluous / +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668424">668424</a> - HTML links in RTF output are broken +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=683897">683897</a> - class list not sorted? +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692004">692004</a> - show includes for free functions +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693537">693537</a> - Create possibility to keep user comments in Doxyfile +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701949">701949</a> - Latex: Hyperlinks for \secreflist / \refitem +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702265">702265</a> - Generated Doxyfile differs from result of doxygen -u (partial fix) +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705910">705910</a> - Indexing and searching cannot treat non ASCII identifiers +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706520">706520</a> - Fortran: in body documentation lands on wrong place In some cases, in propriety code, with in body Fortran documentation doxygen crashed. I REOPENED Bug_706520 for this +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706804">706804</a> - Fortran: Doxygen mixes up function-attributes with the return type test string should not be equal to "function" but should contain "function" +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706813">706813</a> - RPM build via spec file fails +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706874">706874</a> - Doxygen crash if missing new-line in a snippet +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706916">706916</a> - C++ exception specifications are no longer parsed correctly +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707102">707102</a> - update the Japanese translation +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707353">707353</a> - Accept IDs using unicode(non ASCII) characters in python codes +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707389">707389</a> - GENERATE_TREEVIEW=YES disables touch scrolling with Android 3.x +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707431">707431</a> - Cannot @ref or @link C++ operator overloads +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707483">707483</a> - Wrong page number and header in pdf output +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707554">707554</a> - When I use @INCLUDE DoxyWizard is closed Current directory was not changed at the right time so the include files could not be found in the "current" directory (i.e. the directory where the Doxyfile resides too, as this directory is shown as the current directory in the doxywizard). This is also important when the doxywizard is started from a shortcut. +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707567">707567</a> - Asterisks in comment wrongly displayed for @code +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707641">707641</a> - `FILTER_SOURCE_FILES=YES` required to build CALL_GRAPHS https://bugzilla.gnome.org/show_bug.cgi?id=707641 +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707685">707685</a> - Fortran: error message when missing last EOL In case the original buffer in either fixed or free format code does not contain an EOL as last character, add it. +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707713">707713</a> - Add support for dia diagrams +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707825">707825</a> - Const treatment +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707925">707925</a> - False warning for Java "warning: missing ( in exception list on member" +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707985">707985</a> - Strange output when : appended to an parameter description +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=707995">707995</a> - @copydoc not working for const member overloads +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=708446">708446</a> - Deprecated list breaks HTML tree with xhtml extension +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=708455">708455</a> - Enabling INLINE_SIMPLE_STRUCTS messes up Data Structures in tree +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=708806">708806</a> - Wrong path to graph_legend figure in graph_legend.html when CREATE_SUBDIRS = YES +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709052">709052</a> - Templated and non-templated method mixup documentation +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709226">709226</a> - Struct member fields not documented with INLINE_SIMPLE_STRUCTS +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709526">709526</a> - C++ parsing problem with operators <<, <, >, >> inside templates +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709706">709706</a> - Terminating C comments within markdown files breaks aliases +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709780">709780</a> - Copying of files via \image tag can get confused by symlinks at the destination +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709803">709803</a> - Generated hhc file contains an error for a section of a mainpage +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709845">709845</a> - Fortran: problem with types with name starting with is +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709870">709870</a> - Broken links on members HTML page when using BUILTIN_STL_SUPPORT +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=709921">709921</a> - position of linebreak in template argument list affects inheritance relation +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=710917">710917</a> - Segfault while parsing a C file +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=710998">710998</a> - latex_count=5 is not enough +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711004">711004</a> - Vertical bars cannot be sent straight to makeindex +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711097">711097</a> - Compiler warnings because char is unsigned on ARM/PPC: "comparison is always false" +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711378">711378</a> - Nested Aliases fail when the nested alias has two or more arguments. +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711639">711639</a> - [PATCH] #include does not work with absolute paths +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711723">711723</a> - Comment /**/ confuses doxygen +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=711787">711787</a> - Long initialization line in C stops doxygen An extra "breakpoint" in the input string has been created in the form of a , (comma), so for initialization lines the line will be shorter and the , (comma) will be copied later on. +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=712795">712795</a> - segmentation fault in memberdef.cpp +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=712819">712819</a> - Some external namespaces appear in list despite having ALLEXTERNALS = NO +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=715172">715172</a> - Consistently document Fortran's equivalent function bodies +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719389">719389</a> - HTML escaping incorrectly applied in source tooltips +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719422">719422</a> - private java class is mentioned in inherited by list of super class +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719463">719463</a> - Invalid null key and segmentation fault +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719489">719489</a> - Label "abstract" instead of "pure virtual" for Java language +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719525">719525</a> - Can't build because the definitions of ***YY_flex_debug are missing. +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719591">719591</a> - expand_as_defined macro does not properly work +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=719639">719639</a> - @xrefitem with empty heading string +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=720046">720046</a> - Document inline objective-C blocks +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=720092">720092</a> - USE_MDFILE_AS_MAINPAGE doesn't work if full path is specified. +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=720580">720580</a> - inline source browser shows wrong code with muilti-line c++11's raw strings <li> Add support for honoring svg image format preference in msc <li> Added @parblock and @endparblock commands <li> Added compile support for Mavericks @@ -325,54 +460,54 @@ </ul> <h3>Bug fixes</h3> <ul> -<li> Bug 668007 - HTML commands - documentation of </dd> tag missing -<li> Bug 676879 - parameter on doxywizard manual Added sentenc in respect to possible argument for doxywizard Added images to the LaTex / pdf version of the manual -<li> Bug 684324 - Strange behavior when placing cite within brief. -<li> Bug 688858 - SHORT_NAMES break references to \page in PDF output -<li> Bug 691315 - Line breaks are not copied/displayed properly when using @copydoc. -<li> Bug 691830 - Logical confusion with DISABLE_INDEX and GENERATE_TREEVIEW -<li> Bug 694147 - #undef is ignored by doxygen -<li> Bug 698998 - vhdldocgen fails to generate proper latex for VHDL record type -<li> Bug 700385 - Incorrectly parsed Q_PROPERTY with 'unsigned int' type -<li> Bug 700646 - XML output does not handle HTML entities in titles -<li> Bug 700693 - Duplicate entry for class template member function with no parameter -<li> Bug 700696 - Template static member functions duplicated as non-static public -<li> Bug 700709 - typedef warning when "using" some operator functions -<li> Bug 700710 - Docbook output produces invalid XML for <programlisting> elements -<li> Bug 700740 - Doxygen does not create links on C++ 11 style enum classes -<li> Bug 700788 - support @cite within brief description. -<li> Bug 700908 - code after \@cond is removed -<li> Bug 701295 - Doxygen 1.8.4 goes into an endless loop -<li> Bug 701314 - URLs are not created on C# classes in some cases -<li> Bug 701550 - Error List window in Visual Studio no longer recognizes doxygen warnings -<li> Bug 701771 - EXPAND_AS_DEFINED not working with some project structures -<li> Bug 701919 - VHDL cross-references fail when unpaired apostrophe present -<li> Bug 702066 - VHDL: Bad HTML formatting when using inline sources -<li> Bug 702170 - Missing space before optional option in method argument list -<li> Bug 702189 - Markdown and @image -<li> Bug 702491 - UTF-16LE BOM not handled by source browser and \snippet -<li> Bug 702590 - Crash with TAB_SIZE=-1 -<li> Bug 702676 - Closing ) of function in function documentation is in wrong color -<li> Bug 703574 - Add configure options to enable static SQLite and non-standard SQLite -<li> Bug 703112 - Backward documentation comments are not allowed in Fortran type-bound procedures -<li> Bug 703133 - "operator--()" transformed to "operator&ndash;()" in @copydoc -<li> Bug 703170 - Segmentation fault parsing a fortran file -<li> Bug 703213 - Can't use @ref instead of \ref with msc -<li> Bug 703301 - Misleading warning about DOT font -<li> Bug 703791 - Out-of-line docs for class template specialisations failing -<li> Bug 704079 - Generated XML is malformed -<li> Bug 704172 - Nested Aliases fail when the nested alias has two or more arguments. -<li> Bug 704412 - doxygen don't hide private Inherited Members -<li> Bug 704971 - Can't build with MinGW -<li> Bug 704973 - Doxywizard can't show file names using non-ASCII(Unicode) -<li> Bug 705190 - Incorrectly parsed Q_PROPERTY with 'long long' or 'long int' type -<li> Bug 705217 - Can't use unicode characters to execute external commands -<li> Bug 705218 - QRegExp doesn't work with 80-FF -<li> Bug 705219 - Accept IDs using unicode for C/C++ preprocessor -<li> Bug 705586 - @code tag as the last line of a comment block causes the parser to hang -<li> Bug 705702 - Post-comment blocks on C++11 using definitions attach to following entity -<li> Bug 706236 - Confusing use of GENERATE_TAGFILE -<li> Bug 706520 - Fortran: in body documentation lands on wrong place +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668007">668007</a> - HTML commands - documentation of </dd> tag missing +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676879">676879</a> - parameter on doxywizard manual Added sentenc in respect to possible argument for doxywizard Added images to the LaTex / pdf version of the manual +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=684324">684324</a> - Strange behavior when placing cite within brief. +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688858">688858</a> - SHORT_NAMES break references to \page in PDF output +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691315">691315</a> - Line breaks are not copied/displayed properly when using @copydoc. +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691830">691830</a> - Logical confusion with DISABLE_INDEX and GENERATE_TREEVIEW +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694147">694147</a> - #undef is ignored by doxygen +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=698998">698998</a> - vhdldocgen fails to generate proper latex for VHDL record type +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700385">700385</a> - Incorrectly parsed Q_PROPERTY with 'unsigned int' type +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700646">700646</a> - XML output does not handle HTML entities in titles +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700693">700693</a> - Duplicate entry for class template member function with no parameter +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700696">700696</a> - Template static member functions duplicated as non-static public +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700709">700709</a> - typedef warning when "using" some operator functions +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700710">700710</a> - Docbook output produces invalid XML for <programlisting> elements +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700740">700740</a> - Doxygen does not create links on C++ 11 style enum classes +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700788">700788</a> - support @cite within brief description. +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700908">700908</a> - code after \@cond is removed +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701295">701295</a> - Doxygen 1.8.4 goes into an endless loop +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701314">701314</a> - URLs are not created on C# classes in some cases +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701550">701550</a> - Error List window in Visual Studio no longer recognizes doxygen warnings +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701771">701771</a> - EXPAND_AS_DEFINED not working with some project structures +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=701919">701919</a> - VHDL cross-references fail when unpaired apostrophe present +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702066">702066</a> - VHDL: Bad HTML formatting when using inline sources +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702170">702170</a> - Missing space before optional option in method argument list +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702189">702189</a> - Markdown and @image +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702491">702491</a> - UTF-16LE BOM not handled by source browser and \snippet +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702590">702590</a> - Crash with TAB_SIZE=-1 +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=702676">702676</a> - Closing ) of function in function documentation is in wrong color +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703574">703574</a> - Add configure options to enable static SQLite and non-standard SQLite +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703112">703112</a> - Backward documentation comments are not allowed in Fortran type-bound procedures +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703133">703133</a> - "operator--()" transformed to "operator&ndash;()" in @copydoc +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703170">703170</a> - Segmentation fault parsing a fortran file +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703213">703213</a> - Can't use @ref instead of \ref with msc +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703301">703301</a> - Misleading warning about DOT font +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=703791">703791</a> - Out-of-line docs for class template specialisations failing +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704079">704079</a> - Generated XML is malformed +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704172">704172</a> - Nested Aliases fail when the nested alias has two or more arguments. +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704412">704412</a> - doxygen don't hide private Inherited Members +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704971">704971</a> - Can't build with MinGW +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=704973">704973</a> - Doxywizard can't show file names using non-ASCII(Unicode) +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705190">705190</a> - Incorrectly parsed Q_PROPERTY with 'long long' or 'long int' type +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705217">705217</a> - Can't use unicode characters to execute external commands +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705218">705218</a> - QRegExp doesn't work with 80-FF +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705219">705219</a> - Accept IDs using unicode for C/C++ preprocessor +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705586">705586</a> - @code tag as the last line of a comment block causes the parser to hang +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=705702">705702</a> - Post-comment blocks on C++11 using definitions attach to following entity +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706236">706236</a> - Confusing use of GENERATE_TAGFILE +<li> Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=706520">706520</a> - Fortran: in body documentation lands on wrong place <li> Small typo correceted in doxywizard_usage.doc Generated config.doc file in git is not identical to the generated one <li> Various improvements to the (still experimental) sqlite3 support (thanks to Adrian Negreanu) <li> jquery: use the env MINIFIER if specified @@ -402,7 +537,7 @@ <li> Replaced utf8 character that broke latex compilation of the manual <li> Fixed unused parameter warnings <li> Add support for writing and importing C++11 style enums to and from tag files -<li> Fixed regression introduced by fixed bug Bug 700740 +<li> Fixed regression introduced by fixed bug Bug <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700740">700740</a> <li> Fixed type in function name <li> Remove some unneeded and still enabled debug info <li> Included fix for "Constant Groups" regression on file pages (thanks to Michael Stahl) @@ -417,11 +552,11 @@ <a name="1.8.4"></a> <h3>Changes</h3> <ul> -<li> id 686384: When INLINE_SIMPLE_STRUCTS is enabled, also structs with +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686384">686384</a>: When INLINE_SIMPLE_STRUCTS is enabled, also structs with simple typedefs will be inlined. <li> Doxywizard: scrolling with mouse wheel no longer affects the values in the expert view. -<li> id 681733: More consistent warnings and errors. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681733">681733</a>: More consistent warnings and errors. </ul> <h3>New features</h3> <ul> @@ -450,110 +585,110 @@ <li> Included patch by Markus Geimer which adds a new option LATEX_EXTRA_FILES which works similarily to HTML_EXTRA_FILES in that it copied specified files to the LaTeX output directory. -<li> id 698223: Added support for C++11 keyword alignas -<li> id 693178: Added support for processing DocSets with Dash (thanks to +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=698223">698223</a>: Added support for C++11 keyword alignas +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693178">693178</a>: Added support for processing DocSets with Dash (thanks to Bogdan Popescu for the patch -<li> id 684782: Added option EXTERNAL_PAGES which can be used to determine +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=684782">684782</a>: Added option EXTERNAL_PAGES which can be used to determine whether or not pages importated via tags will appear under related pages (similar to EXTERNAL_GROUPS). -<li> id 692227: Added new MathJax command MATHJAX_CODEFILE which supports +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692227">692227</a>: Added new MathJax command MATHJAX_CODEFILE which supports including a file with MathJax related scripting to be inserted before the MathJax script is loaded. Thanks to Albert for the patch. -<li> id 693537: Comments in the config file starting with ## will now be +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693537">693537</a>: Comments in the config file starting with ## will now be kept when upgrading the file with doxygen -u (and doxygen -s -u). Thanks to Albert for the patch. -<li> id 693422: Adds support for Latvian (thanks to a patch by Lauris). +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693422">693422</a>: Adds support for Latvian (thanks to a patch by Lauris). <li> Included language updates for Ukrainian, Romanian, and Korean </ul> <h3>Bug fixes</h3> <ul> -<li> id 145294: Fixed parse issue when using less than inside a template +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=145294">145294</a>: Fixed parse issue when using less than inside a template argument. -<li> id 325266 man page output was missing a linebreak before .SH when +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=325266">325266</a> man page output was missing a linebreak before .SH when definition a group with a section. -<li> id 338205: @anchor were wrong when CREATE_SUBDIRS was enabled. -<li> id 427012: Putting a @todo in front of an anonoymous namespace caused +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=338205">338205</a>: @anchor were wrong when CREATE_SUBDIRS was enabled. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=427012">427012</a>: Putting a @todo in front of an anonoymous namespace caused bogus entry in the todo list. -<li> id 564462: Fixed alignment issue with tabs and multibyte characters. -<li> id 567542: Character entities in titles were not rendered correctly +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=564462">564462</a>: Fixed alignment issue with tabs and multibyte characters. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=567542">567542</a>: Character entities in titles were not rendered correctly in the HTML navigation tree. -<li> id 571561: No space between * and tag (e.g. \endcode) made parser +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=571561">571561</a>: No space between * and tag (e.g. \endcode) made parser misbehave -<li> id 583233: Included patch to limit generated Doxyfile comments to 80 +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=583233">583233</a>: Included patch to limit generated Doxyfile comments to 80 columns -<li> id 592626: Fixed off-by-one with MAX_DOT_GRAPH_DEPTH. -<li> id 619790: Improved linking to template specializations. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592626">592626</a>: Fixed off-by-one with MAX_DOT_GRAPH_DEPTH. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619790">619790</a>: Improved linking to template specializations. Thanks to David Haney for the patch. -<li> id 627712: Doxygen Header in C Files makes empty Lines in HTML Source +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=627712">627712</a>: Doxygen Header in C Files makes empty Lines in HTML Source Code when starts in Line 1 -<li> id 639954: Fortran: array constructors with brackets were not correctly +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=639954">639954</a>: Fortran: array constructors with brackets were not correctly recognized. -<li> id 646428: The generated man pages had a .PP just before the subject +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646428">646428</a>: The generated man pages had a .PP just before the subject description -<li> id 646431: On generated manpages the return section is incorrectly +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646431">646431</a>: On generated manpages the return section is incorrectly indented -<li> id 650004: use \page now generates a man page were the . is not +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650004">650004</a>: use \page now generates a man page were the . is not replaced by _8. -<li> id 657704: Fixed issue with PROJECT_LOGO when using backslashes in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=657704">657704</a>: Fixed issue with PROJECT_LOGO when using backslashes in the path. -<li> id 666008: Fortran: Using @var at module levele didn't work. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666008">666008</a>: Fortran: Using @var at module levele didn't work. expect a file/path name. -<li> id 673218: Replaced "echo -n" with "printf" in the configure script. -<li> id 674856: Removed warning when using \endinternal -<li> id 675607: Added &, @, and # as allowed characters for commands that -<li> id 679626: Included patch by Abert to correctly link pages in the manual -<li> id 681874: Added support for single column Markdown tables. -<li> id 682369: Incomplete documentation on doxygen -w latex -<li> id 683516: Doxygen crashed when structural commands (like \var) appeared +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673218">673218</a>: Replaced "echo -n" with "printf" in the configure script. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674856">674856</a>: Removed warning when using \endinternal +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=675607">675607</a>: Added &, @, and # as allowed characters for commands that +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679626">679626</a>: Included patch by Abert to correctly link pages in the manual +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681874">681874</a>: Added support for single column Markdown tables. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682369">682369</a>: Incomplete documentation on doxygen -w latex +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=683516">683516</a>: Doxygen crashed when structural commands (like \var) appeared in .md files. -<li> id 686259: Fixed character encoding problem when multibytes characters +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686259">686259</a>: Fixed character encoding problem when multibytes characters were used in anchors. -<li> id 691071: Documentation before an anonymous member did not appear. -<li> id 692162: Fixed Markdown related indentation problem. -<li> id 692320: Regression: Text after @copydoc was not visible anymore. -<li> id 692537: Linked to external pages was done using the page label +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691071">691071</a>: Documentation before an anonymous member did not appear. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692162">692162</a>: Fixed Markdown related indentation problem. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692320">692320</a>: Regression: Text after @copydoc was not visible anymore. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692537">692537</a>: Linked to external pages was done using the page label rather than the file name. -<li> id 693331: build using ./configure ; make did not work if the path +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693331">693331</a>: build using ./configure ; make did not work if the path contained a space. -<li> id 693406: Tag files are now identfied by the full path instead of +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=693406">693406</a>: Tag files are now identfied by the full path instead of only the name of the tag file. -<li> id 694376: In some cases members were missing from the tag file. -<li> id 694027: Fortran: derive intent from documentation in case no +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694376">694376</a>: In some cases members were missing from the tag file. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694027">694027</a>: Fortran: derive intent from documentation in case no intent is specified -<li> id 694610: Warning was not reported at the correct line in two cases. -<li> id 694631, 694632: @cond..@endcond did not work properly for removing +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694610">694610</a>: Warning was not reported at the correct line in two cases. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694631">694631</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694632">694632</a>: @cond..@endcond did not work properly for removing macro definitions. -<li> id 694685: Fixed crash when adding two different functions with the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694685">694685</a>: Fixed crash when adding two different functions with the same name to the same group. -<li> id 694726: VHDL: fixed issue generating LaTeX output. -<li> id 695277: Fortran: improved handling of protected statement -<li> id 695974: Fortran: Fixed issue resulting in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=694726">694726</a>: VHDL: fixed issue generating LaTeX output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=695277">695277</a>: Fortran: improved handling of protected statement +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=695974">695974</a>: Fortran: Fixed issue resulting in "Stack buffers nested too deeply" error. -<li> id 696708: @cond was not handled properly by the preprocessor. -<li> id 697233: @copyright command did not end a brief description. -<li> id 697249: Markdown tables caused errors reported at wrong line number. -<li> id 697494: Removed double entry from the messages produced by doxygen. -<li> id 698818: Fixed problem handling @cond for #define's -<li> id 698007: Fixed potential crash when searching files. -<li> id 696925: #include's inside namespace could result in duplicate entries. -<li> id 696954: Doxywizard: Labels of items are now also grayed out +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=696708">696708</a>: @cond was not handled properly by the preprocessor. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=697233">697233</a>: @copyright command did not end a brief description. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=697249">697249</a>: Markdown tables caused errors reported at wrong line number. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=697494">697494</a>: Removed double entry from the messages produced by doxygen. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=698818">698818</a>: Fixed problem handling @cond for #define's +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=698007">698007</a>: Fixed potential crash when searching files. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=696925">696925</a>: #include's inside namespace could result in duplicate entries. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=696954">696954</a>: Doxywizard: Labels of items are now also grayed out when an item is disabled (thanks to Albert for the patch). -<li> id 699195: Changed Markdown page label to support multiple .md files +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699195">699195</a>: Changed Markdown page label to support multiple .md files with the same name. -<li> id 699218: Fixed issue with margin computation in resize.js. -<li> id 699381: Lonely h4,h5,h6 end tag caused assert. -<li> id 699437: Trailing comments were not always rendered properly if +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699218">699218</a>: Fixed issue with margin computation in resize.js. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699381">699381</a>: Lonely h4,h5,h6 end tag caused assert. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699437">699437</a>: Trailing comments were not always rendered properly if MARKDOWN_SUPPORT was enabled. -<li> id 699460: Updated doxygen man page (thanks to Manuel for the patch). -<li> id 699464: Added reference to \xmlonly and \docbookonly in \htmlonly -<li> id 699731: LaTeX: switch to using the xtabular package instead of +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699460">699460</a>: Updated doxygen man page (thanks to Manuel for the patch). +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699464">699464</a>: Added reference to \xmlonly and \docbookonly in \htmlonly +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699731">699731</a>: LaTeX: switch to using the xtabular package instead of longtable to prevent overfull vbox errors. -<li> id 699732: Template parameters and Exceptions were rendered differently +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=699732">699732</a>: Template parameters and Exceptions were rendered differently than Parameters and Return Values in the LaTeX output. -<li> id 700153: Tcl: Fixed crash when parsing certain Tcl code. -<li> id 700345: Comment blocking ending with ///// made slashes appear in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700153">700153</a>: Tcl: Fixed crash when parsing certain Tcl code. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700345">700345</a>: Comment blocking ending with ///// made slashes appear in the output. -<li> id 700456: Added support for separating auto list items with an +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=700456">700456</a>: Added support for separating auto list items with an empty paragraph. <li> Included a couple of VHDL fixes (thanks to Martin Kreis for the patch) <li> \include and \includelineno both showed line numbers. @@ -577,7 +712,7 @@ <li> Disabled the disk cache for member data. Allows removing quite some complexity in doxygen and is not really needed now that 64bit systems with >4GB RAM are becoming more common. Let me know if you think you benefit from this caching. -<li> id 691607: Using $relpath$ in a custom footer could lead to ambiguities +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691607">691607</a>: Using $relpath$ in a custom footer could lead to ambiguities when followed by a name that could also be a marker, like 'search'. Now $relpath^ should be used instead. $relpath$ is still supported for backward compatibility. @@ -593,31 +728,31 @@ </ul> <h3>Bug fixes</h3> <ul> -<li> id 644350: Fortran: Included patch to improve parsing line continuation +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=644350">644350</a>: Fortran: Included patch to improve parsing line continuation characters. -<li> id 645423: Fortran: added support for protected attribute -<li> id 682550,691315: When using @copydoc, paragraphs breaks did not appear +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=645423">645423</a>: Fortran: added support for protected attribute +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682550">682550</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691315">691315</a>: When using @copydoc, paragraphs breaks did not appear in the copied documentation. -<li> id 686581: Fortran: handle single quotes in normal Fortran comment. -<li> id 686689, 691335: Scope of forwardly declared template class was lost +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686581">686581</a>: Fortran: handle single quotes in normal Fortran comment. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686689">686689</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691335">691335</a>: Scope of forwardly declared template class was lost in the output. -<li> id 689713: Tcl: Inline source code was not rendered correctly. -<li> id 690787: Fixed case were a cyclic inheritance relation could crash +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689713">689713</a>: Tcl: Inline source code was not rendered correctly. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690787">690787</a>: Fixed case were a cyclic inheritance relation could crash doxygen. -<li> id 690831: Using @subpage in a -# style list was not handled properly. -<li> id 691000: For a mainpage without title the project name is now shown as +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690831">690831</a>: Using @subpage in a -# style list was not handled properly. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691000">691000</a>: For a mainpage without title the project name is now shown as the title in the XML output. -<li> id 691277: The generated list of citations is now no longer included in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691277">691277</a>: The generated list of citations is now no longer included in the tag file. -<li> id 691073: Documenting strongly typed enum values outside of the enum +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691073">691073</a>: Documenting strongly typed enum values outside of the enum did not work. -<li> id 691310: Python: = was missing in the output for variable assignment. -<li> id 691323: Doxygen could crash when creating inline msc graphs. -<li> id 691340: Members didn't have a More.. link to jump to detailed docs. -<li> id 691602: Doxygen did not probably distinguish between two template -<li> id 691798: regression: C++ style comments that started with a line of +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691310">691310</a>: Python: = was missing in the output for variable assignment. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691323">691323</a>: Doxygen could crash when creating inline msc graphs. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691340">691340</a>: Members didn't have a More.. link to jump to detailed docs. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691602">691602</a>: Doxygen did not probably distinguish between two template +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=691798">691798</a>: regression: C++ style comments that started with a line of slashes did not get processed correctly anymore. -<li> id 692031: Fixed parse error when left shift operator occurred as a +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=692031">692031</a>: Fixed parse error when left shift operator occurred as a default parameter. members or functions that only differ in the return type. <li> Setting SEARCH_INCLUDES to NO resulted in no include graphs and no @@ -643,7 +778,7 @@ Pez Cuckow for the patch). <li> A blockquote in Markdown does no longer require a whitespace after the last '>' if the '>' is followed by a newline. -<li> id 682718: Included patch to add version info to all generated +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682718">682718</a>: Included patch to add version info to all generated template files (headers, footers, stylesheets, layout files, etc). </ul> <h3>New features</h3> @@ -659,91 +794,91 @@ See the <a href="extsearch.html">manual</a> for details. <li> Added USE_MDFILE_AS_MAINPAGE config option to select a markdown page to be used as the main page. -<li> id 630645: This patch (contributed by Albert) adds support for +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=630645">630645</a>: This patch (contributed by Albert) adds support for simple logic expressions for \cond, \if, and friends, i.e. you can do \if (SOME_SECTION_NAME && (!THIS_ALTERNATIVE || THAT_ALTERNATIVE)) -<li> id 684152: Patch (contributed by Albert) adds a new configuration +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=684152">684152</a>: Patch (contributed by Albert) adds a new configuration option MATHJAX_FORMAT to select the MathJax output format. Options are HTML-CSS, NativeMML, or SVG. </ul> <h3>Bug fixes</h3> <ul> -<li> id 670853: Fixed compile issues with 0 to QCString cast for +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670853">670853</a>: Fixed compile issues with 0 to QCString cast for old compilers. -<li> id 678139: A class A deriving from another class B inside a namespace +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678139">678139</a>: A class A deriving from another class B inside a namespace not known to doxygen, caused class B to appear in the global scope. -<li> id 681209: Fixed problem processing .bib files when they were located +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681209">681209</a>: Fixed problem processing .bib files when they were located in a path containing spaces. -<li> id 681830: Using \addindex in a page will now produce a link to the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681830">681830</a>: Using \addindex in a page will now produce a link to the word, instead of the start of the page. -<li> id 681831: The TREEVIEW_WIDTH option did not have any effect. -<li> id 681898: Jumping from a level 3 section to a level 1 section did +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681831">681831</a>: The TREEVIEW_WIDTH option did not have any effect. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681898">681898</a>: Jumping from a level 3 section to a level 1 section did not appear correctly in the page TOC. -<li> id 681976: C++11: Improved handling of noexcept expressions, e.g.: +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681976">681976</a>: C++11: Improved handling of noexcept expressions, e.g.: <code>Test() noexcept ( noexcept(T::T()) ) = default;</code> -<li> id 682048: Improved SIGINT handling when running multiple dot instances. -<li> id 682602: Fixed problem processing .bib files when using a non default +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682048">682048</a>: Improved SIGINT handling when running multiple dot instances. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682602">682602</a>: Fixed problem processing .bib files when using a non default output directory. -<li> id 682713: Comment for IDL_PROPERTY_SUPPORT in the config file template +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682713">682713</a>: Comment for IDL_PROPERTY_SUPPORT in the config file template did not have line wrapping. -<li> id 682728: Setting SHOW_FILES to NO prevented call graphs from being +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682728">682728</a>: Setting SHOW_FILES to NO prevented call graphs from being generated. -<li> id 682740: Fortran: In initialization statement the "=" was missing -<li> id 683284: Fortran: ALIASes where not replaced in !! and !< comments. -<li> id 683976: Added meta tag "generator" to HTML output (thanks to +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=682740">682740</a>: Fortran: In initialization statement the "=" was missing +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=683284">683284</a>: Fortran: ALIASes where not replaced in !! and !< comments. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=683976">683976</a>: Added meta tag "generator" to HTML output (thanks to Albert for the patch). -<li> id 684781: Sections of the main page did not appear in the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=684781">684781</a>: Sections of the main page did not appear in the navigation tree until the main page had sub pages. Also fixed bug in treeview that caused mainpage with title and sections to appear at the same level as the sections. -<li> id 685125: Doxygen could select the wrong overloaded method when +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685125">685125</a>: Doxygen could select the wrong overloaded method when the only difference in parameter types was the template type of a typedef. -<li> id 685181: Inheriting member documentation did not work in combination +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685181">685181</a>: Inheriting member documentation did not work in combination with Java interfaces. -<li> id 685623: Enum values did not appear in the detailed documentation +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685623">685623</a>: Enum values did not appear in the detailed documentation when using C++11 style enums. -<li> id 685879: Even though HIDE_UNDOC_MEMBERS was enabled, the navigation +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685879">685879</a>: Even though HIDE_UNDOC_MEMBERS was enabled, the navigation still showed undocumented members. -<li> id 685940: Fixed back button behaviour when using the navigation tree. -<li> id 686284: Added anchors to refs in the index.qhp TOC. -<li> id 686826: Added XML declaration to index.qhp TOC. -<li> id 686956: When a class and its base class has the same nested class, +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=685940">685940</a>: Fixed back button behaviour when using the navigation tree. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686284">686284</a>: Added anchors to refs in the index.qhp TOC. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686826">686826</a>: Added XML declaration to index.qhp TOC. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686956">686956</a>: When a class and its base class has the same nested class, the collaboration diagram could point to the wrong class. -<li> id 686983: Comments inside a function macro parameter appeared before +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=686983">686983</a>: Comments inside a function macro parameter appeared before the expanded macro, instead of being treated as part of the parameter. -<li> id 687301: Allow minus in the name of a HTML attribute. -<li> id 687572: Code fragments were wrapped too early in the latex output. -<li> id 688226: Fixed Qt version number in ./configure --help text. -<li> id 688463: Included patch to prevent processing identifiers starting +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=687301">687301</a>: Allow minus in the name of a HTML attribute. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=687572">687572</a>: Code fragments were wrapped too early in the latex output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688226">688226</a>: Fixed Qt version number in ./configure --help text. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688463">688463</a>: Included patch to prevent processing identifiers starting with _ or __ as markdown. -<li> id 688531: Horizontal ruler inside paragraph caused missing </p> -<li> id 688542: Using "usergroup" in the layout.xml caused missing <div> -<li> id 688739: Fixed problem with user defined entries in the eclipse help +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688531">688531</a>: Horizontal ruler inside paragraph caused missing </p> +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688542">688542</a>: Using "usergroup" in the layout.xml caused missing <div> +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688739">688739</a>: Fixed problem with user defined entries in the eclipse help index (thanks to Rene Papenhoven for the fix). -<li> id 688647: Fixed problem parsing initializer list with C++11 style +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=688647">688647</a>: Fixed problem parsing initializer list with C++11 style uniform types. -<li> id 689341: \if around list item preceded by whitespace caused wrong +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689341">689341</a>: \if around list item preceded by whitespace caused wrong list in the output. -<li> id 689461: Correct link in documentation of SIP_SUPPORT option. -<li> id 689720: Fixed bug that could prevent refman.tex from being generated. -<li> id 689833: Fixed missing space in Chinese translation. -<li> id 690093: Files added via HTML_EXTRA_STYLESHEET did not correct refer +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689461">689461</a>: Correct link in documentation of SIP_SUPPORT option. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689720">689720</a>: Fixed bug that could prevent refman.tex from being generated. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=689833">689833</a>: Fixed missing space in Chinese translation. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690093">690093</a>: Files added via HTML_EXTRA_STYLESHEET did not correct refer to files that where placed in a subdirectory. -<li> id 690190: Searching for multibyte characters did not work with the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690190">690190</a>: Searching for multibyte characters did not work with the server based search engine. -<li> id 690250: Fixed case where line numbers got out of sync with the code. -<li> id 690341: First member of an anonymous C++11 style enum was not shown +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690250">690250</a>: Fixed case where line numbers got out of sync with the code. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690341">690341</a>: First member of an anonymous C++11 style enum was not shown properly. -<li> id 690385: Fixed case where _'s where falsely converted to Markdown +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690385">690385</a>: Fixed case where _'s where falsely converted to Markdown emphasis. -<li> id 690403: Title not used when \ref'ing to a \section imported via +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690403">690403</a>: Title not used when \ref'ing to a \section imported via a tag file. -<li> id 690418: Behavior of @cond was accidentally reversed by new expression +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690418">690418</a>: Behavior of @cond was accidentally reversed by new expression parser. -<li> id 690602: Fixed problems handling @cond inside /// comments. -<li> id 690629: Fixed case where doxygen would during preprocessing. -<li> id 690685: A file specified using HTML_EXTRA_STYLEHSHEET did not end +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690602">690602</a>: Fixed problems handling @cond inside /// comments. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690629">690629</a>: Fixed case where doxygen would during preprocessing. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=690685">690685</a>: A file specified using HTML_EXTRA_STYLEHSHEET did not end up in the Qt Help index. <li> Improved the way enum's are rendered in the HTML output. <li> When inlining structs (INLINE_SIMPLE_STRUCTS=YES) a <p> was missing @@ -778,20 +913,20 @@ <pre>enum class E</pre> <li> enums with explicit type, e.g.: <pre>enum E : unsigned int { ... }</pre> - <li> id 678097: added support for final keyword on classes and methods. + <li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678097">678097</a>: added support for final keyword on classes and methods. <li> support for override keyword for methods. <li> <code>nullptr</code> is new a type keyword in code fragments. <li> support for variables with initializer lists, e.g.: <pre>const int var {10};</pre> <li> support for trailing return types, e.g.: <pre>auto foo() -> Bar;</pre> - <li> id 672372: added support for template aliases, + <li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672372">672372</a>: added support for template aliases, e.g.: <pre>template<typename T> using A = B<T>;</pre> <li> support for C++11 variadic templates, e.g.: <pre>template<typename... Values> class C;</pre> <li> support for documenting template class declarations. - <li> id 680098: <code>static_assert(...);</code> inside a class is now ignored. - <li> id 679740: Add support parameters with default lambda functions, + <li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680098">680098</a>: <code>static_assert(...);</code> inside a class is now ignored. + <li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679740">679740</a>: Add support parameters with default lambda functions, e.g.: <pre>int foo(int i, std::function<int(int)> f = [](int x) -> int { return x / 2; })</pre> <li> default initializers for non-static data members, e.g.: <pre>class C { public: int x = 4; int y {6}; int z = y*func(); };</pre> @@ -837,36 +972,36 @@ member and its brief description. <li> Fixed a couple of compiler warning with the new XCode 4.4 compiler. <li> Added compilation support for Mountain Lion (Mac OS X 10.8). -<li> id 679631: Nested namespaces did not appear in the namespace list if the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679631">679631</a>: Nested namespaces did not appear in the namespace list if the parent namespace was undocumented. -<li> id 680227: Fixed some spelling errors in the code comments. -<li> id 680398: Fortran: comma at begin of argument list description in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680227">680227</a>: Fixed some spelling errors in the code comments. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680398">680398</a>: Fortran: comma at begin of argument list description in case of implicit type -<li> id 680405: Fortran: Entities on line with USE, ONLY were not hyperlinked +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680405">680405</a>: Fortran: Entities on line with USE, ONLY were not hyperlinked in code. -<li> id 680408: Fortran: handle carriage return in non terminated strings. -<li> id 680492: Using Markdown formatting in @todo/@bug/.. like descriptions +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680408">680408</a>: Fortran: handle carriage return in non terminated strings. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680492">680492</a>: Using Markdown formatting in @todo/@bug/.. like descriptions did not work. -<li> id 680575: Fixed potential crash when <code> appeared inside <summary> +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680575">680575</a>: Fixed potential crash when <code> appeared inside <summary> for C# code. -<li> id 680697: \xrefitems of the same type are not grouped together under +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680697">680697</a>: \xrefitems of the same type are not grouped together under the same heading (just like \todo and friends). <li> Fixed case where full directory path was shown even though FULL_PATH_NAMES was set to NO. -<li> id 680709: HTML output of template-derived classes contained unescaped +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680709">680709</a>: HTML output of template-derived classes contained unescaped characters. -<li> id 679963: "Class Index" appeared twice in the PDF TOC, Index at the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679963">679963</a>: "Class Index" appeared twice in the PDF TOC, Index at the end did not appear at all. <li> In a declaration no link was created when referring to a class inside an undocumented namespace imported via a tag file. -<li> id 681281: Make default for TAB_SIZE 4 and added remark in Markdown +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681281">681281</a>: Make default for TAB_SIZE 4 and added remark in Markdown section of the manual about the effect of TAB_SIZE on code block processing when using tabs in the comment block. -<li> id 681023: Project logo was not included in the Qt help output. -<li> id 680992: Fixed a couple of typos in the comments. -<li> id 681350: Fixed a problem with Markdown processing of a @code block +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681023">681023</a>: Project logo was not included in the Qt help output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=680992">680992</a>: Fixed a couple of typos in the comments. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=681350">681350</a>: Fixed a problem with Markdown processing of a @code block inside an indented /// style comment. -<li> id 679928: Disabled section level correction for Markdown pages as +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679928">679928</a>: Disabled section level correction for Markdown pages as is was confusing. </ul> \endhtmlonly @@ -878,7 +1013,7 @@ <ul> <li> doxygen now strips the leading indentation shared by the lines in a @code..@endcode block. -<li> id 678218: Changed title of the SVG graphs from 'G' to the root node +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678218">678218</a>: Changed title of the SVG graphs from 'G' to the root node of the graph. </ul> <h3>New features</h3> @@ -887,41 +1022,41 @@ syncing the navigation tree with the content. <li> Extended the number of HTML entities with Greek letters and other symbols (thanks to Charles Karney for the patch). -<li> id 663645: Added support for C++11 strongly typed enums +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=663645">663645</a>: Added support for C++11 strongly typed enums (enum class E { ... }). </ul> <h3>Bug fixes</h3> <ul> -<li> id 590518: Added missing class member initialization to a +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=590518">590518</a>: Added missing class member initialization to a class in doxmlparser and made the library compile again. -<li> id 667678: Added support for Obj-C property attribute "unsafe_retained". -<li> id 674842,676984: Unmatched quote in a comment prevented alias expansion. -<li> id 676019: Fixed another case where local include path did not appear +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667678">667678</a>: Added support for Obj-C property attribute "unsafe_retained". +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674842">674842</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676984">676984</a>: Unmatched quote in a comment prevented alias expansion. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676019">676019</a>: Fixed another case where local include path did not appear correctly in the class documentation. -<li> id 676966: Fortran: Some keyword were not colored in the source view. -<li> id 676981: Fortran: Argument type was wrong type of in case of out of +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676966">676966</a>: Fortran: Some keyword were not colored in the source view. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676981">676981</a>: Fortran: Argument type was wrong type of in case of out of place !> comment -<li> id 677935: Included patch to fix problem compiling for x86 release on +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677935">677935</a>: Included patch to fix problem compiling for x86 release on Windows. -<li> id 677992: Section without title could result in an invalid Qt Help +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677992">677992</a>: Section without title could result in an invalid Qt Help index. -<li> id 678022: Anonymous enum could result in an invalid Qt Help index. -<li> id 678102: Superfluous trailing comma in javascript +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678022">678022</a>: Anonymous enum could result in an invalid Qt Help index. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678102">678102</a>: Superfluous trailing comma in javascript prevented navigation tree to load in IE7. -<li> id 678177: a + at the start of a line inside a <pre> block, +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678177">678177</a>: a + at the start of a line inside a <pre> block, triggered the start of a list. Also -- and --- where not kept untouched inside a <pre> block. -<li> id 678180: ndash (--) appearing in a brief description could lead +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678180">678180</a>: ndash (--) appearing in a brief description could lead to invalid SVG images. -<li> id 678288: -- and --- inside a Markdown code block were not handled +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=678288">678288</a>: -- and --- inside a Markdown code block were not handled properly. -<li> id 679331,675766: In body documentation with a different indentation then the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679331">679331</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=675766">675766</a>: In body documentation with a different indentation then the main documentation was not rendered correctly (MARKDOWN=YES). -<li> id 679436: Using an escaped pipe symbol in a Markdown table did not get +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679436">679436</a>: Using an escaped pipe symbol in a Markdown table did not get unescaped in the output. -<li> id 679533: Code fragments did not appear properly in the doxygen manual. -<li> id 679615: Added missing delete call in a piece of debugging code. -<li> id 679626: Fixed some navigation issues in the manual +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679533">679533</a>: Code fragments did not appear properly in the doxygen manual. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679615">679615</a>: Added missing delete call in a piece of debugging code. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=679626">679626</a>: Fixed some navigation issues in the manual <li> Not all inherited members appeared in the "Additional inherited members" list. <li> Link to call after "Inherited members" was not correct when @@ -944,30 +1079,30 @@ <ul> <li> VHDL code now has a new Design Overview page (thanks for Martin Kreis for the patch). Requires HAVE_DOT=YES, and DOT_IMAGE_FORMAT=svg. -<li> id 677678: Added support for strong and weak attributes in Objective-C +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677678">677678</a>: Added support for strong and weak attributes in Objective-C properties. </ul> <h3>Bug fixes</h3> <ul> -<li> id 618462: Fortran: Appearance of comments in the HTML output +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=618462">618462</a>: Fortran: Appearance of comments in the HTML output are now customizable via CSS again. -<li> id 673660: <code> inside a <summary> or <remarks> section is now treated +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673660">673660</a>: <code> inside a <summary> or <remarks> section is now treated as @code (was already the code for C#). -<li> id 673921: When a comment started at indent >= 4 after a /** and +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673921">673921</a>: When a comment started at indent >= 4 after a /** and continued at the same indent without leading * after a blank line, the continued part appeared at as a code block when Markdown was enabled. -<li> id 675036: If a file was not indexed, the navigation tree became empty. -<li> id 676019: Include path using quotes did not work as documented. -<li> id 676877: @warning did not end at blank line when followed by +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=675036">675036</a>: If a file was not indexed, the navigation tree became empty. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676019">676019</a>: Include path using quotes did not work as documented. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676877">676877</a>: @warning did not end at blank line when followed by a numbered list. -<li> id 676902: An anonymous namespace could introduce an invalid entry in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676902">676902</a>: An anonymous namespace could introduce an invalid entry in the navigation list. -<li> id 676948: Breadcrumb navigation path had wrong links when +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676948">676948</a>: Breadcrumb navigation path had wrong links when CREATE_SUBDIRS was enabled. -<li> id 677315: Fixed case where function was incorrectly detected as a +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677315">677315</a>: Fixed case where function was incorrectly detected as a variable. -<li> id 677589: Fixed typo in the documentation of the LAYOUT_FILE option. -<li> id 677771: Fixed visual misalignment for first argument. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677589">677589</a>: Fixed typo in the documentation of the LAYOUT_FILE option. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=677771">677771</a>: Fixed visual misalignment for first argument. <li> The "arrow out" button in interactive SVG did not work when served from a web server, due to the use of an absolute path. <li> If a declation was too wide for a page, the content in HTML spilled @@ -1029,14 +1164,14 @@ make sure you add the following: <li> For interactive SVGs the print button has been replaced by a "arrow out" button that opens the original non-interactive SVG in a new window for easy printing or saving. -<li> id 661499: Long names are now wrapped in the dot nodes to avoid +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=661499">661499</a>: Long names are now wrapped in the dot nodes to avoid very wide graphs. </ul> <h3>New features</h3> <ul> -<li> id 666527: Added support for <inheritdoc/> C# XML command +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666527">666527</a>: Added support for <inheritdoc/> C# XML command (thanks to John Werner for the patch). -<li> id 670965, Added support for resolving environment variables of the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670965">670965</a>, Added support for resolving environment variables of the form $(PROGRAMFILES(X86)) inside the config file <li> Doxygen now shows Objective-C properties in collaboration diagrams (thanks to Sven Weidauer for the patch). @@ -1044,77 +1179,77 @@ make sure you add the following: <li> Inherited class members are now shown as expandable sections in the member overview (default is collapsed). Each section is rendered as a table. -<li> id 674349: Included build support for NetBSD. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674349">674349</a>: Included build support for NetBSD. <li> A -- will now be rendered as an 'en dash', similarly, --- will produce an mdash. </ul> <h3>Bug fixes</h3> <ul> -<li> id 523156: Fortran: Prefix of routines got stripped. -<li> id 666088: Include VHDL patch (thanks to Martin Kreis). -<li> id 670235: Fixed include guard detection problem when using +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=523156">523156</a>: Fortran: Prefix of routines got stripped. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666088">666088</a>: Include VHDL patch (thanks to Martin Kreis). +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670235">670235</a>: Fixed include guard detection problem when using #pragma once -<li> id 670805: A numbered list (1. 2. 3.) where each list item ended with +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670805">670805</a>: A numbered list (1. 2. 3.) where each list item ended with an empty line is no longer treated as a set of separate lists (all starting with 1.). -<li> id 670889: Java: last enum value did not appear in the output unless it was +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670889">670889</a>: Java: last enum value did not appear in the output unless it was followed by a comma. -<li> id 671023, 671312: Regression: Autolist items starting on a new paragraph +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671023">671023</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671312">671312</a>: Regression: Autolist items starting on a new paragraph at indent level larger than 0 were not processed correctly. -<li> id 671076: Sections could be missing from the navigation tree in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671076">671076</a>: Sections could be missing from the navigation tree in some situations. -<li> id 671158: @tableofcontents did not work for the main page (@mainpage) -<li> id 671159: Sections in a separate markdown page did not appear in the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671158">671158</a>: @tableofcontents did not work for the main page (@mainpage) +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671159">671159</a>: Sections in a separate markdown page did not appear in the table of contents. -<li> id 671166: Fortran: Fixed problem causing call/caller graphs not to be +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671166">671166</a>: Fortran: Fixed problem causing call/caller graphs not to be generated. -<li> id 671171: RPM spec file was updated to make it work with RHEL 6.2 +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671171">671171</a>: RPM spec file was updated to make it work with RHEL 6.2 (thanks to Peter Klotz for the patch) -<li> id 671240: Corrected line number of error message reported for +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671240">671240</a>: Corrected line number of error message reported for pages. -<li> id 671291: C# regression: enum values where not shown in the docs. -<li> id 671395: When #some_member appeared at the start of a line it was +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671291">671291</a>: C# regression: enum values where not shown in the docs. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671395">671395</a>: When #some_member appeared at the start of a line it was seen as a level one header instead of a link to a member when Markdown processing was enable. Now at least one space is required after the # to make it a header. -<li> id 671426: Fixed case where doxygen could crash when a section and +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671426">671426</a>: Fixed case where doxygen could crash when a section and subsection had the same label. -<li> id 671591: docset creating could fail due to invalid Nodes.xml -<li> id 671702: Using \internal in a group or member did not hide it +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671591">671591</a>: docset creating could fail due to invalid Nodes.xml +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671702">671702</a>: Using \internal in a group or member did not hide it from the navigation tree if there was no documentation. -<li> id 671709: Backticks in C# comments did not appear as inline +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=671709">671709</a>: Backticks in C# comments did not appear as inline fragments, like was the case for other languages. -<li> id 672119: PHP: defines are now shown as constants rather than enums. -<li> id 672662: File with .md or .markdown extension were not included +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672119">672119</a>: PHP: defines are now shown as constants rather than enums. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672662">672662</a>: File with .md or .markdown extension were not included with the default setting of FILE_PATTERNS. -<li> id 672366: mailto style URLs did not work correctly in combination with +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672366">672366</a>: mailto style URLs did not work correctly in combination with CREATE_SUBDIRS = YES. -<li> id 672472: Removed bogus </b> when using @par. -<li> id 672475: Added "warning:" prefix to "missing \endcode" message. -<li> id 672479: Doxygen comments after a macro definition were not +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672472">672472</a>: Removed bogus </b> when using @par. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672475">672475</a>: Added "warning:" prefix to "missing \endcode" message. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672479">672479</a>: Doxygen comments after a macro definition were not removed in the source browser view. -<li> id 672526: Removed black line in front of custom paragraphs. -<li> id 672536: PHP: use keyword was not handled correctly when importing +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672526">672526</a>: Removed black line in front of custom paragraphs. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672536">672536</a>: PHP: use keyword was not handled correctly when importing classes from another namespace. -<li> id 672620: Switched to using "Macro" in the output instead of "Define". -<li> id 672656: Using ![caption](filename.png) did not work correctly for +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672620">672620</a>: Switched to using "Macro" in the output instead of "Define". +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=672656">672656</a>: Using ![caption](filename.png) did not work correctly for local images pointed to with IMAGE_PATH. -<li> id 673045: A block of ///'s inside a verbatim block inside a .md +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673045">673045</a>: A block of ///'s inside a verbatim block inside a .md file was replaced by /** .. */ -<li> id 673066: Doxygen now skips scanning files in directories starting with +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673066">673066</a>: Doxygen now skips scanning files in directories starting with a dot (e.g. .svn). -<li> id 673219: Included patch by Ryan Schmidt to make the Mac versions +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673219">673219</a>: Included patch by Ryan Schmidt to make the Mac versions in qglobal.h match that of Apple header files. -<li> id 673870: Added C++11 classes when BUILTIN_STL_SUPPORT is enabled. -<li> id 673983: Using a backslash in a section cause 026E30F to appear in the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673870">673870</a>: Added C++11 classes when BUILTIN_STL_SUPPORT is enabled. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=673983">673983</a>: Using a backslash in a section cause 026E30F to appear in the latex TOC. -<li> id 674563: Fortran: case sensitiveness for routines and functions +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674563">674563</a>: Fortran: case sensitiveness for routines and functions did not work -<li> id 674583: Fortran: continuation by ampersand not placed in code output. -<li> id 675757: Fixed indenting issue after the end of a markdown code block +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=674583">674583</a>: Fortran: continuation by ampersand not placed in code output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=675757">675757</a>: Fixed indenting issue after the end of a markdown code block inside a list. -<li> id 676116: Use new index style for page index. -<li> id 676294: Fixed LaTeX error when backslash appeared in a hyperlinked +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676116">676116</a>: Use new index style for page index. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=676294">676294</a>: Fixed LaTeX error when backslash appeared in a hyperlinked code fragment. <li> Tag files had wrong character encoding set in the header. <li> C# in/out did not appear in generics using covariance or contravariance. @@ -1145,13 +1280,13 @@ make sure you add the following: <li> Updated the manual and improved the look. <li> Made the contents in the navigation tree more consistent for groups, pages with subpages, and grouped subpages. -<li> id 669079: Latex: made the margins of latex page layout smaller using +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669079">669079</a>: Latex: made the margins of latex page layout smaller using the geometry package. <li> The tool doxytag has been declared obsolete and is removed (it wasn't working properly anyway). Same goes for the installdox script. <li> Updated the copyright in source code and doxywizard "about" to 2012. -<li> id 668008: HTML version of the manual now has the treeview enabled +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668008">668008</a>: HTML version of the manual now has the treeview enabled for easier navigation. </ul> <h3>New features</h3> @@ -1212,70 +1347,70 @@ make sure you add the following: LaTeX and RTF output. <li> Added -d filteroutput option to show the output of an input filter (thanks to Albert for the patch). -<li> id 668010: Latex: for Windows doxygen new generates a makepdf.bat +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668010">668010</a>: Latex: for Windows doxygen new generates a makepdf.bat file in the latex output dir to create the latex documentation. </ul> <h3>Bug fixes</h3> <ul> -<li> id 498703: Fixed encoding issue in CHM index file for group titles. -<li> id 510975: FORTRAN: Keywords like .GT. recognized as symbols for +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=498703">498703</a>: Fixed encoding issue in CHM index file for group titles. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=510975">510975</a>: FORTRAN: Keywords like .GT. recognized as symbols for cross ref. -<li> id 511906, 581303, 622749: \copydoc did copy the brief description +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=511906">511906</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=581303">581303</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622749">622749</a>: \copydoc did copy the brief description into the detailed section, causing a difference between the original and the copy. -<li> id 555327: Using @ref for an example file, caused it to appear as +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=555327">555327</a>: Using @ref for an example file, caused it to appear as file::ext. -<li> id 567494: Fortran: Included patch for blockdata sub-programs. -<li> id 628417: Fortran: doxygen filter, preparsing fixed form of null -<li> id 662286: TCL: Inlcuded patch to fixed UTF-8 support. -<li> id 662289: TCL: Included patch to prevent ##### from appearing in the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=567494">567494</a>: Fortran: Included patch for blockdata sub-programs. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=628417">628417</a>: Fortran: doxygen filter, preparsing fixed form of null +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=662286">662286</a>: TCL: Inlcuded patch to fixed UTF-8 support. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=662289">662289</a>: TCL: Included patch to prevent ##### from appearing in the output. -<li> id 646319: Using a file name with path for HTML_STYLESHEET caused the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646319">646319</a>: Using a file name with path for HTML_STYLESHEET caused the path to appear in the HTML output. -<li> id 664826: Fixed one more problem with include guard detection. -<li> id 665629: Fixed parse problem when a #define appeared inside an enum. -<li> id 665855: Fixed problem parsing C++ template specialization of the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=664826">664826</a>: Fixed one more problem with include guard detection. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665629">665629</a>: Fixed parse problem when a #define appeared inside an enum. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665855">665855</a>: Fixed problem parsing C++ template specialization of the form A<func(T*)> such as used in boost::signal2 types. -<li> id 666047: A </p> followed by an htmlonly..endhtmlonly section +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666047">666047</a>: A </p> followed by an htmlonly..endhtmlonly section caused invalid XHTML output. -<li> id 666085: Fixed include handling in case the include guard was +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666085">666085</a>: Fixed include handling in case the include guard was documented. -<li> id 666124: Fixed problem loading the navigation tree in IE8 when +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666124">666124</a>: Fixed problem loading the navigation tree in IE8 when serving pages via a web server. -<li> id 666337: Included patch to avoid hypenation hints in front of the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666337">666337</a>: Included patch to avoid hypenation hints in front of the first captial in a word. -<li> id 666568: When SHOW_FILES was NO, a grouped function did not appear +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666568">666568</a>: When SHOW_FILES was NO, a grouped function did not appear in the javascript based search index. -<li> id 666909: \copybrief introduced extra spacing in the HTML output. -<li> id 666986: Fixed case where search engine specific code appeared +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666909">666909</a>: \copybrief introduced extra spacing in the HTML output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666986">666986</a>: Fixed case where search engine specific code appeared twice in the HTML output. -<li> id 666993: Fixed bug in the generated makefile causing index not +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=666993">666993</a>: Fixed bug in the generated makefile causing index not to be generated when using pdflatex. -<li> id 667020: HTML output for example pages was not well-formed. -<li> id 667192: Include statements in latex output where placed all on +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667020">667020</a>: HTML output for example pages was not well-formed. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667192">667192</a>: Include statements in latex output where placed all on one line in the LaTeX output. -<li> id 667835: PHP: Fixed problem handling heredoc blocks -<li> id 667844: For aliases with a single argument it is no longer required +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667835">667835</a>: PHP: Fixed problem handling heredoc blocks +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=667844">667844</a>: For aliases with a single argument it is no longer required to escape commas that appear inside the argument text. -<li> id 668037: Latex: tables can now span multiple pages by using the xtab +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668037">668037</a>: Latex: tables can now span multiple pages by using the xtab package. -<li> id 668218: Doxygen will ignore the common prefix shared by all +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668218">668218</a>: Doxygen will ignore the common prefix shared by all directories when computing a names for the directory's output files. This will make the names of the output more stable. -<li> id 668519: Added missing newline in man page output. -<li> id 669071, 669072: Fixed parse problem for Q_PROPERTY when a template +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=668519">668519</a>: Added missing newline in man page output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669071">669071</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669072">669072</a>: Fixed parse problem for Q_PROPERTY when a template with a namespaced type was used. -<li> id 669078: Included patch which changes MATHJAX_RELPATH to use the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669078">669078</a>: Included patch which changes MATHJAX_RELPATH to use the content delivery network by default. -<li> id 669138: Fortran: Fixed problem handling multiple definition +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669138">669138</a>: Fortran: Fixed problem handling multiple definition statements on one line. -<li> id 669406: Using -d Preprocessor now also works when QUIET is YES. -<li> id 669434: Latex: citations where only generated properly if the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669406">669406</a>: Using -d Preprocessor now also works when QUIET is YES. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669434">669434</a>: Latex: citations where only generated properly if the bib files specified via CITE_BIB_FILES did not have a path. -<li> id 669758: Tcl: Same function in multiple Tcl namespaces not added. -<li> id 670289: Fixed case where doxygen would not correctly detect +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=669758">669758</a>: Tcl: Same function in multiple Tcl namespaces not added. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670289">670289</a>: Fixed case where doxygen would not correctly detect >> as a termination of a nested template. -<li> id 670571: subpages generate empty pages in latex/rtf output and +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=670571">670571</a>: subpages generate empty pages in latex/rtf output and broken links when SHORT_NAME was set to YES. <li> Included VHDL fixes provided by Martin Kreis. <li> The word "dummy" wrongly appeared before the first parameter type in @@ -1307,14 +1442,14 @@ make sure you add the following: <h3>Bug fixes</h3> <ul> <li> Python: scopes are now shown with . instead of :: -<li> id 665313: Space before @if was not preserved, causing problems +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665313">665313</a>: Space before @if was not preserved, causing problems with inline @if .. @endif constructs. -<li> id 665583: Fixed XHTML validity problem when using mscgen graphs. -<li> id 665641: Fixed XHTML validity problem when GENERATE_TREEVIEW was +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665583">665583</a>: Fixed XHTML validity problem when using mscgen graphs. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665641">665641</a>: Fixed XHTML validity problem when GENERATE_TREEVIEW was disabled. -<li> id 665720: Included patch to fix hang issue when non-empty +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665720">665720</a>: Included patch to fix hang issue when non-empty INCLUDE_PATH was used. -<li> id 665778: Fixed parse issue when a comma appeared as part of an +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665778">665778</a>: Fixed parse issue when a comma appeared as part of an enum's value. </ul> <a name="1.7.6"></a> @@ -1340,7 +1475,7 @@ make sure you add the following: <h3>New features</h3> <ul> <li> Update of the French translation. -<li> id 607305: Added support for PHP heredoc and nowdoc constructs. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607305">607305</a>: Added support for PHP heredoc and nowdoc constructs. <li> Added support for cross-referencing in case of operator-> overloading. This includes support for std::auto_ptr,std::smart_ptr,std::unique_ptr and std::weak_ptr when BUILTIN_STL_SUPPORT is enabled. @@ -1354,58 +1489,58 @@ make sure you add the following: definitions preceded by whitespace (thanks to Rene Zaumseil) <li> When using "static int a,b" variable "b" incorrectly appeared in the output even though EXTRACT_STATIC was set to NO. -<li> id 521717: .spec file was only updated after running ./configure -<li> id 656642: Fixed potential crash when using doxygen for large projects. -<li> id 656878: Fixed problem running bibtex with \cite command on Windows. -<li> id 657152: Fixed constant expression evaluation error in the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521717">521717</a>: .spec file was only updated after running ./configure +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656642">656642</a>: Fixed potential crash when using doxygen for large projects. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656878">656878</a>: Fixed problem running bibtex with \cite command on Windows. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=657152">657152</a>: Fixed constant expression evaluation error in the preprocessor. -<li> id 652277: Removed bogus ' from the man page output. -<li> id 659244: Quotes in the brief description could appear unescaped in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652277">652277</a>: Removed bogus ' from the man page output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=659244">659244</a>: Quotes in the brief description could appear unescaped in the tooltip. -<li> id 641336: #includes with ../ were not always processed correctly. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641336">641336</a>: #includes with ../ were not always processed correctly. <li> Fixed potential crash when INLINE_GROUPED_CLASSES and INLINE_SIMPLE_STRUCTS are set to YES. -<li> id 658896: Fixed preprocessor problem handling #defines whose value was +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658896">658896</a>: Fixed preprocessor problem handling #defines whose value was a constant string containing ///. -<li> id 660332: Using a \ at the end of a comment line could cause +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=660332">660332</a>: Using a \ at the end of a comment line could cause parsing problems for C# as the \ was treated as a line continuation. -<li> id 658033: Fixed parser problem when using multiple member groups +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658033">658033</a>: Fixed parser problem when using multiple member groups inside a macro definition. -<li> id 503239: Fixed several issues related to \cite handling. -<li> id 658587: Improved the way macro definitions are collected. -<li> id 660501: Fixed LaTeX error when using \name with a description. -<li> id 661292: The documentation for \mainpage incorrectly mentioned that +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=503239">503239</a>: Fixed several issues related to \cite handling. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658587">658587</a>: Improved the way macro definitions are collected. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=660501">660501</a>: Fixed LaTeX error when using \name with a description. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=661292">661292</a>: The documentation for \mainpage incorrectly mentioned that one has to use \ref main in case GENERATE_TREEVIEW was set to YES, which is no longer the case. -<li> id 659096: Nested aliases definitions where not always expanded properly +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=659096">659096</a>: Nested aliases definitions where not always expanded properly (regression w.r.t version 1.7.4) -<li> id 658038: Fixed preprocessor problem where the @ character inside a +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658038">658038</a>: Fixed preprocessor problem where the @ character inside a macro definition could appear as @@. -<li> id 658646: Fixed problem running mscgen for LaTeX and RTF output. -<li> id 661723: Using ClassName%'s did not work anymore, and also +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=658646">658646</a>: Fixed problem running mscgen for LaTeX and RTF output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=661723">661723</a>: Using ClassName%'s did not work anymore, and also ClassName's wasn't autolinked. -<li> id 662044: Fixed potential printing of null pointer when using +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=662044">662044</a>: Fixed potential printing of null pointer when using a version filter that returned blanks. -<li> id 625518: Fortran: first problem where subroutine using results +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625518">625518</a>: Fortran: first problem where subroutine using results variable appeared as a function. -<li> id 654153: If an URL appeared at the end of a sentence, the period +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654153">654153</a>: If an URL appeared at the end of a sentence, the period was included in the URL. -<li> id 656560: Fortran: Added support for the Double Complex type. -<li> id 663640: Included workaround for Solaris CC issue in index.cpp -<li> id 662190: Included patch to fix some TCL issues and add the TCL_SUBST +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656560">656560</a>: Fortran: Added support for the Double Complex type. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=663640">663640</a>: Included workaround for Solaris CC issue in index.cpp +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=662190">662190</a>: Included patch to fix some TCL issues and add the TCL_SUBST configuration option. -<li> id 661672: Fortran: Added support for ALIAS expansion in comment blocks. -<li> id 663101: Fixed case where a macro was not corrected found in the header +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=661672">661672</a>: Fortran: Added support for ALIAS expansion in comment blocks. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=663101">663101</a>: Fixed case where a macro was not corrected found in the header file when it could only be found via INCLUDE_PATH. -<li> id 664718: using multiple <para>'s inside a <summary> block caused +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=664718">664718</a>: using multiple <para>'s inside a <summary> block caused text to be joined without spacing. -<li> id 656556: Java enums are now parsed as classes. -<li> id 664826: Fixed problem in the preprocessor regarding the handling +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656556">656556</a>: Java enums are now parsed as classes. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=664826">664826</a>: Fixed problem in the preprocessor regarding the handling of include guards. -<li> id 664893: Fixed typo in the docs for EXCLUDE_SYMLINKS. -<li> id 665466: Using a relative URL with <a href> did not work when +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=664893">664893</a>: Fixed typo in the docs for EXCLUDE_SYMLINKS. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665466">665466</a>: Using a relative URL with <a href> did not work when CREATE_SUBDIRS was enabled. -<li> id 665464: Using an absolute URL with <img> did not work when +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=665464">665464</a>: Using an absolute URL with <img> did not work when CREATE_SUBDIRS was enabled. </ul> <a name="1.7.5.1"></a> @@ -1417,9 +1552,9 @@ make sure you add the following: </ul> <h3>Bug fixes</h3> <ul> -<li>id 521717: .spec file was only updated after running ./configure -<li>id 656642: Fixed potential crash when using doxygen for large projects. -<li>id 656878: Fixed problem running bibtex with \cite command on Windows. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521717">521717</a>: .spec file was only updated after running ./configure +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656642">656642</a>: Fixed potential crash when using doxygen for large projects. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656878">656878</a>: Fixed problem running bibtex with \cite command on Windows. <li>Regression: some information was no longer available for a class, due to accidental deletion of a code block. <li>Regression: fixed matching problem in the code parser. @@ -1429,9 +1564,9 @@ make sure you add the following: <h2>(release date 14-08-2011)</h2> <h3>Changes</h3> <ul> -<li> id 641904: Function in the call graphs are now shown based on first +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641904">641904</a>: Function in the call graphs are now shown based on first appearance rather then alphabetical order. -<li> id 616213: When customizing the HTML header $title now only generates +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616213">616213</a>: When customizing the HTML header $title now only generates the title excluding the project name (which can still be added using $projectname) <li> Improved the look of the class index: all items now have equal spacing. @@ -1455,7 +1590,7 @@ make sure you add the following: SERVER_BASED_SEARCH=YES) doxygen now advertises a opensearch provider for your project, that allows integrating the search directly in the search field of the browser (thanks to Phil Lello for the patch). -<li> id 503239: Added new option CITE_BIB_FILES and LATEX_BIB_STYLE and a new +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=503239">503239</a>: Added new option CITE_BIB_FILES and LATEX_BIB_STYLE and a new command \cite, allowing you to make references to literature (as defined in one or more .bib files). This also works for output formats other than LaTeX. The tool bibtex is required for this to work though. Thanks @@ -1480,91 +1615,91 @@ make sure you add the following: set to xhtml. <li> Fixed several cases where the LaTeX output could produce too long lines. -<li> id 318061: Putting two functions in the same group that only +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=318061">318061</a>: Putting two functions in the same group that only different in the number of template arguments did not work. -<li> id 437346,564614: Fixed proper encoding of multibyte output in RTF +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=437346">437346</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=564614">564614</a>: Fixed proper encoding of multibyte output in RTF depending on the code page (thanks to Hirao for the patch). -<li> id 521717: The .spec file in the source distribution did not get +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521717">521717</a>: The .spec file in the source distribution did not get updated to the latest version. -<li> id 521861: Fortran: Continuation character was not recognised in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521861">521861</a>: Fortran: Continuation character was not recognised in fixed format code. -<li> id 522496: Fortran: @param checking was not case insensitive. -<li> id 560105: Fixed problem combining @cond with preprocessor directives. -<li> id 577359: Using "struct A : C, D {};" showed a private inheritance +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=522496">522496</a>: Fortran: @param checking was not case insensitive. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=560105">560105</a>: Fixed problem combining @cond with preprocessor directives. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=577359">577359</a>: Using "struct A : C, D {};" showed a private inheritance relation for D. -<li> id 584194: Some links to typedef where pointing to the typedef'ed +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=584194">584194</a>: Some links to typedef where pointing to the typedef'ed class instead. -<li> id 619560: Anonymous enums caused an invalid entry in the LaTeX TOC. -<li> id 622935: Deriving from an unknown template class could cause the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619560">619560</a>: Anonymous enums caused an invalid entry in the LaTeX TOC. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622935">622935</a>: Deriving from an unknown template class could cause the class to appear with a -g postfix in C# -<li> id 625731: Fortran: Fixed issue handling private subroutines. -<li> id 632946: LaTeX now starts a new page when starting a new module. -<li> id 634837: Fortran: Prefix of function was overwritten and the word +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625731">625731</a>: Fortran: Fixed issue handling private subroutines. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632946">632946</a>: LaTeX now starts a new page when starting a new module. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634837">634837</a>: Fortran: Prefix of function was overwritten and the word 'function' not specified. -<li> id 637099: Fortran: Included fix for using collaboration diagrams. -<li> id 642468: Added PHP support for namespace with curly braces. -<li> id 643219: Fortran: Improved handling of semicolons. -<li> id 643617: Fortran: Added support for "type is". -<li> id 643944: A macro added to a group appeared twice in the group +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=637099">637099</a>: Fortran: Included fix for using collaboration diagrams. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=642468">642468</a>: Added PHP support for namespace with curly braces. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643219">643219</a>: Fortran: Improved handling of semicolons. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643617">643617</a>: Fortran: Added support for "type is". +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643944">643944</a>: A macro added to a group appeared twice in the group documentation if was also made related to a class using \relates. -<li> id 646321: Fixed problem were the search box was missing when using +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646321">646321</a>: Fixed problem were the search box was missing when using a custom HTML header. -<li> id 646447: Fixed unterminated img tab in the XHTML output. -<li> id 646463: Fixed problem handling MSCFILE_DIRS option with multiple +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646447">646447</a>: Fixed unterminated img tab in the XHTML output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646463">646463</a>: Fixed problem handling MSCFILE_DIRS option with multiple paths. -<li> id 646533: Included patch to sort overloaded members by appearance in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646533">646533</a>: Included patch to sort overloaded members by appearance in the code. -<li> id 646747,646879: Putting an autolist inside a @todo, @bug or similar +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646747">646747</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646879">646879</a>: Putting an autolist inside a @todo, @bug or similar section did not work anymore. -<li> id 646922: Referring to a logo with a relative path, caused +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=646922">646922</a>: Referring to a logo with a relative path, caused a broken image target when using a custom HTML header. -<li> id 647499: Fixed HTML rendering problem on older browsers when +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=647499">647499</a>: Fixed HTML rendering problem on older browsers when GENERATE_TREEVIEW was enabled. -<li> id 647768: Linking to a section on the main page could result in a +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=647768">647768</a>: Linking to a section on the main page could result in a broken link when GENERATE_TREEVIEW was enabled. -<li> id 647889: Fixed invalid warning when using @deparated method with +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=647889">647889</a>: Fixed invalid warning when using @deparated method with default values for parameters. -<li> id 648302: A function made related using @relates could end up in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=648302">648302</a>: A function made related using @relates could end up in the wrong class if there was already a method with a matching argument list in that other class. -<li> id 649103: Return types containing multiple *'s ended up in the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=649103">649103</a>: Return types containing multiple *'s ended up in the output with only one * in some cases. -<li> id 650397: Fixed problem with alias substitution if the alias had +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650397">650397</a>: Fixed problem with alias substitution if the alias had more then 9 parameters. -<li> id 650430: For nested anonymous structs @xx markers could appear in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650430">650430</a>: For nested anonymous structs @xx markers could appear in the output. -<li> id 650463: Added compilation support for MacOSX 10.7 (aka Lion). -<li> id 650958: Fixed issue printing HTML pages when the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650463">650463</a>: Added compilation support for MacOSX 10.7 (aka Lion). +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=650958">650958</a>: Fixed issue printing HTML pages when the GENERATE_TREEVIEW option is set to YES. -<li> id 651611: Fixed broken link to an undocumented namespace. -<li> id 652138: Fixed potential crash while parsing Fortran code. -<li> id 652188: Fixed problem parsing comment which included +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=651611">651611</a>: Fixed broken link to an undocumented namespace. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652138">652138</a>: Fixed potential crash while parsing Fortran code. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652188">652188</a>: Fixed problem parsing comment which included an unterminated alias within quotes (i.e. "\word{") -<li> id 652277: Lines starting with . did not appear in the man page output. -<li> id 652389: Fortran: Fixed text is detailed function section. -<li> id 652396: When enabling INTERACTIVE_SVG wide graphs are now also +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652277">652277</a>: Lines starting with . did not appear in the man page output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652389">652389</a>: Fortran: Fixed text is detailed function section. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652396">652396</a>: When enabling INTERACTIVE_SVG wide graphs are now also fit to the screen width. -<li> id 652695: Added missing space between parameter type and name in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652695">652695</a>: Added missing space between parameter type and name in the RTF output. -<li> id 652741: Use background-color instead of background in doxygen.css. -<li> id 653344: Fixed potential segfault while creating man pages. -<li> id 653666: Fortran: add a space to "type" in argument list. -<li> id 653801: Fixed problem handling include guard when multiple +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=652741">652741</a>: Use background-color instead of background in doxygen.css. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=653344">653344</a>: Fixed potential segfault while creating man pages. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=653666">653666</a>: Fortran: add a space to "type" in argument list. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=653801">653801</a>: Fixed problem handling include guard when multiple blocks guarded by the same guard were used in a header file. -<li> id 653963: Fortran: Unified handling of @params at various places. -<li> id 654108: make clean failed on a system without qmake. -<li> id 654244: Fixed compile issue for HP Itanium. -<li> id 654779: Fortran: Interface was seen as a class with constructor / +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=653963">653963</a>: Fortran: Unified handling of @params at various places. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654108">654108</a>: make clean failed on a system without qmake. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654244">654244</a>: Fixed compile issue for HP Itanium. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654779">654779</a>: Fortran: Interface was seen as a class with constructor / destructor. -<li> id 654869: Using the word "property" as a type in C caused wrong +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654869">654869</a>: Using the word "property" as a type in C caused wrong results. -<li> id 654866: Fortran: fixed issue parsing function type that looked like +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=654866">654866</a>: Fortran: fixed issue parsing function type that looked like C function pointers. -<li> id 655178: Fortran: Fixed parse issue when using variable name +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=655178">655178</a>: Fortran: Fixed parse issue when using variable name starting with the word interface. -<li> id 655591: Improved error handling for empty html style list. -<li> id 655935: Fixed case where %s could end up in a warning messge. -<li> id 656005: Methods of Objective-C categories defined in an .m file are +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=655591">655591</a>: Improved error handling for empty html style list. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=655935">655935</a>: Fixed case where %s could end up in a warning messge. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=656005">656005</a>: Methods of Objective-C categories defined in an .m file are now marked as private. </ul> <a name="1.7.4"></a> @@ -1582,73 +1717,73 @@ make sure you add the following: <li> New option INLINE_GROUPED_CLASSES that when enabled shows grouped classes inside the group documentation, instead of on a separate page. <li> Included updates for the Italian and Russian translation. -<li> id 640875: Added option HTML_EXTRA_FILES which makes it easier to copy +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640875">640875</a>: Added option HTML_EXTRA_FILES which makes it easier to copy additional files to the HTML output and also add them to the index files. -<li> id 642579: Included patch that adds new LATEX_FOOTER option to +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=642579">642579</a>: Included patch that adds new LATEX_FOOTER option to customize the end of refman.tex in the LaTeX output. </ul> <h3>Bug fixes</h3> <ul> -<li> id 140259: Jumping to a @section did not work in the RTF output. -<li> id 521854: Fortran: included patch for supporting multiple argument +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=140259">140259</a>: Jumping to a @section did not work in the RTF output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521854">521854</a>: Fortran: included patch for supporting multiple argument declarations on one line. -<li> id 521861: Fixed problem with line continuation in Fortran. -<li> id 566921: %A::B now prevents a link for A::B, instead of only for A +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=521861">521861</a>: Fixed problem with line continuation in Fortran. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=566921">566921</a>: %A::B now prevents a link for A::B, instead of only for A and generating a warning that ::B cannot be linked. -<li> id 598481: Fortran: Added support for extends keyword. -<li> id 618374: Added support for inlining code in the VHDL output. -<li> id 625519: Fortran: argument name starting with a reserved word was +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=598481">598481</a>: Fortran: Added support for extends keyword. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=618374">618374</a>: Added support for inlining code in the VHDL output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625519">625519</a>: Fortran: argument name starting with a reserved word was not handled properly. -<li> id 634415: Fixed problem parsing an array of character literals. -<li> id 635537: Links to file members were not made when found in tag files. -<li> id 638637: The Doxyfile documentation contained some very long lines. -<li> id 638655: Double quote in page or group title broke treeview. -<li> id 638733: Improved documentation for DOT_IMAGE_FORMAT option. -<li> id 638829: Added documentation to warn for consequences of using +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634415">634415</a>: Fixed problem parsing an array of character literals. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=635537">635537</a>: Links to file members were not made when found in tag files. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638637">638637</a>: The Doxyfile documentation contained some very long lines. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638655">638655</a>: Double quote in page or group title broke treeview. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638733">638733</a>: Improved documentation for DOT_IMAGE_FORMAT option. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638829">638829</a>: Added documentation to warn for consequences of using HTML_HEADER. -<li> id 638856: Fixed problem autolinking to struct field using #S::a -<li> id 639272: using @dot...@endot produced an image referenced with +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=638856">638856</a>: Fixed problem autolinking to struct field using #S::a +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=639272">639272</a>: using @dot...@endot produced an image referenced with absolute path. -<li> id 639521: \mscfile did not work properly for LaTeX output. -<li> id 639716: Fixed problem where #include's could cause phantom __pad__ +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=639521">639521</a>: \mscfile did not work properly for LaTeX output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=639716">639716</a>: Fixed problem where #include's could cause phantom __pad__ members to appear in the output (appeared on Windows only). -<li> id 640259: Options PROJECT_LOGO and PROJECT_BRIEF were missing +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640259">640259</a>: Options PROJECT_LOGO and PROJECT_BRIEF were missing from the manual. -<li> id 640463: Fixed problem parsing PHP "use" statement when the argument +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640463">640463</a>: Fixed problem parsing PHP "use" statement when the argument did not have a namespace scope. -<li> id 640588: Included fix for proper splitting of multiple arguments +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640588">640588</a>: Included fix for proper splitting of multiple arguments given to the QHP_CUST_FILTER_ATTRS option. -<li> id 640646: Long error messages could cause memory corruption. -<li> id 640742: XML: switched indent option to no in the combine.xslt script. -<li> id 640754: Comment with XML style list of type table was not rendered +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640646">640646</a>: Long error messages could cause memory corruption. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640742">640742</a>: XML: switched indent option to no in the combine.xslt script. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640754">640754</a>: Comment with XML style list of type table was not rendered properly. -<li> id 640822: Added support for overloading of C# indexer operators. -<li> id 640828: Internal section marked with @internal was not shown as +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640822">640822</a>: Added support for overloading of C# indexer operators. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640828">640828</a>: Internal section marked with @internal was not shown as such anymore in the XML output. -<li> id 640847: PHP: Fixed parse problem referring to class in global +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640847">640847</a>: PHP: Fixed parse problem referring to class in global namespace. -<li> id 640924: Included patch by Haffmans to make the custom header and +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640924">640924</a>: Included patch by Haffmans to make the custom header and footer independent of the chosen config options. -<li> id 640927: Included fix to prevent a warning in the server side PHP +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=640927">640927</a>: Included fix to prevent a warning in the server side PHP search script. -<li> id 641026: Included patch to fix broken hyperlink to page entry +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641026">641026</a>: Included patch to fix broken hyperlink to page entry in xreflists. -<li> id 641188: Header of \page was wrong in Man page output. -<li> id 641336: #include's to other directories were not always linked. -<li> id 641673: Using "use Foo\Foo;" in PHP could cause doxygen to hang. -<li> id 641814: In some cases the HTML output could contain an extra </p>. -<li> id 642030: Tooltips with HTML entities could be wrongly truncated. -<li> id 642475: Include graphs could be incomplete. -<li> id 643056: Fixed problem with macro expansion. -<li> id 643279: Fixed potential crash when generating a warning for +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641188">641188</a>: Header of \page was wrong in Man page output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641336">641336</a>: #include's to other directories were not always linked. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641673">641673</a>: Using "use Foo\Foo;" in PHP could cause doxygen to hang. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=641814">641814</a>: In some cases the HTML output could contain an extra </p>. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=642030">642030</a>: Tooltips with HTML entities could be wrongly truncated. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=642475">642475</a>: Include graphs could be incomplete. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643056">643056</a>: Fixed problem with macro expansion. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643279">643279</a>: Fixed potential crash when generating a warning for void f(int %x) style parameter, which is valid in C++/CLI. -<li> id 643280: Included patch to enabled LargeAddressAware for Windows +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643280">643280</a>: Included patch to enabled LargeAddressAware for Windows builds. -<li> id 643276: Fixed cases where FILE_VERSION_FILTER was called for +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643276">643276</a>: Fixed cases where FILE_VERSION_FILTER was called for dummy files with name "generated". -<li> id 643655: Fixed argument matching issue when one of match candidates +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=643655">643655</a>: Fixed argument matching issue when one of match candidates was a typedef of a method pointer. -<li> id 645754: mscfile tag was closed with dotfile in the XML output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=645754">645754</a>: mscfile tag was closed with dotfile in the XML output. <li> doxygen -w html now ignores the values for HTML_HEADER and HTML_FOOTER found in the config file. <li> Importing a group via a tag file could overrule a local group with @@ -1675,7 +1810,7 @@ make sure you add the following: </ul> <h3>New features</h3> <ul> -<li> id 499544: Added SVG support to doxygen's dot output +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=499544">499544</a>: Added SVG support to doxygen's dot output (setting DOT_IMAGE_FORMAT to svg now works as expected) <li> Added control to the wizard to configure the color of the output visually. @@ -1697,44 +1832,44 @@ make sure you add the following: </ul> <h3>Bug fixes</h3> <ul> -<li> id 306076: code blocks with using directives did not get hyperlinked. -<li> id 313527: enum values with bitfields did not get parsed correctly. -<li> id 565715,630582: Included a patch that fixes a couple of Fortran issues +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=306076">306076</a>: code blocks with using directives did not get hyperlinked. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=313527">313527</a>: enum values with bitfields did not get parsed correctly. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=565715">565715</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=630582">630582</a>: Included a patch that fixes a couple of Fortran issues (thanks to Albert). -<li> id 615507: Fixed problem handling @cond..@endcond in Fortran code. -<li> id 619040: Scope was missing in Tokens.xml when using docsets. -<li> id 625517,523156: Applied patch tp avoid stripping prefixes for Fortran +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615507">615507</a>: Fixed problem handling @cond..@endcond in Fortran code. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619040">619040</a>: Scope was missing in Tokens.xml when using docsets. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625517">625517</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=523156">523156</a>: Applied patch tp avoid stripping prefixes for Fortran subroutines. -<li> id 626476: allow label before end statement in Fortran -<li> id 630901: </see> was not handled properly in comment block. -<li> id 632311: Fixed potential crash for empty verbatim section. -<li> id 632426: closing brace of a function with one parameter has wrong +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626476">626476</a>: allow label before end statement in Fortran +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=630901">630901</a>: </see> was not handled properly in comment block. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632311">632311</a>: Fixed potential crash for empty verbatim section. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632426">632426</a>: closing brace of a function with one parameter has wrong color in HTML. -<li> id 632543: Added support for Fortan TYPEs with languge bindings. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632543">632543</a>: Added support for Fortan TYPEs with languge bindings. (thanks to a patch by Daniel Franke) -<li> id 632879: An explicit link request such as #blah did not longer produce +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=632879">632879</a>: An explicit link request such as #blah did not longer produce a warning if no symbol named blah was found. -<li> id 633891: warnings in "inbody" documentation were shown with "unknown" +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=633891">633891</a>: warnings in "inbody" documentation were shown with "unknown" file name. -<li> id 634116: Titles customized via the layout file did not appear in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634116">634116</a>: Titles customized via the layout file did not appear in the title page and navigation tree, only in the top menu. -<li> id 634600: Fixed problem resolving typedef. -<li> id 634775: Fixed a problem were // inside a code block got removed. -<li> id 634857: Added support for escaping :: by using \:: (or @::) -<li> id 634962: #include with relative path to parent dir did not get +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634600">634600</a>: Fixed problem resolving typedef. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634775">634775</a>: Fixed a problem were // inside a code block got removed. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634857">634857</a>: Added support for escaping :: by using \:: (or @::) +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634962">634962</a>: #include with relative path to parent dir did not get hyperlinked. -<li> id 634986: Removed double definition of docParamName in compound.xsd. -<li> id 635198: C++/CLI Finalizer methods were not parsed properly. -<li> id 636475: Objective-C method names can now be used as the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=634986">634986</a>: Removed double definition of docParamName in compound.xsd. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=635198">635198</a>: C++/CLI Finalizer methods were not parsed properly. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=636475">636475</a>: Objective-C method names can now be used as the the first argument of \ref. -<li> id 636588: Fixed a couple of problems in the compound.xsd schema used +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=636588">636588</a>: Fixed a couple of problems in the compound.xsd schema used for XML output. -<li> id 636598: DISTRIBUTE_GROUP_DOC now works again for enum values. -<li> id 636947: Improved matching of typedef'ed array parameter and non +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=636598">636598</a>: DISTRIBUTE_GROUP_DOC now works again for enum values. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=636947">636947</a>: Improved matching of typedef'ed array parameter and non typedef'ed array parameter. -<li> id 637610: Added a number of fixed for Fortran interfaces. -<li> id 637712: Handle files with the .for extension as Fortran. -<li> id 637987: Fixed error in the grouping documentation. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=637610">637610</a>: Added a number of fixed for Fortran interfaces. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=637712">637712</a>: Handle files with the .for extension as Fortran. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=637987">637987</a>: Fixed error in the grouping documentation. <li> Fixed line number sync problem when using Objective-C #import statements. <li> Fixed problem handling /** @cond */ in the preprocessor. @@ -1754,10 +1889,10 @@ make sure you add the following: <ul> <li> added support for Apple's block object extension for C/Obj-C/C++. <li> added support for detecting Python constructors and destructors. -<li> id 624575: Added \endinternal command that can be used to force +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624575">624575</a>: Added \endinternal command that can be used to force the end of a section started with \internal. -<li> id 552605: Added parsing support for PHP 5.3+ style namespaces. -<li> id 582532: added \mscfile command which can be used to insert a +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=552605">552605</a>: Added parsing support for PHP 5.3+ style namespaces. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=582532">582532</a>: added \mscfile command which can be used to insert a message sequence chart given a .msc file. Also added a new config option MSCFILE_DIRS to provide directories were msc files are searched (Thanks to Adrien for the patch). @@ -1770,76 +1905,76 @@ make sure you add the following: </ul> <h3>Bug fixes</h3> <ul> -<li> id 306076: Fixed case where using of a namespace did not work inside +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=306076">306076</a>: Fixed case where using of a namespace did not work inside an example. -<li> id 336053,487871: /// were not stripped from formulas and \dot..\enddot -<li> id 563698: dropped support for a4wide paper format for LaTeX, since +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=336053">336053</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=487871">487871</a>: /// were not stripped from formulas and \dot..\enddot +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=563698">563698</a>: dropped support for a4wide paper format for LaTeX, since it is on the LaTeX taboo list. -<li> id 571014: Behaviour of CLASS_DIAGRAM=NO in combination with +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=571014">571014</a>: Behaviour of CLASS_DIAGRAM=NO in combination with HAVE_DOT=YES, was not propely documented. -<li> id 576291: Python comments for next class or method could end up in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=576291">576291</a>: Python comments for next class or method could end up in code of a method/class when enabling INLINE_SOURCES. -<li> id 611174: Fixed problem handling nestes classes in Python. -<li> id 621733: removed unexpected warnings about undocumented return types -<li> id 622737: Undefined function macros could cause constant expression +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=611174">611174</a>: Fixed problem handling nestes classes in Python. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621733">621733</a>: removed unexpected warnings about undocumented return types +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622737">622737</a>: Undefined function macros could cause constant expression errors. -<li> id 622780: updated copyright statement in PDF docs. -<li> id 622935: C# generics appeared with -g extension in the output in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622780">622780</a>: updated copyright statement in PDF docs. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622935">622935</a>: C# generics appeared with -g extension in the output in some situations. -<li> id 623023: Fixed parsing problem for "int &foo1(),&foo2();" -<li> id 623052: Link to destructor was wrong in the member index. -<li> id 623424: Fixed problem where struct description gets added to variable +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623023">623023</a>: Fixed parsing problem for "int &foo1(),&foo2();" +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623052">623052</a>: Link to destructor was wrong in the member index. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623424">623424</a>: Fixed problem where struct description gets added to variable of struct type. -<li> id 623673: Anchors were missing in the Qhp index for members. -<li> id 623733: Fixed potential crash due to uninitialized line number. -<li> id 623765: closed.png was wrongly linked when GENERATE_SUBDIRS and +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623673">623673</a>: Anchors were missing in the Qhp index for members. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623733">623733</a>: Fixed potential crash due to uninitialized line number. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=623765">623765</a>: closed.png was wrongly linked when GENERATE_SUBDIRS and HTML_DYNAMIC_SECTIONS were enabled. -<li> id 624014: Function macro was not handled properly when there was +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624014">624014</a>: Function macro was not handled properly when there was a line continuation directly after the name. -<li> id 624095: Linking to a class via a tag file did not work if the class +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624095">624095</a>: Linking to a class via a tag file did not work if the class was in an undocumented namespace. -<li> id 624104: Fixed a couple of typos in lodepng.h -<li> id 624323: Graph legend image was missing form the index files. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624104">624104</a>: Fixed a couple of typos in lodepng.h +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624323">624323</a>: Graph legend image was missing form the index files. <li> Fixed a number of typos in the config file documentation (thanks to Jens Schweikhardt) -<li> id 624514: Some enums were not cross-referenced. -<li> id 624829: Missing \endcond could cause preprocessor issues in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624514">624514</a>: Some enums were not cross-referenced. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=624829">624829</a>: Missing \endcond could cause preprocessor issues in next file(s) to be parsed. -<li> id 625070: a function definition in a namespace, documented in the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625070">625070</a>: a function definition in a namespace, documented in the header did not always get cross-referenced. -<li> id 625296: Removed superfluous <td></td> from parameter list in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625296">625296</a>: Removed superfluous <td></td> from parameter list in HTML output. -<li> id 625317: Unterminated comment could crash doxygen. -<li> id 625531: Inherited documentation was only included for the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625317">625317</a>: Unterminated comment could crash doxygen. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625531">625531</a>: Inherited documentation was only included for the last derived class in case of multiple inheritance. -<li> id 625578: In the HTML output </div> was missing for built-in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625578">625578</a>: In the HTML output </div> was missing for built-in class diagrams. -<li> id 625555: References in example files with underscores were wrong. -<li> id 625982: When using japanese characters mixed with ascii characters +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625555">625555</a>: References in example files with underscores were wrong. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625982">625982</a>: When using japanese characters mixed with ascii characters doxygen incorrected ended the brief description with a dot. -<li> id 625952: setting MULTILINE_CPP_IS_BRIEF to YES, cause /// to appear +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=625952">625952</a>: setting MULTILINE_CPP_IS_BRIEF to YES, cause /// to appear in the output. -<li> id 626033,567774: EXTENSION_MAPPING did not work if a the mapped +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626033">626033</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=567774">567774</a>: EXTENSION_MAPPING did not work if a the mapped language was handled by the same parser as used for the original extension. -<li> id 626175: Fixed bracket bug in LaTeX fancy headers. -<li> id 626508: Allow hyphen in key argument of \xrefitem. -<li> id 626647: \copydoc did not work for array type arguments (e.g. int[]). +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626175">626175</a>: Fixed bracket bug in LaTeX fancy headers. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626508">626508</a>: Allow hyphen in key argument of \xrefitem. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=626647">626647</a>: \copydoc did not work for array type arguments (e.g. int[]). <li> Use \dotfile did not produce the correct map file, so URLs in dot files did not work. -<li> id 627371: #define's in files only found via INCLUDE_PATH were not +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=627371">627371</a>: #define's in files only found via INCLUDE_PATH were not correctly handled. -<li> id 628065: auto brief description ending with .) cause the ) to +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=628065">628065</a>: auto brief description ending with .) cause the ) to end up in the detailed part. -<li> id 628242: Fixed encoding issue for the Spanish translation. -<li> id 628678: Fixed segmentation fault in case of very long errors. -<li> id 629040: Fixed type in search page of the documentation. -<li> id 629182: Fixed problem detecting include guard. -<li> id 629270: Made file extension to parser mapping case insensitive. -<li> id 629485: Latex makefile clean target used rm command also for Windows. -<li> id 629942: the EXCLUDE_SYMBOLS option was missing form the online docs. -<li> id 631094: \htmlinclude and \verbinclude ended the brief description. -<li> id 631380: Inconsistent behaviour when a brief description was given +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=628242">628242</a>: Fixed encoding issue for the Spanish translation. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=628678">628678</a>: Fixed segmentation fault in case of very long errors. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629040">629040</a>: Fixed type in search page of the documentation. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629182">629182</a>: Fixed problem detecting include guard. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629270">629270</a>: Made file extension to parser mapping case insensitive. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629485">629485</a>: Latex makefile clean target used rm command also for Windows. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=629942">629942</a>: the EXCLUDE_SYMBOLS option was missing form the online docs. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=631094">631094</a>: \htmlinclude and \verbinclude ended the brief description. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=631380">631380</a>: Inconsistent behaviour when a brief description was given following by a detailed comment block with JAVADOC_AUTOBRIEF enabled. <li> Fixed a number of typos in the documentation (thanks to Albert van der Meer) @@ -1852,48 +1987,48 @@ make sure you add the following: <h2>(release date 25-06-2010)</h2> <h3>Changes</h3> <ul> -<li> id 621695: Made warning and error messages appear with lower case +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621695">621695</a>: Made warning and error messages appear with lower case "warning:" and "error:" prefix to make it easier to use the messages from Visual Studio. </ul> <h3>New features</h3> <ul> -<li> id 621908: Added new config option FORMULA_TRANSPARENT which allows +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621908">621908</a>: Added new config option FORMULA_TRANSPARENT which allows selecting between transparent (YES) or non-transparent (NO) PNGs for formulas in the HTML output. <li> Update for Turkish translation. </ul> <h3>Bug fixes</h3> <ul> -<li> id 533821: Inheritance relation for a C# class deriving from +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=533821">533821</a>: Inheritance relation for a C# class deriving from a generic class was not handled correctly. -<li> id 554638: Changing DOT_IMAGE_FORMAT did not cause the graphs to be +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=554638">554638</a>: Changing DOT_IMAGE_FORMAT did not cause the graphs to be regenerated. -<li> id 576533: A field of the form "enum E *p" was ignore. -<li> id 597016: Hide scope name was not working properly for todo items +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=576533">576533</a>: A field of the form "enum E *p" was ignore. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597016">597016</a>: Hide scope name was not working properly for todo items inside class members, where the class was inside a namespace. -<li> id 617761: In dot graphs now also @ref worked (previously only \ref was +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=617761">617761</a>: In dot graphs now also @ref worked (previously only \ref was supported). -<li> id 621653: Fixed error when compiling doxygen for Solaris 8. -<li> id 621733: Removed bogus warning about undocument return type for +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621653">621653</a>: Fixed error when compiling doxygen for Solaris 8. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621733">621733</a>: Removed bogus warning about undocument return type for define when WARN_NO_PARAMDOC was enabled. -<li> id 621780: Fixed parsing support for a function that returns a +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621780">621780</a>: Fixed parsing support for a function that returns a struct definition. -<li> id 621785: Doxygen could hang when using \copydoc in a function with +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621785">621785</a>: Doxygen could hang when using \copydoc in a function with \param. -<li> id 621805: Using //!< after a #define no longer worked. -<li> id 621854,622219,622593: html help compiler (and also the Qt +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621805">621805</a>: Using //!< after a #define no longer worked. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621854">621854</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622219">622219</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622593">622593</a>: html help compiler (and also the Qt help compiler) was called before all dot images were generated. -<li> id 621984: Using a auto-list in combination with \subpage cause the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=621984">621984</a>: Using a auto-list in combination with \subpage cause the items to be inlined. -<li> id 622018: Fixed problem parsing a @param command where the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622018">622018</a>: Fixed problem parsing a @param command where the text part started with a formula. -<li> id 622019: Added some instructions how to document Fortran code. -<li> id 622041: Using \var multiple times in a comment block did not +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622019">622019</a>: Added some instructions how to document Fortran code. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622041">622041</a>: Using \var multiple times in a comment block did not work properly. -<li> id 622413: Tooltips could get wrongly truncated when multi-byte +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622413">622413</a>: Tooltips could get wrongly truncated when multi-byte UTF-8 characters were used. -<li> id 622471: Argument matching failed for typedef in another namespace. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=622471">622471</a>: Argument matching failed for typedef in another namespace. <li> Fixed crash situation while handling commands inside a @ref section. <li> Treeview icons were missing in the HTML output when setting GENERATE_TREEVIEW to NO and USE_INLINE_TREES to YES. @@ -1926,99 +2061,99 @@ make sure you add the following: </ul> <h3>Bug fixes</h3> <ul> -<li> id 306076: source browser could miss links for used namespaces. -<li> id 361476,620924: \if and \endif did not work properly inside auto lists. -<li> id 557164: No warning for missing return type documentation even though +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=306076">306076</a>: source browser could miss links for used namespaces. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=361476">361476</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=620924">620924</a>: \if and \endif did not work properly inside auto lists. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=557164">557164</a>: No warning for missing return type documentation even though WARN_NO_PARAMDOC was set to YES. -<li> id 577005: Handling of nesting \defgroup's was not always working +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=577005">577005</a>: Handling of nesting \defgroup's was not always working properly. -<li> id 578739: ø was not translated correctly in the LaTeX output. -<li> id 583526: Use relative paths for mscgen diagrams to avoid errors in the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=578739">578739</a>: ø was not translated correctly in the LaTeX output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=583526">583526</a>: Use relative paths for mscgen diagrams to avoid errors in the LaTeX output. -<li> id 592991: The "Use current settings at startup" feature of Doxywizard +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592991">592991</a>: The "Use current settings at startup" feature of Doxywizard was broken. -<li> id 593679: Links in the search results were broken if they pointed to +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593679">593679</a>: Links in the search results were broken if they pointed to symbols imported via tag files using an absolute path or URL. -<li> id 593760,615682: Fixed man page output problem when using @par. -<li> id 594021: A C comment before a #endif caused the preprocessor +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593760">593760</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615682">615682</a>: Fixed man page output problem when using @par. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=594021">594021</a>: A C comment before a #endif caused the preprocessor statement to be ignored. -<li> id 597013: When HIDE_SCOPE_NAMES was enabled also the scope for +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597013">597013</a>: When HIDE_SCOPE_NAMES was enabled also the scope for nested classes was stripped. Now only the namespace scope will be stripped as before. -<li> id 600829: Autolinks to namespace members did not work if +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600829">600829</a>: Autolinks to namespace members did not work if an explicit # or :: was used. -<li> id 602732: Slashes inside strings in java annotations were not handled +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=602732">602732</a>: Slashes inside strings in java annotations were not handled properly. -<li> id 606335: Fixed the "show html output" button in doxywizard +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606335">606335</a>: Fixed the "show html output" button in doxywizard for Windows when IE was set as the default browser. -<li> id 608292: Formatting was lost for section copied with \copydoc. -<li> id 608359: Fixed C++ parse issue for "class : public base {} var;" +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608292">608292</a>: Formatting was lost for section copied with \copydoc. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608359">608359</a>: Fixed C++ parse issue for "class : public base {} var;" construct. -<li> id 611056: Generated HTML footer file did not have UTF-8 encoding and +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=611056">611056</a>: Generated HTML footer file did not have UTF-8 encoding and the relative path marker needed when using CREATE_SUBDIRS = YES. -<li> id 611193: Fixed parsing problem with try-functions having multiple +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=611193">611193</a>: Fixed parsing problem with try-functions having multiple catch handlers. -<li> id 611642: Specialized private template member function appeared as +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=611642">611642</a>: Specialized private template member function appeared as public. -<li> id 611888: Include dependency graphs were sometimes wrong. -<li> id 612170: Some lines in the generated Doxyfile where too long. -<li> id 612275: Fixed auto-link problem for certain URLs. -<li> id 612292: Improved handling of ellipsis inside brief description when +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=611888">611888</a>: Include dependency graphs were sometimes wrong. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612170">612170</a>: Some lines in the generated Doxyfile where too long. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612275">612275</a>: Fixed auto-link problem for certain URLs. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612292">612292</a>: Improved handling of ellipsis inside brief description when JAVADOC_AUTOBRIEF is enabled. -<li> id 612364: Accessibility of macros was not handled properly in all cases. -<li> id 612310: Enabling REFERENCED_BY_RELATION without SOURCE_BROWSER could +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612364">612364</a>: Accessibility of macros was not handled properly in all cases. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612310">612310</a>: Enabling REFERENCED_BY_RELATION without SOURCE_BROWSER could result in broken links. -<li> id 612458: Fixed problem handling @copydoc for function operators. -<li> id 612609: A raw C# string constant could end up in the next string. -<li> id 612969: subpages were not part of the XML output. -<li> id 613024: First list item in the paragraph after a @todo +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612458">612458</a>: Fixed problem handling @copydoc for function operators. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612609">612609</a>: A raw C# string constant could end up in the next string. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612969">612969</a>: subpages were not part of the XML output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=613024">613024</a>: First list item in the paragraph after a @todo item was not parsed properly. -<li> id 614204: Generated man page links were having a heading underscore. -<li> id 614443: Made include guard detect a bit more strict to avoid false +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=614204">614204</a>: Generated man page links were having a heading underscore. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=614443">614443</a>: Made include guard detect a bit more strict to avoid false positives. -<li> id 614447: The labels of CVS tags were missing a colon. -<li> id 614438: Fixed problem parsing Q_PROPERTY with template type and +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=614447">614447</a>: The labels of CVS tags were missing a colon. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=614438">614438</a>: Fixed problem parsing Q_PROPERTY with template type and spaces. -<li> id 615165: Made the date string in the HTML footer translatable, +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615165">615165</a>: Made the date string in the HTML footer translatable, along with some other sentences on the directory pages. -<li> id 612858: Inline attribute was shown also for non-inline template +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=612858">612858</a>: Inline attribute was shown also for non-inline template members. -<li> id 615583: Fixed problem handling @copy for operators with +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615583">615583</a>: Fixed problem handling @copy for operators with const qualifier. -<li> id 615755: Fixed problem handling '"' inside comments. -<li> id 615957: Made the LaTeX output a bit less spatious using \input. -<li> id 615695: Fixed preprocessor issue where a macro that was redefined +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615755">615755</a>: Fixed problem handling '"' inside comments. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615957">615957</a>: Made the LaTeX output a bit less spatious using \input. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615695">615695</a>: Fixed preprocessor issue where a macro that was redefined was not resolved. <li> Fixed character encoding issue on the search results page. -<li> id 615670: C# namespaces are now extracted also without comment block +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=615670">615670</a>: C# namespaces are now extracted also without comment block (the language spec does not allow XML documentation). -<li> id 616209: included patch that fixes some typos in the code. -<li> id 616344,610604: Pages with an underscore in the label generated a +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616209">616209</a>: included patch that fixes some typos in the code. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616344">616344</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=610604">610604</a>: Pages with an underscore in the label generated a file name containing two underscores. -<li> id 616387: text of the form something.symbol got autolinked when +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616387">616387</a>: text of the form something.symbol got autolinked when symbol had a global scope. -<li> id 616761: Call graph could be wrong when local variable has the same +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616761">616761</a>: Call graph could be wrong when local variable has the same name as a global function. -<li> id 616947: Added documentation patch on how to create URL links with +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616947">616947</a>: Added documentation patch on how to create URL links with custom text. -<li> id 616988: Doxywizard now removes non-existant files from the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=616988">616988</a>: Doxywizard now removes non-existant files from the recent list and has an option to clear the list completely. -<li> id 617051: A macro defined via PREDEFINED did not always overrule a +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=617051">617051</a>: A macro defined via PREDEFINED did not always overrule a macro definition in the code. -<li> id 617278: Enabling call graphs produced invalid XHTML output. -<li> id 617871: Non ascii characters in file or directory names +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=617278">617278</a>: Enabling call graphs produced invalid XHTML output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=617871">617871</a>: Non ascii characters in file or directory names caused problems on Windows. -<li> id 618079: An ALIAS with parameters spanning multiple lines +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=618079">618079</a>: An ALIAS with parameters spanning multiple lines caused problems with /// style comments. -<li> id 618632: Included patch to prevent image overflowing the page in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=618632">618632</a>: Included patch to prevent image overflowing the page in the LaTeX output. -<li> id 619728: Fixed problem using EXTENSION_MAPPING for C# (thanks to +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619728">619728</a>: Fixed problem using EXTENSION_MAPPING for C# (thanks to Vsevolod Kukol for the patch). -<li> id 619978: Links to external files could be wrong when CREATE_SUBDIR +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=619978">619978</a>: Links to external files could be wrong when CREATE_SUBDIR was enabled. -<li> id 620229: /* characters in a print broke parsing within an conditional +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=620229">620229</a>: /* characters in a print broke parsing within an conditional section. -<li> id 620926: \if and \endif did not work properly inside HTML tables. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=620926">620926</a>: \if and \endif did not work properly inside HTML tables. <li> Using @include in combination with LATEX_SOURCE_CODE caused wrong output. <li> Included a patch by Guido Tack which adds two new options @@ -2036,56 +2171,56 @@ make sure you add the following: <h2>(release date 21-02-2010)</h2> <h3>New features</h3> <ul> -<li> id 608480: Using \dir without argument will create directory +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608480">608480</a>: Using \dir without argument will create directory documentation for the directory in which the \dir command was found. </ul> <h3>Bug fixes</h3> <ul> -<li> id 590161: perlmod output was wrong when using paragraph commands. -<li> id 600525: Included patch for VHDL. -<li> id 605698: Replaced size attribute of hr tag by class attribute in the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=590161">590161</a>: perlmod output was wrong when using paragraph commands. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600525">600525</a>: Included patch for VHDL. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=605698">605698</a>: Replaced size attribute of hr tag by class attribute in the HTML output. -<li> id 606030,606192,607563: +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606030">606030</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606192">606192</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607563">607563</a>: Using \dot produced "Error opening map file" or could even crash doxygen. -<li> id 606084: Loading a new config file in doxywizard did not reset all +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606084">606084</a>: Loading a new config file in doxywizard did not reset all values of a previously loaded config file. -<li> id 606104: Grouped members with todo-like items were shown with +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606104">606104</a>: Grouped members with todo-like items were shown with "GlobalScope" prefix. -<li> id 606156: Fixed RTF rendering problem with group index. -<li> id 606206,610133: Added missing line break in LaTeX output. -<li> id 606330, 608056: The title of pages whose label had an underscore +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606156">606156</a>: Fixed RTF rendering problem with group index. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606206">606206</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=610133">610133</a>: Added missing line break in LaTeX output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606330">606330</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608056">608056</a>: The title of pages whose label had an underscore was not shown -<li> id 606717: Include guard not starting with #ifndef SOME_GUARD_H were not +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606717">606717</a>: Include guard not starting with #ifndef SOME_GUARD_H were not recognised as such. -<li> id 606718: Setting SEARCHENGINE to YES and GENERATE_HTML to NO caused +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606718">606718</a>: Setting SEARCHENGINE to YES and GENERATE_HTML to NO caused error that search results directory could not be created. -<li> id 606772,608493: typedef'ed enums or struct with the same as the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=606772">606772</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608493">608493</a>: typedef'ed enums or struct with the same as the typedef did no longer show up. -<li> id 607088,607946: Related pages (manual and automatic like the todo page) +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607088">607088</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607946">607946</a>: Related pages (manual and automatic like the todo page) caused broken links when SHORT_NAMES was enabled. -<li> id 607432,608002: Automatically generated related pages (like the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607432">607432</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608002">608002</a>: Automatically generated related pages (like the todo page) caused broken links when CREATE_SUBDIR was enabled. -<li> id 607736: comments after #if could cause next function call not to be +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607736">607736</a>: comments after #if could cause next function call not to be cross-referenced. -<li> id 607743: \internal inside a conditional section caused warning. -<li> id 608016: Using \internal inside a \section did not end at the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=607743">607743</a>: \internal inside a conditional section caused warning. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608016">608016</a>: Using \internal inside a \section did not end at the next \section as documented. -<li> id 608018: \internal command produced message with .: in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608018">608018</a>: \internal command produced message with .: in the LaTeX output. -<li> id 608072: HTML Tables with custom attributes were not rendered +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608072">608072</a>: HTML Tables with custom attributes were not rendered properly. -<li> id 608227: Man pages with underscore got double underscore in the name. -<li> id 608590: Buffer overflow when using non-ascii characters as class +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608227">608227</a>: Man pages with underscore got double underscore in the name. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608590">608590</a>: Buffer overflow when using non-ascii characters as class name. -<li> id 608921: Macro definition had effect even if the definition was not +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=608921">608921</a>: Macro definition had effect even if the definition was not actually included. -<li> id 609504: config.h and config.l where missing from the SVN repository. -<li> id 609624: Todo items were merged for overloaded functions. -<li> id 609709: C# enum values with @todo items were missing from the todo +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=609504">609504</a>: config.h and config.l where missing from the SVN repository. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=609624">609624</a>: Todo items were merged for overloaded functions. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=609709">609709</a>: C# enum values with @todo items were missing from the todo list. -<li> id 610437: Removed bogus warning when using <br/> tag. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=610437">610437</a>: Removed bogus warning when using <br/> tag. <li> Fixed parsing problem for function pointer type starting with "typedef enum". <li> Preprocessor did not take EXCLUDE_PATTERNS into account, which @@ -2098,9 +2233,9 @@ make sure you add the following: <h2>(release date 30-12-2009)</h2> <h3>Changes</h3> <ul> -<li> id 594787: Autolinking to all-lower case words has been disabled, +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=594787">594787</a>: Autolinking to all-lower case words has been disabled, in accordance with the documentation. -<li> id 604543: Doxygen now allows any extension supported by dot via the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=604543">604543</a>: Doxygen now allows any extension supported by dot via the DOT_IMAGE_FORMAT option. <li> Switched back to using PNGs for built-in diagrams and formulas using the Lode Vandevenne's PNG encoder. @@ -2121,8 +2256,8 @@ make sure you add the following: proper anti-aliasing on non-white backgrounds using transparency. <li> Add new option FORCE_LOCAL_INCLUDES to make the default #include appearance in class documentation with "" i.s.o sharp brackets. -<li> id 558457: Make \addindex put keywords into the .qhp file. -<li> id 595214: #cmakedefine is now treated the same was as #define +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=558457">558457</a>: Make \addindex put keywords into the .qhp file. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595214">595214</a>: #cmakedefine is now treated the same was as #define (for users of the CMake build system). <li> Added compilation support for OSX 10.6 (aka Snow Leopard) <li> Included language update for Brazilian. @@ -2130,73 +2265,73 @@ make sure you add the following: <h3>Bug fixes</h3> <ul> <li> Doxywizard did not warn when it failed to save its config file. -<li> id 557035: Empty class definitions were not included in Tokens file +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=557035">557035</a>: Empty class definitions were not included in Tokens file for docsets. -<li> id 563233: GENERATE_QHP details was considered even though it is +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=563233">563233</a>: GENERATE_QHP details was considered even though it is not defined. -<li> id 567346: Comment parser could get stuck in certain cases. -<li> id 570369: GENERATE_QHP should generate keywords for classes in +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=567346">567346</a>: Comment parser could get stuck in certain cases. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=570369">570369</a>: GENERATE_QHP should generate keywords for classes in generated *.qhc. -<li> id 571964: Fixed two issues in the compound.xsd schema definition. -<li> id 592991: Fixed wrong default destination directory. -<li> id 593040: Fixed problem with distributing member group documentation +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=571964">571964</a>: Fixed two issues in the compound.xsd schema definition. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592991">592991</a>: Fixed wrong default destination directory. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593040">593040</a>: Fixed problem with distributing member group documentation for anonymous member groups. -<li> id 593273: GENERATE_TODOLIST=NO and friends not longer worked. -<li> id 593928: Added support for UCS-2 encoded input files. -<li> id 594391: Fixed problem parsing fully-qualified java annotations. -<li> id 594592,596815: Fixed problem handling quotes. -<li> id 595191: Not all configuration options appeared in the index of +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593273">593273</a>: GENERATE_TODOLIST=NO and friends not longer worked. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=593928">593928</a>: Added support for UCS-2 encoded input files. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=594391">594391</a>: Fixed problem parsing fully-qualified java annotations. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=594592">594592</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596815">596815</a>: Fixed problem handling quotes. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595191">595191</a>: Not all configuration options appeared in the index of the documentation and some were not sorted correctly. -<li> id 595253: formulas had the .png extension while they were gifs. -<li> id 595833: Fixed recursive lockup while resolving template relations. -<li> id 595935: Doxygen's preprocessor got confused when /**/ appeared as +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595253">595253</a>: formulas had the .png extension while they were gifs. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595833">595833</a>: Fixed recursive lockup while resolving template relations. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595935">595935</a>: Doxygen's preprocessor got confused when /**/ appeared as part of a macro definition. -<li> id 596085: Removed obsolete option USE_WINDOWS_ENCODING from the docs. -<li> id 596233: RTF output was missing a new paragraph for brief +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596085">596085</a>: Removed obsolete option USE_WINDOWS_ENCODING from the docs. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596233">596233</a>: RTF output was missing a new paragraph for brief member descriptions. -<li> id 596807,596819: Code reformatting done for the LaTeX output could +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596807">596807</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596819">596819</a>: Code reformatting done for the LaTeX output could break multibyte UTF-8 characters causing invalid output. -<li> id 596809: Using multibyte characters in a page label caused invalid +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596809">596809</a>: Using multibyte characters in a page label caused invalid output. -<li> id 596816: Documented the interaction between LATEX_CMD_NAME and +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596816">596816</a>: Documented the interaction between LATEX_CMD_NAME and USE_PDFLATEX. -<li> id 597015: Todo items for two inner classes with the same name where +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597015">597015</a>: Todo items for two inner classes with the same name where collapsed together in the todo list when HIDE_SCOPE_NAMES was enabled. -<li> id 597016: Scope was not hidden for members in the todo list even +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597016">597016</a>: Scope was not hidden for members in the todo list even though HIDE_SCOPE_NAMES was set to YES. -<li> id 598497: Struct variable with explicit struct keyword got labelled +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=598497">598497</a>: Struct variable with explicit struct keyword got labelled with [read] attribute. -<li> id 596902: PHP was not parsed properly when it appeared in a +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=596902">596902</a>: PHP was not parsed properly when it appeared in a <script language="php"> section. -<li> id 597415: Fixed problem matching base class member against the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597415">597415</a>: Fixed problem matching base class member against the member in the derived class. -<li> id 597518: Makefile for Docsets now honors DESTDIR. -<li> id 598298: Made browsing for HHC_LOCATION via the wizard +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597518">597518</a>: Makefile for Docsets now honors DESTDIR. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=598298">598298</a>: Made browsing for HHC_LOCATION via the wizard yield an absolute path. -<li> id 599128: Changed default for CHM_INDEX_ENCODING to CP1250 to avoid +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=599128">599128</a>: Changed default for CHM_INDEX_ENCODING to CP1250 to avoid issues in a Solaris environment. -<li> id 595931: Removed unnecessary paragraphs from HTML table cells. -<li> id 597541: referring to page labels of the form a-1 did not work. -<li> id 599224: Code generators could produce extra </span> tags. -<li> id 599974: Included the PHP search engine again (with new config +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=595931">595931</a>: Removed unnecessary paragraphs from HTML table cells. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=597541">597541</a>: referring to page labels of the form a-1 did not work. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=599224">599224</a>: Code generators could produce extra </span> tags. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=599974">599974</a>: Included the PHP search engine again (with new config option SERVER_BASED_SEARCH to enable it) -<li> id 600544: Doxygen produced invalid Latex output for RCS tags. -<li> id 600563: Fixed issue with include dependency tracking that could +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600544">600544</a>: Doxygen produced invalid Latex output for RCS tags. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600563">600563</a>: Fixed issue with include dependency tracking that could cause macro expansion not to work properly. -<li> id 600940: Fixed issue with VHDL call graph (thank to Martin Kreis +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=600940">600940</a>: Fixed issue with VHDL call graph (thank to Martin Kreis for the fix). -<li> id 601138: Fixed problem parsing C++ function-try-blocks. -<li> id 601222: #include inside a class could cause line numbers to be off. -<li> id 601223: Fixed parsing problem skipping over /**/ comment. -<li> id 601694: Fixed problem handling Javadoc style {@code ... } blocks. -<li> id 601771: Special commands did not work in the title of +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601138">601138</a>: Fixed problem parsing C++ function-try-blocks. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601222">601222</a>: #include inside a class could cause line numbers to be off. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601223">601223</a>: Fixed parsing problem skipping over /**/ comment. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601694">601694</a>: Fixed problem handling Javadoc style {@code ... } blocks. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=601771">601771</a>: Special commands did not work in the title of the @mainpage. -<li> id 602818: Fixed problem parsing files that start with UTF-8 BOM. -<li> id 603001: Fixed problem parsing friend function with explicit scope. -<li> id 603238: Fixed perlmod generation issue. -<li> id 604948: Project number was not centered anymore in the HTML output. -<li> id 604503: Using %word in a page title incorrectly did show the %. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=602818">602818</a>: Fixed problem parsing files that start with UTF-8 BOM. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=603001">603001</a>: Fixed problem parsing friend function with explicit scope. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=603238">603238</a>: Fixed perlmod generation issue. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=604948">604948</a>: Project number was not centered anymore in the HTML output. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=604503">604503</a>: Using %word in a page title incorrectly did show the %. </ul> <a name="1.6.1"></a> @@ -2209,31 +2344,31 @@ make sure you add the following: parsed. <li> Search result pages were not using UTF-8 character encoding. <li> Search results pointing to external references were not linked correctly. -<li> id 133418: Multiline second argument of \ref caused unexpected " warning. -<li> id 592454: Feeding invalid XML could crash doxygen's DBus XML parser. -<li> id 592485: Include patch to fix problem with building rpms. -<li> id 592511,592625: Doxywizard problem with GENERATE_TREEVIEW. -<li> id 592650: SHOW_USED_FILES now works again. -<li> id 592808: xrefitems (like @todo) did not appear in the list when +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=133418">133418</a>: Multiline second argument of \ref caused unexpected " warning. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592454">592454</a>: Feeding invalid XML could crash doxygen's DBus XML parser. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592485">592485</a>: Include patch to fix problem with building rpms. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592511">592511</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592625">592625</a>: Doxywizard problem with GENERATE_TREEVIEW. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592650">592650</a>: SHOW_USED_FILES now works again. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=592808">592808</a>: xrefitems (like @todo) did not appear in the list when found in comments marked with @enum or @name. </ul> <h1>Doxygen Release 1.6.0</h1> <h2>(release date 20-08-2009)</h2> <h3>Changes</h3> <ul> -<li> id 580924, 541234: Replaced the PHP based search engine by a +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=580924">580924</a>, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=541234">541234</a>: Replaced the PHP based search engine by a Javascript/DHTML based one. As a result the search feature no longer requires a HTTP server with PHP enabled to be usable. Searching is limited to symbols though, but it is now possible to filter on symbol type. -<li> id 519886: Make the HTML output XHTML 1.0 compliant. -<li> id 579950: Objective-C categories are now merged with their base +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=519886">519886</a>: Make the HTML output XHTML 1.0 compliant. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=579950">579950</a>: Objective-C categories are now merged with their base class, unless there is no base class. <li> Member groups with the same header within the same scope are now merged. This also works for Objective-C categories. <li> Changed the LaTeX style sheet such that more of the markup is configurable. Please update your style sheet if you use a custom one. -<li> id 584844: Treat \details inside a brief description as a new paragraph +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=584844">584844</a>: Treat \details inside a brief description as a new paragraph command. <li> Split GENERATE_TREEVIEW into two separate options: GENERATE_TREEVIEW and USE_INLINE_TREES. @@ -2244,7 +2379,7 @@ make sure you add the following: <ul> <li> Added option SORT_MEMBERS_CTORS_1ST, which when enabled places the constructors and destructors first in an otherwise sorted list. -<li> id 581518: Applied patch by Tobias Hunger that adds support for +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=581518">581518</a>: Applied patch by Tobias Hunger that adds support for documenting DBus XML interface descriptions. <li> Included QtHelp patch by Karsten Heimrich which adds missing reference and keyword for methods. @@ -2252,49 +2387,49 @@ make sure you add the following: </ul> <h3>Bug fixes</h3> <ul> -<li> id 131989: Fixed preprocessor handling for C# code. -<li> id 133418: -- was not rendered correctly for LaTeX output -<li> id 157485: Missing link in todo page. -<li> id 318061: Two template functions that only differed in the number +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=131989">131989</a>: Fixed preprocessor handling for C# code. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=133418">133418</a>: -- was not rendered correctly for LaTeX output +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=157485">157485</a>: Missing link in todo page. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=318061">318061</a>: Two template functions that only differed in the number of template arguments were seen as the same function. -<li> id 443939: HIDE_UNDOC_CLASSES did not work properly. -<li> id 509348: Fixed problem with syncing the information of +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=443939">443939</a>: HIDE_UNDOC_CLASSES did not work properly. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=509348">509348</a>: Fixed problem with syncing the information of declaration and definition in the presence of an extra forward declaration in the source code. -<li> id 522193: For C# enum values were merged together if the same enum +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=522193">522193</a>: For C# enum values were merged together if the same enum name was used in different scopes. -<li> id 523167: Included patch to handle PROGRAM statement in Fortran as +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=523167">523167</a>: Included patch to handle PROGRAM statement in Fortran as subroutines/functions. -<li> id 554636: Remove spacing around brackets for Obj-C protocols. -<li> id 557026: Included patch for fixing wrongly labeled items in docsets. -<li> id 560512: Improved parser to better disambiguate +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=554636">554636</a>: Remove spacing around brackets for Obj-C protocols. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=557026">557026</a>: Included patch for fixing wrongly labeled items in docsets. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=560512">560512</a>: Improved parser to better disambiguate nested templates ending with >> from the bitshift right operator. -<li> id 570238: Fixed matching problem for method in nested class, where +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=570238">570238</a>: Fixed matching problem for method in nested class, where the outer class is a template. -<li> id 581746: Segfault/realloc error when a very long path was used. -<li> id 582469: documented #define with guard caused wrong documentation. -<li> id 582276: Doxywizard could crash on exit in some cases. -<li> id 582676: Regression: a struct ivar in ObjC class screws up method +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=581746">581746</a>: Segfault/realloc error when a very long path was used. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=582469">582469</a>: documented #define with guard caused wrong documentation. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=582276">582276</a>: Doxywizard could crash on exit in some cases. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=582676">582676</a>: Regression: a struct ivar in ObjC class screws up method identification. -<li> id 583213: Included patch that avoids trailing spaces in the +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=583213">583213</a>: Included patch that avoids trailing spaces in the generated Doxyfile template. -<li> id 584192: Included VHDL patch by Martin Klein -<li> id 585543: Fixed case where matching declaration and definition did +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=584192">584192</a>: Included VHDL patch by Martin Klein +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=585543">585543</a>: Fixed case where matching declaration and definition did not work correctly. -<li> id 585260: The "more..." link for files was broken, since the anchor +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=585260">585260</a>: The "more..." link for files was broken, since the anchor was not generated. -<li> id 586925: Fixed parsing problem when an unpaired apostrophe +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=586925">586925</a>: Fixed parsing problem when an unpaired apostrophe appeared in a Python comment. -<li> id 588291: Included fix for doxywizard makefile. -<li> id 588587: Added missing virtual destructor to CompAccept base class. -<li> id 588968: Fixed segmentation fault for specific case in PHP code. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=588291">588291</a>: Included fix for doxywizard makefile. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=588587">588587</a>: Added missing virtual destructor to CompAccept base class. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=588968">588968</a>: Fixed segmentation fault for specific case in PHP code. <li> Fixed some issues building for Windows. -<li> id 589514: Fixed problem handling strings like a"\b" within a comment. -<li> id 589616: Fixed problem matching explicitly scoped parameter in a +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=589514">589514</a>: Fixed problem handling strings like a"\b" within a comment. +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=589616">589616</a>: Fixed problem matching explicitly scoped parameter in a template class. -<li> id 590712: A namespaced with name "internal" (C++/CLI keyword) +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=590712">590712</a>: A namespaced with name "internal" (C++/CLI keyword) could confuse doxygen's C++ parser. -<li> id 591749: @optional/@required attributes for Objective-C were missing +<li> id <a href="https://bugzilla.gnome.org/show_bug.cgi?id=591749">591749</a>: @optional/@required attributes for Objective-C were missing from the XML output. </ul> <h1><a href="http://www.doxygen.org/changelog_1.5.html">Doxygen Release 1.5 and earlier</a></h1> diff --git a/doc/commands.doc b/doc/commands.doc index 5743832..73eb842 100644 --- a/doc/commands.doc +++ b/doc/commands.doc @@ -90,6 +90,7 @@ documentation: \refitem cmdendrtfonly \\endrtfonly \refitem cmdendsecreflist \\endsecreflist \refitem cmdendverbatim \\endverbatim +\refitem cmdenduml \\enduml \refitem cmdendxmlonly \\endxmlonly \refitem cmdenum \\enum \refitem cmdexample \\example @@ -174,6 +175,7 @@ documentation: \refitem cmdskip \\skip \refitem cmdskipline \\skipline \refitem cmdsnippet \\snippet +\refitem cmdstartuml \\startuml \refitem cmdstruct \\struct \refitem cmdsubpage \\subpage \refitem cmdsubsection \\subsection @@ -2356,6 +2358,20 @@ Commands for visual enhancements \endcode \endverbatim + If the contents of the code block are in a language that doxygen cannot parse, doxygen + will just show the output as-is. You can make this explicit using .unparsed, or by + giving some other extension that doxygen doesn't support, e.g. + +\verbatim + \code{.unparsed} + Show this as-is please + \endcode + + \code{.sh} + echo "This is a shell script" + \endcode +\endverbatim + \sa section \ref cmdendcode "\\endcode" and section \ref cmdverbatim "\\verbatim". <hr> @@ -2517,6 +2533,59 @@ class Receiver \sa section \ref cmdmscfile "\\mscfile". <hr> +\section cmdstartuml \\startuml + + \addindex \\startuml + Starts a text fragment which should contain a valid description of a + PlantUML diagram. See http://plantuml.sourceforge.net/ for examples. + The text fragment ends with \ref cmdenduml "\\enduml". + \note You need to install Java and the PlantUML's jar file, + if you want to use this command. The location of the jar file should be specified + using \ref cfg_plantuml_jar_path "PLANTUML_JAR_PATH". + +Here is an example of the use of the \c \\startuml command. +\code +/** Sender class. Can be used to send a command to the server. + * The receiver will acknowledge the command by calling Ack(). + * \startuml + * Sender->Receiver : Command() + * Sender<--Receiver : Ack() + * \enduml + */ +class Sender +{ + public: + /** Acknowledgment from server */ + void Ack(bool ok); +}; + +/** Receiver class. Can be used to receive and execute commands. + * After execution of a command, the receiver will send an acknowledgment + * \startuml + * Receiver<-Sender : Command() + * Receiver-->Sender : Ack() + * \enduml + */ +class Receiver +{ + public: + /** Executable a command on the server */ + void Command(int commandId); +}; +\endcode + +\note For compatibility with running PlantUML as a preprocessing step before +running doxygen, you can also add the name of the image file after \c \\startuml +and inside curly brackets, i.e. +\verbatim +@startuml{myimage.png} +Alice -> Bob : Hello +@enduml +\endverbatim +When the name of the image is specified, doxygen will generate an image with that name. +Without the name doxygen will choose a name automatically. + +<hr> \section cmddotfile \\dotfile <file> ["caption"] \addindex \\dotfile @@ -2637,6 +2706,12 @@ class Receiver Ends a block that was started with \ref cmdmsc "\\msc". <hr> +\section cmdenduml \\enduml + + \addindex \\enduml + Ends a block that was started with \ref cmdstartuml "\\startuml". + +<hr> \section cmdendhtmlonly \\endhtmlonly \addindex \\endhtmlonly diff --git a/doc/customize.doc b/doc/customize.doc index 7252a4a..46b1d8b 100644 --- a/doc/customize.doc +++ b/doc/customize.doc @@ -110,8 +110,8 @@ This will create 3 files: link to www.doxygen.org and the body and html end tags. - customdoxygen.css is the default cascading style sheet used by doxygen. It is recommended only to look into this file and overrule - some settings you like by putting them in a separate stylesheet and - referencing that extra file + some settings you like by putting them in a separate stylesheets and + referencing those extra files via \ref cfg_html_extra_stylesheet "HTML_EXTRA_STYLESHEET". You should edit these files and then reference them from the config file. diff --git a/doc/docblocks.doc b/doc/docblocks.doc index 6ef6bf0..333e5d2 100644 --- a/doc/docblocks.doc +++ b/doc/docblocks.doc @@ -371,7 +371,7 @@ typedef, enum or preprocessor definition you must first document the file that contains it (usually this will be a header file, because that file contains the information that is exported to other source files). -Let's repeat that, because it is often overlooked: +@attention Let's repeat that, because it is often overlooked: to document global objects (functions, typedefs, enum, macros, etc), you <em>must</em> document the file in which they are defined. In other words, there <em>must</em> at least be a \verbatim /*! \file */ \endverbatim @@ -395,6 +395,23 @@ using structural commands: in comment blocks which are place in front of a function. This is clearly a case where the \\fn command is redundant and will only lead to problems. + When you place a comment block in a file with one of the following extensions + `.dox`, `.txt`, or `.doc` then doxygen will hide this file from the file list. + + If you have a file that doxygen cannot parse but still would like to document it, + you can show it as-is using \ref cmdverbinclude "\\verbinclude", e.g. + +\verbatim +/*! \file myscript.sh + * Look at this nice script: + * \verbinclude myscript.sh + */ +\endverbatim + +Make sure that the script is explicitly listed in the \ref cfg_input "INPUT" or +that \ref cfg_file_patterns "FILE_PATTERNS" includes the `.sh` extention and the +the script can be found in the path set via \ref cfg_example_path "EXAMPLE_PATH". + \subsection pythonblocks Comment blocks in Python For Python there is a standard way of documenting the code using @@ -464,8 +481,8 @@ The parser tries to guess if the source code is fixed format Fortran or free format Fortran code. This may not always be correct. If not one should use \ref cfg_extension_mapping "EXTENSION_MAPPING" to correct this. By setting `EXTENSION_MAPPING = f=FortranFixed f90=FortranFree` files with -extension \c f90 are interpreted as fixed format Fortran code and files with -extension \c f are interpreted as free format Fortran code. +extension \c f are interpreted as fixed format Fortran code and files with +extension \c f90 are interpreted as free format Fortran code. For Fortran "!>" or "!<" starts a comment and "!!" or "!>" can be used to continue an one line comment into a multi-line comment. diff --git a/doc/faq.doc b/doc/faq.doc index 92d78f0..356c42b 100644 --- a/doc/faq.doc +++ b/doc/faq.doc @@ -16,8 +16,10 @@ */ /*! \page faq Frequently Asked Questions -<ol> -<li><b>How to get information on the index page in HTML?</b> +\tableofcontents + + +\section faq_index How to get information on the index page in HTML? <p> You should use the \ref cmdmainpage "\\mainpage" command inside a comment block like this: \verbatim @@ -35,8 +37,7 @@ You should use the \ref cmdmainpage "\\mainpage" command inside a comment block */ \endverbatim -<li><b>Help, some/all of the members of my class / file / namespace - are not documented?</b> +\section fac_al Help, some/all of the members of my class / file / namespace are not documented? Check the following: <ol> @@ -62,8 +63,7 @@ PREDEFINED = MY_MACRO()= manual for more information. </ol> -<li><b>When I set EXTRACT_ALL to NO none of my functions are shown in the - documentation.</b> +\section faq_extract_allWhen I set EXTRACT_ALL to NO none of my functions are shown in the documentation. In order for global functions, variables, enums, typedefs, and defines to be documented you should document the file in which these commands are @@ -77,7 +77,7 @@ block containing the \ref cmddefgroup "\\defgroup" command. For member functions or functions that are part of a namespace you should document either the class or namespace. -<li><b>How can I make doxygen ignore some code fragment?</b> +\section faq_code How can I make doxygen ignore some code fragment? The new and easiest way is to add one comment block with a \ref cmdcond "\\cond" command at the start and one comment block @@ -100,8 +100,7 @@ around the blocks that should be hidden and put: in the config file then all blocks should be skipped by Doxygen as long as \ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" is set to `YES`. -<li><b>How can I change what is after the <code>\#include</code> -in the class documentation?</b> +\section faq_code_inc How can I change what is after the <code>\#include</code> in the class documentation? In most cases you can use \ref cfg_strip_from_inc_path "STRIP_FROM_INC_PATH" to strip a user defined part of a path. @@ -132,7 +131,7 @@ quotes instead of angle brackets you should type: */ \endverbatim -<li><b>How can I use tag files in combination with compressed HTML?</b> +\section faq_chm How can I use tag files in combination with compressed HTML? If you want to refer from one compressed HTML file \c a.chm to another compressed HTML file @@ -155,14 +154,13 @@ configuration file for project \e a you write: TAGFILES = b.tag=b.chm:: \endverbatim -<li><b>I don't like the quick index that is put above each HTML page, what do I do?</b> +\section faq_html I don't like the quick index that is put above each HTML page, what do I do? You can disable the index by setting \ref cfg_disable_index "DISABLE_INDEX" to `YES`. Then you can put in your own header file by writing your own header and feed that to \ref cfg_html_header "HTML_HEADER". -<li><b>The overall HTML output looks different, while I only wanted to - use my own html header file</b> +\section faq_html_header The overall HTML output looks different, while I only wanted to use my own html header file You probably forgot to include the stylesheet <code>doxygen.css</code> that doxygen generates. You can include this by putting @@ -171,7 +169,7 @@ doxygen generates. You can include this by putting \endverbatim in the HEAD section of the HTML page. -<li><b>Why does doxygen use Qt?</b> +\section faq_use_qt Why does doxygen use Qt? The most important reason is to have a platform abstraction for most Unices and Windows by means of the QFile, QFileInfo, QDir, QDate, @@ -181,7 +179,7 @@ QDict, QString, QArray, QTextStream, QRegExp, QXML etc. The GUI front-end doxywizard uses Qt for... well... the GUI! -<li><b>How can I exclude all test directories from my directory tree?</b> +\section faq_excl_dir How can I exclude all test directories from my directory tree? Simply put an exclude pattern like this in the configuration file: @@ -189,14 +187,12 @@ Simply put an exclude pattern like this in the configuration file: EXCLUDE_PATTERNS = */test/* \endverbatim -<li><b>Doxygen automatically generates a link to the - class MyClass somewhere in the running text. - How do I prevent that at a certain place?</b> +\section faq_class Doxygen automatically generates a link to the class MyClass somewhere in the running text. How do I prevent that at a certain place? Put a \% in front of the class name. Like this: \%MyClass. Doxygen will then remove the % and keep the word unlinked. -<li><b>My favorite programming language is X. Can I still use doxygen?</b> +\section faq_pgm_X My favorite programming language is X. Can I still use doxygen? No, not as such; doxygen needs to understand the structure of what it reads. If you don't mind spending some time on it, there are several options: @@ -212,8 +208,7 @@ If you don't mind spending some time on it, there are several options: write a backend that produces a similar syntax tree as is done by src/scanner.l (and also by src/tagreader.cpp while reading tag files). -<li><b>Help! I get the cryptic message - "input buffer overflow, can't enlarge buffer because scanner uses REJECT"</b> +\section faq_lex Help! I get the cryptic message "input buffer overflow, can't enlarge buffer because scanner uses REJECT" This error happens when doxygen's lexical scanner has a rule that matches more than 256K of input characters in one go. I've seen this happening @@ -227,21 +222,21 @@ should send me a code fragment that triggers the message. To work around the problem, put some line-breaks into your file, split it up into smaller parts, or exclude it from the input using EXCLUDE. -<li><b>When running make in the latex dir I get "TeX capacity exceeded". Now what?</b> +\section faq_latex When running make in the latex dir I get "TeX capacity exceeded". Now what? You can edit the texmf.cfg file to increase the default values of the various buffers and then run "texconfig init". -<li><b>Why are dependencies via STL classes not shown in the dot graphs?</b> +\section faq_stl Why are dependencies via STL classes not shown in the dot graphs? Doxygen is unaware of the STL classes, unless the option \ref cfg_builtin_stl_support "BUILTIN_STL_SUPPORT" is turned on. -<li><b>I have problems getting the search engine to work with PHP5 and/or windows</b> +\section faq_search I have problems getting the search engine to work with PHP5 and/or windows Please read <a href="searchengine.html">this</a> for hints on where to look. -<li><b>Can I configure doxygen from the command line?</b> +\section faq_cmdline Can I configure doxygen from the command line? Not via command line options, but doxygen can read from <code>stdin</code>, so you can pipe things through it. Here's an example how to override an option @@ -260,7 +255,7 @@ For Windows the following would do the same: If multiple options with the same name are specified then doxygen will use the last one. To append to an existing option you can use the += operator. -<li><b>How did doxygen get its name?</b> +\section faq_name How did doxygen get its name? Doxygen got its name from playing with the words documentation and generator. @@ -274,7 +269,7 @@ At the time I was looking into \c lex and \c yacc, where a lot of things start w "yy", so the "y" slipped in and made things pronounceable (the proper pronouncement is Docs-ee-gen, so with a long "e"). -<li><b>What was the reason to develop doxygen?</b> +\section faq_why What was the reason to develop doxygen? I once wrote a GUI widget based on the Qt library (it is still available at http://sourceforge.net/projects/qdbttabular/ but hasn't been updated since 2002). @@ -286,8 +281,6 @@ Doc++ but that just wasn't good enough (it didn't support signals and slots and did not have the Qt look and feel I had grown to like), so I started to write my own tool... -</ol> - \htmlonly Go to the <a href="trouble.html">next</a> section or return to the <a href="index.html">index</a>. diff --git a/doc/htmlcmds.doc b/doc/htmlcmds.doc index b07509c..d041f1e 100644 --- a/doc/htmlcmds.doc +++ b/doc/htmlcmds.doc @@ -32,8 +32,6 @@ of a HTML tag are passed on to the HTML output only <li><tt>\</B\></tt> Ends a <tt>\<B\></tt> section. <li><tt>\<BLOCKQUOTE\></tt> Starts a quotation block. <li><tt>\</BLOCKQUOTE\></tt> Ends the quotation block. -<li><tt>\<BODY\></tt> Does not generate any output. -<li><tt>\</BODY\></tt> Does not generate any output. <li><tt>\<BR\></tt> Forces a line break. <li><tt>\<CENTER\></tt> starts a section of centered text. <li><tt>\</CENTER\></tt> ends a section of centered text. @@ -57,8 +55,6 @@ of a HTML tag are passed on to the HTML output only <li><tt>\</DT\></tt> Ends an item title. <li><tt>\<EM\></tt> Starts a piece of text displayed in an italic font. <li><tt>\</EM\></tt> Ends a <tt>\<EM\></tt> section. -<li><tt>\<FORM\></tt> Does not generate any output. -<li><tt>\</FORM\></tt> Does not generate any output. <li><tt>\<HR\></tt> Writes a horizontal ruler. <li><tt>\<H1\></tt> Starts an unnumbered section. <li><tt>\</H1\></tt> Ends an unnumbered section. @@ -66,15 +62,17 @@ of a HTML tag are passed on to the HTML output only <li><tt>\</H2\></tt> Ends an unnumbered subsection. <li><tt>\<H3\></tt> Starts an unnumbered subsubsection. <li><tt>\</H3\></tt> Ends an unnumbered subsubsection. +<li><tt>\<H4\></tt> Starts an unnumbered subsubsection. +<li><tt>\</H4\></tt> Ends an unnumbered subsubsection. +<li><tt>\<H5\></tt> Starts an unnumbered subsubsection. +<li><tt>\</H5\></tt> Ends an unnumbered subsubsection. +<li><tt>\<H6\></tt> Starts an unnumbered subsubsection. +<li><tt>\</H6\></tt> Ends an unnumbered subsubsection. <li><tt>\<I\></tt> Starts a piece of text displayed in an italic font. -<li><tt>\<INPUT\></tt> Does not generate any output. <li><tt>\</I\></tt> Ends a <tt>\<I\></tt> section. -<li><tt>\<IMG\></tt> This command is written with attributes to the HTML output only. +<li><tt>\<IMG SRC="..." ...\></tt> This command is written with its attributes to the HTML output only. The SRC attribute is mandatory. <li><tt>\<LI\></tt> Starts a new list item. <li><tt>\</LI\></tt> Ends a list item. -<li><tt>\<META\></tt> Does not generate any output. -<li><tt>\<MULTICOL\></tt> ignored by doxygen. -<li><tt>\</MUTLICOL\></tt> ignored by doxygen. <li><tt>\<OL\></tt> Starts a numbered item list. <li><tt>\</OL\></tt> Ends a numbered item list. <li><tt>\<P\></tt> Starts a new paragraph. diff --git a/doc/install.doc b/doc/install.doc index 1219b7c..9648ade 100644 --- a/doc/install.doc +++ b/doc/install.doc @@ -272,7 +272,7 @@ or <a href="http://www.mingw.org/">MinGW</a>. The next step is to install modern versions of \c bison and \c flex (see http://sourceforge.net/projects/winflexbison. After installation and adding them to your `path` rename `win_flex.exe` to `flex.exe` and `win_bison.exe` to `bison.exe`) -Furthermore you have to install \c python (version 2, see http://www.python.org). +Furthermore you have to install \c python (version 2.6 or higher, see http://www.python.org). These packages are needed during the compilation process if you use a GitHub snapshot of doxygen (the official source releases come with pre-generated sources). @@ -556,6 +556,7 @@ open-source tools: <li>GNU bison version 2.5 (Linux) and 2.3 (MacOSX) <li>GNU make version 3.81 <li>Perl version 5.12 +<li>Python version 2.7 and 3.4 <li>TeX Live 2009 (or later) </ul> diff --git a/doc/translator.py b/doc/translator.py index 2e2a200..19277be 100644 --- a/doc/translator.py +++ b/doc/translator.py @@ -1,2029 +1,2003 @@ -"""Script to generate reports on translator classes from Doxygen sources. - - The main purpose of the script is to extract the information from sources - related to internationalization (the translator classes). It uses the - information to generate documentation (language.doc, - translator_report.txt) from templates (language.tpl, maintainers.txt). - - Simply run the script without parameters to get the reports and - documentation for all supported languages. If you want to generate the - translator report only for some languages, pass their codes as arguments - to the script. In that case, the language.doc will not be generated. - Example: - - python translator.py en nl cz - - Originally, the script was written in Perl and was known as translator.pl. - The last Perl version was dated 2002/05/21 (plus some later corrections) - - Petr Prikryl (prikryl at atlas dot cz) - - History: - -------- - 2002/05/21 - This was the last Perl version. - 2003/05/16 - List of language marks can be passed as arguments. - 2004/01/24 - Total reimplementation started: classes TrManager, and Transl. - 2004/02/05 - First version that produces translator report. No language.doc yet. - 2004/02/10 - First fully functional version that generates both the translator - report and the documentation. It is a bit slower than the - Perl version, but is much less tricky and much more flexible. - It also solves some problems that were not solved by the Perl - version. The translator report content should be more useful - for developers. - 2004/02/11 - Some tuning-up to provide more useful information. - 2004/04/16 - Added new tokens to the tokenizer (to remove some warnings). - 2004/05/25 - Added from __future__ import generators not to force Python 2.3. - 2004/06/03 - Removed dependency on textwrap module. - 2004/07/07 - Fixed the bug in the fill() function. - 2004/07/21 - Better e-mail mangling for HTML part of language.doc. - - Plural not used for reporting a single missing method. - - Removal of not used translator adapters is suggested only - when the report is not restricted to selected languages - explicitly via script arguments. - 2004/07/26 - Better reporting of not-needed adapters. - 2004/10/04 - Reporting of not called translator methods added. - 2004/10/05 - Modified to check only doxygen/src sources for the previous report. - 2005/02/28 - Slight modification to generate "mailto.txt" auxiliary file. - 2005/08/15 - Doxygen's root directory determined primarily from DOXYGEN - environment variable. When not found, then relatively to the script. - 2007/03/20 - The "translate me!" searched in comments and reported if found. - 2008/06/09 - Warning when the MAX_DOT_GRAPH_HEIGHT is still part of trLegendDocs(). - 2009/05/09 - Changed HTML output to fit it with XHTML DTD - 2009/09/02 - Added percentage info to the report (implemented / to be implemented). - 2010/02/09 - Added checking/suggestion 'Reimplementation using UTF-8 suggested. - 2010/03/03 - Added [unreachable] prefix used in maintainers.txt. - 2010/05/28 - BOM skipped; minor code cleaning. - 2010/05/31 - e-mail mangled already in maintainers.txt - 2010/08/20 - maintainers.txt to UTF-8, related processin of unicode strings - - [any mark] introduced instead of [unreachable] only - - marks hihglighted in HTML - 2010/08/30 - Highlighting in what will be the table in langhowto.html modified. - 2010/09/27 - The underscore in \latexonly part of the generated language.doc - was prefixed by backslash (was LaTeX related error). - 2013/02/19 - Better diagnostics when translator_xx.h is too crippled. - 2013/06/25 - TranslatorDecoder checks removed after removing the class. - 2013/09/04 - Coloured status in langhowto. *ALMOST up-to-date* category - of translators introduced. - """ - -from __future__ import generators -import codecs -import os -import re -import sys - - -def fill(s): - """Returns string formated to the wrapped paragraph multiline string. - - Replaces whitespaces by one space and then uses he textwrap.fill().""" - - # Replace all whitespace by spaces, remove whitespaces that are not - # necessary, strip the left and right whitespaces, and break the string - # to list of words. - rexWS = re.compile(r'\s+') - lst = rexWS.sub(' ', s).strip().split() - - # If the list is not empty, put the words together and form the lines - # of maximum 70 characters. Build the list of lines. - lines = [] - if lst: - line = lst.pop(0) # no separation space in front of the first word - for word in lst: - if len(line) + len(word) < 70: - line += ' ' + word - else: - lines.append(line) # another full line formed - line = word # next line started - lines.append(line) # the last line - return '\n'.join(lines) - - -# The following function dedent() is the verbatim copy from the textwrap.py -# module. The textwrap.py was introduced in Python 2.3. To make this script -# working also in older Python versions, I have decided to copy it. -# Notice that the textwrap.py is copyrighted: -# -# Copyright (C) 1999-2001 Gregory P. Ward. -# Copyright (C) 2002, 2003 Python Software Foundation. -# Written by Greg Ward <gward@python.net> -# -# The explicit permission to use the code here was sent by Guido van Rossum -# (4th June, 2004). -# -def dedent(text): - """dedent(text : string) -> string - - Remove any whitespace than can be uniformly removed from the left - of every line in `text`. - - This can be used e.g. to make triple-quoted strings line up with - the left edge of screen/whatever, while still presenting it in the - source code in indented form. - - For example: - - def test(): - # end first line with \ to avoid the empty line! - s = '''\ - hello - world - ''' - print repr(s) # prints ' hello\n world\n ' - print repr(dedent(s)) # prints 'hello\n world\n' - """ - lines = text.expandtabs().split('\n') - margin = None - for line in lines: - content = line.lstrip() - if not content: - continue - indent = len(line) - len(content) - if margin is None: - margin = indent - else: - margin = min(margin, indent) - - if margin is not None and margin > 0: - for i in range(len(lines)): - lines[i] = lines[i][margin:] - - return '\n'.join(lines) - - -class Transl: - """One instance is build for each translator. - - The abbreviation of the source file--part after 'translator_'--is used as - the identification of the object. The empty string is used for the - abstract Translator class from translator.h. The other information is - extracted from inside the source file.""" - - def __init__(self, fname, manager): - """Bind to the manager and initialize.""" - - # Store the filename and the reference to the manager object. - self.fname = fname - self.manager = manager - - # The instance is responsible for loading the source file, so it checks - # for its existence and quits if something goes wrong. - if not os.path.isfile(fname): - sys.stderr.write("\a\nFile '%s' not found!\n" % fname) - sys.exit(1) - - # Initialize the other collected information. - self.classId = None - self.baseClassId = None - self.readableStatus = None # 'up-to-date', '1.2.3', '1.3', etc. - self.status = None # '', '1.2.03', '1.3.00', etc. - self.lang = None # like 'Brasilian' - self.langReadable = None # like 'Brasilian Portuguese' - self.note = None # like 'should be cleaned up' - self.prototypeDic = {} # uniPrototype -> prototype - self.translateMeText = 'translate me!' - self.translateMeFlag = False # comments with "translate me!" found - self.txtMAX_DOT_GRAPH_HEIGHT_flag = False # found in string in trLegendDocs() - self.obsoleteMethods = None # list of prototypes to be removed - self.missingMethods = None # list of prototypes to be implemented - self.implementedMethods = None # list of implemented required methods - self.adaptMinClass = None # The newest adapter class that can be used - - def __tokenGenerator(self): - """Generator that reads the file and yields tokens as 4-tuples. - - The tokens have the form (tokenId, tokenString, lineNo). The - last returned token has the form ('eof', None, None). When trying - to access next token afer that, the exception would be raised.""" - - # Set the dictionary for recognizing tokenId for keywords, separators - # and the similar categories. The key is the string to be recognized, - # the value says its token identification. - tokenDic = { 'class': 'class', - 'const': 'const', - 'public': 'public', - 'protected': 'protected', - 'private': 'private', - 'static': 'static', - 'virtual': 'virtual', - ':': 'colon', - ';': 'semic', - ',': 'comma', - '[': 'lsqbra', - ']': 'rsqbra', - '(': 'lpar', - ')': 'rpar', - '{': 'lcurly', - '}': 'rcurly', - '=': 'assign', - '*': 'star', - '&': 'amp', - '+': 'plus', - '-': 'minus', - '!': 'excl', - '?': 'qmark', - '<': 'lt', - '>': 'gt', - "'": 'quot', - '"': 'dquot', - '.': 'dot', - '%': 'perc', - '~': 'tilde', - '^': 'caret', - } - - # Regular expression for recognizing identifiers. - rexId = re.compile(r'^[a-zA-Z]\w*$') - - # Open the file for reading and extracting tokens until the eof. - # Initialize the finite automaton. - f = open(self.fname) - lineNo = 0 - line = '' # init -- see the pos initialization below - linelen = 0 # init - pos = 100 # init -- pos after the end of line - status = 0 - - tokenId = None # init - tokenStr = '' # init -- the characters will be appended. - tokenLineNo = 0 - - while status != 777: - - # Get the next character. Read next line first, if necessary. - if pos < linelen: - c = line[pos] - else: - lineNo += 1 - line = f.readline() - if line.startswith('\xef\xbb\xbf'): - line = line[3:] # skip the BOM - linelen = len(line) - pos = 0 - if line == '': # eof - status = 777 - else: - c = line[pos] - - # Consume the character based on the status - - if status == 0: # basic status - - # This is the initial status. If tokenId is set, yield the - # token here and only here (except when eof is found). - # Initialize the token variables after the yield. - if tokenId: - # If it is an unknown item, it can still be recognized - # here. Keywords and separators are the example. - if tokenId == 'unknown': - if tokenDic.has_key(tokenStr): - tokenId = tokenDic[tokenStr] - elif tokenStr.isdigit(): - tokenId = 'num' - elif rexId.match(tokenStr): - tokenId = 'id' - else: - msg = '\aWarning: unknown token "' + tokenStr + '"' - msg += '\tfound on line %d' % tokenLineNo - msg += ' in "' + self.fname + '".\n' - sys.stderr.write(msg) - - yield (tokenId, tokenStr, tokenLineNo) - - # If it is a comment that contains the self.translateMeText - # string, set the flag -- the situation will be reported. - if tokenId == 'comment' and tokenStr.find(self.translateMeText) >= 0: - self.translateMeFlag = True - - tokenId = None - tokenStr = '' - tokenLineNo = 0 - - # Now process the character. When we just skip it (spaces), - # stay in this status. All characters that will be part of - # some token cause moving to the specific status. And only - # when moving to the status == 0 (or the final state 777), - # the token is yielded. With respect to that the automaton - # behaves as Moore's one (output bound to status). When - # collecting tokens, the automaton is the Mealy's one - # (actions bound to transitions). - if c.isspace(): - pass # just skip whitespace characters - elif c == '/': # Possibly comment starts here, but - tokenId = 'unknown' # it could be only a slash in code. - tokenStr = c - tokenLineNo = lineNo - status = 1 - elif c == '#': - tokenId = 'preproc' # preprocessor directive - tokenStr = c - tokenLineNo = lineNo - status = 5 - elif c == '"': # string starts here - tokenId = 'string' - tokenStr = c - tokenLineNo = lineNo - status = 6 - elif c == "'": # char literal starts here - tokenId = 'charlit' - tokenStr = c - tokenLineNo = lineNo - status = 8 - elif tokenDic.has_key(c): # known one-char token - tokenId = tokenDic[c] - tokenStr = c - tokenLineNo = lineNo - # stay in this state to yield token immediately - else: - tokenId = 'unknown' # totally unknown - tokenStr = c - tokenLineNo = lineNo - status = 333 - - pos += 1 # move position in any case - - elif status == 1: # possibly a comment - if c == '/': # ... definitely the C++ comment - tokenId = 'comment' - tokenStr += c - pos += 1 - status = 2 - elif c == '*': # ... definitely the C comment - tokenId = 'comment' - tokenStr += c - pos += 1 - status = 3 - else: - status = 0 # unrecognized, don't move pos - - elif status == 2: # inside the C++ comment - if c == '\n': # the end of C++ comment - status = 0 # yield the token - else: - tokenStr += c # collect the C++ comment - pos += 1 - - elif status == 3: # inside the C comment - if c == '*': # possibly the end of the C comment - tokenStr += c - status = 4 - else: - tokenStr += c # collect the C comment - pos += 1 - - elif status == 4: # possibly the end of the C comment - if c == '/': # definitely the end of the C comment - tokenStr += c - status = 0 # yield the token - elif c == '*': # more stars inside the comment - tokenStr += c - else: - tokenStr += c # this cannot be the end of comment - status = 3 - pos += 1 - - elif status == 5: # inside the preprocessor directive - if c == '\n': # the end of the preproc. command - status = 0 # yield the token - else: - tokenStr += c # collect the preproc - pos += 1 - - elif status == 6: # inside the string - if c == '\\': # escaped char inside the string - tokenStr += c - status = 7 - elif c == '"': # end of the string - tokenStr += c - status = 0 - else: - tokenStr += c # collect the chars of the string - pos += 1 - - elif status == 7: # escaped char inside the string - tokenStr += c # collect the char of the string - status = 6 - pos += 1 - - elif status == 8: # inside the char literal - tokenStr += c # collect the char of the literal - status = 9 - pos += 1 - - elif status == 9: # end of char literal expected - if c == "'": # ... and found - tokenStr += c - status = 0 - pos += 1 - else: - tokenId = 'error' # end of literal was expected - tokenStr += c - status = 0 - - elif status == 333: # start of the unknown token - if c.isspace(): - pos += 1 - status = 0 # tokenId may be determined later - elif tokenDic.has_key(c): # separator, don't move pos - status = 0 - else: - tokenStr += c # collect - pos += 1 - - # We should have finished in the final status. If some token - # have been extracted, yield it first. - assert(status == 777) - if tokenId: - yield (tokenId, tokenStr, tokenLineNo) - tokenId = None - tokenStr = '' - tokenLineNo = 0 - - # The file content is processed. Close the file. Then always yield - # the eof token. - f.close() - yield ('eof', None, None) - - - def __collectClassInfo(self, tokenIterator): - """Collect the information about the class and base class. - - The tokens including the opening left curly brace of the class are - consumed.""" - - status = 0 # initial state - - while status != 777: # final state - - # Always assume that the previous tokens were processed. Get - # the next one. - tokenId, tokenStr, tokenLineNo = tokenIterator.next() - - # Process the token and never return back. - if status == 0: # waiting for the 'class' keyword. - if tokenId == 'class': - status = 1 - - elif status == 1: # expecting the class identification - if tokenId == 'id': - self.classId = tokenStr - status = 2 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 2: # expecting the curly brace or base class info - if tokenId == 'lcurly': - status = 777 # correctly finished - elif tokenId == 'colon': - status = 3 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 3: # expecting the 'public' in front of base class id - if tokenId == 'public': - status = 4 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 4: # expecting the base class id - if tokenId == 'id': - self.baseClassId = tokenStr - status = 5 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 5: # expecting the curly brace and quitting - if tokenId == 'lcurly': - status = 777 # correctly finished - elif tokenId == 'comment': - pass - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - # Extract the status of the TranslatorXxxx class. The readable form - # will be used in reports the status form is a string that can be - # compared lexically (unified length, padding with zeros, etc.). - if self.baseClassId: - lst = self.baseClassId.split('_') - if lst[0] == 'Translator': - self.readableStatus = 'up-to-date' - self.status = '' - elif lst[0] == 'TranslatorAdapter': - self.status = lst[1] + '.' + lst[2] - self.readableStatus = self.status - if len(lst) > 3: # add the last part of the number - self.status += '.' + ('%02d' % int(lst[3])) - self.readableStatus += '.' + lst[3] - else: - self.status += '.00' - elif lst[0] == 'TranslatorEnglish': - # Obsolete or Based on English. - if self.classId[-2:] == 'En': - self.readableStatus = 'English based' - self.status = 'En' - else: - self.readableStatus = 'obsolete' - self.status = '0.0.00' - - # Check whether status was set, or set 'strange'. - if self.status == None: - self.status = 'strange' - if not self.readableStatus: - self.readableStatus = 'strange' - - # Extract the name of the language and the readable form. - self.lang = self.classId[10:] # without 'Translator' - if self.lang == 'Brazilian': - self.langReadable = 'Brazilian Portuguese' - elif self.lang == 'Chinesetraditional': - self.langReadable = 'Chinese Traditional' - else: - self.langReadable = self.lang - - - def __unexpectedToken(self, status, tokenId, tokenLineNo): - """Reports unexpected token and quits with exit code 1.""" - - import inspect - calledFrom = inspect.stack()[1][3] - msg = "\a\nUnexpected token '%s' on the line %d in '%s'.\n" - msg = msg % (tokenId, tokenLineNo, self.fname) - msg += 'status = %d in %s()\n' % (status, calledFrom) - sys.stderr.write(msg) - sys.exit(1) - - - def collectPureVirtualPrototypes(self): - """Returns dictionary 'unified prototype' -> 'full prototype'. - - The method is expected to be called only for the translator.h. It - extracts only the pure virtual method and build the dictionary where - key is the unified prototype without argument identifiers.""" - - # Prepare empty dictionary that will be returned. - resultDic = {} - - # Start the token generator which parses the class source file. - tokenIterator = self.__tokenGenerator() - - # Collect the class and the base class identifiers. - self.__collectClassInfo(tokenIterator) - assert(self.classId == 'Translator') - - # Let's collect readable form of the public virtual pure method - # prototypes in the readable form -- as defined in translator.h. - # Let's collect also unified form of the same prototype that omits - # everything that can be omitted, namely 'virtual' and argument - # identifiers. - prototype = '' # readable prototype (with everything) - uniPrototype = '' # unified prototype (without arg. identifiers) - - # Collect the pure virtual method prototypes. Stop on the closing - # curly brace followed by the semicolon (end of class). - status = 0 - curlyCnt = 0 # counter for the level of curly braces - - # Loop until the final state 777 is reached. The errors are processed - # immediately. In this implementation, it always quits the application. - while status != 777: - - # Get the next token. - tokenId, tokenStr, tokenLineNo = tokenIterator.next() - - if status == 0: # waiting for 'public:' - if tokenId == 'public': - status = 1 - - elif status == 1: # colon after the 'public' - if tokenId == 'colon': - status = 2 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 2: # waiting for 'virtual' - if tokenId == 'virtual': - prototype = tokenStr # but not to unified prototype - status = 3 - elif tokenId == 'comment': - pass - elif tokenId == 'rcurly': - status = 11 # expected end of class - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 3: # return type of the method expected - if tokenId == 'id': - prototype += ' ' + tokenStr - uniPrototype = tokenStr # start collecting the unified prototype - status = 4 - elif tokenId == 'tilde': - status = 4 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 4: # method identifier expected - if tokenId == 'id': - prototype += ' ' + tokenStr - uniPrototype += ' ' + tokenStr - status = 5 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 5: # left bracket of the argument list expected - if tokenId == 'lpar': - prototype += tokenStr - uniPrototype += tokenStr - status = 6 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 6: # collecting arguments of the method - if tokenId == 'rpar': - prototype += tokenStr - uniPrototype += tokenStr - status = 7 - elif tokenId == 'const': - prototype += tokenStr - uniPrototype += tokenStr - status = 12 - elif tokenId == 'id': # type identifier - prototype += tokenStr - uniPrototype += tokenStr - status = 13 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 7: # assignment expected or left curly brace - if tokenId == 'assign': - status = 8 - elif tokenId == 'lcurly': - curlyCnt = 1 # method body entered - status = 10 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 8: # zero expected - if tokenId == 'num' and tokenStr == '0': - status = 9 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 9: # after semicolon, produce the dic item - if tokenId == 'semic': - assert(not resultDic.has_key(uniPrototype)) - resultDic[uniPrototype] = prototype - status = 2 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 10: # consuming the body of the method - if tokenId == 'rcurly': - curlyCnt -= 1 - if curlyCnt == 0: - status = 2 # body consumed - elif tokenId == 'lcurly': - curlyCnt += 1 - - elif status == 11: # probably the end of class - if tokenId == 'semic': - status = 777 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 12: # type id for argument expected - if tokenId == 'id': - prototype += ' ' + tokenStr - uniPrototype += ' ' + tokenStr - status = 13 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 13: # namespace qualification or * or & expected - if tokenId == 'colon': # was namespace id - prototype += tokenStr - uniPrototype += tokenStr - status = 14 - elif tokenId == 'star' or tokenId == 'amp': # pointer or reference - prototype += ' ' + tokenStr - uniPrototype += ' ' + tokenStr - status = 16 - elif tokenId == 'id': # argument identifier - prototype += ' ' + tokenStr - # don't put this into unified prototype - status = 17 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 14: # second colon for namespace:: expected - if tokenId == 'colon': - prototype += tokenStr - uniPrototype += tokenStr - status = 15 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 15: # type after namespace:: expected - if tokenId == 'id': - prototype += tokenStr - uniPrototype += tokenStr - status = 13 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 16: # argument identifier expected - if tokenId == 'id': - prototype += ' ' + tokenStr - # don't put this into unified prototype - status = 17 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 17: # comma or ')' after argument identifier expected - if tokenId == 'comma': - prototype += ', ' - uniPrototype += ', ' - status = 6 - elif tokenId == 'rpar': - prototype += tokenStr - uniPrototype += tokenStr - status = 7 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - # Eat the rest of the source to cause closing the file. - while tokenId != 'eof': - tokenId, tokenStr, tokenLineNo = tokenIterator.next() - - # Return the resulting dictionary with 'uniPrototype -> prototype'. - return resultDic - - - def __collectPublicMethodPrototypes(self, tokenIterator): - """Collects prototypes of public methods and fills self.prototypeDic. - - The dictionary is filled by items: uniPrototype -> prototype. - The method is expected to be called only for TranslatorXxxx classes, - i.e. for the classes that implement translation to some language. - It assumes that the openning curly brace of the class was already - consumed. The source is consumed until the end of the class. - The caller should consume the source until the eof to cause closing - the source file.""" - - assert(self.classId != 'Translator') - assert(self.baseClassId != None) - - # The following finite automaton slightly differs from the one - # inside self.collectPureVirtualPrototypes(). It produces the - # dictionary item just after consuming the body of the method - # (transition from from state 10 to state 2). It also does not allow - # definitions of public pure virtual methods, except for - # TranslatorAdapterBase (states 8 and 9). Argument identifier inside - # method argument lists can be omitted or commented. - # - # Let's collect readable form of all public method prototypes in - # the readable form -- as defined in the source file. - # Let's collect also unified form of the same prototype that omits - # everything that can be omitted, namely 'virtual' and argument - # identifiers. - prototype = '' # readable prototype (with everything) - uniPrototype = '' # unified prototype (without arg. identifiers) - warning = '' # warning message -- if something special detected - methodId = None # processed method id - - # Collect the method prototypes. Stop on the closing - # curly brace followed by the semicolon (end of class). - status = 0 - curlyCnt = 0 # counter for the level of curly braces - - # Loop until the final state 777 is reached. The errors are processed - # immediately. In this implementation, it always quits the application. - while status != 777: - - # Get the next token. - tokenId, tokenStr, tokenLineNo = tokenIterator.next() - - if status == 0: # waiting for 'public:' - if tokenId == 'public': - status = 1 - elif tokenId == 'eof': # non-public things until the eof - status = 777 - - elif status == 1: # colon after the 'public' - if tokenId == 'colon': - status = 2 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 2: # waiting for 'virtual' (can be omitted) - if tokenId == 'virtual': - prototype = tokenStr # but not to unified prototype - status = 3 - elif tokenId == 'id': # 'virtual' was omitted - prototype = tokenStr - uniPrototype = tokenStr # start collecting the unified prototype - status = 4 - elif tokenId == 'comment': - pass - elif tokenId == 'protected' or tokenId == 'private': - status = 0 - elif tokenId == 'rcurly': - status = 11 # expected end of class - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 3: # return type of the method expected - if tokenId == 'id': - prototype += ' ' + tokenStr - uniPrototype = tokenStr # start collecting the unified prototype - status = 4 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 4: # method identifier expected - if tokenId == 'id': - prototype += ' ' + tokenStr - uniPrototype += ' ' + tokenStr - methodId = tokenStr # for reporting - status = 5 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 5: # left bracket of the argument list expected - if tokenId == 'lpar': - prototype += tokenStr - uniPrototype += tokenStr - status = 6 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 6: # collecting arguments of the method - if tokenId == 'rpar': - prototype += tokenStr - uniPrototype += tokenStr - status = 7 - elif tokenId == 'const': - prototype += tokenStr - uniPrototype += tokenStr - status = 12 - elif tokenId == 'id': # type identifier - prototype += tokenStr - uniPrototype += tokenStr - status = 13 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 7: # left curly brace expected - if tokenId == 'lcurly': - curlyCnt = 1 # method body entered - status = 10 - elif tokenId == 'comment': - pass - elif tokenId == 'assign': # allowed only for TranslatorAdapterBase - assert(self.classId == 'TranslatorAdapterBase') - status = 8 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 8: # zero expected (TranslatorAdapterBase) - assert(self.classId == 'TranslatorAdapterBase') - if tokenId == 'num' and tokenStr == '0': - status = 9 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 9: # after semicolon (TranslatorAdapterBase) - assert(self.classId == 'TranslatorAdapterBase') - if tokenId == 'semic': - status = 2 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 10: # consuming the body of the method, then dic item - if tokenId == 'rcurly': - curlyCnt -= 1 - if curlyCnt == 0: - # Check for possible copy/paste error when name - # of the method was not corrected (i.e. the same - # name already exists). - if uniPrototype in self.prototypeDic: - msg = "'%s' prototype found again (duplicity)\n" - msg += "in '%s'.\n" % self.fname - msg = msg % uniPrototype - sys.stderr.write(msg) - assert False - - assert(not self.prototypeDic.has_key(uniPrototype)) - # Insert new dictionary item. - self.prototypeDic[uniPrototype] = prototype - status = 2 # body consumed - methodId = None # outside of any method - elif tokenId == 'lcurly': - curlyCnt += 1 - - # Warn in special case. - elif methodId == 'trLegendDocs' and tokenId == 'string' \ - and tokenStr.find('MAX_DOT_GRAPH_HEIGHT') >= 0: - self.txtMAX_DOT_GRAPH_HEIGHT_flag = True - - - elif status == 11: # probably the end of class - if tokenId == 'semic': - status = 777 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 12: # type id for argument expected - if tokenId == 'id': - prototype += ' ' + tokenStr - uniPrototype += ' ' + tokenStr - status = 13 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 13: # :: or * or & or id or ) expected - if tokenId == 'colon': # was namespace id - prototype += tokenStr - uniPrototype += tokenStr - status = 14 - elif tokenId == 'star' or tokenId == 'amp': # pointer or reference - prototype += ' ' + tokenStr - uniPrototype += ' ' + tokenStr - status = 16 - elif tokenId == 'id': # argument identifier - prototype += ' ' + tokenStr - # don't put this into unified prototype - status = 17 - elif tokenId == 'comment': # probably commented-out identifier - prototype += tokenStr - elif tokenId == 'rpar': - prototype += tokenStr - uniPrototype += tokenStr - status = 7 - elif tokenId == 'comma': - prototype += ', ' - uniPrototype += ', ' - status = 6 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 14: # second colon for namespace:: expected - if tokenId == 'colon': - prototype += tokenStr - uniPrototype += tokenStr - status = 15 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 15: # type after namespace:: expected - if tokenId == 'id': - prototype += tokenStr - uniPrototype += tokenStr - status = 13 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 16: # argument identifier or ) expected - if tokenId == 'id': - prototype += ' ' + tokenStr - # don't put this into unified prototype - status = 17 - elif tokenId == 'rpar': - prototype += tokenStr - uniPrototype += tokenStr - status = 7 - elif tokenId == 'comment': - prototype += tokenStr - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - elif status == 17: # comma or ')' after argument identifier expected - if tokenId == 'comma': - prototype += ', ' - uniPrototype += ', ' - status = 6 - elif tokenId == 'rpar': - prototype += tokenStr - uniPrototype += tokenStr - status = 7 - else: - self.__unexpectedToken(status, tokenId, tokenLineNo) - - - - def collectAdapterPrototypes(self): - """Returns the dictionary of prototypes implemented by adapters. - - It is created to process the translator_adapter.h. The returned - dictionary has the form: unifiedPrototype -> (version, classId) - thus by looking for the prototype, we get the information what is - the newest (least adapting) adapter that is sufficient for - implementing the method.""" - - # Start the token generator which parses the class source file. - assert(os.path.split(self.fname)[1] == 'translator_adapter.h') - tokenIterator = self.__tokenGenerator() - - # Get the references to the involved dictionaries. - reqDic = self.manager.requiredMethodsDic - - # Create the empty dictionary that will be returned. - adaptDic = {} - - - # Loop through the source of the adapter file until no other adapter - # class is found. - while True: - try: - # Collect the class and the base class identifiers. - self.__collectClassInfo(tokenIterator) - - # Extract the comparable version of the adapter class. - # Note: The self.status as set by self.__collectClassInfo() - # contains similar version, but is related to the base class, - # not to the class itself. - lst = self.classId.split('_') - version = '' - if lst[0] == 'TranslatorAdapter': # TranslatorAdapterBase otherwise - version = lst[1] + '.' + lst[2] - if len(lst) > 3: # add the last part of the number - version += '.' + ('%02d' % int(lst[3])) - else: - version += '.00' - - # Collect the prototypes of implemented public methods. - self.__collectPublicMethodPrototypes(tokenIterator) - - # For the required methods, update the dictionary of methods - # implemented by the adapter. - for protoUni in self.prototypeDic: - if reqDic.has_key(protoUni): - # This required method will be marked as implemented - # by this adapter class. This implementation assumes - # that newer adapters do not reimplement any required - # methods already implemented by older adapters. - assert(not adaptDic.has_key(protoUni)) - adaptDic[protoUni] = (version, self.classId) - - # Clear the dictionary object and the information related - # to the class as the next adapter class is to be processed. - self.prototypeDic.clear() - self.classId = None - self.baseClassId = None - - except StopIteration: - break - - # Return the result dictionary. - return adaptDic - - - def processing(self): - """Processing of the source file -- only for TranslatorXxxx classes.""" - - # Start the token generator which parses the class source file. - tokenIterator = self.__tokenGenerator() - - # Collect the class and the base class identifiers. - self.__collectClassInfo(tokenIterator) - assert(self.classId != 'Translator') - assert(self.classId[:17] != 'TranslatorAdapter') - - # Collect the prototypes of implemented public methods. - self.__collectPublicMethodPrototypes(tokenIterator) - - # Eat the rest of the source to cause closing the file. - while True: - try: - t = tokenIterator.next() - except StopIteration: - break - - # Shorthands for the used dictionaries. - reqDic = self.manager.requiredMethodsDic - adaptDic = self.manager.adaptMethodsDic - myDic = self.prototypeDic - - # Build the list of obsolete methods. - self.obsoleteMethods = [] - for p in myDic: - if not reqDic.has_key(p): - self.obsoleteMethods.append(p) - - # Build the list of missing methods and the list of implemented - # required methods. - self.missingMethods = [] - self.implementedMethods = [] - for p in reqDic: - if myDic.has_key(p): - self.implementedMethods.append(p) - else: - self.missingMethods.append(p) - - # Check whether adapter must be used or suggest the newest one. - # Change the status and set the note accordingly. - if self.baseClassId != 'Translator': - if not self.missingMethods: - self.note = 'Change the base class to Translator.' - self.status = '' - self.readableStatus = 'almost up-to-date' - elif self.baseClassId != 'TranslatorEnglish': - # The translator uses some of the adapters. - # Look at the missing methods and check what adapter - # implements them. Remember the one with the lowest version. - adaptMinVersion = '9.9.99' - adaptMinClass = 'TranslatorAdapter_9_9_99' - for uniProto in self.missingMethods: - if adaptDic.has_key(uniProto): - version, cls = adaptDic[uniProto] - if version < adaptMinVersion: - adaptMinVersion = version - adaptMinClass = cls - - # Test against the current status -- preserve the self.status. - # Possibly, the translator implements enough methods to - # use some newer adapter. - status = self.status - - # If the version of the used adapter is smaller than - # the required, set the note and update the status as if - # the newer adapter was used. - if adaptMinVersion > status: - self.note = 'Change the base class to %s.' % adaptMinClass - self.status = adaptMinVersion - self.adaptMinClass = adaptMinClass - self.readableStatus = adaptMinVersion # simplified - - # If everything seems OK, some explicit warning flags still could - # be set. - if not self.note and self.status == '' and \ - (self.translateMeFlag or self.txtMAX_DOT_GRAPH_HEIGHT_flag): - self.note = '' - if self.translateMeFlag: - self.note += 'The "%s" found in a comment.' % self.translateMeText - if self.note != '': - self.note += '\n\t\t' - if self.txtMAX_DOT_GRAPH_HEIGHT_flag: - self.note += 'The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs()' - - # If everything seems OK, but there are obsolete methods, set - # the note to clean-up source. This note will be used only when - # the previous code did not set another note (priority). - if not self.note and self.status == '' and self.obsoleteMethods: - self.note = 'Remove the obsolete methods (never used).' - - # If there is at least some note but the status suggests it is - # otherwise up-to-date, mark is as ALMOST up-to-date. - if self.note and self.status == '': - self.readableStatus = 'almost up-to-date' - - - def report(self, fout): - """Returns the report part for the source as a multiline string. - - No output for up-to-date translators without problem.""" - - # If there is nothing to report, return immediately. - if self.status == '' and not self.note: - return - - # Report the number of not implemented methods. - fout.write('\n\n\n') - fout.write(self.classId + ' (' + self.baseClassId + ')') - percentImplemented = 100 # init - allNum = len(self.manager.requiredMethodsDic) - if self.missingMethods: - num = len(self.missingMethods) - percentImplemented = 100 * (allNum - num) / allNum - fout.write(' %d' % num) - fout.write(' method') - if num > 1: - fout.write('s') - fout.write(' to implement (%d %%)' % (100 * num / allNum)) - fout.write('\n' + '-' * len(self.classId)) - - # Write the info about the implemented required methods. - fout.write('\n\n Implements %d' % len(self.implementedMethods)) - fout.write(' of the required methods (%d %%).' % percentImplemented) - - # Report the missing method, but only when it is not English-based - # translator. - if self.missingMethods and self.status != 'En': - fout.write('\n\n Missing methods (should be implemented):\n') - reqDic = self.manager.requiredMethodsDic - for p in self.missingMethods: - fout.write('\n ' + reqDic[p]) - - # Always report obsolete methods. - if self.obsoleteMethods: - fout.write('\n\n Obsolete methods (should be removed, never used):\n') - myDic = self.prototypeDic - for p in self.obsoleteMethods: - fout.write('\n ' + myDic[p]) - - # For English-based translator, report the implemented methods. - if self.status == 'En' and self.implementedMethods: - fout.write('\n\n This English-based translator implements ') - fout.write('the following methods:\n') - reqDic = self.manager.requiredMethodsDic - for p in self.implementedMethods: - fout.write('\n ' + reqDic[p]) - - - def getmtime(self): - """Returns the last modification time of the source file.""" - assert(os.path.isfile(self.fname)) - return os.path.getmtime(self.fname) - - -class TrManager: - """Collects basic info and builds subordinate Transl objects.""" - - def __init__(self): - """Determines paths, creates and initializes structures. - - The arguments of the script may explicitly say what languages should - be processed. Write the two letter identifications that are used - for composing the source filenames, so... - - python translator.py cz - - this will process only translator_cz.h source. - """ - - # Determine the path to the script and its name. - self.script = os.path.abspath(sys.argv[0]) - self.script_path, self.script_name = os.path.split(self.script) - self.script_path = os.path.abspath(self.script_path) - - # Determine the absolute path to the Doxygen's root subdirectory. - # If DOXYGEN environment variable is not found, the directory is - # determined from the path of the script. - doxy_default = os.path.join(self.script_path, '..') - self.doxy_path = os.path.abspath(os.getenv('DOXYGEN', doxy_default)) - - # Get the explicit arguments of the script. - self.script_argLst = sys.argv[1:] - - # Build the path names based on the Doxygen's root knowledge. - self.doc_path = os.path.join(self.doxy_path, 'doc') - self.src_path = os.path.join(self.doxy_path, 'src') - - # Create the empty dictionary for Transl object identitied by the - # class identifier of the translator. - self.__translDic = {} - - # Create the None dictionary of required methods. The key is the - # unified prototype, the value is the full prototype. Set inside - # the self.__build(). - self.requiredMethodsDic = None - - # Create the empty dictionary that says what method is implemented - # by what adapter. - self.adaptMethodsDic = {} - - # The last modification time will capture the modification of this - # script, of the translator.h, of the translator_adapter.h (see the - # self.__build() for the last two) of all the translator_xx.h files - # and of the template for generating the documentation. So, this - # time can be compared with modification time of the generated - # documentation to decide, whether the doc should be re-generated. - self.lastModificationTime = os.path.getmtime(self.script) - - # Set the names of the translator report text file, of the template - # for generating "Internationalization" document, for the generated - # file itself, and for the maintainers list. - self.translatorReportFileName = 'translator_report.txt' - self.maintainersFileName = 'maintainers.txt' - self.languageTplFileName = 'language.tpl' - self.languageDocFileName = 'language.doc' - - # The information about the maintainers will be stored - # in the dictionary with the following name. - self.__maintainersDic = None - - # Define the other used structures and variables for information. - self.langLst = None # including English based - self.supportedLangReadableStr = None # coupled En-based as a note - self.numLang = None # excluding coupled En-based - self.doxVersion = None # Doxygen version - - # Build objects where each one is responsible for one translator. - self.__build() - - - def __build(self): - """Find the translator files and build the objects for translators.""" - - # The translator.h must exist (the Transl object will check it), - # create the object for it and let it build the dictionary of - # required methods. - tr = Transl(os.path.join(self.src_path, 'translator.h'), self) - self.requiredMethodsDic = tr.collectPureVirtualPrototypes() - tim = tr.getmtime() - if tim > self.lastModificationTime: - self.lastModificationTime = tim - - # The translator_adapter.h must exist (the Transl object will check it), - # create the object for it and store the reference in the dictionary. - tr = Transl(os.path.join(self.src_path, 'translator_adapter.h'), self) - self.adaptMethodsDic = tr.collectAdapterPrototypes() - tim = tr.getmtime() - if tim > self.lastModificationTime: - self.lastModificationTime = tim - - # Create the list of the filenames with language translator sources. - # If the explicit arguments of the script were typed, process only - # those files. - if self.script_argLst: - lst = ['translator_' + x + '.h' for x in self.script_argLst] - for fname in lst: - if not os.path.isfile(os.path.join(self.src_path, fname)): - sys.stderr.write("\a\nFile '%s' not found!\n" % fname) - sys.exit(1) - else: - lst = os.listdir(self.src_path) - lst = filter(lambda x: x[:11] == 'translator_' - and x[-2:] == '.h' - and x != 'translator_adapter.h', lst) - - # Build the object for the translator_xx.h files, and process the - # content of the file. Then insert the object to the dictionary - # accessed via classId. - for fname in lst: - fullname = os.path.join(self.src_path, fname) - tr = Transl(fullname, self) - tr.processing() - assert(tr.classId != 'Translator') - self.__translDic[tr.classId] = tr - - # Extract the global information of the processed info. - self.__extractProcessedInfo() - - - def __extractProcessedInfo(self): - """Build lists and strings of the processed info.""" - - # Build the auxiliary list with strings compound of the status, - # readable form of the language, and classId. - statLst = [] - for obj in self.__translDic.values(): - assert(obj.classId != 'Translator') - s = obj.status + '|' + obj.langReadable + '|' + obj.classId - statLst.append(s) - - # Sort the list and extract the object identifiers (classId's) for - # the up-to-date translators and English-based translators. - statLst.sort() - self.upToDateIdLst = [x.split('|')[2] for x in statLst if x[0] == '|'] - self.EnBasedIdLst = [x.split('|')[2] for x in statLst if x[:2] == 'En'] - - # Reverse the list and extract the TranslatorAdapter based translators. - statLst.reverse() - self.adaptIdLst = [x.split('|')[2] for x in statLst if x[0].isdigit()] - - # Build the list of tuples that contain (langReadable, obj). - # Sort it by readable name. - self.langLst = [] - for obj in self.__translDic.values(): - self.langLst.append((obj.langReadable, obj)) - self.langLst.sort(lambda a, b: cmp(a[0], b[0])) - - # Create the list with readable language names. If the language has - # also the English-based version, modify the item by appending - # the note. Number of the supported languages is equal to the length - # of the list. - langReadableLst = [] - for name, obj in self.langLst: - if obj.status == 'En': continue - - # Append the 'En' to the classId to possibly obtain the classId - # of the English-based object. If the object exists, modify the - # name for the readable list of supported languages. - classIdEn = obj.classId + 'En' - if self.__translDic.has_key(classIdEn): - name += ' (+En)' - - # Append the result name of the language, possibly with note. - langReadableLst.append(name) - - # Create the multiline string of readable language names, - # with punctuation, wrapped to paragraph. - if len(langReadableLst) == 1: - s = langReadableLst[0] - elif len(langReadableLst) == 2: - s = ' and '.join(langReadableLst) - else: - s = ', '.join(langReadableLst[:-1]) + ', and ' - s += langReadableLst[-1] - - self.supportedLangReadableStr = fill(s + '.') - - # Find the number of the supported languages. The English based - # languages are not counted if the non-English based also exists. - self.numLang = len(self.langLst) - for name, obj in self.langLst: - if obj.status == 'En': - classId = obj.classId[:-2] - if self.__translDic.has_key(classId): - self.numLang -= 1 # the couple will be counted as one - - # Extract the version of Doxygen. - f = open(os.path.join(self.doxy_path, 'VERSION')) - self.doxVersion = f.readline().strip() - f.close() - - # Update the last modification time. - for tr in self.__translDic.values(): - tim = tr.getmtime() - if tim > self.lastModificationTime: - self.lastModificationTime = tim - - - def __getNoTrSourceFilesLst(self): - """Returns the list of sources to be checked. - - All .cpp files and also .h files that do not declare or define - the translator methods are included in the list. The file names - are searched in doxygen/src directory. - """ - files = [] - for item in os.listdir(self.src_path): - # Split the bare name to get the extension. - name, ext = os.path.splitext(item) - ext = ext.lower() - - # Include only .cpp and .h files (case independent) and exclude - # the files where the checked identifiers are defined. - if ext == '.cpp' or (ext == '.h' and name.find('translator') == -1): - fname = os.path.join(self.src_path, item) - assert os.path.isfile(fname) # assumes no directory with the ext - files.append(fname) # full name - return files - - - def __removeUsedInFiles(self, fname, dic): - """Removes items for method identifiers that are found in fname. - - The method reads the content of the file as one string and searches - for all identifiers from dic. The identifiers that were found in - the file are removed from the dictionary. - - Note: If more files is to be checked, the files where most items are - probably used should be checked first and the resulting reduced - dictionary should be used for checking the next files (speed up). - """ - lst_in = dic.keys() # identifiers to be searched for - - # Read content of the file as one string. - assert os.path.isfile(fname) - f = open(fname) - cont = f.read() - f.close() - - # Remove the items for identifiers that were found in the file. - while lst_in: - item = lst_in.pop(0) - if cont.find(item) != -1: - del dic[item] - - - def __checkForNotUsedTrMethods(self): - """Returns the dictionary of not used translator methods. - - The method can be called only after self.requiredMethodsDic has been - built. The stripped prototypes are the values, the method identifiers - are the keys. - """ - # Build the dictionary of the required method prototypes with - # method identifiers used as keys. - trdic = {} - for prototype in self.requiredMethodsDic.keys(): - ri = prototype.split('(')[0] - identifier = ri.split()[1].strip() - trdic[identifier] = prototype - - # Build the list of source files where translator method identifiers - # can be used. - files = self.__getNoTrSourceFilesLst() - - # Loop through the files and reduce the dictionary of id -> proto. - for fname in files: - self.__removeUsedInFiles(fname, trdic) - - # Return the dictionary of not used translator methods. - return trdic - - - def __emails(self, classId): - """Returns the list of maintainer emails. - - The method returns the list of e-mail adresses for the translator - class, but only the addresses that were not marked as [xxx].""" - lst = [] - for m in self.__maintainersDic[classId]: - if not m[1].startswith('['): - email = m[1] - email = email.replace(' at ', '@') # Unmangle the mangled e-mail - email = email.replace(' dot ', '.') - lst.append(email) - return lst - - - def getBgcolorByReadableStatus(self, readableStatus): - if readableStatus == 'up-to-date': - color = '#ccffcc' # green - elif readableStatus.startswith('almost'): - color = '#ffffff' # white - elif readableStatus.startswith('English'): - color = '#ccffcc' # green - elif readableStatus.startswith('1.8'): - color = '#ffffcc' # yellow - elif readableStatus.startswith('1.7'): - color = '#ffcccc' # pink - elif readableStatus.startswith('1.6'): - color = '#ffcccc' # pink - else: - color = '#ff5555' # red - return color - - - def generateTranslatorReport(self): - """Generates the translator report.""" - - output = os.path.join(self.doc_path, self.translatorReportFileName) - - # Open the textual report file for the output. - f = open(output, 'w') - - # Output the information about the version. - f.write('(' + self.doxVersion + ')\n\n') - - # Output the information about the number of the supported languages - # and the list of the languages, or only the note about the explicitly - # given languages to process. - if self.script_argLst: - f.write('The report was generated for the following, explicitly') - f.write(' identified languages:\n\n') - f.write(self.supportedLangReadableStr + '\n\n') - else: - f.write('Doxygen supports the following ') - f.write(str(self.numLang)) - f.write(' languages (sorted alphabetically):\n\n') - f.write(self.supportedLangReadableStr + '\n\n') - - # Write the summary about the status of language translators (how - # many translators) are up-to-date, etc. - s = 'Of them, %d translators are up-to-date, ' % len(self.upToDateIdLst) - s += '%d translators are based on some adapter class, ' % len(self.adaptIdLst) - s += 'and %d are English based.' % len(self.EnBasedIdLst) - f.write(fill(s) + '\n\n') - - # The e-mail addresses of the maintainers will be collected to - # the auxiliary file in the order of translator classes listed - # in the translator report. - fmail = open('mailto.txt', 'w') - - # Write the list of "up-to-date" translator classes. - if self.upToDateIdLst: - s = '''The following translator classes are up-to-date (sorted - alphabetically). This means that they derive from the - Translator class, they implement all %d of the required - methods, and even minor problems were not spotted by the script:''' - s = s % len(self.requiredMethodsDic) - f.write('-' * 70 + '\n') - f.write(fill(s) + '\n\n') - - mailtoLst = [] - for x in self.upToDateIdLst: - obj = self.__translDic[x] - if obj.note is None: - f.write(' ' + obj.classId + '\n') - mailtoLst.extend(self.__emails(obj.classId)) - - fmail.write('up-to-date\n') - fmail.write('; '.join(mailtoLst)) - - - # Write separately the list of "ALMOST up-to-date" translator classes. - s = '''The following translator classes are ALMOST up-to-date (sorted - alphabetically). This means that they derive from the - Translator class, but there still may be some minor problems - listed for them:''' - f.write('\n' + ('-' * 70) + '\n') - f.write(fill(s) + '\n\n') - mailtoLst = [] - for x in self.upToDateIdLst: - obj = self.__translDic[x] - if obj.note is not None: - f.write(' ' + obj.classId + '\t-- ' + obj.note + '\n') - mailtoLst.extend(self.__emails(obj.classId)) - - fmail.write('\n\nalmost up-to-date\n') - fmail.write('; '.join(mailtoLst)) - - # Write the list of the adapter based classes. The very obsolete - # translators that derive from TranslatorEnglish are included. - if self.adaptIdLst: - s = '''The following translator classes need maintenance - (the most obsolete at the end). The other info shows the - estimation of Doxygen version when the class was last - updated and number of methods that must be implemented to - become up-to-date:''' - f.write('\n' + '-' * 70 + '\n') - f.write(fill(s) + '\n\n') - - # Find also whether some adapter classes may be removed. - adaptMinVersion = '9.9.99' - - mailtoLst = [] - numRequired = len(self.requiredMethodsDic) - for x in self.adaptIdLst: - obj = self.__translDic[x] - f.write(' %-30s' % obj.classId) - f.write(' %-6s' % obj.readableStatus) - numimpl = len(obj.missingMethods) - pluralS = '' - if numimpl > 1: pluralS = 's' - percent = 100 * numimpl / numRequired - f.write('\t%2d method%s to implement (%d %%)' % ( - numimpl, pluralS, percent)) - if obj.note: - f.write('\n\tNote: ' + obj.note + '\n') - f.write('\n') - mailtoLst.extend(self.__emails(obj.classId)) # to maintainer - - # Check the level of required adapter classes. - if obj.status != '0.0.00' and obj.status < adaptMinVersion: - adaptMinVersion = obj.status - - fmail.write('\n\ntranslator based\n') - fmail.write('; '.join(mailtoLst)) - - # Set the note if some old translator adapters are not needed - # any more. Do it only when the script is called without arguments, - # i.e. all languages were checked against the needed translator - # adapters. - if not self.script_argLst: - to_remove = {} - for version, adaptClassId in self.adaptMethodsDic.values(): - if version < adaptMinVersion: - to_remove[adaptClassId] = True - - if to_remove: - lst = to_remove.keys() - lst.sort() - plural = len(lst) > 1 - note = 'Note: The adapter class' - if plural: note += 'es' - note += ' ' + ', '.join(lst) - if not plural: - note += ' is' - else: - note += ' are' - note += ' not used and can be removed.' - f.write('\n' + fill(note) + '\n') - - # Write the list of the English-based classes. - if self.EnBasedIdLst: - s = '''The following translator classes derive directly from the - TranslatorEnglish. The class identifier has the suffix 'En' - that says that this is intentional. Usually, there is also - a non-English based version of the translator for - the language:''' - f.write('\n' + '-' * 70 + '\n') - f.write(fill(s) + '\n\n') - - for x in self.EnBasedIdLst: - obj = self.__translDic[x] - f.write(' ' + obj.classId) - f.write('\timplements %d methods' % len(obj.implementedMethods)) - if obj.note: - f.write(' -- ' + obj.note) - f.write('\n') - - # Check for not used translator methods and generate warning if found. - # The check is rather time consuming, so it is not done when report - # is restricted to explicitly given language identifiers. - if not self.script_argLst: - dic = self.__checkForNotUsedTrMethods() - if dic: - s = '''WARNING: The following translator methods are declared - in the Translator class but their identifiers do not appear - in source files. The situation should be checked. The .cpp - files and .h files excluding the '*translator*' files - in doxygen/src directory were simply searched for occurrence - of the method identifiers:''' - f.write('\n' + '=' * 70 + '\n') - f.write(fill(s) + '\n\n') - - keys = dic.keys() - keys.sort() - for key in keys: - f.write(' ' + dic[key] + '\n') - f.write('\n') - - # Write the details for the translators. - f.write('\n' + '=' * 70) - f.write('\nDetails for translators (classes sorted alphabetically):\n') - - cls = self.__translDic.keys() - cls.sort() - - for c in cls: - obj = self.__translDic[c] - assert(obj.classId != 'Translator') - obj.report(f) - - # Close the report file and the auxiliary file with e-mails. - f.close() - fmail.close() - - - def __loadMaintainers(self): - """Load and process the file with the maintainers. - - Fills the dictionary classId -> [(name, e-mail), ...].""" - - fname = os.path.join(self.doc_path, self.maintainersFileName) - - # Include the maintainers file to the group of files checked with - # respect to the modification time. - tim = os.path.getmtime(fname) - if tim > self.lastModificationTime: - self.lastModificationTime = tim - - # Process the content of the maintainers file. - f = codecs.open(fname, 'r', 'utf-8') - inside = False # inside the record for the language - lineReady = True - classId = None - maintainersLst = None - self.__maintainersDic = {} - while lineReady: - line = f.readline() # next line - lineReady = line != '' # when eof, then line == '' - - line = line.strip() # eof should also behave as separator - if line != u'' and line[0] == u'%': # skip the comment line - continue - - if not inside: # if outside of the record - if line != u'': # should be language identifier - classId = line - maintainersLst = [] - inside = True - # Otherwise skip empty line that do not act as separator. - - else: # if inside the record - if line == u'': # separator found - inside = False - else: - # If it is the first maintainer, create the empty list. - if not self.__maintainersDic.has_key(classId): - self.__maintainersDic[classId] = [] - - # Split the information about the maintainer and append - # the tuple. The address may be prefixed '[unreachable]' - # or whatever '[xxx]'. This will be processed later. - lst = line.split(u':', 1) - assert(len(lst) == 2) - t = (lst[0].strip(), lst[1].strip()) - self.__maintainersDic[classId].append(t) - f.close() - - - def generateLanguageDoc(self): - """Checks the modtime of files and generates language.doc.""" - self.__loadMaintainers() - - # Check the last modification time of the template file. It is the - # last file from the group that decide whether the documentation - # should or should not be generated. - fTplName = os.path.join(self.doc_path, self.languageTplFileName) - tim = os.path.getmtime(fTplName) - if tim > self.lastModificationTime: - self.lastModificationTime = tim - - # If the generated documentation exists and is newer than any of - # the source files from the group, do not generate it and quit - # quietly. - fDocName = os.path.join(self.doc_path, self.languageDocFileName) - if os.path.isfile(fDocName): - if os.path.getmtime(fDocName) > self.lastModificationTime: - return - - # The document or does not exist or is older than some of the - # sources. It must be generated again. - # - # Read the template of the documentation, and remove the first - # attention lines. - f = codecs.open(fTplName, 'r', 'utf-8') - doctpl = f.read() - f.close() - - pos = doctpl.find(u'/***') - assert pos != -1 - doctpl = doctpl[pos:] - - # Fill the tplDic by symbols that will be inserted into the - # document template. - tplDic = {} - - s = u'Do not edit this file. It was generated by the %s script.\n * Instead edit %s and %s' % (self.script_name, self.languageTplFileName, self.maintainersFileName) - tplDic['editnote'] = s - - tplDic['doxVersion'] = self.doxVersion - tplDic['supportedLangReadableStr'] = self.supportedLangReadableStr - tplDic['translatorReportFileName'] = self.translatorReportFileName - - ahref = u'<a href="../doc/' + self.translatorReportFileName - ahref += u'"\n><code>doxygen/doc/' + self.translatorReportFileName - ahref += u'</code></a>' - tplDic['translatorReportLink'] = ahref - tplDic['numLangStr'] = str(self.numLang) - - # Define templates for HTML table parts of the documentation. - htmlTableTpl = u'''\ - \\htmlonly - <table align="center" cellspacing="0" cellpadding="0" border="0"> - <tr bgcolor="#000000"> - <td> - <table cellspacing="1" cellpadding="2" border="0"> - <tr bgcolor="#4040c0"> - <td ><b><font size="+1" color="#ffffff"> Language </font></b></td> - <td ><b><font size="+1" color="#ffffff"> Maintainer </font></b></td> - <td ><b><font size="+1" color="#ffffff"> Contact address </font> - <font size="-2" color="#ffffff">(replace the at and dot)</font></b></td> - <td ><b><font size="+1" color="#ffffff"> Status </font></b></td> - </tr> - <!-- table content begin --> - %s - <!-- table content end --> - </table> - </td> - </tr> - </table> - \\endhtmlonly - ''' - htmlTableTpl = dedent(htmlTableTpl) - htmlTrTpl = u'\n <tr bgcolor="#ffffff">%s\n </tr>' - htmlTdTpl = u'\n <td>%s</td>' - htmlTdStatusColorTpl = u'\n <td bgcolor="%s">%s</td>' - - # Loop through transl objects in the order of sorted readable names - # and add generate the content of the HTML table. - trlst = [] - for name, obj in self.langLst: - # Fill the table data elements for one row. The first element - # contains the readable name of the language. Only the oldest - # translator are colour marked in the language columnt. Less - # "heavy" color is used (when compared with the Status column). - if obj.readableStatus.startswith('1.4'): - bkcolor = self.getBgcolorByReadableStatus('1.4') - else: - bkcolor = '#ffffff' - - lst = [ htmlTdStatusColorTpl % (bkcolor, obj.langReadable) ] - - # The next two elements contain the list of maintainers - # and the list of their mangled e-mails. For English-based - # translators that are coupled with the non-English based, - # insert the 'see' note. - mm = None # init -- maintainer - ee = None # init -- e-mail address - if obj.status == 'En': - # Check whether there is the coupled non-English. - classId = obj.classId[:-2] - if classId in self.__translDic: - lang = self.__translDic[classId].langReadable - mm = u'see the %s language' % lang - ee = u' ' - - if not mm and obj.classId in self.__maintainersDic: - # Build a string of names separated by the HTML break element. - # Special notes used instead of names are highlighted. - lm = [] - for maintainer in self.__maintainersDic[obj.classId]: - name = maintainer[0] - if name.startswith(u'--'): - name = u'<span style="color: red; background-color: yellow">'\ - + name + u'</span>' - lm.append(name) - mm = u'<br/>'.join(lm) - - # The marked adresses (they start with the mark '[unreachable]', - # '[resigned]', whatever '[xxx]') will not be displayed at all. - # Only the mark will be used instead. - rexMark = re.compile(ur'(?P<mark>\[.*?\])') - le = [] - for maintainer in self.__maintainersDic[obj.classId]: - address = maintainer[1] - m = rexMark.search(address) - if m is not None: - address = u'<span style="color: brown">'\ - + m.group(u'mark') + u'</span>' - le.append(address) - ee = u'<br/>'.join(le) - - # Append the maintainer and e-mail elements. - lst.append(htmlTdTpl % mm) - lst.append(htmlTdTpl % ee) - - # The last element contains the readable form of the status. - bgcolor = self.getBgcolorByReadableStatus(obj.readableStatus) - lst.append(htmlTdStatusColorTpl % (bgcolor, obj.readableStatus)) - - # Join the table data to one table row. - trlst.append(htmlTrTpl % (''.join(lst))) - - # Join the table rows and insert into the template. - htmlTable = htmlTableTpl % (''.join(trlst)) - - # Define templates for LaTeX table parts of the documentation. - latexTableTpl = ur''' - \latexonly - \footnotesize - \begin{longtable}{|l|l|l|l|} - \hline - {\bf Language} & {\bf Maintainer} & {\bf Contact address} & {\bf Status} \\ - \hline - %s - \hline - \end{longtable} - \normalsize - \endlatexonly - ''' - latexTableTpl = dedent(latexTableTpl) - latexLineTpl = u'\n' + r' %s & %s & {\tt\tiny %s} & %s \\' - - # Loop through transl objects in the order of sorted readable names - # and add generate the content of the LaTeX table. - trlst = [] - for name, obj in self.langLst: - # For LaTeX, more maintainers for the same language are - # placed on separate rows in the table. The line separator - # in the table is placed explicitly above the first - # maintainer. Prepare the arguments for the LaTeX row template. - maintainers = [] - if self.__maintainersDic.has_key(obj.classId): - maintainers = self.__maintainersDic[obj.classId] - - lang = obj.langReadable - maintainer = None # init - email = None # init - if obj.status == 'En': - # Check whether there is the coupled non-English. - classId = obj.classId[:-2] - if classId in self.__translDic: - langNE = self.__translDic[classId].langReadable - maintainer = u'see the %s language' % langNE - email = u'~' - - if not maintainer and (obj.classId in self.__maintainersDic): - lm = [ m[0] for m in self.__maintainersDic[obj.classId] ] - maintainer = maintainers[0][0] - email = maintainers[0][1] - - status = obj.readableStatus - - # Use the template to produce the line of the table and insert - # the hline plus the constructed line into the table content. - # The underscore character must be escaped. - trlst.append(u'\n \\hline') - s = latexLineTpl % (lang, maintainer, email, status) - s = s.replace(u'_', u'\\_') - trlst.append(s) - - # List the other maintainers for the language. Do not set - # lang and status for them. - lang = u'~' - status = u'~' - for m in maintainers[1:]: - maintainer = m[0] - email = m[1] - s = latexLineTpl % (lang, maintainer, email, status) - s = s.replace(u'_', u'\\_') - trlst.append(s) - - # Join the table lines and insert into the template. - latexTable = latexTableTpl % (u''.join(trlst)) - - # Put the HTML and LaTeX parts together and define the dic item. - tplDic['informationTable'] = htmlTable + u'\n' + latexTable - - # Insert the symbols into the document template and write it down. - f = codecs.open(fDocName, 'w', 'utf-8') - f.write(doctpl % tplDic) - f.close() - -if __name__ == '__main__': - - # Create the manager, build the transl objects, and parse the related - # sources. - trMan = TrManager() - - # Generate the language.doc. - trMan.generateLanguageDoc() - - # Generate the translator report. - trMan.generateTranslatorReport() +"""Script to generate reports on translator classes from Doxygen sources.
+
+ The main purpose of the script is to extract the information from sources
+ related to internationalization (the translator classes). It uses the
+ information to generate documentation (language.doc,
+ translator_report.txt) from templates (language.tpl, maintainers.txt).
+
+ Simply run the script without parameters to get the reports and
+ documentation for all supported languages. If you want to generate the
+ translator report only for some languages, pass their codes as arguments
+ to the script. In that case, the language.doc will not be generated.
+ Example:
+
+ python translator.py en nl cz
+
+ Originally, the script was written in Perl and was known as translator.pl.
+ The last Perl version was dated 2002/05/21 (plus some later corrections)
+
+ Petr Prikryl (prikryl at atlas dot cz)
+
+ History:
+ --------
+ 2002/05/21 - This was the last Perl version.
+ 2003/05/16 - List of language marks can be passed as arguments.
+ 2004/01/24 - Total reimplementation started: classes TrManager, and Transl.
+ 2004/02/05 - First version that produces translator report. No language.doc yet.
+ 2004/02/10 - First fully functional version that generates both the translator
+ report and the documentation. It is a bit slower than the
+ Perl version, but is much less tricky and much more flexible.
+ It also solves some problems that were not solved by the Perl
+ version. The translator report content should be more useful
+ for developers.
+ 2004/02/11 - Some tuning-up to provide more useful information.
+ 2004/04/16 - Added new tokens to the tokenizer (to remove some warnings).
+ 2004/05/25 - Added from __future__ import generators not to force Python 2.3.
+ 2004/06/03 - Removed dependency on textwrap module.
+ 2004/07/07 - Fixed the bug in the fill() function.
+ 2004/07/21 - Better e-mail mangling for HTML part of language.doc.
+ - Plural not used for reporting a single missing method.
+ - Removal of not used translator adapters is suggested only
+ when the report is not restricted to selected languages
+ explicitly via script arguments.
+ 2004/07/26 - Better reporting of not-needed adapters.
+ 2004/10/04 - Reporting of not called translator methods added.
+ 2004/10/05 - Modified to check only doxygen/src sources for the previous report.
+ 2005/02/28 - Slight modification to generate "mailto.txt" auxiliary file.
+ 2005/08/15 - Doxygen's root directory determined primarily from DOXYGEN
+ environment variable. When not found, then relatively to the script.
+ 2007/03/20 - The "translate me!" searched in comments and reported if found.
+ 2008/06/09 - Warning when the MAX_DOT_GRAPH_HEIGHT is still part of trLegendDocs().
+ 2009/05/09 - Changed HTML output to fit it with XHTML DTD
+ 2009/09/02 - Added percentage info to the report (implemented / to be implemented).
+ 2010/02/09 - Added checking/suggestion 'Reimplementation using UTF-8 suggested.
+ 2010/03/03 - Added [unreachable] prefix used in maintainers.txt.
+ 2010/05/28 - BOM skipped; minor code cleaning.
+ 2010/05/31 - e-mail mangled already in maintainers.txt
+ 2010/08/20 - maintainers.txt to UTF-8, related processin of unicode strings
+ - [any mark] introduced instead of [unreachable] only
+ - marks hihglighted in HTML
+ 2010/08/30 - Highlighting in what will be the table in langhowto.html modified.
+ 2010/09/27 - The underscore in \latexonly part of the generated language.doc
+ was prefixed by backslash (was LaTeX related error).
+ 2013/02/19 - Better diagnostics when translator_xx.h is too crippled.
+ 2013/06/25 - TranslatorDecoder checks removed after removing the class.
+ 2013/09/04 - Coloured status in langhowto. *ALMOST up-to-date* category
+ of translators introduced.
+ 2014/06/16 - unified for Python 2.6+ and 3.0+
+ """
+
+from __future__ import print_function
+
+import os
+import platform
+import re
+import sys
+import textwrap
+
+
+def xopen(fname, mode='r', encoding='utf-8-sig'):
+ '''Unified file opening for Python 2 an Python 3.
+
+ Python 2 does not have the encoding argument. Python 3 has one, and
+ the default 'utf-8-sig' is used (skips the BOM automatically).
+ '''
+
+ major, minor, patch = (int(e) for e in platform.python_version_tuple())
+ if major == 2:
+ return open(fname, mode=mode) # Python 2 without encoding
+ else:
+ return open(fname, mode=mode, encoding=encoding) # Python 3 with encoding
+
+
+def fill(s):
+ """Returns string formated to the wrapped paragraph multiline string.
+
+ Replaces whitespaces by one space and then uses he textwrap.fill()."""
+
+ # Replace all whitespace by spaces, remove whitespaces that are not
+ # necessary, strip the left and right whitespaces, and break the string
+ # to list of words.
+ rexWS = re.compile(r'\s+')
+ lst = rexWS.sub(' ', s).strip().split()
+
+ # If the list is not empty, put the words together and form the lines
+ # of maximum 70 characters. Build the list of lines.
+ lines = []
+ if lst:
+ line = lst.pop(0) # no separation space in front of the first word
+ for word in lst:
+ if len(line) + len(word) < 70:
+ line += ' ' + word
+ else:
+ lines.append(line) # another full line formed
+ line = word # next line started
+ lines.append(line) # the last line
+ return '\n'.join(lines)
+
+
+class Transl:
+ """One instance is build for each translator.
+
+ The abbreviation of the source file--part after 'translator_'--is used as
+ the identification of the object. The empty string is used for the
+ abstract Translator class from translator.h. The other information is
+ extracted from inside the source file."""
+
+ def __init__(self, fname, manager):
+ """Bind to the manager and initialize."""
+
+ # Store the filename and the reference to the manager object.
+ self.fname = fname
+ self.manager = manager
+
+ # The instance is responsible for loading the source file, so it checks
+ # for its existence and quits if something goes wrong.
+ if not os.path.isfile(fname):
+ sys.stderr.write("\a\nFile '%s' not found!\n" % fname)
+ sys.exit(1)
+
+ # Initialize the other collected information.
+ self.classId = None
+ self.baseClassId = None
+ self.readableStatus = None # 'up-to-date', '1.2.3', '1.3', etc.
+ self.status = None # '', '1.2.03', '1.3.00', etc.
+ self.lang = None # like 'Brasilian'
+ self.langReadable = None # like 'Brasilian Portuguese'
+ self.note = None # like 'should be cleaned up'
+ self.prototypeDic = {} # uniPrototype -> prototype
+ self.translateMeText = 'translate me!'
+ self.translateMeFlag = False # comments with "translate me!" found
+ self.txtMAX_DOT_GRAPH_HEIGHT_flag = False # found in string in trLegendDocs()
+ self.obsoleteMethods = None # list of prototypes to be removed
+ self.missingMethods = None # list of prototypes to be implemented
+ self.implementedMethods = None # list of implemented required methods
+ self.adaptMinClass = None # The newest adapter class that can be used
+
+ def __tokenGenerator(self):
+ """Generator that reads the file and yields tokens as 4-tuples.
+
+ The tokens have the form (tokenId, tokenString, lineNo). The
+ last returned token has the form ('eof', None, None). When trying
+ to access next token afer that, the exception would be raised."""
+
+ # Set the dictionary for recognizing tokenId for keywords, separators
+ # and the similar categories. The key is the string to be recognized,
+ # the value says its token identification.
+ tokenDic = { 'class': 'class',
+ 'const': 'const',
+ 'public': 'public',
+ 'protected': 'protected',
+ 'private': 'private',
+ 'static': 'static',
+ 'virtual': 'virtual',
+ ':': 'colon',
+ ';': 'semic',
+ ',': 'comma',
+ '[': 'lsqbra',
+ ']': 'rsqbra',
+ '(': 'lpar',
+ ')': 'rpar',
+ '{': 'lcurly',
+ '}': 'rcurly',
+ '=': 'assign',
+ '*': 'star',
+ '&': 'amp',
+ '+': 'plus',
+ '-': 'minus',
+ '!': 'excl',
+ '?': 'qmark',
+ '<': 'lt',
+ '>': 'gt',
+ "'": 'quot',
+ '"': 'dquot',
+ '.': 'dot',
+ '%': 'perc',
+ '~': 'tilde',
+ '^': 'caret',
+ }
+
+ # Regular expression for recognizing identifiers.
+ rexId = re.compile(r'^[a-zA-Z]\w*$')
+
+ # Open the file for reading and extracting tokens until the eof.
+ # Initialize the finite automaton.
+ f = xopen(self.fname)
+ lineNo = 0
+ line = '' # init -- see the pos initialization below
+ linelen = 0 # init
+ pos = 100 # init -- pos after the end of line
+ status = 0
+
+ tokenId = None # init
+ tokenStr = '' # init -- the characters will be appended.
+ tokenLineNo = 0
+
+ while status != 777:
+
+ # Get the next character. Read next line first, if necessary.
+ if pos < linelen:
+ c = line[pos]
+ else:
+ lineNo += 1
+ line = f.readline()
+ linelen = len(line)
+ pos = 0
+ if line == '': # eof
+ status = 777
+ else:
+ c = line[pos]
+
+ # Consume the character based on the status
+
+ if status == 0: # basic status
+
+ # This is the initial status. If tokenId is set, yield the
+ # token here and only here (except when eof is found).
+ # Initialize the token variables after the yield.
+ if tokenId:
+ # If it is an unknown item, it can still be recognized
+ # here. Keywords and separators are the example.
+ if tokenId == 'unknown':
+ if tokenStr in tokenDic:
+ tokenId = tokenDic[tokenStr]
+ elif tokenStr.isdigit():
+ tokenId = 'num'
+ elif rexId.match(tokenStr):
+ tokenId = 'id'
+ else:
+ msg = '\aWarning: unknown token "' + tokenStr + '"'
+ msg += '\tfound on line %d' % tokenLineNo
+ msg += ' in "' + self.fname + '".\n'
+ sys.stderr.write(msg)
+
+ yield (tokenId, tokenStr, tokenLineNo)
+
+ # If it is a comment that contains the self.translateMeText
+ # string, set the flag -- the situation will be reported.
+ if tokenId == 'comment' and tokenStr.find(self.translateMeText) >= 0:
+ self.translateMeFlag = True
+
+ tokenId = None
+ tokenStr = ''
+ tokenLineNo = 0
+
+ # Now process the character. When we just skip it (spaces),
+ # stay in this status. All characters that will be part of
+ # some token cause moving to the specific status. And only
+ # when moving to the status == 0 (or the final state 777),
+ # the token is yielded. With respect to that the automaton
+ # behaves as Moore's one (output bound to status). When
+ # collecting tokens, the automaton is the Mealy's one
+ # (actions bound to transitions).
+ if c.isspace():
+ pass # just skip whitespace characters
+ elif c == '/': # Possibly comment starts here, but
+ tokenId = 'unknown' # it could be only a slash in code.
+ tokenStr = c
+ tokenLineNo = lineNo
+ status = 1
+ elif c == '#':
+ tokenId = 'preproc' # preprocessor directive
+ tokenStr = c
+ tokenLineNo = lineNo
+ status = 5
+ elif c == '"': # string starts here
+ tokenId = 'string'
+ tokenStr = c
+ tokenLineNo = lineNo
+ status = 6
+ elif c == "'": # char literal starts here
+ tokenId = 'charlit'
+ tokenStr = c
+ tokenLineNo = lineNo
+ status = 8
+ elif c in tokenDic: # known one-char token
+ tokenId = tokenDic[c]
+ tokenStr = c
+ tokenLineNo = lineNo
+ # stay in this state to yield token immediately
+ else:
+ tokenId = 'unknown' # totally unknown
+ tokenStr = c
+ tokenLineNo = lineNo
+ status = 333
+
+ pos += 1 # move position in any case
+
+ elif status == 1: # possibly a comment
+ if c == '/': # ... definitely the C++ comment
+ tokenId = 'comment'
+ tokenStr += c
+ pos += 1
+ status = 2
+ elif c == '*': # ... definitely the C comment
+ tokenId = 'comment'
+ tokenStr += c
+ pos += 1
+ status = 3
+ else:
+ status = 0 # unrecognized, don't move pos
+
+ elif status == 2: # inside the C++ comment
+ if c == '\n': # the end of C++ comment
+ status = 0 # yield the token
+ else:
+ tokenStr += c # collect the C++ comment
+ pos += 1
+
+ elif status == 3: # inside the C comment
+ if c == '*': # possibly the end of the C comment
+ tokenStr += c
+ status = 4
+ else:
+ tokenStr += c # collect the C comment
+ pos += 1
+
+ elif status == 4: # possibly the end of the C comment
+ if c == '/': # definitely the end of the C comment
+ tokenStr += c
+ status = 0 # yield the token
+ elif c == '*': # more stars inside the comment
+ tokenStr += c
+ else:
+ tokenStr += c # this cannot be the end of comment
+ status = 3
+ pos += 1
+
+ elif status == 5: # inside the preprocessor directive
+ if c == '\n': # the end of the preproc. command
+ status = 0 # yield the token
+ else:
+ tokenStr += c # collect the preproc
+ pos += 1
+
+ elif status == 6: # inside the string
+ if c == '\\': # escaped char inside the string
+ tokenStr += c
+ status = 7
+ elif c == '"': # end of the string
+ tokenStr += c
+ status = 0
+ else:
+ tokenStr += c # collect the chars of the string
+ pos += 1
+
+ elif status == 7: # escaped char inside the string
+ tokenStr += c # collect the char of the string
+ status = 6
+ pos += 1
+
+ elif status == 8: # inside the char literal
+ tokenStr += c # collect the char of the literal
+ status = 9
+ pos += 1
+
+ elif status == 9: # end of char literal expected
+ if c == "'": # ... and found
+ tokenStr += c
+ status = 0
+ pos += 1
+ else:
+ tokenId = 'error' # end of literal was expected
+ tokenStr += c
+ status = 0
+
+ elif status == 333: # start of the unknown token
+ if c.isspace():
+ pos += 1
+ status = 0 # tokenId may be determined later
+ elif c in tokenDic: # separator, don't move pos
+ status = 0
+ else:
+ tokenStr += c # collect
+ pos += 1
+
+ # We should have finished in the final status. If some token
+ # have been extracted, yield it first.
+ assert(status == 777)
+ if tokenId:
+ yield (tokenId, tokenStr, tokenLineNo)
+ tokenId = None
+ tokenStr = ''
+ tokenLineNo = 0
+
+ # The file content is processed. Close the file. Then always yield
+ # the eof token.
+ f.close()
+ yield ('eof', None, None)
+
+
+ def __collectClassInfo(self, tokenIterator):
+ """Collect the information about the class and base class.
+
+ The tokens including the opening left curly brace of the class are
+ consumed."""
+
+ status = 0 # initial state
+
+ while status != 777: # final state
+
+ # Always assume that the previous tokens were processed. Get
+ # the next one.
+ tokenId, tokenStr, tokenLineNo = next(tokenIterator)
+
+ # Process the token and never return back.
+ if status == 0: # waiting for the 'class' keyword.
+ if tokenId == 'class':
+ status = 1
+
+ elif status == 1: # expecting the class identification
+ if tokenId == 'id':
+ self.classId = tokenStr
+ status = 2
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 2: # expecting the curly brace or base class info
+ if tokenId == 'lcurly':
+ status = 777 # correctly finished
+ elif tokenId == 'colon':
+ status = 3
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 3: # expecting the 'public' in front of base class id
+ if tokenId == 'public':
+ status = 4
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 4: # expecting the base class id
+ if tokenId == 'id':
+ self.baseClassId = tokenStr
+ status = 5
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 5: # expecting the curly brace and quitting
+ if tokenId == 'lcurly':
+ status = 777 # correctly finished
+ elif tokenId == 'comment':
+ pass
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ # Extract the status of the TranslatorXxxx class. The readable form
+ # will be used in reports the status form is a string that can be
+ # compared lexically (unified length, padding with zeros, etc.).
+ if self.baseClassId:
+ lst = self.baseClassId.split('_')
+ if lst[0] == 'Translator':
+ self.readableStatus = 'up-to-date'
+ self.status = ''
+ elif lst[0] == 'TranslatorAdapter':
+ self.status = lst[1] + '.' + lst[2]
+ self.readableStatus = self.status
+ if len(lst) > 3: # add the last part of the number
+ self.status += '.' + ('%02d' % int(lst[3]))
+ self.readableStatus += '.' + lst[3]
+ else:
+ self.status += '.00'
+ elif lst[0] == 'TranslatorEnglish':
+ # Obsolete or Based on English.
+ if self.classId[-2:] == 'En':
+ self.readableStatus = 'English based'
+ self.status = 'En'
+ else:
+ self.readableStatus = 'obsolete'
+ self.status = '0.0.00'
+
+ # Check whether status was set, or set 'strange'.
+ if self.status == None:
+ self.status = 'strange'
+ if not self.readableStatus:
+ self.readableStatus = 'strange'
+
+ # Extract the name of the language and the readable form.
+ self.lang = self.classId[10:] # without 'Translator'
+ if self.lang == 'Brazilian':
+ self.langReadable = 'Brazilian Portuguese'
+ elif self.lang == 'Chinesetraditional':
+ self.langReadable = 'Chinese Traditional'
+ else:
+ self.langReadable = self.lang
+
+
+ def __unexpectedToken(self, status, tokenId, tokenLineNo):
+ """Reports unexpected token and quits with exit code 1."""
+
+ import inspect
+ calledFrom = inspect.stack()[1][3]
+ msg = "\a\nUnexpected token '%s' on the line %d in '%s'.\n"
+ msg = msg % (tokenId, tokenLineNo, self.fname)
+ msg += 'status = %d in %s()\n' % (status, calledFrom)
+ sys.stderr.write(msg)
+ sys.exit(1)
+
+
+ def collectPureVirtualPrototypes(self):
+ """Returns dictionary 'unified prototype' -> 'full prototype'.
+
+ The method is expected to be called only for the translator.h. It
+ extracts only the pure virtual method and build the dictionary where
+ key is the unified prototype without argument identifiers."""
+
+ # Prepare empty dictionary that will be returned.
+ resultDic = {}
+
+ # Start the token generator which parses the class source file.
+ tokenIterator = self.__tokenGenerator()
+
+ # Collect the class and the base class identifiers.
+ self.__collectClassInfo(tokenIterator)
+ assert(self.classId == 'Translator')
+
+ # Let's collect readable form of the public virtual pure method
+ # prototypes in the readable form -- as defined in translator.h.
+ # Let's collect also unified form of the same prototype that omits
+ # everything that can be omitted, namely 'virtual' and argument
+ # identifiers.
+ prototype = '' # readable prototype (with everything)
+ uniPrototype = '' # unified prototype (without arg. identifiers)
+
+ # Collect the pure virtual method prototypes. Stop on the closing
+ # curly brace followed by the semicolon (end of class).
+ status = 0
+ curlyCnt = 0 # counter for the level of curly braces
+
+ # Loop until the final state 777 is reached. The errors are processed
+ # immediately. In this implementation, it always quits the application.
+ while status != 777:
+
+ # Get the next token.
+ tokenId, tokenStr, tokenLineNo = next(tokenIterator)
+
+ if status == 0: # waiting for 'public:'
+ if tokenId == 'public':
+ status = 1
+
+ elif status == 1: # colon after the 'public'
+ if tokenId == 'colon':
+ status = 2
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 2: # waiting for 'virtual'
+ if tokenId == 'virtual':
+ prototype = tokenStr # but not to unified prototype
+ status = 3
+ elif tokenId == 'comment':
+ pass
+ elif tokenId == 'rcurly':
+ status = 11 # expected end of class
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 3: # return type of the method expected
+ if tokenId == 'id':
+ prototype += ' ' + tokenStr
+ uniPrototype = tokenStr # start collecting the unified prototype
+ status = 4
+ elif tokenId == 'tilde':
+ status = 4
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 4: # method identifier expected
+ if tokenId == 'id':
+ prototype += ' ' + tokenStr
+ uniPrototype += ' ' + tokenStr
+ status = 5
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 5: # left bracket of the argument list expected
+ if tokenId == 'lpar':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 6
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 6: # collecting arguments of the method
+ if tokenId == 'rpar':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 7
+ elif tokenId == 'const':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 12
+ elif tokenId == 'id': # type identifier
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 13
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 7: # assignment expected or left curly brace
+ if tokenId == 'assign':
+ status = 8
+ elif tokenId == 'lcurly':
+ curlyCnt = 1 # method body entered
+ status = 10
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 8: # zero expected
+ if tokenId == 'num' and tokenStr == '0':
+ status = 9
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 9: # after semicolon, produce the dic item
+ if tokenId == 'semic':
+ assert(uniPrototype not in resultDic)
+ resultDic[uniPrototype] = prototype
+ status = 2
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 10: # consuming the body of the method
+ if tokenId == 'rcurly':
+ curlyCnt -= 1
+ if curlyCnt == 0:
+ status = 2 # body consumed
+ elif tokenId == 'lcurly':
+ curlyCnt += 1
+
+ elif status == 11: # probably the end of class
+ if tokenId == 'semic':
+ status = 777
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 12: # type id for argument expected
+ if tokenId == 'id':
+ prototype += ' ' + tokenStr
+ uniPrototype += ' ' + tokenStr
+ status = 13
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 13: # namespace qualification or * or & expected
+ if tokenId == 'colon': # was namespace id
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 14
+ elif tokenId == 'star' or tokenId == 'amp': # pointer or reference
+ prototype += ' ' + tokenStr
+ uniPrototype += ' ' + tokenStr
+ status = 16
+ elif tokenId == 'id': # argument identifier
+ prototype += ' ' + tokenStr
+ # don't put this into unified prototype
+ status = 17
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 14: # second colon for namespace:: expected
+ if tokenId == 'colon':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 15
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 15: # type after namespace:: expected
+ if tokenId == 'id':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 13
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 16: # argument identifier expected
+ if tokenId == 'id':
+ prototype += ' ' + tokenStr
+ # don't put this into unified prototype
+ status = 17
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 17: # comma or ')' after argument identifier expected
+ if tokenId == 'comma':
+ prototype += ', '
+ uniPrototype += ', '
+ status = 6
+ elif tokenId == 'rpar':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 7
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ # Eat the rest of the source to cause closing the file.
+ while tokenId != 'eof':
+ tokenId, tokenStr, tokenLineNo = next(tokenIterator)
+
+ # Return the resulting dictionary with 'uniPrototype -> prototype'.
+ return resultDic
+
+
+ def __collectPublicMethodPrototypes(self, tokenIterator):
+ """Collects prototypes of public methods and fills self.prototypeDic.
+
+ The dictionary is filled by items: uniPrototype -> prototype.
+ The method is expected to be called only for TranslatorXxxx classes,
+ i.e. for the classes that implement translation to some language.
+ It assumes that the openning curly brace of the class was already
+ consumed. The source is consumed until the end of the class.
+ The caller should consume the source until the eof to cause closing
+ the source file."""
+
+ assert(self.classId != 'Translator')
+ assert(self.baseClassId != None)
+
+ # The following finite automaton slightly differs from the one
+ # inside self.collectPureVirtualPrototypes(). It produces the
+ # dictionary item just after consuming the body of the method
+ # (transition from from state 10 to state 2). It also does not allow
+ # definitions of public pure virtual methods, except for
+ # TranslatorAdapterBase (states 8 and 9). Argument identifier inside
+ # method argument lists can be omitted or commented.
+ #
+ # Let's collect readable form of all public method prototypes in
+ # the readable form -- as defined in the source file.
+ # Let's collect also unified form of the same prototype that omits
+ # everything that can be omitted, namely 'virtual' and argument
+ # identifiers.
+ prototype = '' # readable prototype (with everything)
+ uniPrototype = '' # unified prototype (without arg. identifiers)
+ warning = '' # warning message -- if something special detected
+ methodId = None # processed method id
+
+ # Collect the method prototypes. Stop on the closing
+ # curly brace followed by the semicolon (end of class).
+ status = 0
+ curlyCnt = 0 # counter for the level of curly braces
+
+ # Loop until the final state 777 is reached. The errors are processed
+ # immediately. In this implementation, it always quits the application.
+ while status != 777:
+
+ # Get the next token.
+ tokenId, tokenStr, tokenLineNo = next(tokenIterator)
+
+ if status == 0: # waiting for 'public:'
+ if tokenId == 'public':
+ status = 1
+ elif tokenId == 'eof': # non-public things until the eof
+ status = 777
+
+ elif status == 1: # colon after the 'public'
+ if tokenId == 'colon':
+ status = 2
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 2: # waiting for 'virtual' (can be omitted)
+ if tokenId == 'virtual':
+ prototype = tokenStr # but not to unified prototype
+ status = 3
+ elif tokenId == 'id': # 'virtual' was omitted
+ prototype = tokenStr
+ uniPrototype = tokenStr # start collecting the unified prototype
+ status = 4
+ elif tokenId == 'comment':
+ pass
+ elif tokenId == 'protected' or tokenId == 'private':
+ status = 0
+ elif tokenId == 'rcurly':
+ status = 11 # expected end of class
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 3: # return type of the method expected
+ if tokenId == 'id':
+ prototype += ' ' + tokenStr
+ uniPrototype = tokenStr # start collecting the unified prototype
+ status = 4
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 4: # method identifier expected
+ if tokenId == 'id':
+ prototype += ' ' + tokenStr
+ uniPrototype += ' ' + tokenStr
+ methodId = tokenStr # for reporting
+ status = 5
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 5: # left bracket of the argument list expected
+ if tokenId == 'lpar':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 6
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 6: # collecting arguments of the method
+ if tokenId == 'rpar':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 7
+ elif tokenId == 'const':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 12
+ elif tokenId == 'id': # type identifier
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 13
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 7: # left curly brace expected
+ if tokenId == 'lcurly':
+ curlyCnt = 1 # method body entered
+ status = 10
+ elif tokenId == 'comment':
+ pass
+ elif tokenId == 'assign': # allowed only for TranslatorAdapterBase
+ assert(self.classId == 'TranslatorAdapterBase')
+ status = 8
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 8: # zero expected (TranslatorAdapterBase)
+ assert(self.classId == 'TranslatorAdapterBase')
+ if tokenId == 'num' and tokenStr == '0':
+ status = 9
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 9: # after semicolon (TranslatorAdapterBase)
+ assert(self.classId == 'TranslatorAdapterBase')
+ if tokenId == 'semic':
+ status = 2
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 10: # consuming the body of the method, then dic item
+ if tokenId == 'rcurly':
+ curlyCnt -= 1
+ if curlyCnt == 0:
+ # Check for possible copy/paste error when name
+ # of the method was not corrected (i.e. the same
+ # name already exists).
+ if uniPrototype in self.prototypeDic:
+ msg = "'%s' prototype found again (duplicity)\n"
+ msg += "in '%s'.\n" % self.fname
+ msg = msg % uniPrototype
+ sys.stderr.write(msg)
+ assert False
+
+ assert(uniPrototype not in self.prototypeDic)
+ # Insert new dictionary item.
+ self.prototypeDic[uniPrototype] = prototype
+ status = 2 # body consumed
+ methodId = None # outside of any method
+ elif tokenId == 'lcurly':
+ curlyCnt += 1
+
+ # Warn in special case.
+ elif methodId == 'trLegendDocs' and tokenId == 'string' \
+ and tokenStr.find('MAX_DOT_GRAPH_HEIGHT') >= 0:
+ self.txtMAX_DOT_GRAPH_HEIGHT_flag = True
+
+
+ elif status == 11: # probably the end of class
+ if tokenId == 'semic':
+ status = 777
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 12: # type id for argument expected
+ if tokenId == 'id':
+ prototype += ' ' + tokenStr
+ uniPrototype += ' ' + tokenStr
+ status = 13
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 13: # :: or * or & or id or ) expected
+ if tokenId == 'colon': # was namespace id
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 14
+ elif tokenId == 'star' or tokenId == 'amp': # pointer or reference
+ prototype += ' ' + tokenStr
+ uniPrototype += ' ' + tokenStr
+ status = 16
+ elif tokenId == 'id': # argument identifier
+ prototype += ' ' + tokenStr
+ # don't put this into unified prototype
+ status = 17
+ elif tokenId == 'comment': # probably commented-out identifier
+ prototype += tokenStr
+ elif tokenId == 'rpar':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 7
+ elif tokenId == 'comma':
+ prototype += ', '
+ uniPrototype += ', '
+ status = 6
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 14: # second colon for namespace:: expected
+ if tokenId == 'colon':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 15
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 15: # type after namespace:: expected
+ if tokenId == 'id':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 13
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 16: # argument identifier or ) expected
+ if tokenId == 'id':
+ prototype += ' ' + tokenStr
+ # don't put this into unified prototype
+ status = 17
+ elif tokenId == 'rpar':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 7
+ elif tokenId == 'comment':
+ prototype += tokenStr
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+ elif status == 17: # comma or ')' after argument identifier expected
+ if tokenId == 'comma':
+ prototype += ', '
+ uniPrototype += ', '
+ status = 6
+ elif tokenId == 'rpar':
+ prototype += tokenStr
+ uniPrototype += tokenStr
+ status = 7
+ else:
+ self.__unexpectedToken(status, tokenId, tokenLineNo)
+
+
+
+ def collectAdapterPrototypes(self):
+ """Returns the dictionary of prototypes implemented by adapters.
+
+ It is created to process the translator_adapter.h. The returned
+ dictionary has the form: unifiedPrototype -> (version, classId)
+ thus by looking for the prototype, we get the information what is
+ the newest (least adapting) adapter that is sufficient for
+ implementing the method."""
+
+ # Start the token generator which parses the class source file.
+ assert(os.path.split(self.fname)[1] == 'translator_adapter.h')
+ tokenIterator = self.__tokenGenerator()
+
+ # Get the references to the involved dictionaries.
+ reqDic = self.manager.requiredMethodsDic
+
+ # Create the empty dictionary that will be returned.
+ adaptDic = {}
+
+
+ # Loop through the source of the adapter file until no other adapter
+ # class is found.
+ while True:
+ try:
+ # Collect the class and the base class identifiers.
+ self.__collectClassInfo(tokenIterator)
+
+ # Extract the comparable version of the adapter class.
+ # Note: The self.status as set by self.__collectClassInfo()
+ # contains similar version, but is related to the base class,
+ # not to the class itself.
+ lst = self.classId.split('_')
+ version = ''
+ if lst[0] == 'TranslatorAdapter': # TranslatorAdapterBase otherwise
+ version = lst[1] + '.' + lst[2]
+ if len(lst) > 3: # add the last part of the number
+ version += '.' + ('%02d' % int(lst[3]))
+ else:
+ version += '.00'
+
+ # Collect the prototypes of implemented public methods.
+ self.__collectPublicMethodPrototypes(tokenIterator)
+
+ # For the required methods, update the dictionary of methods
+ # implemented by the adapter.
+ for protoUni in self.prototypeDic:
+ if protoUni in reqDic:
+ # This required method will be marked as implemented
+ # by this adapter class. This implementation assumes
+ # that newer adapters do not reimplement any required
+ # methods already implemented by older adapters.
+ assert(protoUni not in adaptDic)
+ adaptDic[protoUni] = (version, self.classId)
+
+ # Clear the dictionary object and the information related
+ # to the class as the next adapter class is to be processed.
+ self.prototypeDic.clear()
+ self.classId = None
+ self.baseClassId = None
+
+ except StopIteration:
+ break
+
+ # Return the result dictionary.
+ return adaptDic
+
+
+ def processing(self):
+ """Processing of the source file -- only for TranslatorXxxx classes."""
+
+ # Start the token generator which parses the class source file.
+ tokenIterator = self.__tokenGenerator()
+
+ # Collect the class and the base class identifiers.
+ self.__collectClassInfo(tokenIterator)
+ assert(self.classId != 'Translator')
+ assert(self.classId[:17] != 'TranslatorAdapter')
+
+ # Collect the prototypes of implemented public methods.
+ self.__collectPublicMethodPrototypes(tokenIterator)
+
+ # Eat the rest of the source to cause closing the file.
+ while True:
+ try:
+ t = next(tokenIterator)
+ except StopIteration:
+ break
+
+ # Shorthands for the used dictionaries.
+ reqDic = self.manager.requiredMethodsDic
+ adaptDic = self.manager.adaptMethodsDic
+ myDic = self.prototypeDic
+
+ # Build the list of obsolete methods.
+ self.obsoleteMethods = []
+ for p in myDic:
+ if p not in reqDic:
+ self.obsoleteMethods.append(p)
+ self.obsoleteMethods.sort()
+
+ # Build the list of missing methods and the list of implemented
+ # required methods.
+ self.missingMethods = []
+ self.implementedMethods = []
+ for p in reqDic:
+ if p in myDic:
+ self.implementedMethods.append(p)
+ else:
+ self.missingMethods.append(p)
+ self.missingMethods.sort()
+ self.implementedMethods.sort()
+
+ # Check whether adapter must be used or suggest the newest one.
+ # Change the status and set the note accordingly.
+ if self.baseClassId != 'Translator':
+ if not self.missingMethods:
+ self.note = 'Change the base class to Translator.'
+ self.status = ''
+ self.readableStatus = 'almost up-to-date'
+ elif self.baseClassId != 'TranslatorEnglish':
+ # The translator uses some of the adapters.
+ # Look at the missing methods and check what adapter
+ # implements them. Remember the one with the lowest version.
+ adaptMinVersion = '9.9.99'
+ adaptMinClass = 'TranslatorAdapter_9_9_99'
+ for uniProto in self.missingMethods:
+ if uniProto in adaptDic:
+ version, cls = adaptDic[uniProto]
+ if version < adaptMinVersion:
+ adaptMinVersion = version
+ adaptMinClass = cls
+
+ # Test against the current status -- preserve the self.status.
+ # Possibly, the translator implements enough methods to
+ # use some newer adapter.
+ status = self.status
+
+ # If the version of the used adapter is smaller than
+ # the required, set the note and update the status as if
+ # the newer adapter was used.
+ if adaptMinVersion > status:
+ self.note = 'Change the base class to %s.' % adaptMinClass
+ self.status = adaptMinVersion
+ self.adaptMinClass = adaptMinClass
+ self.readableStatus = adaptMinVersion # simplified
+
+ # If everything seems OK, some explicit warning flags still could
+ # be set.
+ if not self.note and self.status == '' and \
+ (self.translateMeFlag or self.txtMAX_DOT_GRAPH_HEIGHT_flag):
+ self.note = ''
+ if self.translateMeFlag:
+ self.note += 'The "%s" found in a comment.' % self.translateMeText
+ if self.note != '':
+ self.note += '\n\t\t'
+ if self.txtMAX_DOT_GRAPH_HEIGHT_flag:
+ self.note += 'The MAX_DOT_GRAPH_HEIGHT found in trLegendDocs()'
+
+ # If everything seems OK, but there are obsolete methods, set
+ # the note to clean-up source. This note will be used only when
+ # the previous code did not set another note (priority).
+ if not self.note and self.status == '' and self.obsoleteMethods:
+ self.note = 'Remove the obsolete methods (never used).'
+
+ # If there is at least some note but the status suggests it is
+ # otherwise up-to-date, mark is as ALMOST up-to-date.
+ if self.note and self.status == '':
+ self.readableStatus = 'almost up-to-date'
+
+
+ def report(self, fout):
+ """Returns the report part for the source as a multiline string.
+
+ No output for up-to-date translators without problem."""
+
+ # If there is nothing to report, return immediately.
+ if self.status == '' and not self.note:
+ return
+
+ # Report the number of not implemented methods.
+ fout.write('\n\n\n')
+ fout.write(self.classId + ' (' + self.baseClassId + ')')
+ percentImplemented = 100 # init
+ allNum = len(self.manager.requiredMethodsDic)
+ if self.missingMethods:
+ num = len(self.missingMethods)
+ percentImplemented = 100 * (allNum - num) / allNum
+ fout.write(' %d' % num)
+ fout.write(' method')
+ if num > 1:
+ fout.write('s')
+ fout.write(' to implement (%d %%)' % (100 * num / allNum))
+ fout.write('\n' + '-' * len(self.classId))
+
+ # Write the info about the implemented required methods.
+ fout.write('\n\n Implements %d' % len(self.implementedMethods))
+ fout.write(' of the required methods (%d %%).' % percentImplemented)
+
+ # Report the missing method, but only when it is not English-based
+ # translator.
+ if self.missingMethods and self.status != 'En':
+ fout.write('\n\n Missing methods (should be implemented):\n')
+ reqDic = self.manager.requiredMethodsDic
+ for p in self.missingMethods:
+ fout.write('\n ' + reqDic[p])
+
+ # Always report obsolete methods.
+ if self.obsoleteMethods:
+ fout.write('\n\n Obsolete methods (should be removed, never used):\n')
+ myDic = self.prototypeDic
+ for p in self.obsoleteMethods:
+ fout.write('\n ' + myDic[p])
+
+ # For English-based translator, report the implemented methods.
+ if self.status == 'En' and self.implementedMethods:
+ fout.write('\n\n This English-based translator implements ')
+ fout.write('the following methods:\n')
+ reqDic = self.manager.requiredMethodsDic
+ for p in self.implementedMethods:
+ fout.write('\n ' + reqDic[p])
+
+
+ def getmtime(self):
+ """Returns the last modification time of the source file."""
+ assert(os.path.isfile(self.fname))
+ return os.path.getmtime(self.fname)
+
+
+class TrManager:
+ """Collects basic info and builds subordinate Transl objects."""
+
+ def __init__(self):
+ """Determines paths, creates and initializes structures.
+
+ The arguments of the script may explicitly say what languages should
+ be processed. Write the two letter identifications that are used
+ for composing the source filenames, so...
+
+ python translator.py cz
+
+ this will process only translator_cz.h source.
+ """
+
+ # Determine the path to the script and its name.
+ self.script = os.path.abspath(sys.argv[0])
+ self.script_path, self.script_name = os.path.split(self.script)
+ self.script_path = os.path.abspath(self.script_path)
+
+ # Determine the absolute path to the Doxygen's root subdirectory.
+ # If DOXYGEN environment variable is not found, the directory is
+ # determined from the path of the script.
+ doxy_default = os.path.join(self.script_path, '..')
+ self.doxy_path = os.path.abspath(os.getenv('DOXYGEN', doxy_default))
+
+ # Get the explicit arguments of the script.
+ self.script_argLst = sys.argv[1:]
+
+ # Build the path names based on the Doxygen's root knowledge.
+ self.doc_path = os.path.join(self.doxy_path, 'doc')
+ self.src_path = os.path.join(self.doxy_path, 'src')
+
+ # Create the empty dictionary for Transl object identitied by the
+ # class identifier of the translator.
+ self.__translDic = {}
+
+ # Create the None dictionary of required methods. The key is the
+ # unified prototype, the value is the full prototype. Set inside
+ # the self.__build().
+ self.requiredMethodsDic = None
+
+ # Create the empty dictionary that says what method is implemented
+ # by what adapter.
+ self.adaptMethodsDic = {}
+
+ # The last modification time will capture the modification of this
+ # script, of the translator.h, of the translator_adapter.h (see the
+ # self.__build() for the last two) of all the translator_xx.h files
+ # and of the template for generating the documentation. So, this
+ # time can be compared with modification time of the generated
+ # documentation to decide, whether the doc should be re-generated.
+ self.lastModificationTime = os.path.getmtime(self.script)
+
+ # Set the names of the translator report text file, of the template
+ # for generating "Internationalization" document, for the generated
+ # file itself, and for the maintainers list.
+ self.translatorReportFileName = 'translator_report.txt'
+ self.maintainersFileName = 'maintainers.txt'
+ self.languageTplFileName = 'language.tpl'
+ self.languageDocFileName = 'language.doc'
+
+ # The information about the maintainers will be stored
+ # in the dictionary with the following name.
+ self.__maintainersDic = None
+
+ # Define the other used structures and variables for information.
+ self.langLst = None # including English based
+ self.supportedLangReadableStr = None # coupled En-based as a note
+ self.numLang = None # excluding coupled En-based
+ self.doxVersion = None # Doxygen version
+
+ # Build objects where each one is responsible for one translator.
+ self.__build()
+
+
+ def __build(self):
+ """Find the translator files and build the objects for translators."""
+
+ # The translator.h must exist (the Transl object will check it),
+ # create the object for it and let it build the dictionary of
+ # required methods.
+ tr = Transl(os.path.join(self.src_path, 'translator.h'), self)
+ self.requiredMethodsDic = tr.collectPureVirtualPrototypes()
+ tim = tr.getmtime()
+ if tim > self.lastModificationTime:
+ self.lastModificationTime = tim
+
+ # The translator_adapter.h must exist (the Transl object will check it),
+ # create the object for it and store the reference in the dictionary.
+ tr = Transl(os.path.join(self.src_path, 'translator_adapter.h'), self)
+ self.adaptMethodsDic = tr.collectAdapterPrototypes()
+ tim = tr.getmtime()
+ if tim > self.lastModificationTime:
+ self.lastModificationTime = tim
+
+ # Create the list of the filenames with language translator sources.
+ # If the explicit arguments of the script were typed, process only
+ # those files.
+ if self.script_argLst:
+ lst = ['translator_' + x + '.h' for x in self.script_argLst]
+ for fname in lst:
+ if not os.path.isfile(os.path.join(self.src_path, fname)):
+ sys.stderr.write("\a\nFile '%s' not found!\n" % fname)
+ sys.exit(1)
+ else:
+ lst = os.listdir(self.src_path)
+ lst = [x for x in lst if x[:11] == 'translator_'
+ and x[-2:] == '.h'
+ and x != 'translator_adapter.h']
+
+ # Build the object for the translator_xx.h files, and process the
+ # content of the file. Then insert the object to the dictionary
+ # accessed via classId.
+ for fname in lst:
+ fullname = os.path.join(self.src_path, fname)
+ tr = Transl(fullname, self)
+ tr.processing()
+ assert(tr.classId != 'Translator')
+ self.__translDic[tr.classId] = tr
+
+ # Extract the global information of the processed info.
+ self.__extractProcessedInfo()
+
+
+ def __extractProcessedInfo(self):
+ """Build lists and strings of the processed info."""
+
+ # Build the auxiliary list with strings compound of the status,
+ # readable form of the language, and classId.
+ statLst = []
+ for obj in list(self.__translDic.values()):
+ assert(obj.classId != 'Translator')
+ s = obj.status + '|' + obj.langReadable + '|' + obj.classId
+ statLst.append(s)
+
+ # Sort the list and extract the object identifiers (classId's) for
+ # the up-to-date translators and English-based translators.
+ statLst.sort()
+ self.upToDateIdLst = [x.split('|')[2] for x in statLst if x[0] == '|']
+ self.EnBasedIdLst = [x.split('|')[2] for x in statLst if x[:2] == 'En']
+
+ # Reverse the list and extract the TranslatorAdapter based translators.
+ statLst.reverse()
+ self.adaptIdLst = [x.split('|')[2] for x in statLst if x[0].isdigit()]
+
+ # Build the list of tuples that contain (langReadable, obj).
+ # Sort it by readable name.
+ self.langLst = []
+ for obj in list(self.__translDic.values()):
+ self.langLst.append((obj.langReadable, obj))
+
+ self.langLst.sort(key=lambda x: x[0])
+
+ # Create the list with readable language names. If the language has
+ # also the English-based version, modify the item by appending
+ # the note. Number of the supported languages is equal to the length
+ # of the list.
+ langReadableLst = []
+ for name, obj in self.langLst:
+ if obj.status == 'En': continue
+
+ # Append the 'En' to the classId to possibly obtain the classId
+ # of the English-based object. If the object exists, modify the
+ # name for the readable list of supported languages.
+ classIdEn = obj.classId + 'En'
+ if classIdEn in self.__translDic:
+ name += ' (+En)'
+
+ # Append the result name of the language, possibly with note.
+ langReadableLst.append(name)
+
+ # Create the multiline string of readable language names,
+ # with punctuation, wrapped to paragraph.
+ if len(langReadableLst) == 1:
+ s = langReadableLst[0]
+ elif len(langReadableLst) == 2:
+ s = ' and '.join(langReadableLst)
+ else:
+ s = ', '.join(langReadableLst[:-1]) + ', and '
+ s += langReadableLst[-1]
+
+ self.supportedLangReadableStr = fill(s + '.')
+
+ # Find the number of the supported languages. The English based
+ # languages are not counted if the non-English based also exists.
+ self.numLang = len(self.langLst)
+ for name, obj in self.langLst:
+ if obj.status == 'En':
+ classId = obj.classId[:-2]
+ if classId in self.__translDic:
+ self.numLang -= 1 # the couple will be counted as one
+
+ # Extract the version of Doxygen.
+ f = xopen(os.path.join(self.doxy_path, 'VERSION'))
+ self.doxVersion = f.readline().strip()
+ f.close()
+
+ # Update the last modification time.
+ for tr in list(self.__translDic.values()):
+ tim = tr.getmtime()
+ if tim > self.lastModificationTime:
+ self.lastModificationTime = tim
+
+
+ def __getNoTrSourceFilesLst(self):
+ """Returns the list of sources to be checked.
+
+ All .cpp files and also .h files that do not declare or define
+ the translator methods are included in the list. The file names
+ are searched in doxygen/src directory.
+ """
+ files = []
+ for item in os.listdir(self.src_path):
+ # Split the bare name to get the extension.
+ name, ext = os.path.splitext(item)
+ ext = ext.lower()
+
+ # Include only .cpp and .h files (case independent) and exclude
+ # the files where the checked identifiers are defined.
+ if ext == '.cpp' or (ext == '.h' and name.find('translator') == -1):
+ fname = os.path.join(self.src_path, item)
+ assert os.path.isfile(fname) # assumes no directory with the ext
+ files.append(fname) # full name
+ return files
+
+
+ def __removeUsedInFiles(self, fname, dic):
+ """Removes items for method identifiers that are found in fname.
+
+ The method reads the content of the file as one string and searches
+ for all identifiers from dic. The identifiers that were found in
+ the file are removed from the dictionary.
+
+ Note: If more files is to be checked, the files where most items are
+ probably used should be checked first and the resulting reduced
+ dictionary should be used for checking the next files (speed up).
+ """
+ lst_in = list(dic.keys()) # identifiers to be searched for
+
+ # Read content of the file as one string.
+ assert os.path.isfile(fname)
+ f = xopen(fname)
+ cont = f.read()
+ f.close()
+
+ # Remove the items for identifiers that were found in the file.
+ while lst_in:
+ item = lst_in.pop(0)
+ if cont.find(item) != -1:
+ del dic[item]
+
+
+ def __checkForNotUsedTrMethods(self):
+ """Returns the dictionary of not used translator methods.
+
+ The method can be called only after self.requiredMethodsDic has been
+ built. The stripped prototypes are the values, the method identifiers
+ are the keys.
+ """
+ # Build the dictionary of the required method prototypes with
+ # method identifiers used as keys.
+ trdic = {}
+ for prototype in list(self.requiredMethodsDic.keys()):
+ ri = prototype.split('(')[0]
+ identifier = ri.split()[1].strip()
+ trdic[identifier] = prototype
+
+ # Build the list of source files where translator method identifiers
+ # can be used.
+ files = self.__getNoTrSourceFilesLst()
+
+ # Loop through the files and reduce the dictionary of id -> proto.
+ for fname in files:
+ self.__removeUsedInFiles(fname, trdic)
+
+ # Return the dictionary of not used translator methods.
+ return trdic
+
+
+ def __emails(self, classId):
+ """Returns the list of maintainer emails.
+
+ The method returns the list of e-mail adresses for the translator
+ class, but only the addresses that were not marked as [xxx]."""
+ lst = []
+ for m in self.__maintainersDic[classId]:
+ if not m[1].startswith('['):
+ email = m[1]
+ email = email.replace(' at ', '@') # Unmangle the mangled e-mail
+ email = email.replace(' dot ', '.')
+ lst.append(email)
+ return lst
+
+
+ def getBgcolorByReadableStatus(self, readableStatus):
+ if readableStatus == 'up-to-date':
+ color = '#ccffcc' # green
+ elif readableStatus.startswith('almost'):
+ color = '#ffffff' # white
+ elif readableStatus.startswith('English'):
+ color = '#ccffcc' # green
+ elif readableStatus.startswith('1.8'):
+ color = '#ffffcc' # yellow
+ elif readableStatus.startswith('1.7'):
+ color = '#ffcccc' # pink
+ elif readableStatus.startswith('1.6'):
+ color = '#ffcccc' # pink
+ else:
+ color = '#ff5555' # red
+ return color
+
+
+ def generateTranslatorReport(self):
+ """Generates the translator report."""
+
+ output = os.path.join(self.doc_path, self.translatorReportFileName)
+
+ # Open the textual report file for the output.
+ f = xopen(output, 'w')
+
+ # Output the information about the version.
+ f.write('(' + self.doxVersion + ')\n\n')
+
+ # Output the information about the number of the supported languages
+ # and the list of the languages, or only the note about the explicitly
+ # given languages to process.
+ if self.script_argLst:
+ f.write('The report was generated for the following, explicitly')
+ f.write(' identified languages:\n\n')
+ f.write(self.supportedLangReadableStr + '\n\n')
+ else:
+ f.write('Doxygen supports the following ')
+ f.write(str(self.numLang))
+ f.write(' languages (sorted alphabetically):\n\n')
+ f.write(self.supportedLangReadableStr + '\n\n')
+
+ # Write the summary about the status of language translators (how
+ # many translators) are up-to-date, etc.
+ s = 'Of them, %d translators are up-to-date, ' % len(self.upToDateIdLst)
+ s += '%d translators are based on some adapter class, ' % len(self.adaptIdLst)
+ s += 'and %d are English based.' % len(self.EnBasedIdLst)
+ f.write(fill(s) + '\n\n')
+
+ # The e-mail addresses of the maintainers will be collected to
+ # the auxiliary file in the order of translator classes listed
+ # in the translator report.
+ fmail = xopen('mailto.txt', 'w')
+
+ # Write the list of "up-to-date" translator classes.
+ if self.upToDateIdLst:
+ s = '''The following translator classes are up-to-date (sorted
+ alphabetically). This means that they derive from the
+ Translator class, they implement all %d of the required
+ methods, and even minor problems were not spotted by the script:'''
+ s = s % len(self.requiredMethodsDic)
+ f.write('-' * 70 + '\n')
+ f.write(fill(s) + '\n\n')
+
+ mailtoLst = []
+ for x in self.upToDateIdLst:
+ obj = self.__translDic[x]
+ if obj.note is None:
+ f.write(' ' + obj.classId + '\n')
+ mailtoLst.extend(self.__emails(obj.classId))
+
+ fmail.write('up-to-date\n')
+ fmail.write('; '.join(mailtoLst))
+
+
+ # Write separately the list of "ALMOST up-to-date" translator classes.
+ s = '''The following translator classes are ALMOST up-to-date (sorted
+ alphabetically). This means that they derive from the
+ Translator class, but there still may be some minor problems
+ listed for them:'''
+ f.write('\n' + ('-' * 70) + '\n')
+ f.write(fill(s) + '\n\n')
+ mailtoLst = []
+ for x in self.upToDateIdLst:
+ obj = self.__translDic[x]
+ if obj.note is not None:
+ f.write(' ' + obj.classId + '\t-- ' + obj.note + '\n')
+ mailtoLst.extend(self.__emails(obj.classId))
+
+ fmail.write('\n\nalmost up-to-date\n')
+ fmail.write('; '.join(mailtoLst))
+
+ # Write the list of the adapter based classes. The very obsolete
+ # translators that derive from TranslatorEnglish are included.
+ if self.adaptIdLst:
+ s = '''The following translator classes need maintenance
+ (the most obsolete at the end). The other info shows the
+ estimation of Doxygen version when the class was last
+ updated and number of methods that must be implemented to
+ become up-to-date:'''
+ f.write('\n' + '-' * 70 + '\n')
+ f.write(fill(s) + '\n\n')
+
+ # Find also whether some adapter classes may be removed.
+ adaptMinVersion = '9.9.99'
+
+ mailtoLst = []
+ numRequired = len(self.requiredMethodsDic)
+ for x in self.adaptIdLst:
+ obj = self.__translDic[x]
+ f.write(' %-30s' % obj.classId)
+ f.write(' %-6s' % obj.readableStatus)
+ numimpl = len(obj.missingMethods)
+ pluralS = ''
+ if numimpl > 1: pluralS = 's'
+ percent = 100 * numimpl / numRequired
+ f.write('\t%2d method%s to implement (%d %%)' % (
+ numimpl, pluralS, percent))
+ if obj.note:
+ f.write('\n\tNote: ' + obj.note + '\n')
+ f.write('\n')
+ mailtoLst.extend(self.__emails(obj.classId)) # to maintainer
+
+ # Check the level of required adapter classes.
+ if obj.status != '0.0.00' and obj.status < adaptMinVersion:
+ adaptMinVersion = obj.status
+
+ fmail.write('\n\ntranslator based\n')
+ fmail.write('; '.join(mailtoLst))
+
+ # Set the note if some old translator adapters are not needed
+ # any more. Do it only when the script is called without arguments,
+ # i.e. all languages were checked against the needed translator
+ # adapters.
+ if not self.script_argLst:
+ to_remove = {}
+ for version, adaptClassId in list(self.adaptMethodsDic.values()):
+ if version < adaptMinVersion:
+ to_remove[adaptClassId] = True
+
+ if to_remove:
+ lst = list(to_remove.keys())
+ lst.sort()
+ plural = len(lst) > 1
+ note = 'Note: The adapter class'
+ if plural: note += 'es'
+ note += ' ' + ', '.join(lst)
+ if not plural:
+ note += ' is'
+ else:
+ note += ' are'
+ note += ' not used and can be removed.'
+ f.write('\n' + fill(note) + '\n')
+
+ # Write the list of the English-based classes.
+ if self.EnBasedIdLst:
+ s = '''The following translator classes derive directly from the
+ TranslatorEnglish. The class identifier has the suffix 'En'
+ that says that this is intentional. Usually, there is also
+ a non-English based version of the translator for
+ the language:'''
+ f.write('\n' + '-' * 70 + '\n')
+ f.write(fill(s) + '\n\n')
+
+ for x in self.EnBasedIdLst:
+ obj = self.__translDic[x]
+ f.write(' ' + obj.classId)
+ f.write('\timplements %d methods' % len(obj.implementedMethods))
+ if obj.note:
+ f.write(' -- ' + obj.note)
+ f.write('\n')
+
+ # Check for not used translator methods and generate warning if found.
+ # The check is rather time consuming, so it is not done when report
+ # is restricted to explicitly given language identifiers.
+ if not self.script_argLst:
+ dic = self.__checkForNotUsedTrMethods()
+ if dic:
+ s = '''WARNING: The following translator methods are declared
+ in the Translator class but their identifiers do not appear
+ in source files. The situation should be checked. The .cpp
+ files and .h files excluding the '*translator*' files
+ in doxygen/src directory were simply searched for occurrence
+ of the method identifiers:'''
+ f.write('\n' + '=' * 70 + '\n')
+ f.write(fill(s) + '\n\n')
+
+ keys = list(dic.keys())
+ keys.sort()
+ for key in keys:
+ f.write(' ' + dic[key] + '\n')
+ f.write('\n')
+
+ # Write the details for the translators.
+ f.write('\n' + '=' * 70)
+ f.write('\nDetails for translators (classes sorted alphabetically):\n')
+
+ cls = list(self.__translDic.keys())
+ cls.sort()
+
+ for c in cls:
+ obj = self.__translDic[c]
+ assert(obj.classId != 'Translator')
+ obj.report(f)
+
+ # Close the report file and the auxiliary file with e-mails.
+ f.close()
+ fmail.close()
+
+
+ def __loadMaintainers(self):
+ """Load and process the file with the maintainers.
+
+ Fills the dictionary classId -> [(name, e-mail), ...]."""
+
+ fname = os.path.join(self.doc_path, self.maintainersFileName)
+
+ # Include the maintainers file to the group of files checked with
+ # respect to the modification time.
+ tim = os.path.getmtime(fname)
+ if tim > self.lastModificationTime:
+ self.lastModificationTime = tim
+
+ # Process the content of the maintainers file.
+ f = xopen(fname)
+ inside = False # inside the record for the language
+ lineReady = True
+ classId = None
+ maintainersLst = None
+ self.__maintainersDic = {}
+ while lineReady:
+ line = f.readline() # next line
+ lineReady = line != '' # when eof, then line == ''
+
+ line = line.strip() # eof should also behave as separator
+ if line != '' and line[0] == '%': # skip the comment line
+ continue
+
+ if not inside: # if outside of the record
+ if line != '': # should be language identifier
+ classId = line
+ maintainersLst = []
+ inside = True
+ # Otherwise skip empty line that do not act as separator.
+
+ else: # if inside the record
+ if line == '': # separator found
+ inside = False
+ else:
+ # If it is the first maintainer, create the empty list.
+ if classId not in self.__maintainersDic:
+ self.__maintainersDic[classId] = []
+
+ # Split the information about the maintainer and append
+ # the tuple. The address may be prefixed '[unreachable]'
+ # or whatever '[xxx]'. This will be processed later.
+ lst = line.split(':', 1)
+ assert(len(lst) == 2)
+ t = (lst[0].strip(), lst[1].strip())
+ self.__maintainersDic[classId].append(t)
+ f.close()
+
+
+ def generateLanguageDoc(self):
+ """Checks the modtime of files and generates language.doc."""
+ self.__loadMaintainers()
+
+ # Check the last modification time of the template file. It is the
+ # last file from the group that decide whether the documentation
+ # should or should not be generated.
+ fTplName = os.path.join(self.doc_path, self.languageTplFileName)
+ tim = os.path.getmtime(fTplName)
+ if tim > self.lastModificationTime:
+ self.lastModificationTime = tim
+
+ # If the generated documentation exists and is newer than any of
+ # the source files from the group, do not generate it and quit
+ # quietly.
+ fDocName = os.path.join(self.doc_path, self.languageDocFileName)
+ if os.path.isfile(fDocName):
+ if os.path.getmtime(fDocName) > self.lastModificationTime:
+ return
+
+ # The document or does not exist or is older than some of the
+ # sources. It must be generated again.
+ #
+ # Read the template of the documentation, and remove the first
+ # attention lines.
+ f = xopen(fTplName)
+ doctpl = f.read()
+ f.close()
+
+ pos = doctpl.find('/***')
+ assert pos != -1
+ doctpl = doctpl[pos:]
+
+ # Fill the tplDic by symbols that will be inserted into the
+ # document template.
+ tplDic = {}
+
+ s = 'Do not edit this file. It was generated by the %s script. * Instead edit %s and %s' % (self.script_name, self.languageTplFileName, self.maintainersFileName)
+ tplDic['editnote'] = s
+
+ tplDic['doxVersion'] = self.doxVersion
+ tplDic['supportedLangReadableStr'] = self.supportedLangReadableStr
+ tplDic['translatorReportFileName'] = self.translatorReportFileName
+
+ ahref = '<a href="../doc/' + self.translatorReportFileName
+ ahref += '"\n><code>doxygen/doc/' + self.translatorReportFileName
+ ahref += '</code></a>'
+ tplDic['translatorReportLink'] = ahref
+ tplDic['numLangStr'] = str(self.numLang)
+
+ # Define templates for HTML table parts of the documentation.
+ htmlTableTpl = '''\
+ \\htmlonly
+ <table align="center" cellspacing="0" cellpadding="0" border="0">
+ <tr bgcolor="#000000">
+ <td>
+ <table cellspacing="1" cellpadding="2" border="0">
+ <tr bgcolor="#4040c0">
+ <td ><b><font size="+1" color="#ffffff"> Language </font></b></td>
+ <td ><b><font size="+1" color="#ffffff"> Maintainer </font></b></td>
+ <td ><b><font size="+1" color="#ffffff"> Contact address </font>
+ <font size="-2" color="#ffffff">(replace the at and dot)</font></b></td>
+ <td ><b><font size="+1" color="#ffffff"> Status </font></b></td>
+ </tr>
+ <!-- table content begin -->
+ %s
+ <!-- table content end -->
+ </table>
+ </td>
+ </tr>
+ </table>
+ \\endhtmlonly
+ '''
+ htmlTableTpl = textwrap.dedent(htmlTableTpl)
+ htmlTrTpl = '\n <tr bgcolor="#ffffff">%s\n </tr>'
+ htmlTdTpl = '\n <td>%s</td>'
+ htmlTdStatusColorTpl = '\n <td bgcolor="%s">%s</td>'
+
+ # Loop through transl objects in the order of sorted readable names
+ # and add generate the content of the HTML table.
+ trlst = []
+ for name, obj in self.langLst:
+ # Fill the table data elements for one row. The first element
+ # contains the readable name of the language. Only the oldest
+ # translator are colour marked in the language columnt. Less
+ # "heavy" color is used (when compared with the Status column).
+ if obj.readableStatus.startswith('1.4'):
+ bkcolor = self.getBgcolorByReadableStatus('1.4')
+ else:
+ bkcolor = '#ffffff'
+
+ lst = [ htmlTdStatusColorTpl % (bkcolor, obj.langReadable) ]
+
+ # The next two elements contain the list of maintainers
+ # and the list of their mangled e-mails. For English-based
+ # translators that are coupled with the non-English based,
+ # insert the 'see' note.
+ mm = None # init -- maintainer
+ ee = None # init -- e-mail address
+ if obj.status == 'En':
+ # Check whether there is the coupled non-English.
+ classId = obj.classId[:-2]
+ if classId in self.__translDic:
+ lang = self.__translDic[classId].langReadable
+ mm = 'see the %s language' % lang
+ ee = ' '
+
+ if not mm and obj.classId in self.__maintainersDic:
+ # Build a string of names separated by the HTML break element.
+ # Special notes used instead of names are highlighted.
+ lm = []
+ for maintainer in self.__maintainersDic[obj.classId]:
+ name = maintainer[0]
+ if name.startswith('--'):
+ name = '<span style="color: red; background-color: yellow">'\
+ + name + '</span>'
+ lm.append(name)
+ mm = '<br/>'.join(lm)
+
+ # The marked adresses (they start with the mark '[unreachable]',
+ # '[resigned]', whatever '[xxx]') will not be displayed at all.
+ # Only the mark will be used instead.
+ rexMark = re.compile('(?P<mark>\\[.*?\\])')
+ le = []
+ for maintainer in self.__maintainersDic[obj.classId]:
+ address = maintainer[1]
+ m = rexMark.search(address)
+ if m is not None:
+ address = '<span style="color: brown">'\
+ + m.group('mark') + '</span>'
+ le.append(address)
+ ee = '<br/>'.join(le)
+
+ # Append the maintainer and e-mail elements.
+ lst.append(htmlTdTpl % mm)
+ lst.append(htmlTdTpl % ee)
+
+ # The last element contains the readable form of the status.
+ bgcolor = self.getBgcolorByReadableStatus(obj.readableStatus)
+ lst.append(htmlTdStatusColorTpl % (bgcolor, obj.readableStatus))
+
+ # Join the table data to one table row.
+ trlst.append(htmlTrTpl % (''.join(lst)))
+
+ # Join the table rows and insert into the template.
+ htmlTable = htmlTableTpl % (''.join(trlst))
+
+ # Define templates for LaTeX table parts of the documentation.
+ latexTableTpl = r'''
+ \latexonly
+ \footnotesize
+ \begin{longtable}{|l|l|l|l|}
+ \hline
+ {\bf Language} & {\bf Maintainer} & {\bf Contact address} & {\bf Status} \\
+ \hline
+ %s
+ \hline
+ \end{longtable}
+ \normalsize
+ \endlatexonly
+ '''
+ latexTableTpl = textwrap.dedent(latexTableTpl)
+ latexLineTpl = '\n' + r' %s & %s & {\tt\tiny %s} & %s \\'
+
+ # Loop through transl objects in the order of sorted readable names
+ # and add generate the content of the LaTeX table.
+ trlst = []
+ for name, obj in self.langLst:
+ # For LaTeX, more maintainers for the same language are
+ # placed on separate rows in the table. The line separator
+ # in the table is placed explicitly above the first
+ # maintainer. Prepare the arguments for the LaTeX row template.
+ maintainers = []
+ if obj.classId in self.__maintainersDic:
+ maintainers = self.__maintainersDic[obj.classId]
+
+ lang = obj.langReadable
+ maintainer = None # init
+ email = None # init
+ if obj.status == 'En':
+ # Check whether there is the coupled non-English.
+ classId = obj.classId[:-2]
+ if classId in self.__translDic:
+ langNE = self.__translDic[classId].langReadable
+ maintainer = 'see the %s language' % langNE
+ email = '~'
+
+ if not maintainer and (obj.classId in self.__maintainersDic):
+ lm = [ m[0] for m in self.__maintainersDic[obj.classId] ]
+ maintainer = maintainers[0][0]
+ email = maintainers[0][1]
+
+ status = obj.readableStatus
+
+ # Use the template to produce the line of the table and insert
+ # the hline plus the constructed line into the table content.
+ # The underscore character must be escaped.
+ trlst.append('\n \\hline')
+ s = latexLineTpl % (lang, maintainer, email, status)
+ s = s.replace('_', '\\_')
+ trlst.append(s)
+
+ # List the other maintainers for the language. Do not set
+ # lang and status for them.
+ lang = '~'
+ status = '~'
+ for m in maintainers[1:]:
+ maintainer = m[0]
+ email = m[1]
+ s = latexLineTpl % (lang, maintainer, email, status)
+ s = s.replace('_', '\\_')
+ trlst.append(s)
+
+ # Join the table lines and insert into the template.
+ latexTable = latexTableTpl % (''.join(trlst))
+
+ # Put the HTML and LaTeX parts together and define the dic item.
+ tplDic['informationTable'] = htmlTable + '\n' + latexTable
+
+ # Insert the symbols into the document template and write it down.
+ f = xopen(fDocName, 'w')
+ f.write(doctpl % tplDic)
+ f.close()
+
+if __name__ == '__main__':
+
+ # The Python 2.6+ or 3.3+ is required.
+ major, minor, patch = (int(e) for e in platform.python_version_tuple())
+ print(major, minor, patch)
+ if (major == 2 and minor < 6) or (major == 3 and minor < 0):
+ print('Python 2.6+ or Python 3.0+ are required for the script')
+ sys.exit(1)
+
+ # The translator manager builds the transl objects, parses the related
+ # sources, and keeps them in memory.
+ trMan = TrManager()
+
+ # Generate the language.doc.
+ trMan.generateLanguageDoc()
+
+ # Generate the translator report.
+ trMan.generateTranslatorReport()
diff --git a/qtools/Doxyfile b/qtools/Doxyfile index bc1eb53..9e9743c 100644 --- a/qtools/Doxyfile +++ b/qtools/Doxyfile @@ -187,8 +187,8 @@ MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest MATHJAX_EXTENSIONS = MATHJAX_CODEFILE = SEARCHENGINE = YES -SERVER_BASED_SEARCH = YES -EXTERNAL_SEARCH = YES +SERVER_BASED_SEARCH = NO +EXTERNAL_SEARCH = NO SEARCHENGINE_URL = http://macbookpro/~dimitri/doxysearch.cgi SEARCHDATA_FILE = searchdata.xml EXTERNAL_SEARCH_ID = diff --git a/qtools/qstring.cpp b/qtools/qstring.cpp index 11187f6..fa8f1d3 100644 --- a/qtools/qstring.cpp +++ b/qtools/qstring.cpp @@ -11492,8 +11492,6 @@ int QLigature::match(QString & str, unsigned int index) return 0; } -#endif - // this function is just used in QString::compose() static inline bool format(QChar::Decomposition tag, QString & str, int index, int len) @@ -11515,7 +11513,7 @@ static inline bool format(QChar::Decomposition tag, QString & str, switch (tag) { case QChar::Medial: - return (left & right); + return (left && right); case QChar::Initial: return (left && !right); case QChar::Final: @@ -11525,6 +11523,7 @@ static inline bool format(QChar::Decomposition tag, QString & str, return (!right && !left); } } // format() +#endif /* QString::compose() and visual() were developed by Gordon Tisher @@ -11604,6 +11603,7 @@ static inline bool is_arabic(unsigned short x) { } #endif +#ifndef QT_NO_UNICODETABLES static inline bool is_neutral(unsigned short dir) { return ((dir == QChar::DirB) || (dir == QChar::DirS) || @@ -11611,6 +11611,7 @@ static inline bool is_neutral(unsigned short dir) { (dir == QChar::DirON) || (dir == QChar::DirNSM)); } +#endif /*! This function returns the basic directionality of the string (QChar::DirR for diff --git a/src/Makefile.in b/src/Makefile.in index 875cf1d..ffe7c16 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -48,7 +48,6 @@ distclean: clean ce_parse.cpp ce_parse.h tag.cpp commentscan.cpp \ declinfo.cpp defargs.cpp commentcnv.cpp doctokenizer.cpp \ pycode.cpp pyscanner.cpp fortrancode.cpp fortranscanner.cpp \ - vhdlscanner.cpp vhdlcode.cpp tclscanner.cpp vhdlparser.h \ - vhdlparser.cpp + vhdlscanner.cpp vhdlcode.cpp tclscanner.cpp FORCE: diff --git a/src/cite.cpp b/src/cite.cpp index a3056ba..a33f12f 100644 --- a/src/cite.cpp +++ b/src/cite.cpp @@ -37,6 +37,8 @@ static const char *bib2xhtml_pl = const QCString CiteConsts::fileName("citelist"); const QCString CiteConsts::anchorPrefix("CITEREF_"); +const QCString bibTmpFile("bibTmpFile_"); +const QCString bibTmpDir("bibTmpDir/"); //-------------------------------------------------------------------------- @@ -45,47 +47,6 @@ CiteDict::CiteDict(int size) : m_entries(size, FALSE) m_entries.setAutoDelete(TRUE); } -static QCString getListOfBibFiles(const QCString &sep,bool namesOnly) -{ - QCString result; - QStrList &citeDataList = Config_getList("CITE_BIB_FILES"); - const char *bibdata = citeDataList.first(); - while (bibdata) - { - int i; - QCString bibFile = bibdata; - if (namesOnly && bibFile.right(4)==".bib") // strip extension - { - bibFile = bibFile.left(bibFile.length()-4); - } - if ((i=bibFile.findRev('/'))!=-1) // strip path - { - bibFile = bibFile.mid(i+1); - } - if (!bibFile.isEmpty()) - { - if (namesOnly) // bare names - { - result+=bibFile; - } - else // add quotes for paths with spaces - { - result+="\""+bibFile+"\""; - } - bibdata = citeDataList.next(); - if (bibdata) - { - result+=sep; - } - } - else - { - bibdata = citeDataList.next(); - } - } - return result; -} - void CiteDict::writeLatexBibliography(FTextStream &t) { if (m_entries.isEmpty()) @@ -104,7 +65,29 @@ void CiteDict::writeLatexBibliography(FTextStream &t) "\\phantomsection\n" "\\addcontentsline{toc}{" << unit << "}{" << theTranslator->trCiteReferences() << "}\n" "\\bibliographystyle{" << style << "}\n" - "\\bibliography{" << getListOfBibFiles(",",TRUE) << "}\n" + "\\bibliography{"; + QStrList &citeDataList = Config_getList("CITE_BIB_FILES"); + QCString latexOutputDir = Config_getString("LATEX_OUTPUT")+"/"; + int i = 0; + const char *bibdata = citeDataList.first(); + while (bibdata) + { + QCString bibFile = bibdata; + // Note: file can now have multiple dots + if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib"; + QFileInfo fi(bibFile); + if (fi.exists()) + { + if (!bibFile.isEmpty()) + { + if (i) t << ","; + i++; + t << bibTmpFile << QString().setNum(i); + } + } + bibdata = citeDataList.next(); + } + t << "}\n" "\n"; } @@ -182,47 +165,44 @@ void CiteDict::generatePage() const f.writeBlock(bstData, bstData.length()); f.close(); - // 4. for html we just copy the bib files to the output so that - // bibtex can find them without path (bibtex doesn't support path's - // with spaces!) - QList<QCString> tempFiles; - tempFiles.setAutoDelete(TRUE); + // 4. for all formats we just copy the bib files to as special output directory + // so bibtex can find them without path (bibtex doesn't support paths or + // filenames with spaces!) + // Strictly not required when only latex is generated + QStrList &citeDataList = Config_getList("CITE_BIB_FILES"); + QCString bibOutputDir = outputDir+"/"+bibTmpDir; + QCString bibOutputFiles = ""; QDir thisDir; - if (Config_getBool("GENERATE_HTML")) + thisDir.mkdir(bibOutputDir); + const char *bibdata = citeDataList.first(); + int i = 0; + while (bibdata) { - // copy bib files to the latex output dir - QStrList &citeDataList = Config_getList("CITE_BIB_FILES"); - QCString bibOutputDir = outputDir+"/"; - QFileInfo fo(bibOutputDir); - const char *bibdata = citeDataList.first(); - while (bibdata) + QCString bibFile = bibdata; + if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib"; + QFileInfo fi(bibFile); + if (fi.exists()) { - QCString bibFile = bibdata; - if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib"; - QFileInfo fi(bibFile); - if (fi.exists() && fi.dirPath(TRUE)!=fo.absFilePath()) - { - if (!bibFile.isEmpty()) - { - QCString destFile=bibOutputDir+fi.fileName().data(); - copyFile(bibFile,destFile); - tempFiles.append(new QCString(destFile)); - } - } - else if (!fi.exists()) + if (!bibFile.isEmpty()) { - err("bib file %s not found!\n",bibFile.data()); + ++i; + copyFile(bibFile,bibOutputDir + bibTmpFile + QCString().setNum(i) + ".bib"); + bibOutputFiles = bibOutputFiles + " " + bibTmpDir + bibTmpFile + QCString().setNum(i) + ".bib"; } - bibdata = citeDataList.next(); } + else if (!fi.exists()) + { + err("bib file %s not found!\n",bibFile.data()); + } + bibdata = citeDataList.next(); } - QCString oldDir = QDir::currentDirPath().utf8(); + QString oldDir = QDir::currentDirPath(); QDir::setCurrent(outputDir); // 5. run bib2xhtml perl script on the generated file which will insert the // bibliography in citelist.doc - portable_system("perl","\""+bib2xhtmlFile+"\" "+getListOfBibFiles(" ",FALSE)+" \""+ + portable_system("perl","\""+bib2xhtmlFile+"\" "+bibOutputFiles+" \""+ citeListFile+"\""); QDir::setCurrent(oldDir); @@ -231,7 +211,7 @@ void CiteDict::generatePage() const f.setName(citeListFile); if (!f.open(IO_ReadOnly)) { - err("could not open file %s/citelist.doc for reading\n",outputDir.data()); + err("could not open file %s for reading\n",citeListFile.data()); } bool insideBib=FALSE; @@ -284,17 +264,22 @@ void CiteDict::generatePage() const // copy bib files to the latex output dir QStrList &citeDataList = Config_getList("CITE_BIB_FILES"); QCString latexOutputDir = Config_getString("LATEX_OUTPUT")+"/"; + int i = 0; const char *bibdata = citeDataList.first(); while (bibdata) { QCString bibFile = bibdata; + // Note: file can now have multiple dots if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib"; QFileInfo fi(bibFile); if (fi.exists()) { if (!bibFile.isEmpty()) { - copyFile(bibFile,latexOutputDir+fi.fileName().data()); + // bug_700510, multile times the same name were overwriting; creating new names + // also for names with spaces + ++i; + copyFile(bibFile,latexOutputDir + bibTmpFile + QCString().setNum(i) + ".bib"); } } else @@ -309,10 +294,14 @@ void CiteDict::generatePage() const thisDir.remove(citeListFile); thisDir.remove(doxygenBstFile); thisDir.remove(bib2xhtmlFile); - while (!tempFiles.isEmpty()) + bibdata = citeDataList.first(); + // we might try to remove too many files as empty files didn't get a coresponding new file + // but the remove function does not emit an error for it and we don't catch the error return + // so no problem. + for (unsigned int j = 1; j <= citeDataList.count(); j++) { - QCString *s=tempFiles.take(0); - thisDir.remove(*s); + thisDir.remove(bibOutputDir + bibTmpFile + QCString().setNum(j) + ".bib"); } + thisDir.rmdir(bibOutputDir); } diff --git a/src/classdef.cpp b/src/classdef.cpp index eded587..c36a83f 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -187,6 +187,8 @@ class ClassDefImpl bool isGeneric; + bool isAnonymous; + uint64 spec; }; @@ -247,7 +249,8 @@ void ClassDefImpl::init(const char *defFileName, const char *name, { isLocal=FALSE; } - isGeneric = lang==SrcLangExt_CSharp && QCString(name).find('<')!=-1; + isGeneric = (lang==SrcLangExt_CSharp || lang==SrcLangExt_Java) && QCString(name).find('<')!=-1; + isAnonymous = QCString(name).find('@')!=-1; } ClassDefImpl::ClassDefImpl() : vhdlSummaryTitles(17) @@ -1772,7 +1775,7 @@ bool ClassDef::visibleInParentsDeclList() const static bool hideUndocClasses = Config_getBool("HIDE_UNDOC_CLASSES"); static bool extractLocalClasses = Config_getBool("EXTRACT_LOCAL_CLASSES"); bool linkable = isLinkable(); - return (name().find('@')==-1 && !isExtension() && + return (!isAnonymous() && !isExtension() && (protection()!=::Private || extractPrivate) && (linkable || (!hideUndocClasses && (!isLocal() || extractLocalClasses))) ); @@ -2597,7 +2600,7 @@ bool ClassDef::isLinkableInProject() const { return !name().isEmpty() && /* has a name */ !isArtificial() && !isHidden() && /* not hidden */ - name().find('@')==-1 && /* not anonymous */ + !isAnonymous() && /* not anonymous */ protectionLevelVisible(m_impl->prot) && /* private/internal */ (!m_impl->isLocal || extractLocal) && /* local */ (hasDocumentation() || !hideUndoc) && /* documented */ @@ -2629,7 +2632,7 @@ bool ClassDef::isVisibleInHierarchy() return // show all classes or a subclass is visible (allExternals || hasNonReferenceSuperClass()) && // and not an anonymous compound - name().find('@')==-1 && + !isAnonymous() && // not an artificially introduced class /*!isArtificial() &&*/ // 1.8.2: allowed these to appear // and not privately inherited @@ -3413,8 +3416,7 @@ QCString ClassDef::getOutputFileBase() const { static bool inlineGroupedClasses = Config_getBool("INLINE_GROUPED_CLASSES"); static bool inlineSimpleClasses = Config_getBool("INLINE_SIMPLE_STRUCTS"); - static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES"); - if (!Doxygen::generatingXmlOutput && !separateMemberPages) + if (!Doxygen::generatingXmlOutput) { Definition *scope=0; if (inlineGroupedClasses && partOfGroups()!=0) @@ -4365,6 +4367,11 @@ bool ClassDef::isPublished() const return m_impl->spec&Entry::Published; } +bool ClassDef::isForwardDeclared() const +{ + return m_impl->spec&Entry::ForwardDecl; +} + bool ClassDef::isObjectiveC() const { return getLanguage()==SrcLangExt_ObjC; @@ -4604,3 +4611,13 @@ bool ClassDef::subGrouping() const return m_impl->subGrouping; } +void ClassDef::setName(const char *name) +{ + m_impl->isAnonymous = QCString(name).find('@')!=-1; + Definition::setName(name); +} + +bool ClassDef::isAnonymous() const +{ + return m_impl->isAnonymous; +} diff --git a/src/classdef.h b/src/classdef.h index 8c5bebf..9f0ae5f 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -271,6 +271,9 @@ class ClassDef : public Definition /** Returns TRUE if this class represents an Objective-C 2.0 extension (nameless category) */ bool isExtension() const; + /** Returns TRUE if this class represents a forward declaration of a template class */ + bool isForwardDeclared() const; + /** Returns the class of which this is a category (Objective-C only) */ ClassDef *categoryOf() const; @@ -307,6 +310,7 @@ class ClassDef : public Definition bool isJavaEnum() const; bool isGeneric() const; + bool isAnonymous() const; const ClassSDict *innerClasses() const; QCString title() const; @@ -357,6 +361,7 @@ class ClassDef : public Definition void addTaggedInnerClass(ClassDef *cd); void setTagLessReference(ClassDef *cd); + void setName(const char *name); //----------------------------------------------------------------------------------- // --- actions ---- diff --git a/src/classlist.cpp b/src/classlist.cpp index 5751356..6615a99 100644 --- a/src/classlist.cpp +++ b/src/classlist.cpp @@ -24,6 +24,7 @@ #include "vhdldocgen.h" #include "defargs.h" #include "arguments.h" +#include "groupdef.h" ClassList::ClassList() : QList<ClassDef>() { @@ -131,21 +132,17 @@ void ClassSDict::writeDocumentation(OutputList &ol,Definition * container) ClassDef *cd=0; for (sdi.toFirst();(cd=sdi.current());++sdi) { - //printf("%s:writeDocumentation() %p embedded=%d container=%p\n", - // cd->name().data(),cd->getOuterScope(),cd->isEmbeddedInOuterScope(), - // container); + //printf("%s:writeDocumentation() %p linkable=%d embedded=%d container=%p partOfGroups=%d\n", + // cd->name().data(),cd->getOuterScope(),cd->isLinkableInProject(),cd->isEmbeddedInOuterScope(), + // container,cd->partOfGroups() ? cd->partOfGroups()->count() : 0); if (cd->name().find('@')==-1 && cd->isLinkableInProject() && cd->isEmbeddedInOuterScope() && (container==0 || cd->partOfGroups()==0) // if container==0 -> show as part of the group docs, otherwise only show if not part of a group - //&& - //(container==0 || // no container -> used for groups - // cd->getOuterScope()==container || // correct container -> used for namespaces and classes - // (container->definitionType()==Definition::TypeFile && cd->getOuterScope()==Doxygen::globalScope && cd->partOfGroups()==0) // non grouped class with file scope -> used for files - //) ) { + //printf(" showing class %s\n",cd->name().data()); if (!found) { ol.writeRuler(); diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp index 45469f2..b0ca85f 100644 --- a/src/cmdmapper.cpp +++ b/src/cmdmapper.cpp @@ -120,8 +120,10 @@ CommandMap cmdMap[] = { "_internalref", CMD_INTERNALREF }, { "dot", CMD_DOT }, { "msc", CMD_MSC }, + { "startuml", CMD_STARTUML }, { "enddot", CMD_ENDDOT }, { "endmsc", CMD_ENDMSC }, + { "enduml", CMD_ENDUML }, { "manonly", CMD_MANONLY }, { "endmanonly", CMD_ENDMANONLY }, { "includelineno", CMD_INCWITHLINES }, diff --git a/src/cmdmapper.h b/src/cmdmapper.h index d89e368..75fd8ec 100644 --- a/src/cmdmapper.h +++ b/src/cmdmapper.h @@ -127,7 +127,9 @@ enum CommandType CMD_DIAFILE = 97, CMD_LATEXINCLUDE = 98, CMD_NDASH = 99, - CMD_MDASH = 100 + CMD_MDASH = 100, + CMD_STARTUML = 101, + CMD_ENDUML = 102 }; enum HtmlTagType @@ -329,44 +329,44 @@ class CallContext public: struct Ctx { - Ctx() : name(g_name), type(g_type), cd(0) {} + Ctx() : name(g_name), type(g_type), d(0) {} QCString name; QCString type; - ClassDef *cd; + Definition *d; }; CallContext() { - m_classList.append(new Ctx); - m_classList.setAutoDelete(TRUE); + m_defList.append(new Ctx); + m_defList.setAutoDelete(TRUE); } virtual ~CallContext() {} - void setClass(ClassDef *cd) + void setScope(Definition *d) { - Ctx *ctx = m_classList.getLast(); + Ctx *ctx = m_defList.getLast(); if (ctx) { - DBG_CTX((stderr,"** Set call context %s (%p)\n",cd==0 ? "<null>" : cd->name().data(),cd)); - ctx->cd=cd; + DBG_CTX((stderr,"** Set call context %s (%p)\n",d==0 ? "<null>" : d->name().data(),d)); + ctx->d=d; } } void pushScope() { - m_classList.append(new Ctx); - DBG_CTX((stderr,"** Push call context %d\n",m_classList.count())); + m_defList.append(new Ctx); + DBG_CTX((stderr,"** Push call context %d\n",m_defList.count())); } void popScope() { - if (m_classList.count()>1) + if (m_defList.count()>1) { - DBG_CTX((stderr,"** Pop call context %d\n",m_classList.count())); - Ctx *ctx = m_classList.getLast(); + DBG_CTX((stderr,"** Pop call context %d\n",m_defList.count())); + Ctx *ctx = m_defList.getLast(); if (ctx) { g_name = ctx->name; g_type = ctx->type; } - m_classList.removeLast(); + m_defList.removeLast(); } else { @@ -376,17 +376,17 @@ class CallContext void clear() { DBG_CTX((stderr,"** Clear call context\n")); - m_classList.clear(); - m_classList.append(new Ctx); + m_defList.clear(); + m_defList.append(new Ctx); } - ClassDef *getClass() const + Definition *getScope() const { - Ctx *ctx = m_classList.getLast(); - if (ctx) return ctx->cd; else return 0; + Ctx *ctx = m_defList.getLast(); + if (ctx) return ctx->d; else return 0; } private: - QList<Ctx> m_classList; + QList<Ctx> m_defList; }; static CallContext g_theCallContext; @@ -732,7 +732,7 @@ static MemberDef *setCallContextForVar(const QCString &name) if (md) { //printf("name=%s scope=%s\n",locName.data(),scope.data()); - g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope())); + g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope())); return md; } } @@ -745,7 +745,7 @@ static MemberDef *setCallContextForVar(const QCString &name) if (md) { //printf("name=%s scope=%s\n",locName.data(),scope.data()); - g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope())); + g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope())); return md; } } @@ -760,7 +760,7 @@ static MemberDef *setCallContextForVar(const QCString &name) if (mcd!=VariableContext::dummyContext) { DBG_CTX((stderr,"local var `%s' mcd=%s\n",name.data(),mcd->name().data())); - g_theCallContext.setClass(mcd); + g_theCallContext.setScope(mcd); } } else @@ -778,7 +778,7 @@ static MemberDef *setCallContextForVar(const QCString &name) if (g_scopeStack.top()!=CLASSBLOCK) { DBG_CTX((stderr,"class member `%s' mcd=%s\n",name.data(),mcd->name().data())); - g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope())); + g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope())); } return md; } @@ -794,7 +794,7 @@ static MemberDef *setCallContextForVar(const QCString &name) MemberDef *md=mn->getFirst(); if (!md->isStatic() || md->getBodyDef()==g_sourceFileDef) { - g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope())); + g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope())); return md; } return 0; @@ -816,7 +816,7 @@ static MemberDef *setCallContextForVar(const QCString &name) (g_forceTagReference.isEmpty() || g_forceTagReference==md->getReference()) ) { - g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope())); + g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope())); //printf("returning member %s in source file %s\n",md->name().data(),g_sourceFileDef->name().data()); return md; } @@ -829,15 +829,15 @@ static MemberDef *setCallContextForVar(const QCString &name) static void updateCallContextForSmartPointer() { - ClassDef *cd = g_theCallContext.getClass(); - //printf("updateCallContextForSmartPointer() cd=%s\n",cd ? cd->name().data() : "<none>"); + Definition *d = g_theCallContext.getScope(); + //printf("updateCallContextForSmartPointer() cd=%s\n",cd ? d->name().data() : "<none>"); MemberDef *md; - if (cd && (md=cd->isSmartPointer())) + if (d && d->definitionType()==Definition::TypeClass && (md=((ClassDef*)d)->isSmartPointer())) { ClassDef *ncd = stripClassName(md->typeString(),md->getOuterScope()); if (ncd) { - g_theCallContext.setClass(ncd); + g_theCallContext.setScope(ncd); //printf("Found smart pointer call %s->%s!\n",cd->name().data(),ncd->name().data()); } } @@ -879,7 +879,7 @@ static bool getLinkInScope(const QCString &c, // scope if (md->getGroupDef()) d = md->getGroupDef(); if (d && d->isLinkable()) { - g_theCallContext.setClass(stripClassName(md->typeString(),md->getOuterScope())); + g_theCallContext.setScope(stripClassName(md->typeString(),md->getOuterScope())); //printf("g_currentDefinition=%p g_currentMemberDef=%p g_insideBody=%d\n", // g_currentDefinition,g_currentMemberDef,g_insideBody); @@ -965,8 +965,18 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName cd=getResolvedClass(d,g_sourceFileDef,bareName,&md); // try unspecialized version } } + NamespaceDef *nd = getResolvedNamespace(className); + if (nd) + { + g_theCallContext.setScope(nd); + addToSearchIndex(className); + writeMultiLineCodeLink(*g_code,nd,clName); + return; + } //printf("md=%s\n",md?md->name().data():"<none>"); - DBG_CTX((stderr,"is found as a type %s\n",cd?cd->name().data():"<null>")); + DBG_CTX((stderr,"is found as a type cd=%s nd=%s\n", + cd?cd->name().data():"<null>", + nd?nd->name().data():"<null>")); if (cd==0 && md==0) // also see if it is variable or enum or enum value { if (getLink(g_classScope,clName,ol,clName,varOnly)) @@ -981,7 +991,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName if (lcd!=VariableContext::dummyContext) { //printf("non-dummy context lcd=%s!\n",lcd->name().data()); - g_theCallContext.setClass(lcd); + g_theCallContext.setScope(lcd); // to following is needed for links to a global variable, but is // no good for a link to a local variable that is also a global symbol. @@ -1011,7 +1021,7 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,const char *clName } writeMultiLineCodeLink(ol,cd,clName); addToSearchIndex(className); - g_theCallContext.setClass(cd); + g_theCallContext.setScope(cd); if (md) { Definition *d = md->getOuterScope()==Doxygen::globalScope ? @@ -1111,7 +1121,7 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const ClassDef *typeClass = stripClassName(removeAnonymousScopes(xmd->typeString()),xmd->getOuterScope()); DBG_CTX((stderr,"%s -> typeName=%p\n",xmd->typeString(),typeClass)); - g_theCallContext.setClass(typeClass); + g_theCallContext.setScope(typeClass); Definition *xd = xmd->getOuterScope()==Doxygen::globalScope ? xmd->getFileDef() : xmd->getOuterScope(); @@ -1142,18 +1152,42 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,MemberDef *xmd,const return FALSE; } -static bool generateClassMemberLink(CodeOutputInterface &ol,ClassDef *mcd,const char *memName) +static bool generateClassMemberLink(CodeOutputInterface &ol,Definition *def,const char *memName) { - if (mcd) + if (def && def->definitionType()==Definition::TypeClass) { - MemberDef *xmd = mcd->getMemberByName(memName); - //printf("generateClassMemberLink(class=%s,member=%s)=%p\n",mcd->name().data(),memName,xmd); + ClassDef *cd = (ClassDef*)def; + MemberDef *xmd = cd->getMemberByName(memName); + //printf("generateClassMemberLink(class=%s,member=%s)=%p\n",def->name().data(),memName,xmd); if (xmd) { return generateClassMemberLink(ol,xmd,memName); } + else + { + Definition *innerDef = cd->findInnerCompound(memName); + if (innerDef) + { + g_theCallContext.setScope(innerDef); + addToSearchIndex(memName); + writeMultiLineCodeLink(*g_code,innerDef,memName); + return TRUE; + } + } + } + else if (def && def->definitionType()==Definition::TypeNamespace) + { + NamespaceDef *nd = (NamespaceDef*)def; + //printf("Looking for %s inside namespace %s\n",memName,nd->name().data()); + Definition *innerDef = nd->findInnerCompound(memName); + if (innerDef) + { + g_theCallContext.setScope(innerDef); + addToSearchIndex(memName); + writeMultiLineCodeLink(*g_code,innerDef,memName); + return TRUE; + } } - return FALSE; } @@ -1743,9 +1777,7 @@ B [ \t] BN [ \t\n\r] ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* SEP ("::"|"\\") -SEPCS (".") SCOPENAME ({SEP}{BN}*)?({ID}{BN}*{SEP}{BN}*)*("~"{BN}*)?{ID} -SCOPENAMECS ({SEPCS}{BN}*)?({ID}{BN}*{SEPCS}{BN}*)*("~"{BN}*)?{ID} TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">" SCOPETNAME (((({ID}{TEMPLIST}?){BN}*)?{SEP}{BN}*)*)((~{BN}*)?{ID}) SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*{SEP}{BN}*)+ @@ -2490,20 +2522,6 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" generateClassOrGlobalLink(*g_code,yytext); g_name+=yytext; } -<Body>{SCOPENAMECS}/{BN}*[;,)\]] { // "int var;" or "var, var2" or "debug(f) macro" - if (!g_insideCS && !g_insideJava) - { - REJECT; - } - else - { - addType(); - // changed this to generateFunctionLink, see bug 624514 - //generateClassOrGlobalLink(*g_code,yytext,FALSE,TRUE); - generateFunctionLink(*g_code,yytext); - g_name+=yytext; - } - } <Body>{SCOPENAME}/{BN}*[;,)\]] { // "int var;" or "var, var2" or "debug(f) macro" addType(); // changed this to generateFunctionLink, see bug 624514 @@ -2511,18 +2529,6 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" generateFunctionLink(*g_code,yytext); g_name+=yytext; } -<Body>{SCOPENAMECS}/{B}* { // p->func() - if (!g_insideCS && !g_insideJava) - { - REJECT; - } - else - { - addType(); - generateClassOrGlobalLink(*g_code,yytext); - g_name+=yytext; - } - } <Body>{SCOPENAME}/{B}* { // p->func() addType(); generateClassOrGlobalLink(*g_code,yytext); @@ -2657,9 +2663,9 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" BEGIN( MemberCall ); } <MemberCall>{SCOPETNAME}/{BN}*"(" { - if (g_theCallContext.getClass()) + if (g_theCallContext.getScope()) { - if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext)) + if (!generateClassMemberLink(*g_code,g_theCallContext.getScope(),yytext)) { g_code->codify(yytext); addToSearchIndex(yytext); @@ -2684,10 +2690,10 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" } } <MemberCall>{SCOPENAME}/{B}* { - if (g_theCallContext.getClass()) + if (g_theCallContext.getScope()) { - DBG_CTX((stderr,"g_theCallContext.getClass()=%p\n",g_theCallContext.getClass())); - if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext)) + DBG_CTX((stderr,"g_theCallContext.getClass()=%p\n",g_theCallContext.getScope())); + if (!generateClassMemberLink(*g_code,g_theCallContext.getScope(),yytext)) { g_code->codify(yytext); addToSearchIndex(yytext); @@ -2733,7 +2739,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" if (*yytext!='[' && !g_type.isEmpty()) { //printf("g_scopeStack.bottom()=%p\n",g_scopeStack.bottom()); - if (g_scopeStack.top()!=CLASSBLOCK) + //if (g_scopeStack.top()!=CLASSBLOCK) // commented out for bug731363 { //printf("AddVariable: '%s' '%s' context=%d\n", // g_type.data(),g_name.data(),g_theVarContext.count()); @@ -3008,7 +3014,7 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\" g_theVarContext.addVariable(g_type,g_name); } g_parmType.resize(0);g_parmName.resize(0); - g_theCallContext.setClass(0); + g_theCallContext.setScope(0); if (*yytext==';' || g_insideBody) { if (!g_insideBody) diff --git a/src/commentcnv.l b/src/commentcnv.l index 4cc9da9..ec56b90 100644 --- a/src/commentcnv.l +++ b/src/commentcnv.l @@ -446,7 +446,7 @@ void replaceComment(int offset); g_blockName=&yytext[1]; BEGIN(VerbatimCode); } -<CComment,ReadLine>[\\@]("dot"|"code"|"msc")/[^a-z_A-Z0-9] { /* start of a verbatim block */ +<CComment,ReadLine>[\\@]("dot"|"code"|"msc"|"startuml")/[^a-z_A-Z0-9] { /* start of a verbatim block */ copyToOutput(yytext,(int)yyleng); g_lastCommentContext = YY_START; g_javaBlock=0; @@ -517,7 +517,7 @@ void replaceComment(int offset); } } } -<VerbatimCode>[\\@]("enddot"|"endcode"|"endmsc") { /* end of verbatim block */ +<VerbatimCode>[\\@]("enddot"|"endcode"|"endmsc"|"enduml") { /* end of verbatim block */ copyToOutput(yytext,(int)yyleng); if (&yytext[4]==g_blockName) { @@ -554,7 +554,7 @@ void replaceComment(int offset); copyToOutput(yytext,(int)yyleng); } <Verbatim>^[ \t]*"///" { - if (g_blockName=="dot" || g_blockName=="msc" || g_blockName.at(0)=='f') + if (g_blockName=="dot" || g_blockName=="msc" || g_blockName=="startuml" || g_blockName.at(0)=='f') { // see bug 487871, strip /// from dot images and formulas. int l=0; diff --git a/src/commentscan.l b/src/commentscan.l index bd20bf0..168907f 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -191,6 +191,7 @@ static DocCmdMap docCmdMap[] = { "manonly", &handleFormatBlock, FALSE }, { "dot", &handleFormatBlock, TRUE }, { "msc", &handleFormatBlock, TRUE }, + { "startuml", &handleFormatBlock, TRUE }, { "code", &handleFormatBlock, TRUE }, { "addindex", &handleAddIndex, FALSE }, { "if", &handleIf, FALSE }, @@ -664,11 +665,11 @@ static void addSection() { if (si->lineNr != -1) { - warn(yyFileName,yyLineNr,"multiple use of section label '%s', (first occurrence: %s, line %d)",g_sectionLabel.data(),si->fileName.data(),si->lineNr); + warn(yyFileName,yyLineNr,"multiple use of section label '%s' while adding section, (first occurrence: %s, line %d)",g_sectionLabel.data(),si->fileName.data(),si->lineNr); } else { - warn(yyFileName,yyLineNr,"multiple use of section label '%s', (first occurrence: %s)",g_sectionLabel.data(),si->fileName.data()); + warn(yyFileName,yyLineNr,"multiple use of section label '%s' while adding section, (first occurrence: %s)",g_sectionLabel.data(),si->fileName.data()); } } else @@ -877,7 +878,7 @@ static int yyread(char *buf,int max_size) /* start command character */ CMD ("\\"|"@") DCMD1 ("arg"|"attention"|"author"|"cite"|"code") -DCMD2 ("date"|"dot"|"msc"|"dotfile"|"example") +DCMD2 ("date"|"dot"|"msc"|"dotfile"|"example"|"startuml") DCMD3 ("htmlinclude"|"htmlonly"|"image"|"include") DCMD4 ("includelineno"|"internal"|"invariant") DCMD5 ("latexinclude"|"latexonly"|"li"|"line"|"manonly"|"name") @@ -914,7 +915,9 @@ FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+@&#] FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]*"\"") ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]* -CITEID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-:/]* +CITESCHAR [a-z_A-Z\x80-\xFF] +CITEECHAR [a-z_A-Z0-9\x80-\xFF\-\+:\/]* +CITEID {CITESCHAR}*{CITEECHAR}+("."{CITESCHAR}*{CITEECHAR}+)* SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?) SCOPENAME "$"?(({ID}?{BN}*("::"|"."){BN}*)*)((~{BN}*)?{ID}) TMPLSPEC "<"{BN}*[^>]+{BN}*">" @@ -1742,11 +1745,11 @@ RCSTAG "$"{ID}":"[^\n$]+"$" { if (si->lineNr != -1) { - warn(yyFileName,yyLineNr,"multiple use of section label '%s', (first occurrence: %s, line %d)",yytext,si->fileName.data(),si->lineNr); + warn(yyFileName,yyLineNr,"multiple use of section label '%s' while adding anchor, (first occurrence: %s, line %d)",yytext,si->fileName.data(),si->lineNr); } else { - warn(yyFileName,yyLineNr,"multiple use of section label '%s', (first occurrence: %s)",yytext,si->fileName.data()); + warn(yyFileName,yyLineNr,"multiple use of section label '%s' while adding anchor, (first occurrence: %s)",yytext,si->fileName.data()); } } else @@ -1783,6 +1786,13 @@ RCSTAG "$"{ID}":"[^\n$]+"$" BEGIN(Comment); } } +<FormatBlock>{CMD}"enduml" { + addOutput(yytext); + if (blockName=="startuml") // found end of the block + { + BEGIN(Comment); + } + } <FormatBlock>[^ \@\*\/\\\n]* { // some word addOutput(yytext); } @@ -1807,9 +1817,11 @@ RCSTAG "$"{ID}":"[^\n$]+"$" addOutput(*yytext); } <FormatBlock><<EOF>> { + QCString endTag = "@end"+blockName; + if (blockName=="startuml") endTag="enduml"; warn(yyFileName,yyLineNr, - "reached end of comment while inside a @%s block; check for missing @end%s tag!", - blockName.data(),blockName.data() + "reached end of comment while inside a @%s block; check for missing @%s tag!", + blockName.data(),endTag.data() ); yyterminate(); } diff --git a/src/compound.xsd b/src/compound.xsd index 2521a2e..be897c3 100644 --- a/src/compound.xsd +++ b/src/compound.xsd @@ -145,12 +145,12 @@ <xsd:attribute name="id" type="xsd:string" /> <xsd:attribute name="prot" type="DoxProtectionKind" /> <xsd:attribute name="static" type="DoxBool" /> - <xsd:attribute name="const" type="DoxBool" /> - <xsd:attribute name="explicit" type="DoxBool" /> - <xsd:attribute name="inline" type="DoxBool" /> - <xsd:attribute name="virt" type="DoxVirtualKind" /> - <xsd:attribute name="volatile" type="DoxBool" /> - <xsd:attribute name="mutable" type="DoxBool" /> + <xsd:attribute name="const" type="DoxBool" use="optional"/> + <xsd:attribute name="explicit" type="DoxBool" use="optional"/> + <xsd:attribute name="inline" type="DoxBool" use="optional"/> + <xsd:attribute name="virt" type="DoxVirtualKind" use="optional"/> + <xsd:attribute name="volatile" type="DoxBool" use="optional"/> + <xsd:attribute name="mutable" type="DoxBool" use="optional"/> <!-- Qt property --> <xsd:attribute name="readable" type="DoxBool" use="optional"/> <xsd:attribute name="writable" type="DoxBool" use="optional"/> @@ -386,7 +386,7 @@ <xsd:element name="rtfonly" type="xsd:string" /> <xsd:element name="latexonly" type="xsd:string" /> <xsd:element name="dot" type="xsd:string" /> - <xsd:element name="msc" type="xsd:string" /> + <xsd:element name="plantuml" type="xsd:string" /> <xsd:element name="anchor" type="docAnchorType" /> <xsd:element name="formula" type="docFormulaType" /> <xsd:element name="ref" type="docRefTextType" /> diff --git a/src/config.l b/src/config.l index 133bc11..a237faf 100644 --- a/src/config.l +++ b/src/config.l @@ -1329,6 +1329,37 @@ void Config::check() mscgenPath=""; } + // check plantuml path + QCString &plantumlJarPath = Config_getString("PLANTUML_JAR_PATH"); + if (!plantumlJarPath.isEmpty()) + { + QFileInfo pu(plantumlJarPath); + if (pu.exists() && pu.isDir()) // PLANTUML_JAR_PATH is directory + { + QFileInfo jar(plantumlJarPath+portable_pathSeparator()+"plantuml.jar"); + if (jar.exists() && jar.isFile()) + { + plantumlJarPath = jar.dirPath(TRUE).utf8()+portable_pathSeparator(); + } + else + { + config_err("Jar file plantuml.jar not found at location " + "specified via PLANTUML_JAR_PATH: '%s'\n",plantumlJarPath.data()); + plantumlJarPath=""; + } + } + else if (pu.exists() && pu.isFile() && plantumlJarPath.right(4)==".jar") // PLANTUML_JAR_PATH is file + { + plantumlJarPath = pu.dirPath(TRUE).utf8()+portable_pathSeparator(); + } + else + { + config_err("path specified via PLANTUML_JAR_PATH does not exist or not a directory: %s\n", + plantumlJarPath.data()); + plantumlJarPath=""; + } + } + // check dia path QCString &diaPath = Config_getString("DIA_PATH"); if (!diaPath.isEmpty()) diff --git a/src/config.xml b/src/config.xml index c832112..f83ee55 100644 --- a/src/config.xml +++ b/src/config.xml @@ -1145,9 +1145,7 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn" \c bibtex tool to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. For \f$\mbox{\LaTeX}\f$ the style of the bibliography can be controlled using \ref cfg_latex_bib_style "LATEX_BIB_STYLE". - To use this - feature you need \c bibtex and \c perl available in the search path. Do not use - file names with spaces, \c bibtex cannot handle them. + To use this feature you need \c bibtex and \c perl available in the search path. See also \ref cmdcite "\\cite" for info how to create references. ]]> </docs> @@ -1780,16 +1778,18 @@ doxygen -w html new_header.html new_footer.html new_stylesheet.css YourConfigFil ]]> </docs> </option> - <option type='string' id='HTML_EXTRA_STYLESHEET' format='file' defval='' depends='GENERATE_HTML'> + <option type='list' id='HTML_EXTRA_STYLESHEET' format='file' defval='' depends='GENERATE_HTML'> <docs> <![CDATA[ - The \c HTML_EXTRA_STYLESHEET tag can be used to specify an additional - user-defined cascading style sheet that is included after the standard + The \c HTML_EXTRA_STYLESHEET tag can be used to specify additional + user-defined cascading style sheets that are included after the standard style sheets created by doxygen. Using this option one can overrule certain style aspects. This is preferred over using \ref cfg_html_stylesheet "HTML_STYLESHEET" since it does not replace the standard style sheet and is therefor more - robust against future updates. Doxygen will copy the style sheet file to + robust against future updates. Doxygen will copy the style sheet files to the output directory. + \note The order of the extra stylesheet files is of importance (e.g. the last + stylesheet in the list overrules the setting of the previous ones in the list). ]]> </docs> <docs doxywizard='0' doxyfile='0'> @@ -2506,11 +2506,10 @@ EXTRA_PACKAGES=times The following commands have a special meaning inside the header: <code>\$title</code>, <code>\$datetime</code>, <code>\$date</code>, <code>\$doxygenversion</code>, <code>\$projectname</code>, - <code>\$projectnumber</code>. - Doxygen will replace them by respectively - the title of the page, the current date and time, only the current date, - the version number of doxygen, the project name (see \ref cfg_project_name "PROJECT_NAME"), or the - project number (see \ref cfg_project_number "PROJECT_NUMBER"). + <code>\$projectnumber</code>, <code>\$projectbrief</code>, + <code>\$projectlogo</code>. + Doxygen will replace <code>\$title</code> with the empy string, for the replacement values of the + other commands the user is refered to \ref cfg_html_header "HTML_HEADER". ]]> </docs> </option> @@ -2521,6 +2520,9 @@ EXTRA_PACKAGES=times the generated \f$\mbox{\LaTeX}\f$ document. The footer should contain everything after the last chapter. If it is left blank doxygen will generate a standard footer. + See \ref cfg_latex_header "LATEX_HEADER" for more information on + how to generate a default footer and what special commands can be + used inside the footer. <br>Note: Only use a user-defined footer if you know what you are doing! ]]> @@ -2551,7 +2553,7 @@ EXTRA_PACKAGES=times <option type='bool' id='USE_PDFLATEX' defval='1' depends='GENERATE_LATEX'> <docs> <![CDATA[ - If the \c LATEX_PDFLATEX tag is set to \c YES, doxygen will use + If the \c USE_PDFLATEX tag is set to \c YES, doxygen will use \c pdflatex to generate the PDF file directly from the \f$\mbox{\LaTeX}\f$ files. Set this option to \c YES to get a higher quality PDF documentation. ]]> @@ -2761,6 +2763,16 @@ front of it. ]]> </docs> </option> + <option type='bool' id='DOCBOOK_PROGRAMLISTING' defval='0' depends='GENERATE_DOCBOOK'> + <docs> +<![CDATA[ + If the \c DOCBOOK_PROGRAMLISTING tag is set to \c YES doxygen will + include the program listings (including syntax highlighting + and cross-referencing information) to the DOCBOOK output. Note that + enabling this will significantly increase the size of the DOCBOOK output. +]]> + </docs> + </option> </group> <group name='AutoGen' docs='Configuration options for the AutoGen Definitions output'> <option type='bool' id='GENERATE_AUTOGEN_DEF' defval='0'> @@ -3074,7 +3086,7 @@ to be found in the default search path. <option type='string' id='DOT_FONTNAME' format='string' defval='Helvetica' depends='HAVE_DOT'> <docs> <![CDATA[ - When you want a differently looking font n the dot files that doxygen generates + When you want a differently looking font in the dot files that doxygen generates you can specify the font name using \c DOT_FONTNAME. You need to make sure dot is able to find the font, which can be done by putting it in a standard location or by setting the @@ -3283,6 +3295,16 @@ to be found in the default search path. ]]> </docs> </option> + <option type='string' id='PLANTUML_JAR_PATH' format='dir' defval='' depends='HAVE_DOT'> + <docs> +<![CDATA[ + When using plantuml, the \c PLANTUML_JAR_PATH tag should be used to specify the path where + java can find the \c plantuml.jar file. If left blank, it is assumed PlantUML is not used or + called during a preprocessing step. Doxygen will generate a warning when it encounters a + \ref cmdstartuml "\\startuml" command in this case and will not generate output for the diagram. +]]> + </docs> + </option> <option type='int' id='DOT_GRAPH_MAX_NODES' minval='0' maxval='10000' defval='50' depends='HAVE_DOT'> <docs> <![CDATA[ @@ -3349,7 +3371,6 @@ remove the intermediate dot files that are used to generate the various graphs. ]]> </docs> </option> - <option type='obsolete' id='USE_WINDOWS_ENCODING'/> <option type='obsolete' id='DETAILS_AT_TOP'/> <option type='obsolete' id='QTHELP_FILE'/> diff --git a/src/configgen.py b/src/configgen.py index 8ec0caa..04ffc8c 100755 --- a/src/configgen.py +++ b/src/configgen.py @@ -18,7 +18,6 @@ import re import textwrap from xml.dom import minidom, Node - def transformDocs(doc): # join lines, unless it is an empty line # remove doxygen layout constructs @@ -112,7 +111,7 @@ def addValues(var, node): if (n.nodeName == "value"): if n.nodeType == Node.ELEMENT_NODE: name = n.getAttribute('name') - print " %s->addValue(\"%s\");" % (var, name) + print(" %s->addValue(\"%s\");" % (var, name)) def parseHeader(node,objName): @@ -123,15 +122,15 @@ def parseHeader(node,objName): if (n.getAttribute('doxyfile') != "0"): doc += parseDocs(n) docC = transformDocs(doc) - print " %s->setHeader(" % (objName) + print(" %s->setHeader(" % (objName)) rng = len(docC) for i in range(rng): line = docC[i] if i != rng - 1: # since we go from 0 to rng-1 - print " \"%s\\n\"" % (line) + print(" \"%s\\n\"" % (line)) else: - print " \"%s\"" % (line) - print " );" + print(" \"%s\"" % (line)) + print(" );") def prepCDocs(node): @@ -201,7 +200,7 @@ def prepCDocs(node): else: if abspath == '1': doc += "<br/>The file has to be specified with full path." - elif file =='image': + elif format =='image': abspath = node.getAttribute('abspath') if defval != '': if abspath != '1': @@ -238,8 +237,8 @@ def parseOption(node): setting = node.getAttribute('setting') docC = prepCDocs(node); if len(setting) > 0: - print "#if %s" % (setting) - print " //----" + print("#if %s" % (setting)) + print(" //----") if type == 'bool': if len(adefval) > 0: enabled = adefval @@ -247,108 +246,108 @@ def parseOption(node): enabled = "TRUE" else: enabled = "FALSE" - print " cb = cfg->addBool(" - print " \"%s\"," % (name) + print(" cb = cfg->addBool(") + print(" \"%s\"," % (name)) rng = len(docC) for i in range(rng): line = docC[i] if i != rng - 1: # since we go from 0 to rng-1 - print " \"%s\\n\"" % (line) + print(" \"%s\\n\"" % (line)) else: - print " \"%s\"," % (line) - print " %s" % (enabled) - print " );" + print(" \"%s\"," % (line)) + print(" %s" % (enabled)) + print(" );") if depends != '': - print " cb->addDependency(\"%s\");" % (depends) + print(" cb->addDependency(\"%s\");" % (depends)) elif type == 'string': - print " cs = cfg->addString(" - print " \"%s\"," % (name) + print(" cs = cfg->addString(") + print(" \"%s\"," % (name)) rng = len(docC) for i in range(rng): line = docC[i] if i != rng - 1: # since we go from 0 to rng-1 - print " \"%s\\n\"" % (line) + print(" \"%s\\n\"" % (line)) else: - print " \"%s\"" % (line) - print " );" + print(" \"%s\"" % (line)) + print(" );") if defval != '': - print " cs->setDefaultValue(\"%s\");" % (defval) + print(" cs->setDefaultValue(\"%s\");" % (defval)) if format == 'file': - print " cs->setWidgetType(ConfigString::File);" + print(" cs->setWidgetType(ConfigString::File);") elif format == 'image': - print " cs->setWidgetType(ConfigString::Image);" + print(" cs->setWidgetType(ConfigString::Image);") elif format == 'dir': - print " cs->setWidgetType(ConfigString::Dir);" + print(" cs->setWidgetType(ConfigString::Dir);") if depends != '': - print " cs->addDependency(\"%s\");" % (depends) + print(" cs->addDependency(\"%s\");" % (depends)) elif type == 'enum': - print " ce = cfg->addEnum(" - print " \"%s\"," % (name) + print(" ce = cfg->addEnum(") + print(" \"%s\"," % (name)) rng = len(docC) for i in range(rng): line = docC[i] if i != rng - 1: # since we go from 0 to rng-1 - print " \"%s\\n\"" % (line) + print(" \"%s\\n\"" % (line)) else: - print " \"%s\"," % (line) - print " \"%s\"" % (defval) - print " );" + print(" \"%s\"," % (line)) + print(" \"%s\"" % (defval)) + print(" );") addValues("ce", node) if depends != '': - print " ce->addDependency(\"%s\");" % (depends) + print(" ce->addDependency(\"%s\");" % (depends)) elif type == 'int': minval = node.getAttribute('minval') maxval = node.getAttribute('maxval') - print " ci = cfg->addInt(" - print " \"%s\"," % (name) + print(" ci = cfg->addInt(") + print(" \"%s\"," % (name)) rng = len(docC) for i in range(rng): line = docC[i] if i != rng - 1: # since we go from 0 to rng-1 - print " \"%s\\n\"" % (line) + print(" \"%s\\n\"" % (line)) else: - print " \"%s\"," % (line) - print " %s,%s,%s" % (minval, maxval, defval) - print " );" + print(" \"%s\"," % (line)) + print(" %s,%s,%s" % (minval, maxval, defval)) + print(" );") if depends != '': - print " ci->addDependency(\"%s\");" % (depends) + print(" ci->addDependency(\"%s\");" % (depends)) elif type == 'list': - print " cl = cfg->addList(" - print " \"%s\"," % (name) + print(" cl = cfg->addList(") + print(" \"%s\"," % (name)) rng = len(docC) for i in range(rng): line = docC[i] if i != rng - 1: # since we go from 0 to rng-1 - print " \"%s\\n\"" % (line) + print(" \"%s\\n\"" % (line)) else: - print " \"%s\"" % (line) - print " );" + print(" \"%s\"" % (line)) + print(" );") addValues("cl", node) if depends != '': - print " cl->addDependency(\"%s\");" % (depends) + print(" cl->addDependency(\"%s\");" % (depends)) if format == 'file': - print " cl->setWidgetType(ConfigList::File);" + print(" cl->setWidgetType(ConfigList::File);") elif format == 'dir': - print " cl->setWidgetType(ConfigList::Dir);" + print(" cl->setWidgetType(ConfigList::Dir);") elif format == 'filedir': - print " cl->setWidgetType(ConfigList::FileAndDir);" + print(" cl->setWidgetType(ConfigList::FileAndDir);") elif type == 'obsolete': - print " cfg->addObsolete(\"%s\");" % (name) + print(" cfg->addObsolete(\"%s\");" % (name)) if len(setting) > 0: - print "#else" - print " cfg->addDisabled(\"%s\");" % (name) - print "#endif" + print("#else") + print(" cfg->addDisabled(\"%s\");" % (name)) + print("#endif") def parseGroups(node): name = node.getAttribute('name') doc = node.getAttribute('docs') - print "%s%s" % (" //-----------------------------------------", - "----------------------------------") - print " cfg->addInfo(\"%s\",\"%s\");" % (name, doc) - print "%s%s" % (" //-----------------------------------------", - "----------------------------------") - print + print("%s%s" % (" //-----------------------------------------", + "----------------------------------")) + print(" cfg->addInfo(\"%s\",\"%s\");" % (name, doc)) + print("%s%s" % (" //-----------------------------------------", + "----------------------------------")) + print("") for n in node.childNodes: if n.nodeType == Node.ELEMENT_NODE: parseOption(n) @@ -360,16 +359,16 @@ def parseGroupCDocs(node): name = n.getAttribute('id') docC = prepCDocs(n); if type != 'obsolete': - print " doc->add(" - print " \"%s\"," % (name) + print(" doc->add(") + print(" \"%s\"," % (name)) rng = len(docC) for i in range(rng): line = docC[i] if i != rng - 1: # since we go from 0 to rng-1 - print " \"%s\\n\"" % (line) + print(" \"%s\\n\"" % (line)) else: - print " \"%s\"" % (line) - print " );" + print(" \"%s\"" % (line)) + print(" );") def parseOptionDoc(node, first): # Handling part for documentation @@ -388,52 +387,52 @@ def parseOptionDoc(node, first): if n.nodeType == Node.ELEMENT_NODE: doc += parseDocs(n) if (first): - print " \\anchor cfg_%s" % (name.lower()) - print "<dl>" - print "" - print "<dt>\\c %s <dd>" % (name) + print(" \\anchor cfg_%s" % (name.lower())) + print("<dl>") + print("") + print("<dt>\\c %s <dd>" % (name)) else: - print " \\anchor cfg_%s" % (name.lower()) - print "<dt>\\c %s <dd>" % (name) - print " \\addindex %s" % (name) - print doc + print(" \\anchor cfg_%s" % (name.lower())) + print("<dt>\\c %s <dd>" % (name)) + print(" \\addindex %s" % (name)) + print(doc) if (type == 'enum'): values = collectValues(node) - print "" - print "Possible values are: " + print("") + print("Possible values are: ") rng = len(values) for i in range(rng): val = values[i] if i == rng - 2: - print "%s and " % (val) + print("%s and " % (val)) elif i == rng - 1: - print "%s." % (val) + print("%s." % (val)) else: - print "%s, " % (val) + print("%s, " % (val)) if (defval != ""): - print "" - print "" - print "The default value is: <code>%s</code>." % (defval) - print "" + print("") + print("") + print("The default value is: <code>%s</code>." % (defval)) + print("") elif (type == 'int'): minval = node.getAttribute('minval') maxval = node.getAttribute('maxval') - print "" - print "" - print "%s: %s%s%s, %s: %s%s%s, %s: %s%s%s." % ( + print("") + print("") + print("%s: %s%s%s, %s: %s%s%s, %s: %s%s%s." % ( " Minimum value", "<code>", minval, "</code>", "maximum value", "<code>", maxval, "</code>", - "default value", "<code>", defval, "</code>") - print "" + "default value", "<code>", defval, "</code>")) + print("") elif (type == 'bool'): - print "" - print "" + print("") + print("") if (node.hasAttribute('altdefval')): - print "The default value is: system dependent." + print("The default value is: system dependent.") else: - print "The default value is: <code>%s</code>." % ( - "YES" if (defval == "1") else "NO") - print "" + print("The default value is: <code>%s</code>." % ( + "YES" if (defval == "1") else "NO")) + print("") elif (type == 'list'): if format == 'string': values = collectValues(node) @@ -441,67 +440,67 @@ def parseOptionDoc(node, first): for i in range(rng): val = values[i] if i == rng - 2: - print "%s and " % (val) + print("%s and " % (val)) elif i == rng - 1: - print "%s." % (val) + print("%s." % (val)) else: - print "%s, " % (val) - print "" + print("%s, " % (val)) + print("") elif (type == 'string'): if format == 'dir': if defval != '': - print "" - print "The default directory is: <code>%s</code>." % ( - defval) + print("") + print("The default directory is: <code>%s</code>." % ( + defval)) elif format == 'file': abspath = node.getAttribute('abspath') if defval != '': - print "" + print("") if abspath != '1': - print "The default file is: <code>%s</code>." % ( - defval) + print("The default file is: <code>%s</code>." % ( + defval)) else: - print "%s: %s%s%s." % ( + print("%s: %s%s%s." % ( "The default file (with absolute path) is", - "<code>",defval,"</code>") + "<code>",defval,"</code>")) else: if abspath == '1': - print "" - print "The file has to be specified with full path." - elif file =='image': + print("") + print("The file has to be specified with full path.") + elif format =='image': abspath = node.getAttribute('abspath') if defval != '': - print "" + print("") if abspath != '1': - print "The default image is: <code>%s</code>." % ( - defval) + print("The default image is: <code>%s</code>." % ( + defval)) else: - print "%s: %s%s%s." % ( + print("%s: %s%s%s." % ( "The default image (with absolute path) is", - "<code>",defval,"</code>") + "<code>",defval,"</code>")) else: if abspath == '1': - print "" - print "The image has to be specified with full path." + print("") + print("The image has to be specified with full path.") else: # format == 'string': if defval != '': - print "" - print "The default value is: <code>%s</code>." % ( - defval) - print "" + print("") + print("The default value is: <code>%s</code>." % ( + defval)) + print("") # depends handling if (node.hasAttribute('depends')): depends = node.getAttribute('depends') - print "" - print "%s \\ref cfg_%s \"%s\" is set to \\c YES." % ( - "This tag requires that the tag", depends.lower(), depends.upper()) + print("") + print("%s \\ref cfg_%s \"%s\" is set to \\c YES." % ( + "This tag requires that the tag", depends.lower(), depends.upper())) return False def parseGroupsDoc(node): name = node.getAttribute('name') doc = node.getAttribute('docs') - print "\section config_%s %s" % (name.lower(), doc) + print("\section config_%s %s" % (name.lower(), doc)) # Start of list has been moved to the first option for better # anchor placement # print "<dl>" @@ -511,7 +510,7 @@ def parseGroupsDoc(node): if n.nodeType == Node.ELEMENT_NODE: first = parseOptionDoc(n, first) if (not first): - print "</dl>" + print("</dl>") def parseGroupsList(node, commandsList): @@ -542,7 +541,7 @@ def parseHeaderDoc(node): if (n.nodeName == "docs"): if (n.getAttribute('documentation') != "0"): doc += parseDocs(n) - print doc + print(doc) def parseFooterDoc(node): @@ -552,7 +551,7 @@ def parseFooterDoc(node): if (n.nodeName == "docs"): if (n.getAttribute('documentation') != "0"): doc += parseDocs(n) - print doc + print(doc) def main(): @@ -561,16 +560,17 @@ def main(): try: doc = xml.dom.minidom.parse(sys.argv[2]) except Exception as inst: - print >> sys.stderr - print >> sys.stderr, inst - print >> sys.stderr + sys.stdout = sys.stderr + print("") + print(inst) + print("") sys.exit(1) elem = doc.documentElement if (sys.argv[1] == "-doc"): - print "/* WARNING: This file is generated!" - print " * Do not edit this file, but edit config.xml instead and run" - print " * python configgen.py -doc config.xml to regenerate this file!" - print " */" + print("/* WARNING: This file is generated!") + print(" * Do not edit this file, but edit config.xml instead and run") + print(" * python configgen.py -doc config.xml to regenerate this file!") + print(" */") # process header for n in elem.childNodes: if n.nodeType == Node.ELEMENT_NODE: @@ -582,10 +582,10 @@ def main(): if n.nodeType == Node.ELEMENT_NODE: if (n.nodeName == "group"): commandsList = parseGroupsList(n, commandsList) - print "\\secreflist" + print("\\secreflist") for x in sorted(commandsList): - print "\\refitem cfg_%s %s" % (x.lower(), x) - print "\\endsecreflist" + print("\\refitem cfg_%s %s" % (x.lower(), x)) + print("\\endsecreflist") # process groups and options for n in elem.childNodes: if n.nodeType == Node.ELEMENT_NODE: @@ -597,24 +597,24 @@ def main(): if (n.nodeName == "footer"): parseFooterDoc(n) elif (sys.argv[1] == "-cpp"): - print "/* WARNING: This file is generated!" - print " * Do not edit this file, but edit config.xml instead and run" - print " * python configgen.py -cpp config.xml to regenerate this file!" - print " */" - print "" - print "#include \"configoptions.h\"" - print "#include \"config.h\"" - print "#include \"portable.h\"" - print "#include \"settings.h\"" - print "" - print "void addConfigOptions(Config *cfg)" - print "{" - print " ConfigString *cs;" - print " ConfigEnum *ce;" - print " ConfigList *cl;" - print " ConfigInt *ci;" - print " ConfigBool *cb;" - print "" + print("/* WARNING: This file is generated!") + print(" * Do not edit this file, but edit config.xml instead and run") + print(" * python configgen.py -cpp config.xml to regenerate this file!") + print(" */") + print("") + print("#include \"configoptions.h\"") + print("#include \"config.h\"") + print("#include \"portable.h\"") + print("#include \"settings.h\"") + print("") + print("void addConfigOptions(Config *cfg)") + print("{") + print(" ConfigString *cs;") + print(" ConfigEnum *ce;") + print(" ConfigList *cl;") + print(" ConfigInt *ci;") + print(" ConfigBool *cb;") + print("") # process header for n in elem.childNodes: if n.nodeType == Node.ELEMENT_NODE: @@ -624,17 +624,17 @@ def main(): if n.nodeType == Node.ELEMENT_NODE: if (n.nodeName == "group"): parseGroups(n) - print "}" + print("}") elif (sys.argv[1] == "-wiz"): - print "/* WARNING: This file is generated!" - print " * Do not edit this file, but edit config.xml instead and run" - print " * python configgen.py -wiz config.xml to regenerate this file!" - print " */" - print "#include \"configdoc.h\"" - print "#include \"docintf.h\"" - print "" - print "void addConfigDocs(DocIntf *doc)" - print "{" + print("/* WARNING: This file is generated!") + print(" * Do not edit this file, but edit config.xml instead and run") + print(" * python configgen.py -wiz config.xml to regenerate this file!") + print(" */") + print("#include \"configdoc.h\"") + print("#include \"docintf.h\"") + print("") + print("void addConfigDocs(DocIntf *doc)") + print("{") for n in elem.childNodes: if n.nodeType == Node.ELEMENT_NODE: if (n.nodeName == "header"): @@ -643,7 +643,7 @@ def main(): if n.nodeType == Node.ELEMENT_NODE: if (n.nodeName == "group"): parseGroupCDocs(n) - print "}" + print("}") if __name__ == '__main__': main() diff --git a/src/context.cpp b/src/context.cpp index 2d46c86..b35fffa 100644 --- a/src/context.cpp +++ b/src/context.cpp @@ -1,3 +1,20 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2014 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +#include <qdir.h> + #include "context.h" #include "config.h" #include "index.h" @@ -23,6 +40,8 @@ #include "membername.h" #include "parserintf.h" #include "portable.h" +#include "arguments.h" +#include "groupdef.h" // TODO: pass the current file to Dot*::writeGraph, so the user can put dot graphs in other // files as well @@ -143,6 +162,10 @@ class GenericNodeListContext : public TemplateListIntf { m_children.setAutoDelete(TRUE); } + static GenericNodeListContext *alloc() + { + return new GenericNodeListContext; + } // TemplateListIntf methods int count() const @@ -265,7 +288,7 @@ class ConfigContext::Private { public: Private() { m_cachedLists.setAutoDelete(TRUE); } - ~Private() { } + virtual ~Private() { } TemplateVariant fetchList(const QCString &name,const QStrList *list) { TemplateVariant *v = m_cachedLists.find(name); @@ -632,6 +655,29 @@ class TranslateContext::Private : public PropertyMapper { return theTranslator->trFileMembers(); } + TemplateVariant fileMembersDescription() const + { + static bool extractAll = Config_getBool("EXTRACT_ALL"); + return theTranslator->trFileMembersDescription(extractAll); + } + TemplateVariant namespaceMembersDescription() const + { + static bool extractAll = Config_getBool("EXTRACT_ALL"); + return theTranslator->trNamespaceMemberDescription(extractAll); + } + TemplateVariant classMembersDescription() const + { + static bool extractAll = Config_getBool("EXTRACT_ALL"); + static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); + if (fortranOpt) + { + return theTranslator->trCompoundMembersDescriptionFortran(extractAll); + } + else + { + return theTranslator->trCompoundMembersDescription(extractAll); + } + } TemplateVariant relatedPagesDesc() const { return theTranslator->trRelatedPagesDescription(); @@ -769,10 +815,60 @@ class TranslateContext::Private : public PropertyMapper bool extractAll = Config_getBool("EXTRACT_ALL"); return theTranslator->trFileListDescription(extractAll); } + TemplateVariant modulesDescription() const + { + bool extractAll = Config_getBool("EXTRACT_ALL"); + return theTranslator->trModulesListDescription(extractAll); + } + TemplateVariant namespaceListDescription() const + { + bool extractAll = Config_getBool("EXTRACT_ALL"); + return theTranslator->trNamespaceListDescription(extractAll); + } TemplateVariant directories() const { return theTranslator->trDirectories(); } + TemplateVariant all() const + { + return theTranslator->trAll(); + } + TemplateVariant functions() const + { + static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); + static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); + return fortranOpt ? theTranslator->trSubprograms() : + vhdlOpt ? VhdlDocGen::trFunctionAndProc() : + theTranslator->trFunctions(); + } + TemplateVariant variables() const + { + return theTranslator->trVariables(); + } + TemplateVariant typedefs() const + { + return theTranslator->trTypedefs(); + } + TemplateVariant enums() const + { + return theTranslator->trEnumerations(); + } + TemplateVariant properties() const + { + return theTranslator->trProperties(); + } + TemplateVariant events() const + { + return theTranslator->trEvents(); + } + TemplateVariant related() const + { + return theTranslator->trRelatedFunctions(); + } + TemplateVariant macros() const + { + return theTranslator->trDefines(); + } Private() { //%% string generatedBy @@ -795,6 +891,8 @@ class TranslateContext::Private : public PropertyMapper addProperty("classHierarchy", this,&Private::classHierarchy); //%% string classMembers addProperty("classMembers", this,&Private::classMembers); + //%% string classMembersDescription + addProperty("classMembersDescription",this,&Private::classMembersDescription); //%% string modules addProperty("modules", this,&Private::modules); //%% string namespaces @@ -813,6 +911,8 @@ class TranslateContext::Private : public PropertyMapper addProperty("fileList", this,&Private::fileList); //%% string fileMembers addProperty("fileMembers", this,&Private::fileMembers); + //%% string fileMembersDescription + addProperty("fileMembersDescription", this,&Private::fileMembersDescription); //%% string relatedPagesDescripiton addProperty("relatedPagesDesc", this,&Private::relatedPagesDesc); //%% string more @@ -845,8 +945,6 @@ class TranslateContext::Private : public PropertyMapper addProperty("defineValue", this,&Private::defineValue); //%% string initialValue addProperty("initialValue", this,&Private::initialValue); - //%% string enumerationValues - addProperty("enumerationValues", this,&Private::enumerationValues); //%% markerstring implements addProperty("implements", this,&Private::implements); //%% markerstring reimplements @@ -885,8 +983,34 @@ class TranslateContext::Private : public PropertyMapper addProperty("detailLevel", this,&Private::detailLevel); //%% string fileListDescription addProperty("fileListDescription",this,&Private::fileListDescription); + //%% string namespaceListDescription + addProperty("namespaceListDescription",this,&Private::namespaceListDescription); //%% string directories addProperty("directories", this,&Private::directories); + //%% string moduleDescript + addProperty("modulesDescription", this,&Private::modulesDescription); + //%% string all + addProperty("all", this,&Private::all); + //%% string functions + addProperty("functions", this,&Private::functions); + //%% string variables + addProperty("variables", this,&Private::variables); + //%% string typedefs + addProperty("typedefs", this,&Private::typedefs); + //%% string enums + addProperty("enums", this,&Private::enums); + //%% string enumValues + addProperty("enumValues", this,&Private::enumerationValues); + //%% string properties + addProperty("properties", this,&Private::properties); + //%% string events + addProperty("events", this,&Private::events); + //%% string related + addProperty("related", this,&Private::related); + //%% string macros + addProperty("macros", this,&Private::macros); + //%% string namespaceMembersDescription + addProperty("namespaceMembersDescription",this,&Private::namespaceMembersDescription); m_javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA"); m_fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); @@ -1077,7 +1201,7 @@ class DefinitionContext : public PropertyMapper static bool createSubdirs = Config_getBool("CREATE_SUBDIRS"); return createSubdirs ? QCString("../../") : QCString(""); } - TemplateVariant relPath() const + virtual TemplateVariant relPath() const { return relPathAsString(); } @@ -1399,6 +1523,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private> addProperty("memberGroups", this,&Private::memberGroups); addProperty("additionalInheritedMembers",this,&Private::additionalInheritedMembers); } + virtual ~Private() {} TemplateVariant title() const { return TemplateVariant(m_classDef->title()); @@ -1470,7 +1595,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private> { DotClassGraph *cg = getClassGraph(); FTextStream t(&result); - cg->writeGraph(t,BITMAP, + cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,TRUE,g_globals.dynSectionId @@ -1515,7 +1640,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private> { DotClassGraph *cg = getCollaborationGraph(); FTextStream t(&result); - cg->writeGraph(t,BITMAP, + cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, g_globals.outputDir+portable_pathSeparator()+m_classDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,TRUE,g_globals.dynSectionId @@ -1744,7 +1869,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private> { if (!m_cache.classes) { - NestedClassListContext *classList = NestedClassListContext::alloc(); + TemplateList *classList = TemplateList::alloc(); if (m_classDef->getClassSDict()) { ClassSDict::Iterator sdi(*m_classDef->getClassSDict()); @@ -1753,7 +1878,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private> { if (cd->visibleInParentsDeclList()) { - classList->append(cd); + classList->append(ClassContext::alloc(cd)); } } } @@ -1974,7 +2099,7 @@ class ClassContext::Private : public DefinitionContext<ClassContext::Private> SharedPtr<InheritanceListContext> inheritedByList; ScopedPtr<DotClassGraph> classGraph; ScopedPtr<DotClassGraph> collaborationGraph; - SharedPtr<NestedClassListContext> classes; + SharedPtr<TemplateList> classes; SharedPtr<MemberListInfoContext> publicTypes; SharedPtr<MemberListInfoContext> publicMethods; SharedPtr<MemberListInfoContext> publicStaticMethods; @@ -2056,12 +2181,26 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri public: Private(NamespaceDef *nd) : DefinitionContext<NamespaceContext::Private>(nd) , m_namespaceDef(nd) { - addProperty("title",this,&Private::title); - addProperty("highlight",this,&Private::highlight); - addProperty("subhighlight",this,&Private::subHighlight); - addProperty("compoundType",this,&Private::compoundType); - addProperty("hasDetails",this,&Private::hasDetails); - } + addProperty("title", this,&Private::title); + addProperty("highlight", this,&Private::highlight); + addProperty("subhighlight", this,&Private::subHighlight); + addProperty("compoundType", this,&Private::compoundType); + addProperty("hasDetails", this,&Private::hasDetails); + addProperty("classes", this,&Private::classes); + addProperty("namespaces", this,&Private::namespaces); + addProperty("constantgroups", this,&Private::constantgroups); + addProperty("typedefs", this,&Private::typedefs); + addProperty("enums", this,&Private::enums); + addProperty("functions", this,&Private::functions); + addProperty("variables", this,&Private::variables); + addProperty("memberGroups", this,&Private::memberGroups); + addProperty("detailedTypedefs", this,&Private::detailedTypedefs); + addProperty("detailedEnums", this,&Private::detailedEnums); + addProperty("detailedFunctions", this,&Private::detailedFunctions); + addProperty("detailedVariables", this,&Private::detailedVariables); + addProperty("inlineClasses", this,&Private::inlineClasses); + } + virtual ~Private() {} TemplateVariant title() const { return TemplateVariant(m_namespaceDef->title()); @@ -2082,8 +2221,186 @@ class NamespaceContext::Private : public DefinitionContext<NamespaceContext::Pri { return m_namespaceDef->hasDetailedDescription(); } + TemplateVariant classes() const + { + if (!m_cache.classes) + { + TemplateList *classList = TemplateList::alloc(); + if (m_namespaceDef->getClassSDict()) + { + ClassSDict::Iterator sdi(*m_namespaceDef->getClassSDict()); + ClassDef *cd; + for (sdi.toFirst();(cd=sdi.current());++sdi) + { + if (cd->visibleInParentsDeclList()) + { + classList->append(ClassContext::alloc(cd)); + } + } + } + m_cache.classes.reset(classList); + } + return m_cache.classes.get(); + } + TemplateVariant namespaces() const + { + if (!m_cache.namespaces) + { + TemplateList *namespaceList = TemplateList::alloc(); + if (m_namespaceDef->getNamespaceSDict()) + { + NamespaceSDict::Iterator sdi(*m_namespaceDef->getNamespaceSDict()); + NamespaceDef *nd; + for (sdi.toFirst();(nd=sdi.current());++sdi) + { + if (nd->isLinkable() && !nd->isConstantGroup()) + { + namespaceList->append(NamespaceContext::alloc(nd)); + } + } + } + m_cache.namespaces.reset(namespaceList); + } + return m_cache.namespaces.get(); + } + TemplateVariant constantgroups() const + { + if (!m_cache.constantgroups) + { + TemplateList *namespaceList = TemplateList::alloc(); + if (m_namespaceDef->getNamespaceSDict()) + { + NamespaceSDict::Iterator sdi(*m_namespaceDef->getNamespaceSDict()); + NamespaceDef *nd; + for (sdi.toFirst();(nd=sdi.current());++sdi) + { + if (nd->isLinkable() && nd->isConstantGroup()) + { + namespaceList->append(NamespaceContext::alloc(nd)); + } + } + } + m_cache.constantgroups.reset(namespaceList); + } + return m_cache.constantgroups.get(); + } + TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list, + MemberListType type,const char *title,bool detailed=FALSE) const + { + if (!list) + { + MemberList *ml = m_namespaceDef->getMemberList(type); + if (ml) + { + list.reset(MemberListInfoContext::alloc(m_namespaceDef,relPathAsString(),ml,title,detailed)); + } + } + if (list) + { + return list.get(); + } + else + { + return TemplateVariant(FALSE); + } + } + TemplateVariant typedefs() const + { + return getMemberList(m_cache.typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs()); + } + TemplateVariant enums() const + { + return getMemberList(m_cache.enums,MemberListType_decEnumMembers,theTranslator->trEnumerations()); + } + TemplateVariant functions() const + { + QCString title = theTranslator->trFunctions(); + SrcLangExt lang = m_namespaceDef->getLanguage(); + if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms(); + else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc(); + return getMemberList(m_cache.functions,MemberListType_decFuncMembers,title); + } + TemplateVariant variables() const + { + return getMemberList(m_cache.variables,MemberListType_decVarMembers,theTranslator->trVariables()); + } + TemplateVariant memberGroups() const + { + if (!m_cache.memberGroups) + { + if (m_namespaceDef->getMemberGroupSDict()) + { + m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_namespaceDef,relPathAsString(),m_namespaceDef->getMemberGroupSDict(),m_namespaceDef->subGrouping())); + } + else + { + m_cache.memberGroups.reset(MemberGroupListContext::alloc()); + } + } + return m_cache.memberGroups.get(); + } + TemplateVariant detailedTypedefs() const + { + return getMemberList(m_cache.detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation()); + } + TemplateVariant detailedEnums() const + { + return getMemberList(m_cache.detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation()); + } + TemplateVariant detailedFunctions() const + { + QCString title = theTranslator->trFunctionDocumentation(); + SrcLangExt lang = m_namespaceDef->getLanguage(); + if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprogramDocumentation(); + return getMemberList(m_cache.detailedFunctions,MemberListType_docFuncMembers,title); + } + TemplateVariant detailedVariables() const + { + return getMemberList(m_cache.detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation()); + } + TemplateVariant inlineClasses() const + { + if (!m_cache.inlineClasses) + { + TemplateList *classList = TemplateList::alloc(); + if (m_namespaceDef->getClassSDict()) + { + ClassSDict::Iterator sdi(*m_namespaceDef->getClassSDict()); + ClassDef *cd; + for (sdi.toFirst();(cd=sdi.current());++sdi) + { + if (cd->name().find('@')==-1 && + cd->isLinkableInProject() && + cd->isEmbeddedInOuterScope() && + cd->partOfGroups()==0) + { + classList->append(ClassContext::alloc(cd)); + } + } + } + m_cache.inlineClasses.reset(classList); + } + return m_cache.inlineClasses.get(); + } private: NamespaceDef *m_namespaceDef; + struct Cachable + { + SharedPtr<TemplateList> classes; + SharedPtr<TemplateList> namespaces; + SharedPtr<TemplateList> constantgroups; + SharedPtr<MemberListInfoContext> typedefs; + SharedPtr<MemberListInfoContext> enums; + SharedPtr<MemberListInfoContext> functions; + SharedPtr<MemberListInfoContext> variables; + SharedPtr<MemberGroupListContext> memberGroups; + SharedPtr<MemberListInfoContext> detailedTypedefs; + SharedPtr<MemberListInfoContext> detailedEnums; + SharedPtr<MemberListInfoContext> detailedFunctions; + SharedPtr<MemberListInfoContext> detailedVariables; + SharedPtr<TemplateList> inlineClasses; + }; + mutable Cachable m_cache; }; //%% } @@ -2142,6 +2459,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> addProperty("inlineClasses", this,&Private::inlineClasses); addProperty("compoundType", this,&Private::compoundType); } + virtual ~Private() {} TemplateVariant title() const { return m_fileDef->title(); @@ -2196,7 +2514,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> { DotInclDepGraph *cg = getIncludeGraph(); FTextStream t(&result); - cg->writeGraph(t,BITMAP, + cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,g_globals.dynSectionId @@ -2227,7 +2545,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> { DotInclDepGraph *cg = getIncludedByGraph(); FTextStream t(&result); - cg->writeGraph(t,BITMAP, + cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, g_globals.outputDir+portable_pathSeparator()+m_fileDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,g_globals.dynSectionId @@ -2267,7 +2585,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> { if (!m_cache.classes) { - NestedClassListContext *classList = NestedClassListContext::alloc(); + TemplateList *classList = TemplateList::alloc(); if (m_fileDef->getClassSDict()) { ClassSDict::Iterator sdi(*m_fileDef->getClassSDict()); @@ -2276,7 +2594,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> { if (cd->visibleInParentsDeclList()) { - classList->append(cd); + classList->append(ClassContext::alloc(cd)); } } } @@ -2288,7 +2606,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> { if (!m_cache.namespaces) { - NestedNamespaceListContext *namespaceList = NestedNamespaceListContext::alloc(); + TemplateList *namespaceList = TemplateList::alloc(); if (m_fileDef->getNamespaceSDict()) { NamespaceSDict::Iterator sdi(*m_fileDef->getNamespaceSDict()); @@ -2297,7 +2615,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> { if (nd->isLinkable() && !nd->isConstantGroup()) { - namespaceList->append(nd); + namespaceList->append(NamespaceContext::alloc(nd)); } } } @@ -2309,7 +2627,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> { if (!m_cache.constantgroups) { - NestedNamespaceListContext *namespaceList = NestedNamespaceListContext::alloc(); + TemplateList *namespaceList = TemplateList::alloc(); if (m_fileDef->getNamespaceSDict()) { NamespaceSDict::Iterator sdi(*m_fileDef->getNamespaceSDict()); @@ -2318,7 +2636,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> { if (nd->isLinkable() && nd->isConstantGroup()) { - namespaceList->append(nd); + namespaceList->append(NamespaceContext::alloc(nd)); } } } @@ -2360,9 +2678,11 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> } TemplateVariant functions() const { - // TODO: Fortran: trSubprograms() - // TODO: VHDL: VhdlDocGen::trFunctionAndProc() - return getMemberList(m_cache.functions,MemberListType_decFuncMembers,theTranslator->trFunctions()); + QCString title = theTranslator->trFunctions(); + SrcLangExt lang = m_fileDef->getLanguage(); + if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms(); + else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc(); + return getMemberList(m_cache.functions,MemberListType_decFuncMembers,title); } TemplateVariant variables() const { @@ -2397,8 +2717,10 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> } TemplateVariant detailedFunctions() const { - // TODO: Fortran: trSubprogramDocumentation() - return getMemberList(m_cache.detailedFunctions,MemberListType_docFuncMembers,theTranslator->trFunctionDocumentation()); + QCString title = theTranslator->trFunctionDocumentation(); + SrcLangExt lang = m_fileDef->getLanguage(); + if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprogramDocumentation(); + return getMemberList(m_cache.detailedFunctions,MemberListType_docFuncMembers,title); } TemplateVariant detailedVariables() const { @@ -2408,7 +2730,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> { if (!m_cache.inlineClasses) { - NestedClassListContext *classList = NestedClassListContext::alloc(); + TemplateList *classList = TemplateList::alloc(); if (m_fileDef->getClassSDict()) { ClassSDict::Iterator sdi(*m_fileDef->getClassSDict()); @@ -2420,7 +2742,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> cd->isEmbeddedInOuterScope() && cd->partOfGroups()==0) { - classList->append(cd); + classList->append(ClassContext::alloc(cd)); } } } @@ -2441,9 +2763,9 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> ScopedPtr<DotInclDepGraph> includeGraph; ScopedPtr<DotInclDepGraph> includedByGraph; ScopedPtr<TemplateVariant> sources; - SharedPtr<NestedClassListContext> classes; - SharedPtr<NestedNamespaceListContext> namespaces; - SharedPtr<NestedNamespaceListContext> constantgroups; + SharedPtr<TemplateList> classes; + SharedPtr<TemplateList> namespaces; + SharedPtr<TemplateList> constantgroups; SharedPtr<MemberListInfoContext> macros; SharedPtr<MemberListInfoContext> typedefs; SharedPtr<MemberListInfoContext> enums; @@ -2455,7 +2777,7 @@ class FileContext::Private : public DefinitionContext<FileContext::Private> SharedPtr<MemberListInfoContext> detailedEnums; SharedPtr<MemberListInfoContext> detailedFunctions; SharedPtr<MemberListInfoContext> detailedVariables; - SharedPtr<NestedClassListContext> inlineClasses; + SharedPtr<TemplateList> inlineClasses; }; mutable Cachable m_cache; }; @@ -2494,6 +2816,7 @@ class DirContext::Private : public DefinitionContext<DirContext::Private> addProperty("hasDetails", this,&Private::hasDetails); addProperty("compoundType", this,&Private::compoundType); } + virtual ~Private() {} TemplateVariant title() const { return TemplateVariant(m_dirDef->shortTitle()); @@ -2554,6 +2877,10 @@ class DirContext::Private : public DefinitionContext<DirContext::Private> { return theTranslator->trDir(FALSE,TRUE); } + TemplateVariant relPath() const + { + return ""; + } private: DirDef *m_dirDef; @@ -2589,32 +2916,67 @@ TemplateVariant DirContext::get(const char *n) const class PageContext::Private : public DefinitionContext<PageContext::Private> { public: - Private(PageDef *pd) : DefinitionContext<PageContext::Private>(pd) , m_pageDef(pd) + Private(PageDef *pd,bool isMainPage) + : DefinitionContext<PageContext::Private>(pd) , m_pageDef(pd), m_isMainPage(isMainPage) { addProperty("title",this,&Private::title); addProperty("highlight",this,&Private::highlight); addProperty("subhighlight",this,&Private::subHighlight); } + virtual ~Private() {} TemplateVariant title() const { - return TemplateVariant(m_pageDef->title()); + if (m_isMainPage) + { + if (mainPageHasTitle()) + { + return m_pageDef->title(); + } + else + { + return theTranslator->trMainPage(); + } + } + else + { + return m_pageDef->title(); + } + } + TemplateVariant relPath() const + { + if (m_pageDef==Doxygen::mainPage) + { + return ""; + } + else + { + return DefinitionContext<PageContext::Private>::relPath(); + } } TemplateVariant highlight() const { - return TemplateVariant("pages"); + if (m_pageDef==Doxygen::mainPage) + { + return "main"; + } + else + { + return "pages"; + } } TemplateVariant subHighlight() const { - return TemplateVariant(""); + return ""; } private: PageDef *m_pageDef; + bool m_isMainPage; }; //%% } -PageContext::PageContext(PageDef *pd) : RefCountedContext("PageContext") +PageContext::PageContext(PageDef *pd,bool isMainPage) : RefCountedContext("PageContext") { - p = new Private(pd); + p = new Private(pd,isMainPage); } PageContext::~PageContext() @@ -2765,7 +3127,11 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> addProperty("isExplicit", this,&Private::isExplicit); addProperty("isMutable", this,&Private::isMutable); addProperty("isGettable", this,&Private::isGettable); + addProperty("isPrivateGettable", this,&Private::isPrivateGettable); + addProperty("isProtectedGettable", this,&Private::isProtectedGettable); addProperty("isSettable", this,&Private::isSettable); + addProperty("isPrivateSettable", this,&Private::isPrivateSettable); + addProperty("isProtectedSettable", this,&Private::isProtectedSettable); addProperty("isReadable", this,&Private::isReadable); addProperty("isWritable", this,&Private::isWritable); addProperty("isAddable", this,&Private::isAddable); @@ -2822,6 +3188,8 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> addProperty("propertyAttrs", this,&Private::propertyAttrs); addProperty("eventAttrs", this,&Private::eventAttrs); addProperty("class", this,&Private::getClass); + addProperty("file", this,&Private::getFile); + addProperty("namespace", this,&Private::getNamespace); addProperty("definition", this,&Private::definition); addProperty("parameters", this,&Private::parameters); addProperty("hasParameterList", this,&Private::hasParameterList); @@ -2854,8 +3222,12 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> m_cache.propertyAttrs.reset(TemplateList::alloc()); if (md && md->isProperty()) { - if (md->isGettable()) m_cache.propertyAttrs->append("get"); - if (md->isSettable()) m_cache.propertyAttrs->append("set"); + if (md->isGettable()) m_cache.propertyAttrs->append("get"); + if (md->isPrivateGettable()) m_cache.propertyAttrs->append("private get"); + if (md->isProtectedGettable()) m_cache.propertyAttrs->append("protected get"); + if (md->isSettable()) m_cache.propertyAttrs->append("set"); + if (md->isPrivateSettable()) m_cache.propertyAttrs->append("private set"); + if (md->isProtectedSettable()) m_cache.propertyAttrs->append("protected set"); } m_cache.eventAttrs.reset(TemplateList::alloc()); if (md && md->isEvent()) @@ -2865,6 +3237,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> if (md->isRaisable()) m_cache.eventAttrs->append("raise"); } } + virtual ~Private() {} TemplateVariant fieldType() const { return createLinkedText(m_memberDef,relPathAsString(),m_memberDef->fieldType()); @@ -2947,12 +3320,28 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> } TemplateVariant isGettable() const { - return m_memberDef->isSettable(); + return m_memberDef->isGettable(); + } + TemplateVariant isPrivateGettable() const + { + return m_memberDef->isPrivateGettable(); + } + TemplateVariant isProtectedGettable() const + { + return m_memberDef->isProtectedGettable(); } TemplateVariant isSettable() const { return m_memberDef->isSettable(); } + TemplateVariant isPrivateSettable() const + { + return m_memberDef->isPrivateSettable(); + } + TemplateVariant isProtectedSettable() const + { + return m_memberDef->isProtectedSettable(); + } TemplateVariant isReadable() const { return m_memberDef->isReadable(); @@ -3266,6 +3655,36 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> return TemplateVariant(FALSE); } } + TemplateVariant getFile() const + { + if (!m_cache.fileDef && m_memberDef->getFileDef()) + { + m_cache.fileDef.reset(FileContext::alloc(m_memberDef->getFileDef())); + } + if (m_cache.fileDef) + { + return m_cache.fileDef.get(); + } + else + { + return TemplateVariant(FALSE); + } + } + TemplateVariant getNamespace() const + { + if (!m_cache.namespaceDef && m_memberDef->getNamespaceDef()) + { + m_cache.namespaceDef.reset(NamespaceContext::alloc(m_memberDef->getNamespaceDef())); + } + if (m_cache.namespaceDef) + { + return m_cache.namespaceDef.get(); + } + else + { + return TemplateVariant(FALSE); + } + } TemplateVariant definition() const { return createLinkedText(m_memberDef,relPathAsString(), @@ -3633,7 +4052,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> DotCallGraph *cg = getCallGraph(); QGString result; FTextStream t(&result); - cg->writeGraph(t,BITMAP, + cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,g_globals.dynSectionId @@ -3673,7 +4092,7 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> DotCallGraph *cg = getCallerGraph(); QGString result; FTextStream t(&result); - cg->writeGraph(t,BITMAP, + cg->writeGraph(t,GOF_BITMAP,EOF_Html, g_globals.outputDir, g_globals.outputDir+portable_pathSeparator()+m_memberDef->getOutputFileBase()+Doxygen::htmlFileExtension, relPathAsString(),TRUE,g_globals.dynSectionId @@ -3696,6 +4115,8 @@ class MemberContext::Private : public DefinitionContext<MemberContext::Private> SharedPtr<ArgumentListContext> templateArgs; SharedPtr<ArgumentListContext> arguments; SharedPtr<MemberListContext> enumValues; + SharedPtr<FileContext> fileDef; + SharedPtr<NamespaceContext> namespaceDef; SharedPtr<ClassContext> classDef; SharedPtr<ClassContext> anonymousType; SharedPtr<TemplateList> templateDecls; @@ -3749,10 +4170,50 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private> public: Private(GroupDef *gd) : DefinitionContext<ModuleContext::Private>(gd) , m_groupDef(gd) { - addProperty("title",this,&Private::title); - addProperty("highlight",this,&Private::highlight); - addProperty("subhighlight",this,&Private::subHighlight); + addProperty("title", this,&Private::title); + addProperty("highlight", this,&Private::highlight); + addProperty("subhighlight", this,&Private::subHighlight); + addProperty("hasGroupGraph", this,&Private::hasGroupGraph); + addProperty("groupGraph", this,&Private::groupGraph); + addProperty("hasDetails", this,&Private::hasDetails); + addProperty("modules", this,&Private::modules); + addProperty("dirs", this,&Private::dirs); + addProperty("files", this,&Private::files); + addProperty("namespaces", this,&Private::namespaces); + addProperty("classes", this,&Private::classes); + addProperty("constantgroups", this,&Private::constantgroups); + addProperty("examples", this,&Private::examples); + addProperty("macros", this,&Private::macros); + addProperty("typedefs", this,&Private::typedefs); + addProperty("enums", this,&Private::enums); + addProperty("enumvalues", this,&Private::enumValues); + addProperty("functions", this,&Private::functions); + addProperty("variables", this,&Private::variables); + addProperty("signals", this,&Private::signals); + addProperty("publicSlots", this,&Private::publicSlots); + addProperty("protectedSlots", this,&Private::protectedSlots); + addProperty("privateSlots", this,&Private::privateSlots); + addProperty("events", this,&Private::events); + addProperty("properties", this,&Private::properties); + addProperty("friends", this,&Private::friends); + addProperty("memberGroups", this,&Private::memberGroups); + addProperty("detailedMacros", this,&Private::detailedMacros); + addProperty("detailedTypedefs", this,&Private::detailedTypedefs); + addProperty("detailedEnums", this,&Private::detailedEnums); + addProperty("detailedEnumValues", this,&Private::detailedEnumValues); + addProperty("detailedFunctions", this,&Private::detailedFunctions); + addProperty("detailedVariables", this,&Private::detailedVariables); + addProperty("detailedSignals", this,&Private::detailedSignals); + addProperty("detailedPublicSlots", this,&Private::detailedPublicSlots); + addProperty("detailedProtectedSlots", this,&Private::detailedProtectedSlots); + addProperty("detailedPrivateSlots", this,&Private::detailedPrivateSlots); + addProperty("detailedEvents", this,&Private::detailedEvents); + addProperty("detailedProperties", this,&Private::detailedProperties); + addProperty("detailedFriends", this,&Private::detailedFriends); + addProperty("inlineClasses", this,&Private::inlineClasses); + addProperty("compoundType", this,&Private::compoundType); } + virtual ~Private() {} TemplateVariant title() const { return TemplateVariant(m_groupDef->groupTitle()); @@ -3765,8 +4226,424 @@ class ModuleContext::Private : public DefinitionContext<ModuleContext::Private> { return TemplateVariant(""); } + DotGroupCollaboration *getGroupGraph() const + { + if (!m_cache.groupGraph) + { + m_cache.groupGraph.reset(new DotGroupCollaboration(m_groupDef)); + } + return m_cache.groupGraph.get(); + } + TemplateVariant hasGroupGraph() const + { + bool result=FALSE; + static bool haveDot = Config_getBool("HAVE_DOT"); + static bool groupGraphs = Config_getBool("GROUP_GRAPHS"); + if (haveDot && groupGraphs) + { + DotGroupCollaboration *graph = getGroupGraph(); + result = !graph->isTrivial(); + } + return result; + } + TemplateVariant groupGraph() const + { + QGString result; + static bool haveDot = Config_getBool("HAVE_DOT"); + static bool groupGraphs = Config_getBool("GROUP_GRAPHS"); + if (haveDot && groupGraphs) + { + DotGroupCollaboration *graph = getGroupGraph(); + FTextStream t(&result); + graph->writeGraph(t,GOF_BITMAP, + EOF_Html, + g_globals.outputDir, + g_globals.outputDir+portable_pathSeparator()+m_groupDef->getOutputFileBase()+Doxygen::htmlFileExtension, + relPathAsString(), + TRUE, + g_globals.dynSectionId); + } + g_globals.dynSectionId++; + return TemplateVariant(result.data(),TRUE); + } + TemplateVariant hasDetails() const + { + return m_groupDef->hasDetailedDescription(); + } + TemplateVariant modules() const + { + if (!m_cache.modules) + { + TemplateList *moduleList = TemplateList::alloc(); + if (m_groupDef->getSubGroups()) + { + GroupListIterator gli(*m_groupDef->getSubGroups()); + GroupDef *gd; + for (gli.toFirst();(gd=gli.current());++gli) + { + if (gd->isVisible()) + { + moduleList->append(ModuleContext::alloc(gd)); + } + } + } + m_cache.modules.reset(moduleList); + } + return m_cache.modules.get(); + } + TemplateVariant examples() const + { + if (!m_cache.examples) + { + TemplateList *exampleList = TemplateList::alloc(); + if (m_groupDef->getExamples()) + { + PageSDict::Iterator eli(*m_groupDef->getExamples()); + PageDef *ex; + for (eli.toFirst();(ex=eli.current());++eli) + { + exampleList->append(PageContext::alloc(ex)); + } + } + m_cache.examples.reset(exampleList); + } + return m_cache.examples.get(); + } + TemplateVariant pages() const + { + if (!m_cache.pages) + { + TemplateList *pageList = TemplateList::alloc(); + if (m_groupDef->getExamples()) + { + PageSDict::Iterator eli(*m_groupDef->getPages()); + PageDef *ex; + for (eli.toFirst();(ex=eli.current());++eli) + { + pageList->append(PageContext::alloc(ex)); + } + } + m_cache.pages.reset(pageList); + } + return m_cache.pages.get(); + } + TemplateVariant dirs() const + { + if (!m_cache.dirs) + { + TemplateList *dirList = TemplateList::alloc(); + if (m_groupDef->getDirs()) + { + QListIterator<DirDef> it(*m_groupDef->getDirs()); + DirDef *dd; + for (it.toFirst();(dd=it.current());++it) + { + dirList->append(DirContext::alloc(dd)); + } + } + m_cache.dirs.reset(dirList); + } + return m_cache.dirs.get(); + } + TemplateVariant files() const + { + if (!m_cache.files) + { + TemplateList *fileList = TemplateList::alloc(); + if (m_groupDef->getFiles()) + { + QListIterator<FileDef> it(*m_groupDef->getFiles()); + FileDef *fd; + for (it.toFirst();(fd=it.current());++it) + { + fileList->append(FileContext::alloc(fd)); + } + } + m_cache.files.reset(fileList); + } + return m_cache.files.get(); + } + TemplateVariant classes() const + { + if (!m_cache.classes) + { + TemplateList *classList = TemplateList::alloc(); + if (m_groupDef->getClasses()) + { + ClassSDict::Iterator sdi(*m_groupDef->getClasses()); + ClassDef *cd; + for (sdi.toFirst();(cd=sdi.current());++sdi) + { + if (cd->visibleInParentsDeclList()) + { + classList->append(ClassContext::alloc(cd)); + } + } + } + m_cache.classes.reset(classList); + } + return m_cache.classes.get(); + } + TemplateVariant namespaces() const + { + if (!m_cache.namespaces) + { + TemplateList *namespaceList = TemplateList::alloc(); + if (m_groupDef->getNamespaces()) + { + NamespaceSDict::Iterator sdi(*m_groupDef->getNamespaces()); + NamespaceDef *nd; + for (sdi.toFirst();(nd=sdi.current());++sdi) + { + if (nd->isLinkable() && !nd->isConstantGroup()) + { + namespaceList->append(NamespaceContext::alloc(nd)); + } + } + } + m_cache.namespaces.reset(namespaceList); + } + return m_cache.namespaces.get(); + } + TemplateVariant constantgroups() const + { + if (!m_cache.constantgroups) + { + TemplateList *namespaceList = TemplateList::alloc(); + if (m_groupDef->getNamespaces()) + { + NamespaceSDict::Iterator sdi(*m_groupDef->getNamespaces()); + NamespaceDef *nd; + for (sdi.toFirst();(nd=sdi.current());++sdi) + { + if (nd->isLinkable() && nd->isConstantGroup()) + { + namespaceList->append(NamespaceContext::alloc(nd)); + } + } + } + m_cache.constantgroups.reset(namespaceList); + } + return m_cache.constantgroups.get(); + } + + TemplateVariant getMemberList(SharedPtr<MemberListInfoContext> &list, + MemberListType type,const char *title,bool detailed=FALSE) const + { + if (!list) + { + MemberList *ml = m_groupDef->getMemberList(type); + if (ml) + { + list.reset(MemberListInfoContext::alloc(m_groupDef,relPathAsString(),ml,title,detailed)); + } + } + if (list) + { + return list.get(); + } + else + { + return TemplateVariant(FALSE); + } + } + TemplateVariant macros() const + { + return getMemberList(m_cache.macros,MemberListType_decDefineMembers,theTranslator->trDefines()); + } + TemplateVariant typedefs() const + { + return getMemberList(m_cache.typedefs,MemberListType_decTypedefMembers,theTranslator->trTypedefs()); + } + TemplateVariant enums() const + { + return getMemberList(m_cache.enums,MemberListType_decEnumMembers,theTranslator->trEnumerations()); + } + TemplateVariant enumValues() const + { + return getMemberList(m_cache.enums,MemberListType_decEnumValMembers,theTranslator->trEnumerationValues()); + } + TemplateVariant functions() const + { + QCString title = theTranslator->trFunctions(); + SrcLangExt lang = m_groupDef->getLanguage(); + if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprograms(); + else if (lang==SrcLangExt_VHDL) title=VhdlDocGen::trFunctionAndProc(); + return getMemberList(m_cache.functions,MemberListType_decFuncMembers,title); + } + TemplateVariant variables() const + { + return getMemberList(m_cache.variables,MemberListType_decVarMembers,theTranslator->trVariables()); + } + TemplateVariant signals() const + { + return getMemberList(m_cache.signals,MemberListType_signals,theTranslator->trSignals()); + } + TemplateVariant publicSlots() const + { + return getMemberList(m_cache.publicSlots,MemberListType_pubSlots,theTranslator->trPublicSlots()); + } + TemplateVariant protectedSlots() const + { + return getMemberList(m_cache.protectedSlots,MemberListType_proSlots,theTranslator->trProtectedSlots()); + } + TemplateVariant privateSlots() const + { + return getMemberList(m_cache.privateSlots,MemberListType_priSlots,theTranslator->trPrivateSlots()); + } + TemplateVariant events() const + { + return getMemberList(m_cache.events,MemberListType_events,theTranslator->trEvents()); + } + TemplateVariant properties() const + { + return getMemberList(m_cache.properties,MemberListType_properties,theTranslator->trProperties()); + } + TemplateVariant friends() const + { + return getMemberList(m_cache.friends,MemberListType_friends,theTranslator->trFriends()); + } + TemplateVariant memberGroups() const + { + if (!m_cache.memberGroups) + { + if (m_groupDef->getMemberGroupSDict()) + { + m_cache.memberGroups.reset(MemberGroupListContext::alloc(m_groupDef,relPathAsString(),m_groupDef->getMemberGroupSDict(),m_groupDef->subGrouping())); + } + else + { + m_cache.memberGroups.reset(MemberGroupListContext::alloc()); + } + } + return m_cache.memberGroups.get(); + } + TemplateVariant detailedMacros() const + { + return getMemberList(m_cache.detailedMacros,MemberListType_docDefineMembers,theTranslator->trDefineDocumentation()); + } + TemplateVariant detailedTypedefs() const + { + return getMemberList(m_cache.detailedTypedefs,MemberListType_docTypedefMembers,theTranslator->trTypedefDocumentation()); + } + TemplateVariant detailedEnums() const + { + return getMemberList(m_cache.detailedEnums,MemberListType_docEnumMembers,theTranslator->trEnumerationTypeDocumentation()); + } + TemplateVariant detailedEnumValues() const + { + return getMemberList(m_cache.detailedEnumValues,MemberListType_docEnumValMembers,theTranslator->trEnumerationValueDocumentation()); + } + TemplateVariant detailedFunctions() const + { + QCString title = theTranslator->trFunctionDocumentation(); + SrcLangExt lang = m_groupDef->getLanguage(); + if (lang==SrcLangExt_Fortran) title=theTranslator->trSubprogramDocumentation(); + return getMemberList(m_cache.detailedFunctions,MemberListType_docFuncMembers,title); + } + TemplateVariant detailedVariables() const + { + return getMemberList(m_cache.detailedVariables,MemberListType_docVarMembers,theTranslator->trVariableDocumentation()); + } + TemplateVariant detailedSignals() const + { + return getMemberList(m_cache.detailedSignals,MemberListType_docSignalMembers,theTranslator->trSignals()); + } + TemplateVariant detailedPublicSlots() const + { + return getMemberList(m_cache.detailedPublicSlots,MemberListType_docPubSlotMembers,theTranslator->trPublicSlots()); + } + TemplateVariant detailedProtectedSlots() const + { + return getMemberList(m_cache.detailedProtectedSlots,MemberListType_docProSlotMembers,theTranslator->trProtectedSlots()); + } + TemplateVariant detailedPrivateSlots() const + { + return getMemberList(m_cache.detailedPrivateSlots,MemberListType_docPriSlotMembers,theTranslator->trPrivateSlots()); + } + TemplateVariant detailedEvents() const + { + return getMemberList(m_cache.detailedEvents,MemberListType_docEventMembers,theTranslator->trEventDocumentation(),TRUE); + } + TemplateVariant detailedProperties() const + { + return getMemberList(m_cache.detailedProperties,MemberListType_docPropMembers,theTranslator->trPropertyDocumentation(),TRUE); + } + TemplateVariant detailedFriends() const + { + return getMemberList(m_cache.detailedFriends,MemberListType_docFriendMembers,theTranslator->trFriends(),TRUE); + } + TemplateVariant inlineClasses() const + { + if (!m_cache.inlineClasses) + { + TemplateList *classList = TemplateList::alloc(); + if (m_groupDef->getClasses()) + { + ClassSDict::Iterator sdi(*m_groupDef->getClasses()); + ClassDef *cd; + for (sdi.toFirst();(cd=sdi.current());++sdi) + { + if (cd->name().find('@')==-1 && + cd->isLinkableInProject() && + cd->isEmbeddedInOuterScope() && + cd->partOfGroups()==0) + { + classList->append(ClassContext::alloc(cd)); + } + } + } + m_cache.inlineClasses.reset(classList); + } + return m_cache.inlineClasses.get(); + } + TemplateVariant compoundType() const + { + return "module"; //theTranslator->trGroup(FALSE,TRUE); + } private: GroupDef *m_groupDef; + struct Cachable + { + SharedPtr<TemplateList> modules; + SharedPtr<TemplateList> dirs; + SharedPtr<TemplateList> files; + SharedPtr<TemplateList> classes; + SharedPtr<TemplateList> namespaces; + SharedPtr<TemplateList> constantgroups; + SharedPtr<TemplateList> examples; + SharedPtr<TemplateList> pages; + SharedPtr<MemberListInfoContext> macros; + SharedPtr<MemberListInfoContext> typedefs; + SharedPtr<MemberListInfoContext> enums; + SharedPtr<MemberListInfoContext> enumValues; + SharedPtr<MemberListInfoContext> functions; + SharedPtr<MemberListInfoContext> variables; + SharedPtr<MemberListInfoContext> signals; + SharedPtr<MemberListInfoContext> publicSlots; + SharedPtr<MemberListInfoContext> protectedSlots; + SharedPtr<MemberListInfoContext> privateSlots; + SharedPtr<MemberListInfoContext> events; + SharedPtr<MemberListInfoContext> properties; + SharedPtr<MemberListInfoContext> friends; + SharedPtr<MemberGroupListContext> memberGroups; + SharedPtr<MemberListInfoContext> detailedMacros; + SharedPtr<MemberListInfoContext> detailedTypedefs; + SharedPtr<MemberListInfoContext> detailedEnums; + SharedPtr<MemberListInfoContext> detailedEnumValues; + SharedPtr<MemberListInfoContext> detailedFunctions; + SharedPtr<MemberListInfoContext> detailedVariables; + SharedPtr<MemberListInfoContext> detailedSignals; + SharedPtr<MemberListInfoContext> detailedPublicSlots; + SharedPtr<MemberListInfoContext> detailedProtectedSlots; + SharedPtr<MemberListInfoContext> detailedPrivateSlots; + SharedPtr<MemberListInfoContext> detailedEvents; + SharedPtr<MemberListInfoContext> detailedProperties; + SharedPtr<MemberListInfoContext> detailedFriends; + SharedPtr<TemplateList> inlineClasses; + ScopedPtr<DotGroupCollaboration> groupGraph; + }; + mutable Cachable m_cache; }; //%% } @@ -3787,88 +4664,6 @@ TemplateVariant ModuleContext::get(const char *n) const //------------------------------------------------------------------------ -//%% list NestedClassList[Class] : list of nested classes -class NestedClassListContext::Private : public GenericNodeListContext -{ -}; - -NestedClassListContext::NestedClassListContext() : RefCountedContext("NestedClassListContext") -{ - p = new Private; -} - -NestedClassListContext::~NestedClassListContext() -{ - delete p; -} - -// TemplateListIntf -int NestedClassListContext::count() const -{ - return p->count(); -} - -TemplateVariant NestedClassListContext::at(int index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIterator *NestedClassListContext::createIterator() const -{ - return p->createIterator(); -} - -void NestedClassListContext::append(ClassDef *cd) -{ - if (cd) - { - p->append(ClassContext::alloc(cd)); - } -} - -//------------------------------------------------------------------------ - -//%% list NestedClassList[Class] : list of nested namespaces -class NestedNamespaceListContext::Private : public GenericNodeListContext -{ -}; - -NestedNamespaceListContext::NestedNamespaceListContext() : RefCountedContext("NestedNamespaceListContext") -{ - p = new Private; -} - -NestedNamespaceListContext::~NestedNamespaceListContext() -{ - delete p; -} - -// TemplateListIntf -int NestedNamespaceListContext::count() const -{ - return p->count(); -} - -TemplateVariant NestedNamespaceListContext::at(int index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIterator *NestedNamespaceListContext::createIterator() const -{ - return p->createIterator(); -} - -void NestedNamespaceListContext::append(NamespaceDef *cd) -{ - if (cd) - { - p->append(NamespaceContext::alloc(cd)); - } -} - -//------------------------------------------------------------------------ - //%% list ClassList[Class] : list of classes class ClassListContext::Private : public GenericNodeListContext { @@ -3924,6 +4719,107 @@ TemplateListIntf::ConstIterator *ClassListContext::createIterator() const //------------------------------------------------------------------------ +//%% list ClassIndex[Class] : list of classes +class ClassIndexContext::Private : public PropertyMapper +{ + public: + Private() + { + addProperty("list", this,&Private::list); + addProperty("fileName", this,&Private::fileName); + addProperty("relPath", this,&Private::relPath); + addProperty("highlight", this,&Private::highlight); + addProperty("subhighlight",this,&Private::subhighlight); + addProperty("title", this,&Private::title); + } + TemplateVariant list() const + { + if (!m_cache.classes) + { + TemplateList *classList = TemplateList::alloc(); + if (Doxygen::classSDict) + { + ClassSDict::Iterator cli(*Doxygen::classSDict); + ClassDef *cd; + for (cli.toFirst() ; (cd=cli.current()) ; ++cli ) + { + if (cd->getLanguage()==SrcLangExt_VHDL && + ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKAGECLASS || + (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS) + ) // no architecture + { + continue; + } + if (cd->isLinkableInProject() && cd->templateMaster()==0) + { + classList->append(ClassContext::alloc(cd)); + } + } + } + m_cache.classes.reset(classList); + } + return m_cache.classes.get(); + } + TemplateVariant fileName() const + { + return "classes"; + } + TemplateVariant relPath() const + { + return ""; + } + TemplateVariant highlight() const + { + return "classes"; + } + TemplateVariant subhighlight() const + { + return "classindex"; + } + TemplateVariant title() const + { + static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); + static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); + if (fortranOpt) + { + return theTranslator->trDataTypes(); + } + else if (vhdlOpt) + { + return VhdlDocGen::trDesignUnits(); + } + else + { + return theTranslator->trCompoundIndex(); + } + } + private: + struct Cachable + { + SharedPtr<TemplateList> classes; + }; + mutable Cachable m_cache; +}; + +ClassIndexContext::ClassIndexContext() : RefCountedContext("ClassIndexContext") +{ + p = new Private; + //p->addClasses(*Doxygen::hiddenClasses); +} + +ClassIndexContext::~ClassIndexContext() +{ + delete p; +} + +// TemplateStructIntf +TemplateVariant ClassIndexContext::get(const char *n) const +{ + return p->get(n); +} + +//------------------------------------------------------------------------ + //%% struct ClassInheritanceNode: node in inheritance tree //%% { class ClassInheritanceNodeContext::Private : public PropertyMapper @@ -4215,6 +5111,10 @@ class NestingNodeContext::Private : public PropertyMapper addProperty("file",this,&Private::getFile); //%% [optional] Dir dir: directory info (if this node represents a directory) addProperty("dir",this,&Private::getDir); + //%% [optional] Page page: page info (if this node represents a page) + addProperty("page",this,&Private::getPage); + //%% [optional] Module module: module info (if this node represents a module) + addProperty("module",this,&Private::getModule); //%% int id addProperty("id",this,&Private::id); //%% string level @@ -4231,6 +5131,8 @@ class NestingNodeContext::Private : public PropertyMapper addNamespaces(addCls); addClasses(); addDirFiles(); + addPages(); + addModules(); } TemplateVariant isLeafNode() const { @@ -4300,6 +5202,36 @@ class NestingNodeContext::Private : public PropertyMapper return TemplateVariant(FALSE); } } + TemplateVariant getPage() const + { + if (!m_cache.pageContext && m_def->definitionType()==Definition::TypePage) + { + m_cache.pageContext.reset(PageContext::alloc((PageDef*)m_def)); + } + if (m_cache.pageContext) + { + return m_cache.pageContext.get(); + } + else + { + return TemplateVariant(FALSE); + } + } + TemplateVariant getModule() const + { + if (!m_cache.moduleContext && m_def->definitionType()==Definition::TypeGroup) + { + m_cache.moduleContext.reset(ModuleContext::alloc((GroupDef*)m_def)); + } + if (m_cache.moduleContext) + { + return m_cache.moduleContext.get(); + } + else + { + return TemplateVariant(FALSE); + } + } TemplateVariant level() const { return m_level; @@ -4381,6 +5313,22 @@ class NestingNodeContext::Private : public PropertyMapper } } } + void addPages() + { + PageDef *pd = m_def->definitionType()==Definition::TypePage ? (PageDef*)m_def : 0; + if (pd && pd->getSubPages()) + { + m_children->addPages(*pd->getSubPages(),FALSE); + } + } + void addModules() + { + GroupDef *gd = m_def->definitionType()==Definition::TypeGroup ? (GroupDef*)m_def : 0; + if (gd && gd->getSubGroups()) + { + m_children->addModules(*gd->getSubGroups()); + } + } private: const NestingNodeContext *m_parent; Definition *m_def; @@ -4393,6 +5341,8 @@ class NestingNodeContext::Private : public PropertyMapper SharedPtr<NamespaceContext> namespaceContext; SharedPtr<DirContext> dirContext; SharedPtr<FileContext> fileContext; + SharedPtr<PageContext> pageContext; + SharedPtr<ModuleContext> moduleContext; ScopedPtr<TemplateVariant> brief; }; mutable Cachable m_cache; @@ -4529,6 +5479,50 @@ class NestingContext::Private : public GenericNodeListContext m_index++; } } + void addPages(const PageSDict &pages,bool rootOnly) + { + SDict<PageDef>::Iterator pli(pages); + PageDef *pd; + for (pli.toFirst();(pd=pli.current());++pli) + { + if (!rootOnly || + pd->getOuterScope()==0 || + pd->getOuterScope()->definitionType()!=Definition::TypePage) + { + append(NestingNodeContext::alloc(m_parent,pd,m_index,m_level,FALSE)); + m_index++; + } + } + } + void addModules(const GroupSDict &groups) + { + GroupSDict::Iterator gli(groups); + GroupDef *gd; + for (gli.toFirst();(gd=gli.current());++gli) + { + static bool externalGroups = Config_getBool("EXTERNAL_GROUPS"); + if (!gd->isASubGroup() && gd->isVisible() && + (!gd->isReference() || externalGroups) + ) + { + append(NestingNodeContext::alloc(m_parent,gd,m_index,m_level,FALSE)); + m_index++; + } + } + } + void addModules(const GroupList &list) + { + GroupListIterator gli(list); + GroupDef *gd; + for (gli.toFirst();(gd=gli.current());++gli) + { + if (gd->isVisible()) + { + append(NestingNodeContext::alloc(m_parent,gd,m_index,m_level,FALSE)); + m_index++; + } + } + } private: const NestingNodeContext *m_parent; int m_level; @@ -4591,6 +5585,20 @@ void NestingContext::addFiles(const FileList &files) p->addFiles(files); } +void NestingContext::addPages(const PageSDict &pages,bool rootOnly) +{ + p->addPages(pages,rootOnly); +} + +void NestingContext::addModules(const GroupSDict &modules) +{ + p->addModules(modules); +} + +void NestingContext::addModules(const GroupList &modules) +{ + p->addModules(modules); +} //------------------------------------------------------------------------ @@ -4829,9 +5837,26 @@ TemplateListIntf::ConstIterator *NamespaceListContext::createIterator() const class NamespaceTreeContext::Private : public PropertyMapper { public: + Private() + { + m_namespaceTree.reset(NestingContext::alloc(0,0)); + if (Doxygen::namespaceSDict) + { + m_namespaceTree->addNamespaces(*Doxygen::namespaceSDict,TRUE,FALSE); + } + //%% Nesting tree + addProperty("tree",this,&Private::tree); + addProperty("fileName",this,&Private::fileName); + addProperty("relPath",this,&Private::relPath); + addProperty("highlight",this,&Private::highlight); + addProperty("subhighlight",this,&Private::subhighlight); + addProperty("title",this,&Private::title); + addProperty("preferredDepth",this,&Private::preferredDepth); + addProperty("maxDepth",this,&Private::maxDepth); + } TemplateVariant tree() const { - return TemplateVariant(&m_namespaceTree); + return m_namespaceTree.get(); } TemplateVariant fileName() const { @@ -4867,23 +5892,35 @@ class NamespaceTreeContext::Private : public PropertyMapper return theTranslator->trNamespaceList(); } } - Private() + TemplateVariant maxDepth() const { - m_namespaceTree.reset(NestingContext::alloc(0,0)); - if (Doxygen::namespaceSDict) + if (!m_cache.maxDepthComputed) { - m_namespaceTree->addNamespaces(*Doxygen::namespaceSDict,TRUE,FALSE); + m_cache.maxDepth = computeMaxDepth(m_namespaceTree.get()); + m_cache.maxDepthComputed=TRUE; } - //%% Nesting tree - addProperty("tree",this,&Private::tree); - addProperty("fileName",this,&Private::fileName); - addProperty("relPath",this,&Private::relPath); - addProperty("highlight",this,&Private::highlight); - addProperty("subhighlight",this,&Private::subhighlight); - addProperty("title",this,&Private::title); + return m_cache.maxDepth; + } + TemplateVariant preferredDepth() const + { + if (!m_cache.preferredDepthComputed) + { + m_cache.preferredDepth = computePreferredDepth(m_namespaceTree.get(),maxDepth().toInt()); + m_cache.preferredDepthComputed=TRUE; + } + return m_cache.preferredDepth; } private: SharedPtr<NestingContext> m_namespaceTree; + struct Cachable + { + Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {} + int maxDepth; + bool maxDepthComputed; + int preferredDepth; + bool preferredDepthComputed; + }; + mutable Cachable m_cache; }; //%% } @@ -5085,7 +6122,7 @@ class FileTreeContext::Private : public PropertyMapper } TemplateVariant tree() const { - return TemplateVariant(&m_dirFileTree); + return m_dirFileTree.get(); } TemplateVariant fileName() const { @@ -5156,127 +6193,33 @@ TemplateVariant FileTreeContext::get(const char *name) const //------------------------------------------------------------------------ -//%% struct PageNode: node is a directory hierarchy +//%% struct PageTree: tree of related pages //%% { -class PageNodeContext::Private : public PropertyMapper +class PageTreeContext::Private : public PropertyMapper { public: - Private(PageDef *pd) : m_pageDef(pd) - { - m_children.reset(PageNodeListContext::alloc()); - m_pageContext.reset(PageContext::alloc(pd)); - //%% bool is_leaf_node: true if this node does not have any children - addProperty("is_leaf_node",this,&Private::isLeafNode); - //%% PageList children: list of nested classes/namespaces - addProperty("children",this,&Private::children); - //%% Page page: page info - addProperty("page",this,&Private::getPage); - addPages(); - } - TemplateVariant isLeafNode() const - { - return m_children->count()==0; - } - TemplateVariant children() const - { - return m_children.get(); - } - TemplateVariant getPage() const - { - return m_pageContext.get(); - } - void addPages() + Private() { - if (m_pageDef->getSubPages()) + m_pageTree.reset(NestingContext::alloc(0,0)); + // Add pages + if (Doxygen::pageSDict) { - m_children->addPages(*m_pageDef->getSubPages(),FALSE); + m_pageTree->addPages(*Doxygen::pageSDict,TRUE); } - } - private: - PageDef *m_pageDef; - SharedPtr<PageNodeListContext> m_children; - SharedPtr<PageContext> m_pageContext; -}; -//%% } - -PageNodeContext::PageNodeContext(PageDef *pd) : RefCountedContext("PageNodeContext") -{ - p = new Private(pd); -} - -PageNodeContext::~PageNodeContext() -{ - delete p; -} -TemplateVariant PageNodeContext::get(const char *n) const -{ - return p->get(n); -} - -//------------------------------------------------------------------------ - -//%% list PageList[PageNode]: list of directories and/or files -class PageNodeListContext::Private : public GenericNodeListContext -{ - public: - void addPages(const PageSDict &pages,bool rootOnly) - { - SDict<PageDef>::Iterator pli(pages); - PageDef *pd; - for (pli.toFirst();(pd=pli.current());++pli) - { - if (!rootOnly || - pd->getOuterScope()==0 || - pd->getOuterScope()->definitionType()!=Definition::TypePage) - { - append(PageNodeContext::alloc(pd)); - } - } + //%% PageNodeList tree: + addProperty("tree",this,&Private::tree); + addProperty("fileName",this,&Private::fileName); + addProperty("relPath",this,&Private::relPath); + addProperty("highlight",this,&Private::highlight); + addProperty("subhighlight",this,&Private::subhighlight); + addProperty("title",this,&Private::title); + addProperty("preferredDepth",this,&Private::preferredDepth); + addProperty("maxDepth",this,&Private::maxDepth); } -}; - -PageNodeListContext::PageNodeListContext() : RefCountedContext("PageNodeListContext") -{ - p = new Private; -} - -PageNodeListContext::~PageNodeListContext() -{ - delete p; -} - -// TemplateListIntf -int PageNodeListContext::count() const -{ - return p->count(); -} - -TemplateVariant PageNodeListContext::at(int index) const -{ - return p->at(index); -} - -TemplateListIntf::ConstIterator *PageNodeListContext::createIterator() const -{ - return p->createIterator(); -} - -void PageNodeListContext::addPages(const PageSDict &pages,bool rootOnly) -{ - p->addPages(pages,rootOnly); -} - -//------------------------------------------------------------------------ - -//%% struct PageTree: tree of related pages -//%% { -class PageTreeContext::Private : public PropertyMapper -{ - public: TemplateVariant tree() const { - return m_pageList.get(); + return m_pageTree.get(); } TemplateVariant fileName() const { @@ -5298,25 +6241,35 @@ class PageTreeContext::Private : public PropertyMapper { return theTranslator->trRelatedPages(); } - Private() + TemplateVariant maxDepth() const { - m_pageList.reset(PageNodeListContext::alloc()); - // Add pages - if (Doxygen::pageSDict) + if (!m_cache.maxDepthComputed) { - m_pageList->addPages(*Doxygen::pageSDict,TRUE); + m_cache.maxDepth = computeMaxDepth(m_pageTree.get()); + m_cache.maxDepthComputed=TRUE; } - - //%% PageNodeList tree: - addProperty("tree",this,&Private::tree); - addProperty("fileName",this,&Private::fileName); - addProperty("relPath",this,&Private::relPath); - addProperty("highlight",this,&Private::highlight); - addProperty("subhighlight",this,&Private::subhighlight); - addProperty("title",this,&Private::title); + return m_cache.maxDepth; + } + TemplateVariant preferredDepth() const + { + if (!m_cache.preferredDepthComputed) + { + m_cache.preferredDepth = computePreferredDepth(m_pageTree.get(),maxDepth().toInt()); + m_cache.preferredDepthComputed=TRUE; + } + return m_cache.preferredDepth; } private: - SharedPtr<PageNodeListContext> m_pageList; + SharedPtr<NestingContext> m_pageTree; + struct Cachable + { + Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {} + int maxDepth; + bool maxDepthComputed; + int preferredDepth; + bool preferredDepthComputed; + }; + mutable Cachable m_cache; }; //%% } @@ -5337,65 +6290,28 @@ TemplateVariant PageTreeContext::get(const char *name) const //------------------------------------------------------------------------ -//%% struct PageList: list of related pages -//%% { -class PageListContext::Private : public PropertyMapper +//%% list PageList[Page]: list of pages +class PageListContext::Private : public GenericNodeListContext { public: - TemplateVariant items() const - { - return m_pageList.get(); - } - TemplateVariant fileName() const - { - return "pages"; - } - TemplateVariant relPath() const - { - return ""; - } - TemplateVariant highlight() const - { - return "pages"; - } - TemplateVariant subhighlight() const - { - return ""; - } - TemplateVariant title() const - { - return theTranslator->trRelatedPages(); - } - Private() + void addPages(const PageSDict &pages) { - m_pageList.reset(new GenericNodeListContext); - // Add pages - PageSDict::Iterator pdi(*Doxygen::pageSDict); + PageSDict::Iterator pdi(pages); PageDef *pd=0; for (pdi.toFirst();(pd=pdi.current());++pdi) { if (!pd->getGroupDef() && !pd->isReference()) { - m_pageList->append(PageContext::alloc(pd)); + append(PageContext::alloc(pd)); } } - - //%% list[Page] items: - addProperty("items",this,&Private::items); - addProperty("fileName",this,&Private::fileName); - addProperty("relPath",this,&Private::relPath); - addProperty("highlight",this,&Private::highlight); - addProperty("subhighlight",this,&Private::subhighlight); - addProperty("title",this,&Private::title); } - private: - SharedPtr<GenericNodeListContext> m_pageList; }; -//%% } -PageListContext::PageListContext() : RefCountedContext("PageListContext") +PageListContext::PageListContext(const PageSDict *pages) : RefCountedContext("PageListContext") { p = new Private; + if (pages) p->addPages(*pages); } PageListContext::~PageListContext() @@ -5403,70 +6319,20 @@ PageListContext::~PageListContext() delete p; } -TemplateVariant PageListContext::get(const char *name) const -{ - return p->get(name); -} - - -//------------------------------------------------------------------------ - -//%% struct ModuleNode: node is a directory hierarchy -//%% { -class ModuleNodeContext::Private : public PropertyMapper -{ - public: - Private(GroupDef *gd) : m_groupDef(gd) - { - m_children.reset(ModuleListContext::alloc()); - m_moduleContext.reset(ModuleContext::alloc(gd)); - //%% bool is_leaf_node: true if this node does not have any children - addProperty("is_leaf_node",this,&Private::isLeafNode); - //%% ModuleList children: list of submodules - addProperty("children",this,&Private::children); - //%% Module module: module info - addProperty("module",this,&Private::getModule); - addModules(); - } - TemplateVariant isLeafNode() const - { - return m_children->count()==0; - } - TemplateVariant children() const - { - return m_children.get(); - } - TemplateVariant getModule() const - { - return m_moduleContext.get(); - } - void addModules() - { - if (m_groupDef->getSubGroups()) - { - m_children->addModules(*m_groupDef->getSubGroups()); - } - } - private: - GroupDef *m_groupDef; - SharedPtr<ModuleListContext> m_children; - SharedPtr<ModuleContext> m_moduleContext; -}; -//%% } - -ModuleNodeContext::ModuleNodeContext(GroupDef *gd) : RefCountedContext("ModuleNodeContext") +// TemplateListIntf +int PageListContext::count() const { - p = new Private(gd); + return p->count(); } -ModuleNodeContext::~ModuleNodeContext() +TemplateVariant PageListContext::at(int index) const { - delete p; + return p->at(index); } -TemplateVariant ModuleNodeContext::get(const char *n) const +TemplateListIntf::ConstIterator *PageListContext::createIterator() const { - return p->get(n); + return p->createIterator(); } //------------------------------------------------------------------------ @@ -5475,33 +6341,24 @@ TemplateVariant ModuleNodeContext::get(const char *n) const class ModuleListContext::Private : public GenericNodeListContext { public: - void addModules(const GroupSDict &modules) + void addModules() { - static bool externalGroups = Config_getBool("EXTERNAL_GROUPS"); - GroupSDict::Iterator gli(modules); + GroupSDict::Iterator gli(*Doxygen::groupSDict); GroupDef *gd; for (gli.toFirst();(gd=gli.current());++gli) { - if (!gd->isASubGroup() && gd->isVisible() && (!gd->isReference() || externalGroups)) + if (!gd->isReference()) { - append(ModuleNodeContext::alloc(gd)); + append(ModuleContext::alloc(gd)); } } } - void addModules(const GroupList &list) - { - QListIterator<GroupDef> gli(list); - GroupDef *gd; - for (gli.toFirst();(gd=gli.current());++gli) - { - append(ModuleNodeContext::alloc(gd)); - } - } }; ModuleListContext::ModuleListContext() : RefCountedContext("ModuleListContext") { p = new Private; + p->addModules(); } ModuleListContext::~ModuleListContext() @@ -5525,17 +6382,6 @@ TemplateListIntf::ConstIterator *ModuleListContext::createIterator() const return p->createIterator(); } -void ModuleListContext::addModules(const GroupSDict &modules) -{ - p->addModules(modules); -} - -void ModuleListContext::addModules(const GroupList &modules) -{ - p->addModules(modules); -} - - //------------------------------------------------------------------------ //%% struct ModuleTree: tree of modules @@ -5543,9 +6389,28 @@ void ModuleListContext::addModules(const GroupList &modules) class ModuleTreeContext::Private : public PropertyMapper { public: + Private() + { + m_moduleTree.reset(NestingContext::alloc(0,0)); + // Add modules + if (Doxygen::groupSDict) + { + m_moduleTree->addModules(*Doxygen::groupSDict); + } + + //%% ModuleList tree: + addProperty("tree",this,&Private::tree); + addProperty("fileName",this,&Private::fileName); + addProperty("relPath",this,&Private::relPath); + addProperty("highlight",this,&Private::highlight); + addProperty("subhighlight",this,&Private::subhighlight); + addProperty("title",this,&Private::title); + addProperty("preferredDepth",this,&Private::preferredDepth); + addProperty("maxDepth",this,&Private::maxDepth); + } TemplateVariant tree() const { - return TemplateVariant(&m_moduleList); + return m_moduleTree.get(); } TemplateVariant fileName() const { @@ -5567,25 +6432,35 @@ class ModuleTreeContext::Private : public PropertyMapper { return theTranslator->trModules(); } - Private() + TemplateVariant maxDepth() const { - m_moduleList.reset(ModuleListContext::alloc()); - // Add modules - if (Doxygen::groupSDict) + if (!m_cache.maxDepthComputed) { - m_moduleList->addModules(*Doxygen::groupSDict); + m_cache.maxDepth = computeMaxDepth(m_moduleTree.get()); + m_cache.maxDepthComputed=TRUE; } - - //%% ModuleList tree: - addProperty("tree",this,&Private::tree); - addProperty("fileName",this,&Private::fileName); - addProperty("relPath",this,&Private::relPath); - addProperty("highlight",this,&Private::highlight); - addProperty("subhighlight",this,&Private::subhighlight); - addProperty("title",this,&Private::title); + return m_cache.maxDepth; + } + TemplateVariant preferredDepth() const + { + if (!m_cache.preferredDepthComputed) + { + m_cache.preferredDepth = computePreferredDepth(m_moduleTree.get(),maxDepth().toInt()); + m_cache.preferredDepthComputed=TRUE; + } + return m_cache.preferredDepth; } private: - SharedPtr<ModuleListContext> m_moduleList; + SharedPtr<NestingContext> m_moduleTree; + struct Cachable + { + Cachable() : maxDepthComputed(FALSE), preferredDepthComputed(FALSE) {} + int maxDepth; + bool maxDepthComputed; + int preferredDepth; + bool preferredDepthComputed; + }; + mutable Cachable m_cache; }; //%% } @@ -5638,7 +6513,7 @@ class NavPathElemContext::Private : public PropertyMapper { text = ((const GroupDef*)m_def)->groupTitle(); } - else if (type==Definition::TypePage && !(((const PageDef*)this)->title().isEmpty())) + else if (type==Definition::TypePage && !(((const PageDef*)m_def)->title().isEmpty())) { text = ((const PageDef*)m_def)->title(); } @@ -5681,7 +6556,7 @@ class ExampleListContext::Private : public PropertyMapper public: TemplateVariant items() const { - return TemplateVariant(&m_pageList); + return m_pageList.get(); } TemplateVariant fileName() const { @@ -5705,14 +6580,8 @@ class ExampleListContext::Private : public PropertyMapper } Private() { - m_pageList.reset(PageNodeListContext::alloc()); - // Add pages - if (Doxygen::exampleSDict) - { - m_pageList->addPages(*Doxygen::exampleSDict,FALSE); - } + m_pageList.reset(PageListContext::alloc(Doxygen::exampleSDict)); - //%% PageNodeList items: addProperty("items",this,&Private::items); addProperty("fileName",this,&Private::fileName); addProperty("relPath",this,&Private::relPath); @@ -5721,7 +6590,7 @@ class ExampleListContext::Private : public PropertyMapper addProperty("title",this,&Private::title); } private: - SharedPtr<PageNodeListContext> m_pageList; + SharedPtr<PageListContext> m_pageList; }; //%% } @@ -5740,6 +6609,442 @@ TemplateVariant ExampleListContext::get(const char *name) const return p->get(name); } +//------------------------------------------------------------------------ + +//%% struct GlobalsIndex: list of examples page +//%% { +class GlobalsIndexContext::Private : public PropertyMapper +{ + public: + Private() + { + addProperty("all", this,&Private::all); + addProperty("functions", this,&Private::functions); + addProperty("variables", this,&Private::variables); + addProperty("typedefs", this,&Private::typedefs); + addProperty("enums", this,&Private::enums); + addProperty("enumValues", this,&Private::enumValues); + addProperty("macros", this,&Private::macros); + addProperty("properties", this,&Private::properties); + addProperty("events", this,&Private::events); + addProperty("related", this,&Private::related); + addProperty("fileName", this,&Private::fileName); + addProperty("relPath", this,&Private::relPath); + addProperty("highlight", this,&Private::highlight); + addProperty("subhighlight",this,&Private::subhighlight); + addProperty("title", this,&Private::title); + } + typedef bool (MemberDef::*MemberFunc)() const; + TemplateVariant getMembersFiltered(SharedPtr<TemplateList> &listRef,MemberFunc filter) const + { + if (!listRef) + { + TemplateList *list = TemplateList::alloc(); + MemberName *mn; + MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict); + for (fnli.toFirst();(mn=fnli.current());++fnli) + { + MemberDef *md; + MemberNameIterator mni(*mn); + for (mni.toFirst();(md=mni.current());++mni) + { + FileDef *fd=md->getFileDef(); + if (fd && fd->isLinkableInProject() && + !md->name().isEmpty() && !md->getNamespaceDef() && md->isLinkableInProject()) + { + if (filter==0 || (md->*filter)()) + { + list->append(MemberContext::alloc(md)); + } + } + } + } + listRef.reset(list); + } + return listRef.get(); + } + TemplateVariant all() const + { + return getMembersFiltered(m_cache.all,0); + } + TemplateVariant functions() const + { + return getMembersFiltered(m_cache.functions,&MemberDef::isFunction); + } + TemplateVariant variables() const + { + return getMembersFiltered(m_cache.variables,&MemberDef::isVariable); + } + TemplateVariant typedefs() const + { + return getMembersFiltered(m_cache.typedefs,&MemberDef::isTypedef); + } + TemplateVariant enums() const + { + return getMembersFiltered(m_cache.enums,&MemberDef::isEnumerate); + } + TemplateVariant enumValues() const + { + return getMembersFiltered(m_cache.enumValues,&MemberDef::isEnumValue); + } + TemplateVariant macros() const + { + return getMembersFiltered(m_cache.macros,&MemberDef::isDefine); + } + TemplateVariant properties() const + { + return FALSE; + } + TemplateVariant events() const + { + return FALSE; + } + TemplateVariant related() const + { + return FALSE; + } + TemplateVariant fileName() const + { + return "globals"; + } + TemplateVariant relPath() const + { + return ""; + } + TemplateVariant highlight() const + { + return "files"; + } + TemplateVariant subhighlight() const + { + return "filemembers"; + } + TemplateVariant title() const + { + return theTranslator->trFileMembers(); + } + private: + struct Cachable + { + Cachable() {} + SharedPtr<TemplateList> all; + SharedPtr<TemplateList> functions; + SharedPtr<TemplateList> variables; + SharedPtr<TemplateList> typedefs; + SharedPtr<TemplateList> enums; + SharedPtr<TemplateList> enumValues; + SharedPtr<TemplateList> macros; + }; + mutable Cachable m_cache; +}; +//%% } + +GlobalsIndexContext::GlobalsIndexContext() : RefCountedContext("GlobalsIndexContext") +{ + p = new Private; +} + +GlobalsIndexContext::~GlobalsIndexContext() +{ + delete p; +} + +TemplateVariant GlobalsIndexContext::get(const char *name) const +{ + return p->get(name); +} + +//------------------------------------------------------------------------ + +//%% struct ClassMembersIndex: list of examples page +//%% { +class ClassMembersIndexContext::Private : public PropertyMapper +{ + public: + Private() + { + addProperty("all", this,&Private::all); + addProperty("functions", this,&Private::functions); + addProperty("variables", this,&Private::variables); + addProperty("typedefs", this,&Private::typedefs); + addProperty("enums", this,&Private::enums); + addProperty("enumValues", this,&Private::enumValues); + addProperty("macros", this,&Private::macros); + addProperty("properties", this,&Private::properties); + addProperty("events", this,&Private::events); + addProperty("related", this,&Private::related); + addProperty("fileName", this,&Private::fileName); + addProperty("relPath", this,&Private::relPath); + addProperty("highlight", this,&Private::highlight); + addProperty("subhighlight",this,&Private::subhighlight); + addProperty("title", this,&Private::title); + } + typedef bool (MemberDef::*MemberFunc)() const; + TemplateVariant getMembersFiltered(SharedPtr<TemplateList> &listRef,MemberFunc filter) const + { + if (!listRef) + { + TemplateList *list = TemplateList::alloc(); + MemberName *mn; + MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict); + for (mnli.toFirst();(mn=mnli.current());++mnli) + { + MemberDef *md; + MemberNameIterator mni(*mn); + for (mni.toFirst();(md=mni.current());++mni) + { + ClassDef *cd = md->getClassDef(); + if (cd && cd->isLinkableInProject() && cd->templateMaster()==0 && + md->isLinkableInProject() && !md->name().isEmpty()) + { + if (filter==0 || (md->*filter)()) + { + list->append(MemberContext::alloc(md)); + } + } + } + } + listRef.reset(list); + } + return listRef.get(); + } + TemplateVariant all() const + { + return getMembersFiltered(m_cache.all,&MemberDef::isNotFriend); + } + TemplateVariant functions() const + { + return getMembersFiltered(m_cache.functions,&MemberDef::isFunctionOrSignalSlot); + } + TemplateVariant variables() const + { + return getMembersFiltered(m_cache.variables,&MemberDef::isVariable); + } + TemplateVariant typedefs() const + { + return getMembersFiltered(m_cache.typedefs,&MemberDef::isTypedef); + } + TemplateVariant enums() const + { + return getMembersFiltered(m_cache.enums,&MemberDef::isEnumerate); + } + TemplateVariant enumValues() const + { + return getMembersFiltered(m_cache.enumValues,&MemberDef::isEnumValue); + } + TemplateVariant macros() const + { + return FALSE; + } + TemplateVariant properties() const + { + return getMembersFiltered(m_cache.properties,&MemberDef::isProperty); + } + TemplateVariant events() const + { + return getMembersFiltered(m_cache.events,&MemberDef::isEvent); + } + TemplateVariant related() const + { + return getMembersFiltered(m_cache.related,&MemberDef::isRelated); + } + TemplateVariant fileName() const + { + return "functions"; + } + TemplateVariant relPath() const + { + return ""; + } + TemplateVariant highlight() const + { + return "classes"; + } + TemplateVariant subhighlight() const + { + return "classmembers"; + } + TemplateVariant title() const + { + return theTranslator->trCompoundMembers(); + } + private: + struct Cachable + { + Cachable() {} + SharedPtr<TemplateList> all; + SharedPtr<TemplateList> functions; + SharedPtr<TemplateList> variables; + SharedPtr<TemplateList> typedefs; + SharedPtr<TemplateList> enums; + SharedPtr<TemplateList> enumValues; + SharedPtr<TemplateList> properties; + SharedPtr<TemplateList> events; + SharedPtr<TemplateList> related; + }; + mutable Cachable m_cache; +}; +//%% } + +ClassMembersIndexContext::ClassMembersIndexContext() : RefCountedContext("ClassMembersIndexContext") +{ + p = new Private; +} + +ClassMembersIndexContext::~ClassMembersIndexContext() +{ + delete p; +} + +TemplateVariant ClassMembersIndexContext::get(const char *name) const +{ + return p->get(name); +} + +//------------------------------------------------------------------------ + +//%% struct NamespaceMembersIndex: list of examples page +//%% { +class NamespaceMembersIndexContext::Private : public PropertyMapper +{ + public: + Private() + { + addProperty("all", this,&Private::all); + addProperty("functions", this,&Private::functions); + addProperty("variables", this,&Private::variables); + addProperty("typedefs", this,&Private::typedefs); + addProperty("enums", this,&Private::enums); + addProperty("enumValues", this,&Private::enumValues); + addProperty("macros", this,&Private::macros); + addProperty("properties", this,&Private::properties); + addProperty("events", this,&Private::events); + addProperty("related", this,&Private::related); + addProperty("fileName", this,&Private::fileName); + addProperty("relPath", this,&Private::relPath); + addProperty("highlight", this,&Private::highlight); + addProperty("subhighlight",this,&Private::subhighlight); + addProperty("title", this,&Private::title); + } + typedef bool (MemberDef::*MemberFunc)() const; + TemplateVariant getMembersFiltered(SharedPtr<TemplateList> &listRef,MemberFunc filter) const + { + if (!listRef) + { + TemplateList *list = TemplateList::alloc(); + MemberName *mn; + MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict); + for (fnli.toFirst();(mn=fnli.current());++fnli) + { + MemberDef *md; + MemberNameIterator mni(*mn); + for (mni.toFirst();(md=mni.current());++mni) + { + NamespaceDef *nd=md->getNamespaceDef(); + if (nd && nd->isLinkableInProject() && + !md->name().isEmpty() && md->isLinkableInProject()) + { + if (filter==0 || (md->*filter)()) + { + list->append(MemberContext::alloc(md)); + } + } + } + } + listRef.reset(list); + } + return listRef.get(); + } + TemplateVariant all() const + { + return getMembersFiltered(m_cache.all,0); + } + TemplateVariant functions() const + { + return getMembersFiltered(m_cache.functions,&MemberDef::isFunction); + } + TemplateVariant variables() const + { + return getMembersFiltered(m_cache.variables,&MemberDef::isVariable); + } + TemplateVariant typedefs() const + { + return getMembersFiltered(m_cache.typedefs,&MemberDef::isTypedef); + } + TemplateVariant enums() const + { + return getMembersFiltered(m_cache.enums,&MemberDef::isEnumerate); + } + TemplateVariant enumValues() const + { + return getMembersFiltered(m_cache.enumValues,&MemberDef::isEnumValue); + } + TemplateVariant macros() const + { + return FALSE; + } + TemplateVariant properties() const + { + return FALSE; + } + TemplateVariant events() const + { + return FALSE; + } + TemplateVariant related() const + { + return FALSE; + } + TemplateVariant fileName() const + { + return "namespacemembers"; + } + TemplateVariant relPath() const + { + return ""; + } + TemplateVariant highlight() const + { + return "namespaces"; + } + TemplateVariant subhighlight() const + { + return "namespacemembers"; + } + TemplateVariant title() const + { + return theTranslator->trNamespaceMembers(); + } + private: + struct Cachable + { + Cachable() {} + SharedPtr<TemplateList> all; + SharedPtr<TemplateList> functions; + SharedPtr<TemplateList> variables; + SharedPtr<TemplateList> typedefs; + SharedPtr<TemplateList> enums; + SharedPtr<TemplateList> enumValues; + }; + mutable Cachable m_cache; +}; +//%% } + +NamespaceMembersIndexContext::NamespaceMembersIndexContext() : RefCountedContext("NamespaceMembersIndexContext") +{ + p = new Private; +} + +NamespaceMembersIndexContext::~NamespaceMembersIndexContext() +{ + delete p; +} + +TemplateVariant NamespaceMembersIndexContext::get(const char *name) const +{ + return p->get(name); +} + //------------------------------------------------------------------------ @@ -6358,7 +7663,7 @@ class InheritedMemberInfoContext::Private : public PropertyMapper addProperty("id", this,&Private::id); addProperty("inheritedFrom", this,&Private::inheritedFrom); } - ~Private() + virtual ~Private() { delete m_memberList; } @@ -6742,7 +8047,13 @@ class HtmlEscaper : public TemplateEscapeIntf class HtmlSpaceless : public TemplateSpacelessIntf { public: - HtmlSpaceless() : m_insideTag(FALSE), m_insideString('\0'), m_removeSpaces(TRUE) {} + HtmlSpaceless() { reset(); } + void reset() + { + m_insideTag = FALSE; + m_insideString = '\0'; + m_removeSpaces = TRUE; + } QCString remove(const QCString &s) { QGString result; @@ -6796,7 +8107,7 @@ class HtmlSpaceless : public TemplateSpacelessIntf } } result+='\0'; - //printf("HtmlSpaceless::remove('%s')='%s' m_insideTag=%d m_insideString=%d removeSpaces=%d\n",s.data(),result.data(), + //printf("HtmlSpaceless::remove({%s})={%s} m_insideTag=%d m_insideString=%d removeSpaces=%d\n",s.data(),result.data(), // m_insideTag,m_insideString,m_removeSpaces); return result.data(); } @@ -6815,80 +8126,100 @@ int RefCountedContext::s_totalCount; void generateOutputViaTemplate() { { - TemplateEngine e; - TemplateContext *ctx = e.createContext(); - if (ctx) - { - SharedPtr<DoxygenContext> doxygen (DoxygenContext::alloc()); - SharedPtr<ConfigContext> config (ConfigContext::alloc()); - SharedPtr<TranslateContext> tr (TranslateContext::alloc()); - SharedPtr<ClassListContext> classList (ClassListContext::alloc()); - SharedPtr<ClassTreeContext> classTree (ClassTreeContext::alloc()); - SharedPtr<ClassHierarchyContext> classHierarchy (ClassHierarchyContext::alloc()); - SharedPtr<NamespaceListContext> namespaceList (NamespaceListContext::alloc()); - SharedPtr<NamespaceTreeContext> namespaceTree (NamespaceTreeContext::alloc()); - SharedPtr<DirListContext> dirList (DirListContext::alloc()); - SharedPtr<FileListContext> fileList (FileListContext::alloc()); - SharedPtr<FileTreeContext> fileTree (FileTreeContext::alloc()); - SharedPtr<PageTreeContext> pageTree (PageTreeContext::alloc()); - SharedPtr<PageListContext> pageList (PageListContext::alloc()); - SharedPtr<ModuleTreeContext> moduleTree (ModuleTreeContext::alloc()); - SharedPtr<ExampleListContext> exampleList (ExampleListContext::alloc()); - - //%% Doxygen doxygen: - ctx->set("doxygen",doxygen.get()); - //%% Translator tr: - ctx->set("tr",tr.get()); - //%% Config config: - ctx->set("config",config.get()); - //%% ClassList classList: - ctx->set("classList",classList.get()); // not used for standard HTML - //%% ClassTree classTree: - ctx->set("classTree",classTree.get()); - // classIndex - //%% ClassHierarchy classHierarchy: - ctx->set("classHierarchy",classHierarchy.get()); - //%% NamespaceList namespaceList: - ctx->set("namespaceList",namespaceList.get()); - //%% NamespaceTree namespaceTree: - ctx->set("namespaceTree",namespaceTree.get()); - //%% FileList fileList: - ctx->set("fileList",fileList.get()); - //%% FileTree fileTree: - ctx->set("fileTree",fileTree.get()); - //%% PageList pageList - ctx->set("pageList",pageList.get()); - //%% PageTree pageTree - ctx->set("pageTree",pageTree.get()); - //%% ModuleTree moduleTree - ctx->set("moduleTree",moduleTree.get()); - //%% ExampleList exampleList - ctx->set("exampleList",exampleList.get()); - //%% DirList dirList - ctx->set("dirList",dirList.get()); - - // render HTML output - Template *tpl = e.loadByName("htmllayout.tpl",1); - if (tpl) - { - g_globals.outputFormat = ContextGlobals::Html; - g_globals.dynSectionId = 0; - g_globals.outputDir = Config_getString("HTML_OUTPUT"); - HtmlEscaper htmlEsc; - ctx->setEscapeIntf(Config_getString("HTML_FILE_EXTENSION"),&htmlEsc); - HtmlSpaceless spl; - ctx->setSpacelessIntf(&spl); - ctx->setOutputDirectory(g_globals.outputDir); - FTextStream ts; - tpl->render(ts,ctx); - } - e.unload(tpl); - - // TODO: render other outputs - } - delete ctx; + TemplateEngine e; + TemplateContext *ctx = e.createContext(); + if (ctx) + { + SharedPtr<DoxygenContext> doxygen (DoxygenContext::alloc()); + SharedPtr<ConfigContext> config (ConfigContext::alloc()); + SharedPtr<TranslateContext> tr (TranslateContext::alloc()); + SharedPtr<ClassListContext> classList (ClassListContext::alloc()); + SharedPtr<ClassIndexContext> classIndex (ClassIndexContext::alloc()); + SharedPtr<ClassTreeContext> classTree (ClassTreeContext::alloc()); + SharedPtr<ClassHierarchyContext> classHierarchy (ClassHierarchyContext::alloc()); + SharedPtr<NamespaceListContext> namespaceList (NamespaceListContext::alloc()); + SharedPtr<NamespaceTreeContext> namespaceTree (NamespaceTreeContext::alloc()); + SharedPtr<DirListContext> dirList (DirListContext::alloc()); + SharedPtr<FileListContext> fileList (FileListContext::alloc()); + SharedPtr<FileTreeContext> fileTree (FileTreeContext::alloc()); + SharedPtr<PageTreeContext> pageTree (PageTreeContext::alloc()); + SharedPtr<PageListContext> pageList (PageListContext::alloc(Doxygen::pageSDict)); + SharedPtr<ExampleListContext> exampleList (ExampleListContext::alloc()); + SharedPtr<ModuleTreeContext> moduleTree (ModuleTreeContext::alloc()); + SharedPtr<ModuleListContext> moduleList (ModuleListContext::alloc()); + SharedPtr<PageContext> mainPage (PageContext::alloc(Doxygen::mainPage,TRUE)); + SharedPtr<GlobalsIndexContext> globalsIndex (GlobalsIndexContext::alloc()); + SharedPtr<ClassMembersIndexContext> classMembersIndex (ClassMembersIndexContext::alloc()); + SharedPtr<NamespaceMembersIndexContext> namespaceMembersIndex(NamespaceMembersIndexContext::alloc()); + + //%% Doxygen doxygen: + ctx->set("doxygen",doxygen.get()); + //%% Translator tr: + ctx->set("tr",tr.get()); + //%% Config config: + ctx->set("config",config.get()); + //%% ClassList classList: + ctx->set("classList",classList.get()); // not used for standard HTML + //%% ClassTree classTree: + ctx->set("classTree",classTree.get()); + //%% ClassIndex classIndex: + ctx->set("classIndex",classIndex.get()); + //%% ClassHierarchy classHierarchy: + ctx->set("classHierarchy",classHierarchy.get()); + //%% NamespaceList namespaceList: + ctx->set("namespaceList",namespaceList.get()); + //%% NamespaceTree namespaceTree: + ctx->set("namespaceTree",namespaceTree.get()); + //%% FileList fileList: + ctx->set("fileList",fileList.get()); + //%% FileTree fileTree: + ctx->set("fileTree",fileTree.get()); + //%% PageList pageList + ctx->set("pageList",pageList.get()); + //%% PageTree pageTree + ctx->set("pageTree",pageTree.get()); + //%% ExampleList exampleList + ctx->set("exampleList",exampleList.get()); + //%% ModuleTree moduleTree + ctx->set("moduleTree",moduleTree.get()); + //%% ModuleList moduleList + ctx->set("moduleList",moduleList.get()); + //%% DirList dirList + ctx->set("dirList",dirList.get()); + //%% Page mainPage + ctx->set("mainPage",mainPage.get()); + //%% GlobalsIndex globalsIndex: + ctx->set("globalsIndex",globalsIndex.get()); + //%% ClassMembersIndex classMembersIndex: + ctx->set("classMembersIndex",classMembersIndex.get()); + //%% NamespaceMembersIndex namespaceMembersIndex: + ctx->set("namespaceMembersIndex",namespaceMembersIndex.get()); + + // render HTML output + Template *tpl = e.loadByName("htmllayout.tpl",1); + if (tpl) + { + g_globals.outputFormat = ContextGlobals::Html; + g_globals.dynSectionId = 0; + g_globals.outputDir = Config_getString("HTML_OUTPUT"); + QDir dir(g_globals.outputDir); + createSubDirs(dir); + HtmlEscaper htmlEsc; + ctx->setEscapeIntf(Config_getString("HTML_FILE_EXTENSION"),&htmlEsc); + HtmlSpaceless spl; + ctx->setSpacelessIntf(&spl); + ctx->setOutputDirectory(g_globals.outputDir); + FTextStream ts; + tpl->render(ts,ctx); + e.unload(tpl); + } + + // TODO: render other outputs + + e.destroyContext(ctx); + } } -#if DEBUG_REF +#if DEBUG_REF // should be 0, i.e. all objects are deleted printf("==== total ref count %d\n",RefCountedContext::s_totalCount); #endif } diff --git a/src/context.h b/src/context.h index 18fa519..b39ab40 100644 --- a/src/context.h +++ b/src/context.h @@ -1,3 +1,18 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2014 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + #ifndef CONTEXT_H #define CONTEXT_H @@ -51,7 +66,7 @@ class RefCountedContext m_className=className; m_insideRelease = FALSE; } - virtual ~RefCountedContext() + ~RefCountedContext() { if (!m_insideRelease) abort(); } @@ -137,7 +152,7 @@ class DoxygenContext : public RefCountedContext, public TemplateStructIntf private: DoxygenContext(); - ~DoxygenContext(); + ~DoxygenContext(); class Private; Private *p; }; @@ -309,7 +324,7 @@ class DirContext : public RefCountedContext, public TemplateStructIntf class PageContext : public RefCountedContext, public TemplateStructIntf { public: - static PageContext *alloc(PageDef *pd) { return new PageContext(pd); } + static PageContext *alloc(PageDef *pd,bool isMainPage=FALSE) { return new PageContext(pd,isMainPage); } // TemplateStructIntf methods virtual TemplateVariant get(const char *name) const; @@ -317,7 +332,7 @@ class PageContext : public RefCountedContext, public TemplateStructIntf virtual int release() { return RefCountedContext::release(); } private: - PageContext(PageDef *); + PageContext(PageDef *,bool isMainPage); ~PageContext(); class Private; Private *p; @@ -364,33 +379,10 @@ class ModuleContext : public RefCountedContext, public TemplateStructIntf //---------------------------------------------------- -class NestedClassListContext : public RefCountedContext, public TemplateListIntf -{ - public: - static NestedClassListContext *alloc() { return new NestedClassListContext; } - - // TemplateListIntf - virtual int count() const; - virtual TemplateVariant at(int index) const; - virtual TemplateListIntf::ConstIterator *createIterator() const; - virtual int addRef() { return RefCountedContext::addRef(); } - virtual int release() { return RefCountedContext::release(); } - - void append(ClassDef *cd); - - private: - NestedClassListContext(); - ~NestedClassListContext(); - class Private; - Private *p; -}; - -//---------------------------------------------------- - -class NestedNamespaceListContext : public RefCountedContext, public TemplateListIntf +class ClassListContext : public RefCountedContext, public TemplateListIntf { public: - static NestedNamespaceListContext *alloc() { return new NestedNamespaceListContext; } + static ClassListContext *alloc() { return new ClassListContext; } // TemplateListIntf virtual int count() const; @@ -399,32 +391,28 @@ class NestedNamespaceListContext : public RefCountedContext, public TemplateList virtual int addRef() { return RefCountedContext::addRef(); } virtual int release() { return RefCountedContext::release(); } - void append(NamespaceDef *cd); - private: - NestedNamespaceListContext(); - ~NestedNamespaceListContext(); + ClassListContext(); + ~ClassListContext(); class Private; Private *p; }; //---------------------------------------------------- -class ClassListContext : public RefCountedContext, public TemplateListIntf +class ClassIndexContext : public RefCountedContext, public TemplateStructIntf { public: - static ClassListContext *alloc() { return new ClassListContext; } + static ClassIndexContext *alloc() { return new ClassIndexContext; } - // TemplateListIntf - virtual int count() const; - virtual TemplateVariant at(int index) const; - virtual TemplateListIntf::ConstIterator *createIterator() const; + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; virtual int addRef() { return RefCountedContext::addRef(); } virtual int release() { return RefCountedContext::release(); } private: - ClassListContext(); - ~ClassListContext(); + ClassIndexContext(); + ~ClassIndexContext(); class Private; Private *p; }; @@ -536,6 +524,9 @@ class NestingContext : public RefCountedContext, public TemplateListIntf void addDirs(const DirList &); void addFiles(const FileNameList &); void addFiles(const FileList &); + void addPages(const PageSDict &pages,bool rootOnly); + void addModules(const GroupSDict &modules); + void addModules(const GroupList &modules); private: NestingContext(const NestingNodeContext *parent,int level); @@ -666,60 +657,22 @@ class FileTreeContext : public RefCountedContext, public TemplateStructIntf //---------------------------------------------------- -class PageNodeContext : public RefCountedContext, public TemplateStructIntf +class PageListContext : public RefCountedContext, public TemplateListIntf { public: - static PageNodeContext *alloc(PageDef *pd) { return new PageNodeContext(pd); } - - // TemplateStructIntf methods - virtual TemplateVariant get(const char *name) const; - virtual int addRef() { return RefCountedContext::addRef(); } - virtual int release() { return RefCountedContext::release(); } + static PageListContext *alloc(const PageSDict *pages) { return new PageListContext(pages); } - private: - PageNodeContext(PageDef *); - ~PageNodeContext(); - class Private; - Private *p; -}; - -//---------------------------------------------------- - -class PageNodeListContext : public RefCountedContext, public TemplateListIntf -{ - public: - static PageNodeListContext *alloc() { return new PageNodeListContext; } - - // TemplateListIntf + // TemplateListIntf methods virtual int count() const; virtual TemplateVariant at(int index) const; virtual TemplateListIntf::ConstIterator *createIterator() const; virtual int addRef() { return RefCountedContext::addRef(); } virtual int release() { return RefCountedContext::release(); } - void addPages(const PageSDict &,bool rootOnly); - - private: - PageNodeListContext(); - ~PageNodeListContext(); - class Private; - Private *p; -}; - -//---------------------------------------------------- - -class PageListContext : public RefCountedContext, public TemplateStructIntf -{ - public: - static PageListContext *alloc() { return new PageListContext; } - - // TemplateStructIntf methods - virtual TemplateVariant get(const char *name) const; - virtual int addRef() { return RefCountedContext::addRef(); } - virtual int release() { return RefCountedContext::release(); } + void addPages(const PageSDict &pages); private: - PageListContext(); + PageListContext(const PageSDict *pages); ~PageListContext(); class Private; Private *p; @@ -827,6 +780,63 @@ class ExampleListContext : public RefCountedContext, public TemplateStructIntf //---------------------------------------------------- +class GlobalsIndexContext : public RefCountedContext, public TemplateStructIntf +{ + public: + static GlobalsIndexContext *alloc() { return new GlobalsIndexContext(); } + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + virtual int addRef() { return RefCountedContext::addRef(); } + virtual int release() { return RefCountedContext::release(); } + + private: + GlobalsIndexContext(); + ~GlobalsIndexContext(); + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class ClassMembersIndexContext : public RefCountedContext, public TemplateStructIntf +{ + public: + static ClassMembersIndexContext *alloc() { return new ClassMembersIndexContext(); } + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + virtual int addRef() { return RefCountedContext::addRef(); } + virtual int release() { return RefCountedContext::release(); } + + private: + ClassMembersIndexContext(); + ~ClassMembersIndexContext(); + class Private; + Private *p; +}; + +//---------------------------------------------------- + +class NamespaceMembersIndexContext : public RefCountedContext, public TemplateStructIntf +{ + public: + static NamespaceMembersIndexContext *alloc() { return new NamespaceMembersIndexContext(); } + + // TemplateStructIntf methods + virtual TemplateVariant get(const char *name) const; + virtual int addRef() { return RefCountedContext::addRef(); } + virtual int release() { return RefCountedContext::release(); } + + private: + NamespaceMembersIndexContext(); + ~NamespaceMembersIndexContext(); + class Private; + Private *p; +}; + +//---------------------------------------------------- + class NavPathElemContext : public RefCountedContext, public TemplateStructIntf { public: diff --git a/src/definition.cpp b/src/definition.cpp index c4b9f77..4a6a728 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -515,7 +515,7 @@ void Definition::writeDocAnchorsToTagFile() { if (!Config_getString("GENERATE_TAGFILE").isEmpty() && m_impl->sectionDict) { - //printf("%s: writeDocAnchorsToTagFile(%d)\n",name().data(),m_sectionDict->count()); + //printf("%s: writeDocAnchorsToTagFile(%d)\n",name().data(),m_impl->sectionDict->count()); SDict<SectionInfo>::Iterator sdi(*m_impl->sectionDict); SectionInfo *si; for (;(si=sdi.current());++sdi) @@ -1360,15 +1360,23 @@ QCString Definition::qualifiedName() const //printf("end %s::qualifiedName()=%s\n",name().data(),m_impl->qualifiedName.data()); //count--; return m_impl->qualifiedName; -}; +} -void Definition::setOuterScope(Definition *d) +void Definition::setOuterScope(Definition *d) { //printf("%s::setOuterScope(%s)\n",name().data(),d?d->name().data():"<none>"); - if (m_impl->outerScope!=d) - { + Definition *p = m_impl->outerScope; + bool found=false; + // make sure that we are not creating a recursive scope relation. + while (p && !found) + { + found = (p==d); + p = p->m_impl->outerScope; + } + if (!found) + { m_impl->qualifiedName.resize(0); // flush cached scope name - m_impl->outerScope = d; + m_impl->outerScope = d; } m_impl->hidden = m_impl->hidden || d->isHidden(); } diff --git a/src/definition.h b/src/definition.h index dfd9dad..05ea621 100644 --- a/src/definition.h +++ b/src/definition.h @@ -271,7 +271,7 @@ class Definition : public DefinitionIntf //----------------------------------------------------------------------------------- /*! Sets a new \a name for the definition */ - void setName(const char *name); + virtual void setName(const char *name); /*! Sets a unique id for the symbol. Used for libclang integration. */ void setId(const char *name); diff --git a/src/docbookgen.cpp b/src/docbookgen.cpp index 2011333..cabb7ad 100644 --- a/src/docbookgen.cpp +++ b/src/docbookgen.cpp @@ -210,7 +210,7 @@ class DocbookCodeGenerator : public CodeOutputInterface { m_t << "<link linkend=\"" << m_refId << "\">"; } - m_t << m_lineNumber; + m_t << m_lineNumber << " "; if (!m_refId.isEmpty()) { m_t << "</link>"; @@ -228,10 +228,10 @@ class DocbookCodeGenerator : public CodeOutputInterface m_external.resize(0); m_insideCodeLine=FALSE; } - void startFontClass(const char * /*colorClass*/) + void startFontClass(const char *colorClass) { Docbook_DB(("(startFontClass)\n")); - m_t << "<emphasis>"; // non DocBook + m_t << "<emphasis class=\"" << colorClass << "\">"; m_insideSpecialHL=TRUE; } void endFontClass() @@ -453,7 +453,7 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de if (md->memberType()==MemberType_Enumeration) { MemberList *enumFields = md->enumFieldList(); - t << " <para>" << memType << " <link linkend=\""; + t << " <para><literallayout>" << memType << " <link linkend=\""; if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup) { t << md->getGroupDef()->getOutputFileBase(); @@ -467,25 +467,25 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de { MemberListIterator emli(*enumFields); MemberDef *emd; - t << "{"; + t << " {" << endl; int cnt=0; for (emli.toFirst();(emd=emli.current());++emli) { if (cnt!=0) { - t << ", "; + t << "," << endl; } t << "<link linkend=\"" << memberOutputFileBase(emd) << "_1" << emd->anchor() << "\">"; writeDocbookString(t,emd->name()); t << "</link>"; if (!emd->initializer().isEmpty()) { - t << "="; writeDocbookString(t,emd->initializer()); } cnt++; } - t << "}"; + t << endl << "}"; + t << "</literallayout>" << endl; } } else if (md->memberType()==MemberType_Define) @@ -608,10 +608,10 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de t << " </listitem>" << endl; t << " </itemizedlist>" << endl; t << " </para>" << endl; - } - else + } + else { - if (md->memberType()==MemberType_Enumeration) + if (md->memberType()==MemberType_Enumeration) { MemberList *enumFields = md->enumFieldList(); t << " <section xml:id=\""; @@ -653,20 +653,19 @@ static void generateDocbookForMember(MemberDef *md,FTextStream &t,Definition *de t << " </formalpara>" << endl; t << " <para>"; t << "Definition at line " << md->getDefLine() << " of file " << stripPath(md->getDefFileName()) << endl; - t << " <programlisting>" << endl; + t << " <computeroutput><literallayout>" << endl; t << "{" << endl; for (emli.toFirst();(emd=emli.current());++emli) { writeDocbookString(t,emd->name()); if (!emd->initializer().isEmpty()) { - t << "="; writeDocbookString(t,emd->initializer()); } t << ", " << endl; } t << "}" << convertToXML(md->name()) << ";" << endl; - t << " </programlisting>" << endl; + t << " </literallayout></computeroutput>" << endl; t << " </para>" << endl; t << " </section>" << endl; } @@ -1127,6 +1126,7 @@ static void generateDocbookForClass(ClassDef *cd,FTextStream &ti) QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT"); QCString fileName=outputDirectory+"/"+ classOutputFileBase(cd)+".xml"; + QCString relPath = relativePathToRoot(fileName); QFile f(fileName); if (!f.open(IO_WriteOnly)) { @@ -1181,6 +1181,20 @@ static void generateDocbookForClass(ClassDef *cd,FTextStream &ti) } } + if (Config_getBool("HAVE_DOT") && (Config_getBool("CLASS_DIAGRAMS") || Config_getBool("CLASS_GRAPH"))) + { + t << "<para>Inheritance diagram for " << convertToXML(cd->name()) << "</para>" << endl; + DotClassGraph inheritanceGraph(cd,DotNode::Inheritance); + inheritanceGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,TRUE,FALSE); + } + + if (Config_getBool("HAVE_DOT") && Config_getBool("COLLABORATION_GRAPH")) + { + t << "<para>Collaboration diagram for " << convertToXML(cd->name()) << "</para>" << endl; + DotClassGraph collaborationGraph(cd,DotNode::Collaboration); + collaborationGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,TRUE,FALSE); + } + writeInnerClasses(cd->getClassSDict(),t); writeTemplateList(cd,t); @@ -1369,6 +1383,7 @@ static void generateDocbookForFile(FileDef *fd,FTextStream &ti) QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT"); QCString fileName=outputDirectory+"/"+fd->getOutputFileBase()+".xml"; + QCString relPath = relativePathToRoot(fileName); QFile f(fileName); if (!f.open(IO_WriteOnly)) @@ -1413,6 +1428,21 @@ static void generateDocbookForFile(FileDef *fd,FTextStream &ti) t << "</programlisting>" << endl; } } + if (Config_getBool("HAVE_DOT")) + { + if (Config_getBool("INCLUDE_GRAPH")) + { + t << "<para>Include dependency diagram for " << convertToXML(fd->name()) << "</para>" << endl; + DotInclDepGraph idepGraph(fd, FALSE); + idepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,FALSE); + } + if (Config_getBool("INCLUDED_BY_GRAPH")) + { + t << "<para>Included by dependency diagram for " << convertToXML(fd->name()) << "</para>" << endl; + DotInclDepGraph ibdepGraph(fd, TRUE); + ibdepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,FALSE); + } + } if (fd->getClassSDict()) { @@ -1448,20 +1478,24 @@ static void generateDocbookForFile(FileDef *fd,FTextStream &ti) t << " <title>Detailed Description</title>" << endl; writeDocbookDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription()); writeDocbookDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation()); - t << " <para>Definition in file " << fd->getDefFileName() << "</para>" << endl; + if (Config_getBool("FULL_PATH_NAMES")) + { + t << " <para>Definition in file " << fd->getDefFileName() << "</para>" << endl; + } + else + { + t << " <para>Definition in file " << stripPath(fd->getDefFileName()) << "</para>" << endl; + } t << " </simplesect>" << endl; - /*// TODO: Handling of Program listing for Docbook to be implemented - if (Config_getBool("DOCBOOK_PROGRAMLISTING")) - { - t << " <programlisting>" << endl; + if (Config_getBool("DOCBOOK_PROGRAMLISTING")) + { + t << " <literallayout><computeroutput>" << endl; writeDocbookCodeBlock(t,fd); - t << " </programlisting>" << endl; - } - */ + t << " </computeroutput></literallayout>" << endl; + } t << "</section>" << endl; - } static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti) @@ -1489,6 +1523,7 @@ static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti) QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT"); QCString fileName=outputDirectory+"/"+gd->getOutputFileBase()+".xml"; + QCString relPath = relativePathToRoot(fileName); QFile f(fileName); if (!f.open(IO_WriteOnly)) @@ -1503,6 +1538,13 @@ static void generateDocbookForGroup(GroupDef *gd,FTextStream &ti) t << " <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl; + if (Config_getBool("GROUP_GRAPHS") && Config_getBool("HAVE_DOT")) + { + t << "<para>Collaboration diagram for " << convertToXML(gd->groupTitle()) << "</para>" << endl; + DotGroupCollaboration collaborationGraph(gd); + collaborationGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,FALSE); + } + if (gd->briefDescription()) { t << " <simplesect>" << endl; @@ -1570,6 +1612,8 @@ static void generateDocbookForDir(DirDef *dd,FTextStream &ti) QCString outputDirectory = Config_getString("DOCBOOK_OUTPUT"); QCString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml"; QFile f(fileName); + QCString relPath = relativePathToRoot(fileName); + if (!f.open(IO_WriteOnly)) { err("Cannot open file %s for writing!\n",fileName.data()); @@ -1584,6 +1628,12 @@ static void generateDocbookForDir(DirDef *dd,FTextStream &ti) writeDocbookString(t, dd->displayName()); t << " Directory Reference"; t << "</title>" << endl; + if (Config_getBool("DIRECTORY_GRAPH") && Config_getBool("HAVE_DOT")) + { + t << "<para>Directory dependency diagram for " << convertToXML(dd->displayName()) << "</para>" << endl; + DotDirDeps dirdepGraph(dd); + dirdepGraph.writeGraph(t,GOF_BITMAP,EOF_DocBook,Config_getString("DOCBOOK_OUTPUT"),fileName,relPath,FALSE); + } writeInnerDirs(&dd->subDirs(),t); writeInnerFiles(dd->getFiles(),t); @@ -1628,7 +1678,13 @@ static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample) FTextStream t(&f); //t.setEncoding(FTextStream::UnicodeUTF8); - if (!pd->hasParentPage()) + if(isExample) + { + QCString fileDocbook=pageName+".xml"; + ti << " <xi:include href=\"" << fileDocbook << "\" xmlns:xi=\"http://www.w3.org/2001/XInclude\"/>" << endl; + } + + if (!pd->hasParentPage() && !isExample) { QCString fileDocbook=pageName+".xml"; //Add the file Documentation info to index file @@ -1654,7 +1710,7 @@ static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample) if (isExample) { writeDocbookDocBlock(t,pd->docFile(),pd->docLine(),pd,0, - pd->documentation()+"\n<include "+pd->name()+">"); + pd->documentation()+"\n\\include "+pd->name()); } else { @@ -1663,7 +1719,7 @@ static void generateDocbookForPage(PageDef *pd,FTextStream &ti,bool isExample) } writeInnerPages(pd->getSubPages(),t); - if (!pd->hasParentPage()) + if (!pd->hasParentPage() && !isExample) { t << endl << "</chapter>" << endl; } @@ -1744,7 +1800,6 @@ void generateDocbook() t << " </info>" << endl; // NAMESPACE DOCUMENTATION - NamespaceSDict::Iterator nli(*Doxygen::namespaceSDict); NamespaceDef *nd; @@ -1838,35 +1893,39 @@ void generateDocbook() // FILE DOCUMENTATION - FileNameListIterator fnli(*Doxygen::inputNameList); - FileName *fn; - - //File Documentation index header - if (fnli.toFirst()) + static bool showFiles = Config_getBool("SHOW_FILES"); + if (showFiles) { - t << " <chapter>" << endl; - t << " <title>File Documentation</title>" << endl; - } + FileNameListIterator fnli(*Doxygen::inputNameList); + FileName *fn; - for (;(fn=fnli.current());++fnli) - { - FileNameIterator fni(*fn); - FileDef *fd; - for (;(fd=fni.current());++fni) + //File Documentation index header + if (fnli.toFirst()) { - msg("Generating Docbook output for file %s\n",fd->name().data()); - generateDocbookForFile(fd,t); + t << " <chapter>" << endl; + t << " <title>File Documentation</title>" << endl; } - } - //File Documentation index footer - if (fnli.toFirst()) - { - t << " </chapter>" << endl; + for (;(fn=fnli.current());++fnli) + { + FileNameIterator fni(*fn); + FileDef *fd; + for (;(fd=fni.current());++fni) + { + msg("Generating Docbook output for file %s\n",fd->name().data()); + generateDocbookForFile(fd,t); + } + } + + //File Documentation index footer + if (fnli.toFirst()) + { + t << " </chapter>" << endl; + } } // DIRECTORY DOCUMENTATION - + if (Config_getBool("DIRECTORY_GRAPH") && Config_getBool("HAVE_DOT")) { DirDef *dir; DirSDict::Iterator sdi(*Doxygen::directories); diff --git a/src/docbookvisitor.cpp b/src/docbookvisitor.cpp index 6867dce..9f2dbe3 100644 --- a/src/docbookvisitor.cpp +++ b/src/docbookvisitor.cpp @@ -34,6 +34,7 @@ #include "msc.h" #include "dia.h" #include "htmlentity.h" +#include "plantuml.h" DocbookDocVisitor::DocbookDocVisitor(FTextStream &t,CodeOutputInterface &ci) : DocVisitor(DocVisitor_Docbook), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE) @@ -160,16 +161,16 @@ void DocbookDocVisitor::visit(DocVerbatim *s) switch(s->type()) { case DocVerbatim::Code: // fall though - m_t << "<programlisting>"; + m_t << "<literallayout><computeroutput>"; Doxygen::parserManager->getParser(m_langExt) ->parseCode(m_ci,s->context(),s->text(),langExt, s->isExample(),s->exampleFile()); - m_t << "</programlisting>"; + m_t << "</computeroutput></literallayout>"; break; case DocVerbatim::Verbatim: - m_t << "<programlisting><literallayout>"; + m_t << "<literallayout>"; filter(s->text()); - m_t << "</literallayout></programlisting>"; + m_t << "</literallayout>"; break; case DocVerbatim::HtmlOnly: break; @@ -189,8 +190,10 @@ void DocbookDocVisitor::visit(DocVerbatim *s) { static int dotindex = 1; QCString baseName(4096); + QCString name; QCString stext = s->text(); m_t << "<para>" << endl; + name.sprintf("%s%d", "dot_inline_dotgraph_", dotindex); baseName.sprintf("%s%d", (Config_getString("DOCBOOK_OUTPUT")+"/inline_dotgraph_").data(), dotindex++ @@ -203,7 +206,7 @@ void DocbookDocVisitor::visit(DocVerbatim *s) file.writeBlock( stext, stext.length() ); file.close(); m_t << " <figure>" << endl; - m_t << " <title></title>" << endl; + m_t << " <title>" << name << "</title>" << endl; m_t << " <mediaobject>" << endl; m_t << " <imageobject>" << endl; writeDotFile(baseName); @@ -214,33 +217,58 @@ void DocbookDocVisitor::visit(DocVerbatim *s) } break; case DocVerbatim::Msc: - static int mscindex = 1; - QCString baseName(4096); - QCString stext = s->text(); - m_t << "<para>" << endl; - baseName.sprintf("%s%d", - (Config_getString("DOCBOOK_OUTPUT")+"/inline_mscgraph_").data(), - mscindex++ - ); - QFile file(baseName+".msc"); - if (!file.open(IO_WriteOnly)) { - err("Could not open file %s.msc for writing\n",baseName.data()); + static int mscindex = 1; + QCString baseName(4096); + QCString name; + QCString stext = s->text(); + m_t << "<para>" << endl; + name.sprintf("%s%d", "msc_inline_mscgraph_", mscindex); + baseName.sprintf("%s%d", + (Config_getString("DOCBOOK_OUTPUT")+"/inline_mscgraph_").data(), + mscindex++ + ); + QFile file(baseName+".msc"); + if (!file.open(IO_WriteOnly)) + { + err("Could not open file %s.msc for writing\n",baseName.data()); + } + QCString text = "msc {"; + text+=stext; + text+="}"; + file.writeBlock( text, text.length() ); + file.close(); + m_t << " <figure>" << endl; + m_t << " <title>" << name << "</title>" << endl; + m_t << " <mediaobject>" << endl; + m_t << " <imageobject>" << endl; + writeMscFile(baseName); + m_t << " </imageobject>" << endl; + m_t << " </mediaobject>" << endl; + m_t << " </figure>" << endl; + m_t << "</para>" << endl; + } + break; + case DocVerbatim::PlantUML: + { + static QCString docbookOutput = Config_getString("DOCBOOK_OUTPUT"); + QCString baseName = writePlantUMLSource(docbookOutput,s->exampleFile(),s->text()); + QCString shortName = baseName; + int i; + if ((i=shortName.findRev('/'))!=-1) + { + shortName=shortName.right(shortName.length()-i-1); + } + m_t << " <figure>" << endl; + m_t << " <title>" << shortName << "</title>" << endl; + m_t << " <mediaobject>" << endl; + m_t << " <imageobject>" << endl; + writePlantUMLFile(baseName); + m_t << " </imageobject>" << endl; + m_t << " </mediaobject>" << endl; + m_t << " </figure>" << endl; + m_t << "</para>" << endl; } - QCString text = "msc {"; - text+=stext; - text+="}"; - file.writeBlock( text, text.length() ); - file.close(); - m_t << " <figure>" << endl; - m_t << " <title></title>" << endl; - m_t << " <mediaobject>" << endl; - m_t << " <imageobject>" << endl; - writeMscFile(baseName); - m_t << " </imageobject>" << endl; - m_t << " </mediaobject>" << endl; - m_t << " </figure>" << endl; - m_t << "</para>" << endl; break; } } @@ -259,7 +287,7 @@ void DocbookDocVisitor::visit(DocInclude *inc) { case DocInclude::IncWithLines: { - m_t << "<programlisting>"; + m_t << "<literallayout><computeroutput>"; QFileInfo cfi( inc->file() ); FileDef fd( cfi.dirPath().utf8(), cfi.fileName().utf8() ); Doxygen::parserManager->getParser(inc->extension()) @@ -268,18 +296,18 @@ void DocbookDocVisitor::visit(DocInclude *inc) langExt, inc->isExample(), inc->exampleFile(), &fd); - m_t << "</programlisting>"; + m_t << "</computeroutput></literallayout>"; } break; case DocInclude::Include: - m_t << "<programlisting>"; + m_t << "<literallayout><computeroutput>"; Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci,inc->context(), inc->text(), langExt, inc->isExample(), inc->exampleFile()); - m_t << "</programlisting>"; + m_t << "</computeroutput></literallayout>"; break; case DocInclude::DontInclude: break; @@ -293,7 +321,7 @@ void DocbookDocVisitor::visit(DocInclude *inc) m_t << "</verbatim>"; break; case DocInclude::Snippet: - m_t << "<programlisting>"; + m_t << "<literallayout><computeroutput>"; Doxygen::parserManager->getParser(inc->extension()) ->parseCode(m_ci, inc->context(), @@ -302,7 +330,7 @@ void DocbookDocVisitor::visit(DocInclude *inc) inc->isExample(), inc->exampleFile() ); - m_t << "</programlisting>"; + m_t << "</computeroutput></literallayout>"; break; } } @@ -361,7 +389,7 @@ void DocbookDocVisitor::visit(DocIndexEntry *ie) void DocbookDocVisitor::visit(DocSimpleSectSep *) { - m_t << "<simplesectsep/>"; + m_t << "<simplesect/>"; } void DocbookDocVisitor::visit(DocCite *cite) @@ -818,14 +846,14 @@ void DocbookDocVisitor::visitPost(DocHtmlHeader *) void DocbookDocVisitor::visitPre(DocImage *img) { - if (img->type()==DocImage::Latex) + if (img->type()==DocImage::DocBook) { if (m_hide) return; m_t << endl; m_t << " <figure>" << endl; m_t << " <title>"; - } - else + } + else { pushEnabled(); m_hide=TRUE; @@ -834,7 +862,7 @@ void DocbookDocVisitor::visitPre(DocImage *img) void DocbookDocVisitor::visitPost(DocImage *img) { - if (img->type()==DocImage::Latex) + if (img->type()==DocImage::DocBook) { if (m_hide) return; QCString typevar; @@ -854,13 +882,17 @@ void DocbookDocVisitor::visitPost(DocImage *img) filter(img->width()); m_t << "\""; } - else if (!img->height().isEmpty()) + else + { + m_t << " width=\"50%\""; + } + if (!img->height().isEmpty()) { m_t << " depth=\""; filter(img->height()); m_t << "\""; } - m_t << " align=\"center\" fileref=\"" << baseName << "\">"; + m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << baseName << "\">"; m_t << "</imagedata>" << endl; m_t << " </imageobject>" << endl; m_t << " </mediaobject>" << endl; @@ -980,37 +1012,23 @@ void DocbookDocVisitor::visitPost(DocSecRefList *) void DocbookDocVisitor::visitPre(DocParamSect *s) { if (m_hide) return; + m_t << endl; + m_t << " <formalpara>" << endl; + m_t << " <title/>" << endl; + m_t << " <table frame=\"all\">" << endl; + m_t << " <title>"; switch(s->type()) { - case DocParamSect::Param: - { - m_t << endl; - m_t << " <formalpara>" << endl; - m_t << " <title/>" << endl; - m_t << " <table frame=\"all\">" << endl; - m_t << " <title>Parameters</title>" << endl; - m_t << " <tgroup cols=\"2\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl; - m_t << " <tbody>" << endl; - break; - } - case DocParamSect::RetVal: - { - m_t << endl; - m_t << " <formalpara>" << endl; - m_t << " <title/>" << endl; - m_t << " <table frame=\"all\">" << endl; - m_t << " <title>Parameters</title>" << endl; - m_t << " <tgroup cols=\"2\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl; - m_t << " <tbody>" << endl; - break; - } - case DocParamSect::Exception: - m_t << "exception"; break; - case DocParamSect::TemplateParam: - m_t << "templateparam"; break; + case DocParamSect::Param: m_t << theTranslator->trParameters(); break; + case DocParamSect::RetVal: m_t << theTranslator->trReturnValues(); break; + case DocParamSect::Exception: m_t << theTranslator->trExceptions(); break; + case DocParamSect::TemplateParam: m_t << theTranslator->trTemplateParameters(); break; default: ASSERT(0); } + m_t << " </title>" << endl; + m_t << " <tgroup cols=\"2\" align=\"left\" colsep=\"1\" rowsep=\"1\">" << endl; + m_t << " <tbody>" << endl; } void DocbookDocVisitor::visitPost(DocParamSect *) @@ -1029,17 +1047,17 @@ void DocbookDocVisitor::visitPre(DocParamList *pl) QListIterator<DocNode> li(pl->parameters()); DocNode *param; m_t << " <row>" << endl; - if (!li.toFirst()) + if (!li.toFirst()) { m_t << " <entry></entry>" << endl; - } - else + } + else { m_t << " <entry>"; int cnt = 0; for (li.toFirst();(param=li.current());++li) { - if (cnt) + if (cnt) { m_t << ", "; } @@ -1196,7 +1214,24 @@ void DocbookDocVisitor::writeMscFile(const QCString &baseName) QCString outDir = Config_getString("DOCBOOK_OUTPUT"); writeMscGraphFromFile(baseName+".msc",outDir,shortName,MSC_BITMAP); m_t << " <imagedata"; - m_t << " align=\"center\" fileref=\"" << shortName << ".png" << "\">"; + m_t << " width=\"50%\""; + m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << shortName << ".png" << "\">"; + m_t << "</imagedata>" << endl; +} + +void DocbookDocVisitor::writePlantUMLFile(const QCString &baseName) +{ + QCString shortName = baseName; + int i; + if ((i=shortName.findRev('/'))!=-1) + { + shortName=shortName.right(shortName.length()-i-1); + } + QCString outDir = Config_getString("DOCBOOK_OUTPUT"); + generatePlantUMLOutput(baseName,outDir,PUML_BITMAP); + m_t << " <imagedata"; + m_t << " width=\"50%\""; + m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << shortName << ".png" << "\">"; m_t << "</imagedata>" << endl; } @@ -1231,13 +1266,17 @@ void DocbookDocVisitor::startMscFile(const QCString &fileName, m_t << width; m_t << "\""; } - else if (!height.isEmpty()) + else + { + m_t << " width=\"50%\""; + } + if (!height.isEmpty()) { m_t << " depth=\""; m_t << height; m_t << "\""; } - m_t << " align=\"center\" fileref=\"" << baseName << ".png" << "\">"; + m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << baseName << ".png" << "\">"; m_t << "</imagedata>" << endl; m_t << " </imageobject>" << endl; if (hasCaption) @@ -1342,9 +1381,12 @@ void DocbookDocVisitor::writeDotFile(const QCString &baseName) shortName=shortName.right(shortName.length()-i-1); } QCString outDir = Config_getString("DOCBOOK_OUTPUT"); - writeDotGraphFromFile(baseName+".dot",outDir,shortName,BITMAP); + QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT"); + writeDotGraphFromFile(baseName+".dot",outDir,shortName,GOF_BITMAP); m_t << " <imagedata"; - m_t << " align=\"center\" fileref=\"" << shortName << ".png" << "\">"; + //If no width is specified use default value for PDF rendering + m_t << " width=\"50%\""; + m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << shortName << "." << imgExt << "\">"; m_t << "</imagedata>" << endl; } @@ -1366,7 +1408,8 @@ void DocbookDocVisitor::startDotFile(const QCString &fileName, } baseName.prepend("dot_"); QCString outDir = Config_getString("DOCBOOK_OUTPUT"); - writeDotGraphFromFile(fileName,outDir,baseName,BITMAP); + QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT"); + writeDotGraphFromFile(fileName,outDir,baseName,GOF_BITMAP); m_t << "<para>" << endl; m_t << " <figure>" << endl; m_t << " <title></title>" << endl; @@ -1379,13 +1422,17 @@ void DocbookDocVisitor::startDotFile(const QCString &fileName, m_t << width; m_t << "\""; } - else if (!height.isEmpty()) + else + { + m_t << " width=\"50%\""; + } + if (!height.isEmpty()) { m_t << " depth=\""; m_t << height; m_t << "\""; } - m_t << " align=\"center\" fileref=\"" << baseName << ".png" << "\">"; + m_t << " align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << baseName << "." << imgExt << "\">"; m_t << "</imagedata>" << endl; m_t << " </imageobject>" << endl; if (hasCaption) diff --git a/src/docbookvisitor.h b/src/docbookvisitor.h index 20d424e..dd67aba 100644 --- a/src/docbookvisitor.h +++ b/src/docbookvisitor.h @@ -156,6 +156,7 @@ class DocbookDocVisitor : public DocVisitor const QCString &height, bool hasCaption); void endDotFile(bool hasCaption); void writeDotFile(const QCString &fileName); + void writePlantUMLFile(const QCString &fileName); //-------------------------------------- // state variables //-------------------------------------- diff --git a/src/docparser.cpp b/src/docparser.cpp index e5e2895..8be11c6 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -257,14 +257,18 @@ static QCString findAndCopyImage(const char *fileName,DocImage::Type type) QCString outputDir; switch(type) { - case DocImage::Html: + case DocImage::Html: if (!Config_getBool("GENERATE_HTML")) return result; outputDir = Config_getString("HTML_OUTPUT"); break; - case DocImage::Latex: + case DocImage::Latex: if (!Config_getBool("GENERATE_LATEX")) return result; outputDir = Config_getString("LATEX_OUTPUT"); break; + case DocImage::DocBook: + if (!Config_getBool("GENERATE_DOCBOOK")) return result; + outputDir = Config_getString("DOCBOOK_OUTPUT"); + break; case DocImage::Rtf: if (!Config_getBool("GENERATE_RTF")) return result; outputDir = Config_getString("RTF_OUTPUT"); @@ -2455,16 +2459,15 @@ void DocRef::parse() DocCite::DocCite(DocNode *parent,const QCString &target,const QCString &) //context) { static uint numBibFiles = Config_getList("CITE_BIB_FILES").count(); - m_parent = parent; - QCString anchor; + m_parent = parent; + QCString anchor; //printf("DocCite::DocCite(target=%s)\n",target.data()); ASSERT(!target.isEmpty()); m_relPath = g_relPath; CiteInfo *cite = Doxygen::citeDict->find(target); - if (numBibFiles>0 && cite) // ref to citation + if (numBibFiles>0 && cite && !cite->text.isEmpty()) // ref to citation { m_text = cite->text; - if (m_text.isEmpty()) m_text = cite->label; m_ref = cite->ref; m_anchor = CiteConsts::anchorPrefix+cite->label; m_file = convertNameToFile(CiteConsts::fileName,FALSE,TRUE); @@ -2472,9 +2475,9 @@ DocCite::DocCite(DocNode *parent,const QCString &target,const QCString &) //cont // m_text.data(),m_ref.data(),m_file.data(),m_anchor.data()); return; } - m_text = linkToText(SrcLangExt_Unknown,target,FALSE); + m_text = target; warn_doc_error(g_fileName,doctokenizerYYlineno,"unable to resolve reference to `%s' for \\cite command", - qPrint(target)); + qPrint(target)); } //--------------------------------------------------------------------------- @@ -2904,7 +2907,6 @@ void DocVhdlFlow::parse() DBG(("DocVhdlFlow::parse() end\n")); DocNode *n=g_nodeStack.pop(); ASSERT(n==this); - VhdlDocGen::createFlowChart(g_memberDef); } @@ -5027,9 +5029,10 @@ void DocPara::handleImage(const QCString &cmdName) } DocImage::Type t; QCString imgType = g_token->name.lower(); - if (imgType=="html") t=DocImage::Html; - else if (imgType=="latex") t=DocImage::Latex; - else if (imgType=="rtf") t=DocImage::Rtf; + if (imgType=="html") t=DocImage::Html; + else if (imgType=="latex") t=DocImage::Latex; + else if (imgType=="docbook") t=DocImage::DocBook; + else if (imgType=="rtf") t=DocImage::Rtf; else { warn_doc_error(g_fileName,doctokenizerYYlineno,"image type %s specified as the first argument of " @@ -5565,6 +5568,23 @@ int DocPara::handleCommand(const QCString &cmdName) doctokenizerYYsetStatePara(); } break; + case CMD_STARTUML: + { + static QCString jarPath = Config_getString("PLANTUML_JAR_PATH"); + doctokenizerYYsetStatePlantUML(); + retval = doctokenizerYYlex(); + if (jarPath.isEmpty()) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"ignoring startuml command because PLANTUML_JAR_PATH is not set"); + } + else + { + m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::PlantUML,FALSE,g_token->sectionId)); + } + if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"startuml section ended without end marker"); + doctokenizerYYsetStatePara(); + } + break; case CMD_ENDPARBLOCK: retval=RetVal_EndParBlock; break; @@ -5579,6 +5599,7 @@ int DocPara::handleCommand(const QCString &cmdName) case CMD_ENDVERBATIM: case CMD_ENDDOT: case CMD_ENDMSC: + case CMD_ENDUML: warn_doc_error(g_fileName,doctokenizerYYlineno,"unexpected command %s",qPrint(g_token->name)); break; case CMD_PARAM: diff --git a/src/docparser.h b/src/docparser.h index fb4f084..3dc3d84 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -433,7 +433,7 @@ class DocWhiteSpace : public DocNode class DocVerbatim : public DocNode { public: - enum Type { Code, HtmlOnly, ManOnly, LatexOnly, RtfOnly, XmlOnly, Verbatim, Dot, Msc, DocbookOnly }; + enum Type { Code, HtmlOnly, ManOnly, LatexOnly, RtfOnly, XmlOnly, Verbatim, Dot, Msc, DocbookOnly, PlantUML }; DocVerbatim(DocNode *parent,const QCString &context, const QCString &text, Type t,bool isExample, const QCString &exampleFile,bool isBlock=FALSE,const QCString &lang=QCString()); @@ -668,7 +668,7 @@ class DocXRefItem : public CompAccept<DocXRefItem>, public DocNode class DocImage : public CompAccept<DocImage>, public DocNode { public: - enum Type { Html, Latex, Rtf }; + enum Type { Html, Latex, Rtf, DocBook }; DocImage(DocNode *parent,const HtmlAttribList &attribs, const QCString &name,Type t,const QCString &url=QCString()); Kind kind() const { return Kind_Image; } diff --git a/src/doctokenizer.h b/src/doctokenizer.h index 1db764e..c95230b 100644 --- a/src/doctokenizer.h +++ b/src/doctokenizer.h @@ -160,5 +160,6 @@ void doctokenizerYYpushBackHtmlTag(const char *tag); void doctokenizerYYsetStateSnippet(); void doctokenizerYYstartAutoList(); void doctokenizerYYendAutoList(); +void doctokenizerYYsetStatePlantUML(); #endif diff --git a/src/doctokenizer.l b/src/doctokenizer.l index 7ffbbb3..ea4a1a4 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -333,7 +333,9 @@ BLANK [ \t\r] ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]* PHPTYPE [\\:a-z_A-Z0-9\x80-\xFF\-]+ -CITEID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-:/]* +CITESCHAR [a-z_A-Z\x80-\xFF] +CITEECHAR [a-z_A-Z0-9\x80-\xFF\-\+:\/]* +CITEID {CITESCHAR}*{CITEECHAR}+("."{CITESCHAR}*{CITEECHAR}+)* MAILADR ("mailto:")?[a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+ OPTSTARS ("//"{BLANK}*)?"*"*{BLANK}* LISTITEM {BLANK}*[-]("#")?{WS} @@ -415,6 +417,8 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2} %x St_Verbatim %x St_Dot %x St_Msc +%x St_PlantUMLOpt +%x St_PlantUML %x St_Param %x St_XRefItem %x St_XRefItem2 @@ -841,7 +845,7 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2} <St_Dot>. { /* dot text */ g_token->verb+=yytext; } -<St_Msc>{CMD}("endmsc"|"endvhdlflow") { +<St_Msc>{CMD}("endmsc") { return RetVal_OK; } <St_Msc>[^\\@\n]+ | @@ -849,6 +853,23 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2} <St_Msc>. { /* msc text */ g_token->verb+=yytext; } +<St_PlantUMLOpt>\n { + g_token->sectionId=g_token->sectionId.stripWhiteSpace(); + BEGIN(St_PlantUML); + } +<St_PlantUMLOpt>["{}] { // skip curly brackets or quotes around the optional image name + } +<St_PlantUMLOpt>. { + g_token->sectionId += yytext; + } +<St_PlantUML>{CMD}"enduml" { + return RetVal_OK; + } +<St_PlantUML>[^\\@\n]+ | +<St_PlantUML>\n | +<St_PlantUML>. { /* plantuml text */ + g_token->verb+=yytext; + } <St_Title>"\"" { // quoted title BEGIN(St_TitleQ); } @@ -1119,6 +1140,10 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}|{LNKWORD2} g_endMarker="endmsc"; BEGIN(St_SecSkip); } +<St_Sections>{CMD}"startuml"/[^a-z_A-Z0-9] { + g_endMarker="enduml"; + BEGIN(St_SecSkip); + } <St_Sections>{CMD}"htmlonly"/[^a-z_A-Z0-9] { g_endMarker="endhtmlonly"; BEGIN(St_SecSkip); @@ -1316,6 +1341,13 @@ void doctokenizerYYsetStateMsc() BEGIN(St_Msc); } +void doctokenizerYYsetStatePlantUML() +{ + g_token->verb=""; + g_token->sectionId=""; + BEGIN(St_PlantUMLOpt); +} + void doctokenizerYYsetStateParam() { BEGIN(St_Param); diff --git a/src/dot.cpp b/src/dot.cpp index 051a438..c64729a 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -16,11 +16,6 @@ * */ -#ifdef _WIN32 -#include <windows.h> -#define BITMAP W_BITMAP -#endif - #include <stdlib.h> #include <qdir.h> @@ -1812,7 +1807,7 @@ void DotNode::writeBox(FTextStream &t, t << "\",height=0.2,width=0.4"; if (m_isRoot) { - t << ",color=\"black\", fillcolor=\"grey75\", style=\"filled\" fontcolor=\"black\""; + t << ",color=\"black\", fillcolor=\"grey75\", style=\"filled\", fontcolor=\"black\""; } else { @@ -1896,7 +1891,7 @@ void DotNode::writeArrow(FTextStream &t, t << ",arrowhead=\"" << eProps->arrowStyleMap[ei->m_color] << "\""; } - if (format==BITMAP) t << ",fontname=\"" << FONTNAME << "\""; + if (format==GOF_BITMAP) t << ",fontname=\"" << FONTNAME << "\""; t << "];" << endl; } @@ -2313,7 +2308,7 @@ void DotGfxHierarchyTable::writeGraph(FTextStream &out, { if (node->m_subgraphId==n->m_subgraphId) { - node->write(md5stream,DotNode::Hierarchy,BITMAP,FALSE,TRUE,TRUE,TRUE); + node->write(md5stream,DotNode::Hierarchy,GOF_BITMAP,FALSE,TRUE,TRUE,TRUE); } } writeGraphFooter(md5stream); @@ -3080,7 +3075,8 @@ QCString DotClassGraph::diskName() const } QCString DotClassGraph::writeGraph(FTextStream &out, - GraphOutputFormat format, + GraphOutputFormat graphFormat, + EmbeddedOutputFormat textFormat, const char *path, const char *fileName, const char *relPath, @@ -3128,19 +3124,19 @@ QCString DotClassGraph::writeGraph(FTextStream &out, if (updateDotGraph(m_startNode, m_graphType, absBaseName, - format, + graphFormat, m_lrRank, m_graphType==DotNode::Inheritance, TRUE, m_startNode->label() ) || - !checkDeliverables(format==BITMAP ? absImgName : + !checkDeliverables(graphFormat==GOF_BITMAP ? absImgName : usePDFLatex ? absPdfName : absEpsName, - format==BITMAP && generateImageMap ? absMapName : QCString()) + graphFormat==GOF_BITMAP && generateImageMap ? absMapName : QCString()) ) { regenerate=TRUE; - if (format==BITMAP) // run dot to create a bitmap image + if (graphFormat==GOF_BITMAP) // run dot to create a bitmap image { QCString dotArgs(maxCmdLine); @@ -3151,7 +3147,7 @@ QCString DotClassGraph::writeGraph(FTextStream &out, DotManager::instance()->addRun(dotRun); } - else if (format==EPS) // run dot to create a .eps image + else if (graphFormat==GOF_EPS) // run dot to create a .eps image { DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE); if (usePDFLatex) @@ -3167,7 +3163,35 @@ QCString DotClassGraph::writeGraph(FTextStream &out, } Doxygen::indexList->addImageFile(baseName+"."+imgExt); - if (format==BITMAP && generateImageMap) // produce HTML to include the image + if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook) + { + out << "<para>" << endl; + out << " <figure>" << endl; + out << " <title>"; + switch (m_graphType) + { + case DotNode::Collaboration: + out << "Collaboration graph"; + break; + case DotNode::Inheritance: + out << "Inheritance graph"; + break; + default: + ASSERT(0); + break; + } + out << "</title>" << endl; + out << " <mediaobject>" << endl; + out << " <imageobject>" << endl; + out << " <imagedata"; + out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; + out << "</imagedata>" << endl; + out << " </imageobject>" << endl; + out << " </mediaobject>" << endl; + out << " </figure>" << endl; + out << "</para>" << endl; + } + else if (graphFormat==GOF_BITMAP && generateImageMap) // produce HTML to include the image { QCString mapLabel = escapeCharsInString(m_startNode->m_label,FALSE)+"_"+ escapeCharsInString(mapName,FALSE); @@ -3189,7 +3213,7 @@ QCString DotClassGraph::writeGraph(FTextStream &out, { out << "<div class=\"center\">"; out << "<img src=\"" << relPath << baseName << "." - << imgExt << "\" border=\"0\" usemap=\"#" + << imgExt << "\" border=\"0\" usemap=\"#" << mapLabel << "\" alt=\""; switch (m_graphType) { @@ -3202,10 +3226,9 @@ QCString DotClassGraph::writeGraph(FTextStream &out, default: ASSERT(0); break; - } + } out << "\"/>"; out << "</div>" << endl; - if (regenerate || !insertMapFile(out,absMapName,relPath,mapLabel)) { int mapId = DotManager::instance()->addMap(fileName,absMapName,relPath, @@ -3214,7 +3237,7 @@ QCString DotClassGraph::writeGraph(FTextStream &out, } } } - else if (format==EPS) // produce tex to include the .eps image + else if (graphFormat==GOF_EPS) // produce tex to include the .eps image { if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName)) { @@ -3423,7 +3446,8 @@ QCString DotInclDepGraph::diskName() const } QCString DotInclDepGraph::writeGraph(FTextStream &out, - GraphOutputFormat format, + GraphOutputFormat graphFormat, + EmbeddedOutputFormat textFormat, const char *path, const char *fileName, const char *relPath, @@ -3458,19 +3482,19 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out, if (updateDotGraph(m_startNode, DotNode::Dependency, absBaseName, - format, + graphFormat, FALSE, // lrRank FALSE, // renderParents m_inverse, // backArrows m_startNode->label() ) || - !checkDeliverables(format==BITMAP ? absImgName : + !checkDeliverables(graphFormat==GOF_BITMAP ? absImgName : usePDFLatex ? absPdfName : absEpsName, - format==BITMAP && generateImageMap ? absMapName : QCString()) + graphFormat==GOF_BITMAP && generateImageMap ? absMapName : QCString()) ) { regenerate=TRUE; - if (format==BITMAP) + if (graphFormat==GOF_BITMAP) { // run dot to create a bitmap image QCString dotArgs(maxCmdLine); @@ -3479,7 +3503,7 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out, if (generateImageMap) dotRun->addJob(MAP_CMD,absMapName); DotManager::instance()->addRun(dotRun); } - else if (format==EPS) + else if (graphFormat==GOF_EPS) { DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE); if (usePDFLatex) @@ -3491,12 +3515,27 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out, dotRun->addJob("ps",absEpsName); } DotManager::instance()->addRun(dotRun); - - } + } } Doxygen::indexList->addImageFile(baseName+"."+imgExt); - if (format==BITMAP && generateImageMap) + if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook) + { + out << "<para>" << endl; + out << " <figure>" << endl; + out << " <title>Dependency diagram"; + out << "</title>" << endl; + out << " <mediaobject>" << endl; + out << " <imageobject>" << endl; + out << " <imagedata"; + out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; + out << "</imagedata>" << endl; + out << " </imageobject>" << endl; + out << " </mediaobject>" << endl; + out << " </figure>" << endl; + out << "</para>" << endl; + } + else if (graphFormat==GOF_BITMAP && generateImageMap) { if (imgExt=="svg") // Scalable vector graphics { @@ -3514,9 +3553,7 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out, } else // bitmap graphics { - out << "<div class=\"center\"><img src=\"" << relPath << baseName << "." - << imgExt << "\" border=\"0\" usemap=\"#" - << mapName << "\" alt=\"\"/>"; + out << "<div class=\"center\"><img src=\"" << relPath << baseName << "." << imgExt << "\" border=\"0\" usemap=\"#" << mapName << "\" alt=\"\"/>"; out << "</div>" << endl; QCString absMapName = absBaseName+".map"; @@ -3528,7 +3565,7 @@ QCString DotInclDepGraph::writeGraph(FTextStream &out, } } } - else if (format==EPS) // encapsulated postscript + else if (graphFormat==GOF_EPS) // encapsulated postscript { if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName)) { @@ -3729,7 +3766,8 @@ DotCallGraph::~DotCallGraph() delete m_usedNodes; } -QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format, +QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat graphFormat, + EmbeddedOutputFormat textFormat, const char *path,const char *fileName, const char *relPath,bool generateImageMap,int graphId) const @@ -3757,19 +3795,19 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format, if (updateDotGraph(m_startNode, DotNode::CallGraph, absBaseName, - format, + graphFormat, TRUE, // lrRank FALSE, // renderParents m_inverse, // backArrows m_startNode->label() ) || - !checkDeliverables(format==BITMAP ? absImgName : + !checkDeliverables(graphFormat==GOF_BITMAP ? absImgName : usePDFLatex ? absPdfName : absEpsName, - format==BITMAP && generateImageMap ? absMapName : QCString()) + graphFormat==GOF_BITMAP && generateImageMap ? absMapName : QCString()) ) { regenerate=TRUE; - if (format==BITMAP) + if (graphFormat==GOF_BITMAP) { // run dot to create a bitmap image QCString dotArgs(maxCmdLine); @@ -3779,7 +3817,7 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format, DotManager::instance()->addRun(dotRun); } - else if (format==EPS) + else if (graphFormat==GOF_EPS) { // run dot to create a .eps image DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE); @@ -3797,7 +3835,23 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format, } Doxygen::indexList->addImageFile(baseName+"."+imgExt); - if (format==BITMAP && generateImageMap) + if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook) + { + out << "<para>" << endl; + out << " <figure>" << endl; + out << " <title>Call diagram"; + out << "</title>" << endl; + out << " <mediaobject>" << endl; + out << " <imageobject>" << endl; + out << " <imagedata"; + out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; + out << "</imagedata>" << endl; + out << " </imageobject>" << endl; + out << " </mediaobject>" << endl; + out << " </figure>" << endl; + out << "</para>" << endl; + } + else if (graphFormat==GOF_BITMAP && generateImageMap) { if (imgExt=="svg") // Scalable vector graphics { @@ -3815,7 +3869,7 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format, } else // bitmap graphics { - out << "<div class=\"center\"><img src=\"" << relPath << baseName << "." + out << "<div class=\"center\"><img src=\"" << relPath << baseName << "." << imgExt << "\" border=\"0\" usemap=\"#" << mapName << "\" alt=\""; out << "\"/>"; @@ -3829,7 +3883,7 @@ QCString DotCallGraph::writeGraph(FTextStream &out, GraphOutputFormat format, } } } - else if (format==EPS) // encapsulated postscript + else if (graphFormat==GOF_EPS) // encapsulated postscript { if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName)) { @@ -3865,7 +3919,8 @@ DotDirDeps::~DotDirDeps() } QCString DotDirDeps::writeGraph(FTextStream &out, - GraphOutputFormat format, + GraphOutputFormat graphFormat, + EmbeddedOutputFormat textFormat, const char *path, const char *fileName, const char *relPath, @@ -3901,9 +3956,9 @@ QCString DotDirDeps::writeGraph(FTextStream &out, MD5SigToString(md5_sig,sigStr.data(),33); bool regenerate=FALSE; if (checkAndUpdateMd5Signature(absBaseName,sigStr) || - !checkDeliverables(format==BITMAP ? absImgName : + !checkDeliverables(graphFormat==GOF_BITMAP ? absImgName : usePDFLatex ? absPdfName : absEpsName, - format==BITMAP && generateImageMap ? absMapName : QCString()) + graphFormat==GOF_BITMAP && generateImageMap ? absMapName : QCString()) ) { regenerate=TRUE; @@ -3917,7 +3972,7 @@ QCString DotDirDeps::writeGraph(FTextStream &out, t << theGraph.data(); f.close(); - if (format==BITMAP) + if (graphFormat==GOF_BITMAP) { // run dot to create a bitmap image QCString dotArgs(maxCmdLine); @@ -3926,7 +3981,7 @@ QCString DotDirDeps::writeGraph(FTextStream &out, if (generateImageMap) dotRun->addJob(MAP_CMD,absMapName); DotManager::instance()->addRun(dotRun); } - else if (format==EPS) + else if (graphFormat==GOF_EPS) { DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE); if (usePDFLatex) @@ -3942,7 +3997,23 @@ QCString DotDirDeps::writeGraph(FTextStream &out, } Doxygen::indexList->addImageFile(baseName+"."+imgExt); - if (format==BITMAP && generateImageMap) + if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook) + { + out << "<para>" << endl; + out << " <figure>" << endl; + out << " <title>Directory Dependency diagram"; + out << "</title>" << endl; + out << " <mediaobject>" << endl; + out << " <imageobject>" << endl; + out << " <imagedata"; + out << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; + out << "</imagedata>" << endl; + out << " </imageobject>" << endl; + out << " </mediaobject>" << endl; + out << " </figure>" << endl; + out << "</para>" << endl; + } + else if (graphFormat==GOF_BITMAP && generateImageMap) { if (imgExt=="svg") // Scalable vector graphics { @@ -3960,7 +4031,7 @@ QCString DotDirDeps::writeGraph(FTextStream &out, } else // bitmap graphics { - out << "<div class=\"center\"><img src=\"" << relPath << baseName << "." + out << "<div class=\"center\"><img src=\"" << relPath << baseName << "." << imgExt << "\" border=\"0\" usemap=\"#" << mapName << "\" alt=\""; out << convertToXML(m_dir->displayName()); @@ -3975,7 +4046,7 @@ QCString DotDirDeps::writeGraph(FTextStream &out, } } } - else if (format==EPS) + else if (graphFormat==GOF_EPS) { if (regenerate || !writeVecGfxFigure(out,baseName,absBaseName)) { @@ -4085,9 +4156,9 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir, QCString absOutFile = d.absPath().utf8()+"/"+outFile; DotRunner dotRun(inFile,d.absPath().data(),FALSE,absImgName); - if (format==BITMAP) + if (format==GOF_BITMAP) dotRun.addJob(imgExt,absImgName); - else // format==EPS + else // format==GOF_EPS { if (Config_getBool("USE_PDFLATEX")) { @@ -4105,7 +4176,7 @@ void writeDotGraphFromFile(const char *inFile,const char *outDir, return; } - if (format==BITMAP) checkDotResult(absImgName); + if (format==GOF_BITMAP) checkDotResult(absImgName); Doxygen::indexList->addImageFile(imgName); @@ -4384,7 +4455,8 @@ void DotGroupCollaboration::addCollaborationMember( } -QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat format, +QCString DotGroupCollaboration::writeGraph( FTextStream &t, + GraphOutputFormat graphFormat, EmbeddedOutputFormat textFormat, const char *path, const char *fileName, const char *relPath, bool writeImageMap,int graphId) const { @@ -4411,7 +4483,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo // write other nodes. for (dni.toFirst();(pn=dni.current());++dni) { - pn->write(md5stream,DotNode::Inheritance,format,TRUE,FALSE,FALSE,FALSE); + pn->write(md5stream,DotNode::Inheritance,graphFormat,TRUE,FALSE,FALSE,FALSE); } // write edges @@ -4441,9 +4513,9 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo QCString absEpsName = absBaseName+".eps"; bool regenerate=FALSE; if (checkAndUpdateMd5Signature(absBaseName,sigStr) || - !checkDeliverables(format==BITMAP ? absImgName : + !checkDeliverables(graphFormat==GOF_BITMAP ? absImgName : usePDFLatex ? absPdfName : absEpsName, - format==BITMAP /*&& generateImageMap*/ ? absMapName : QCString()) + graphFormat==GOF_BITMAP /*&& generateImageMap*/ ? absMapName : QCString()) ) { regenerate=TRUE; @@ -4456,7 +4528,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo dotfile.close(); } - if (format==BITMAP) // run dot to create a bitmap image + if (graphFormat==GOF_BITMAP) // run dot to create a bitmap image { QCString dotArgs(maxCmdLine); @@ -4466,7 +4538,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo DotManager::instance()->addRun(dotRun); } - else if (format==EPS) + else if (graphFormat==GOF_EPS) { DotRunner *dotRun = new DotRunner(absDotName,d.absPath().data(),FALSE); if (usePDFLatex) @@ -4481,7 +4553,23 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo } } - if (format==BITMAP && writeImageMap) + if (graphFormat==GOF_BITMAP && textFormat==EOF_DocBook) + { + t << "<para>" << endl; + t << " <figure>" << endl; + t << " <title>Group Collaboration diagram"; + t << "</title>" << endl; + t << " <mediaobject>" << endl; + t << " <imageobject>" << endl; + t << " <imagedata"; + t << " width=\"50%\" align=\"center\" valign=\"middle\" scalefit=\"1\" fileref=\"" << relPath << baseName << "." << imgExt << "\">"; + t << "</imagedata>" << endl; + t << " </imageobject>" << endl; + t << " </mediaobject>" << endl; + t << " </figure>" << endl; + t << "</para>" << endl; + } + else if (graphFormat==GOF_BITMAP && writeImageMap) { QCString mapLabel = escapeCharsInString(baseName,FALSE); t << "<center><table><tr><td>"; @@ -4503,7 +4591,7 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo else { t << "<img src=\"" << relPath << imgName - << "\" border=\"0\" alt=\"\" usemap=\"#" + << "\" border=\"0\" alt=\"\" usemap=\"#" << mapLabel << "\"/>" << endl; if (regenerate || !insertMapFile(t,absMapName,relPath,mapLabel)) { @@ -4512,10 +4600,9 @@ QCString DotGroupCollaboration::writeGraph( FTextStream &t, GraphOutputFormat fo t << "<!-- MAP " << mapId << " -->" << endl; } } - t << "</td></tr></table></center>" << endl; } - else if (format==EPS) + else if (graphFormat==GOF_EPS) { if (regenerate || !writeVecGfxFigure(t,baseName,absBaseName)) { @@ -39,7 +39,8 @@ class GroupDef; class DotGroupCollaboration; class DotRunnerQueue; -enum GraphOutputFormat { BITMAP , EPS }; +enum GraphOutputFormat { GOF_BITMAP, GOF_EPS }; +enum EmbeddedOutputFormat { EOF_Html, EOF_LaTeX, EOF_Rtf, EOF_DocBook }; /** Attributes of an edge of a dot graph */ struct EdgeInfo @@ -165,8 +166,8 @@ class DotClassGraph ~DotClassGraph(); bool isTrivial() const; bool isTooBig() const; - QCString writeGraph(FTextStream &t,GraphOutputFormat f,const char *path, - const char *fileName, const char *relPath, + QCString writeGraph(FTextStream &t,GraphOutputFormat gf,EmbeddedOutputFormat ef, + const char *path, const char *fileName, const char *relPath, bool TBRank=TRUE,bool imageMap=TRUE,int graphId=-1) const; void writeXML(FTextStream &t); @@ -196,7 +197,7 @@ class DotInclDepGraph public: DotInclDepGraph(FileDef *fd,bool inverse); ~DotInclDepGraph(); - QCString writeGraph(FTextStream &t, GraphOutputFormat f, + QCString writeGraph(FTextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const char *path,const char *fileName,const char *relPath, bool writeImageMap=TRUE,int graphId=-1) const; bool isTrivial() const; @@ -222,7 +223,7 @@ class DotCallGraph public: DotCallGraph(MemberDef *md,bool inverse); ~DotCallGraph(); - QCString writeGraph(FTextStream &t, GraphOutputFormat f, + QCString writeGraph(FTextStream &t, GraphOutputFormat gf, EmbeddedOutputFormat ef, const char *path,const char *fileName, const char *relPath,bool writeImageMap=TRUE, int graphId=-1) const; @@ -249,7 +250,8 @@ class DotDirDeps ~DotDirDeps(); bool isTrivial() const; QCString writeGraph(FTextStream &out, - GraphOutputFormat format, + GraphOutputFormat gf, + EmbeddedOutputFormat ef, const char *path, const char *fileName, const char *relPath, @@ -298,7 +300,7 @@ class DotGroupCollaboration DotGroupCollaboration(GroupDef* gd); ~DotGroupCollaboration(); - QCString writeGraph(FTextStream &t, GraphOutputFormat format, + QCString writeGraph(FTextStream &t, GraphOutputFormat gf,EmbeddedOutputFormat ef, const char *path,const char *fileName,const char *relPath, bool writeImageMap=TRUE,int graphId=-1) const; void buildGraph(GroupDef* gd); diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 26eda84..533e6ef 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -79,7 +79,7 @@ #include "store.h" #include "marshal.h" #include "portable.h" -#include "vhdlscanner.h" +#include "vhdljjparser.h" #include "vhdldocgen.h" #include "eclipsehelp.h" #include "cite.h" @@ -98,6 +98,7 @@ #include "formula.h" #include "settings.h" #include "context.h" +#include "fileparser.h" #define RECURSE_ENTRYTREE(func,var) \ do { if (var->children()) { \ @@ -551,7 +552,7 @@ static void addSTLClasses(EntryNav *rootNav) //---------------------------------------------------------------------------- static Definition *findScopeFromQualifiedName(Definition *startScope,const QCString &n, - FileDef *fileScope=0); + FileDef *fileScope,TagInfo *tagInfo); static void addPageToContext(PageDef *pd,EntryNav *rootNav) { @@ -564,7 +565,7 @@ static void addPageToContext(PageDef *pd,EntryNav *rootNav) } scope = stripAnonymousNamespaceScope(scope); scope+="::"+pd->name(); - Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,scope); + Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,scope,0,rootNav->tagInfo()); if (d) { pd->setPageScope(d); @@ -708,7 +709,7 @@ static void findGroupScope(EntryNav *rootNav) } scope = stripAnonymousNamespaceScope(scope); scope+="::"+gd->name(); - Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,scope); + Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,scope,0,rootNav->tagInfo()); if (d) { gd->setGroupScope(d); @@ -996,7 +997,8 @@ static Definition *findScope(Entry *root,int level=0) * full qualified name \a name. Creates an artificial scope if the scope is * not found and set the parent/child scope relation if the scope is found. */ -static Definition *buildScopeFromQualifiedName(const QCString name,int level,SrcLangExt lang,TagInfo *tagInfo) +static Definition *buildScopeFromQualifiedName(const QCString name, + int level,SrcLangExt lang,TagInfo *tagInfo) { //printf("buildScopeFromQualifiedName(%s) level=%d\n",name.data(),level); int i=0; @@ -1018,7 +1020,7 @@ static Definition *buildScopeFromQualifiedName(const QCString name,int level,Src { innerScope = cd; } - else if (nd==0 && cd==0) // scope is not known! + else if (nd==0 && cd==0 && fullScope.find('<')==-1) // scope is not known and could be a namespace! { // introduce bogus namespace //printf("++ adding dummy namespace %s to %s tagInfo=%p\n",nsName.data(),prevScope->name().data(),tagInfo); @@ -1047,7 +1049,7 @@ static Definition *buildScopeFromQualifiedName(const QCString name,int level,Src } static Definition *findScopeFromQualifiedName(Definition *startScope,const QCString &n, - FileDef *fileScope) + FileDef *fileScope,TagInfo *tagInfo) { //printf("<findScopeFromQualifiedName(%s,%s)\n",startScope ? startScope->name().data() : 0, n.data()); Definition *resultScope=startScope; @@ -1080,7 +1082,7 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr for (ni.toFirst();((nd=ni.current()) && resultScope==0);++ni) { // restart search within the used namespace - resultScope = findScopeFromQualifiedName(nd,n,fileScope); + resultScope = findScopeFromQualifiedName(nd,n,fileScope,tagInfo); } if (resultScope) { @@ -1112,7 +1114,8 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr // so use this instead. QCString fqn = QCString(ui.currentKey())+ scope.right(scope.length()-p); - resultScope = buildScopeFromQualifiedName(fqn,fqn.contains("::"),startScope->getLanguage(),0); + resultScope = buildScopeFromQualifiedName(fqn,fqn.contains("::"), + startScope->getLanguage(),0); //printf("Creating scope from fqn=%s result %p\n",fqn.data(),resultScope); if (resultScope) { @@ -1254,7 +1257,7 @@ static void addClassToContext(EntryNav *rootNav) Debug::print(Debug::Classes,0, " Found class with name %s (qualifiedName=%s -> cd=%p)\n", cd ? cd->name().data() : root->name.data(), qualifiedName.data(),cd); - if (cd) + if (cd) { fullName=cd->name(); Debug::print(Debug::Classes,0," Existing class %s!\n",cd->name().data()); @@ -1274,11 +1277,12 @@ static void addClassToContext(EntryNav *rootNav) } //cd->setName(fullName); // change name to match docs - if (cd->templateArguments()==0) + if (cd->templateArguments()==0 || (cd->isForwardDeclared() && (root->spec&Entry::ForwardDecl)==0)) { // this happens if a template class declared with @class is found - // before the actual definition. - ArgumentList *tArgList = + // before the actual definition or if a forward declaration has different template + // parameter names. + ArgumentList *tArgList = getTemplateArgumentsFromName(cd->name(),root->tArgLists); cd->setTemplateArguments(tArgList); } @@ -1343,11 +1347,12 @@ static void addClassToContext(EntryNav *rootNav) cd->insertUsedFile(fd); // add class to the list - //printf("ClassDict.insert(%s)\n",resolveDefines(fullName).data()); + //printf("ClassDict.insert(%s)\n",fullName.data()); Doxygen::classSDict->append(fullName,cd); if (cd->isGeneric()) // generics are also stored in a separate dictionary for fast lookup of instantions { + //printf("inserting generic '%s' cd=%p\n",fullName.data(),cd); Doxygen::genericsDict->insert(fullName,cd); } } @@ -1420,7 +1425,7 @@ static void resolveClassNestingRelations() //printf("processing=%s, iteration=%d\n",cd->name().data(),iteration); // also add class to the correct structural context Definition *d = findScopeFromQualifiedName(Doxygen::globalScope, - name,cd->getFileDef()); + name,cd->getFileDef(),0); if (d) { //printf("****** adding %s to scope %s in iteration %d\n",cd->name().data(),d->name().data(),iteration); @@ -1788,7 +1793,7 @@ static void buildNamespaceList(EntryNav *rootNav) Doxygen::namespaceSDict->inSort(fullName,nd); // also add namespace to the correct structural context - Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName); + Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName,0,tagInfo); //printf("adding namespace %s to context %s\n",nd->name().data(),d?d->name().data():"<none>"); if (d==0) // we didn't find anything, create the scope artificially // anyway, so we can at least relate scopes properly. @@ -4109,7 +4114,9 @@ static ClassDef *findClassWithinClassContext(Definition *context,ClassDef *cd,co { result = getClass(name); } - if (result==0 && cd && cd->getLanguage()==SrcLangExt_CSharp && name.find('<')!=-1) + if (result==0 && cd && + (cd->getLanguage()==SrcLangExt_CSharp || cd->getLanguage()==SrcLangExt_Java) && + name.find('<')!=-1) { result = Doxygen::genericsDict->find(name); } @@ -4634,34 +4641,32 @@ static bool findClassRelation( int i=baseClassName.find('<'); int si=baseClassName.findRev("::",i==-1 ? baseClassName.length() : i); if (si==-1) si=0; + if (baseClass==0 && (root->lang==SrcLangExt_CSharp || root->lang==SrcLangExt_Java)) + { + baseClass = Doxygen::genericsDict->find(baseClassName); + //printf("looking for '%s' result=%p\n",baseClassName.data(),baseClass); + } if (baseClass==0 && i!=-1) // base class has template specifiers { - if (root->lang == SrcLangExt_CSharp) - { - baseClass = Doxygen::genericsDict->find(baseClassName); - } - else + // TODO: here we should try to find the correct template specialization + // but for now, we only look for the unspecializated base class. + int e=findEndOfTemplate(baseClassName,i+1); + //printf("baseClass==0 i=%d e=%d\n",i,e); + if (e!=-1) // end of template was found at e { - // TODO: here we should try to find the correct template specialization - // but for now, we only look for the unspecializated base class. - int e=findEndOfTemplate(baseClassName,i+1); - //printf("baseClass==0 i=%d e=%d\n",i,e); - if (e!=-1) // end of template was found at e - { - templSpec=removeRedundantWhiteSpace(baseClassName.mid(i,e-i)); - baseClassName=baseClassName.left(i)+baseClassName.right(baseClassName.length()-e); - baseClass=getResolvedClass(explicitGlobalScope ? Doxygen::globalScope : context, - cd->getFileDef(), - baseClassName, - &baseClassTypeDef, - 0, //&templSpec, - mode==Undocumented, - TRUE - ); - //printf("baseClass=%p -> baseClass=%s templSpec=%s\n", - // baseClass,baseClassName.data(),templSpec.data()); - } + templSpec=removeRedundantWhiteSpace(baseClassName.mid(i,e-i)); + baseClassName=baseClassName.left(i)+baseClassName.right(baseClassName.length()-e); + baseClass=getResolvedClass(explicitGlobalScope ? Doxygen::globalScope : context, + cd->getFileDef(), + baseClassName, + &baseClassTypeDef, + 0, //&templSpec, + mode==Undocumented, + TRUE + ); + //printf("baseClass=%p -> baseClass=%s templSpec=%s\n", + // baseClass,baseClassName.data(),templSpec.data()); } } else if (baseClass && !templSpec.isEmpty()) // we have a known class, but also @@ -4823,7 +4828,7 @@ static bool findClassRelation( int si = baseClassName.findRev("::"); if (si!=-1) // class is nested { - Definition *sd = findScopeFromQualifiedName(Doxygen::globalScope,baseClassName.left(si)); + Definition *sd = findScopeFromQualifiedName(Doxygen::globalScope,baseClassName.left(si),0,rootNav->tagInfo()); if (sd==0 || sd==Doxygen::globalScope) // outer scope not found { baseClass->setArtificial(TRUE); // see bug678139 @@ -6151,7 +6156,8 @@ static void findMember(EntryNav *rootNav, { QCString memType = md->typeString(); memType.stripPrefix("static "); // see bug700696 - funcType=substitute(funcType,className+"::",""); // see bug700693 + funcType=substitute(stripTemplateSpecifiersFromScope(funcType,TRUE), + className+"::",""); // see bug700693 & bug732594 Debug::print(Debug::FindMembers,0, "5b. Comparing return types '%s'<->'%s' #args %d<->%d\n", md->typeString(),funcType.data(), @@ -8622,15 +8628,16 @@ static void buildPageList(EntryNav *rootNav) RECURSE_ENTRYTREE(buildPageList,rootNav); } +// search for the main page defined in this project static void findMainPage(EntryNav *rootNav) { if (rootNav->section() == Entry::MAINPAGEDOC_SEC) { rootNav->loadEntry(g_storage); - Entry *root = rootNav->entry(); - if (Doxygen::mainPage==0) + if (Doxygen::mainPage==0 && rootNav->tagInfo()==0) { + Entry *root = rootNav->entry(); //printf("Found main page! \n======\n%s\n=======\n",root->doc.data()); QCString title=root->args.stripWhiteSpace(); //QCString indexName=Config_getBool("GENERATE_TREEVIEW")?"main":"index"; @@ -8642,17 +8649,17 @@ static void findMainPage(EntryNav *rootNav) Doxygen::mainPage->setFileName(indexName,TRUE); Doxygen::mainPage->setShowToc(root->stat); addPageToContext(Doxygen::mainPage,rootNav); - + SectionInfo *si = Doxygen::sectionDict->find(Doxygen::mainPage->name()); if (si) { if (si->lineNr != -1) { - warn(root->fileName,root->startLine,"multiple use of section label '%s', (first occurrence: %s, line %d)",Doxygen::mainPage->name().data(),si->fileName.data(),si->lineNr); + warn(root->fileName,root->startLine,"multiple use of section label '%s' for main page, (first occurrence: %s, line %d)",Doxygen::mainPage->name().data(),si->fileName.data(),si->lineNr); } else { - warn(root->fileName,root->startLine,"multiple use of section label '%s', (first occurrence: %s)",Doxygen::mainPage->name().data(),si->fileName.data()); + warn(root->fileName,root->startLine,"multiple use of section label '%s' for main page, (first occurrence: %s)",Doxygen::mainPage->name().data(),si->fileName.data()); } } else @@ -8668,11 +8675,12 @@ static void findMainPage(EntryNav *rootNav) Doxygen::mainPage->addSectionsToDefinition(root->anchors); } } - else + else if (rootNav->tagInfo()==0) { + Entry *root = rootNav->entry(); warn(root->fileName,root->startLine, - "found more than one \\mainpage comment block! Skipping this " - "block." + "found more than one \\mainpage comment block! Skipping this " + "block." ); } @@ -8681,6 +8689,22 @@ static void findMainPage(EntryNav *rootNav) RECURSE_ENTRYTREE(findMainPage,rootNav); } +// search for the main page imported via tag files and add only the section labels +static void findMainPageTagFiles(EntryNav *rootNav) +{ + if (rootNav->section() == Entry::MAINPAGEDOC_SEC) + { + rootNav->loadEntry(g_storage); + + if (Doxygen::mainPage && rootNav->tagInfo()) + { + Entry *root = rootNav->entry(); + Doxygen::mainPage->addSectionsToDefinition(root->anchors); + } + } + RECURSE_ENTRYTREE(findMainPageTagFiles,rootNav); +} + static void computePageRelations(EntryNav *rootNav) { if ((rootNav->section()==Entry::PAGEDOC_SEC || @@ -9146,22 +9170,24 @@ static void copyStyleSheet() copyFile(htmlStyleSheet,destFileName); } } - QCString &htmlExtraStyleSheet = Config_getString("HTML_EXTRA_STYLESHEET"); - if (!htmlExtraStyleSheet.isEmpty()) + QStrList htmlExtraStyleSheet = Config_getList("HTML_EXTRA_STYLESHEET"); + for (uint i=0; i<htmlExtraStyleSheet.count(); ++i) { - QFileInfo fi(htmlExtraStyleSheet); - if (!fi.exists()) - { - err("Style sheet '%s' specified by HTML_EXTRA_STYLESHEET does not exist!\n",htmlExtraStyleSheet.data()); - htmlExtraStyleSheet.resize(0); // revert to the default - } - else + QCString fileName(htmlExtraStyleSheet.at(i)); + if (!fileName.isEmpty()) { - QCString destFileName = Config_getString("HTML_OUTPUT")+"/"+fi.fileName().data(); - copyFile(htmlExtraStyleSheet,destFileName); + QFileInfo fi(fileName); + if (!fi.exists()) + { + err("Style sheet '%s' specified by HTML_EXTRA_STYLESHEET does not exist!\n",fileName.data()); + } + else + { + QCString destFileName = Config_getString("HTML_OUTPUT")+"/"+fi.fileName().data(); + copyFile(fileName, destFileName); + } } } - } static void copyLogo() @@ -9892,7 +9918,8 @@ void initDoxygen() initPreprocessor(); Doxygen::parserManager = new ParserManager; - Doxygen::parserManager->registerParser("c", new CLanguageScanner, TRUE); + Doxygen::parserManager->registerDefaultParser( new FileParser); + Doxygen::parserManager->registerParser("c", new CLanguageScanner); Doxygen::parserManager->registerParser("python", new PythonLanguageScanner); Doxygen::parserManager->registerParser("fortran", new FortranLanguageScanner); Doxygen::parserManager->registerParser("fortranfree", new FortranLanguageScannerFree); @@ -11049,7 +11076,7 @@ void parseInput() flushUnresolvedRelations(); if (Config_getBool("OPTIMIZE_OUTPUT_VHDL")) { - VhdlDocGen::computeVhdlComponentRelations(); + VhdlDocGen::computeVhdlComponentRelations(); } computeClassRelations(); g_classEntries.clear(); @@ -11074,6 +11101,7 @@ void parseInput() g_s.begin("Search for main page...\n"); findMainPage(rootNav); + findMainPageTagFiles(rootNav); g_s.end(); g_s.begin("Computing page relations...\n"); @@ -11192,13 +11220,6 @@ void parseInput() g_s.begin("Adding members to index pages...\n"); addMembersToIndex(); g_s.end(); - - if (Config_getBool("OPTIMIZE_OUTPUT_VHDL") && - Config_getBool("HAVE_DOT") && - Config_getEnum("DOT_IMAGE_FORMAT")=="svg") - { - VhdlDocGen::writeOverview(); - } } void generateOutput() diff --git a/src/doxygen.pro.in b/src/doxygen.pro.in index 8bca741..4f05a35 100644 --- a/src/doxygen.pro.in +++ b/src/doxygen.pro.in @@ -18,18 +18,18 @@ TEMPLATE = app.t CONFIG = console warn_on $extraopts HEADERS = doxygen.h SOURCES = main.cpp -unix:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -lpthread %%SQLITE3_LIBS%% %%LIBCLANG_LIBS%% +unix:LIBS += -L../lib -ldoxygen -lvhdlparser -ldoxycfg -lqtools -lmd5 -lpthread %%SQLITE3_LIBS%% %%LIBCLANG_LIBS%% win32:INCLUDEPATH += . -win32-mingw:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -lpthread -llibiconv -lole32 %%SQLITE3_LIBS%% %%LIBCLANG_LIBS%% -win32-msvc:LIBS += qtools.lib md5.lib doxygen.lib doxycfg.lib shell32.lib iconv.lib +win32-mingw:LIBS += -L../lib -ldoxygen -ldoxycfg -lvhdlparser -lqtools -lmd5 -lpthread -llibiconv -lole32 %%SQLITE3_LIBS%% %%LIBCLANG_LIBS%% +win32-msvc:LIBS += qtools.lib md5.lib doxygen.lib doxycfg.lib vhdlparser.lib shell32.lib iconv.lib win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\lib -win32-borland:LIBS += qtools.lib md5.lib doxygen.lib doxycfg.lib shell32.lib iconv.lib +win32-borland:LIBS += qtools.lib md5.lib doxygen.lib doxycfg.lib vhdlparser.lib shell32.lib iconv.lib win32-borland:TMAKE_LFLAGS += -L..\lib -L$(BCB)\lib\psdk win32:TMAKE_CXXFLAGS += -DQT_NODLL -win32-g++:LIBS = -L../lib -ldoxygen -ldoxycfg -lqtools -lmd5 -liconv -lpthread %%SQLITE3_LIBS%% %%LIBCLANG_LIBS%% -Wl,--as-needed -lole32 +win32-g++:LIBS = -L../lib -ldoxygen -ldoxycfg -lvhdlparser -lqtools -lmd5 -liconv -lpthread %%SQLITE3_LIBS%% %%LIBCLANG_LIBS%% -Wl,--as-needed -lole32 win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti DEPENDPATH += ../generated_src/doxygen -INCLUDEPATH += ../qtools ../libmd5 . +INCLUDEPATH += ../qtools ../libmd5 . ../vhdlparser DESTDIR = ../bin TARGET = doxygen unix:TARGETDEPS = ../lib/libdoxygen.a ../lib/libdoxycfg.a diff --git a/src/doxygen.sty b/src/doxygen.sty index 072104b..c423e12 100644 --- a/src/doxygen.sty +++ b/src/doxygen.sty @@ -434,6 +434,16 @@ }% {\end{xtabular*}\par}% +% Used by nested tables +\newenvironment{TabularNC}[1]% +{% +\setlength{\tmplength}% + {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)}% + \par\begin{tabular*}{\linewidth}% + {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|}% +}% +{\end{tabular*}\par}% + % Used for member group headers \newenvironment{Indent}{% \begin{list}{}{% diff --git a/src/entry.h b/src/entry.h index a861906..2cc2827 100644 --- a/src/entry.h +++ b/src/entry.h @@ -133,8 +133,13 @@ class Entry static const uint64 Enum = (1ULL<<12); // for Java-style enums static const uint64 Service = (1ULL<<13); // UNO IDL static const uint64 Singleton = (1ULL<<14); // UNO IDL + static const uint64 ForwardDecl = (1ULL<<14); // forward declarad template classes // member specifiers (add new items to the beginning) + static const uint64 PrivateGettable = (1ULL<<20); // C# private getter + static const uint64 ProtectedGettable = (1ULL<<21); // C# protected getter + static const uint64 PrivateSettable = (1ULL<<22); // C# private setter + static const uint64 ProtectedSettable = (1ULL<<23); // C# protected setter static const uint64 Inline = (1ULL<<24); static const uint64 Explicit = (1ULL<<25); static const uint64 Mutable = (1ULL<<26); diff --git a/src/filedef.cpp b/src/filedef.cpp index 5752e8c..9e8a61c 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -432,7 +432,15 @@ void FileDef::writeClassDeclarations(OutputList &ol,const QCString &title) void FileDef::writeInlineClasses(OutputList &ol) { + // temporarily undo the disbling could be done by startMemberDocumentation() + // as a result of setting SEPARATE_MEMBER_PAGES to YES; see bug730512 + bool isEnabled = ol.isEnabled(OutputGenerator::Html); + ol.enable(OutputGenerator::Html); + if (m_classSDict) m_classSDict->writeDocumentation(ol,this); + + // restore the initial state if needed + if (!isEnabled) ol.disable(OutputGenerator::Html); } void FileDef::startMemberDeclarations(OutputList &ol) diff --git a/src/fileparser.cpp b/src/fileparser.cpp new file mode 100644 index 0000000..1d78e1e --- /dev/null +++ b/src/fileparser.cpp @@ -0,0 +1,51 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2014 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +#include "fileparser.h" +#include "outputgen.h" + +void FileParser::parseCode(CodeOutputInterface &codeOutIntf, + const char *, // scopeName + const QCString & input, + SrcLangExt, // lang + bool, // isExampleBlock + const char *, // exampleName + FileDef *, // fileDef + int startLine, + int endLine, + bool, // inlineFragment + MemberDef *, // memberDef + bool showLineNumbers, + Definition *, // searchCtx, + bool // collectXRefs + ) +{ + int lineNr = startLine!=-1 ? startLine : 1; + int length = input.length(); + int i=0; + while (i<length && (endLine==-1 || lineNr<=endLine)) + { + int j=i; + while (j<length && input[j]!='\n') j++; + QCString lineStr = input.mid(i,j-i); + codeOutIntf.startCodeLine(showLineNumbers); + if (showLineNumbers) codeOutIntf.writeLineNumber(0,0,0,lineNr); + if (!lineStr.isEmpty()) codeOutIntf.codify(lineStr); + codeOutIntf.endCodeLine(); + lineNr++; + i=j+1; + } +} + diff --git a/src/fileparser.h b/src/fileparser.h new file mode 100644 index 0000000..f9a7c7b --- /dev/null +++ b/src/fileparser.h @@ -0,0 +1,50 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2014 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +#ifndef FILEPARSER_H +#define FILEPARSER_H + +#include "parserintf.h" + +/** @brief General file parser */ +class FileParser : public ParserInterface +{ + public: + virtual ~FileParser() {} + void startTranslationUnit(const char *) {} + void finishTranslationUnit() {} + void parseInput(const char *, const char *,Entry *, bool, QStrList &) {} + bool needsPreprocessing(const QCString &) { return FALSE; } + void parseCode(CodeOutputInterface &codeOutIntf, + const char *scopeName, + const QCString &input, + SrcLangExt lang, + bool isExampleBlock, + const char *exampleName=0, + FileDef *fileDef=0, + int startLine=-1, + int endLine=-1, + bool inlineFragment=FALSE, + MemberDef *memberDef=0, + bool showLineNumbers=TRUE, + Definition *searchCtx=0, + bool collectXRefs=TRUE + ); + void resetCodeParserState() {} + void parsePrototype(const char *) {} +}; + + +#endif diff --git a/src/fortrancode.l b/src/fortrancode.l index c31080b..03baeed 100644 --- a/src/fortrancode.l +++ b/src/fortrancode.l @@ -150,7 +150,9 @@ static bool g_includeCodeFragment; static char stringStartSymbol; // single or double quote // count in variable declaration to filter out // declared from referenced names -static int bracketCount = 0; +static int bracketCount = 0; + +static bool g_endComment; // simplified way to know if this is fixed form // duplicate in fortranscanner.l @@ -173,6 +175,9 @@ static bool recognizeFixedForm(const char* contents, FortranFormat format) break; case ' ': break; + case '#': + skipLine=TRUE; + break; case '\000': return FALSE; case 'C': @@ -252,6 +257,7 @@ static void startCodeLine() g_currentDefinition = d; g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr); g_insideBody = FALSE; + g_endComment = FALSE; g_parmType.resize(0); g_parmName.resize(0); QCString lineAnchor; @@ -685,16 +691,16 @@ NUM_TYPE (complex|integer|logical|real) LOG_OPER (\.and\.|\.eq\.|\.eqv\.|\.ge\.|\.gt\.|\.le\.|\.lt\.|\.ne\.|\.neqv\.|\.or\.|\.not\.) KIND {ARGS} CHAR (CHARACTER{ARGS}?|CHARACTER{BS}"*"({BS}[0-9]+|{ARGS})) -TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS}COMPLEX|DOUBLE{BS}PRECISION|{CHAR}) +TYPE_SPEC (({NUM_TYPE}({BS}"*"{BS}[0-9]+)?)|({NUM_TYPE}{KIND})|DOUBLE{BS}COMPLEX|DOUBLE{BS}PRECISION|{CHAR}|TYPE|CLASS|PROCEDURE) INTENT_SPEC intent{BS}"("{BS}(in|out|in{BS}out){BS}")" -ATTR_SPEC (IMPLICIT|ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|IMPURE|ELEMENTAL) +ATTR_SPEC (IMPLICIT|ALLOCATABLE|DIMENSION{ARGS}|EXTERNAL|{INTENT_SPEC}|INTRINSIC|OPTIONAL|PARAMETER|POINTER|PROTECTED|PRIVATE|PUBLIC|SAVE|TARGET|RECURSIVE|PURE|IMPURE|ELEMENTAL|VALUE|NOPASS|DEFERRED) ACCESS_SPEC (PROTECTED|PRIVATE|PUBLIC) /* Assume that attribute statements are almost the same as attributes. */ ATTR_STMT {ATTR_SPEC}|DIMENSION -FLOW (DO|SELECT|CASE|SELECTCASE|WHERE|IF|THEN|ELSE|WHILE|FORALL|ELSEWHERE|ELSEIF|RETURN|CONTINUE|EXIT) -COMMANDS (FORMAT|CONTAINS|MODULE{BS_}PROCEDURE|WRITE|READ|ALLOCATE|ALLOCATED|ASSOCIATED|DEALLOCATE|SIZE|INQUIRE|OPEN|CLOSE|DATA|COMMON) -IGNORE (CALL) +FLOW (DO|SELECT|CASE|SELECT{BS}(CASE|TYPE)|WHERE|IF|THEN|ELSE|WHILE|FORALL|ELSEWHERE|ELSEIF|RETURN|CONTINUE|EXIT) +COMMANDS (FORMAT|CONTAINS|MODULE{BS_}PROCEDURE|WRITE|READ|ALLOCATE|ALLOCATED|ASSOCIATED|PRESENT|DEALLOCATE|NULLIFY|SIZE|INQUIRE|OPEN|CLOSE|FLUSH|DATA|COMMON) +IGNORE (CALL) PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|IMPURE|PURE|ELEMENTAL)? /* | */ @@ -713,7 +719,7 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I %x DocBlock %x Use %x UseOnly -%x TypeDecl +%x Import %x Declaration %x DeclContLine %x Parameterlist @@ -730,13 +736,13 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I } /*-------- inner construct ---------------------------------------------------*/ -<Start>{COMMANDS}/[,( \t\n].* { // highlight +<Start>{COMMANDS}/{BS}[,( \t\n] { // highlight /* font class is defined e.g. in doxygen.css */ startFontClass("keyword"); codifyLines(yytext); endFontClass(); } -<Start>{FLOW}/[,( \t\n].* { +<Start>{FLOW}/{BS}[,( \t\n] { if (g_isFixedForm) { if ((yy_my_start == 1) && ((yytext[0] == 'c') || (yytext[0] == 'C'))) YY_FTN_REJECT; @@ -746,6 +752,11 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I codifyLines(yytext); endFontClass(); } +<Start>{BS}(CASE|CLASS|TYPE){BS_}(IS|DEFAULT) { + startFontClass("keywordflow"); + codifyLines(yytext); + endFontClass(); + } <Start>"end"({BS}{FLOW})?/[ \t\n] { // list is a bit long as not all have possible end startFontClass("keywordflow"); codifyLines(yytext); @@ -757,6 +768,11 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I codifyLines(yytext); endFontClass(); } +<Start>^{BS}"namelist"/[//] { // Namelist specification + startFontClass("keywordtype"); + codifyLines(yytext); + endFontClass(); + } /*-------- use statement -------------------------------------------*/ <Start>"use"{BS_} { startFontClass("keywordtype"); @@ -788,21 +804,32 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I yy_push_state(YY_START); BEGIN(UseOnly); } -<UseOnly>{BS},{BS} { codifyLines(yytext); } -<UseOnly>{BS}&{BS}"\n" { codifyLines(yytext); YY_FTN_RESET} +<UseOnly,Import>{BS},{BS} { codifyLines(yytext); } +<UseOnly,Import>{BS}&{BS}"\n" { codifyLines(yytext); YY_FTN_RESET} <UseOnly>{ID} { g_insideBody=TRUE; generateLink(*g_code, yytext); g_insideBody=FALSE; useEntry->onlyNames.append(yytext); } -<Use,UseOnly>"\n" { +<Use,UseOnly,Import>"\n" { unput(*yytext); yy_pop_state();YY_FTN_RESET } - +<Start>"import"{BS_} { + startFontClass("keywordtype"); + codifyLines(yytext); + endFontClass(); + yy_push_state(YY_START); + BEGIN(Import); + } +<Import>{ID} { + g_insideBody=TRUE; + generateLink(*g_code, yytext); + g_insideBody=FALSE; + } /*-------- fortran module -----------------------------------------*/ -<Start>("block"{BS}"data"|"program"|"module"|"type"|"interface")/{BS_}|({COMMA}{ACCESS_SPEC})|\n { // +<Start>("block"{BS}"data"|"program"|"module"|"interface")/{BS_}|({COMMA}{ACCESS_SPEC})|\n { // startScope(); startFontClass("keyword"); codifyLines(yytext); @@ -811,6 +838,14 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I BEGIN(ClassName); if (!qstricmp(yytext,"module")) currentModule="module"; } +<Start>("type")/{BS_}|({COMMA}({ACCESS_SPEC}|ABSTRACT|EXTENDS))|\n { // + startScope(); + startFontClass("keyword"); + codifyLines(yytext); + endFontClass(); + yy_push_state(YY_START); + BEGIN(ClassName); + } <ClassName>{ID} { if (currentModule == "module") { @@ -820,6 +855,11 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I generateLink(*g_code,yytext); yy_pop_state(); } +<ClassName>({ACCESS_SPEC}|ABSTRACT|EXTENDS)/[,:( ] { //| variable deklaration + startFontClass("keyword"); + g_code->codify(yytext); + endFontClass(); + } <ClassName>\n { // interface may be without name yy_pop_state(); YY_FTN_REJECT; @@ -874,24 +914,6 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I endFontClass(); } /*-------- variable declaration ----------------------------------*/ -<Start>"type"{BS}"(" { - yy_push_state(YY_START); - BEGIN(TypeDecl); - startFontClass("keywordtype"); - g_code->codify(yytext); - endFontClass(); - } -<TypeDecl>{ID} { // link type - g_insideBody=TRUE; - generateLink(*g_code,yytext); - g_insideBody=FALSE; - } -<TypeDecl>")" { - BEGIN(Declaration); - startFontClass("keywordtype"); - g_code->codify(yytext); - endFontClass(); - } <Start>{TYPE_SPEC}/[,:( ] { yy_push_state(YY_START); BEGIN(Declaration); @@ -910,7 +932,7 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I endFontClass(); } <Declaration>{ID} { // local var - if (g_currentMemberDef && !g_currentMemberDef->isFunction()) + if (g_currentMemberDef && g_currentMemberDef->isFunction() && bracketCount==0) { g_code->codify(yytext); addLocalVar(yytext); @@ -942,7 +964,14 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I YY_FTN_RESET } <Declaration>"\n" { // end declaration line - codifyLines(yytext); + if (g_endComment) + { + g_endComment=FALSE; + } + else + { + codifyLines(yytext); + } bracketCount = 0; yy_pop_state(); YY_FTN_RESET @@ -999,16 +1028,17 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I docBlock+=yytext; } <DocBlock>"\n" { // comment block ends at the end of this line - docBlock+=yytext; // remove special comment (default config) if (Config_getBool("STRIP_CODE_COMMENTS")) { g_yyLineNr+=((QCString)docBlock).contains('\n'); + g_yyLineNr+=1; endCodeLine(); - if (g_yyLineNr<g_inputLines) + if (g_yyLineNr<g_inputLines) { startCodeLine(); } + g_endComment=TRUE; } else // do not remove comment { @@ -1016,6 +1046,7 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I codifyLines(docBlock); endFontClass(); } + unput(*yytext); yy_pop_state(); YY_FTN_RESET } @@ -1087,9 +1118,18 @@ PREFIX (RECURSIVE{BS_}|IMPURE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,3}(RECURSIVE|I /*-----------------------------------------------------------------------------*/ <*>\n { - codifyLines(yytext); + if (g_endComment) + { + g_endComment=FALSE; + } + else + { + codifyLines(yytext); + } YY_FTN_RESET } +<*>^{BS}"type"{BS}"=" { g_code->codify(yytext); } + <*>. { g_code->codify(yytext); } diff --git a/src/fortranscanner.l b/src/fortranscanner.l index f6616ad..64a49ca 100644 --- a/src/fortranscanner.l +++ b/src/fortranscanner.l @@ -739,6 +739,7 @@ private { {ID} { } ^{BS}"type"{BS_}"is"/{BS_} { } +^{BS}"type"{BS}"=" { } } <AttributeList>{ {COMMA} {} @@ -1333,6 +1334,9 @@ static bool recognizeFixedForm(const char* contents, FortranFormat format) break; case '\000': return FALSE; + case '#': + skipLine=TRUE; + break; case 'C': case 'c': case '*': @@ -2183,7 +2187,7 @@ static void subrHandleCommentBlock(const QCString &doc,bool brief) } else { - warn(yyFileName,yyLineNr, "inconsistency between intent attribute and documenation for variable: "+argName); + warn(yyFileName,yyLineNr, "inconsistency between intent attribute and documentation for variable: "+argName); handleCommentBlock(QCString("\n\n@param ") + directionParam[dir1] + " " + argName + " " + doc,brief); } @@ -2198,7 +2202,7 @@ static void subrHandleCommentBlock(const QCString &doc,bool brief) } else { - warn(yyFileName,yyLineNr, "inconsistency between intent attribute and documenation for variable: "+argName); + warn(yyFileName,yyLineNr, "inconsistency between intent attribute and documentation for variable: "+argName); handleCommentBlock(QCString("\n\n@param ") + directionParam[dir1] + " " + argName + " " + doc,brief); } @@ -2213,7 +2217,7 @@ static void subrHandleCommentBlock(const QCString &doc,bool brief) } else { - warn(yyFileName,yyLineNr, "inconsistency between intent attribute and documenation for variable: "+argName); + warn(yyFileName,yyLineNr, "inconsistency between intent attribute and documentation for variable: "+argName); handleCommentBlock(QCString("\n\n@param ") + directionParam[dir1] + " " + argName + " " + doc,brief); } diff --git a/src/groupdef.cpp b/src/groupdef.cpp index 85bfb8f..f1d1877 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -71,6 +71,7 @@ GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t, visited = 0; groupScope = 0; + m_subGrouping=Config_getBool("SUBGROUPING"); } GroupDef::~GroupDef() @@ -1512,3 +1513,9 @@ void GroupDef::updateLanguage(const Definition *d) } } +bool GroupDef::hasDetailedDescription() const +{ + static bool repeatBrief = Config_getBool("REPEAT_BRIEF"); + return ((!briefDescription().isEmpty() && repeatBrief) || + !documentation().isEmpty()); +} diff --git a/src/groupdef.h b/src/groupdef.h index 481bece..bc956da 100644 --- a/src/groupdef.h +++ b/src/groupdef.h @@ -79,6 +79,7 @@ class GroupDef : public Definition void addListReferences(); void sortMemberLists(); + bool subGrouping() const { return m_subGrouping; } bool visited; // number of times accessed for output - KPW @@ -101,6 +102,7 @@ class GroupDef : public Definition PageSDict * getPages() const { return pageDict; } DirList * getDirs() const { return dirList; } PageSDict * getExamples() const { return exampleDict; } + bool hasDetailedDescription() const; //MemberList* getMembers() const { return allMemberList; } void sortSubGroups(); @@ -150,6 +152,7 @@ class GroupDef : public Definition QList<MemberList> m_memberLists; MemberGroupSDict *memberGroupSDict; + bool m_subGrouping; }; diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index c70f2c5..e319a1f 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -34,6 +34,7 @@ #include "filedef.h" #include "memberdef.h" #include "htmlentity.h" +#include "plantuml.h" static const int NUM_HTML_LIST_TYPES = 4; static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"}; @@ -429,9 +430,21 @@ void HtmlDocVisitor::visit(DocVerbatim *s) m_t << "<div align=\"center\">" << endl; writeMscFile(baseName+".msc",s->relPath(),s->context()); if (Config_getBool("DOT_CLEANUP")) file.remove(); + m_t << "</div>" << endl; + forceStartParagraph(s); + } + break; + case DocVerbatim::PlantUML: + { + forceEndParagraph(s); + + static QCString htmlOutput = Config_getString("HTML_OUTPUT"); + QCString baseName = writePlantUMLSource(htmlOutput,s->exampleFile(),s->text()); + m_t << "<div align=\"center\">" << endl; + writePlantUMLFile(baseName,s->relPath(),s->context()); + m_t << "</div>" << endl; + forceStartParagraph(s); } - m_t << "</div>" << endl; - forceStartParagraph(s); break; } } @@ -1779,13 +1792,13 @@ void HtmlDocVisitor::visitPre(DocVhdlFlow *vf) if (VhdlDocGen::getFlowMember()) // use VHDL flow chart creator { forceEndParagraph(vf); - QCString fname=FlowChart::convertNameToFileName(); + QCString fname=FlowChart::convertNameToFileName(); m_t << "<p>"; m_t << "flowchart: " ; // TODO: translate me m_t << "<a href=\""; m_t << fname.data(); m_t << ".svg\">"; - m_t << VhdlDocGen::getFlowMember()->name().data(); + m_t << VhdlDocGen::getFlowMember()->name().data(); m_t << "</a>"; if (vf->hasCaption()) { @@ -1927,7 +1940,7 @@ void HtmlDocVisitor::writeDotFile(const QCString &fn,const QCString &relPath, } baseName.prepend("dot_"); QCString outDir = Config_getString("HTML_OUTPUT"); - writeDotGraphFromFile(fn,outDir,baseName,BITMAP); + writeDotGraphFromFile(fn,outDir,baseName,GOF_BITMAP); writeDotImageMapFromFile(m_t,fn,outDir,relPath,baseName,context); } @@ -1976,6 +1989,37 @@ void HtmlDocVisitor::writeDiaFile(const QCString &fileName, m_t << "<img src=\"" << relPath << baseName << ".png" << "\" />" << endl; } +void HtmlDocVisitor::writePlantUMLFile(const QCString &fileName, + const QCString &relPath, + const QCString &) +{ + QCString baseName=fileName; + int i; + if ((i=baseName.findRev('/'))!=-1) // strip path + { + baseName=baseName.right(baseName.length()-i-1); + } + if ((i=baseName.findRev('.'))!=-1) // strip extension + { + baseName=baseName.left(i); + } + static QCString outDir = Config_getString("HTML_OUTPUT"); + static QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT"); + if (imgExt=="svg") + { + generatePlantUMLOutput(fileName,outDir,PUML_SVG); + //m_t << "<iframe scrolling=\"no\" frameborder=\"0\" src=\"" << relPath << baseName << ".svg" << "\" />" << endl; + //m_t << "<p><b>This browser is not able to show SVG: try Firefox, Chrome, Safari, or Opera instead.</b></p>"; + //m_t << "</iframe>" << endl; + m_t << "<object type=\"image/svg+xml\" data=\"" << relPath << baseName << ".svg\"></object>" << endl; + } + else + { + generatePlantUMLOutput(fileName,outDir,PUML_BITMAP); + m_t << "<img src=\"" << relPath << baseName << ".png" << "\" />" << endl; + } +} + /** Used for items found inside a paragraph, which due to XHTML restrictions * have to be outside of the paragraph. This method will forcefully end * the current paragraph and forceStartParagraph() will restart it. diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h index ddefecd..00ae09e 100644 --- a/src/htmldocvisitor.h +++ b/src/htmldocvisitor.h @@ -153,6 +153,7 @@ class HtmlDocVisitor : public DocVisitor void writeDotFile(const QCString &fileName,const QCString &relPath,const QCString &context); void writeMscFile(const QCString &fileName,const QCString &relPath,const QCString &context); void writeDiaFile(const QCString &fileName,const QCString &relPath,const QCString &context); + void writePlantUMLFile(const QCString &fileName,const QCString &relPath,const QCString &context); void pushEnabled(); void popEnabled(); diff --git a/src/htmlentity.cpp b/src/htmlentity.cpp index c49491e..216b65c 100644 --- a/src/htmlentity.cpp +++ b/src/htmlentity.cpp @@ -462,7 +462,7 @@ const DocSymbol::PerlSymb *HtmlEntityMapper::perl(DocSymbol::SymType symb) const /*! * @brief Give code of the requested HTML entity name - * @param symName HTML entity name without \c & and \c; + * @param symName HTML entity name without \c & and \c ; * @return the code for the requested HTML entity name, * in case the requested HTML item does not exist `DocSymbol::Sym_unknown` is returned. */ diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 0d399d3..62ae1c7 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -1061,7 +1061,7 @@ static QCString substituteHtmlKeywords(const QCString &s, { // Build CSS/Javascript tags depending on treeview, search engine settings QCString cssFile; - QCString extraCssFile; + QStrList extraCssFile; QCString generatedBy; QCString treeViewCssJs; QCString searchCssJs; @@ -1100,10 +1100,20 @@ static QCString substituteHtmlKeywords(const QCString &s, cssFile = "doxygen.css"; } } - extraCssFile = Config_getString("HTML_EXTRA_STYLESHEET"); - if (!extraCssFile.isEmpty()) + + extraCssText = ""; + extraCssFile = Config_getList("HTML_EXTRA_STYLESHEET"); + for (uint i=0; i<extraCssFile.count(); ++i) { - extraCssText = "<link href=\"$relpath^"+stripPath(extraCssFile)+"\" rel=\"stylesheet\" type=\"text/css\"/>\n"; + QCString fileName(extraCssFile.at(i)); + if (!fileName.isEmpty()) + { + QFileInfo fi(fileName); + if (fi.exists()) + { + extraCssText += "<link href=\"$relpath^"+stripPath(fileName)+"\" rel=\"stylesheet\" type=\"text/css\"/>\n"; + } + } } if (timeStamp) @@ -1823,13 +1833,17 @@ void HtmlGenerator::writeStyleInfo(int part) } Doxygen::indexList->addStyleSheetFile(cssfi.fileName().utf8()); } - static QCString extraCssFile = Config_getString("HTML_EXTRA_STYLESHEET"); - if (!extraCssFile.isEmpty()) + static QStrList extraCssFile = Config_getList("HTML_EXTRA_STYLESHEET"); + for (uint i=0; i<extraCssFile.count(); ++i) { - QFileInfo fi(extraCssFile); - if (fi.exists()) + QCString fileName(extraCssFile.at(i)); + if (!fileName.isEmpty()) { - Doxygen::indexList->addStyleSheetFile(fi.fileName().utf8()); + QFileInfo fi(fileName); + if (fi.exists()) + { + Doxygen::indexList->addStyleSheetFile(fi.fileName().utf8()); + } } } } @@ -2516,7 +2530,7 @@ void HtmlGenerator::endDotGraph(const DotClassGraph &g) endSectionSummary(t); startSectionContent(t,m_sectionCount); - g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,TRUE,m_sectionCount); + g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,TRUE,m_sectionCount); if (generateLegend && !umlLook) { t << "<center><span class=\"legend\">["; @@ -2542,7 +2556,7 @@ void HtmlGenerator::endInclDepGraph(const DotInclDepGraph &g) endSectionSummary(t); startSectionContent(t,m_sectionCount); - g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,m_sectionCount); + g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,m_sectionCount); endSectionContent(t); m_sectionCount++; @@ -2560,7 +2574,7 @@ void HtmlGenerator::endGroupCollaboration(const DotGroupCollaboration &g) endSectionSummary(t); startSectionContent(t,m_sectionCount); - g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,m_sectionCount); + g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,m_sectionCount); endSectionContent(t); m_sectionCount++; @@ -2578,7 +2592,7 @@ void HtmlGenerator::endCallGraph(const DotCallGraph &g) endSectionSummary(t); startSectionContent(t,m_sectionCount); - g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,m_sectionCount); + g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,m_sectionCount); endSectionContent(t); m_sectionCount++; @@ -2596,7 +2610,7 @@ void HtmlGenerator::endDirDepGraph(const DotDirDeps &g) endSectionSummary(t); startSectionContent(t,m_sectionCount); - g.writeGraph(t,BITMAP,dir,fileName,relPath,TRUE,m_sectionCount); + g.writeGraph(t,GOF_BITMAP,EOF_Html,dir,fileName,relPath,TRUE,m_sectionCount); endSectionContent(t); m_sectionCount++; diff --git a/src/index.cpp b/src/index.cpp index 2013a7c..430f5af 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -2053,10 +2053,6 @@ static void writeAnnotatedIndex(OutputList &ol) QCString title = lne ? lne->title() : theTranslator->trCompoundList(); bool addToIndex = lne==0 || lne->visible(); - if (Config_getBool("OPTIMIZE_OUTPUT_VHDL")) - { - VhdlDocGen::findConstraintFile(lne); - } startFile(ol,"annotated",0,title,HLI_Annotated); @@ -2283,7 +2279,9 @@ void addClassMemberNameToIndex(MemberDef *md) (QCString(md->typeString())=="friend class" || QCString(md->typeString())=="friend struct" || QCString(md->typeString())=="friend union"); - if (!(md->isFriend() && isFriendToHide)) + if (!(md->isFriend() && isFriendToHide) && + (!md->isEnumValue() || (md->getEnumScope() && !md->getEnumScope()->isStrong())) + ) { g_memberIndexLetterUsed[CMHL_All].append(letter,md); documentedClassMembers[CMHL_All]++; @@ -2292,7 +2290,7 @@ void addClassMemberNameToIndex(MemberDef *md) { g_memberIndexLetterUsed[CMHL_Functions].append(letter,md); documentedClassMembers[CMHL_Functions]++; - } + } else if (md->isVariable()) { g_memberIndexLetterUsed[CMHL_Variables].append(letter,md); @@ -2308,7 +2306,7 @@ void addClassMemberNameToIndex(MemberDef *md) g_memberIndexLetterUsed[CMHL_Enums].append(letter,md); documentedClassMembers[CMHL_Enums]++; } - else if (md->isEnumValue()) + else if (md->isEnumValue() && md->getEnumScope() && !md->getEnumScope()->isStrong()) { g_memberIndexLetterUsed[CMHL_EnumValues].append(letter,md); documentedClassMembers[CMHL_EnumValues]++; @@ -2353,10 +2351,13 @@ void addNamespaceMemberNameToIndex(MemberDef *md) QCString n = md->name(); int index = getPrefixIndex(n); uint letter = getUtf8CodeToLower(n,index); - if (!n.isEmpty()) + if (!n.isEmpty()) { - g_namespaceIndexLetterUsed[NMHL_All].append(letter,md); - documentedNamespaceMembers[NMHL_All]++; + if (!md->isEnumValue() || (md->getEnumScope() && !md->getEnumScope()->isStrong())) + { + g_namespaceIndexLetterUsed[NMHL_All].append(letter,md); + documentedNamespaceMembers[NMHL_All]++; + } if (md->isFunction()) { @@ -2378,7 +2379,7 @@ void addNamespaceMemberNameToIndex(MemberDef *md) g_namespaceIndexLetterUsed[NMHL_Enums].append(letter,md); documentedNamespaceMembers[NMHL_Enums]++; } - else if (md->isEnumValue()) + else if (md->isEnumValue() && md->getEnumScope() && !md->getEnumScope()->isStrong()) { g_namespaceIndexLetterUsed[NMHL_EnumValues].append(letter,md); documentedNamespaceMembers[NMHL_EnumValues]++; @@ -2409,8 +2410,11 @@ void addFileMemberNameToIndex(MemberDef *md) uint letter = getUtf8CodeToLower(n,index); if (!n.isEmpty()) { - g_fileIndexLetterUsed[FMHL_All].append(letter,md); - documentedFileMembers[FMHL_All]++; + if (!md->isEnumValue() || (md->getEnumScope() && !md->getEnumScope()->isStrong())) + { + g_fileIndexLetterUsed[FMHL_All].append(letter,md); + documentedFileMembers[FMHL_All]++; + } if (md->isFunction()) { @@ -2432,7 +2436,7 @@ void addFileMemberNameToIndex(MemberDef *md) g_fileIndexLetterUsed[FMHL_Enums].append(letter,md); documentedFileMembers[FMHL_Enums]++; } - else if (md->isEnumValue()) + else if (md->isEnumValue() && md->getEnumScope() && !md->getEnumScope()->isStrong()) { g_fileIndexLetterUsed[FMHL_EnumValues].append(letter,md); documentedFileMembers[FMHL_EnumValues]++; @@ -3075,16 +3079,6 @@ static void countRelatedPages(int &docPages,int &indexPages) //---------------------------------------------------------------------------- -static bool mainPageHasTitle() -{ - if (Doxygen::mainPage==0) return FALSE; - if (Doxygen::mainPage->title().isEmpty()) return FALSE; - if (Doxygen::mainPage->title().lower()=="notitle") return FALSE; - return TRUE; -} - -//---------------------------------------------------------------------------- - static void writePages(PageDef *pd,FTVHelp *ftv) { //printf("writePages()=%s pd=%p mainpage=%p\n",pd->name().data(),pd,Doxygen::mainPage); diff --git a/src/lang_cfg.py b/src/lang_cfg.py index 9ba1319..efed05f 100644 --- a/src/lang_cfg.py +++ b/src/lang_cfg.py @@ -1,8 +1,8 @@ import sys -if (len(sys.argv) > 0): +if (len(sys.argv) > 1): if (sys.argv[1] == "ENONLY"): - print "#define ENGLISH_ONLY" + print("#define ENGLISH_ONLY") else: - for x in xrange(1, len(sys.argv)): - print "#define LANG_%s"%(sys.argv[x]) + for x in range(1, len(sys.argv)): + print("#define LANG_%s"%(sys.argv[x])) diff --git a/src/languages.py b/src/languages.py index 7ce382a..2b02b3e 100755 --- a/src/languages.py +++ b/src/languages.py @@ -15,7 +15,7 @@ for f in files: # generating file is lang_cfg.py # the rules file has to output lang_cfg.h # -print """\ +print("""\ <?xml version="1.0" encoding="utf-8"?> <VisualStudioToolFile Name="languages" @@ -52,7 +52,7 @@ print """\ /> </Values> </EnumProperty> -""" +""") # # generate loop, English is mandatory (so cannot be chosen) # @@ -76,7 +76,7 @@ for f in new_list: l1 = l.replace("-","") # capatalize first letter l = l.title() - print """\ + print("""\ <EnumProperty Name="%s" DisplayName="Use %s" @@ -96,11 +96,11 @@ for f in new_list: /> </Values> </EnumProperty> - """ % (l1, l, l, l, f[1], l) + """ % (l1, l, l, l, f[1], l)) -print """\ +print("""\ </Properties> </CustomBuildRule> </Rules> </VisualStudioToolFile> -""" +""") diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index eed36bc..af1a5fd 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -32,6 +32,7 @@ #include "filedef.h" #include "config.h" #include "htmlentity.h" +#include "plantuml.h" static QCString escapeLabelName(const char *s) { @@ -321,6 +322,16 @@ void LatexDocVisitor::visit(DocVerbatim *s) if (Config_getBool("DOT_CLEANUP")) file.remove(); } break; + case DocVerbatim::PlantUML: + { + QCString latexOutput = Config_getString("LATEX_OUTPUT"); + QCString baseName = writePlantUMLSource(latexOutput,s->exampleFile(),s->text()); + + m_t << "\\begin{center}\n"; + writePlantUMLFile(baseName); + m_t << "\\end{center}\n"; + } + break; } } @@ -809,21 +820,32 @@ void LatexDocVisitor::visitPost(DocHtmlDescData *) { } +static const char *getTableName(const DocNode *n) +{ + bool isNested=FALSE; + while (n && !isNested) + { + isNested = n->kind()==DocNode::Kind_HtmlTable; + n = n->parent(); + } + return isNested ? "TabularNC" : "TabularC"; +} + void LatexDocVisitor::visitPre(DocHtmlTable *t) { m_rowSpans.clear(); m_insideTable=TRUE; if (m_hide) return; - if (t->hasCaption()) + if (t->hasCaption()) { m_t << "\\begin{table}[h]"; } - m_t << "\\begin{TabularC}{" << t->numColumns() << "}\n"; + m_t << "\\begin{" << getTableName(t->parent()) << "}{" << t->numColumns() << "}\n"; m_numCols = t->numColumns(); m_t << "\\hline\n"; } -void LatexDocVisitor::visitPost(DocHtmlTable *t) +void LatexDocVisitor::visitPost(DocHtmlTable *t) { m_insideTable=FALSE; if (m_hide) return; @@ -833,14 +855,14 @@ void LatexDocVisitor::visitPost(DocHtmlTable *t) } else { - m_t << "\\end{TabularC}\n"; + m_t << "\\end{" << getTableName(t->parent()) << "}\n"; } } -void LatexDocVisitor::visitPre(DocHtmlCaption *) +void LatexDocVisitor::visitPre(DocHtmlCaption *c) { if (m_hide) return; - m_t << "\\end{TabularC}\n\\centering\n\\caption{"; + m_t << "\\end{" << getTableName(c->parent()) << "}\n\\centering\n\\caption{"; } void LatexDocVisitor::visitPost(DocHtmlCaption *) @@ -1587,7 +1609,7 @@ void LatexDocVisitor::startDotFile(const QCString &fileName, baseName.prepend("dot_"); QCString outDir = Config_getString("LATEX_OUTPUT"); QCString name = fileName; - writeDotGraphFromFile(name,outDir,baseName,EPS); + writeDotGraphFromFile(name,outDir,baseName,GOF_EPS); if (hasCaption) { m_t << "\n\\begin{DoxyImage}\n"; @@ -1732,6 +1754,7 @@ void LatexDocVisitor::writeMscFile(const QCString &baseName) m_t << "\\end{DoxyImageNoCaption}\n"; } + void LatexDocVisitor::startDiaFile(const QCString &fileName, const QCString &width, const QCString &height, @@ -1823,3 +1846,20 @@ void LatexDocVisitor::writeDiaFile(const QCString &baseName) m_t << "\\end{DoxyImageNoCaption}\n"; } +void LatexDocVisitor::writePlantUMLFile(const QCString &baseName) +{ + QCString shortName = baseName; + int i; + if ((i=shortName.findRev('/'))!=-1) + { + shortName=shortName.right(shortName.length()-i-1); + } + QCString outDir = Config_getString("LATEX_OUTPUT"); + generatePlantUMLOutput(baseName,outDir,PUML_EPS); + m_t << "\n\\begin{DoxyImageNoCaption}" + " \\mbox{\\includegraphics"; + m_t << "{" << shortName << "}"; + m_t << "}\n"; // end mbox + m_t << "\\end{DoxyImageNoCaption}\n"; +} + diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h index d386569..64560b9 100644 --- a/src/latexdocvisitor.h +++ b/src/latexdocvisitor.h @@ -176,6 +176,7 @@ class LatexDocVisitor : public DocVisitor const QCString &height, bool hasCaption); void endDiaFile(bool hasCaption); void writeDiaFile(const QCString &fileName); + void writePlantUMLFile(const QCString &fileName); void pushEnabled(); void popEnabled(); diff --git a/src/latexgen.cpp b/src/latexgen.cpp index 90591c5..086e012 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -186,6 +186,8 @@ static void writeMakeBat() exit(1); } FTextStream t(&file); + t << "set Dir_Old=%cd%\n"; + t << "cd /D %~dp0\n\n"; t << "del /s /f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl refman.pdf\n\n"; if (!Config_getBool("USE_PDFLATEX")) // use plain old latex { @@ -246,6 +248,8 @@ static void writeMakeBat() t << "endlocal\n"; t << mkidx_command << " refman.idx\n"; t << "pdflatex refman\n"; + t << "cd /D %Dir_Old%\n"; + t << "set Dir_Old=\n"; } #endif } @@ -286,6 +290,7 @@ static void writeDefaultHeaderPart1(FTextStream &t) // Load required packages t << "% Packages required by doxygen\n" + "\\usepackage{fixltx2e}\n" // for \textsubscript "\\usepackage{calc}\n" "\\usepackage{doxygen}\n" "\\usepackage{graphicx}\n" @@ -293,7 +298,6 @@ static void writeDefaultHeaderPart1(FTextStream &t) "\\usepackage{makeidx}\n" "\\usepackage{multicol}\n" "\\usepackage{multirow}\n" - "\\usepackage{fixltx2e}\n" // for \textsubscript "\\PassOptionsToPackage{warn}{textcomp}\n" "\\usepackage{textcomp}\n" "\\usepackage[nointegrals]{wasysym}\n" @@ -623,7 +627,7 @@ void LatexGenerator::startIndexSection(IndexSections is) else { QCString header = fileToString(latexHeader); - t << substituteKeywords(header,0, + t << substituteKeywords(header,"", convertToLaTeX(Config_getString("PROJECT_NAME")), convertToLaTeX(Config_getString("PROJECT_NUMBER")), convertToLaTeX(Config_getString("PROJECT_BRIEF"))); @@ -1021,7 +1025,7 @@ void LatexGenerator::endIndexSection(IndexSections is) else { QCString footer = fileToString(latexFooter); - t << substituteKeywords(footer,0, + t << substituteKeywords(footer,"", convertToLaTeX(Config_getString("PROJECT_NAME")), convertToLaTeX(Config_getString("PROJECT_NUMBER")), convertToLaTeX(Config_getString("PROJECT_BRIEF"))); @@ -1810,7 +1814,7 @@ void LatexGenerator::startDotGraph() void LatexGenerator::endDotGraph(const DotClassGraph &g) { - g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath); + g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString("LATEX_OUTPUT"),fileName,relPath); } void LatexGenerator::startInclDepGraph() @@ -1819,7 +1823,7 @@ void LatexGenerator::startInclDepGraph() void LatexGenerator::endInclDepGraph(const DotInclDepGraph &g) { - g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath); + g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString("LATEX_OUTPUT"),fileName,relPath); } void LatexGenerator::startGroupCollaboration() @@ -1828,7 +1832,7 @@ void LatexGenerator::startGroupCollaboration() void LatexGenerator::endGroupCollaboration(const DotGroupCollaboration &g) { - g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath); + g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString("LATEX_OUTPUT"),fileName,relPath); } void LatexGenerator::startCallGraph() @@ -1837,7 +1841,7 @@ void LatexGenerator::startCallGraph() void LatexGenerator::endCallGraph(const DotCallGraph &g) { - g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath); + g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString("LATEX_OUTPUT"),fileName,relPath); } void LatexGenerator::startDirDepGraph() @@ -1846,7 +1850,7 @@ void LatexGenerator::startDirDepGraph() void LatexGenerator::endDirDepGraph(const DotDirDeps &g) { - g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),fileName,relPath); + g.writeGraph(t,GOF_EPS,EOF_LaTeX,Config_getString("LATEX_OUTPUT"),fileName,relPath); } void LatexGenerator::startDescription() diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in index 457db58..703b885 100644 --- a/src/libdoxygen.pro.in +++ b/src/libdoxygen.pro.in @@ -50,6 +50,7 @@ HEADERS = arguments.h \ example.h \ filedef.h \ filename.h \ + fileparser.h \ formula.h \ ftextstream.h \ ftvhelp.h \ @@ -86,6 +87,7 @@ HEADERS = arguments.h \ pagedef.h \ perlmodgen.h \ lodepng.h \ + plantuml.h \ pre.h \ printdocvisitor.h \ pycode.h \ @@ -115,11 +117,12 @@ HEADERS = arguments.h \ version.h \ vhdlcode.h \ vhdldocgen.h \ - vhdlscanner.h \ xmldocvisitor.h \ xmlgen.h \ docbookvisitor.h \ docbookgen.h \ + vhdljjparser.h + SOURCES = arguments.cpp \ cite.cpp \ @@ -145,6 +148,7 @@ SOURCES = arguments.cpp \ entry.cpp \ filedef.cpp \ filename.cpp \ + fileparser.cpp \ formula.cpp \ ftextstream.cpp \ ftvhelp.cpp \ @@ -162,6 +166,7 @@ SOURCES = arguments.cpp \ layout.cpp \ lodepng.cpp \ logos.cpp \ + plantuml.cpp \ mandocvisitor.cpp \ mangen.cpp \ sqlite3gen.cpp \ @@ -198,11 +203,10 @@ SOURCES = arguments.cpp \ xmlgen.cpp \ docbookvisitor.cpp \ docbookgen.cpp \ - ../generated_src/doxygen/ce_parse.cpp \ + vhdljjparser.cpp \ + ../generated_src/doxygen/ce_parse.cpp \ ../generated_src/doxygen/constexp.cpp \ ../generated_src/doxygen/vhdlcode.cpp \ - ../generated_src/doxygen/vhdlparser.cpp \ - ../generated_src/doxygen/vhdlscanner.cpp \ ../generated_src/doxygen/code.cpp \ ../generated_src/doxygen/commentcnv.cpp \ ../generated_src/doxygen/commentscan.cpp \ @@ -216,13 +220,15 @@ SOURCES = arguments.cpp \ ../generated_src/doxygen/tclscanner.cpp \ ../generated_src/doxygen/fortrancode.cpp \ ../generated_src/doxygen/fortranscanner.cpp \ - ../generated_src/doxygen/version.cpp + ../generated_src/doxygen/version.cpp + + win32:TMAKE_CXXFLAGS += -DQT_NODLL win32-msvc:TMAKE_CXXFLAGS += -Zm200 win32-g++:TMAKE_CXXFLAGS += -fno-exceptions linux-g++:TMAKE_CXXFLAGS += -fno-exceptions -INCLUDEPATH += ../generated_src/doxygen ../src ../qtools ../libmd5 +INCLUDEPATH += ../generated_src/doxygen ../src ../qtools ../libmd5 ../vhdlparser INCLUDEPATH += %%SQLITE3_INC%% DEPENDPATH += ../generated_src/doxygen win32:INCLUDEPATH += . diff --git a/src/libdoxygen.t.in b/src/libdoxygen.t.in index 173f90b..314e94c 100644 --- a/src/libdoxygen.t.in +++ b/src/libdoxygen.t.in @@ -111,16 +111,8 @@ sub GenerateLex { $(YACC) -l -d -p ce_parsexpYY constexp.y -o \$(GENERATED_SRC)/ce_parse.c -rm $(GENERATED_SRC)/ce_parse.c -#$ GenerateDep("\$(GENERATED_SRC)/vhdlscanner.cpp","vhdlscanner.l","\$(GENERATED_SRC)/vhdlparser.h"); -#$ GenerateLex("vhdlscanner",1); -#$ GenerateDep("\$(GENERATED_SRC)/vhdlparser.cpp","vhdlparser.y"); - $(YACC) -l -p vhdlscannerYY vhdlparser.y -o \$(GENERATED_SRC)/vhdlparser.cpp -#$ GenerateDep("\$(GENERATED_SRC)/vhdlparser.h","vhdlparser.y"); - $(YACC) -l -d -p vhdlscannerYY vhdlparser.y -o \$(GENERATED_SRC)/vhdlparser.c - -rm $(GENERATED_SRC)/vhdlparser.c - TO_C_CMD=$(PYTHON) to_c_cmd.py < $< > $@ #$ GenerateDep("layout.cpp","\$(GENERATED_SRC)/layout_default.xml.h"); diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp index 5403324..1fe5409 100644 --- a/src/mandocvisitor.cpp +++ b/src/mandocvisitor.cpp @@ -208,6 +208,7 @@ void ManDocVisitor::visit(DocVerbatim *s) case DocVerbatim::DocbookOnly: case DocVerbatim::Dot: case DocVerbatim::Msc: + case DocVerbatim::PlantUML: /* nothing */ break; } diff --git a/src/mangen.cpp b/src/mangen.cpp index cf6795b..352ef15 100644 --- a/src/mangen.cpp +++ b/src/mangen.cpp @@ -56,7 +56,7 @@ static QCString getExtension() ext = ext.mid(1); } } - if (ext.at(0)<='0' || ext.at(0)>='9') + if (ext.at(0)<'0' || ext.at(0)>'9') { ext.prepend("3"); } diff --git a/src/markdown.cpp b/src/markdown.cpp index 291e1dc..cc86af4 100644 --- a/src/markdown.cpp +++ b/src/markdown.cpp @@ -208,6 +208,10 @@ static QCString isBlockCommand(const char *data,int offset,int size) { return "end"+blockName; } + else if (blockName=="startuml") + { + return "enduml"; + } else if (blockName=="f" && end<size) { if (data[end]=='$') @@ -1702,7 +1706,7 @@ void writeOneLineHeaderOrRuler(GrowBuf &out,const char *data,int size) out.addStr(" "); out.addStr(header); out.addStr("\n"); - SectionInfo *si = Doxygen::sectionDict->find(header); + SectionInfo *si = Doxygen::sectionDict->find(id); if (si) { if (si->lineNr != -1) @@ -1721,7 +1725,7 @@ void writeOneLineHeaderOrRuler(GrowBuf &out,const char *data,int size) { g_current->anchors->append(si); } - Doxygen::sectionDict->append(header,si); + Doxygen::sectionDict->append(id,si); } } else @@ -2072,7 +2076,7 @@ static QCString processBlocks(const QCString &s,int indent) out.addStr(" "); out.addStr(header); out.addStr("\n\n"); - SectionInfo *si = Doxygen::sectionDict->find(header); + SectionInfo *si = Doxygen::sectionDict->find(id); if (si) { if (si->lineNr != -1) @@ -2092,7 +2096,7 @@ static QCString processBlocks(const QCString &s,int indent) { g_current->anchors->append(si); } - Doxygen::sectionDict->append(header,si); + Doxygen::sectionDict->append(id,si); } } else diff --git a/src/memberdef.cpp b/src/memberdef.cpp index a1b23e8..a25528a 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -37,7 +37,7 @@ #include "parserintf.h" #include "marshal.h" #include "objcache.h" -#include "vhdlscanner.h" + #include "vhdldocgen.h" #include "arguments.h" #include "memberlist.h" @@ -942,7 +942,9 @@ bool MemberDef::hasExamples() QCString MemberDef::getOutputFileBase() const { static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES"); + static bool inlineSimpleClasses = Config_getBool("INLINE_SIMPLE_STRUCTS"); QCString baseName; + //printf("Member: %s: templateMaster=%p group=%p classDef=%p nspace=%p fileDef=%p\n", // name().data(),m_impl->templateMaster,m_impl->group,m_impl->classDef, // m_impl->nspace,m_impl->fileDef); @@ -961,6 +963,10 @@ QCString MemberDef::getOutputFileBase() const else if (m_impl->classDef) { baseName=m_impl->classDef->getOutputFileBase(); + if (inlineSimpleClasses && m_impl->classDef->isSimple()) + { + return baseName; + } } else if (m_impl->nspace) { @@ -1442,16 +1448,7 @@ void MemberDef::writeDeclaration(OutputList &ol, if (!detailsVisible) { QCString doxyArgs=argsString(); - if (m_impl->annMemb) - { - QCString doxyName=m_impl->annMemb->name(); - if (!cname.isEmpty()) - { - doxyName.prepend(cdname+getLanguageSpecificSeparator(getLanguage())); - } - ol.startDoxyAnchor(cfname,cname,m_impl->annMemb->anchor(),doxyName,doxyArgs); - } - else + if (!m_impl->annMemb) { QCString doxyName=name(); if (!cname.isEmpty()) @@ -1723,15 +1720,27 @@ void MemberDef::writeDeclaration(OutputList &ol, ol.docify(" [implementation]"); ol.endTypewriter(); } + + bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); - if (isProperty() && (isSettable() || isGettable())) + if (isProperty() && (isSettable() || isGettable() || + isPrivateSettable() || isPrivateGettable() || + isProtectedSettable() || isProtectedGettable())) { ol.writeLatexSpacing(); ol.startTypewriter(); ol.docify(" ["); QStrList sl; - if (isGettable()) sl.append("get"); - if (isSettable()) sl.append("set"); + + if (isGettable()) sl.append("get"); + if (isProtectedGettable()) sl.append("protected get"); + if (isSettable()) sl.append("set"); + if (isProtectedSettable()) sl.append("protected set"); + if (extractPrivate) + { + if (isPrivateGettable()) sl.append("private get"); + if (isPrivateSettable()) sl.append("private set"); + } const char *s=sl.first(); while (s) { @@ -1934,6 +1943,7 @@ void MemberDef::getLabels(QStrList &sl,Definition *container) const //ol.docify(" ["); SrcLangExt lang = getLanguage(); bool optVhdl = lang==SrcLangExt_VHDL; + bool extractPrivate = Config_getBool("EXTRACT_PRIVATE"); if (optVhdl) { sl.append(VhdlDocGen::trTypeString(getMemberSpecifiers())); @@ -1949,7 +1959,14 @@ void MemberDef::getLabels(QStrList &sl,Definition *container) const if (isMutable()) sl.append("mutable"); if (isStatic()) sl.append("static"); if (isGettable()) sl.append("get"); + if (isProtectedGettable()) sl.append("protected get"); if (isSettable()) sl.append("set"); + if (isProtectedSettable()) sl.append("protected set"); + if (extractPrivate) + { + if (isPrivateGettable()) sl.append("private get"); + if (isPrivateSettable()) sl.append("private set"); + } if (isAddable()) sl.append("add"); if (!isUNOProperty() && isRemovable()) sl.append("remove"); if (isRaisable()) sl.append("raise"); @@ -4187,11 +4204,31 @@ bool MemberDef::isGettable() const return (m_impl->memSpec&Entry::Gettable)!=0; } +bool MemberDef::isPrivateGettable() const +{ + return (m_impl->memSpec&Entry::PrivateGettable)!=0; +} + +bool MemberDef::isProtectedGettable() const +{ + return (m_impl->memSpec&Entry::ProtectedGettable)!=0; +} + bool MemberDef::isSettable() const { return (m_impl->memSpec&Entry::Settable)!=0; } +bool MemberDef::isPrivateSettable() const +{ + return (m_impl->memSpec&Entry::PrivateSettable)!=0; +} + +bool MemberDef::isProtectedSettable() const +{ + return (m_impl->memSpec&Entry::ProtectedSettable)!=0; +} + bool MemberDef::isAddable() const { return (m_impl->memSpec&Entry::Addable)!=0; @@ -5034,4 +5071,28 @@ const ArgumentList *MemberDef::typeConstraints() const return m_impl->typeConstraints; } +bool MemberDef::isFriendToHide() const +{ + static bool hideFriendCompounds = Config_getBool("HIDE_FRIEND_COMPOUNDS"); + bool isFriendToHide = hideFriendCompounds && + (m_impl->type=="friend class" || + m_impl->type=="friend struct" || + m_impl->type=="friend union"); + return isFriendToHide; +} + +bool MemberDef::isNotFriend() const +{ + return !(isFriend() && isFriendToHide()); +} + +bool MemberDef::isFunctionOrSignalSlot() const +{ + return isFunction() || isSlot() || isSignal(); +} + +bool MemberDef::isRelatedOrFriend() const +{ + return isRelated() || isForeign() || (isFriend() && !isFriendToHide()); +} diff --git a/src/memberdef.h b/src/memberdef.h index 3259102..4f6028a 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -123,7 +123,11 @@ class MemberDef : public Definition bool isExplicit() const; bool isMutable() const; bool isGettable() const; + bool isPrivateGettable() const; + bool isProtectedGettable() const; bool isSettable() const; + bool isPrivateSettable() const; + bool isProtectedSettable() const; bool isReadable() const; bool isWritable() const; bool isAddable() const; @@ -173,6 +177,12 @@ class MemberDef : public Definition bool showInCallGraph() const; bool isStrongEnumValue() const; + // derived getters + bool isFriendToHide() const; + bool isNotFriend() const; + bool isFunctionOrSignalSlot() const; + bool isRelatedOrFriend() const; + // output info bool isLinkableInProject() const; bool isLinkable() const; diff --git a/src/message.cpp b/src/message.cpp index 8e4ecbd..11b4502 100644 --- a/src/message.cpp +++ b/src/message.cpp @@ -152,15 +152,15 @@ static void format_warn(const char *file,int line,const char *text) static void do_warn(const char *tag, const char *file, int line, const char *prefix, const char *fmt, va_list args) { if (!Config_getBool(tag)) return; // warning type disabled - char text[4096]; + char text[40960]; int l=0; if (prefix) { strcpy(text,prefix); l=strlen(prefix); } - vsnprintf(text+l, 4096-l, fmt, args); - text[4095]='\0'; + vsnprintf(text+l, 40960-l, fmt, args); + text[40960-1]='\0'; format_warn(file,line,text); } diff --git a/src/namespacedef.h b/src/namespacedef.h index 4613480..ceb3bd7 100644 --- a/src/namespacedef.h +++ b/src/namespacedef.h @@ -81,6 +81,8 @@ class NamespaceDef : public Definition virtual Definition *findInnerCompound(const char *name); void addInnerCompound(Definition *d); void addListReferences(); + + bool subGrouping() const { return m_subGrouping; } MemberList *getMemberList(MemberListType lt) const; const QList<MemberList> &getMemberLists() const { return m_memberLists; } diff --git a/src/outputlist.cpp b/src/outputlist.cpp index 59c3efb..754ee7c 100644 --- a/src/outputlist.cpp +++ b/src/outputlist.cpp @@ -169,7 +169,6 @@ void OutputList::writeDoc(DocRoot *root,Definition *ctx,MemberDef *md) // ctx?ctx->getDefFileExtension().data():"<null>"); if (og->isEnabled()) og->writeDoc(root,ctx,md); } - VhdlDocGen::setFlowMember(0); } diff --git a/src/parserintf.h b/src/parserintf.h index c389597..019b4a9 100644 --- a/src/parserintf.h +++ b/src/parserintf.h @@ -148,17 +148,19 @@ class ParserManager ParserManager() : m_defaultParser(0) { m_parsers.setAutoDelete(TRUE); } + void registerDefaultParser(ParserInterface *parser) + { + m_defaultParser = parser; + } + /** Registers an additional parser. * @param[in] name A symbolic name of the parser, i.e. "c", * "python", "fortran", "vhdl", ... * @param[in] parser The parser that is to be used for the * given name. - * @param[in] defParser Use this parser as the default parser, used - * for unregistered file extensions. */ - void registerParser(const char *name,ParserInterface *parser,bool defParser=FALSE) + void registerParser(const char *name,ParserInterface *parser) { - if (defParser && m_defaultParser==0) m_defaultParser=parser; m_parsers.insert(name,parser); } diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index 948836b..c636cdf 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -662,8 +662,9 @@ void PerlModDocVisitor::visit(DocVerbatim *s) case DocVerbatim::LatexOnly: type = "latexonly"; break; case DocVerbatim::XmlOnly: type = "xmlonly"; break; case DocVerbatim::DocbookOnly: type = "docbookonly"; break; - case DocVerbatim::Dot: type = "dot"; break; + case DocVerbatim::Dot: type = "dot"; break; case DocVerbatim::Msc: type = "msc"; break; + case DocVerbatim::PlantUML: type = "plantuml"; break; } openItem(type); m_output.addFieldQuotedString("content", s->text()); diff --git a/src/plantuml.cpp b/src/plantuml.cpp new file mode 100644 index 0000000..18f028b --- /dev/null +++ b/src/plantuml.cpp @@ -0,0 +1,97 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2014 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +#include "plantuml.h" +#include "portable.h" +#include "config.h" +#include "message.h" + +#include <qdir.h> + +//static const int maxCmdLine = 40960; + +QCString writePlantUMLSource(const QCString &outDir,const QCString &fileName,const QCString &content) +{ + QCString baseName(4096); + static int umlindex=1; + + if (fileName.isEmpty()) // generate name + { + baseName = outDir+"/inline_umlgraph_"+QCString().setNum(umlindex++); + } + else // user specified name + { + baseName = fileName; + int i=baseName.findRev('.'); + if (i!=-1) baseName = baseName.left(i); + baseName.prepend(outDir+"/"); + } + QFile file(baseName+".pu"); + if (!file.open(IO_WriteOnly)) + { + err("Could not open file %s for writing\n",baseName.data()); + } + QCString text = "@startuml\n"; + text+=content; + text+="@enduml\n"; + file.writeBlock( text, text.length() ); + file.close(); + return baseName; +} + +void generatePlantUMLOutput(const char *baseName,const char *outDir,PlantUMLOutputFormat format) +{ + static QCString plantumlJarPath = Config_getString("PLANTUML_JAR_PATH"); + + QCString pumlExe = "java"; + QCString pumlArgs = "-Djava.awt.headless=true -jar \""+plantumlJarPath+"plantuml.jar\" "; + pumlArgs+="-o \""; + pumlArgs+=outDir; + pumlArgs+="\" "; + QCString extension; + switch (format) + { + case PUML_BITMAP: + pumlArgs+="-tpng"; + extension=".png"; + break; + case PUML_EPS: + pumlArgs+="-teps"; + extension=".eps"; + break; + case PUML_SVG: + pumlArgs+="-tsvg"; + extension=".svg"; + break; + } + pumlArgs+=" \""; + pumlArgs+=baseName; + pumlArgs+=".pu\" "; + int exitCode; + //printf("*** running: %s %s outDir:%s %s\n",pumlExe.data(),pumlArgs.data(),outDir,outFile); + msg("Running PlantUML on generated file %s.pu\n",baseName); + portable_sysTimerStart(); + if ((exitCode=portable_system(pumlExe,pumlArgs,FALSE))!=0) + { + err("Problems running PlantUML. Verify that the command 'java -jar \"%splantuml.jar\" -h' works from the command line\n", + plantumlJarPath.data()); + } + else if (Config_getBool("DOT_CLEANUP")) + { + QFile(QCString(baseName)+".pu").remove(); + } + portable_sysTimerStop(); +} + diff --git a/src/plantuml.h b/src/plantuml.h new file mode 100644 index 0000000..27626d1 --- /dev/null +++ b/src/plantuml.h @@ -0,0 +1,40 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2014 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +#ifndef PLANTUML_H +#define PLANTUML_H + +class QCString; + +/** Plant UML output image formats */ +enum PlantUMLOutputFormat { PUML_BITMAP, PUML_EPS, PUML_SVG }; + +/** Write a PlantUML compatible file. + * @param[in] outDir the output directory to write the file to. + * @param[in] fileName the name of the file. If empty a name will be chosen automatically. + * @param[in] content the contents of the PlantUML file. + * @returns The name of the generated file. + */ +QCString writePlantUMLSource(const QCString &outDir,const QCString &fileName,const QCString &content); + +/** Convert a PlantUML file to an image. + * @param[in] baseName the name of the generated file (as returned by writePlantUMLSource()) + * @param[in] outDir the directory to write the resulting image into. + * @param[in] format the image format to generate. + */ +void generatePlantUMLOutput(const char *baseName,const char *outDir,PlantUMLOutputFormat format); + +#endif + diff --git a/src/portable_c.c b/src/portable_c.c index 05bb4bd..944c996 100644 --- a/src/portable_c.c +++ b/src/portable_c.c @@ -1,3 +1,9 @@ +#if (defined(__APPLE__) || defined(macintosh)) && !defined(DMG_BUILD) +// define this before including iconv.h to avoid a mapping of +// iconv_open and friends to libicon_open (done by mac ports), +// while the symbols without 'lib' are linked from /usr/lib/libiconv +#define LIBICONV_PLUG +#endif #include <iconv.h> // These functions are implemented in a C file, because there are different @@ -886,8 +886,9 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int } // PHASE 2: apply the macro function - if (argCount==def->nargs || - (argCount>def->nargs && def->varArgs)) // matching parameters lists + if (argCount==def->nargs || // same number of arguments + (argCount>=def->nargs-1 && def->varArgs)) // variadic macro with at least as many + // params as the non-variadic part (see bug731985) { uint k=0; // substitution of all formal arguments @@ -3024,8 +3025,15 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output) // gather the formal arguments in a dictionary while (i<i_cbrace && (p=reId.match(ds,i,&l))) { - argDict.insert(ds.mid(p,l),new int(count++)); - i=p+l; + if (l>0) // see bug375037 + { + argDict.insert(ds.mid(p,l),new int(count++)); + i=p+l; + } + else + { + i++; + } } // strip definition part QCString tmp=ds.right(ds.length()-i_equals-1); diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h index 0381c93..1d384b1 100644 --- a/src/printdocvisitor.h +++ b/src/printdocvisitor.h @@ -134,6 +134,7 @@ class PrintDocVisitor : public DocVisitor case DocVerbatim::DocbookOnly: printf("<docbookonly>"); break; case DocVerbatim::Dot: printf("<dot>"); break; case DocVerbatim::Msc: printf("<msc>"); break; + case DocVerbatim::PlantUML: printf("<plantuml>"); break; } printf("%s",s->text().data()); switch(s->type()) @@ -148,6 +149,7 @@ class PrintDocVisitor : public DocVisitor case DocVerbatim::DocbookOnly: printf("</docbookonly>"); break; case DocVerbatim::Dot: printf("</dot>"); break; case DocVerbatim::Msc: printf("</msc>"); break; + case DocVerbatim::PlantUML: printf("</plantuml>"); break; } } void visit(DocAnchor *a) @@ -476,9 +478,10 @@ class PrintDocVisitor : public DocVisitor printf("<image src=\"%s\" type=\"",img->name().data()); switch(img->type()) { - case DocImage::Html: printf("html"); break; - case DocImage::Latex: printf("latex"); break; - case DocImage::Rtf: printf("rtf"); break; + case DocImage::Html: printf("html"); break; + case DocImage::Latex: printf("latex"); break; + case DocImage::Rtf: printf("rtf"); break; + case DocImage::DocBook: printf("docbook"); break; } printf("\" width=%s height=%s>\n",img->width().data(),img->height().data()); } diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index 67faf98..5e27137 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -16,6 +16,8 @@ * */ +#include <qfileinfo.h> + #include "rtfdocvisitor.h" #include "docparser.h" #include "language.h" @@ -26,13 +28,13 @@ #include "util.h" #include "rtfstyle.h" #include "message.h" -#include <qfileinfo.h> #include "parserintf.h" #include "msc.h" #include "dia.h" #include "filedef.h" #include "config.h" #include "htmlentity.h" +#include "plantuml.h" //#define DBG_RTF(x) m_t << x #define DBG_RTF(x) do {} while(0) @@ -168,7 +170,7 @@ void RTFDocVisitor::visit(DocLineBreak *) { if (m_hide) return; DBG_RTF("{\\comment RTFDocVisitor::visit(DocLineBreak)}\n"); - m_t << "\\par"; + m_t << "\\par" << endl; m_lastIsPara=TRUE; } @@ -317,6 +319,16 @@ void RTFDocVisitor::visit(DocVerbatim *s) if (Config_getBool("DOT_CLEANUP")) file.remove(); } break; + case DocVerbatim::PlantUML: + { + static QCString rtfOutput = Config_getString("RTF_OUTPUT"); + QCString baseName = writePlantUMLSource(rtfOutput,s->exampleFile(),s->text()); + + m_t << "\\par{\\qc "; // center picture + writePlantUMLFile(baseName); + m_t << "} "; + } + break; } m_lastIsPara=FALSE; } @@ -1653,7 +1665,7 @@ void RTFDocVisitor::writeDotFile(const QCString &fileName) baseName=baseName.right(baseName.length()-i-1); } QCString outDir = Config_getString("RTF_OUTPUT"); - writeDotGraphFromFile(fileName,outDir,baseName,BITMAP); + writeDotGraphFromFile(fileName,outDir,baseName,GOF_BITMAP); if (!m_lastIsPara) m_t << "\\par" << endl; m_t << "{" << endl; m_t << rtf_Style_Reset; @@ -1704,3 +1716,23 @@ void RTFDocVisitor::writeDiaFile(const QCString &fileName) m_lastIsPara=TRUE; } +void RTFDocVisitor::writePlantUMLFile(const QCString &fileName) +{ + QCString baseName=fileName; + int i; + if ((i=baseName.findRev('/'))!=-1) + { + baseName=baseName.right(baseName.length()-i-1); + } + QCString outDir = Config_getString("RTF_OUTPUT"); + generatePlantUMLOutput(fileName,outDir,PUML_BITMAP); + if (!m_lastIsPara) m_t << "\\par" << endl; + m_t << "{" << endl; + m_t << rtf_Style_Reset; + m_t << "\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \""; + m_t << baseName << ".png"; + m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; + m_t << "}" << endl; + m_lastIsPara=TRUE; +} + diff --git a/src/rtfdocvisitor.h b/src/rtfdocvisitor.h index efc9d21..c50802d 100644 --- a/src/rtfdocvisitor.h +++ b/src/rtfdocvisitor.h @@ -155,6 +155,7 @@ class RTFDocVisitor : public DocVisitor void writeDotFile(const QCString &fileName); void writeMscFile(const QCString &fileName); void writeDiaFile(const QCString &fileName); + void writePlantUMLFile(const QCString &fileName); //-------------------------------------- // state variables diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index 8699c4e..ccdadcf 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -2409,7 +2409,7 @@ void RTFGenerator::endDotGraph(const DotClassGraph &g) newParagraph(); QCString fn = - g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),fileName,relPath,TRUE,FALSE); + g.writeGraph(t,GOF_BITMAP,EOF_Rtf,Config_getString("RTF_OUTPUT"),fileName,relPath,TRUE,FALSE); // display the file t << "{" << endl; @@ -2431,7 +2431,7 @@ void RTFGenerator::endInclDepGraph(const DotInclDepGraph &g) { newParagraph(); - QCString fn = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"), + QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_Rtf,Config_getString("RTF_OUTPUT"), fileName,relPath,FALSE); // display the file @@ -2461,7 +2461,7 @@ void RTFGenerator::endCallGraph(const DotCallGraph &g) { newParagraph(); - QCString fn = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"), + QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_Rtf,Config_getString("RTF_OUTPUT"), fileName,relPath,FALSE); // display the file @@ -2483,7 +2483,7 @@ void RTFGenerator::endDirDepGraph(const DotDirDeps &g) { newParagraph(); - QCString fn = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"), + QCString fn = g.writeGraph(t,GOF_BITMAP,EOF_Rtf,Config_getString("RTF_OUTPUT"), fileName,relPath,FALSE); // display the file diff --git a/src/scanner.l b/src/scanner.l index a7ac841..8370f13 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -682,7 +682,6 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) %x SkipCurlyBlock %x SkipRoundBlock %x Sharp -%x SkipSharp %x SkipRound %x SkipSquare %x SkipRemainder @@ -2246,7 +2245,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) <FindMembers>"Q_OBJECT" { // Qt object macro } <FindMembers>"Q_PROPERTY" { // Qt property declaration - current->protection = protection = Public ; + //current->protection = protection = Public ; // see bug734245 current->mtype = mtype = Property; current->type.resize(0); BEGIN(QtPropType); @@ -3373,6 +3372,8 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) } else { + mtype = Method; + virt = Normal; if (needNewCurrent) { current = new Entry ; @@ -5301,6 +5302,7 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) { prependScope(); } + current->spec|=Entry::ForwardDecl; current_root->addSubEntry(current); current = new Entry; } @@ -5353,13 +5355,13 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) BEGIN( ClassVar ); } } -<AlignAs>"(" { roundCount=1; +<AlignAs>"(" { roundCount=0; BEGIN( AlignAsEnd ); } <AlignAs>\n { lineCount(); } <AlignAs>. <AlignAsEnd>"(" { roundCount++; } -<AlignAsEnd>")" { if (--roundCount<=0) +<AlignAsEnd>")" { if (--roundCount<0) { BEGIN( lastAlignAsContext ); } @@ -5843,12 +5845,8 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) <Specialization>. { *specName += *yytext; } -<SkipSharp>"<" { ++sharpCount; } -<SkipSharp>">" { if (--sharpCount<=0) - BEGIN ( lastSkipSharpContext ); - } <SkipRound>"(" { ++roundCount; } -<SkipRound>")" { if (--roundCount<=0) +<SkipRound>")" { if (--roundCount<0) BEGIN ( lastSkipRoundContext ); } <SkipRound>\" { @@ -6130,10 +6128,15 @@ OPERATOR "operator"{B}*({ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}) else { mtype = Method; + virt = Normal; unput(';'); BEGIN(FindMembers); } } +<CSAccessorDecl>"private "{BN}*"set" { if (curlyCount==0) current->spec |= Entry::PrivateSettable; } +<CSAccessorDecl>"protected "{BN}*"set" { if (curlyCount==0) current->spec |= Entry::ProtectedSettable; } +<CSAccessorDecl>"private "{BN}*"get" { if (curlyCount==0) current->spec |= Entry::PrivateGettable; } +<CSAccessorDecl>"protected "{BN}*"get" { if (curlyCount==0) current->spec |= Entry::ProtectedGettable; } <CSAccessorDecl>"set" { if (curlyCount==0) current->spec |= Entry::Settable; } <CSAccessorDecl>"get" { if (curlyCount==0) current->spec |= Entry::Gettable; } <CSAccessorDecl>"add" { if (curlyCount==0) current->spec |= Entry::Addable; } @@ -6680,6 +6683,18 @@ static void parseCompounds(Entry *rt) current = new Entry; gstat = FALSE; initEntry(); + + // deep copy group list from parent (see bug 727732) + if (rt->groups) + { + QListIterator<Grouping> gli(*rt->groups); + Grouping *g; + for (;(g=gli.current());++gli) + { + ce->groups->append(new Grouping(*g)); + } + } + int ni=ce->name.findRev("::"); if (ni==-1) ni=0; else ni+=2; // set default protection based on the compound type if( ce->section==Entry::CLASS_SEC ) // class diff --git a/src/tagreader.cpp b/src/tagreader.cpp index 036e24f..23b8f13 100644 --- a/src/tagreader.cpp +++ b/src/tagreader.cpp @@ -1432,7 +1432,7 @@ void TagFileParser::buildLists(Entry *root) for (pgit.toFirst();(tpi=pgit.current());++pgit) { Entry *pe = new Entry; - pe->section = Entry::PAGEDOC_SEC; + pe->section = tpi->filename=="index" ? Entry::MAINPAGEDOC_SEC : Entry::PAGEDOC_SEC; pe->name = tpi->name; pe->args = tpi->title; addDocAnchors(pe,tpi->docAnchors); @@ -1440,7 +1440,6 @@ void TagFileParser::buildLists(Entry *root) ti->tagName = m_tagName; ti->fileName = tpi->filename; pe->tagInfo = ti; - root->addSubEntry(pe); } } diff --git a/src/tclscanner.l b/src/tclscanner.l index 1fd20cd..88e3d1d 100644 --- a/src/tclscanner.l +++ b/src/tclscanner.l @@ -451,6 +451,7 @@ static struct QList<Entry> entry; // list of all created entries, will be deleted after codifying Protection protection; // current protections state MemberDef *memberdef; // contain current MemberDef when codifying + bool collectXRefs; } tcl; // scanner functions @@ -533,6 +534,24 @@ static void tcl_name(const QCString &ns0, const QCString &name0, QCString &ns, Q } } +//! Check name. Strip namespace qualifiers from name0 if inside inlined code segment. +// @return 'ns' and 'name' of given current 'ns0' and 'name0' +static void tcl_name_SnippetAware(const QCString &ns0, const QCString &name0, QCString &ns, QCString &name) +{ + // If we are inside an inlined code snippet then ns0 + // already containes the complete namespace path. + // Any namespace qualifiers in name0 are redundant. + int i = name0.findRev("::"); + if (i>=0 && tcl.memberdef) + { + tcl_name(ns0, name0.mid(i+2), ns, name); + } + else + { + tcl_name(ns0, name0, ns, name); + } +} + // Check and return namespace entry. // @return namespace entry Entry* tcl_entry_namespace(const QCString ns) @@ -713,6 +732,40 @@ static void tcl_codify_cmd(const char *s,int i) { tcl_codify(s,(*tcl.list_commandwords.at(i)).utf8()); } +//! codify a string token +// +// codifies string according to type. +// Starts a new scan context if needed (*myScan==0 and type == "script"). +// Returns NULL or the created scan context. +// +static tcl_scan *tcl_codify_token(tcl_scan *myScan, const QCString type, const QCString string) +{ + if (myScan != NULL) + { + if (type != NULL) + { + myScan->after << type << string; + } + else + { + myScan->after << "NULL" << string; + } + } + else + { + if (qstrcmp(type, "script") == 0) + { + myScan = tcl.scan.at(0); + myScan = tcl_scan_start('?', string, + myScan->ns, myScan->entry_cl, myScan->entry_fn); + } + else + { + tcl_codify((const char*)type, string); + } + } + return myScan; +} //----------------------------------------------------------------------------- #undef YY_INPUT @@ -1652,6 +1705,40 @@ static void tcl_codify_link(QCString name) { myDef->addSourceReferencedBy(tcl.memberdef); tcl.memberdef->addSourceReferences(myDef); + } else { + Entry* callerEntry; + unsigned int i; + // walk the stack of scan contexts and find the enclosing method or proc + for (i=0;i<tcl.scan.count();i++) + { + callerEntry=tcl.scan.at(i)->entry_scan; + if (callerEntry->mtype==Method && !callerEntry->name.isEmpty()) + { + break; + } + } + if (i<tcl.scan.count()) + { + // enclosing method found + QCString callerName = callerEntry->name; + if (callerName.mid(0,2)=="::") // fully qualified global command + { + callerName = callerName.mid(2); + } + else + { + if (!(tcl.scan.at(0)->ns.stripWhiteSpace().isEmpty())) + { + callerName = tcl.scan.at(0)->ns + "::" + callerEntry->name; + } + } + MemberDef *callerDef=NULL; + callerDef = fn.find(callerName); + if (callerDef!=NULL && myDef!= NULL && tcl.collectXRefs) + { + addDocCrossReference(callerDef,myDef); + } + } } } else if (tcl_keyword(myName)) // check keyword @@ -1665,6 +1752,250 @@ static void tcl_codify_link(QCString name) } +//! scan general argument for brackets +// +// parses (*tcl.list_commandwords.at(i)).utf8() and checks for brackets. +// Starts a new scan context if needed (*myScan==0 and brackets found). +// Returns NULL or the created scan context. +// +static tcl_scan *tcl_command_ARG(tcl_scan *myScan, unsigned int i, bool ignoreOutermostBraces) +{ + QCString myName; + bool insideQuotes=false; + unsigned int insideBrackets=0; + unsigned int insideBraces=0; + myName = (*tcl.list_commandwords.at(i)).utf8(); + if (i%2 != 0) + { + // handle white space + myScan = tcl_codify_token(myScan, "NULL", myName); + } + else + { + QCString myStr = ""; + unsigned int j; + for (j=0;j<myName.length();j++) + { + QChar c = myName[j]; + bool backslashed = false; + if (j>0) + { + backslashed = myName[j-1]=='\\'; + } + // this is a state machine + // input is c + // internal state is myScan and insideXXX + // these are the transitions: + if (c=='[' && !backslashed && insideBraces==0) + { + insideBrackets++; + } + if (c==']' && !backslashed && insideBraces==0 && insideBrackets>0) + { + insideBrackets--; + } + if (c=='{' && !backslashed && !insideQuotes && !(ignoreOutermostBraces && j==0)) + { + insideBraces++; + } + if (c=='}' && !backslashed && !insideQuotes && insideBraces>0) + { + insideBraces--; + } + if (c=='"' && !backslashed && insideBraces==0) + { + insideQuotes=!insideQuotes; + } + // all output, depending on state and input + if (c=='[' && !backslashed && insideBrackets==1 && insideBraces==0) + { + // the first opening bracket, output what we have so far + myStr+=c; + myScan = tcl_codify_token(myScan, "NULL", myStr); + myStr=""; + } + else if (c==']' && !backslashed && insideBrackets==0 && insideBraces==0) + { + // the last closing bracket, start recursion, switch to deferred + myScan = tcl_codify_token(myScan, "script", myStr); + myStr=""; + myStr+=c; + } + else + { + myStr+=c; + } + } + if (i == 0 && myScan == NULL) + { + tcl_codify_link(myStr); + } + else + { + myScan = tcl_codify_token(myScan, "NULL", myStr); + } + } + return (myScan); +} + +//! Handle internal tcl commands. +// "eval arg ?arg ...?" +static void tcl_command_EVAL() +{ +D + tcl_codify_cmd("keyword", 0); + tcl_scan *myScan = tcl.scan.at(0); + QCString myString = ""; + // we simply rescan the line without the eval + // we include leading whitespace because tcl_scan_start will examine + // the first char. If it finds a bracket it will assume one expression in brackets. + // Example: eval [list set] [list NotInvoked] [Invoked NotInvoked] + for (unsigned int i = 1; i < tcl.list_commandwords.count(); i++) + { + myString += (*tcl.list_commandwords.at(i)).utf8(); + } + myScan = tcl_scan_start('?', myString, + myScan->ns, myScan->entry_cl, myScan->entry_fn); +} + +//! Handle internal tcl commands. +// switch ?options? string pattern body ?pattern body ...? +// switch ?options? string {pattern body ?pattern body ...?} +static void tcl_command_SWITCH() +{ +D + tcl_codify_cmd("keyword",0); + tcl_codify_cmd(NULL,1); + tcl_scan *myScan=NULL; + unsigned int i; + QCString token; + // first: find the last option token + unsigned int lastOptionIndex = 0; + for (i = 2; i<tcl.list_commandwords.count(); i += 2) + { + token = (*tcl.list_commandwords.at(i)).utf8(); + if (token == "--") + { + lastOptionIndex = i; + break; + } + if (token[0] == '-' && i - lastOptionIndex == 2) + { + // options start with dash and should form a continuous chain + lastOptionIndex = i; + } + } + // second: eat up options + for (i = 2; i <= lastOptionIndex; i++) + { + myScan = tcl_command_ARG(myScan, i, false); + } + // third: how many tokens are left? + if (tcl.list_commandwords.count() - lastOptionIndex == 5) + { + //printf("syntax: switch ?options? string {pattern body ?pattern body ...?}\n"); + myScan = tcl_command_ARG(myScan, lastOptionIndex + 1, false); + myScan = tcl_command_ARG(myScan, lastOptionIndex + 2, false); + myScan = tcl_command_ARG(myScan, lastOptionIndex + 3, false); + // walk trough the list step by step + // this way we can preserve whitespace + bool inBraces = false; + bool nextIsPattern = true; + int size; + const char *elem; + const char *next; + token = (*tcl.list_commandwords.at(lastOptionIndex + 4)).utf8(); + if (token[0] == '{') + { + inBraces = true; + token = token.mid(1, token.length() - 2); + myScan = tcl_codify_token(myScan, "NULL", QCString("{")); + } + // ToDo: check if multibyte chars are handled correctly + while (token.length() > 0) + { + TclFindElement((const char*)token, token.length(), &elem, &next, &size, NULL); + //printf("%s\nstart=%d, elem=%d, next=%d, size=%d, brace=%d\n", + // (const char*) token, (const char*) token, elem, next, size, brace); + // + // handle leading whitespace/opening brace/double quotes + if (elem - token > 0) + { + myScan = tcl_codify_token(myScan, "NULL", token.left(elem - token)); + } + // handle actual element without braces/double quotes + if (nextIsPattern) + { + myScan = tcl_codify_token(myScan, "NULL", token.mid(elem - token,size)); + //printf("pattern=%s\n",(const char*) token.mid(elem - token, size)); + } + else { + myScan = tcl_codify_token(myScan, "script", token.mid(elem - token, size)); + //printf("script =%s\n", (const char*) token.mid(elem - token, size)); + } + // handle trailing whitespace/closing brace/double quotes + if (next - elem - size > 0) + { + myScan = tcl_codify_token(myScan, "NULL", token.mid(elem - token + size, next - elem - size)); + } + nextIsPattern = !nextIsPattern; + token = token.mid(next - token); + } + if (inBraces) + { + myScan = tcl_codify_token(myScan, "NULL", QCString("}")); + } + if (!nextIsPattern) + { + tcl_war("Invalid switch syntax: last token is not a list of even elements.\n"); + //tcl_war("%s\n", tcl.list_commandwords.join(" ").ascii()); + } + } + else if ((tcl.list_commandwords.count() - lastOptionIndex > 6) && + ((tcl.list_commandwords.count() - lastOptionIndex-3) % 4 == 0)) + { + //printf("detected: switch ?options? string pattern body ?pattern body ...?\n"); + myScan = tcl_command_ARG(myScan, lastOptionIndex + 1, false); + myScan = tcl_command_ARG(myScan, lastOptionIndex + 2, false); + //printf("value=%s\n",(const char*) (*tcl.list_commandwords.at(lastOptionIndex + 2)).utf8()); + for (i = lastOptionIndex + 3; i < tcl.list_commandwords.count(); i += 4) + { + myScan = tcl_command_ARG(myScan, i + 0, false); // whitespace + myScan = tcl_command_ARG(myScan, i + 1, false); // pattern + myScan = tcl_command_ARG(myScan, i + 2, false); // whitespace + myScan = tcl_codify_token(myScan, "script", (*tcl.list_commandwords.at(i+3)).utf8()); // script + //printf("pattern=%s\n",(const char*) (*tcl.list_commandwords.at(i+1)).utf8()); + //printf("script=%s\n",(const char*) (*tcl.list_commandwords.at(i+3)).utf8()); + } + } + else + { + // not properly detected syntax + tcl_war("Invalid switch syntax: %d options followed by %d tokens.\n", + lastOptionIndex / 2, (tcl.list_commandwords.count() - 1) / 2 - lastOptionIndex / 2); + for (i = lastOptionIndex + 1; i <= tcl.list_commandwords.count(); i++) + { + myScan = tcl_command_ARG(myScan, i, false); + } + } +} + +//! Handle internal tcl commands. +// "catch script ?resultVarName? ?optionsVarName?" +static void tcl_command_CATCH() +{ +D + tcl_codify_cmd("keyword", 0); + tcl_codify_cmd(NULL, 1); + tcl_scan *myScan = tcl.scan.at(0); + myScan = tcl_scan_start('?', *tcl.list_commandwords.at(2), + myScan->ns, myScan->entry_cl, myScan->entry_fn); + for (unsigned int i = 3; i < tcl.list_commandwords.count(); i++) + { + myScan = tcl_command_ARG(myScan, i, false); + } +} + //! Handle internal tcl commands. // "if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN?" static void tcl_command_IF(QStringList type) @@ -1672,12 +2003,27 @@ static void tcl_command_IF(QStringList type) D tcl_codify_cmd("keyword",0); tcl_codify_cmd(NULL,1); - tcl_scan *myScan=tcl.scan.at(0); - myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2), - myScan->ns,myScan->entry_cl,myScan->entry_fn); + tcl_scan *myScan = NULL; + myScan = tcl_command_ARG(myScan, 2, true); for (unsigned int i = 3;i<tcl.list_commandwords.count();i++) { - myScan->after << type[i] << tcl.list_commandwords[i]; + if (type[i] == "expr") + { + myScan = tcl_command_ARG(myScan, i, true); + } + else + { + if (myScan!=0) + { + myScan->after << type[i] << tcl.list_commandwords[i]; + } + else + { + myScan=tcl.scan.at(0); + myScan = tcl_scan_start('?',*tcl.list_commandwords.at(i), + myScan->ns,myScan->entry_cl,myScan->entry_fn); + } + } } } //! Handle internal tcl commands. @@ -1691,7 +2037,7 @@ D myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2), myScan->ns,myScan->entry_cl,myScan->entry_fn); myScan->after << "NULL" << tcl.list_commandwords[3]; - myScan->after << "script" << tcl.list_commandwords[4]; + myScan = tcl_command_ARG(myScan, 4, true); myScan->after << "NULL" << tcl.list_commandwords[5]; myScan->after << "script" << tcl.list_commandwords[6]; myScan->after << "NULL" << tcl.list_commandwords[7]; @@ -1705,14 +2051,22 @@ static void tcl_command_FOREACH() { D unsigned int i; + tcl_scan *myScan=NULL; tcl_codify_cmd("keyword",0); for (i = 1;i<tcl.list_commandwords.count()-1;i++) { - tcl_codify_cmd(NULL,i); + myScan = tcl_command_ARG(myScan, i, false); + } + if (myScan!=0) + { + myScan->after << "script" << tcl.list_commandwords[tcl.list_commandwords.count()-1]; + } + else + { + myScan=tcl.scan.at(0); + myScan = tcl_scan_start('?',*tcl.list_commandwords.at(tcl.list_commandwords.count()-1), + myScan->ns,myScan->entry_cl,myScan->entry_fn); } - tcl_scan *myScan=tcl.scan.at(0); - myScan = tcl_scan_start('?',*tcl.list_commandwords.at(tcl.list_commandwords.count()-1), - myScan->ns,myScan->entry_cl,myScan->entry_fn); } ///! Handle internal tcl commands. @@ -1722,68 +2076,29 @@ static void tcl_command_WHILE() D tcl_codify_cmd("keyword",0); tcl_codify_cmd(NULL,1); - tcl_scan *myScan=tcl.scan.at(0); - myScan = tcl_scan_start('?',*tcl.list_commandwords.at(2), + tcl_scan *myScan = NULL; + myScan = tcl_command_ARG(myScan, 2, true); + myScan = tcl_command_ARG(myScan, 3, false); + if (myScan!=0) + { + myScan->after << "script" << tcl.list_commandwords[4]; + } + else + { + myScan=tcl.scan.at(0); + myScan = tcl_scan_start('?',*tcl.list_commandwords.at(4), myScan->ns,myScan->entry_cl,myScan->entry_fn); - myScan->after << "NULL" << tcl.list_commandwords[3]; - myScan->after << "script" << tcl.list_commandwords[4]; + } } //! Handle all other commands. // Create links of first command word or first command word inside []. static void tcl_command_OTHER() { - if (tcl.code == NULL) return; -D - QCString myName; + tcl_scan *myScan=NULL; for (unsigned int i=0; i< tcl.list_commandwords.count(); i++) { - myName = (*tcl.list_commandwords.at(i)).utf8(); - if (i==0) - { - tcl_codify_link(myName); - } - else if (i%2 != 0) - { - tcl_codify(NULL,myName); - } - else - { - QCString myStr=""; - int myCmd=0; - unsigned int i; - for (i=0;i<myName.length();i++) - { - QChar c = myName[i]; - if (myCmd) - { - if (c==' '||c=='\t'||c=='\n'||c==']') - {//end of command - tcl_codify_link(myStr); - myStr=""; - myCmd=0; - } - myStr+=c; - } - else - { - myStr+=c; - if (c=='[') - {//start of command - for (;i<myName.length();i++) - { - c = myName[i+1]; - if (c!=' ' && c!='\t' && c!='\n') break; - myStr+=c; - } - tcl_codify(NULL,myStr); - myStr=""; - myCmd=1; - } - } - } - tcl_codify(NULL,myStr); - } + myScan = tcl_command_ARG(myScan, i, false); } } @@ -1802,7 +2117,7 @@ D tcl_codify_cmd(NULL,3); tcl_codify_cmd(NULL,4); tcl_codify_cmd(NULL,5); - tcl_name(myScan->ns,(*tcl.list_commandwords.at(2)).utf8(),myNs,myName); + tcl_name_SnippetAware(myScan->ns,(*tcl.list_commandwords.at(2)).utf8(),myNs,myName); if (myNs.length()) { myEntryNs = tcl_entry_namespace(myNs); @@ -2060,15 +2375,62 @@ D } myEntryCl = tcl_entry_class(myName); myStr = (*tcl.list_commandwords.at(4)).utf8(); - if (tcl.list_commandwords.count() > 5) + // + // special cases first + // oo::define classname method methodname args script + // oo::define classname constructor argList bodyScript + // oo::define classname destructor bodyScript + unsigned int n =tcl.list_commandwords.count(); + if ((myStr == "method" && n == 11) || + (myStr == "constructor" && n == 9) || + (myStr == "destructor" && n == 7)) + { + for (unsigned int i = 4; i < n-1; i++) + { + tcl_codify_cmd("NULL",i); + } + Entry *myEntry; + QCString myMethod; + tcl_name(myScan->ns,(*tcl.list_commandwords.at(n==11?6:4)).utf8(),myNs,myMethod); + // code snippet taken from tcl_command_METHOD()/tcl_command_CONSTRUCTOR + tcl.fn.remove(myMethod); + tcl.entry_current->section = Entry::FUNCTION_SEC; + tcl.entry_current->mtype = Method; + tcl.entry_current->name = myMethod; + tcl.entry_current->startLine = tcl.line_command; + tcl.entry_current->bodyLine = tcl.line_body0; + tcl.entry_current->endBodyLine = tcl.line_body1; + tcl_protection(tcl.entry_current); + if (n==11) + { + tcl_command_ARGLIST(*tcl.list_commandwords.at(8)); + } + else if (n==9) + { + tcl_command_ARGLIST(*tcl.list_commandwords.at(6)); + } + if (myEntryCl) myEntryCl->addSubEntry(tcl.entry_current); + tcl.fn.insert(myMethod,tcl.entry_current); + myEntry = tcl.entry_current; + myScan = tcl_scan_start('?',*tcl.list_commandwords.at(n-1), + myNs, myEntryCl, myEntry); + } + else { - for (uint i=5;i<tcl.list_commandwords.count();i++) + // The general case + // Simply concat all arguments into a script. + // Note: all documentation collected just before the + // oo::define command is lost + if (tcl.list_commandwords.count() > 5) { - myStr.append((*tcl.list_commandwords.at(i)).utf8()); + for (uint i=5;i<tcl.list_commandwords.count();i++) + { + myStr.append((*tcl.list_commandwords.at(i)).utf8()); + } + tcl.word_is=' '; } - tcl.word_is=' '; + myScan = tcl_scan_start(tcl.word_is,myStr,myName,myEntryCl,NULL); } - myScan = tcl_scan_start(tcl.word_is,myStr,myName,myEntryCl,NULL); } //! Handle \c variable statements. @@ -2165,13 +2527,14 @@ tcl_inf("->\n"); // check command QCString myStr = (*tcl.list_commandwords.at(0)).utf8(); + tcl_scan *myScanBackup=tcl.scan.at(0); int myLevel = 0; Protection myProt = tcl.protection; if (tcl.list_commandwords.count() < 3) { tcl_command_OTHER(); - goto command_text; + goto command_end; } // remove leading "::" and apply TCL_SUBST if (myStr.left(2)=="::") myStr = myStr.mid(2); @@ -2259,7 +2622,7 @@ tcl_inf("->\n"); goto command_end; } tcl_command_OTHER(); - goto command_text; + goto command_end; } if (myStr=="itcl::class") { @@ -2282,7 +2645,7 @@ tcl_inf("->\n"); goto command_end; } tcl_command_OTHER(); - goto command_text; + goto command_end; } if (myStr=="oo::define") { @@ -2296,7 +2659,7 @@ tcl_inf("->\n"); if (tcl.scan.at(0)->entry_fn == NULL) {// only parsed outside functions tcl_command_VARIABLE(tcl.scan.at(0)->entry_cl && tcl.scan.at(0)->entry_cl->name!=""); - goto command_text; + goto command_end; } } if (myStr=="common") @@ -2305,7 +2668,7 @@ tcl_inf("->\n"); if (tcl.scan.at(0)->entry_fn == NULL) {// only parsed outside functions tcl_command_VARIABLE(0); - goto command_text; + goto command_end; } } if (myStr=="inherit" || myStr=="superclass") @@ -2322,9 +2685,26 @@ tcl_inf("->\n"); } /* * Start of internal tcl keywords - * Ready: if, for, foreach, while - * TODO: switch, eval, ? + * Ready: switch, eval, catch, if, for, foreach, while */ + if (myStr=="switch") + { + if (tcl.list_commandwords.count() < 5) {myLine=__LINE__;goto command_warn;} + tcl_command_SWITCH(); + goto command_end; + } + if (myStr=="eval") + { + if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;} + tcl_command_EVAL(); + goto command_end; + } + if (myStr=="catch") + { + if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;} + tcl_command_CATCH(); + goto command_end; + } if (myStr=="for") { if (tcl.list_commandwords.count() != 9) {myLine=__LINE__;goto command_warn;} @@ -2343,7 +2723,7 @@ if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN? if (myStr=="if" && tcl.list_commandwords.count() > 4) { QStringList myType; - myType << "keyword" << "NULL" << "script" << "NULL"; + myType << "keyword" << "NULL" << "expr" << "NULL"; char myState='x';// last word: e'x'pr 't'hen 'b'ody 'e'lse else'i'f.. for (unsigned int i = 4; i < tcl.list_commandwords.count(); i = i + 2) { @@ -2392,7 +2772,7 @@ if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN? else if (myState=='i') { myState='x'; - myType << "script" << "NULL"; + myType << "expr" << "NULL"; } } if (myState != 'b') {myLine=__LINE__;goto command_warn;} @@ -2406,15 +2786,22 @@ if expr1 ?then? body1 elseif expr2 ?then? body2 elseif ... ?else? ?bodyN? goto command_end; } tcl_command_OTHER(); - goto command_text; + goto command_end; command_warn:// print warning message because of wrong used syntax tcl_war("%d count=%d: %s\n",myLine,tcl.list_commandwords.count(),tcl.list_commandwords.join(" ").ascii()); tcl_command_OTHER(); - command_text:// print remaining text as comment - if (!myText.isEmpty()) tcl_codify("comment",myText); - myText = ""; command_end:// add remaining text to current context - if (!myText.isEmpty()) tcl.scan.at(0)->after << "comment" << myText; + if (!myText.isEmpty()) + { + if(myScanBackup==tcl.scan.at(0)) + { + tcl_codify("comment",myText); + } + else + { + tcl.scan.at(0)->after << "comment" << myText; + } + } tcl.list_commandwords.clear(); tcl.command = 0; tcl.protection = myProt; @@ -2634,6 +3021,7 @@ tcl_inf("%s (%d,%d) %d %d\n",myStr.ascii(),startLine,endLine,isExampleBlock,inli return; } tcl_init(); + tcl.collectXRefs = collectXRefs; tcl.memberdef = memberDef; tcl.code = &codeOutIntf; if (startLine<0) diff --git a/src/template.cpp b/src/template.cpp index 64d3523..ec8554b 100644 --- a/src/template.cpp +++ b/src/template.cpp @@ -1,3 +1,18 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2014 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + #include "template.h" #include <stdio.h> @@ -11,6 +26,8 @@ #include <qstack.h> #include <qfile.h> #include <qregexp.h> +#include <qcstring.h> +#include <qdir.h> #include "sortdict.h" #include "ftextstream.h" @@ -346,6 +363,21 @@ TemplateVariant::Type TemplateVariant::type() const return p->type; } +QCString TemplateVariant::typeAsString() const +{ + switch (p->type) + { + case None: return "none"; + case Bool: return "bool"; + case Integer: return "integer"; + case String: return "string"; + case Struct: return "struct"; + case List: return "list"; + case Function: return "function"; + } + return "invalid"; +} + bool TemplateVariant::isValid() const { return p->type!=None; @@ -671,7 +703,9 @@ class TemplateContextImpl : public TemplateContext QCString outputDirectory() const { return m_outputDir; } TemplateEscapeIntf *escapeIntf() const { return m_activeEscapeIntf; } TemplateSpacelessIntf *spacelessIntf() const { return m_spacelessIntf; } - void enableSpaceless(bool b) { m_spacelessEnabled=b; } + void enableSpaceless(bool b) { if (b && !m_spacelessEnabled) m_spacelessIntf->reset(); + m_spacelessEnabled=b; + } bool spacelessEnabled() const { return m_spacelessEnabled && m_spacelessIntf; } void warn(const char *fileName,int line,const char *fmt,...) const; @@ -737,13 +771,57 @@ class FilterAdd //----------------------------------------------------------------------------- +/** @brief The implementation of the "get" filter */ +class FilterGet +{ + public: + static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &arg) + { + if (v.isValid() && v.type()==TemplateVariant::Struct && arg.type()==TemplateVariant::String) + { + TemplateVariant result = v.toStruct()->get(arg.toString()); + //printf("\nok[%s]=%d\n",arg.toString().data(),result.type()); + return result; + } + else + { + //printf("\nnok[%s]\n",arg.toString().data()); + return FALSE; + } + } +}; + + +//----------------------------------------------------------------------------- + +/** @brief The implementation of the "append" filter */ +class FilterAppend +{ + public: + static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &arg) + { + if ((v.type()==TemplateVariant::String || v.type()==TemplateVariant::Integer) && + arg.type()==TemplateVariant::String) + { + return TemplateVariant(v.toString() + arg.toString()); + } + else + { + return v; + } + } +}; + +//----------------------------------------------------------------------------- + /** @brief The implementation of the "prepend" filter */ class FilterPrepend { public: static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &arg) { - if (v.type()==TemplateVariant::String && arg.type()==TemplateVariant::String) + if ((v.type()==TemplateVariant::String || v.type()==TemplateVariant::Integer) && + arg.type()==TemplateVariant::String) { return TemplateVariant(arg.toString() + v.toString()); } @@ -806,6 +884,385 @@ class FilterDefault //-------------------------------------------------------------------- +/** @brief The implementation of the "flatten" filter */ +class FilterFlatten +{ + public: + static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &) + { + if (!v.isValid() || v.type()!=TemplateVariant::List) + { + return v; + } + else + { + TemplateList *list = TemplateList::alloc(); + flatten(v.toList(),list); + return TemplateVariant(list); + } + } + + private: + static void flatten(TemplateListIntf *tree,TemplateList *list) + { + TemplateListIntf::ConstIterator *it = tree->createIterator(); + TemplateVariant item; + for (it->toFirst();(it->current(item));it->toNext()) + { + TemplateStructIntf *s = item.toStruct(); + if (s) + { + list->append(item); + // if s has "children" then recurse into the children + TemplateVariant children = s->get("children"); + if (children.isValid() && children.type()==TemplateVariant::List) + { + flatten(children.toList(),list); + } + } + else + { + list->append(item); + } + } + delete it; + } +}; + +//-------------------------------------------------------------------- + +/** @brief The implementation of the "listsort" filter */ +class FilterListSort +{ + struct ListElem + { + ListElem(const QCString &k,const TemplateVariant &v) : key(k), value(v) {} + QCString key; + TemplateVariant value; + }; + class SortList : public QList<ListElem> + { + public: + SortList() { setAutoDelete(TRUE); } + private: + int compareValues(const ListElem *item1,const ListElem *item2) const + { + return qstrcmp(item1->key,item2->key); + } + }; + public: + static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &args) + { + if (v.type()==TemplateVariant::List && args.type()==TemplateVariant::String) + { + //printf("FilterListSort::apply: v=%s args=%s\n",v.toString().data(),args.toString().data()); + TemplateListIntf::ConstIterator *it = v.toList()->createIterator(); + + TemplateVariant item; + TemplateList *result = TemplateList::alloc(); + + // create list of items based on v using the data in args as a sort key + SortList sortList; + for (it->toFirst();(it->current(item));it->toNext()) + { + TemplateStructIntf *s = item.toStruct(); + if (s) + { + QCString sortKey = determineSortKey(s,args.toString()); + sortList.append(new ListElem(sortKey,item)); + //printf("sortKey=%s\n",sortKey.data()); + } + } + delete it; + + // sort the list + sortList.sort(); + + // add sorted items to the result list + QListIterator<ListElem> sit(sortList); + ListElem *elem; + for (sit.toFirst();(elem=sit.current());++sit) + { + result->append(elem->value); + } + return result; + } + return v; + } + + private: + static QCString determineSortKey(TemplateStructIntf *s,const QCString &arg) + { + int i,p=0; + QCString result; + while ((i=arg.find("{{",p))!=-1) + { + result+=arg.mid(p,i-p); + int j=arg.find("}}",i+2); + if (j!=-1) + { + QCString var = arg.mid(i+2,j-i-2); + TemplateVariant val=s->get(var); + //printf("found argument %s value=%s\n",var.data(),val.toString().data()); + result+=val.toString(); + p=j+2; + } + else + { + p=i+1; + } + } + result+=arg.right(arg.length()-p); + return result; + } +}; + +//-------------------------------------------------------------------- + +/** @brief The implementation of the "groupBy" filter */ +class FilterGroupBy +{ + struct ListElem + { + ListElem(const QCString &k,const TemplateVariant &v) : key(k), value(v) {} + QCString key; + TemplateVariant value; + }; + class SortList : public QList<ListElem> + { + public: + SortList() { setAutoDelete(TRUE); } + private: + int compareValues(const ListElem *item1,const ListElem *item2) const + { + return qstrcmp(item1->key,item2->key); + } + }; + public: + static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &args) + { + if (v.type()==TemplateVariant::List && args.type()==TemplateVariant::String) + { + //printf("FilterListSort::apply: v=%s args=%s\n",v.toString().data(),args.toString().data()); + TemplateListIntf::ConstIterator *it = v.toList()->createIterator(); + + TemplateVariant item; + TemplateList *result = TemplateList::alloc(); + + // create list of items based on v using the data in args as a sort key + SortList sortList; + for (it->toFirst();(it->current(item));it->toNext()) + { + TemplateStructIntf *s = item.toStruct(); + if (s) + { + QCString sortKey = determineSortKey(s,args.toString()); + sortList.append(new ListElem(sortKey,item)); + //printf("sortKey=%s\n",sortKey.data()); + } + } + delete it; + + // sort the list + sortList.sort(); + + // add sorted items to the result list + QListIterator<ListElem> sit(sortList); + ListElem *elem; + TemplateList *groupList=0; + QCString prevKey; + for (sit.toFirst();(elem=sit.current());++sit) + { + if (groupList==0 || elem->key!=prevKey) + { + groupList = TemplateList::alloc(); + result->append(groupList); + prevKey = elem->key; + } + groupList->append(elem->value); + } + return result; + } + return v; + } + + private: + static QCString determineSortKey(TemplateStructIntf *s,const QCString &attribName) + { + TemplateVariant v = s->get(attribName); + return v.toString(); + } +}; + +//-------------------------------------------------------------------- + +/** @brief The implementation of the "paginate" filter */ +class FilterPaginate +{ + public: + static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &args) + { + if (v.isValid() && v.type()==TemplateVariant::List && + args.isValid() && args.type()==TemplateVariant::Integer) + { + int pageSize = args.toInt(); + TemplateListIntf *list = v.toList(); + TemplateList *result = TemplateList::alloc(); + TemplateListIntf::ConstIterator *it = list->createIterator(); + TemplateVariant item; + TemplateList *pageList=0; + int i = 0; + for (it->toFirst();(it->current(item));it->toNext()) + { + if (pageList==0) + { + pageList = TemplateList::alloc(); + result->append(pageList); + } + pageList->append(item); + i++; + if (i==pageSize) // page is full start a new one + { + pageList=0; + i=0; + } + } + delete it; + return result; + } + else // wrong arguments + { + return v; + } + } +}; + +//-------------------------------------------------------------------- + +/** @brief The implementation of the "alphaIndex" filter */ +class FilterAlphaIndex +{ + private: + struct ListElem + { + ListElem(uint k,const TemplateVariant &v) : key(k), value(v) {} + uint key; + TemplateVariant value; + }; + class SortList : public QList<ListElem> + { + public: + SortList() { setAutoDelete(TRUE); } + private: + int compareValues(const ListElem *item1,const ListElem *item2) const + { + return item1->key-item2->key; + } + }; + static QCString keyToLetter(uint startLetter) + { + return QString(QChar(startLetter)).utf8(); + } + static QCString keyToLabel(uint startLetter) + { + char s[10]; + if (startLetter>0x20 && startLetter<=0x7f) // printable ASCII character + { + s[0]=tolower((char)startLetter); + s[1]=0; + } + else + { + const char hex[]="0123456789abcdef"; + int i=0; + s[i++]='0'; + s[i++]='x'; + if (startLetter>(1<<24)) // 4 byte character + { + s[i++]=hex[(startLetter>>28)&0xf]; + s[i++]=hex[(startLetter>>24)&0xf]; + } + if (startLetter>(1<<16)) // 3 byte character + { + s[i++]=hex[(startLetter>>20)&0xf]; + s[i++]=hex[(startLetter>>16)&0xf]; + } + if (startLetter>(1<<8)) // 2 byte character + { + s[i++]=hex[(startLetter>>12)&0xf]; + s[i++]=hex[(startLetter>>8)&0xf]; + } + // one byte character + s[i++]=hex[(startLetter>>4)&0xf]; + s[i++]=hex[(startLetter>>0)&0xf]; + s[i++]=0; + } + return s; + } + static uint determineSortKey(TemplateStructIntf *s,const QCString &attribName) + { + TemplateVariant v = s->get(attribName); + int index = getPrefixIndex(v.toString()); + return getUtf8CodeToUpper(v.toString(),index); + } + + public: + static TemplateVariant apply(const TemplateVariant &v,const TemplateVariant &args) + { + if (v.type()==TemplateVariant::List && args.type()==TemplateVariant::String) + { + //printf("FilterListSort::apply: v=%s args=%s\n",v.toString().data(),args.toString().data()); + TemplateListIntf::ConstIterator *it = v.toList()->createIterator(); + + TemplateVariant item; + TemplateList *result = TemplateList::alloc(); + + // create list of items based on v using the data in args as a sort key + SortList sortList; + for (it->toFirst();(it->current(item));it->toNext()) + { + TemplateStructIntf *s = item.toStruct(); + if (s) + { + uint sortKey = determineSortKey(s,args.toString()); + sortList.append(new ListElem(sortKey,item)); + //printf("sortKey=%s\n",sortKey.data()); + } + } + delete it; + + // sort the list + sortList.sort(); + + // create an index from the sorted list + uint letter=0; + QListIterator<ListElem> sit(sortList); + ListElem *elem; + TemplateStruct *indexNode = 0; + TemplateList *indexList = 0; + for (sit.toFirst();(elem=sit.current());++sit) + { + if (letter!=elem->key || indexNode==0) + { + // create new indexNode + indexNode = TemplateStruct::alloc(); + indexList = TemplateList::alloc(); + indexNode->set("letter", keyToLetter(elem->key)); + indexNode->set("label", keyToLabel(elem->key)); + indexNode->set("items",indexList); + result->append(indexNode); + letter=elem->key; + } + indexList->append(elem->value); + } + return result; + } + return v; + } +}; + +//-------------------------------------------------------------------- + /** @brief The implementation of the "default" filter */ class FilterStripPath { @@ -923,12 +1380,18 @@ class TemplateFilterFactory // register a handlers for each filter we support static TemplateFilterFactory::AutoRegister<FilterAdd> fAdd("add"); -static TemplateFilterFactory::AutoRegister<FilterAdd> fAppend("append"); +static TemplateFilterFactory::AutoRegister<FilterGet> fGet("get"); +static TemplateFilterFactory::AutoRegister<FilterAppend> fAppend("append"); static TemplateFilterFactory::AutoRegister<FilterLength> fLength("length"); static TemplateFilterFactory::AutoRegister<FilterNoWrap> fNoWrap("nowrap"); +static TemplateFilterFactory::AutoRegister<FilterFlatten> fFlatten("flatten"); static TemplateFilterFactory::AutoRegister<FilterDefault> fDefault("default"); static TemplateFilterFactory::AutoRegister<FilterPrepend> fPrepend("prepend"); +static TemplateFilterFactory::AutoRegister<FilterGroupBy> fGroupBy("groupBy"); +static TemplateFilterFactory::AutoRegister<FilterListSort> fListSort("listsort"); +static TemplateFilterFactory::AutoRegister<FilterPaginate> fPaginate("paginate"); static TemplateFilterFactory::AutoRegister<FilterStripPath> fStripPath("stripPath"); +static TemplateFilterFactory::AutoRegister<FilterAlphaIndex> fAlphaIndex("alphaIndex"); static TemplateFilterFactory::AutoRegister<FilterDivisibleBy> fDivisibleBy("divisibleby"); //-------------------------------------------------------------------- @@ -2032,6 +2495,24 @@ void TemplateContextImpl::closeSubIndex(const QCString &indexName) } } +static void getPathListFunc(TemplateStructIntf *entry,TemplateList *list) +{ + TemplateVariant parent = entry->get("parent"); + if (parent.type()==TemplateVariant::Struct) + { + getPathListFunc(parent.toStruct(),list); + } + list->append(entry); +} + +static TemplateVariant getPathFunc(const void *ctx, const QValueList<TemplateVariant> &) +{ + TemplateStruct *entry = (TemplateStruct*)ctx; + TemplateList *result = TemplateList::alloc(); + getPathListFunc(entry,result); + return result; +} + void TemplateContextImpl::addIndexEntry(const QCString &indexName,const QValueList<TemplateKeyValue> &arguments) { QValueListConstIterator<TemplateKeyValue> it = arguments.begin(); @@ -2041,6 +2522,7 @@ void TemplateContextImpl::addIndexEntry(const QCString &indexName,const QValueLi // printf(" key=%s value=%s\n",(*it).key.data(),(*it).value.toString().data()); // ++it; //} + TemplateVariant parent(FALSE); QStack<TemplateVariant> *stack = m_indexStacks.find(indexName); if (!stack) // no stack yet, create it! { @@ -2066,6 +2548,13 @@ void TemplateContextImpl::addIndexEntry(const QCString &indexName,const QValueLi { ASSERT(stack->top()->type()==TemplateVariant::List); } + if (stack->count()>1) + { + TemplateVariant *tmp = stack->pop(); + parent = *stack->top(); + stack->push(tmp); + ASSERT(parent.type()==TemplateVariant::Struct); + } // get list to add new item list = dynamic_cast<TemplateList*>(stack->top()->toList()); } @@ -2082,6 +2571,9 @@ void TemplateContextImpl::addIndexEntry(const QCString &indexName,const QValueLi } entry->set("is_leaf_node",true); entry->set("first",list->count()==0); + entry->set("index",list->count()); + entry->set("parent",parent); + entry->set("path",TemplateVariant::Delegate::fromFunction(entry,getPathFunc)); entry->set("last",true); stack->push(new TemplateVariant(entry)); list->append(entry); @@ -2603,6 +3095,10 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor> if (m_expr) { TemplateVariant v = m_expr->resolve(c); + if (v.type()==TemplateVariant::Function) + { + v = v.call(QValueList<TemplateVariant>()); + } const TemplateListIntf *list = v.toList(); if (list) { @@ -2662,7 +3158,7 @@ class TemplateNodeFor : public TemplateNodeCreator<TemplateNodeFor> } else // simple type... { - ci->warn(m_templateName,m_line,"for requires a variable of list type!"); + ci->warn(m_templateName,m_line,"for requires a variable of list type, got type '%s'!",v.typeAsString().data()); } } } @@ -2970,6 +3466,25 @@ class TemplateNodeCreate : public TemplateNodeCreator<TemplateNodeCreate> delete m_templateExpr; delete m_fileExpr; } + void mkpath(TemplateContextImpl *ci,const QCString &fileName) + { + int i=fileName.find('/'); + QCString outputDir = ci->outputDirectory(); + QDir d(outputDir); + int j=0; + while (i!=-1) // fileName contains path part + { + if (d.exists()) + { + bool ok = d.mkdir(fileName.mid(j,i-j)); + if (!ok) break; + QCString dirName = outputDir+'/'+fileName.left(i); + d = QDir(dirName); + j = i+1; + } + i=fileName.find('/',i+1); + } + } void render(FTextStream &, TemplateContext *c) { TemplateContextImpl* ci = dynamic_cast<TemplateContextImpl*>(c); @@ -2995,6 +3510,7 @@ class TemplateNodeCreate : public TemplateNodeCreator<TemplateNodeCreate> TemplateImpl *createTemplate = ct ? dynamic_cast<TemplateImpl*>(ct) : 0; if (createTemplate) { + //mkpath(ci,outputFile); QCString extension=outputFile; int i=extension.findRev('.'); if (i!=-1) @@ -3315,7 +3831,7 @@ class TemplateNodeWith : public TemplateNodeCreator<TemplateNodeWith> } else { - parser->warn(parser->templateName(),line,"invalid argument '%s' for with tag",arg.data()); + parser->warn(parser->templateName(),line,"invalid argument '%s' for 'with' tag",arg.data()); } ++it; } @@ -3422,47 +3938,35 @@ class TemplateNodeSet : public TemplateNodeCreator<TemplateNodeSet> }; public: TemplateNodeSet(TemplateParser *parser,TemplateNode *parent,int line,const QCString &data) - : TemplateNodeCreator<TemplateNodeSet>(parser,parent,line) + : TemplateNodeCreator<TemplateNodeSet>(parser,parent,line), m_mapping(0) { TRACE(("{TemplateNodeSet(%s)\n",data.data())); - m_args.setAutoDelete(TRUE); ExpressionParser expParser(parser,line); - QValueList<QCString> args = split(data," "); - QValueListIterator<QCString> it = args.begin(); - while (it!=args.end()) + // data format: name=expression + int j=data.find('='); + ExprAst *expr = 0; + if (j>0 && (expr = expParser.parse(data.mid(j+1)))) { - QCString arg = *it; - int j=arg.find('='); - if (j>0) - { - ExprAst *expr = expParser.parse(arg.mid(j+1)); - if (expr) - { - m_args.append(new Mapping(arg.left(j),expr)); - } - } - else - { - parser->warn(parser->templateName(),line,"invalid argument '%s' for with tag",arg.data()); - } - ++it; + m_mapping = new Mapping(data.left(j),expr); } TRACE(("}TemplateNodeSet(%s)\n",data.data())); } + ~TemplateNodeSet() + { + delete m_mapping; + } void render(FTextStream &, TemplateContext *c) { TemplateContextImpl *ci = dynamic_cast<TemplateContextImpl*>(c); ci->setLocation(m_templateName,m_line); - QListIterator<Mapping> it(m_args); - Mapping *mapping; - for (it.toFirst();(mapping=it.current());++it) + if (m_mapping) { - TemplateVariant value = mapping->value->resolve(c); - ci->set(mapping->name,value); + TemplateVariant value = m_mapping->value->resolve(c); + ci->set(m_mapping->name,value); } } private: - QList<Mapping> m_args; + Mapping *m_mapping; }; //---------------------------------------------------------- @@ -4263,6 +4767,11 @@ TemplateContext *TemplateEngine::createContext() const return new TemplateContextImpl(this); } +void TemplateEngine::destroyContext(TemplateContext *ctx) +{ + delete ctx; +} + Template *TemplateEngine::loadByName(const QCString &fileName,int line) { return p->loadByName(fileName,line); diff --git a/src/template.h b/src/template.h index cb4a96f..ef9792c 100644 --- a/src/template.h +++ b/src/template.h @@ -1,3 +1,18 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2014 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + #ifndef TEMPLATE_H #define TEMPLATE_H @@ -126,6 +141,9 @@ class TemplateVariant /** Returns the type of the value stored in the variant */ Type type() const; + /** Return a string representation of the type of the value stored in the variant */ + QCString typeAsString() const; + /** Returns TRUE if the variant holds a valid value, or FALSE otherwise */ bool isValid() const; @@ -388,6 +406,8 @@ class TemplateSpacelessIntf public: /** Returns the \a input after removing redundant whitespace */ virtual QCString remove(const QCString &input) = 0; + /** Reset filter state */ + virtual void reset() = 0; }; //------------------------------------------------------------------------ @@ -485,6 +505,11 @@ class TemplateEngine */ TemplateContext *createContext() const; + /** Destroys a context created via createContext(). + * @param[in] ctx The context. + */ + void destroyContext(TemplateContext *ctx); + /** Creates a new template whole contents are in a file. * @param[in] fileName The name of the file containing the * template data diff --git a/src/translator_en.h b/src/translator_en.h index ca0a151..5937ed3 100644 --- a/src/translator_en.h +++ b/src/translator_en.h @@ -1224,7 +1224,7 @@ class TranslatorEnglish : public Translator */ virtual QCString trGroup(bool first_capital, bool singular) { - QCString result((first_capital ? "Group" : "group")); + QCString result((first_capital ? "Module" : "module")); if (!singular) result+="s"; return result; } diff --git a/src/util.cpp b/src/util.cpp index fecf632..a524922 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1667,10 +1667,11 @@ QCString removeRedundantWhiteSpace(const QCString &s) uint l=s.length(); uint csp=0; uint vsp=0; + char c; for (i=0;i<l;i++) { nextChar: - char c=s.at(i); + c=s.at(i); // search for "const" if (csp<6 && c==constScope[csp] && // character matches substring "const" @@ -1705,7 +1706,7 @@ nextChar: if (cc=='\\') // escaped character { growBuf.addChar(s.at(i+1)); - i+=2; + i+=2; } else if (cc=='"') // end of string { i++; goto nextChar; } @@ -1737,14 +1738,16 @@ nextChar: growBuf.addChar(','); growBuf.addChar(' '); } - else if (i>0 && - ((isId(s.at(i)) && s.at(i-1)==')') || - (s.at(i)=='\'' && s.at(i-1)==' ') + else if (i>0 && + ( + (s.at(i-1)==')' && isId(c)) + || + (c=='\'' && s.at(i-1)==' ') ) ) { growBuf.addChar(' '); - growBuf.addChar(s.at(i)); + growBuf.addChar(c); } else if (c=='t' && csp==5 /*&& (i<5 || !isId(s.at(i-5)))*/ && !(isId(s.at(i+1)) /*|| s.at(i+1)==' '*/ || @@ -1798,8 +1801,9 @@ nextChar: ) ) { + if (c=='\t') c=' '; if (c=='*' || c=='&' || c=='@' || c=='$') - { + { //uint rl=result.length(); uint rl=growBuf.getPos(); if ((rl>0 && (isId(growBuf.at(rl-1)) || growBuf.at(rl-1)=='>')) && @@ -1827,8 +1831,8 @@ nextChar: } } } - //printf("removeRedundantWhiteSpace(`%s')=`%s'\n",s.data(),result.data()); growBuf.addChar(0); + //printf("removeRedundantWhiteSpace(`%s')=`%s'\n",s.data(),growBuf.get()); //result.resize(resultPos); return growBuf.get(); } @@ -1837,7 +1841,7 @@ nextChar: * Returns the position in the string where a function parameter list * begins, or -1 if one is not found. */ -int findParameterList(const QString &name) +int findParameterList(const QCString &name) { int pos=-1; int templateDepth=0; @@ -1874,7 +1878,8 @@ int findParameterList(const QString &name) else { int bp = bracePos>0 ? name.findRev('(',bracePos-1) : -1; - return bp==-1 ? bracePos : bp; + // bp test is to allow foo(int(&)[10]), but we need to make an exception for operator() + return bp==-1 || (bp>=8 && name.mid(bp-8,10)=="operator()") ? bracePos : bp; } } } while (pos!=-1); @@ -5364,10 +5369,10 @@ void createSubDirs(QDir &d) int l1,l2; for (l1=0;l1<16;l1++) { - d.mkdir(QString().sprintf("d%x",l1)); + d.mkdir(QCString().sprintf("d%x",l1)); for (l2=0;l2<256;l2++) { - d.mkdir(QString().sprintf("d%x/d%02x",l1,l2)); + d.mkdir(QCString().sprintf("d%x/d%02x",l1,l2)); } } } @@ -5600,6 +5605,11 @@ QCString convertToXML(const char *s) case '&': growBuf.addStr("&"); break; case '\'': growBuf.addStr("'"); break; case '"': growBuf.addStr("""); break; + case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: + case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: + case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: + case 27: case 28: case 29: case 30: case 31: + break; // skip invalid XML characters (see http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char) default: growBuf.addChar(c); break; } } @@ -6348,26 +6358,42 @@ void addRefItem(const QList<ListItemInfo> *sli, } } -void addGroupListToTitle(OutputList &ol,Definition *d) +bool recursivelyAddGroupListToTitle(OutputList &ol,Definition *d,bool root) { GroupList *groups = d->partOfGroups(); if (groups) // write list of group to which this definition belongs { - ol.pushGeneratorState(); - ol.disableAllBut(OutputGenerator::Html); - ol.writeString("<div class=\"ingroups\">"); + if (root) + { + ol.pushGeneratorState(); + ol.disableAllBut(OutputGenerator::Html); + ol.writeString("<div class=\"ingroups\">"); + } GroupListIterator gli(*groups); GroupDef *gd; - bool first=TRUE; + bool first=true; for (gli.toFirst();(gd=gli.current());++gli) { - if (!first) { ol.writeString(" | "); } else first=FALSE; - ol.writeObjectLink(gd->getReference(), - gd->getOutputFileBase(),0,gd->groupTitle()); + if (recursivelyAddGroupListToTitle(ol, gd, FALSE)) + { + ol.writeString(" » "); + } + if (!first) { ol.writeString(" | "); } else first=FALSE; + ol.writeObjectLink(gd->getReference(),gd->getOutputFileBase(),0,gd->groupTitle()); + } + if (root) + { + ol.writeString("</div>"); + ol.popGeneratorState(); } - ol.writeString("</div>"); - ol.popGeneratorState(); + return true; } + return false; +} + +void addGroupListToTitle(OutputList &ol,Definition *d) +{ + recursivelyAddGroupListToTitle(ol,d,TRUE); } void filterLatexString(FTextStream &t,const char *str, @@ -6699,15 +6725,37 @@ void initDefaultExtensionMapping() { g_extLookup.setAutoDelete(TRUE); // extension parser id - updateLanguageMapping(".idl", "idl"); - updateLanguageMapping(".ddl", "idl"); - updateLanguageMapping(".odl", "idl"); + updateLanguageMapping(".dox", "c"); + updateLanguageMapping(".txt", "c"); + updateLanguageMapping(".doc", "c"); + updateLanguageMapping(".c", "c"); + updateLanguageMapping(".C", "c"); + updateLanguageMapping(".cc", "c"); + updateLanguageMapping(".CC", "c"); + updateLanguageMapping(".cxx", "c"); + updateLanguageMapping(".cpp", "c"); + updateLanguageMapping(".c++", "c"); + updateLanguageMapping(".ii", "c"); + updateLanguageMapping(".ixx", "c"); + updateLanguageMapping(".ipp", "c"); + updateLanguageMapping(".i++", "c"); + updateLanguageMapping(".inl", "c"); + updateLanguageMapping(".h", "c"); + updateLanguageMapping(".H", "c"); + updateLanguageMapping(".hh", "c"); + updateLanguageMapping(".HH", "c"); + updateLanguageMapping(".hxx", "c"); + updateLanguageMapping(".hpp", "c"); + updateLanguageMapping(".h++", "c"); + updateLanguageMapping(".idl", "idl"); + updateLanguageMapping(".ddl", "idl"); + updateLanguageMapping(".odl", "idl"); updateLanguageMapping(".java", "java"); - updateLanguageMapping(".as", "javascript"); + updateLanguageMapping(".as", "javascript"); updateLanguageMapping(".js", "javascript"); updateLanguageMapping(".cs", "csharp"); updateLanguageMapping(".d", "d"); - updateLanguageMapping(".php", "php"); + updateLanguageMapping(".php", "php"); updateLanguageMapping(".php4", "php"); updateLanguageMapping(".php5", "php"); updateLanguageMapping(".inc", "php"); @@ -8221,3 +8269,11 @@ void convertProtectionLevel( // inListType,inProt,*outListType1,*outListType2); } +bool mainPageHasTitle() +{ + if (Doxygen::mainPage==0) return FALSE; + if (Doxygen::mainPage->title().isEmpty()) return FALSE; + if (Doxygen::mainPage->title().lower()=="notitle") return FALSE; + return TRUE; +} + @@ -456,5 +456,7 @@ void convertProtectionLevel( int *outListType2 ); +bool mainPageHasTitle(); + #endif diff --git a/src/vhdlcode.l b/src/vhdlcode.l index d8586ab..fa199d1 100644 --- a/src/vhdlcode.l +++ b/src/vhdlcode.l @@ -1576,6 +1576,8 @@ void parseVhdlCode(CodeOutputInterface &od,const char *className,const QCString // g_args.resize(0); g_parmName.resize(0); g_parmType.resize(0); + if(!g_lexInit) + VhdlDocGen::init(); if (memberDef) { setParameterList(memberDef); diff --git a/src/vhdldocgen.cpp b/src/vhdldocgen.cpp index 4ff5f9d..0617ea6 100644 --- a/src/vhdldocgen.cpp +++ b/src/vhdldocgen.cpp @@ -28,9 +28,9 @@ #include <qfileinfo.h> #include <qstringlist.h> -#ifdef DEBUGFLOW +//#ifdef DEBUGFLOW #include <qmap.h> -#endif +//#endif /* --------------------------------------------------------------- */ @@ -47,7 +47,7 @@ #include "searchindex.h" #include "outputlist.h" #include "parserintf.h" -#include "vhdlscanner.h" + #include "layout.h" #include "arguments.h" #include "portable.h" @@ -58,12 +58,18 @@ #include "namespacedef.h" #include "filename.h" #include "membergroup.h" +#include "memberdef.h" + +#include "vhdljjparser.h" +#include "VhdlParser.h" +#include "vhdlcode.h" #define theTranslator_vhdlType VhdlDocGen::trVhdlType static QDict<QCString> g_vhdlKeyDict0(17,FALSE); static QDict<QCString> g_vhdlKeyDict1(17,FALSE); static QDict<QCString> g_vhdlKeyDict2(17,FALSE); +static QDict<QCString> g_vhdlKeyDict3(17,FALSE); static QDict<QCString> g_xilinxUcfDict(17,FALSE); static void initUCF(Entry* root,const char* type,QCString & qcs,int line,QCString & fileName,QCString & brief); @@ -71,7 +77,7 @@ static void writeUCFLink(const MemberDef* mdef,OutputList &ol); static void assignBinding(VhdlConfNode* conf); static void addInstance(ClassDef* entity, ClassDef* arch, ClassDef *inst,Entry *cur,ClassDef* archBind=NULL); -//---------- create svg ------------------------------------------------------------- +//---------- create svg ------------------------------------------------------------- static void createSVG(); static void startDot(FTextStream &t); static void startTable(FTextStream &t,const QCString &className); @@ -93,7 +99,7 @@ void VhdlDocGen::setFlowMember( const MemberDef* mem) const MemberDef* VhdlDocGen::getFlowMember() { return flowMember; -} +} @@ -101,7 +107,7 @@ const MemberDef* VhdlDocGen::getFlowMember() static void codify(FTextStream &t,const char *str) { if (str) - { + { const char *p=str; char c; while (*p) @@ -109,17 +115,17 @@ static void codify(FTextStream &t,const char *str) c=*p++; switch(c) { - case '<': t << "<"; + case '<': t << "<"; break; - case '>': t << ">"; + case '>': t << ">"; break; - case '&': t << "&"; + case '&': t << "&"; break; case '\'': t << "'"; break; - case '"': t << """; + case '"': t << """; break; - default: t << c; + default: t << c; break; } } @@ -167,8 +173,7 @@ static void createSVG() QRegExp ep("[\\s]"); QCString vlargs="-Tsvg \""+ov+"\" "+dir ; - QCString dotExe = Config_getString("DOT_PATH")+"dot"; - if (portable_system(dotExe,vlargs)!=0) + if (portable_system("dot",vlargs)!=0) { err("could not create dot file"); } @@ -214,7 +219,7 @@ void VhdlDocGen::writeOverview() } QList<MemberDef>* port= getPorts(cd); - if (port==0) + if (port==0) { continue; } @@ -241,7 +246,7 @@ void VhdlDocGen::writeOverview() BaseClassDef *bcd; for ( ; (bcd=bcli.current()) ; ++bcli ) { - ClassDef *bClass=bcd->classDef; + ClassDef *bClass=bcd->classDef; QCString dotn=cd->name()+":"; dotn+=cd->name(); QCString csc=bClass->name()+":"; @@ -262,7 +267,7 @@ void VhdlDocGen::writeOverview() static void startDot(FTextStream &t) { - t << " digraph G { \n"; + t << " digraph G { \n"; t << "rankdir=LR \n"; t << "concentrate=TRUE\n"; t << "stylesheet=\"doxygen.css\"\n"; @@ -270,12 +275,12 @@ static void startDot(FTextStream &t) static void endDot(FTextStream &t) { - t <<" } \n"; + t <<" } \n"; } static void startTable(FTextStream &t,const QCString &className) { - t << className <<" [ shape=none , fontname=\"arial\", fontcolor=\"blue\" , \n"; + t << className <<" [ shape=none , fontname=\"arial\", fontcolor=\"blue\" , \n"; t << "label=<<TABLE BORDER=\"0\" CELLBORDER=\"1\" CELLSPACING=\"0\">\n"; } @@ -294,7 +299,7 @@ static void writeVhdlDotLink(FTextStream &t, static QCString formatBriefNote(const QCString &brief,ClassDef * cd) { QRegExp ep("[\n]"); - QCString vForm; + QCString vForm; QCString repl("<BR ALIGN=\"LEFT\"/>"); QCString file=cd->getDefFileName(); @@ -346,7 +351,7 @@ static void writeVhdlEntityToolTip(FTextStream& t,ClassDef *cd) QCString brief=cd->briefDescription(); - if (brief.isEmpty()) return; + if (brief.isEmpty()) return; brief=formatBriefNote(brief,cd); @@ -379,10 +384,10 @@ static void writeColumn(FTextStream &t,MemberDef *md,bool start) largs=largs.replace(reg," "); toolTip+=" ["; toolTip+=largs; - toolTip+="]"; + toolTip+="]"; } } - if (start) + if (start) { t <<"<TR>\n"; } @@ -396,11 +401,15 @@ static void writeColumn(FTextStream &t,MemberDef *md,bool start) t<<"\" "; t<<" TOOLTIP=\""; - if(!toolTip.isEmpty()) + if (!toolTip.isEmpty()) + { codify(t,toolTip.data()); - else{ + } + else + { QCString largs = md->argsString(); - if(!largs.isEmpty()){ + if (!largs.isEmpty()) + { largs=largs.replace(reg," "); codify(t,largs.data()); } @@ -413,7 +422,7 @@ static void writeColumn(FTextStream &t,MemberDef *md,bool start) } if (!toolTip.isEmpty()) { - // if (!toolTip.isEmpty()) + // if (!toolTip.isEmpty()) if (bidir) t << "BGCOLOR=\"orange\">"; @@ -447,7 +456,7 @@ static void writeColumn(FTextStream &t,MemberDef *md,bool start) static void endTabel(FTextStream &t) { t << "</TABLE>>\n"; - t << "] \n"; + t << "] \n"; } static void writeClassToDot(FTextStream &t,ClassDef* cd) @@ -461,7 +470,7 @@ static void writeClassToDot(FTextStream &t,ClassDef* cd) t << "\" "; t << ">"; t << cd->name(); - t << " </TD></TR>\n"; + t << " </TD></TR>\n"; } static QList<MemberDef>* getPorts(ClassDef *cd) @@ -480,7 +489,7 @@ static QList<MemberDef>* getPorts(ClassDef *cd) { portList->append(md); } - } + } return portList; } @@ -515,7 +524,7 @@ static void writeTable(QList<MemberDef>* port,FTextStream & t) int outp = outPorts.count(); int maxLen; - if (inp>=outp) + if (inp>=outp) { maxLen=inp; } @@ -547,7 +556,7 @@ static void writeTable(QList<MemberDef>* port,FTextStream & t) { writeColumn(t,NULL,FALSE); } - } + } } //-------------------------------------------------------------------------------------------------- @@ -590,6 +599,7 @@ const char* g_vhdlKeyWordMap0[] = 0 }; + // type const char* g_vhdlKeyWordMap1[] = { @@ -605,12 +615,21 @@ const char* g_vhdlKeyWordMap2[] = "sll",0 }; +// predefined attributes +const char* g_vhdlKeyWordMap3[] = +{ +"base","left","right","high","low","ascending", +"image","value","pos","val","succ","pred","leftof","rightof","left","right","high","low", +"range","reverse_range","length","ascending","delayed","stable","quiet","transaction","event", +"active","last_event","last_active","last_value","driving","driving_value","simple_name","instance_name","path_name",0 +}; + int j=0; g_vhdlKeyDict0.setAutoDelete(TRUE); g_vhdlKeyDict1.setAutoDelete(TRUE); g_vhdlKeyDict2.setAutoDelete(TRUE); + g_vhdlKeyDict3.setAutoDelete(TRUE); - j=0; while (g_vhdlKeyWordMap0[j]) { g_vhdlKeyDict0.insert(g_vhdlKeyWordMap0[j], @@ -634,28 +653,42 @@ const char* g_vhdlKeyWordMap2[] = j++; } + j=0; + while (g_vhdlKeyWordMap3[j]) + { + g_vhdlKeyDict3.insert(g_vhdlKeyWordMap3[j], + new QCString(g_vhdlKeyWordMap3[j])); + j++; + } + }// buildKeyMap /*! * returns the color of a keyword */ -QCString* VhdlDocGen::findKeyWord(const QCString& word) +QCString* VhdlDocGen::findKeyWord(const QCString& tmp) { - static QCString g_vhdlkeyword("vhdlkeyword"); - static QCString g_vhdltype("comment"); - static QCString g_vhdllogic("vhdllogic"); + static QCString vhdlkeyword("vhdlkeyword"); + static QCString vhdltype("comment"); + static QCString vhdllogic("vhdllogic"); + static QCString preprocessor("keywordflow"); + + QCString word=tmp.lower(); if (word.isEmpty() || word.at(0)=='\0') return 0; - - if (g_vhdlKeyDict0.find(word.lower())) - return &g_vhdlkeyword; - if (g_vhdlKeyDict1.find(word.lower())) - return &g_vhdltype; + if (g_vhdlKeyDict0.find(word)) + return &preprocessor; + + if (g_vhdlKeyDict1.find(word)) + return &vhdltype; - if (g_vhdlKeyDict2.find(word.lower())) - return &g_vhdllogic; + if (g_vhdlKeyDict2.find(word)) + return &vhdllogic; + + if (g_vhdlKeyDict3.find(word)) + return &vhdlkeyword; return 0; } @@ -681,11 +714,13 @@ ClassDef* VhdlDocGen::getPackageName(const QCString & name) return cd; } +static QMap<QCString,MemberDef*> varMap; +static QList<ClassDef> qli; +static QMap<ClassDef*,QList<ClassDef> > packages; + MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& memName) { - QDict<QCString> packages(17,FALSE); - packages.setAutoDelete(TRUE); - ClassDef* cd; + ClassDef* cd,*ecd; MemberDef *mdef=0; cd=getClass(className); @@ -707,7 +742,7 @@ MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& mem // searching upper/lower case names QCString tt=d->name(); - ClassDef *ecd =getClass(tt); + ecd =getClass(tt); if (!ecd) { tt=tt.upper(); @@ -727,12 +762,9 @@ MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& mem mdef=VhdlDocGen::findMemberDef(cd,memName,MemberListType_pubMethods); if (mdef) return mdef; } - //cd=getClass(getClassName(cd)); - //if (!cd) return 0; - } - // nothing found , so we are now searching all included packages - VhdlDocGen::findAllPackages(className,packages); - //cd=getClass(className.data()); + } + + if ((VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::ARCHITECTURECLASS || (VhdlDocGen::VhdlClasses)cd->protection()==VhdlDocGen::PACKBODYCLASS) { @@ -750,60 +782,88 @@ MemberDef* VhdlDocGen::findMember(const QCString& className, const QCString& mem tt=tt.lower(); ecd =getClass(tt); } - if (ecd) //d && d->definitionType()==Definition::TypeClass) { - VhdlDocGen::findAllPackages(ecd->className(),packages); + if(!packages.contains(ecd)) + { + VhdlDocGen::findAllPackages(ecd); + } } } + else + { + ecd=cd; + if (!packages.contains(ecd)) VhdlDocGen::findAllPackages(ecd); + } - QDictIterator<QCString> packli(packages); - QCString *curString; - for (packli.toFirst();(curString=packli.current());++packli) + uint len=packages.count(); + for (uint j=0;j<len;j++) { - if (curString) + for (QMap<ClassDef*,QList<ClassDef> >::Iterator cList=packages.begin();cList != packages.end();cList++) { - cd=VhdlDocGen::getPackageName(*curString); - if (!cd) + if (cList.key()==0) continue; + QList<ClassDef> mlist=cList.data(); + for (uint j=0;j<mlist.count();j++) { - *curString=curString->upper(); - cd=VhdlDocGen::getPackageName(*curString); + mdef=VhdlDocGen::findMemberDef(mlist.at(j),memName,MemberListType_variableMembers); + if (mdef) return mdef; + mdef=VhdlDocGen::findMemberDef(mlist.at(j),memName,MemberListType_pubMethods); + if (mdef) return mdef; } - if (!cd) - { - *curString=curString->lower(); - cd=VhdlDocGen::getPackageName(*curString); - } - } - if (cd) - { - mdef=VhdlDocGen::findMemberDef(cd,memName,MemberListType_variableMembers); - if (mdef) return mdef; - mdef=VhdlDocGen::findMemberDef(cd,memName,MemberListType_pubMethods); - if (mdef) return mdef; } - } // for + } return 0; + }//findMember /** * This function returns the entity|package * in which the key (type) is found */ - MemberDef* VhdlDocGen::findMemberDef(ClassDef* cd,const QCString& key,MemberListType type) { - // return cd->getMemberByName(key);//does not work MemberDef *md=0; + MemberList *ml=0; + QCString keyType=cd->symbolName()+"@"+key; + //printf("\n %s | %s | %s",cd->symbolName().data(),key.data(,),keyType.data()); - MemberList *ml= cd->getMemberList(type); - if (ml==0) return 0; - + QMap<QCString, MemberDef*>::Iterator it =varMap.find(keyType); + if (it.key()) + { + md=it.data(); + if (md) + { + return md; + } + } + if (qli.contains(cd)) + { + return 0; + } + ml=cd->getMemberList(type); + qli.append(cd); + if (!ml) + { + return 0; + } MemberListIterator fmni(*ml); + //int l=ml->count(); + // fprintf(stderr,"\n loading enity %s %s: %d",cd->symbolName().data(),keyType.data(),l); for (fmni.toFirst();(md=fmni.current());++fmni) { - if (qstricmp(key,md->name())==0) + QCString tkey=cd->symbolName()+"@"+md->name(); + if (varMap.contains(tkey)) + { + continue; + } + varMap.insert(tkey.data(),md); + } + it=varMap.find(keyType.data()); + if (it.key()) + { + md=it.data(); + if (md) { return md; } @@ -815,42 +875,30 @@ MemberDef* VhdlDocGen::findMemberDef(ClassDef* cd,const QCString& key,MemberList * finds all included packages of an Entity or Package */ -void VhdlDocGen::findAllPackages(const QCString& className,QDict<QCString>& qdict) +void VhdlDocGen::findAllPackages( ClassDef *cdef) { - ClassDef *cdef=getClass(className); - if (cdef) - { - MemberList *mem=cdef->getMemberList(MemberListType_variableMembers); - MemberDef *md; + QList<ClassDef> cList; + if (packages.contains(cdef)) return; + MemberList *mem=cdef->getMemberList(MemberListType_variableMembers); + MemberDef *md; - if (mem) + if (!mem) return; + + MemberListIterator fmni(*mem); + for (fmni.toFirst();(md=fmni.current());++fmni) + { + if (VhdlDocGen::isPackage(md)) { - MemberListIterator fmni(*mem); - for (fmni.toFirst();(md=fmni.current());++fmni) + ClassDef* cd=VhdlDocGen::getPackageName(md->name()); + if (cd) { - if (VhdlDocGen::isPackage(md)) - { - QCString *temp1=new QCString(md->name().data()); - //*temp1=temp1->lower(); - QCString p(md->name().data()); - //p=p.lower(); - ClassDef* cd=VhdlDocGen::getPackageName(*temp1); - if (cd) - { - QCString *ss=qdict.find(*temp1); - if (ss==0) - { - qdict.insert(p,temp1); - QCString tmp=cd->className(); - VhdlDocGen::findAllPackages(tmp,qdict); - } - else delete temp1; - } - else delete temp1; - } - }//for - }//if - }//cdef + cList.append(cd); + VhdlDocGen::findAllPackages(cd); + packages.insert(cdef,cList); + } + } + }//for + }// findAllPackages /*! @@ -1531,7 +1579,8 @@ void VhdlDocGen::writeFunctionProto(OutputList& ol,const ArgumentList* al,const ol.docify(" , "); } - if (bGen) { + if (bGen) + { VhdlDocGen::formatString(QCString("generic "),ol,mdef); } if (!att.isEmpty()) @@ -1655,7 +1704,7 @@ bool VhdlDocGen::writeFuncProcDocu( ol.startParameterName(TRUE); VhdlDocGen::writeFormatString(arg->name,ol,md); - + if (VhdlDocGen::isProcedure(md)) { startFonts(arg->attrib,"stringliteral",ol); @@ -1907,17 +1956,6 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, Definition *d=0; - /* some vhdl files contain only a configuration description - - library work; - configuration cfg_tb_jtag_gotoBackup of tb_jtag_gotoBackup is - for RTL - end for; - end cfg_tb_jtag_gotoBackup; - - in this case library work does not belong to an entity, package ... - - */ ASSERT(cd!=0 || nd!=0 || fd!=0 || gd!=0 || mdef->getMemberSpecifiers()==VhdlDocGen::LIBRARY || @@ -1992,13 +2030,13 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, ClassDef *annoClassDef=mdef->getClassDefOfAnonymousType(); // start a new member declaration - bool isAnonymous = annoClassDef; // || m_impl->annMemb || m_impl->annEnumType; + uint isAnonymous = (bool)(annoClassDef); // || m_impl->annMemb || m_impl->annEnumType; ///printf("startMemberItem for %s\n",name().data()); int mm=mdef->getMemberSpecifiers(); if (mm==VhdlDocGen::MISCELLANEOUS) - isAnonymous=TRUE; + isAnonymous=3; - ol.startMemberItem( mdef->anchor(), isAnonymous ); //? 1 : m_impl->tArgList ? 3 : 0); + ol.startMemberItem( mdef->anchor(), isAnonymous ); //? 1 : m_impl->tArgList ? 3 : 0); // If there is no detailed description we need to write the anchor here. bool detailsVisible = mdef->isDetailedSectionLinkable(); @@ -2212,9 +2250,13 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, if (bUnit) ol.docify("units: "); writeLink(mdef,ol); ol.insertMemberAlign(); - if (!bRec) VhdlDocGen::formatString(ltype,ol,mdef); + if (!bRec && !bUnit) VhdlDocGen::formatString(ltype,ol,mdef); if (bUnit) ol.lineBreak(); - if (bRec || bUnit) writeRecorUnit(largs,ol,mdef); + if (bRec || bUnit) + { + writeRecorUnit(largs,ol,mdef); + mdef->setType(""); + } ol.endBold(); break; @@ -2222,7 +2264,7 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, } bool htmlOn = ol.isEnabled(OutputGenerator::Html); - if (htmlOn && !ltype.isEmpty()) + if (htmlOn && /*Config_getBool("HTML_ALIGN_MEMBERS") &&*/ !ltype.isEmpty()) { ol.disable(OutputGenerator::Html); } @@ -2238,8 +2280,8 @@ void VhdlDocGen::writeVHDLDeclaration(MemberDef* mdef,OutputList &ol, ol.endDoxyAnchor(cfname,mdef->anchor()); } - //printf("endMember %s annoClassDef=%p annEnumType=%p\n", // name().data(),annoClassDef,annEnumType); + // if(mm!=VhdlDocGen::MISCELLANEOUS) ol.endMemberItem(); if (!mdef->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC") /* && !annMemb */) { @@ -2288,7 +2330,7 @@ void VhdlDocGen::writePlainVHDLDeclarations( int mems=md->getMemberSpecifiers(); if (md->isBriefSectionVisible() && (mems==specifier) && (mems!=VhdlDocGen::LIBRARY) ) { - if (first) {ol.startMemberList();first=FALSE;} + if (first) { ol.startMemberList();first=FALSE; } VhdlDocGen::writeVHDLDeclaration(md,ol,cd,nd,fd,gd,FALSE); } //if else if (md->isBriefSectionVisible() && (mems==specifier)) @@ -2556,28 +2598,28 @@ void VhdlDocGen::writeStringLink(const MemberDef *mdef,QCString mem, OutputList& void VhdlDocGen::writeSource(MemberDef *mdef,OutputList& ol,QCString & cname) { ParserInterface *pIntf = Doxygen::parserManager->getParser(".vhd"); - pIntf->resetCodeParserState(); - + // pIntf->resetCodeParserState(); + QCString codeFragment=mdef->documentation(); - if (cname.isEmpty()) + if (cname.isEmpty()) { writeLink(mdef,ol); int fi=0; int j=0; - do + do { fi=codeFragment.find("\n",++fi); } while(fi>=0 && j++ <3); - - // show only the first four lines + + // show only the first four lines if (j==4) { codeFragment=codeFragment.left(fi); codeFragment.append("\n .... "); } } - + codeFragment.prepend("\n"); ol.pushGeneratorState(); ol.startCodeFragment(); @@ -2594,10 +2636,10 @@ void VhdlDocGen::writeSource(MemberDef *mdef,OutputList& ol,QCString & cname) mdef, // memberDef TRUE // show line numbers ); - + ol.endCodeFragment(); ol.popGeneratorState(); - + if (cname.isEmpty()) return; mdef->writeSourceDef(ol,cname); @@ -2773,8 +2815,9 @@ static void writeUCFLink(const MemberDef* mdef,OutputList &ol) bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne) { + FileName *fn=Doxygen::inputNameList->getFirst(); //LayoutNavEntry *cc = LayoutDocManager::instance().rootNavEntry()->find(LayoutNavEntry::Files); - + uint count=Doxygen::inputNameList->count(); LayoutNavEntry *kk = lne->parent();// find(LayoutNavEntry::Files); // LayoutNavEntry *kks = kk->parent();// find(LayoutNavEntry::Files); QCString file; @@ -2784,26 +2827,22 @@ bool VhdlDocGen::findConstraintFile(LayoutNavEntry *lne) { QCString ov = theTranslator->trDesignOverview(); QCString ofile("vhdl_design_overview"); - LayoutNavEntry *oo=new LayoutNavEntry( lne,LayoutNavEntry::MainPage,TRUE,ofile,ov,""); - kk->addChild(oo); + LayoutNavEntry *oo=new LayoutNavEntry( lne,LayoutNavEntry::MainPage,TRUE,ofile,ov,""); + kk->addChild(oo); } - FileNameListIterator fnli(*Doxygen::inputNameList); - FileName *fn; - for (fnli.toFirst();(fn=fnli.current());++fnli) + uint i=0; + while (i<count) { - FileNameIterator fni(*fn); - FileDef *fd; - for (;(fd=fni.current());++fni) + FileDef *fd=fn->at(i); + if (fd->name().contains(".ucf") || fd->name().contains(".qsf")) { - if (fd->name().contains(".ucf") || fd->name().contains(".qsf")) - { - file = convertNameToFile(fd->name().data(),FALSE,FALSE); - LayoutNavEntry *ucf=new LayoutNavEntry(lne,LayoutNavEntry::MainPage,TRUE,file,co,""); - kk->addChild(ucf); - break; - } + file = convertNameToFile(fd->name().data(),FALSE,FALSE); + LayoutNavEntry *ucf=new LayoutNavEntry(lne,LayoutNavEntry::MainPage,TRUE,file,co,""); + kk->addChild(ucf); + break; } + i++; } return FALSE; } @@ -2875,14 +2914,14 @@ QCString VhdlDocGen::parseForBinding(QCString & entity,QCString & arch) // find class with upper/lower letters ClassDef* VhdlDocGen::findVhdlClass(const char *className ) { - + ClassSDict::Iterator cli(*Doxygen::classSDict); ClassDef *cd; for (;(cd=cli.current());++cli) { if (qstricmp(className,cd->name().data())==0) { - return cd; + return cd; } } return 0; @@ -2900,7 +2939,7 @@ QCString VhdlDocGen::parseForBinding(QCString & entity,QCString & arch) void assignBinding(VhdlConfNode * conf) { - QList<Entry> instList= getVhdlInstList(); + QList<Entry> instList=getVhdlInstList(); QListIterator<Entry> eli(instList); Entry *cur=0; ClassDef *archClass=0,*entClass=0; @@ -2923,9 +2962,9 @@ void assignBinding(VhdlConfNode * conf) if (n==entBind) { // found=true; - entBind=VhdlDocGen::getIndexWord(vconf->confVhdl.data(),1); + entBind=VhdlDocGen::getIndexWord(vconf->confVhdl.data(),1); QCString a=VhdlDocGen::getIndexWord(conf->compSpec.data(),0); - QCString e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),1); + QCString e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),1); a=e+"::"+a; archClass= VhdlDocGen::findVhdlClass(a.data());//Doxygen::classSDict->find(a.data()); entClass= VhdlDocGen::findVhdlClass(e.data());//Doxygen::classSDict->find(e.data()); @@ -2939,14 +2978,14 @@ void assignBinding(VhdlConfNode * conf) if (conf->isInlineConf) { c=conf->confVhdl; - e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),0); + e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),0); } else { a=VhdlDocGen::getIndexWord(conf->compSpec.data(),0); - e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),1); + e=VhdlDocGen::getIndexWord(conf->confVhdl.data(),1); c=e+"::"+a; - } + } archClass= VhdlDocGen::findVhdlClass(c.data());//Doxygen::classSDict->find(a.data()); entClass= VhdlDocGen::findVhdlClass(e.data()); //Doxygen::classSDict->find(e.data()); } @@ -2963,7 +3002,7 @@ void assignBinding(VhdlConfNode * conf) archName=archClass->name(); QCString allOt=VhdlDocGen::getIndexWord(conf->arch.data(),0); all=allOt.lower()=="all" ; - others= allOt.lower()=="others"; + others= allOt.lower()=="others"; for (;(cur=eli.current());++eli) { @@ -2988,8 +3027,8 @@ void assignBinding(VhdlConfNode * conf) for (uint j=0;j<ql.count();j++) { QCString archy1,sign1; - if (all || others) - { + if (all || others) + { archy1=VhdlDocGen::getIndexWord(conf->arch.data(),1); sign1=cur->type; } @@ -3037,7 +3076,7 @@ void VhdlDocGen::computeVhdlComponentRelations() QCString entity,arch,inst; QList<VhdlConfNode> confList = getVhdlConfiguration(); - + for (uint iter=0;iter<confList.count(); iter++) { VhdlConfNode* conf= (VhdlConfNode *)confList.at(iter); @@ -3068,20 +3107,20 @@ void VhdlDocGen::computeVhdlComponentRelations() { entity=cur->type; } - + ClassDef *classEntity= VhdlDocGen::findVhdlClass(entity.data());//Doxygen::classSDict->find(entity); inst=VhdlDocGen::getIndexWord(cur->args.data(),0); ClassDef *cd=Doxygen::classSDict->find(inst); ClassDef *ar=Doxygen::classSDict->find(cur->args); - if (cd==0) + if (cd==0) { continue; } // if (classEntity==0) // err("%s:%d:Entity:%s%s",cur->fileName.data(),cur->startLine,entity.data()," could not be found"); - + addInstance(classEntity,ar,cd,cur); } @@ -3091,12 +3130,12 @@ static void addInstance(ClassDef* classEntity, ClassDef* ar, ClassDef *cd , Entry *cur,ClassDef* /*archBind*/) { - QCString bName,n1; + QCString bName,n1; if (ar==0) return; if (classEntity==0) { - //add component inst + //add component inst n1=cur->type; goto ferr; } @@ -3132,7 +3171,7 @@ ferr: 0, 0); - if (ar->getOutputFileBase()) + if (ar->getOutputFileBase()) { TagInfo tg; tg.anchor = 0; @@ -3147,21 +3186,21 @@ ferr: md->setMemberSpecifiers(VhdlDocGen::INSTANTIATION); md->setBriefDescription(cur->brief,cur->briefFile,cur->briefLine); md->setBodySegment(cur->startLine,-1) ; - md->setDocumentation(cur->doc.data(),cur->docFile.data(),cur->docLine); + md->setDocumentation(cur->doc.data(),cur->docFile.data(),cur->docLine); FileDef *fd=ar->getFileDef(); md->setBodyDef(fd); - QCString info="Info: Elaborating entity "+n1; + QCString info="Info: Elaborating entity "+n1; fd=ar->getFileDef(); info+=" for hierarchy "; QRegExp epr("[|]"); QCString label=cur->type+":"+cur->write+":"+cur->name; label.replace(epr,":"); info+=label; - fprintf(stderr,"\n[%s:%d:%s]\n",fd->fileName().data(),cur->startLine,info.data()); + fprintf(stderr,"\n[%s:%d:%s]\n",fd->fileName().data(),cur->startLine,info.data()); + - ar->insertMember(md); } @@ -3190,6 +3229,7 @@ void VhdlDocGen::writeRecUnitDocu( uint len=ql.count(); ol.startParameterList(TRUE); bool first=TRUE; + for(uint i=0;i<len;i++) { QCString n=ql[i].utf8(); @@ -3208,6 +3248,7 @@ void VhdlDocGen::writeRecUnitDocu( first=FALSE; } + }//# @@ -3235,7 +3276,7 @@ bool VhdlDocGen::isSubClass(ClassDef* cd,ClassDef *scd, bool followInstances,int { found=TRUE; } - else + else { if (level <256) { @@ -3255,7 +3296,7 @@ void VhdlDocGen::addBaseClass(ClassDef* cd,ClassDef *ent) for ( ; bcli.current() ; ++bcli) { ClassDef *ccd=bcli.current()->classDef; - if (ccd==ent) + if (ccd==ent) { QCString n = bcli.current()->usedName; int i = n.find('('); @@ -3290,7 +3331,7 @@ static MemberDef* findMemFlow(const MemberDef* mdef) MemberDef* md=(MemberDef*)mdList.at(j); if (md->name()==mdef->name() && md->getStartBodyLine()==mdef->getStartBodyLine()) return md; - } + } return 0; } @@ -3299,7 +3340,7 @@ void VhdlDocGen::createFlowChart(const MemberDef *mdef) if (mdef==0) return; QCString codeFragment; - MemberDef* mm=0; + MemberDef* mm=0; if((mm=findMemFlow(mdef))!=0) { // don't create the same flowchart twice @@ -3328,59 +3369,66 @@ void VhdlDocGen::createFlowChart(const MemberDef *mdef) pIntf->finishTranslationUnit(); } -bool VhdlDocGen::isConstraint(const MemberDef *mdef) -{ return mdef->getMemberSpecifiers()==VhdlDocGen::UCF_CONST; } -bool VhdlDocGen::isConfig(const MemberDef *mdef) +void VhdlDocGen::resetCodeVhdlParserState() +{ + varMap.clear(); + qli.clear(); + packages.clear(); +} + +bool VhdlDocGen::isConstraint(const MemberDef *mdef) +{ return mdef->getMemberSpecifiers()==VhdlDocGen::UCF_CONST; } +bool VhdlDocGen::isConfig(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::CONFIG; } -bool VhdlDocGen::isAlias(const MemberDef *mdef) +bool VhdlDocGen::isAlias(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::ALIAS; } -bool VhdlDocGen::isLibrary(const MemberDef *mdef) +bool VhdlDocGen::isLibrary(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::LIBRARY; } -bool VhdlDocGen::isGeneric(const MemberDef *mdef) +bool VhdlDocGen::isGeneric(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::GENERIC; } -bool VhdlDocGen::isPort(const MemberDef *mdef) +bool VhdlDocGen::isPort(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::PORT; } -bool VhdlDocGen::isComponent(const MemberDef *mdef) +bool VhdlDocGen::isComponent(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::COMPONENT; } -bool VhdlDocGen::isPackage(const MemberDef *mdef) +bool VhdlDocGen::isPackage(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::USE; } -bool VhdlDocGen::isEntity(const MemberDef *mdef) +bool VhdlDocGen::isEntity(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::ENTITY; } -bool VhdlDocGen::isConstant(const MemberDef *mdef) +bool VhdlDocGen::isConstant(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::CONSTANT; } -bool VhdlDocGen::isVType(const MemberDef *mdef) +bool VhdlDocGen::isVType(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::TYPE; } -bool VhdlDocGen::isSubType(const MemberDef *mdef) +bool VhdlDocGen::isSubType(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::SUBTYPE; } -bool VhdlDocGen::isVhdlFunction(const MemberDef *mdef) +bool VhdlDocGen::isVhdlFunction(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::FUNCTION; } -bool VhdlDocGen::isProcess(const MemberDef *mdef) +bool VhdlDocGen::isProcess(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::PROCESS; } -bool VhdlDocGen::isSignal(const MemberDef *mdef) +bool VhdlDocGen::isSignal(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::SIGNAL; } bool VhdlDocGen::isAttribute(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::ATTRIBUTE; } bool VhdlDocGen::isSignals(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::SIGNAL; } -bool VhdlDocGen::isProcedure(const MemberDef *mdef) +bool VhdlDocGen::isProcedure(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::PROCEDURE; } -bool VhdlDocGen::isRecord(const MemberDef *mdef) +bool VhdlDocGen::isRecord(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::RECORD; } -bool VhdlDocGen::isArchitecture(const MemberDef *mdef) +bool VhdlDocGen::isArchitecture(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::ARCHITECTURE; } -bool VhdlDocGen::isUnit(const MemberDef *mdef) +bool VhdlDocGen::isUnit(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::UNITS; } -bool VhdlDocGen::isPackageBody(const MemberDef *mdef) +bool VhdlDocGen::isPackageBody(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::PACKAGE_BODY; } -bool VhdlDocGen::isVariable(const MemberDef *mdef) +bool VhdlDocGen::isVariable(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::SHAREDVARIABLE; } -bool VhdlDocGen::isFile(const MemberDef *mdef) +bool VhdlDocGen::isFile(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::VFILE; } -bool VhdlDocGen::isGroup(const MemberDef *mdef) +bool VhdlDocGen::isGroup(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::GROUP; } -bool VhdlDocGen::isCompInst(const MemberDef *mdef) +bool VhdlDocGen::isCompInst(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::INSTANTIATION; } -bool VhdlDocGen::isMisc(const MemberDef *mdef) +bool VhdlDocGen::isMisc(const MemberDef *mdef) { return mdef->getMemberSpecifiers()==VhdlDocGen::MISCELLANEOUS; } @@ -3401,7 +3449,7 @@ bool VhdlDocGen::isMisc(const MemberDef *mdef) #define EEND (FlowChart::ENDIF_NO | FlowChart::ELSE_NO ) #define IFF (FlowChart::ELSIF_NO | FlowChart::IF_NO) #define EXITNEXT (FlowChart::EXIT_NO | FlowChart::NEXT_NO ) -#define EMPTY (EEND | FlowChart::ELSIF_NO) +#define EMPTY (EEND | FlowChart::ELSIF_NO) #define EE (FlowChart::ELSE_NO | FlowChart::ELSIF_NO) #define EMPTNODE (ENDCL | EEND | FlowChart::ELSIF_NO) #define FLOWLEN (flowList.count()-1) @@ -3409,20 +3457,20 @@ bool VhdlDocGen::isMisc(const MemberDef *mdef) static int ifcounter=0; static int nodeCounter=0; -static struct +static struct { // link colors - const char *textNodeLink; + const char *textNodeLink; const char *yesNodeLink; const char *noNodeLink; - + // node colors const char* comment; const char* decisionNode; const char* varNode; const char *startEndNode; const char* textNode; -} flowCol = +} flowCol = { "green", // textNodeLink "red", // yesNodeLink "black", // noNodeLink @@ -3442,18 +3490,18 @@ static QMap<QCString,int> keyMap; void alignText(QCString & q) { if (q.length()<=80) return; - + if (q.length()>200) { q.resize(200); } q.append(" ..."); - + QRegExp reg("[\\s|]"); QCString str(q.data()); QCString temp; - + while (str.length()>80) { int j=str.findRev(reg,80); @@ -3471,15 +3519,15 @@ void alignText(QCString & q) str.remove(0,j); } }//while - + q=temp+str; // #endif } void FlowChart::printNode(const FlowChart* flo) { - if (flo==0) return; - QCString ui="-"; + if (flo==0) return; + QCString ui="-"; QCString q,t; QRegExp ep("[\t\n\r]"); @@ -3487,15 +3535,15 @@ void FlowChart::printNode(const FlowChart* flo) if (flo->type & STARTL) { - if (flo->stamp>0) + if (flo->stamp>0) { q=ui.left(2*flo->stamp); } else { - q=" "; + q=" "; } - QCString nn=flo->exp.stripWhiteSpace(); + QCString nn=flo->exp.stripWhiteSpace(); printf("\nYES: %s%s[%d,%d]",q.data(),nn.data(),flo->stamp,flo->id); } else @@ -3519,7 +3567,7 @@ void FlowChart::printNode(const FlowChart* flo) } else { - q=" "; + q=" "; } if (flo->type & EMPTNODE) { @@ -3567,8 +3615,8 @@ void FlowChart::colTextNodes() if (j>0) j=j-1; } found=TRUE; - } - else + } + else found=FALSE; } @@ -3587,7 +3635,7 @@ void FlowChart::colTextNodes() fNew->stamp=flo->stamp; flowList.insert(j+1,fNew); } - } + } } }// colTextNode @@ -3623,10 +3671,10 @@ void FlowChart::alignCommentNode(FTextStream &t,QCString com) s=(QCString)ql[j].utf8(); if (max<s.length()) max=s.length(); } - + s=ql.last().utf8(); int diff=max-s.length(); - + QCString n(1); if (diff>0) { @@ -3636,7 +3684,7 @@ void FlowChart::alignCommentNode(FTextStream &t,QCString com) ql.remove(ql.last()); ql.append(s); } - + for (uint j=0;j<ql.count();j++) { s=(QCString)ql[j].utf8(); @@ -3644,8 +3692,8 @@ void FlowChart::alignCommentNode(FTextStream &t,QCString com) { s+="\n"; } - FlowChart::codify(t,s.data()); - } + FlowChart::codify(t,s.data()); + } } @@ -3690,8 +3738,8 @@ void FlowChart::buildCommentNodes(FTextStream & t) // comment between function/process .. begin is linked to start node to=flowList.at(0); } - else - { + else + { if (j>0 && flowList.at(j-1)->line==fll->line) to=flowList.at(j-1); else @@ -3729,7 +3777,7 @@ void FlowChart::buildCommentNodes(FTextStream & t) void FlowChart::codify(FTextStream &t,const char *str) { if (str) - { + { const char *p=str; char c; while (*p) @@ -3754,7 +3802,7 @@ FlowChart::~FlowChart() } FlowChart::FlowChart(int typ,const char * t,const char* ex,const char* lab) -{ +{ stamp=ifcounter; if (typ & STARTL) @@ -3803,7 +3851,7 @@ void FlowChart::addFlowChart(int type,const char* text,const char* exp, const ch FlowChart *fl=new FlowChart(type,typeString.data(),expression.data(),label); - fl->line=getVhdlCont()->yyLineNr; + fl->line=vhdl::parser::VhdlParser::getLine(); if (type & (START_NO | VARIABLE_NO)) { @@ -3833,10 +3881,10 @@ QCString FlowChart::convertNameToFileName() qcs=md->name(); if (qcs.find(exp,0)>=0) - { - qcs.prepend("Z"); + { + qcs.prepend("Z"); qcs=qcs.replace(exp,"_"); - } + } return qcs+temp; } @@ -3879,15 +3927,14 @@ void FlowChart::createSVG() //const MemberDef *m=VhdlDocGen::getFlowMember(); //if (m) - // fprintf(stderr,"\n creating flowchart : %s %s in file %s \n",VhdlDocGen::trTypeString(m->getMemberSpecifiers()),m->name().data(),m->getFileDef()->name().data()); + // fprintf(stderr,"\n creating flowchart : %s %s in file %s \n",VhdlDocGen::trTypeString(m->getMemberSpecifiers()),m->name().data(),m->getFileDef()->name().data()); QCString dir=" -o "+ov+qcs; ov+="/flow_design.dot"; QCString vlargs="-Tsvg "+ov+dir ; - QCString dotExe = Config_getString("DOT_PATH")+"dot"; - if (portable_system(dotExe,vlargs)!=0) + if (portable_system("dot",vlargs)!=0) { err("could not create dot file"); } @@ -3895,7 +3942,7 @@ void FlowChart::createSVG() void FlowChart::startDot(FTextStream &t) { - t << " digraph G { \n"; + t << " digraph G { \n"; t << "rankdir=TB \n"; t << "concentrate=true\n"; t << "stylesheet=\"doxygen.css\"\n"; @@ -3903,7 +3950,7 @@ void FlowChart::startDot(FTextStream &t) void FlowChart::endDot(FTextStream &t) { - t << " } \n"; + t << " } \n"; } void FlowChart::writeFlowChart() @@ -3926,7 +3973,7 @@ void FlowChart::writeFlowChart() #ifdef DEBUGFLOW printFlowTree(); #endif - + startDot(t); buildCommentNodes(t); @@ -3942,7 +3989,7 @@ void FlowChart::writeFlowChart() FlowChart::endDot(t); delFlowList(); f.close(); - FlowChart::createSVG(); + FlowChart::createSVG(); }// writeFlowChart void FlowChart::writeShape(FTextStream &t,const FlowChart* fl) @@ -3957,7 +4004,7 @@ void FlowChart::writeShape(FTextStream &t,const FlowChart* fl) { var=" then"; } - else + else { var=""; } @@ -3965,10 +4012,10 @@ void FlowChart::writeShape(FTextStream &t,const FlowChart* fl) t<<getNodeName(fl->id).data(); QCString q=getNodeType(fl->type); -#ifdef DEBUGFLOW +#ifdef DEBUGFLOW QCString qq(getNodeName(fl->id).data()); keyMap.insert(qq,fl->id); -#endif +#endif bool dec=(fl->type & DECLN); bool exit=(fl->type & EXITNEXT); @@ -4015,7 +4062,7 @@ void FlowChart::writeShape(FTextStream &t,const FlowChart* fl) FlowChart::alignCommentNode(t,val); t << " </TD></TR></TABLE>>];"; } - else + else { if (fl->text.isEmpty()) return; bool var=(fl->type & FlowChart::VARIABLE_NO); @@ -4054,16 +4101,16 @@ void FlowChart::writeEdge(FTextStream &t,const FlowChart* fl_from,const FlowChar bool b=fl_from->type & STARTL; bool c=fl_to->type & STARTL; -#ifdef DEBUGFLOW +#ifdef DEBUGFLOW QCString s1(getNodeName(fl_from->id).data()); QCString s2(getNodeName(fl_to->id).data()); QMap<QCString, int>::Iterator it = keyMap.find(s1); - QMap<QCString, int>::Iterator it1 = keyMap.find(s2); - // checks if the link is connected to a valid node + QMap<QCString, int>::Iterator it1 = keyMap.find(s2); + // checks if the link is connected to a valid node assert(it.key()); assert(it1.key()); #endif - + writeEdge(t,fl_from->id,fl_to->id,i,b,c); } @@ -4107,7 +4154,7 @@ void FlowChart::alignFuncProc( QCString & q,const ArgumentList* al,bool isFunc) int len=q.length()+VhdlDocGen::getFlowMember()->name().length(); QCString prev,temp; prev.fill(' ',len+1); - + Argument *arg; q+="\n"; for (;(arg=ali.current());++ali) @@ -4125,7 +4172,7 @@ void FlowChart::alignFuncProc( QCString & q,const ArgumentList* al,bool isFunc) } attl+=arg->type; if (--index) attl+=",\n"; else attl+="\n"; - + attl.prepend(prev.data()); temp+=attl; } @@ -4180,9 +4227,9 @@ int FlowChart::findLabel(int index,QCString &label) FlowChart *flo=flowList.at(j); if ((flo->type & LOOP) && !flo->label.isEmpty() && qstricmp(flo->label,label)==0) { - return j; + return j; } - } + } err("could not find label: ",label.data()); return 0; } @@ -4314,7 +4361,7 @@ void FlowChart::writeFlowLinks(FTextStream &t) // assert(z>-1); writeEdge(t,fll,flowList.at(z),1); continue; - } + } else if (kind & (TEXT_NO | VARIABLE_NO)) { int z=getNextNode(j,stamp); @@ -4324,12 +4371,12 @@ void FlowChart::writeFlowLinks(FTextStream &t) { // default value if (qstricmp(fll->text.simplifyWhiteSpace().data(),"others")==0) - { + { writeEdge(t,fll,flowList.at(j+1),2); continue; - } + } + - writeEdge(t,fll,flowList.at(j+1),0); int u=findNode(j,stamp,WHEN_NO); int v=findNode(j,stamp-1,END_CASE); @@ -4338,7 +4385,7 @@ void FlowChart::writeFlowLinks(FTextStream &t) { writeEdge(t,fll,flowList.at(u),1); } - else + else { writeEdge(t,fll,flowList.at(v),1); } @@ -4385,7 +4432,7 @@ void FlowChart::writeFlowLinks(FTextStream &t) if (b) { z=findPrevLoop(j,fll->stamp); - writeEdge(t,fll,flowList.at(z),0); + writeEdge(t,fll,flowList.at(z),0); continue; } else @@ -4399,3 +4446,38 @@ void FlowChart::writeFlowLinks(FTextStream &t) } //for } //writeFlowLinks + +void VHDLLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf, + const char *scopeName, + const QCString &input, + SrcLangExt, // lang + bool isExampleBlock, + const char *exampleName, + FileDef *fileDef, + int startLine, + int endLine, + bool inlineFragment, + MemberDef *memberDef, + bool showLineNumbers, + Definition *searchCtx, + bool collectXRefs + ) +{ + +parseVhdlCode(codeOutIntf, + scopeName, + input, + isExampleBlock, + exampleName, + fileDef, + startLine, + endLine, + inlineFragment, + memberDef, + showLineNumbers, + searchCtx, + collectXRefs + +); + +} diff --git a/src/vhdldocgen.h b/src/vhdldocgen.h index 45ceb06..b9f9afb 100644 --- a/src/vhdldocgen.h +++ b/src/vhdldocgen.h @@ -1,6 +1,6 @@ /****************************************************************************** * - * Copyright (C) 1997-2014 by Dimitri van Heesch. + * Copyright (C) 1997-2013 by Dimitri van Heesch. * * Permission to use, copy, modify, and distribute this software and its * documentation under the terms of the GNU General Public License is hereby @@ -108,8 +108,7 @@ class VhdlDocGen static ClassDef* getPackageName(const QCString& name); static MemberDef* findMember(const QCString& className, const QCString& memName); - static void findAllPackages(const QCString& className, - QDict<QCString>&); + static void findAllPackages(ClassDef*); static MemberDef* findMemberDef(ClassDef* cd, const QCString& key, MemberListType type); @@ -246,7 +245,7 @@ class VhdlDocGen cu->spec==VhdlDocGen::PACKAGE_BODY; } - + static void resetCodeVhdlParserState(); private: static void findAllArchitectures(QList<QCString>& ql,const ClassDef *cd); diff --git a/src/vhdljjparser.cpp b/src/vhdljjparser.cpp new file mode 100644 index 0000000..f31c9fb --- /dev/null +++ b/src/vhdljjparser.cpp @@ -0,0 +1,828 @@ +/****************************************************************************** + * + * Copyright (C) 2014 by M. Kreis + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + */ + +#include <qcstring.h> +#include <qfileinfo.h> +#include <qstringlist.h> +#include "vhdljjparser.h" +#include "vhdlcode.h" +#include "vhdldocgen.h" +#include "message.h" +#include "config.h" +#include "doxygen.h" +#include "util.h" +#include "language.h" +#include "commentscan.h" +#include "index.h" +#include "definition.h" +#include "searchindex.h" +#include "outputlist.h" +#include "arguments.h" +#include "types.h" +#include "VhdlParserIF.h" + +using namespace vhdl::parser; +using namespace std; + +static ParserInterface *g_thisParser; + +static QCString yyFileName; +static int yyLineNr = 1; +static int* lineParse; +static int iDocLine = -1; +static QCString inputString; +static Entry gBlock; +static Entry* previous = 0; +#if 0 +int iLine; +QStringList qrl; +ParserInterface *g_thisParser; +int inputPosition; +int inputLen; +int startComment = 0; +QFile inputFile; +QCString inbuf; + +QCString yyFileName; +bool g_lexInit = FALSE; +int yyLineNr = 1; +int g_lastCommentContext = 0; +bool docBlockAutoBrief; +char docBlockTerm; +int iDocLine = -1; +int num_chars; +int* lineParse; +#endif +//------------------------------------------------------- + +static Entry* oldEntry; +static bool varr=FALSE; +static QCString varName; + +static QList<Entry> instFiles; +static QList<Entry> libUse; +static QList<Entry> lineEntry; + +Entry* VhdlParser::currentCompound=0; +Entry* VhdlParser::tempEntry=0; +Entry* VhdlParser::lastEntity=0 ; +Entry* VhdlParser::lastCompound=0 ; +Entry* VhdlParser::current=0; +Entry* VhdlParser::current_root = 0; +QCString VhdlParser::compSpec; +QCString VhdlParser::currName; +QCString VhdlParser::confName; +QCString VhdlParser::genLabels; +QCString VhdlParser::lab; +QCString VhdlParser::forL; + +int VhdlParser::param_sec = 0; +int VhdlParser::parse_sec=0; +int VhdlParser::currP=0; +int VhdlParser::levelCounter; + +static QList<VhdlConfNode> configL; + +struct +{ + QCString doc; + bool brief; + bool pending; + int iDocLine; +} str_doc; + +static bool doxComment=FALSE; // doxygen comment ? +static QCString strComment; +static int iCodeLen; + +bool checkMultiComment(QCString& qcs,int line); +QList<Entry>* getEntryAtLine(const Entry* ce,int line); + +//------------------------------------- + +QList<VhdlConfNode>& getVhdlConfiguration() { return configL; } +QList<Entry>& getVhdlInstList() { return instFiles; } + +Entry* getVhdlCompound() +{ + if (VhdlParser::lastEntity) return VhdlParser::lastEntity; + if (VhdlParser::lastCompound) return VhdlParser::lastCompound; + return NULL; +} + +void startCodeBlock(int index) +{ + int ll=strComment.length(); + iCodeLen=inputString.findRev(strComment.data())+ll; + // fprintf(stderr,"\n startin code..%d %d %d\n",iCodeLen,num_chars,ll); + //assert(false); + gBlock.reset(); + int len=strComment.length(); + QCString name=strComment.right(len-index);// + name=VhdlDocGen::getIndexWord(name.data(),1); + if (!name) + gBlock.name="misc"+ VhdlDocGen::getRecordNumber(); + else + gBlock.name=name; + + //int li=strComment.contains('\n'); + + gBlock.startLine=yyLineNr; + gBlock.bodyLine=yyLineNr; + + strComment=strComment.left(index); + VhdlDocGen::prepareComment(strComment); + gBlock.brief+=strComment; +} + +void makeInlineDoc(int endCode) +{ + int len=endCode-iCodeLen; + QCString par=inputString.mid(iCodeLen,len); + //fprintf(stderr,"\n inline code: \n<%s>",par.data()); + gBlock.doc=par; + gBlock.inbodyDocs=par; + gBlock.section=Entry::VARIABLE_SEC; + gBlock.spec=VhdlDocGen::MISCELLANEOUS; + gBlock.fileName = yyFileName; + gBlock.endBodyLine=yyLineNr-1; + gBlock.lang=SrcLangExt_VHDL; + Entry *temp=new Entry(gBlock); + Entry* compound=getVhdlCompound(); + + if (compound) + { + compound->addSubEntry(temp); + } + else + { + temp->type="misc"; // global code like library ieee... + VhdlParser::current_root->addSubEntry(temp); + } + strComment.resize(0); + gBlock.reset(); +}// makeInlineDoc + + +bool isConstraintFile(const QCString &fileName,const QCString &ext) +{ + return fileName.right(ext.length())==ext; +} + + +void VHDLLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root, + bool ,QStrList&) +{ + g_thisParser=this; + bool inLine=false; + inputString=fileBuf; + if (strlen(fileName)==0) + { + inLine=true; + } + + yyFileName+=fileName; + + bool xilinx_ucf=isConstraintFile(yyFileName,".ucf"); + bool altera_qsf=isConstraintFile(yyFileName,".qsf"); + + // support XILINX(ucf) and ALTERA (qsf) file + + if (xilinx_ucf) + { + VhdlDocGen::parseUCF(fileBuf,root,yyFileName,FALSE); + return; + } + if (altera_qsf) + { + VhdlDocGen::parseUCF(fileBuf,root,yyFileName,TRUE); + return; + } + libUse.setAutoDelete(true); + yyLineNr=1; + VhdlParser::current_root=root; + VhdlParser::lastCompound=0; + VhdlParser::lastEntity=0; + VhdlParser::currentCompound=0; + VhdlParser::lastEntity=0; + VhdlParser::current=new Entry(); + VhdlParser::initEntry(VhdlParser::current); + groupEnterFile(fileName,yyLineNr); + lineParse=new int[200]; + VhdlParserIF::parseVhdlfile(fileBuf,inLine); + + delete VhdlParser::current; + VhdlParser::current=0; + + if (!inLine) + VhdlParser::mapLibPackage(root); + + delete lineParse; + yyFileName.resize(0); + libUse.clear(); + VhdlDocGen::resetCodeVhdlParserState(); +} + +void VhdlParser::lineCount(){ yyLineNr++; } + +void VhdlParser::lineCount(const char* text) +{ + for (const char* c=text ; *c ; ++c ) + { + yyLineNr += (*c == '\n') ; + } +} + +void isVhdlDocPending() +{ + if (!str_doc.pending) return; + + str_doc.pending=FALSE; + oldEntry=0; // prevents endless recursion + iDocLine=str_doc.iDocLine; + VhdlParser::handleCommentBlock(str_doc.doc,str_doc.brief); + iDocLine=-1; +} + +void VhdlParser::initEntry(Entry *e) +{ + e->fileName = yyFileName; + e->lang = SrcLangExt_VHDL; + isVhdlDocPending(); + initGroupInfo(e); +} + +void VhdlParser::newEntry() +{ + if (current->spec==VhdlDocGen::ENTITY || + current->spec==VhdlDocGen::PACKAGE || + current->spec==VhdlDocGen::ARCHITECTURE || + current->spec==VhdlDocGen::PACKAGE_BODY) + { + current_root->addSubEntry(current); + } + else + { + if (lastCompound) + { + lastCompound->addSubEntry(current); + } + else + { + if (lastEntity) + { + lastEntity->addSubEntry(current); + } + else + { + current_root->addSubEntry(current); + } + } + } + previous = current; + current = new Entry ; + initEntry(current); +} + +bool checkInlineCode(QCString & doc) +{ + int index=doc.find("\\code"); + + if (index>0) + { + strComment+=doc; + startCodeBlock(index); + doxComment=TRUE; + return true; + } + return false; +} + +void VhdlParser::handleFlowComment(const char* doc) +{ + lineCount(doc); + if (VhdlDocGen::getFlowMember()) + { + QCString qcs(doc); + qcs=qcs.stripWhiteSpace(); + qcs.stripPrefix("--#"); + FlowChart::addFlowChart(FlowChart::COMMENT_NO,0,0,qcs.data()); + } +} + +void VhdlParser::handleCommentBlock(const char* doc1,bool brief) +{ + int position=0; + static bool isIn; + QCString doc(doc1); + if (doc.isEmpty()) return; + + if (checkMultiComment(doc,yyLineNr)) + { + lineCount(doc1); + return; + } + + isIn=checkInlineCode(doc); + bool isEndCode=doc.contains("\\endcode"); + // empty comment --! + if (isEndCode) + { + int end=inputString.find(doc.data(),iCodeLen); + makeInlineDoc(end); + strComment.resize(0); + isIn=false; + } + if (isIn) + { + isIn=false; + lineCount(doc1); + return; + } + + VhdlDocGen::prepareComment(doc); + + bool needsEntry=FALSE; + Protection protection=Public; + int lineNr = iDocLine; + + if (oldEntry==current) + { + //printf("\n find pending message < %s > at line: %d \n ",doc.data(),iDocLine); + str_doc.doc=doc; + str_doc.iDocLine=iDocLine; + str_doc.brief=brief; + str_doc.pending=TRUE; + return; + } + + oldEntry=current; + + if (brief) + { + current->briefLine = yyLineNr; + } + else + { + current->docLine = yyLineNr; + } + // printf("parseCommentBlock file<%s>\n [%s]\n",yyFileName.data(),doc.data()); + while (parseCommentBlock( + g_thisParser, + current, + doc, // text + yyFileName, // file + lineNr, // line of block start + brief, + 0, + FALSE, + protection, + position, + needsEntry + ) + ) + { + //printf("parseCommentBlock position=%d [%s]\n",position,doc.data()+position); + if (needsEntry) newEntry(); + } + if (needsEntry) + { + if (varr) + { + varr=FALSE; + current->name=varName; + current->section=Entry::VARIABLEDOC_SEC; + varName=""; + } + newEntry(); + } + lineCount(doc1); +} + +void VHDLLanguageScanner::parsePrototype(const char *text) +{ + varName=text; + varr=TRUE; +} + +void VhdlParser::addCompInst(char *n, char* instName, char* comp,int iLine) +{ + current->spec=VhdlDocGen::INSTANTIATION; + current->section=Entry::VARIABLE_SEC; + current->startLine=iLine; + current->bodyLine=iLine; + current->type=instName; // foo:instname e.g proto or work. proto(ttt) + current->exception=genLabels.lower(); // |arch|label1:label2... + current->name=n; // foo + current->args=lastCompound->name; // architecture name + current->includeName=comp; // component/enity/configuration + int u=genLabels.find("|",1); + if (u>0) + { + current->write=genLabels.right(genLabels.length()-u); + current->read=genLabels.left(u); + } + //printf (" \n genlable: [%s] inst: [%s] name: [%s] %d\n",n,instName,comp,iLine); + + if (lastCompound) + { + current->args=lastCompound->name; + if (true) // !findInstant(current->type)) + { + initEntry(current); + instFiles.append(new Entry(*current)); + } + + Entry *temp=current; // hold current pointer (temp=oldEntry) + current=new Entry; // (oldEntry != current) + delete temp; + } + else + { + newEntry(); + } +} + +void VhdlParser::addVhdlType(const char *n,int startLine,int section, + uint64 spec,const char* args,const char* type,Protection prot) +{ + static QRegExp reg("[\\s]"); + QCString name(n); + if (isFuncProcProced() || VhdlDocGen::getFlowMember()) return; + + if (parse_sec==GEN_SEC) + { + spec= VhdlDocGen::GENERIC; + } + + QStringList ql=QStringList::split(",",name,FALSE); + + for (uint u=0;u<ql.count();u++) + { + current->name=ql[u].utf8(); + current->startLine=startLine; + current->bodyLine=startLine; + current->section=section; + current->spec=spec; + current->fileName=yyFileName; + if (current->args.isEmpty()) + { + current->args=args; + } + current->type=type; + current->protection=prot; + + if (!lastCompound && (section==Entry::VARIABLE_SEC) && (spec == VhdlDocGen::USE || spec == VhdlDocGen::LIBRARY) ) + { + libUse.append(new Entry(*current)); + current->reset(); + } + newEntry(); + } +} + +void VhdlParser::createFunction(const char *imp,uint64 spec,const char *fn) +{ + QCString impure(imp); + QCString fname(fn); + current->spec=spec; + current->section=Entry::FUNCTION_SEC; + + if (impure=="impure" || impure=="pure") + { + current->exception=impure; + } + + if (parse_sec==GEN_SEC) + { + current->spec= VhdlDocGen::GENERIC; + current->section=Entry::FUNCTION_SEC; + } + + if (currP==VhdlDocGen::PROCEDURE) + { + current->name=impure; + current->exception=""; + } + else + { + current->name=fname; + } + + if (spec==VhdlDocGen::PROCESS) + { + current->args=fname; + current->name=impure; + VhdlDocGen::deleteAllChars(current->args,' '); + if (!fname.isEmpty()) + { + QStringList q1=QStringList::split(",",fname); + for (uint ii=0;ii<q1.count();ii++) + { + Argument *arg=new Argument; + arg->name=q1[ii].utf8(); + current->argList->append(arg); + } + } + return; + } + } + + +bool VhdlParser::isFuncProcProced() +{ + if (currP==VhdlDocGen::FUNCTION || + currP==VhdlDocGen::PROCEDURE || + currP==VhdlDocGen::PROCESS + ) + { + return TRUE; + } + return FALSE; +} + +void VhdlParser::pushLabel( QCString &label,QCString & val) +{ + label+="|"; + label+=val; +} + + QCString VhdlParser::popLabel(QCString & q) +{ + QCString u=q; + int i=q.findRev("|"); + if (i<0) return ""; + q = q.left(i); + return q; +} + +void VhdlParser::addConfigureNode(const char* a,const char*b, bool,bool isLeaf,bool inlineConf) +{ + VhdlConfNode* co=0; + QCString ent,arch,lab; + QCString l=genLabels; + ent=a; + // lab = VhdlDocGen::parseForConfig(ent,arch); + + if (b) + { + ent=b; + // lab=VhdlDocGen::parseForBinding(ent,arch); + } + int level=0; + + if (!configL.isEmpty()) + { + VhdlConfNode* vc=configL.getLast(); + level=vc->level; + if (levelCounter==0) + { + pushLabel(forL,ent); + } + else if (level<levelCounter) + { + if (!isLeaf) + { + pushLabel(forL,ent); + } + } + else if (level>levelCounter) + { + forL=popLabel(forL); + } + } + else + { + pushLabel(forL,ent); + } + + if (inlineConf) + { + confName=lastCompound->name; + } + + //fprintf(stderr,"\n[%s %d %d]\n",forL.data(),levelCounter,level); + co=new VhdlConfNode(a,b,confName.lower().data(),forL.lower().data(),isLeaf); + + if (inlineConf) + { + co->isInlineConf=TRUE; + } + + configL.append(co); + +}// addConfigure + + +void VhdlParser::addProto(const char *s1,const char *s2,const char *s3, + const char *s4,const char *s5,const char *s6) +{ + (void)s5; // avoid unused warning + static QRegExp reg("[\\s]"); + QCString name=s2; + QStringList ql=QStringList::split(",",name,FALSE); + + for (uint u=0;u<ql.count();u++) + { + Argument *arg=new Argument; + arg->name=ql[u].utf8(); + if (s3) + { + arg->type=s3; + } + arg->type+=" "; + arg->type+=s4; + if (s6) + { + arg->type+=s6; + } + if (parse_sec==GEN_SEC && param_sec==0) + { + arg->defval="gen!"; + } + + if (parse_sec==PARAM_SEC) + { + // assert(false); + } + + arg->defval+=s1; + arg->attrib="";//s6; + + current->argList->append(arg); + current->args+=s2; + current->args+=","; + } +} + + +/* + * adds the library|use statements to the next class (entity|package|architecture|package body + * library ieee + * entity xxx + * ..... + * library + * package + * enity zzz + * ..... + * and so on.. + */ +void VhdlParser::mapLibPackage( Entry* root) +{ + QList<Entry> epp=libUse; + EntryListIterator eli(epp); + Entry *rt; + for (;(rt=eli.current());++eli) + { + if (addLibUseClause(rt->name)) + { + Entry *current; + EntryListIterator eLib(*root->children()); + bool bFound=FALSE; + for (eLib.toFirst();(current=eLib.current());++eLib) + { + if (VhdlDocGen::isVhdlClass(current)) + { + if (current->startLine > rt->startLine) + { + bFound=TRUE; + current->addSubEntry(new Entry(*rt)); + break; + } + } + }//for + if (!bFound) + { + root->addSubEntry(new Entry(*rt)); + } + } //if + }// for +}//MapLib + +bool VhdlParser::addLibUseClause(const QCString &type) +{ + static bool showIEEESTD=Config_getBool("FORCE_LOCAL_INCLUDES"); + + if (showIEEESTD) // all standard packages and libraries will not be shown + { + if (type.lower().stripPrefix("ieee")) return FALSE; + if (type.lower().stripPrefix("std")) return FALSE; + } + return TRUE; +} + +int VhdlParser::getLine() +{ + return yyLineNr; +} + +void VhdlParser::setLineParsed(int tok) +{ + lineParse[tok]=yyLineNr; +} + +int VhdlParser::getLine(int tok) +{ + int val=lineParse[tok]; + if (val<0) val=0; + //assert(val>=0 && val<=yyLineNr); + return val; +} + + +void VhdlParser::createFlow() +{ + if (!VhdlDocGen::getFlowMember()) + { + return; + } + QCString q,ret; + + if (currP==VhdlDocGen::FUNCTION) + { + q=":function( "; + FlowChart::alignFuncProc(q,tempEntry->argList,true); + q+=")"; + } + else if (currP==VhdlDocGen::PROCEDURE) + { + q=":procedure ("; + FlowChart::alignFuncProc(q,tempEntry->argList,false); + q+=")"; + } + else + { + q=":process( "+tempEntry->args; + q+=")"; + } + + q.prepend(VhdlDocGen::getFlowMember()->name().data()); + + FlowChart::addFlowChart(FlowChart::START_NO,q,0); + + if (currP==VhdlDocGen::FUNCTION) + { + ret="end function "; + } + else if (currP==VhdlDocGen::PROCEDURE) + { + ret="end procedure"; + } + else + { + ret="end process "; + } + + FlowChart::addFlowChart(FlowChart::END_NO,ret,0); + // FlowChart::printFlowList(); + FlowChart::writeFlowChart(); + currP=0; +} + +bool checkMultiComment(QCString& qcs,int line) +{ + QList<Entry> *pTemp=getEntryAtLine(VhdlParser::current_root,line); + + if (pTemp->isEmpty()) return false; + + //int ii=pTemp->count(); + // qcs.stripPrefix("--!"); + VhdlDocGen::prepareComment(qcs); + while (!pTemp->isEmpty()) + { + Entry *e=(Entry*)pTemp->getFirst(); + e->briefLine=line; + e->brief+=qcs; + iDocLine=-1; + pTemp->removeFirst(); + //ii=pTemp->count(); + } + return true; +} + +// returns the vhdl parsed types at line xxx +QList<Entry>* getEntryAtLine(const Entry* ce,int line) +{ + EntryListIterator eli(*ce->children()); + Entry *rt; + for (;(rt=eli.current());++eli) + { + if (rt->bodyLine==line) + { + lineEntry.insert(0,rt); + } // if + + getEntryAtLine(rt,line); + } + return &lineEntry; +} + diff --git a/src/vhdljjparser.h b/src/vhdljjparser.h new file mode 100644 index 0000000..a0851d7 --- /dev/null +++ b/src/vhdljjparser.h @@ -0,0 +1,102 @@ +#ifndef VHDLJJPARSER_H +#define VHDLJJPARSER_H + +#include "parserintf.h" +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> +#include <ctype.h> +#include <qarray.h> + +#include <qfile.h> +#include <qdict.h> +#include <string> +#include "types.h" +#include "entry.h" +#include "vhdldocgen.h" +#include "qstringlist.h" +#include "vhdlcode.h" +#include "memberlist.h" +#include "config.h" + + + + +enum { GEN_SEC=0x1, PARAM_SEC,CONTEXT_SEC,PROTECTED_SEC } ; +void parserVhdlfile(const char* inputBuffer); + +class Entry; +class ClassSDict; +class FileStorage; +class ClassDef; +class MemberDef; +class QStringList; +struct VhdlConfNode; + + +/** \brief VHDL parser using state-based lexical scanning. + * + * This is the VHDL language parser for doxygen. + */ +class VHDLLanguageScanner : public ParserInterface +{ + public: + virtual ~VHDLLanguageScanner() {} + void startTranslationUnit(const char *) {} + void finishTranslationUnit() {} + void parseInput(const char * fileName, + const char *fileBuf, + Entry *root, + bool sameTranslationUnit, + QStrList &filesInSameTranslationUnit); + + void parseCode(CodeOutputInterface &codeOutIntf, + const char *scopeName, + const QCString &input, + SrcLangExt lang, + bool isExampleBlock, + const char *exampleName=0, + FileDef *fileDef=0, + int startLine=-1, + int endLine=-1, + bool inlineFragment=FALSE, + MemberDef *memberDef=0, + bool showLineNumbers=TRUE, + Definition *searchCtx=0, + bool collectXRefs=TRUE + ); + bool needsPreprocessing(const QCString &) { return TRUE; } + void resetCodeParserState(){}; + void parsePrototype(const char *text); +}; + +struct VhdlConfNode +{ + VhdlConfNode(const char* a,const char* b,const char* config,const char* cs,bool leaf) + { + arch=a; // architecture e.g. for iobuffer + arch=arch.lower(); + binding=b; // binding e.g. use entiy work.xxx(bev) + binding=binding.lower(); + confVhdl=config; // configuration foo is bar + compSpec=cs; + isInlineConf=false; // primary configuration? + isLeaf=leaf; + }; + + QCString confVhdl; + QCString arch; + QCString binding; + QCString compSpec; + int level; + bool isLeaf; + bool isInlineConf; + +}; + +void vhdlscanFreeScanner(); + +QList<VhdlConfNode>& getVhdlConfiguration(); +QList<Entry>& getVhdlInstList(); + +#endif diff --git a/src/vhdlparser.y b/src/vhdlparser.y deleted file mode 100644 index 247ac8a..0000000 --- a/src/vhdlparser.y +++ /dev/null @@ -1,2641 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 1997-2014 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - * Documents produced by Doxygen are derivative works derived from the - * input used in their production; they are not affected by this license. - * - */ - -/********************************************************************************************* - * The original was a VHDL parser description to be used with GMD Compiler - * Tool Box - * written from: - * Jan den Ouden, Jaap Hofstede - * Department of Computer Science (INF/SPA) - * University of Twente - * PB 217, 7500 AE ENSCHEDE, The Netherlands - * Tel: +31 53 893788 - * Email: hofstede@cs.utwente.nl - * avail at: ftp.cs.utwente.nl in pub/src/VHDL/Grammar - * - * author of YACC transformation: - * Thomas Dettmer - * Dortmund University - * Dept. of Computer Scienc, LS1 - * PB 500 500 - * D-44221 Dortmund (Germany) - * Phone: +49-231-755-6464 - * e-mail: dettmer@ls1.informatik.uni-dortmund.de - ***************************************************************** - * - * This file is intended not to be used for commercial purposes - * without permission of the University of Twente and permission - * of the University of Dortmund - * - * NOTE THAT THERE IS NO WARRANTY FOR CORRECTNES, COMPLETENESS, SUPPORT - * OR ANYTHING ELSE. - * - *******************************************************/ -/****************************************************************************** - * modified for doxygen by M. Kreis - * extended to VHDL 93/2008 - ******************************************************************************/ - - -%{ -#include <stdio.h> -#include <qcstring.h> -#include <qstringlist.h> -#include "config.h" - -#ifndef YYSTYPE -typedef int YYSTYPE; -#endif - -struct YYMM -{ - int itype; - QCString qstr; -}; - - - - -// define struct instead of union -#define YYSTYPE YYMM - -#include "membergroup.h" -#include "vhdldocgen.h" -#include "doxygen.h" -#include "searchindex.h" -#include "vhdlscanner.h" -#include "commentscan.h" -#include "entry.h" -#include "arguments.h" -#include "memberdef.h" -#include "vhdldocgen.h" - -//-----------------------------variables --------------------------------------------------------------------------- - - - - - -static VhdlContainer s_str; - -static QList<Entry>instFiles; -static QList<Entry>libUse; - - -static int yyLineNr; -static Entry* lastCompound; -static Entry* currentCompound; -static Entry* lastEntity; -static Entry* current; -static Entry* tempEntry; -static Entry* current_root; -static QCString compSpec; -static QCString currName; -static int levelCounter; -static QCString confName; -static QCString genLabels; -static QCString lab; -static QCString forL; -static QList<VhdlConfNode> configL; - - -static int currP=0; - -enum { GEN_SEC=0x1, PARAM_SEC,CONTEXT_SEC,PROTECTED_SEC } ; - -static int param_sec = 0; -static int parse_sec=0; - - -//---------------------------- functions -------------------------------------------------------------------------------- - -int vhdlscannerYYlex (); -void vhdlscannerYYerror (char const *); - -static void addVhdlType(const QCString &name,int startLine, - int section,uint64 spec, - const char* args,const char* type, - Protection prot=Public); -static void addCompInst(char *n, char* instName,char* comp,int line); - -static void newEntry(); -static void initEntry(Entry *e); - - -static void pushLabel(QCString &,QCString&); -static QCString popLabel(QCString&); -static void addConfigureNode(const char* a,const char*b, - bool isRoot,bool isLeave,bool inlineConf=FALSE); -//static bool addLibUseClause(const QCString &type); -static bool isFuncProcProced(); -static void initEntry(Entry *e); -static void addProto(const char *s1,const char *s2,const char *s3, - const char *s4,const char *s5,const char *s6); -static void createFunction(const QCString &impure,uint64 spec, - const QCString &fname); - -static void createFlow(); - -void newVhdlEntry() -{ - newEntry(); -} - -Entry* getCurrentVhdlEntry() -{ - return current; -} - -void initVhdlParser() -{ - lastCompound=0; - lastEntity=0; - currentCompound=0; - lastEntity=0; - current_root=s_str.root; - current=new Entry(); - initEntry(current); - libUse.clear(); -} - -QList<Entry> & getVhdlInstList() -{ - return instFiles; -} - -QList<Entry> & getLibUse() -{ - return libUse; -} - -%} - -%token -t_ABSTRLIST -t_CHARLIST -t_DIGIT -t_STRING -t_LETTER -t_ACCESS -t_AFTER -t_ALIAS -t_ALL -t_AND -t_ARCHITECTURE -t_ARRAY -t_ASSERT -t_ATTRIBUTE -t_BEGIN -t_BLOCK -t_BODY -t_BUFFER -t_BUS -t_CASE -t_COMPONENT -t_CONFIGURATION -t_CONSTANT -t_DISCONNECT -t_DOWNTO -t_ELSE -t_ELSIF -t_END -t_ENTITY -t_EXIT -t_FILE -t_FOR -t_FUNCTION -t_GENERATE -t_GENERIC -t_GUARDED -t_IF -t_IN -t_INOUT -t_IS -t_LABEL -t_LIBRARY -t_LINKAGE -t_LOOP -t_MAP -t_NAND -t_NEW -t_NEXT -t_NOR -t_NULL -t_OF -t_ON -t_OPEN -t_OR -t_OTHERS -t_OUT -t_PACKAGE -t_PORT -t_PROCEDURE -t_PROCESS -t_RANGE -t_RECORD -t_REGISTER -t_REPORT -t_RETURN -t_SELECT -t_SEVERITY -t_SIGNAL -t_SUBTYPE -t_THEN -t_TO -t_TRANSPORT -t_TYPE -t_UNITS -t_UNTIL -t_USE -t_VARIABLE -t_WAIT -t_WHEN -t_WHILE -t_WITH -t_XOR - -/* new keywords */ -t_IMPURE -t_PURE -t_GROUP -t_POSTPONED -t_SHARED -t_XNOR -t_SLL -t_SRA -t_SLA -t_SRL -t_ROR -t_ROL -t_UNAFFECTED -/*============== VHDL 2008 keywords ======================= */ - -t_ASSUME_GUARANTEE -t_ASSUME -t_CONTEXT -t_COVER -t_DEFAULT -t_FAIRNESS -t_FORCE -t_INERTIAL -t_LITERAL -t_PARAMETER -t_PROTECTED -t_PROPERTY -t_REJECT -t_RELEASE -t_RESTRICT -t_RESTRICT_GUARANTEE -t_SEQUENCE -t_STRONG -t_VMODE -t_VPROP -t_VUNIT - - -/*============== VHDL binary operators 2008 ======================= */ - -t_SLSL -t_SRSR -t_QQ -t_QGT -t_QLT -t_QG -t_QL -t_QEQU -t_QNEQU - -%nonassoc t_EQSym t_NESym t_LTSym t_LESym t_GTSym t_GESym t_QNEQU t_QEQU t_QL t_QG t_QLT t_QGT -%left t_Plus t_Minus t_Ampersand -%left MED_PRECEDENCE -%left t_Star t_Slash t_MOD t_REM -%nonassoc t_DoubleStar t_ABS t_NOT MAX_PRECEDENCE - -/* misc syms */ -/*t_Space */ - -%token -t_Apostrophe -t_LeftParen -t_RightParen -t_Comma -t_VarAsgn -t_Colon -t_Semicolon -t_Arrow -t_Box -t_Bar -t_Dot -t_Q -t_At -t_Neg -t_LEFTBR -t_RIGHTBR -t_ToolDir - -%type<qstr> designator literal enumeration_literal physical_literal physical_literal_no_default physical_literal_1 -%type<qstr> lib_clause use_clause sel_list entity_decl entity_start entity_decl_2 entity_decl_1 arch_body arch_start arch_body_1 -%type<qstr> config_decl config_start config_decl_2 config_decl_1 config_decl_3 package_decl package_start package_body pack_body_start package_body_2 package_body_1 common_decltve_item -%type<qstr> config_decltve_item subprog_decl subprog_body interf_list interf_element interf_element_4 interf_element_3 interf_element_2 interf_element_1 mode -%type<qstr> association_list association_list_1 association_list_2 gen_association_list gen_association_list_1 gen_association_list_2 association_element gen_association_element formal_part actual_part mark expr and_relation relation primary name name2 sel_name suffix ifts_name -%type<qstr> attribute_name aggregate element_association_list2 qualified_expr element_association choices choices_1 choices_2 choice type_decl type_decl_1 type_definition enumeration_type_definition enumeration_type_definition_1 enumeration_type_definition_2 physical_type_definition physical_type_definition_1 physical_type_definition_2 base_unit_decl secondary_unit_decl unconstrained_array_definition unconstrained_array_definition_1 unconstrained_array_definition_2 index_subtype_definition constrained_array_definition record_type_definition record_type_definition_1 record_type_definition_2 element_decl -%type<qstr> access_type_definition file_type_definition subtype_decl subtype_indic subtype_indic_1 subtype_indic1 subtype_indic1_1 range_constraint index_constraint index_constraint_1 index_constraint_2 discrete_range discrete_range1 range_spec direction constant_decl constant_decl_1 signal_decl signal_decl_2 signal_decl_1 variable_decl variable_decl_1 object_class signal_kind alias_decl file_decl file_decl_1 attribute_decl attribute_spec entity_spec entity_name_list entity_name_list_1 -%type<qstr> entity_name_list_2 entity_class block_stat -%type<qstr> generate_stat generate_stat_1 procs_stat procs_stat1 procs_stat1_1 sensitivity_list sensitivity_list_1 sensitivity_list_2 -%type<qstr> procedure_call_stat comp_decl comp_decl_2 comp_decl_1 block_config block_config_2 block_config_3 block_config_1 block_config_4 block_spec config_item comp_config comp_config_2 comp_config_1 config_spec binding_indic comp_spec -%type<qstr> inst_list entity_aspect idf_list procs_stat1_6 -%type<qstr> t_Identifier t_StringLit t_BitStringLit t_AbstractLit t_CharacterLit tbox group_name record_type_simple_name -%type<qstr> entity_class_entry_list entity_class_entry group_constituent_list group_constituent group_declaration group_template_declaration -%type<qstr> procs_stat1_5 comp_1 mark_comp dot_name fi_dec multiplying_operator factor term adding_op -%type<qstr> simple_exp alias_spec sigma signature1 mark_stats mark_stats_1 signature -%type<qstr> protected_type_body protected_type_declaration alias_name_stat vcomp_stat comp_spec_stat procs_decltve_item -%type<qstr> sig_stat external_name absolute_pathname relative_pathname package_path_name external_pathname pathname_element_list neg_list pathname_element - -%type<qstr> func_name return_is param func_prec iproc ifunc interface_subprogram_decl interface_package_decl package_instantiation_decl -%type<qstr> subprogram_instantiation_decl procs_stat1_4 -%type<qstr> context_ref libustcont_stats libustcont_stat context_decl entity_decltve_item case_stat -%type<qstr> exit_stat if_stat loop_stat next_stat null_stat return_stat signal_assign_stat -%type<qstr> variable_assign_stat wait_stat report_statement assertion_stat_2 assertion_stat_1 - -%type<qstr> binding_indic_2 binding_indic_1 shift_op block_decltve_item disconnection_spec seq_stats_1 seq_stats_2 seq_stats -%type<qstr> signal_list signal_list_1 signal_list_2 seq_stat assertion_stat choice_stat choice_stat_1 -%type<qstr> case_stat_1 case_stat_2 case_stat_alternative exit_stat_1 exit_stat_2 if_stat_2 if_stat_3 if_stat_1 loop_stat_2 loop_stat_1 loop_stat_3 -%type<qstr> next_stat_1 next_stat_2 return_stat_1 lable variable_assign_stat_1 -%type<qstr> wait_stat_1 wait_stat_2 wait_stat_3 target delay_mechanism -%type<qstr> if_generation_scheme if_scheme if_scheme_1 if_scheme_2 if_scheme_3 iteration_scheme for_scheme while_scheme concurrent_stats -%type<qstr> concurrent_stats_1 concurrent_stats_2 concurrent_stat block_stat_5 block_stat_4 block_stat_3 block_stat_2 block_stat_1 block_stat_0 -%type<qstr> generate_statement_body generation_scheme concurrent_assertion_stat concurrent_procedure_call concurrent_signal_assign_stat -%type<qstr> block_stat_6 block_stat_7 block_stat_8 condal_signal_assign sel_signal_assign opts condal_wavefrms wavefrm wavefrm_element -%type<qstr> wavefrm_1 wavefrm_2 wavefrm_element_1 wavefrm_element_2 opts_1 opts_2 sel_wavefrms -%type<qstr> sel_wavefrms_1 sel_wavefrms_2 gen_stat1 block_declarative_part end_stats inout_stat -%type<qstr> selected_signal_assignment comp_inst_stat - %type<qstr> conditional_signal_assignment selected_variable_assignment conditional_variable_assignment - %type<qstr> subprog_decltve_item subprog_body_3 subprog_body_1 procs_stat1_2 gen_assoc - -%debug - -// for debugging set yydebug=1 -%initial-action { yydebug=0; } - -%expect 3 - -// minimum bison version -//%required "2.2" - - - -%% -start: design_file - - -design_file : design_unit_list - /* parse function/process/procedure for vhdlflow */ - | procs_stat - | subprog_body - -design_unit_list: design_unit - | design_unit_list design_unit - ; - -designator : t_Identifier { $$=$1; } - | t_StringLit { $$=$1; } - ; - -literal : t_AbstractLit { $$=$1; } - | t_CharacterLit { $$=$1; } - | t_BitStringLit { $$=$1; } - | physical_literal_no_default { $$=$1; } - | t_NULL { $$="null"; } - ; - -enumeration_literal : t_CharacterLit { $$=$1; } - | t_Identifier { $$=$1; } - -physical_literal : physical_literal_1 t_Identifier { $$=$1+" "+$2; } - -physical_literal_1 : /* empty */ { $$=""; } - | t_AbstractLit { $$=$1; } - -physical_literal_no_default : t_AbstractLit t_Identifier { $$=$1+" "+$2; } - -idf_list : t_Identifier { $$=$1; } - | idf_list t_Comma t_Identifier { $$=$1+","+$3; } - ; - -/*------------------------------------------ --- Desing Unit ---------------------------------------------*/ - -design_unit : context_list lib_unit - -context_list : /* empty */ - | context_list context_item - -lib_unit : entity_decl - | config_decl - | package_decl - | arch_body - | package_body - | context_decl - | package_instantiation_decl - ; - -context_item : lib_clause - | use_clause - ; - -lib_clause : t_LIBRARY idf_list t_Semicolon - { - if ( parse_sec==0 && Config_getBool("SHOW_INCLUDE_FILES") ) - { - addVhdlType($2,getParsedLine(t_LIBRARY),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,$2.data(),"_library_"); - } - $$="library "+$2; - } - -use_clause : t_USE sel_list t_Semicolon - { - QStringList ql1=QStringList::split(",",$2,FALSE); - for (uint j=0;j<ql1.count();j++) - { - //QStringList ql=QStringList::split(".",ql1[j],FALSE); - QCString it=ql1[j].utf8(); - if ( parse_sec==0 && Config_getBool("SHOW_INCLUDE_FILES") ) - { - addVhdlType(it,getParsedLine(t_USE),Entry::VARIABLE_SEC,VhdlDocGen::USE,it.data(),"_use_"); - } - } - $$="use "+$2; - } - -sel_list : sel_name { $$=$1; } - | sel_list t_Comma sel_name { $$=$1+","+$3; } - ; -/*------------------------------------------ --- Library Units ---------------------------------------------*/ - -entity_decl : entity_start error comp_end_dec t_Semicolon - -entity_decl : entity_start entity_decl_1 entity_decl_2 - entity_decl_3 entity_decl_4 comp_end_dec t_Semicolon - -entity_start: t_ENTITY t_Identifier t_IS - { - $$=$2; - lastEntity=current; - lastCompound=0; - getParsedLine(t_ENTITY); - addVhdlType($$,getParsedLine(t_ENTITY),Entry::CLASS_SEC,VhdlDocGen::ENTITY,0,0,Public); - } - ; - -entity_decl_5 : /* empty */ - | t_Identifier - ; -entity_decl_4 : /* empty */ - | t_BEGIN concurrent_stats - ; -entity_decl_3 : /* empty */ - | entity_decl_3 entity_decl_6 - ; - -entity_decl_6 : entity_decltve_item - -entity_decl_2 : /* empty */ { $$=""; } - | t_PORT { currP=VhdlDocGen::PORT; } interf_list t_Semicolon { currP=0; } - ; -entity_decl_1 : /* empty */ { $$=""; } - | t_GENERIC { currP=VhdlDocGen::GENERIC;parse_sec=GEN_SEC; } interf_list t_Semicolon{ currP=0;parse_sec=0; } - | t_GENERIC error t_Semicolon{ currP=0; } - ; - - -arch_body : arch_start arch_body_1 t_BEGIN concurrent_stats t_END arch_body_2 t_Semicolon {lastCompound=0;} -arch_body : arch_start error t_END arch_body_2 t_Semicolon {lastCompound=0;} - -arch_start : t_ARCHITECTURE t_Identifier t_OF t_Identifier t_IS - { - $$=$4+"::"+$2; - genLabels.resize(0); - pushLabel(genLabels,$2); - lastCompound=current; - addVhdlType($$,getParsedLine(t_ARCHITECTURE),Entry::CLASS_SEC,VhdlDocGen::ARCHITECTURE,0,0,Private); - } -arch_body_2 : /* empty */ -arch_body_2 : t_Identifier -arch_body_2 : t_ARCHITECTURE t_Identifier -arch_body_2 : t_ARCHITECTURE - -arch_body_1 : /* empty */ { $$=""; } -arch_body_1 : arch_body_1 arch_body_3 - -arch_body_3 : block_decltve_item - -config_decl : config_start error t_END config_decl_2 t_Semicolon { genLabels.resize(0); } -config_decl : config_start config_decl_1 block_config t_END config_decl_2 t_Semicolon { genLabels.resize(0); } - { - QCString k=$3; - QCString k2=$2; - confName=""; - } - - -config_start : t_CONFIGURATION t_Identifier t_OF t_Identifier t_IS - { - forL.resize(0); - confName=$2+"::"+$4; - addVhdlType($2.data(),getParsedLine(t_CONFIGURATION),Entry::VARIABLE_SEC,VhdlDocGen::CONFIG,"configuration",$4.data()); - } - -config_decl_2 : /* empty */ { $$=""; } -config_decl_2 : t_Identifier - { - QCString l=$1; - $$=$1; - } -config_decl_2 : t_CONFIGURATION { $$="configuration"; } -config_decl_2 : t_CONFIGURATION t_Identifier { $$=$2; } -config_decl_1 : /* empty */ { $$=""; } -config_decl_1 : config_decl_1 config_decl_3 { $$=$1+" "+$2; } -config_decl_3 : config_decltve_item { $$=$1; } - -package_decl : package_start error t_END package_decl_2 t_Semicolon -package_decl : package_start package_decl_1 t_END package_decl_2 t_Semicolon -package_start : t_PACKAGE t_Identifier t_IS - { - lastCompound=current; - Entry *clone=new Entry(*current); - clone->section=Entry::NAMESPACE_SEC; - clone->spec=VhdlDocGen::PACKAGE; - clone->name=$2; - clone->startLine=s_str.iLine; - clone->bodyLine=s_str.iLine; - clone->protection=Package; - current_root->addSubEntry(clone); - addVhdlType($2,s_str.iLine,Entry::CLASS_SEC,VhdlDocGen::PACKAGE,0,0,Package); - } - -package_decl_2 : /* empty */ -package_decl_2 : t_Identifier { lastCompound=0; } -package_decl_2 : t_PACKAGE t_Identifier { lastCompound=0; } -package_decl_2 : t_PACKAGE { lastCompound=0; } - -package_decl_1 : /* empty */ -package_decl_1 : package_decl_22 -package_decl_1 : package_decl_1 package_decl_3 -package_decl_3 : package_decltve_item - -package_decl_22: gen_interface_list t_Semicolon -package_decl_22: gen_interface_list -package_decl_22: gen_interface_list gen_assoc_list -package_decl_22: gen_interface_list gen_assoc_list t_Semicolon - -package_body : pack_body_start error t_END package_body_2 t_Semicolon {lastCompound=0;} -package_body : pack_body_start package_body_1 t_END package_body_2 t_Semicolon {lastCompound=0;} -pack_body_start : t_PACKAGE t_BODY t_Identifier t_IS - { - $$=$3; - lastCompound=current; - $$.prepend("_"); - addVhdlType($$,getParsedLine(t_PACKAGE) ,Entry::CLASS_SEC,VhdlDocGen::PACKAGE_BODY,0,0,Protected); - } -package_body_2 : /* empty */ { $$="";lastCompound=0; } -package_body_2 : t_Identifier { lastCompound=0; } -package_body_2 : t_PACKAGE t_BODY { lastCompound=0; } -package_body_2 : t_PACKAGE t_BODY t_Identifier { lastCompound=0; } - -package_body_1 : /* empty */ { $$=""; } -package_body_1 : package_body_1 package_body_3 -package_body_3 : package_body_decltve_item - - -/*------------------------------------------ --- Declarative Item ---------------------------------------------*/ - -common_decltve_item_1: package_decl -common_decltve_item_1: package_instantiation_decl -common_decltve_item_1: package_body -common_decltve_item_1: subprogram_instantiation_decl - - -common_decltve_item: type_decl{ $$=$1; } -common_decltve_item: subtype_decl{ $$=$1; } -common_decltve_item: constant_decl{ $$=$1; } -common_decltve_item: file_decl{ $$=$1; } -common_decltve_item: alias_decl{ $$=$1; } -common_decltve_item: subprog_decl{ $$=$1; } -common_decltve_item: use_clause { $$=$1; } - -entity_decltve_item: common_decltve_item { $$=$1; } -entity_decltve_item: subprog_body { $$=$1; } -entity_decltve_item: attribute_decl { $$=$1; } -entity_decltve_item: attribute_spec { $$=$1; } -entity_decltve_item: disconnection_spec { $$=$1; } -entity_decltve_item: signal_decl { $$=$1; } -entity_decltve_item: variable_decl { $$=$1; } -entity_decltve_item: group_template_declaration { $$=$1; } -entity_decltve_item: group_declaration { $$=$1; } -entity_decltve_item: common_decltve_item_1 { $$=""; } - - -block_decltve_item: common_decltve_item -block_decltve_item: subprog_body -block_decltve_item: comp_decl -block_decltve_item: attribute_decl -block_decltve_item: attribute_spec -block_decltve_item: config_spec -block_decltve_item: disconnection_spec -block_decltve_item: signal_decl -block_decltve_item: variable_decl -block_decltve_item: group_template_declaration -block_decltve_item: group_declaration -block_decltve_item: common_decltve_item_1 { $$=""; } -block_decltve_item: tool_directive { $$=""; } - -block_declarative_part: block_decltve_item - | block_declarative_part block_decltve_item - - -package_decltve_item: common_decltve_item -package_decltve_item: comp_decl -package_decltve_item: attribute_decl -package_decltve_item: attribute_spec -package_decltve_item: disconnection_spec -package_decltve_item: signal_decl -package_decltve_item: variable_decl -package_decltve_item: group_template_declaration -package_decltve_item: group_declaration -package_decltve_item: package_decl -package_decltve_item: package_instantiation_decl -package_decltve_item: subprogram_instantiation_decl - -package_body_decltve_item: common_decltve_item -package_body_decltve_item: subprog_body -package_body_decltve_item: variable_decl -package_body_decltve_item: group_template_declaration -package_body_decltve_item: group_declaration -package_body_decltve_item: attribute_decl -package_body_decltve_item: attribute_spec -package_body_decltve_item: common_decltve_item_1 - -subprog_decltve_item: common_decltve_item { $$=$1; } -subprog_decltve_item: subprog_body { $$=""; } -subprog_decltve_item: attribute_decl { $$=$1; } -subprog_decltve_item: attribute_spec { $$=$1; } -subprog_decltve_item: variable_decl { $$=$1; } -subprog_decltve_item: group_template_declaration -subprog_decltve_item: group_declaration { $$=""; } -subprog_decltve_item: common_decltve_item_1 { $$=""; } - -procs_decltve_item: subprog_decltve_item { $$=$1; } - -config_decltve_item: attribute_spec { $$=$1; } -config_decltve_item: use_clause { $$=$1; } -config_decltve_item: group_declaration { $$=$1; } -config_decltve_item: t_USE t_VUNIT idf_list t_Semicolon { $$=$3; } - -/*------------------------------------------ --- Subprograms ---------------------------------------------*/ -func_prec: t_PURE { $$="pure"; } -func_prec: t_IMPURE { $$="impure"; } - -subprog_decl: subprog_spec t_Semicolon { currP=0; } - -subprog_spec: t_PROCEDURE t_Identifier - { - currP=VhdlDocGen::PROCEDURE; - createFunction($2,currP,0); - tempEntry=current; - } - subprog_spec_1 { newEntry(); } -subprog_spec: func_prec t_FUNCTION designator - { - currP=VhdlDocGen::FUNCTION; - createFunction($1,currP,$3.data()); - } - subprog_spec_2 t_RETURN mark - { - tempEntry=current; - current->type=$7; - newEntry(); - } - -subprog_spec : t_FUNCTION designator - { - currP=VhdlDocGen::FUNCTION; - createFunction(0,currP,$2.data()); - } - subprog_spec_2 t_RETURN mark - { - tempEntry=current; - current->type=$6; - newEntry(); - - } - -subprog_spec_22: gen_interface_list -subprog_spec_22: gen_interface_list gen_assoc_list - -subprog_spec_33: t_PARAMETER - { param_sec=PARAM_SEC; } - interf_list - { param_sec= 0; } -subprog_spec_33: { param_sec=PARAM_SEC; } - interf_list - { param_sec= 0; } - -subprog_spec_2: /* empty */ -subprog_spec_2: subprog_spec_22 subprog_spec_33 -subprog_spec_2: subprog_spec_33 -subprog_spec_2: subprog_spec_22 - -subprog_spec_1: subprog_spec_2 - -subprog_body: subprog_spec t_IS subprog_body_1 - { - if ($3.data()) - { - FlowChart::addFlowChart(FlowChart::VARIABLE_NO,$3,0); - } - FlowChart::addFlowChart(FlowChart::BEGIN_NO,"BEGIN",0); - } - t_BEGIN seq_stats t_END subprog_body_2 t_Semicolon - { - tempEntry->endBodyLine=s_str.yyLineNr; - createFlow(); - currP=0; - } -subprog_body: subprog_spec t_IS error t_END subprog_body_2 t_Semicolon - { - currP=0; - } -subprog_body_2: /* empty */ -subprog_body_2: designator -subprog_body_2: t_FUNCTION -subprog_body_2: t_PROCEDURE -subprog_body_2: t_PROCEDURE t_Identifier -subprog_body_2: t_FUNCTION t_Identifier -subprog_body_2: t_FUNCTION t_STRING - -subprog_body_1: /* empty */ { $$=""; } -//subprog_body_1 : subprogram_instantiation_decl -subprog_body_1: subprog_body_1 subprog_body_3 { $$=$1+$2; } - -subprog_body_3: subprog_decltve_item { $$=$1; } - -/*-------------------------------------------------- --- Interface Lists and Associaton Lists -----------------------------------------------------*/ - -interf_list: t_LeftParen interf_element interf_list_1 t_RightParen { $$=""; } -interf_list: t_LeftParen error t_RightParen { $$=""; } -interf_list_1: /* empty */ -interf_list_1: interf_list_1 interf_list_2 -interf_list_2: t_Semicolon interf_element - -interf_element: interface_package_decl - { - // adding generic : [ package foo is new bar] - if (parse_sec==GEN_SEC) - { - addVhdlType(current->name.data(),getParsedLine(t_PACKAGE),Entry::VARIABLE_SEC,VhdlDocGen::GENERIC,$1.data(),0); - } - } -interf_element: interface_subprogram_decl - { - if (parse_sec==GEN_SEC) - { - int a=getParsedLine(t_FUNCTION); - int b=getParsedLine(t_PROCEDURE); - - if (a>b) b=a; - - addVhdlType(current->name.data(),b,Entry::VARIABLE_SEC,VhdlDocGen::GENERIC,$1.data(),0); - } - } -interf_element: interf_element_1 t_Identifier - { - if (parse_sec==GEN_SEC) - { - addVhdlType($2,s_str.iLine,Entry::VARIABLE_SEC,currP,$1.data(),0); - } - } -interf_element: interf_element_1 idf_list t_Colon interf_element_2 subtype_indic interf_element_3 interf_element_4 - { - $$=$2+":"+$4+$5+$6+$7; - if (currP!=VhdlDocGen::COMPONENT) - { - if (currP==VhdlDocGen::FUNCTION || currP==VhdlDocGen::PROCEDURE) - { - addProto($1.data(),$2.data(),$4.data(),$5.data(),$6.data(),$7.data()); - } - else - { - QCString i=$5+$6+$7; - if (currP==VhdlDocGen::GENERIC) - addVhdlType($2,s_str.iLine,Entry::VARIABLE_SEC,currP,i.data(),$4.data()); - else if(parse_sec != GEN_SEC) - addVhdlType($2,s_str.iLine,Entry::VARIABLE_SEC,currP,i.data(),$4.data()); - } - // fprintf(stderr,"\n\n <<port %s >>\n",$$.data()); - } // if component - } -interf_element_4: /* empty :=*/ { $$=""; } -interf_element_4: t_VarAsgn expr { $$=":="+$2; } -interf_element_3: /* empty */ { $$=""; } -interf_element_3: t_BUFFER { $$="buffer"; } -interf_element_3: t_BUS { $$="bus"; } -interf_element_2: /* empty */ { $$=""; } -interf_element_2: mode { $$=$1; } -interf_element_1: /* empty */ { $$=""; } -interf_element_1: object_class { $$=$1; } - -mode: t_IN { $$="in"; } -mode: t_OUT { $$="out"; } -mode: t_INOUT { $$="inout"; } -mode: t_BUFFER { $$="buffer"; } -mode: t_LINKAGE { $$="link"; } - -association_list: t_LeftParen association_element association_list_1 t_RightParen { $$="("+$2+")"; } -association_list_1: /* empty */ { $$=""; } -association_list_1: association_list_1 association_list_2 { $$=$1+" "+$2; } -association_list_2: t_Comma association_element { $$=", "+$2; } -// VHDL '93 range_constraint ::= range range -gen_association_list : gen_assoc gen_assoc { $$=$1+$2;} - -gen_association_list : gen_assoc { $$=$1; } - -gen_assoc: t_LeftParen gen_association_element gen_association_list_1 t_RightParen - { - QCString str="("+$2+$3; - str.append(")"); - $$=str; - } - -gen_association_list: t_LeftParen error t_RightParen { $$=""; } -gen_association_list: t_LeftParen t_OPEN t_RightParen { $$=" ( open ) "; } - -gen_association_list_1: /* empty */ { $$=""; } -gen_association_list_1: gen_association_list_1 gen_association_list_2 { $$=$1+" "+$2; } -gen_association_list_2: t_Comma gen_association_element { $$=","+$2; } - -association_element: formal_part t_Arrow actual_part { $$=$1+"=>"+$3; } -association_element: actual_part { $$=$1; } -association_element: t_Box { $$="<>"; } -association_element: t_DEFAULT { $$="default"; } - -/* changed ;gen_association_element : association_element */ -gen_association_element: expr { $$=$1; } -gen_association_element: choice t_Arrow expr { $$=$1+"=>"+$3; } -gen_association_element: discrete_range1 { $$=$1 ; } - -formal_part: name { $$=$1; } - -actual_part: expr { $$=$1; } -actual_part: t_OPEN { $$="open"; } -actual_part: t_INERTIAL expr { $$="inertial"; } - -/*-------------------------------------------------- --- Names and Expressions -----------------------------------------------------*/ - -expr: and_relation { $$=$1; } -expr: relation { $$=$1; } - -shift_op: t_SLL { $$="sll"; } - | t_SRA { $$="sra"; } - | t_SLA { $$="sla"; } - | t_SRL { $$="srl"; } - | t_ROR { $$="ror"; } - | t_ROL { $$="rol"; } - ; -and_relation: relation shift_op relation { $$= $1+$2+$3; } -and_relation: relation t_AND relation { $$= $1+" and "+$3; } -and_relation: relation t_XOR relation { $$= $1+" xor "+$3; } -and_relation: relation t_OR relation { $$= $1+" or "+$3; } -and_relation: relation t_NOR relation { $$= $1+" nor "+$3; } -and_relation: relation t_XNOR relation { $$= $1+"xnor"+$3; } -and_relation: relation t_NAND relation { $$= $1+"nand"+$3; } -and_relation: and_relation t_NAND relation { $$= $1+"nand"+$3; } -and_relation: and_relation t_NOR relation{ $$= $1+"nor"+$3; } -and_relation: and_relation t_XNOR relation { $$= $1+"nand"+$3; } -and_relation: and_relation t_AND relation { $$= $1+" and "+$3; } -and_relation: and_relation t_OR relation { $$= $1+" or "+$3; } -and_relation: and_relation t_XOR relation { $$= $1+" xor "+$3; } - -/* ;relation : unary_operator primary */ - -relation: t_QQ primary { $$=" ?? "+$2; } -relation: primary { $$=$1; } -relation: t_Plus primary %prec MED_PRECEDENCE { $$="+"+$2; } -relation: t_Minus primary %prec MED_PRECEDENCE { $$="-"+$2; } -relation: t_ABS primary { $$="abs"+$2; } -relation: t_NOT primary { $$="not "+$2; } -relation: primary t_DoubleStar primary { $$=$1+" ** "+$3; } -relation: t_Minus primary t_DoubleStar primary { $$=$2+" ** "+$4; } - -/* relation : relation binary_operator primary */ - -relation: relation t_MOD relation { $$=$1+" mod "+$3; } -relation: relation t_REM relation { $$=$1+" rem "+$3; } -relation: relation t_Ampersand relation { $$=$1+" & "+$3; } -relation: relation t_Star relation { $$=$1+" * "+$3; } -relation: relation t_Plus relation { $$=$1+" + "+$3; } -relation: relation t_Minus relation { $$=$1+" - "+$3; } -relation: relation t_LESym relation { $$=$1+" <= "+$3; } -relation: relation t_GESym relation { $$=$1+" >= "+$3; } -relation: relation t_LTSym relation { $$=$1+" < "+$3; } -relation: relation t_GTSym relation { $$=$1+" > "+$3; } -relation: relation t_EQSym relation { $$=$1+" = "+$3; } -relation: relation t_NESym relation { $$=$1+" != "+$3; } -relation: relation t_Slash relation { $$=$1+" / "+$3; } -relation: relation t_QNEQU relation { $$=$1+" ?/= "+$3; } -relation: relation t_QEQU relation { $$=$1+" ?= "+$3; } -relation: relation t_QL relation { $$=$1+" ?< "+$3; } -relation: relation t_QG relation { $$=$1+" ?> "+$3; } -relation: relation t_QLT relation { $$=$1+" ?<= "+$3; } -relation: relation t_QGT relation { $$=$1+" ?>= "+$3; } - -simple_exp: t_Minus term { $$ = "-"+$2; } - | t_Plus term { $$ = "+"+$2; } - | term { $$ = $1; } - | simple_exp - adding_op term { $$ = $1+" "+$2+" "+$3; } - -adding_op: t_Ampersand { $$ = "&"; } - | t_Minus { $$ = "-"; } - | t_Plus { $$ = "+"; } - ; - -term: factor { $$=$1; } - | factor multiplying_operator factor { $$ = $1+" "+$2+" "+$3; } - ; - -multiplying_operator: t_Star { $$ = "*"; } - | t_REM { $$ = "rem"; } - | t_MOD { $$ = "mod"; } - | t_Slash { $$ = "/"; } - -factor: primary { $$=$1; } - | t_ABS primary { $$="abs "+$2; } - | t_NOT primary { $$="not "+$2; } - | primary t_DoubleStar primary { $$ = $1+" ** "+$3; } - -primary: name { $$=$1; } -primary: literal { $$=$1; } -primary: aggregate { $$=$1; } -primary: qualified_expr { $$=$1; } -primary: allocator { $$=""; } -primary: t_LeftParen expr t_RightParen { $$="("+$2+")"; } - -name: mark { $$=$1; } -name: name2 { $$=$1; } -name: external_name { $$=$1; } -name2: t_StringLit { $$=$1; } -name2: attribute_name { $$=$1; } -name2: ifts_name { $$=$1; } - -mark: t_Identifier { $$=$1; } -mark: sel_name { $$=$1; } - -sel_name: name t_Dot suffix { $$=$1+"."+$3; } - -suffix: designator { $$=$1; } -suffix: t_CharacterLit { $$=$1; } -suffix: t_ALL { $$="all"; } - -ifts_name: mark gen_association_list { $$=$1+" "+$2; } -ifts_name: name2 gen_association_list { $$=$1+" "+$2; } - -sigma: t_Apostrophe { $$="'"; } -//sigma : t_LEFTBR signature1 t_RIGHTBR t_Apostrophe { $$="("+$2;;$$.append(")");$$.append("'"); } - -attribute_name: mark sigma t_Identifier { $$=$1+"' "+$3; } -attribute_name: attribute_name t_LeftParen expr t_RightParen -attribute_name: name2 sigma t_Identifier { $$=$1+" '"+$3; } -attribute_name: mark sigma t_RANGE { $$=$1+"' range "; } -attribute_name: name2 sigma t_RANGE { $$=$1+"' range "; } - -aggregate : element_association_list2 t_RightParen { $$=$1+" ) "; } -aggregate : t_LeftParen choices t_Arrow expr t_RightParen { $$="( "+$2+ "=>"+$4+" ) "; } - -element_association_list2 : t_LeftParen element_association t_Comma element_association { $$=" ( "+$2+","+$4; } -element_association_list2 : element_association_list2 t_Comma element_association { $$=$1+","+$3; } - -qualified_expr : mark t_Apostrophe t_LeftParen expr t_RightParen { $$=$1+"'("+$4+" ) "; } -qualified_expr : mark t_Apostrophe aggregate { $$=$1+"'"+$3; } - -allocator: t_NEW mark mark allocator_1 -allocator: t_NEW mark allocator_2 -allocator: t_NEW qualified_expr -allocator_2: /* empty */ -allocator_2: gen_association_list -allocator_1: /* empty */ -allocator_1: gen_association_list - - -/*-------------------------------------------------- --- Element Association and Choices -----------------------------------------------------*/ - -element_association: choices t_Arrow expr { $$=$1+"=> "+$3; } -element_association: expr { $$=$1; } - -choices: choice choices_1 { $$=$1+" "+$2; } -choices_1: /* empty */ { $$=""; } -choices_1: choices_1 choices_2 { $$=$1+" "+$2; } -choices_2: t_Bar choice { $$=" | "+$2; } - -choice: expr { $$=$1; } -choice: discrete_range1 { $$=$1; } -choice: t_OTHERS { $$="others"; } - -/*-------------------------------------------------- --- Type Declarations -----------------------------------------------------*/ -type_decl: t_TYPE t_Identifier error t_Semicolon { $$=""; } -type_decl: t_TYPE t_Identifier type_decl_1 t_Semicolon - { - addVhdlType($2,getParsedLine(t_TYPE),Entry::VARIABLE_SEC,VhdlDocGen::TYPE,0,$3.data()); - $$="type "; - $$+=$2+$3+";"; - } -type_decl: t_TYPE error t_Semicolon { $$=""; } - -type_decl_1: /* empty */ { $$=""; } -type_decl_1: t_IS type_definition { $$=" "+$2; } - -type_definition: enumeration_type_definition { $$=$1; } -type_definition: range_constraint { $$=$1; } -type_definition: physical_type_definition { $$=$1; } -type_definition: unconstrained_array_definition { $$=$1; } -type_definition: constrained_array_definition { $$=$1; } -type_definition: record_type_definition { $$=$1; } -type_definition: access_type_definition { $$=$1; } -type_definition: file_type_definition { $$=$1; } -type_definition: protected_type_declaration { $$=$1; } -type_definition: protected_type_body { $$=$1; } - - -enumeration_type_definition: t_LeftParen enumeration_literal enumeration_type_definition_1 t_RightParen { $$="( "+$2+" "+$3+" )"; } -enumeration_type_definition_1: { $$=""; } -enumeration_type_definition_1: enumeration_type_definition_1 enumeration_type_definition_2 { $$=$1+" "+$2; } -enumeration_type_definition_2: t_Comma enumeration_literal { $$=","+$2; } - -physical_type_definition : range_constraint t_UNITS base_unit_decl - physical_type_definition_1 t_END unit_stat - { - $$=$1; - current->args=$3+"#"+$4; - current->args.prepend("units"); - current->spec=VhdlDocGen::UNITS; - } - -unit_stat: t_UNITS t_Identifier -unit_stat: t_UNITS - -physical_type_definition_1: /* empty */ { $$=""; } -physical_type_definition_1: physical_type_definition_1 physical_type_definition_2 { $$=$1+" "+$2; } -physical_type_definition_2: secondary_unit_decl { $$=$1+"#"; } - -base_unit_decl: t_Identifier t_Semicolon { $$=$1; } - -secondary_unit_decl: t_Identifier t_EQSym physical_literal t_Semicolon { $$=$1+"="+$3; } - -unconstrained_array_definition: t_ARRAY t_LeftParen - index_subtype_definition unconstrained_array_definition_1 t_RightParen t_OF - subtype_indic - { - QCString sr1=" array ( "+$3+" "+$4; - QCString sr2=" ) of "+$7; - $$=sr1+sr2; - } - -unconstrained_array_definition_1: { $$=""; } -unconstrained_array_definition_1: unconstrained_array_definition_1 unconstrained_array_definition_2 { $$=$1+" "+$2; } -unconstrained_array_definition_2: t_Comma index_subtype_definition { $$=", "+$2; } - -index_subtype_definition: mark t_RANGE t_Box { $$=$1+" range<> "; } - -constrained_array_definition: t_ARRAY index_constraint t_OF subtype_indic { $$=" array "+$2+" of "+$4; } - -record_type_simple_name:/*empty*/ { $$=""; } - | t_Identifier { $$=$1; } - -record_type_definition: t_RECORD element_decl record_type_definition_1 t_END - t_RECORD record_type_simple_name - { - QRegExp reg("[\\s]"); - QCString oo=$2+" "+$3; - current->spec=VhdlDocGen::RECORD; - current->args=oo; - current->args.replace(reg,"%"); - current->args.prepend("record"); - $$=$2+" "+$3; - } - -record_type_definition_1: /*empty*/ { $$=""; } -record_type_definition_1: record_type_definition_1 record_type_definition_2 - { - $$=$1+" "+$2; - } -record_type_definition_2: element_decl { $$=$1; } - -element_decl: idf_list t_Colon subtype_indic t_Semicolon { $$=$1+":"+$3+"#"; } - -access_type_definition: t_ACCESS subtype_indic { $$="access "+$2; } - -file_type_definition: t_FILE t_OF mark { $$="file of "+$3; } - -/*-------------------------------------------------- --- Subtypes and Constraints -----------------------------------------------------*/ - -subtype_decl: t_SUBTYPE t_Identifier t_IS subtype_indic t_Semicolon - { - addVhdlType($2,getParsedLine(t_SUBTYPE),Entry::VARIABLE_SEC,VhdlDocGen::SUBTYPE,0,$4.data()); - } -subtype_decl: t_SUBTYPE error t_Semicolon { $$=""; } -subtype_indic: mark subtype_indic_1 { $$=$1+" "+$2; } -subtype_indic: subtype_indic1 { $$=$1; } -subtype_indic_1: /* empty */ { $$=""; } -subtype_indic_1: gen_association_list { $$=$1; } - -subtype_indic1: mark mark range_constraint { $$=$1+" "+$2+" "+$3; } -subtype_indic1: mark range_constraint { $$=$1+" "+$2; } -subtype_indic1: mark mark subtype_indic1_1 { $$=$1+" "+$2+" "+$3; } -subtype_indic1_1: /* empty */ { $$=""; } -subtype_indic1_1: gen_association_list { $$=$1; } - -range_constraint: t_RANGE range_spec { $$="range "+$2; } -//range_constraint : array_constraint - -index_constraint: t_LeftParen discrete_range - index_constraint_1 - t_RightParen { $$="("+$2+" "+$3+")"; } -index_constraint_1: /* empty */ { $$=""; } -index_constraint_1: index_constraint_1 - index_constraint_2 { $$=$1+" "+$2; } -index_constraint_2: t_Comma discrete_range { $$=","+$2; } - -discrete_range: subtype_indic { $$=$1; } -discrete_range: range_spec { $$=$1; } - -discrete_range1 : subtype_indic1 { $$=$1; } -discrete_range1 : expr direction expr { $$=$1+" "+$2+" "+$3; } - -range_spec : attribute_name { $$=$1; } -range_spec : simple_exp direction simple_exp { $$=$1+" "+$2+" "+$3; } - -direction : t_TO { $$=" to "; } -direction : t_DOWNTO { $$=" downto "; } - -/*-------------------------------------------------- --- Objects, Aliases, Files, Disconnections -----------------------------------------------------*/ - -constant_decl: t_CONSTANT idf_list t_Colon subtype_indic constant_decl_1 t_Semicolon - { - QCString it=$4+" "+$5; - // fprintf(stderr,"\n currP %d \n",currP); - addVhdlType($2,getParsedLine(t_CONSTANT),Entry::VARIABLE_SEC,VhdlDocGen::CONSTANT,0,it.data()); - $$="constant "+$2; - $$+=": "; - $$+=it+";"; - } -constant_decl_1: /* empty */ { $$=""; } -constant_decl_1: t_VarAsgn expr { $$=":="+$2; } - -signal_decl: t_SIGNAL idf_list t_Colon subtype_indic signal_decl_1 signal_decl_2 t_Semicolon - { - QCString s=$4+" "+$6; - addVhdlType($2,getParsedLine(t_SIGNAL),Entry::VARIABLE_SEC,VhdlDocGen::SIGNAL,0,s.data()); - } -signal_decl_2: /* empty */ { $$=""; } -signal_decl_2: t_VarAsgn expr { $$=":="+$2; } -signal_decl_1: /* empty */ { $$=""; } -signal_decl_1: signal_kind { $$=$1; } - -variable_decl: t_VARIABLE idf_list t_Colon subtype_indic variable_decl_1 t_Semicolon - { - $$=$2+":"+$4+" "+$5+";"; - $$.prepend("variable: "); - } -variable_decl: t_SHARED t_VARIABLE idf_list t_Colon subtype_indic variable_decl_1 t_Semicolon - { - $$=$5+" "+$6; - addVhdlType($3,getParsedLine(t_VARIABLE),Entry::VARIABLE_SEC,VhdlDocGen::SHAREDVARIABLE,0,$$.data()); - } -variable_decl_1: /* empty */ { $$=""; } -variable_decl_1: t_VarAsgn expr { $$=":="+$2; } - -object_class: t_CONSTANT { $$="constant"; } -object_class: t_SIGNAL { $$="signal"; } -object_class: t_VARIABLE { $$="variable"; } -object_class: t_SHARED t_VARIABLE { $$="shared"; } -object_class: t_FILE { $$="file"; } -object_class: t_TYPE { $$="type"; } - -signal_kind: t_BUS { $$="bus"; } -signal_kind: t_REGISTER { $$="register"; } - -alias_decl: t_ALIAS alias_name_stat alias_spec t_IS name signature t_Semicolon - { - QCString s=$3+" is "+$5+$6; - addVhdlType($2,getParsedLine(t_ALIAS),Entry::VARIABLE_SEC,VhdlDocGen::ALIAS,0,s.data()); - $$="alias "+$2; - $$+=": "; - $$+=s+";"; - } -alias_decl: t_ALIAS alias_name_stat alias_spec t_IS error t_Semicolon { $$=""; } - -alias_name_stat: t_Identifier { $$=$1; } -alias_name_stat: t_StringLit { $$=$1; } - -alias_spec :/*empty*/ { $$=""; } - | t_Colon subtype_indic { $$=$2; } - ; - -file_decl: t_FILE idf_list t_Colon subtype_indic t_IS file_decl_1 expr t_Semicolon - { - addVhdlType($2,getParsedLine(t_FILE),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,$4.data()); - } - -file_decl: t_FILE idf_list t_Colon t_Identifier fi_dec t_Semicolon - { - QCString s=$4+" "+$5; - addVhdlType($2,getParsedLine(t_FILE),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,s.data()); - } - -fi_dec: /*empty*/ { $$=""; } - | t_OPEN expr t_IS expr { $$="open "+$2+" is "+s_str.qstr; } - - -file_decl_1: /* empty */ { $$=""; } -file_decl_1: mode { $$=$1; } - -disconnection_spec: t_DISCONNECT signal_list t_Colon mark t_AFTER expr t_Semicolon - { $$="disconnect "+$2+":"+$4+" after "+$6; } - -signal_list: name signal_list_1 { $$=$1+$2; } -signal_list: t_OTHERS { $$="others"; } -signal_list: t_ALL { $$="all"; } -signal_list_1: /* empty */ { $$=""; } -signal_list_1: signal_list_1 signal_list_2 { $$=$1+$2; } -signal_list_2: t_Comma name { $$=" , "+$2; } - -/*-------------------------------------------------- --- Attribute Declarations and Specifications -----------------------------------------------------*/ - -attribute_decl: t_ATTRIBUTE t_Identifier t_Colon mark t_Semicolon - { - addVhdlType($2,getParsedLine(t_ATTRIBUTE),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,$4.data()); - $$= "attribute "+$2+ " : "+$4; - } - -attribute_spec: t_ATTRIBUTE t_Identifier t_OF entity_spec t_IS expr t_Semicolon - { - QCString att=$4+" is "+$6; - addVhdlType($2,getParsedLine(t_ATTRIBUTE),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,att.data()); - $$="attribute "+att+";"; - } - -entity_spec : entity_name_list signature t_Colon entity_class { $$=$1+$2+":"+$4; } - -entity_name_list: designator entity_name_list_1 { $$=$1+" "+$2; } -entity_name_list: t_OTHERS { $$="others"; } -entity_name_list: t_ALL { $$="all"; } -entity_name_list_1: /* empty */ { $$=""; } -entity_name_list_1: entity_name_list_1 entity_name_list_2 { $$=$1+" "+$2; } -entity_name_list_2: t_Comma designator { $$=","+$2; } - -entity_class: t_ENTITY { $$="entity"; } -entity_class: t_ARCHITECTURE { $$="architecture"; } -entity_class: t_PACKAGE { $$="package"; } -entity_class: t_CONFIGURATION { $$="configuration"; } -entity_class: t_COMPONENT { $$="component"; } -entity_class: t_LABEL { $$="label"; } -entity_class: t_TYPE { $$="type"; } -entity_class: t_SUBTYPE { $$="subtype"; } -entity_class: t_PROCEDURE { $$="procedure"; } -entity_class: t_FUNCTION { $$="function"; } -entity_class: t_SIGNAL { $$="signal"; } -entity_class: t_VARIABLE { $$="variable"; } -entity_class: t_CONSTANT { $$="constant"; } -entity_class: t_GROUP { $$="group"; } -entity_class: t_FILE { $$="file"; } -entity_class: t_UNITS { $$="units"; } -entity_class: t_LITERAL { $$="literal"; } -entity_class: t_SEQUENCE { $$="sequence"; } -entity_class: t_PROPERTY { $$="property"; } - - -/*-------------------------------------------------- --- Schemes ---------------------------------------------------------------------------*/ - -if_generation_scheme: if_scheme { $$=$1; } - -if_scheme: t_IF expr t_GENERATE generate_statement_body if_scheme_1 if_scheme_2 { $$=""; } -if_scheme: t_IF lable expr t_GENERATE generate_statement_body if_scheme_1 if_scheme_2 { $$=""; } - -if_scheme_2: /* empty */ { $$=""; } -if_scheme_2: t_ELSE t_GENERATE generate_statement_body { $$="else generate "+$3; } -if_scheme_2: t_ELSE lable t_GENERATE generate_statement_body { $$="else "+$2+" generate "+$4; } -if_scheme_1: /* empty */ { $$=""; } -if_scheme_1: if_scheme_1 if_scheme_3 { $$=$1+$2; } -if_scheme_3: t_ELSIF expr t_GENERATE generate_statement_body { $$="elsif "+$2+" generate "+$4; } -if_scheme_3: t_ELSIF lable expr t_GENERATE generate_statement_body { $$="elsif "+$2+$3+" generate "+$5; } - -generation_scheme: for_scheme { $$=$1; } - -iteration_scheme: for_scheme { $$=$1; } -iteration_scheme: while_scheme { $$=$1; } - -for_scheme: t_FOR t_Identifier t_IN discrete_range - { - if (!lab.isEmpty()) - { - $$=lab+" :for "+$2+" in "+$4; - } - else - { - $$=" for "+$2+" in "+$4; - } - FlowChart::addFlowChart(FlowChart::FOR_NO,0,$$,lab.data()); - lab.resize(0); - } -for_scheme: t_FOR lable t_Identifier t_IN discrete_range - { - $$=lab+" for "+$2+$3+" in "+$5; - FlowChart::addFlowChart(FlowChart::FOR_NO,0,$$,lab.data()); - lab=""; - } - -while_scheme: t_WHILE expr { - $$=" while "+$2; - FlowChart::addFlowChart(FlowChart::WHILE_NO,0,$$,lab.data()); - lab=""; - } - -/*-------------------------------------------------- --- Concurrent Statements -----------------------------------------------------*/ - -concurrent_stats: concurrent_stats_1 { $$=$1; } -concurrent_stats_1: /* empty */ { $$=""; } -concurrent_stats_1: concurrent_stats_1 concurrent_stats_2 { $$=$1+$2; } -concurrent_stats_2: concurrent_stat { $$=$1; } - -concurrent_stat : block_stat { $$=$1; } - | concurrent_assertion_stat { $$=$1; } - | concurrent_procedure_call { $$=$1; } - | concurrent_signal_assign_stat { $$=$1; } - | comp_inst_stat { - QCString li=$1; - $$=$1; - } - | generate_stat { $$=$1; } - | procs_stat - -block_stat: t_Identifier t_Colon t_BLOCK { pushLabel(genLabels,$1); } block_stat_0 block_stat_1 block_stat_2 - block_stat_3 block_stat_4 t_BEGIN concurrent_stats t_END t_BLOCK block_stat_5 - t_Semicolon - { - $$=$1+":block"; //+$4+$5+$6+$7+$8+"begin "+$10+" block "+$13; - genLabels=popLabel(genLabels); - } -block_stat_5: /* empty */ { $$=""; } -block_stat_5: t_Identifier { $$=$1; } -block_stat_4: /* empty */ { $$=""; } -block_stat_4: block_stat_4 block_stat_6 { $$=$1+$2; } -block_stat_6: block_decltve_item { $$=$1; } -block_stat_3: /* empty */ { $$=""; } -block_stat_3: t_PORT interf_list t_Semicolon block_stat_7 { $$="port "+$2+";"+$4; } -//block_sta_7: /* empty */ { $$=""; } -block_stat_7: t_PORT t_MAP association_list t_Semicolon { $$="port map "+$3; } -block_stat_2: /* empty */ { $$=""; } -block_stat_2: t_GENERIC interf_list t_Semicolon block_stat_8 { $$="generic "+$2+";"+$4; } -block_stat_8: /* empty */ { $$=""; } -block_stat_8: t_GENERIC t_MAP association_list t_Semicolon { $$="generic map "+$3; } -block_stat_1: /* empty */ { $$=""; } -block_stat_1: t_LeftParen expr t_RightParen block_stat_0 { $$="("+$2+")"+$4; } -block_stat_0: /* empty */ { $$=""; } -block_stat_0: t_IS { $$=" is "; } - -dot_name: t_Identifier { $$=$1; } - | dot_name t_Dot t_Identifier { $$=$1+"."+$3; } - ; - -mark_comp: dot_name comp_1 { $$=$1+" "+$2; } -mark_comp: dot_name { $$=$1; } - -comp_1: t_LeftParen t_Identifier t_RightParen { $$="("+$2+")"; } - -vcomp_stat: t_CONFIGURATION { $$="configuration";yyLineNr=s_str.iLine; } -vcomp_stat: t_ENTITY { $$="entity";yyLineNr=s_str.iLine; } -vcomp_stat: t_COMPONENT { $$="component";yyLineNr=s_str.iLine; } - -comp_inst_stat: t_Identifier t_Colon name { yyLineNr=s_str.iLine; } t_GENERIC t_MAP association_list comp_inst_stat_1 t_Semicolon - { - addCompInst($1.lower().data(),$3.lower().data(),0,yyLineNr);$$=""; - } -comp_inst_stat: t_Identifier t_Colon name { yyLineNr=s_str.iLine; } t_PORT t_MAP association_list t_Semicolon - { - addCompInst($1.lower().data(),$3.lower().data(),0,yyLineNr);$$="222"; - } - -comp_inst_stat: t_Identifier t_Colon vcomp_stat mark_comp t_PORT t_MAP association_list t_Semicolon - { - addCompInst($1.lower().data(),$4.lower().data(),$3.data(),yyLineNr);$$=""; - } -comp_inst_stat: t_Identifier t_Colon vcomp_stat mark_comp t_GENERIC t_MAP association_list comp_inst_stat_1 t_Semicolon - { - addCompInst($1.lower().data(),$4.lower().data(),$3.lower().data(),yyLineNr);$$=""; - } -comp_inst_stat_1: /* empty { $$=""; } */ -comp_inst_stat_1: t_PORT t_MAP association_list // { $$="port map"+$3; } - -concurrent_assertion_stat: t_Identifier t_Colon assertion_stat { $$=$1+":"+$3; } -concurrent_assertion_stat: assertion_stat { $$=$1; } - -concurrent_assertion_stat: t_Identifier t_Colon t_POSTPONED assertion_stat { $$=$1+":"+"postponed "+$4; } -concurrent_assertion_stat: t_POSTPONED assertion_stat { $$="postponed "+$2; } - -concurrent_procedure_call: t_Identifier t_Colon procedure_call_stat { $$=$1+":"+$3; } -concurrent_procedure_call: procedure_call_stat { $$=$1; } - -concurrent_procedure_call: t_Identifier t_Colon t_POSTPONED procedure_call_stat { $$=$1+":"+"postponed "+$4; } -concurrent_procedure_call: t_POSTPONED procedure_call_stat { $$="postponed "+$2; } - -concurrent_signal_assign_stat: t_Identifier t_Colon condal_signal_assign { $$=$1+":"+$3; } -concurrent_signal_assign_stat: condal_signal_assign { $$=$1; } - -concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED condal_signal_assign { $$=$1+":"+"postponed "+$4; } -concurrent_signal_assign_stat: t_POSTPONED condal_signal_assign { $$="postponed "+$2; } - -concurrent_signal_assign_stat: t_Identifier t_Colon t_POSTPONED sel_signal_assign { $$=$1+":"+"postponed "+$4; } -concurrent_signal_assign_stat: t_POSTPONED sel_signal_assign { $$="postponed "+$2; } - -concurrent_signal_assign_stat: t_Identifier t_Colon sel_signal_assign { $$=$1+":"+$3; } -concurrent_signal_assign_stat: sel_signal_assign { $$=$1; } - -condal_signal_assign: target t_LESym opts condal_wavefrms t_Semicolon { $$=$1+"<="+$3+$4; } - -condal_wavefrms: wavefrm { $$=$1; } -condal_wavefrms: wavefrm t_WHEN expr { $$=$1+" when "+$3; } -condal_wavefrms: wavefrm t_WHEN expr t_ELSE condal_wavefrms { $$=$1+" when "+$3+"else"+$5; } - -wavefrm: wavefrm_element wavefrm_1 { $$=$1+$2; } -wavefrm: t_UNAFFECTED { $$="unaffected"; } -wavefrm_1: /* empty */ { $$=""; } -wavefrm_1: wavefrm_1 wavefrm_2 { $$=$1+$2; } -wavefrm_2: t_Comma wavefrm_element { $$=","+$2; } - -wavefrm_element: expr wavefrm_element_1 { $$=$1+$2; } -wavefrm_element_1: /* empty */ { $$=""; } -wavefrm_element_1: t_AFTER expr { $$="after "+$2; } -wavefrm_element_1: t_NULL wavefrm_element_2 { $$=" null "+$2; } -wavefrm_element_1: t_NULL { $$=" null "; } -wavefrm_element_2: t_AFTER expr { $$="after "+$2; } - -target: name { $$=$1; } -target: aggregate { $$=$1; } - -opts: opts_1 opts_2 { $$=$1+$2; } - -opts_2: /* empty */ { $$=""; } -opts_2: t_TRANSPORT { $$="transport "; } -opts_2: t_REJECT expr t_INERTIAL { $$="transport"+$2+" intertial "; } -opts_2: t_INERTIAL { $$=" intertial "; } - -opts_1: /* empty */ { $$=""; } -opts_1: t_GUARDED { $$=" guarded "; } - -sel_signal_assign: t_WITH expr t_SELECT target t_LESym opts sel_wavefrms t_Semicolon - { $$="with "+$2+" select "+$4+"<="+$6+$7; } - -sel_wavefrms: sel_wavefrms_1 wavefrm t_WHEN choices { $$=$1+$2; } -sel_wavefrms_1: /* empty */ { $$=""; } -sel_wavefrms_1: sel_wavefrms_1 sel_wavefrms_2 { $$=$1+$2; } -sel_wavefrms_2: wavefrm t_WHEN choices t_Comma { $$=$1+" when "+$3; } - -gen_stat1: /* empty */ { $$=""; } - | block_declarative_part t_BEGIN { $$=$1+" begin "; } - | t_BEGIN { $$="begin "; } - - // problem with double end - // end; - // end generate; - -generate_statement_body: gen_stat1 concurrent_stats - -generate_stat : t_Identifier t_Colon - { pushLabel(genLabels,$1); } - generation_scheme t_GENERATE - gen_stat1 concurrent_stats opstat - -// stems from VHDL 2008 generate_statement_body -opstat: end_stats t_END generate_stat_1 t_Semicolon { genLabels=popLabel(genLabels); } -opstat: t_END generate_stat_1 t_Semicolon {genLabels=popLabel(genLabels); } - -generate_stat: t_Identifier t_Colon - { pushLabel(genLabels,$1); } - if_generation_scheme opstat // t_END generate_stat_1 t_Semicolon { genLabels=popLabel(genLabels); } -generate_stat: t_Identifier t_Colon case_scheme - -generate_stat_1: t_GENERATE { $$=""; } -generate_stat_1: t_GENERATE t_Identifier { $$=$2; } - -//end_stats : -end_stats: t_END t_Semicolon { $$="end"; } -end_stats: t_END t_Identifier t_Semicolon { $$="end "+$2; } - -procs_stat: t_Identifier t_Colon procs_stat1 - { - current->name=$1; - tempEntry=current; - current->endBodyLine=s_str.yyLineNr; - newEntry(); - currName=$1; - } - -procs_stat: procs_stat1 - { - current->name=VhdlDocGen::getProcessNumber(); - current->endBodyLine=s_str.yyLineNr; - tempEntry=current; - newEntry(); - } - -procs_stat1: procs_stat1_5 - { - currP=VhdlDocGen::PROCESS; - current->startLine=s_str.yyLineNr; - current->bodyLine=s_str.yyLineNr; - } - t_PROCESS procs_stat1_1 procs_stat1_2 - { - if ($5.data()) - FlowChart::addFlowChart(FlowChart::VARIABLE_NO,$5.data(),0); - FlowChart::addFlowChart(FlowChart::BEGIN_NO,"BEGIN",0); - } - t_BEGIN seq_stats t_END - - procs_stat1_3 t_Semicolon - { - $5.stripPrefix($4.data()); - tempEntry=current; - currP=0; - createFunction(currName,VhdlDocGen::PROCESS,$4.data()); - createFlow(); - currName=""; - } -procs_stat1: error t_END procs_stat1_3 t_Semicolon { currP=0; } - -procs_stat1_3: /* empty */ -procs_stat1_3: procs_stat1_5 t_PROCESS procs_stat1_6 - -procs_stat1_5: /* empty */ { $$=""; } -procs_stat1_5: t_POSTPONED { $$="postponed"; } - -procs_stat1_6: /* empty */ { $$=""; } -procs_stat1_6: t_Identifier { $$=$1; } - -procs_stat1_2: /* empty */ { $$=""; } -procs_stat1_2: t_IS { $$=""; } -procs_stat1_2: procs_stat1_2 procs_stat1_4 { $$+=$2; } -procs_stat1_4: procs_decltve_item { $$=$1; } -procs_stat1_1: /* empty */ { $$=""; } -procs_stat1_1: t_LeftParen t_ALL t_RightParen { $$="all"; } -procs_stat1_1: t_LeftParen sensitivity_list t_RightParen { $$=$2; } - -sensitivity_list: name sensitivity_list_1 { $$=$1+" "+$2; } -sensitivity_list_1: /* empty */ { $$=""; } -sensitivity_list_1: sensitivity_list_1 sensitivity_list_2 { $$=$1+" "+$2; } -sensitivity_list_2: t_Comma name { $$=","+$2; } - -/*-------------------------------------------------- --- Sequential Statements -----------------------------------------------------*/ - -seq_stats: seq_stats_1 { $$=$1; } -seq_stats_1: /* empty */ { $$=""; } -seq_stats_1: seq_stats_1 seq_stats_2 { $$=$1+$2; } -seq_stats_2: seq_stat { $$=$1; } -seq_stat: assertion_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } -seq_stat: lable assertion_stat { $$=$1+$2; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } -seq_stat: case_stat { $$=$1; } -seq_stat: exit_stat { $$=$1; } -seq_stat: if_stat { $$=""; } -seq_stat: loop_stat { $$=$1; } -seq_stat: next_stat { $$=$1; } -seq_stat: null_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } -seq_stat: procedure_call_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } -seq_stat: return_stat { $$=$1; FlowChart::addFlowChart(FlowChart::RETURN_NO,$$.data(),0); } -seq_stat: lable signal_assign_stat { $$=$1+$2; } -seq_stat: signal_assign_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } -seq_stat: variable_assign_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } -seq_stat: wait_stat { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } -seq_stat: lable wait_stat { $$=$1+$2; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } -seq_stat: report_statement { $$=$1; FlowChart::addFlowChart(FlowChart::TEXT_NO,$$.data(),0); } - -report_statement: loop_stat_1 t_REPORT expr assertion_stat_2 t_Semicolon { $$=$1+"report "+$3+$4+";"; } - -assertion_stat: t_ASSERT expr assertion_stat_1 assertion_stat_2 t_Semicolon { $$="assert "+$2+$3+$4+";"; } -assertion_stat_2: /* empty */ { $$=""; } -assertion_stat_2 : t_SEVERITY expr { $$=" serverity "+$2; } -assertion_stat_1 : /* empty */ { $$=""; } -assertion_stat_1 : t_REPORT expr { $$=" report "+$2; } - -choice_stat : /* empty */ { $$=""; } -choice_stat : t_Q { $$="?"; } - -choice_stat_1: /* empty */ { $$=""; } -choice_stat_1 : t_Q { $$="?"; } -choice_stat_1 : t_Identifier { $$=$1; } - - -case_stat : t_CASE choice_stat expr - { - QCString ca="case "+$2+$3; - FlowChart::addFlowChart(FlowChart::CASE_NO,0,ca); - } - t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon - { - FlowChart::moveToPrevLevel(); - FlowChart::addFlowChart(FlowChart::END_CASE,"end case",0); - } - - -case_stat : lable t_CASE choice_stat expr - { - QCString ca="case "+$3+$4; - FlowChart::addFlowChart(FlowChart::CASE_NO,0,ca); - } - t_IS case_stat_alternative case_stat_1 t_END t_CASE choice_stat_1 t_Semicolon - { - FlowChart::moveToPrevLevel(); - - FlowChart::addFlowChart(FlowChart::END_CASE,0,0); - } - -case_stat : t_CASE error t_END t_CASE choice_stat_1 t_Semicolon { $$=""; } -case_stat_1 : /* empty */ { $$=""; } -case_stat_1 : case_stat_1 case_stat_2 { $$=$1+$2; } -case_stat_2 : case_stat_alternative { $$=$1; } -case_stat_alternative : t_WHEN choices t_Arrow - { - QCString t="when "; - t+=$2+"=> "; - FlowChart::addFlowChart(FlowChart::WHEN_NO,$2.data(),t); - } - seq_stats { $$=""; FlowChart::moveToPrevLevel(); } - -if_stat: t_IF expr t_THEN - { - $2.prepend("if "); - FlowChart::addFlowChart(FlowChart::IF_NO,0,$2); - } - seq_stats - - if_stat_1 if_stat_2 t_END t_IF t_Semicolon - { - FlowChart::moveToPrevLevel(); - FlowChart::addFlowChart(FlowChart::ENDIF_NO,0,0); - } - -if_stat_2 : /* empty */ { $$=""; } -if_stat_2 : t_ELSE - { - FlowChart::addFlowChart(FlowChart::ELSE_NO,0,0); - } - seq_stats { $$=""; } - - - - -if_stat_1 : /* empty */ { $$=""; } -if_stat_1 : if_stat_1 if_stat_3 { $$=$1+$2; } -if_stat_3 : t_ELSIF expr t_THEN - { - $2.prepend("elsif "); - FlowChart::addFlowChart(FlowChart::ELSIF_NO,0,$2.data()); - } seq_stats { $$=""; } - -loop_stat: loop_stat_1 loop_stat_2 t_LOOP seq_stats t_END t_LOOP loop_stat_3 t_Semicolon - { - $$=$1+$2+" loop "+$4+" end loop" +$7; - QCString endLoop="end loop" + $7; - FlowChart::moveToPrevLevel(); - FlowChart::addFlowChart(FlowChart::END_LOOP,endLoop.data(),0); - } - -loop_stat_3: /* empty */ { $$=""; } -loop_stat_3: t_Identifier { $$=$1; } -loop_stat_2: /* empty */ { $$=""; - FlowChart::addFlowChart(FlowChart::LOOP_NO,0,"infinite loop"); - } -loop_stat_2: iteration_scheme -loop_stat_1: /* empty */ { $$=""; } -loop_stat_1: t_Identifier t_Colon { $$=$1+":";lab=$1; } - -exit_stat : loop_stat_1 t_EXIT exit_stat_1 exit_stat_2 t_Semicolon - { - FlowChart::addFlowChart(FlowChart::EXIT_NO,"exit",$4.data(),$3.data()); - lab.resize(0); - } -exit_stat_2 : /* empty */ { $$=""; } -exit_stat_2 : t_WHEN expr { $$="when "+$2; } -exit_stat_1 : /* empty */ { $$=""; } -exit_stat_1 : t_Identifier { $$=$1;lab=$$; } - - -next_stat: loop_stat_1 t_NEXT next_stat_1 next_stat_2 t_Semicolon - { - FlowChart::addFlowChart(FlowChart::NEXT_NO,"next ",$4.data(),$3.data()); - lab.resize(0); - } - -next_stat_2: /* empty */ { $$=""; } -next_stat_2: t_WHEN expr { $$="when "+$2; } -next_stat_1: /* empty */ { $$=""; } -next_stat_1: t_Identifier { $$=$1;lab=$$; } - -null_stat: t_NULL t_Semicolon { $$="null"; $$+=";"; } - -procedure_call_stat: name t_Semicolon - { - $$=$1+";"; - } - -return_stat: t_RETURN return_stat_1 t_Semicolon { $$="return "+$2+";" ; } -return_stat_1: /* empty */ { $$=""; } -return_stat_1: expr { $$=$1; } - -signal_assign_stat: target t_LESym wavefrm t_Semicolon { $$=$1+" <="+$3+";" ; } - | target t_LESym delay_mechanism wavefrm t_Semicolon { $$=$1+ "<= "+$3+$4 +";"; } - | target t_LESym t_FORCE inout_stat expr t_Semicolon { $$=$1+ "<= "+ " force "+$4+";" ; } - | target t_LESym t_RELEASE inout_stat t_Semicolon { $$=$1+ "<= "+" release "+$4 +";"; } - | selected_signal_assignment { $$=$1; } - | conditional_signal_assignment { $$=$1; } - ; - -variable_assign_stat: variable_assign_stat_1 t_Semicolon { $$=$1+";"; } - | conditional_variable_assignment { $$=$1; } - | lable selected_variable_assignment { $$=$1; } - | selected_variable_assignment { $$=$1; } - -lable: t_Identifier t_Colon { $$=$1+":"; } -variable_assign_stat_1: target t_VarAsgn expr { $$=$1+":="+$3; } -variable_assign_stat_1: lable target t_VarAsgn expr { $$=$1+$2+":="+$4; } - -wait_stat: t_WAIT wait_stat_1 wait_stat_2 wait_stat_3 t_Semicolon - { - $$="wait "+$2+$3+$4+";"; - } - -wait_stat_3: /* empty */ { $$=""; } -wait_stat_3: t_FOR expr { $$="for "+$2; } -wait_stat_2: /* empty */ { $$=""; } -wait_stat_2: t_UNTIL expr { $$=" until "+$2; } -wait_stat_1: /* empty */ { $$=""; } -wait_stat_1: t_ON sensitivity_list { $$=" on "+$2; } - - -/*-------------------------------------------------- --- Components and Configurations -----------------------------------------------------*/ -comp_end_dec : t_END { lastEntity=0; lastCompound=0; genLabels.resize(0); } - | t_END t_COMPONENT entity_decl_5 - | t_END t_ARCHITECTURE entity_decl_5 { lastCompound=0; genLabels.resize(0); } - | t_END t_ENTITY entity_decl_5 { lastEntity=0;lastCompound=0; genLabels.resize(0); } - | t_END t_Identifier { lastEntity=0; lastCompound=0; genLabels.resize(0); } - -iss :/*empty*/ { currP=VhdlDocGen::COMPONENT; } - | t_IS { currP=VhdlDocGen::COMPONENT; } - -comp_decl: t_COMPONENT t_Identifier iss comp_decl_1 comp_decl_2 comp_end_dec t_Semicolon - { - addVhdlType($2,getParsedLine(t_COMPONENT),Entry::VARIABLE_SEC,VhdlDocGen::COMPONENT,0,0); - currP=0; - } -comp_decl_2: /* empty */ { $$=""; } -comp_decl_2: t_PORT interf_list t_Semicolon { $$=$2; } -comp_decl_1: /* empty */ { $$=""; } -comp_decl_1: t_GENERIC interf_list t_Semicolon { $$=$2; } - -block_config: t_FOR block_spec block_config_1 block_config_2 { levelCounter--; } t_END t_FOR t_Semicolon - { - } - -block_config: t_FOR error t_END t_FOR t_Semicolon { $$=""; } -block_config_2: /* empty */ { $$=""; } -block_config_2: block_config_2 block_config_3 { $$=$1+" "; } -block_config_3: config_item { $$=$1; } -block_config_1: /* empty */ { $$=""; } -block_config_1: block_config_1 block_config_4 { $$=$1; } -block_config_4: use_clause { $$=$1; } - -block_spec: name - { - $$=$1; - if (levelCounter==0) - addConfigureNode($1.data(),NULL,TRUE,FALSE); - else - addConfigureNode($1.data(),NULL,FALSE,FALSE); - levelCounter++; - } - -config_item: block_config { $$=$1; } -config_item: comp_config { $$=$1; } - -comp_config: t_FOR comp_spec comp_config_1 comp_config_2 t_END t_FOR t_Semicolon - { - $$=$2+" "+$3+" "+$4; - } -comp_config_2: /* empty */ { $$=""; } -comp_config_2: block_config { $$=$1; } -comp_config_1: /*empty*/ { $$=""; } - -comp_config_1: binding_indic_1 binding_indic_2 t_Semicolon -{ - $$=""; -} -comp_config_1: t_USE t_VUNIT idf_list t_Semicolon { $$=""; } -comp_config_1: t_USE binding_indic t_Semicolon - { - addConfigureNode(compSpec.data(),$2.data(),FALSE,TRUE); - } - -config_spec: t_FOR comp_spec comp_spec_stat t_Semicolon - { - addConfigureNode($2.data(),$3.data(),TRUE,FALSE,TRUE); - } -config_spec: t_FOR comp_spec comp_spec_stat t_Semicolon t_END t_FOR t_Semicolon - { - addConfigureNode($2.data(),$3.data(),TRUE,FALSE,TRUE); - } - -comp_spec_stat: t_USE binding_indic { - $$=$2; - } -comp_spec_stat: t_USE t_VUNIT idf_list t_Semicolon -{ - $$=""; -} -comp_spec_stat: binding_indic_1 binding_indic_2 - { - $$=""; - } - -comp_spec: inst_list t_Colon expr - { - $$=$1+":"+$3; - compSpec=$$; - } - -inst_list: idf_list { $$=$1; } -inst_list: t_ALL { $$="all"; } -inst_list: t_OTHERS { $$="others"; } - -binding_indic : entity_aspect binding_indic_1 binding_indic_2 { $$=$1; } - -binding_indic_2: { $$=""; } -binding_indic_2: t_PORT t_MAP association_list { $$="port map "+$3; } - -binding_indic_1: { $$=""; } -binding_indic_1: t_GENERIC t_MAP association_list { $$="generic map "+$3; } - - -entity_aspect: t_ENTITY name { $$="entity "+$2; } -entity_aspect: t_CONFIGURATION mark { $$="configuration "+ $2; } -entity_aspect: t_OPEN { $$="open "; } - ; - -group_constituent: t_Identifier { $$=$1; } - | t_CharacterLit { $$=$1; } - ; - -group_constituent_list: group_constituent { $$=$1; } - | group_constituent_list t_Comma group_constituent { $$=$1+","+$3; } - ; - -group_declaration : t_GROUP t_Identifier t_Colon group_name t_LeftParen group_constituent_list t_RightParen t_Semicolon - { - // $$=$2+":"+$4+$6; - $$="("+$4+$6+")"; - addVhdlType($2,getParsedLine(t_GROUP),Entry::VARIABLE_SEC,VhdlDocGen::GROUP,$$.data(),0); - } - -group_template_declaration : t_GROUP t_Identifier t_IS t_LeftParen entity_class_entry_list t_RightParen t_Semicolon - { - $$=$2+":"+$5; - addVhdlType($2,getParsedLine(t_GROUP),Entry::VARIABLE_SEC,VhdlDocGen::GROUP,$5.data(),0); - } - -group_template_declaration: t_GROUP t_Identifier t_IS t_LeftParen error t_Semicolon t_RightParen{ $$=""; } - - -entity_class_entry : entity_class tbox { $$=$1+$2; } - -tbox : /* empty */ { $$=""; } -tbox : t_Box { $$="<>"; } - -entity_class_entry_list: entity_class_entry { $$=$1; } - | entity_class_entry_list - t_Comma entity_class_entry { $$=$1+","+$3; } - ; - -group_name: t_Identifier { $$=$1; } -group_name: t_StringLit { $$=$1; } - -t_Identifier: t_LETTER - { - $$=s_str.qstr; - } - -t_BitStringLit: t_DIGIT - { - $$=s_str.qstr; - } - -t_StringLit: t_STRING - { - $$=s_str.qstr; - } - -t_AbstractLit: t_ABSTRLIST - { - $$=s_str.qstr; - } - -t_CharacterLit: t_CHARLIST - { - $$=s_str.qstr; - } - - -/*-------------------------------------------------- --- VHDL 2002 extensions --- to do: must be added ------------------------------------------------------*/ -protected_type_declaration:t_PROTECTED protected_stats t_END protected_stat_1 { $$=""; } -protected_type_declaration:t_PROTECTED error t_END protected_stat_1 { $$=""; } - -protected_stats: /* empty */ -protected_stats: protected_stats protected_stat_decl_1 -protected_stat_decl_1: protected_type_declaration_item -protected_stat_1: t_PROTECTED -protected_stat_1: t_PROTECTED t_Identifier - -protected_type_declaration_item: use_clause -protected_type_declaration_item: attribute_spec -protected_type_declaration_item: subprog_decl -protected_type_declaration_item: subprogram_instantiation_decl - -protected_type_body: t_PROTECTED t_BODY protected_body_stats t_END protected_body_stat_1 { $$=""; } -protected_type_body: t_PROTECTED t_BODY error t_END protected_body_stat_1 { $$=""; } - -protected_body_stats: /* empty */ -protected_body_stats: protected_body_stats protected_body_stat_decl_1 -protected_body_stat_decl_1: protected_type_body_declaration_item - -protected_body_stat_1: t_PROTECTED t_BODY -protected_body_stat_1: t_PROTECTED t_BODY t_Identifier - -protected_type_body_declaration_item: subprog_decltve_item // same as subprog - -/*-------------------------------------------------- --- VHDL 2008 extensions --- to do: must be added ------------------------------------------------------*/ -context_ref: t_CONTEXT sel_list t_Semicolon { $$="context "+$2; } - -context_decl: t_CONTEXT t_Identifier t_IS { parse_sec=CONTEXT_SEC; } libustcont_stats t_END context_stat_1 t_Semicolon - { - parse_sec=0; - QCString v=$5; - addVhdlType($2,getParsedLine(t_LIBRARY),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,"context",$5.data()); - } -context_decl: t_CONTEXT t_Identifier t_IS t_END context_stat_1 t_Semicolon - { - addVhdlType($2,getParsedLine(t_LIBRARY),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,"context",0); - } - -context_stat_1: t_CONTEXT -context_stat_1: t_CONTEXT t_Identifier - -libustcont_stats: libustcont_stat { $$ = $1; } -libustcont_stats: libustcont_stats libustcont_stat { $$ = $1+"#"+$2; } - -libustcont_stat: use_clause { $$ = $1; } -libustcont_stat: lib_clause { $$ = $1; } -libustcont_stat: context_ref { $$ = $1; } - -package_instantiation_decl: t_PACKAGE t_Identifier t_IS t_NEW dot_name signature t_Semicolon - { - $$=" is new "+$5+$6; - //Entry * pp=lastCompound; - //Entry * pps=lastEntity ; - //assert(false); - addVhdlType($2,getParsedLine(t_PACKAGE),Entry::VARIABLE_SEC,VhdlDocGen::INSTANTIATION,"package",$$.data()); - } -package_instantiation_decl: t_PACKAGE t_Identifier t_IS t_NEW dot_name signature gen_assoc_list t_Semicolon - { - $$=" is new "+$5+$6; - addVhdlType($2,getParsedLine(t_PACKAGE),Entry::VARIABLE_SEC,VhdlDocGen::INSTANTIATION,"package",$$.data()); - } -package_instantiation_decl: t_PACKAGE error t_Identifier t_IS t_NEW t_Semicolon { $$=""; } - -subprogram_instantiation_decl: t_FUNCTION t_Identifier t_IS t_NEW dot_name signature t_Semicolon - { - $$= " is new "+$5+$6; - addVhdlType($2,getParsedLine(t_FUNCTION),Entry::VARIABLE_SEC,VhdlDocGen::INSTANTIATION,"function ",$$.data()); - } -subprogram_instantiation_decl: t_FUNCTION t_Identifier t_IS t_NEW dot_name signature gen_assoc_list t_Semicolon - { - $$=" is new "+$5+$6; - addVhdlType($2,getParsedLine(t_FUNCTION),Entry::VARIABLE_SEC,VhdlDocGen::INSTANTIATION,"function ",$$.data()); - } -subprogram_instantiation_decl: t_FUNCTION t_Identifier t_IS t_NEW error t_Semicolon { $$=""; } - -signature:/*empty*/ { $$=""; } -signature: t_LEFTBR signature1 - t_RIGHTBR { $$="["+$2+" ]"; } -signature: t_LEFTBR t_RIGHTBR { $$="[ ]"; } - -signature1: t_RETURN mark { $$="return "+$2; } -signature1: mark_stats { $$=$1; } -signature1: mark_stats t_RETURN mark { $$=$1+" return "+$3; } - -mark_stats: mark { $$=$1; } -mark_stats: mark_stats mark_stats_1 { $$=$1+" "+$2; } -mark_stats_1: t_Comma mark { $$=" , "+$2; } - -case_scheme: t_CASE expr t_GENERATE when_stats ttend t_END t_GENERATE generate_stat_1 t_Semicolon -case_scheme: t_CASE expr t_GENERATE when_stats t_END t_GENERATE generate_stat_1 t_Semicolon -case_scheme: t_CASE error t_GENERATE error t_END t_GENERATE generate_stat_1 t_Semicolon - -when_stats_1: t_WHEN lable choices t_Arrow generate_statement_body -when_stats_1: t_WHEN choices t_Arrow generate_statement_body -when_stats: when_stats when_stats_1 -when_stats: when_stats_1 - -ttend: t_END t_Semicolon -ttend: t_END t_Identifier t_Semicolon - -conditional_signal_assignment: conditional_waveform_assignment { $$=""; } -conditional_signal_assignment: conditional_force_assignment { $$=""; } - -conditional_waveform_assignment: target t_LESym wavefrm_element t_WHEN expr else_wave_list t_Semicolon -conditional_waveform_assignment: target t_LESym delay_mechanism wavefrm_element t_WHEN expr else_wave_list t_Semicolon -conditional_waveform_assignment: target t_LESym wavefrm_element t_WHEN expr t_Semicolon -conditional_waveform_assignment: target t_LESym delay_mechanism wavefrm_element t_WHEN expr t_Semicolon -conditional_waveform_assignment: target t_LESym error t_Semicolon - -else_wave_list: t_ELSE expr t_WHEN expr -else_wave_list: t_ELSE expr - -conditional_force_assignment: target t_LESym t_FORCE inout_stat expr t_WHEN expr else_stat t_Semicolon -conditional_force_assignment: target t_LESym t_FORCE inout_stat expr t_WHEN expr t_Semicolon - -selected_signal_assignment : selected_waveform_assignment { $$=""; } -selected_signal_assignment : selected_force_assignment { $$=""; } - -selected_waveform_assignment: t_WITH expr t_SELECT choice_stat - target t_LESym delay_stat sel_wave_list - -delay_stat: -delay_stat: delay_mechanism - -sel_wave_list: wavefrm_element t_WHEN choices t_Comma sel_wave_list -sel_wave_list: sel_wave_list_1 - -sel_wave_list_1: wavefrm_element t_WHEN choices t_Semicolon - -selected_force_assignment: t_WITH expr t_SELECT choice_stat target t_LESym t_FORCE - inout_stat sel_var_list - -inout_stat: /* empty */ { $$=""; } -inout_stat: t_IN { $$=" in "; } -inout_stat: t_OUT { $$="out"; } - -delay_mechanism : t_TRANSPORT { $$=" transport "; } - | t_REJECT expr t_INERTIAL { $$=" reject "+$2+"inertial "; } - | t_INERTIAL { $$=" inertial "; } - -conditional_variable_assignment : variable_assign_stat_1 t_WHEN expr else_stat t_Semicolon -conditional_variable_assignment : variable_assign_stat_1 t_WHEN expr t_Semicolon - -else_stat: t_ELSE expr t_WHEN expr -else_stat: else_stat t_ELSE expr t_WHEN expr -else_stat: t_ELSE expr - -selected_variable_assignment: t_WITH expr t_SELECT choice_stat select_name t_VarAsgn sel_var_list { $$=""; } - -sel_var_list: expr t_WHEN choices t_Comma sel_var_list -sel_var_list: sel_var_list_1 - -sel_var_list_1: expr t_WHEN choices t_Semicolon - -select_name: name - | aggregate - -interface_subprogram_decl: iproc { $$ = $1; } - | ifunc { $$=$1; } - ; -iproc: t_PROCEDURE t_Identifier param { $$ = "procedure "+$2+$3; current->name=$2; } - -ifunc: t_FUNCTION func_name param t_RETURN mark return_is - { - QCString s=$6; - if (!s.isEmpty()) - { - s.prepend(" is "); - } - $$=" function "+$2+$3+$5+s; - current->name=$2; - } -ifunc: func_prec t_FUNCTION func_name param t_RETURN mark return_is - { - QCString s=$7; - if (!s.isEmpty()) - { - s.prepend(" is "); - } - $$=$1+" function "+$3+$4+" return "+$6+s; - current->name=$3; - } - -func_name: t_Identifier { $$=$1; } - | t_StringLit { $$=$1; } // "?<" - ; - -return_is: /* empty */ { $$=""; } - | t_IS t_Identifier { $$=$2; } - | t_IS t_Box { $$="<>"; } - -param: /* empty */ { $$=""; } -param: t_PARAMETER { $$="parameter "; } -param: t_PARAMETER { parse_sec=PARAM_SEC; } - t_LeftParen interf_element interf_list_1 t_RightParen - { parse_sec=0; } - -param: t_LeftParen interf_element interf_list_1 t_RightParen { $$="("+$2+")"; } - -interface_package_decl: t_PACKAGE t_Identifier t_IS t_NEW dot_name - { - $$="package "+$2+" is new "+$5; - current->name=$2; - } -interface_package_decl: t_PACKAGE t_Identifier t_IS t_NEW dot_name gen_assoc_list - { - $$="package "+$2+" is new "+$5+"( ... )" ; - current->name=$2; - } - -gen_assoc_list: t_GENERIC t_MAP association_list - -gen_interface_list : t_GENERIC - { - //int u=s_str.iLine; - parse_sec=GEN_SEC; - } - interf_list - { - QCString vo=$3; - parse_sec=0; - } - -external_name: t_SLSL sig_stat external_pathname t_Colon subtype_indic t_SRSR - { - QCString s="<<"+$2; - QCString s1=$3+":"+$5+">>"; - $$=s+s1; - } - -sig_stat: t_CONSTANT { $$="constant "; } -sig_stat: t_SIGNAL { $$="signal "; } -sig_stat: t_VARIABLE { $$="variable "; } - -external_pathname: absolute_pathname { $$=$1; } - | relative_pathname { $$=$1; } - | package_path_name { $$=$1; } - ; - -absolute_pathname: t_Dot pathname_element_list t_Identifier { $$="."+$2+$3; } -absolute_pathname: t_Dot t_Identifier { $$="."+$2; } - -relative_pathname: neg_list pathname_element_list t_Identifier { $$=$1+$2+$3; } -relative_pathname: neg_list t_Identifier { $$=$1+$2; } - -neg_list: t_Neg t_Dot { $$="^."; } -neg_list: neg_list t_Neg t_Dot { $$=$1+"^."; } - -pathname_element: t_Identifier { $$=$1; } - | t_Identifier t_LeftParen expr t_RightParen { $$=$1+"("+$3+")"; } - ; - -pathname_element_list: pathname_element t_Dot { $$=$1+"."; } - | pathname_element_list pathname_element t_Dot { $$=$1+$2+"."; } - -package_path_name: t_At dot_name { $$="@"+$2; } - -tool_directive: t_ToolDir -{ -// fprintf(stderr,"\n tooldir %s",s_str.qstr.data() ); -} - - -%% -extern FILE* yyout; -extern YYSTYPE vhdlscannerYYlval; - -void vhdlscannerYYerror(const char* /*str*/) -{ - // fprintf(stderr,"\n<---error at line %d : [ %s] in file : %s ---->",s_str.yyLineNr,s_str.qstr.data(),s_str.fileName); - // exit(0); -} - -void vhdlParse() -{ - vhdlscannerYYparse(); -} - -struct VhdlContainer* getVhdlCont() -{ - return &s_str; -} - -Entry* getVhdlCompound() -{ - if (lastEntity) return lastEntity; - if (lastCompound) return lastCompound; - return NULL; -} - -QList<VhdlConfNode>& getVhdlConfiguration() { return configL; } - -static void addCompInst(char *n, char* instName, char* comp,int iLine) -{ - - current->spec=VhdlDocGen::INSTANTIATION; - current->section=Entry::VARIABLE_SEC; - current->startLine=iLine; - current->bodyLine=iLine; - current->type=instName; // foo:instname e.g proto or work. proto(ttt) - current->exception=genLabels.lower(); // |arch|label1:label2... - current->name=n; // foo - current->args=lastCompound->name; // architecture name - current->includeName=comp; // component/enity/configuration - int u=genLabels.find("|",1); - if (u>0) - { - current->write=genLabels.right(genLabels.length()-u); - current->read=genLabels.left(u); - } - //printf (" \n genlable: [%s] inst: [%s] name: [%s] %d\n",n,instName,comp,iLine); - - if (lastCompound) - { - current->args=lastCompound->name; - if (true) // !findInstant(current->type)) - { - initEntry(current); - instFiles.append(new Entry(*current)); - } - - Entry *temp=current; // hold current pointer (temp=oldEntry) - current=new Entry; // (oldEntry != current) - delete temp; - } - else - { - newEntry(); - } -} - -static void pushLabel( QCString &label,QCString & val) -{ - label+="|"; - label+=val; -} - -static QCString popLabel(QCString & q) -{ - QCString u=q; - int i=q.findRev("|"); - if (i<0) return ""; - q = q.left(i); - return q; -} - -static void addConfigureNode(const char* a,const char*b, bool,bool isLeaf,bool inlineConf) -{ - VhdlConfNode* co=0; - QCString ent,arch,lab; - QCString l=genLabels; - ent=a; - lab = VhdlDocGen::parseForConfig(ent,arch); - - if (b) - { - ent=b; - lab=VhdlDocGen::parseForBinding(ent,arch); - } - int level=0; - - if(!configL.isEmpty()) - { - VhdlConfNode* vc=configL.getLast(); - level=vc->level; - if (levelCounter==0) - pushLabel(forL,ent); - else if (level<levelCounter) - { - if (!isLeaf) - { - pushLabel(forL,ent); - } - } - else if (level>levelCounter) - { - forL=popLabel(forL); - } - } - else - { - pushLabel(forL,ent); - } - - - if (inlineConf) - { - confName=lastCompound->name; - } - - //fprintf(stderr,"\n[%s %d %d]\n",forL.data(),levelCounter,level); - co=new VhdlConfNode(a,b,confName.lower().data(),forL.lower().data(),isLeaf); - - if (inlineConf) - { - co->isInlineConf=TRUE; - } - - configL.append(co); - -}// addConfigure - -// ------------------------------------------------------------------------------------------------------------ - -static bool isFuncProcProced() -{ - if (currP==VhdlDocGen::FUNCTION || - currP==VhdlDocGen::PROCEDURE || - currP==VhdlDocGen::PROCESS - ) - { - return TRUE; - } - return FALSE; -} - -static void initEntry(Entry *e) -{ - e->fileName = s_str.fileName; - e->lang=SrcLangExt_VHDL; - isVhdlDocPending(); - initGroupInfo(e); -} - -static void addProto(const char *s1,const char *s2,const char *s3, - const char *s4,const char *s5,const char *s6) -{ - (void)s5; // avoid unused warning - static QRegExp reg("[\\s]"); - QCString name=s2; - QStringList ql=QStringList::split(",",name,FALSE); - - for (uint u=0;u<ql.count();u++) - { - Argument *arg=new Argument; - arg->name=ql[u].utf8(); - if (s3) - { - arg->type=s3; - } - arg->type+=" "; - arg->type+=s4; - if (s6) - { - arg->type+=s6; - } - if (parse_sec==GEN_SEC && param_sec==0) - { - arg->defval="gen!"; - } - - if (parse_sec==PARAM_SEC) - { - assert(false); - } - - arg->defval+=s1; - arg->attrib="";//s6; - - current->argList->append(arg); - current->args+=s2; - current->args+=","; - } -} - -static void createFunction(const QCString &impure,uint64 spec, - const QCString &fname) -{ - - current->spec=spec; - current->section=Entry::FUNCTION_SEC; - - if (impure=="impure" || impure=="pure") - { - current->exception=impure; - } - - if (parse_sec==GEN_SEC) - { - current->spec= VhdlDocGen::GENERIC; - current->section=Entry::FUNCTION_SEC; - } - - if (currP==VhdlDocGen::PROCEDURE) - { - current->name=impure; - current->exception=""; - } - else - { - current->name=fname; - } - - if (spec==VhdlDocGen::PROCESS) - { - - current->args=fname; - current->name=impure; - VhdlDocGen::deleteAllChars(current->args,' '); - if (!fname.isEmpty()) - { - QStringList q1=QStringList::split(",",fname); - for (uint ii=0;ii<q1.count();ii++) - { - Argument *arg=new Argument; - arg->name=q1[ii].utf8(); - current->argList->append(arg); - } - } - return; - } - - current->startLine=s_str.iLine; - current->bodyLine=s_str.iLine; - -} - -static void addVhdlType(const QCString &name,int startLine,int section, - uint64 spec,const char* args,const char* type,Protection prot) -{ - static QRegExp reg("[\\s]"); - - if (isFuncProcProced() || VhdlDocGen::getFlowMember()) return; - - if (parse_sec==GEN_SEC) - { - spec= VhdlDocGen::GENERIC; - } - - // more than one name ? - QStringList ql=QStringList::split(",",name,FALSE); - - for (uint u=0;u<ql.count();u++) - { - current->name=ql[u].utf8(); - - - current->startLine=startLine; - current->bodyLine=startLine; - current->section=section; - current->spec=spec; - current->fileName=s_str.fileName; - if (current->args.isEmpty()) - { - current->args=args; -// current->args.replace(reg,"%"); // insert dummy chars because wihte spaces are removed - } - current->type=type; -// current->type.replace(reg,"%"); // insert dummy chars because white spaces are removed - current->protection=prot; - - if (!lastCompound && (section==Entry::VARIABLE_SEC) && (spec == VhdlDocGen::USE || spec == VhdlDocGen::LIBRARY) ) - { - libUse.append(new Entry(*current)); - current->reset(); - } - newEntry(); - } -} - -static void newEntry() -{ - - if (VhdlDocGen::isVhdlClass(current)) - { - current_root->addSubEntry(current); - } - else - { - if (lastCompound) - { - lastCompound->addSubEntry(current); - } - else - { - if (lastEntity) - { - lastEntity->addSubEntry(current); - } - else - { - current_root->addSubEntry(current); - } - } - } - current = new Entry ; - initEntry(current); -} - -void createFlow() -{ - if (!VhdlDocGen::getFlowMember()) - { - return; - } - QCString q,ret; - - if (currP==VhdlDocGen::FUNCTION) - { - q=":function( "; - FlowChart::alignFuncProc(q,tempEntry->argList,true); - q+=")"; - } - else if (currP==VhdlDocGen::PROCEDURE) - { - q=":procedure ("; - FlowChart::alignFuncProc(q,tempEntry->argList,false); - q+=")"; - } - else - { - q=":process( "+tempEntry->args; - q+=")"; - } - - q.prepend(VhdlDocGen::getFlowMember()->name().data()); - - FlowChart::addFlowChart(FlowChart::START_NO,q,0); - - if (currP==VhdlDocGen::FUNCTION) - { - ret="end function "; - } - else if (currP==VhdlDocGen::PROCEDURE) - { - ret="end procedure"; - } - else - { - ret="end process "; - } - - FlowChart::addFlowChart(FlowChart::END_NO,ret,0); - // FlowChart::printFlowList(); - FlowChart::writeFlowChart(); - currP=0; -} - diff --git a/src/vhdlscanner.h b/src/vhdlscanner.h deleted file mode 100644 index 9b7c292..0000000 --- a/src/vhdlscanner.h +++ /dev/null @@ -1,147 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2014 by Dimitri van Heesch. - * - * Permission to use, copy, modify, and distribute this software and its - * documentation under the terms of the GNU General Public License is hereby - * granted. No representations are made about the suitability of this software - * for any purpose. It is provided "as is" without express or implied warranty. - * See the GNU General Public License for more details. - * - * Documents produced by Doxygen are derivative works derived from the - * input used in their production; they are not affected by this license. - * - */ - -#ifndef VHDLSCANNER_H -#define VHDLSCANNER_H - -#include "parserintf.h" -#include <stdio.h> -#include <stdlib.h> -#include <assert.h> -#include <ctype.h> - -#include <qarray.h> -#include <unistd.h> -#include <qfile.h> -#include <qdict.h> -#include "vhdldocgen.h" -#include "entry.h" - -class Entry; -class ClassSDict; -class FileStorage; -class ClassDef; -class MemberDef; -class QStringList; -class MemberList; - - -/** VHDL parser using state-based lexical scanning. - * - * This is the VHDL language parser for doxygen. - */ -class VHDLLanguageScanner : public ParserInterface -{ - public: - virtual ~VHDLLanguageScanner() {} - void startTranslationUnit(const char *) {} - void finishTranslationUnit() {} - void parseInput(const char * fileName, - const char *fileBuf, - Entry *root, - bool sameTranslationUnit, - QStrList &filesInSameTranslationUnit); - bool needsPreprocessing(const QCString &extension); - void parseCode(CodeOutputInterface &codeOutIntf, - const char *scopeName, - const QCString &input, - SrcLangExt lang, - bool isExampleBlock, - const char *exampleName=0, - FileDef *fileDef=0, - int startLine=-1, - int endLine=-1, - bool inlineFragment=FALSE, - MemberDef *memberDef=0, - bool showLineNumbers=TRUE, - Definition *searchCtx=0, - bool collectXRefs=TRUE - ); - void resetCodeParserState(); - void parsePrototype(const char *text); -}; - -/** Container for vhdlscanner */ -struct VhdlContainer -{ - int yyLineNr; // current line no - int iLine; // line no of last t_identifier - QCString qstr; // t_identifier - QCString fileName; // current file - Entry* root; // root -}; - -/** Configuration node for VHDL */ -struct VhdlConfNode -{ - VhdlConfNode(const char* a,const char* b,const char* config,const char* cs,bool leaf) - { - arch=a; // architecture e.g. for iobuffer - arch=arch.lower(); - binding=b; // binding e.g. use entiy work.xxx(bev) - binding=binding.lower(); - confVhdl=config; // configuration foo is bar - compSpec=cs; - isInlineConf=false; // primary configuration? - isLeaf=leaf; - }; - - QCString confVhdl; - QCString arch; - QCString binding; - QCString compSpec; - int level; - bool isLeaf; - bool isInlineConf; - -}; - - - -// returns the current conpound entity,architecture, package,package body -Entry* getVhdlCompound(); - -// return the current parsed entry -Entry* getCurrentVhdlEntry(); - -void newVhdlEntry(); - -void initVhdlParser(); - -struct VhdlContainer* getVhdlCont(); - -// returns the parsed line -// @ param object index of vhdl keyword like t_Identifier t_Entity -int getParsedLine(int object); - -void vhdlscanFreeScanner(); - -void vhdlParse(); - -// return the list of component instantiations e.g. foo: component bar -QList<Entry> & getVhdlInstList(); - -// returns configuration list -QList<VhdlConfNode>& getVhdlConfiguration(); - -// returns library/used list -QList<Entry> & getLibUse(); - -void isVhdlDocPending(); - - -#endif diff --git a/src/vhdlscanner.l b/src/vhdlscanner.l deleted file mode 100644 index a3603c8..0000000 --- a/src/vhdlscanner.l +++ /dev/null @@ -1,1001 +0,0 @@ -/************** VHDL scanner in LEX format ********** - * - * Version 0.2 Wed Aug 11, 1993 - * - * This scanner is derived from a scanner of the ALLIANCE CAD toolset, - * release 1.1. That toolset was written from: - * MASI/CAO-VLSI CAD Team - * Laboratoire MASI/CAO-VLSI - * Tour 55-65, 2eme etage, Porte 13 - * Universite Pierre et Marie Curie (PARIS VI) - * 4, place Jussieu 75252 PARIS Cedex 05, FRANCE - * The ALLIANCE CAD Toolset can be obtained from ftp site : ftp-masi.ibp.fr - * - * This scanner is avail at: ftp.cs.utwente.nl in pub/src/VHDL/Grammar - * A corresponding Yacc grammar is available at the same site - * - * author of this derived scanner version: - * Thomas Dettmer - * Dortmund University - * Dept. of Computer Scienc, LS1 - * PB 500 500 - * D-44221 Dortmund (Germany) - * Phone: +49-231-755-6464 - * e-mail: dettmer@ls1.informatik.uni-dortmund.de - * - * - **************************************************************** - * - * This file is intended not to be used for commercial purposes - * without permission of the University of Dortmund - * - * NOTE THAT THERE IS NO WARRANTY FOR CORRECTNES, COMPLETENESS, SUPPORT - * OR ANYTHING ELSE. - *******************************************************/ -/****************************************************************************** - * modified for doxygen by M. Kreis - * extended to VHDL 93/2008 - ******************************************************************************/ -%{ - -#ifndef YYSTYPE - typedef int YYSTYPE; -#endif - -#include <search.h> -#include <stdio.h> -#include <stdlib.h> -#include <assert.h> -#include <string.h> -#include <ctype.h> - -#include <qmap.h> -#include "commentscan.h" -#include "vhdlparser.h" -#include "vhdlscanner.h" -#include "doxygen.h" -#include "searchindex.h" -#include "scanner.h" -#include "vhdldocgen.h" -#include "util.h" -#include "bufstr.h" -#include "message.h" -#include "vhdlcode.h" -#include "entry.h" -#include "config.h" - -#define YY_NO_INPUT 1 - -extern void vhdlParse(); // defined in vhdlparser.y - -static bool g_lexInit = FALSE; -static ParserInterface *g_thisParser; -static VhdlContainer* yycont=NULL; -static Entry* current_root; -static Entry gBlock; - -static int yyLineNr =1; -static int g_lastCommentContext; -static int inputPosition; -static int startComment; -static QCString inputVhdlString; -static QFile inputFile; -static QCString yyFileName; -static QList<QCString> qlist; -static QCString lastLetter; - -static bool doxComment=FALSE; // doxygen comment ? -static QCString strComment; -static int iDocLine=-1; -static int* lineIndex=NULL; -static int num_chars; -static int prevToken; -static int iCodeLen; - -static QMap<QCString, int> keyMap; -static QList<Entry> lineEntry; -static bool checkMultiComment(QCString& qcs,int line); -static void handleCommentBlock(const QCString &doc,bool brief); -static void mapLibPackage(Entry* ce); -static QList<Entry>* getEntryAtLine(const Entry* ce,int line); -static bool addLibUseClause(const QCString &type); -static Entry* oldEntry; -static bool varr=FALSE; -static QCString varName; - -static struct -{ - QCString doc; - bool brief; - bool pending; - int iDocLine; -} str_doc; - -#define YY_NEVER_INTERACTIVE 1 -#define YY_USER_ACTION num_chars += (int)vhdlscannerYYleng; - -#define MAX_KEYWORD_LEN 20 - -typedef struct -{ - char nom[MAX_KEYWORD_LEN]; - int kval; -} el_mc; - -static el_mc tab_mc []= -{ - { "abs", t_ABS }, - { "access", t_ACCESS }, - { "after", t_AFTER }, - { "alias", t_ALIAS }, - { "all", t_ALL }, - { "and", t_AND }, - { "architecture", t_ARCHITECTURE }, - { "array", t_ARRAY }, - { "assert", t_ASSERT }, - { "assume", t_ASSUME }, - { "assume_guarantee", t_ASSUME_GUARANTEE }, - { "attribute", t_ATTRIBUTE }, - - { "begin", t_BEGIN }, - { "block", t_BLOCK }, - { "body", t_BODY }, - { "buffer", t_BUFFER }, - { "bus", t_BUS }, - - { "case", t_CASE }, - { "component", t_COMPONENT }, - { "configuration", t_CONFIGURATION }, - { "constant", t_CONSTANT }, - { "context", t_CONTEXT }, - { "cover", t_COVER }, - - { "default", t_DEFAULT }, - { "disconnect", t_DISCONNECT }, - { "downto", t_DOWNTO }, - - { "else", t_ELSE }, - { "elsif", t_ELSIF }, - { "end", t_END }, - { "entity", t_ENTITY }, - { "exit", t_EXIT }, - - { "fairness", t_FAIRNESS }, - { "file", t_FILE }, - { "for", t_FOR }, - { "force", t_FORCE }, - { "function", t_FUNCTION }, - - { "generate", t_GENERATE }, - { "generic", t_GENERIC }, - { "group", t_GROUP }, - { "guarded", t_GUARDED }, - - { "if", t_IF }, - { "impure", t_IMPURE }, - { "in", t_IN }, - { "inertial", t_INERTIAL }, - { "inout", t_INOUT }, - { "is", t_IS }, - - { "label", t_LABEL }, - { "library", t_LIBRARY }, - { "linkage", t_LINKAGE }, - { "literal", t_LITERAL }, - { "loop", t_LOOP }, - - { "map", t_MAP }, - { "mod", t_MOD }, - - { "nand", t_NAND }, - { "new", t_NEW }, - { "next", t_NEXT }, - { "nor", t_NOR }, - { "not", t_NOT }, - { "null", t_NULL }, - - { "of", t_OF }, - { "on", t_ON }, - { "open", t_OPEN }, - { "or", t_OR }, - { "others", t_OTHERS }, - { "out", t_OUT }, - - { "package", t_PACKAGE }, - { "parameter", t_PARAMETER }, - { "port", t_PORT }, - { "postponed", t_POSTPONED }, - { "procedure", t_PROCEDURE }, - { "process", t_PROCESS }, - { "property", t_PROPERTY }, - { "protected", t_PROTECTED }, - { "pure", t_PURE }, - - { "range", t_RANGE }, - { "record", t_RECORD }, - { "register", t_REGISTER }, - { "reject", t_REJECT }, - { "release", t_RELEASE }, - { "restrict", t_RESTRICT }, - { "restrict_guarantee", t_RESTRICT_GUARANTEE }, - { "rem", t_REM }, - { "report", t_REPORT }, - { "rol", t_ROL }, - { "ror", t_ROR }, - { "return", t_RETURN }, - - { "select", t_SELECT }, - { "sequence", t_SEQUENCE }, - { "severity", t_SEVERITY }, - { "signal", t_SIGNAL }, - { "shared", t_SHARED }, - { "sla", t_SLA }, - { "sll", t_SLL }, - { "sra", t_SRA }, - { "srl", t_SRL }, - { "strong", t_STRONG }, - { "subtype", t_SUBTYPE }, - - { "then", t_THEN }, - { "to", t_TO }, - { "transport", t_TRANSPORT }, - { "type", t_TYPE }, - - { "unaffected", t_UNAFFECTED }, - { "units", t_UNITS }, - { "until", t_UNTIL }, - { "use", t_USE }, - - { "variable", t_VARIABLE }, - { "vmode", t_VMODE }, - { "vprop", t_VPROP }, - { "vunit", t_VUNIT }, - - { "wait", t_WAIT }, - { "when", t_WHEN }, - { "while", t_WHILE }, - { "with", t_WITH }, - - { "xor", t_XOR }, - { "xnor", t_XNOR }, - { "zz", -1 } // list end -}; - - -static int find_keyword(char *s) -{ - QCString word(s); - // keyword ? - if (word.length() > MAX_KEYWORD_LEN) - return -1; - - word=word.lower(); - QMap<QCString, int>::Iterator it = keyMap.find(word); - if (it.key()) - return it.data(); - - return -1; -} - -// update current line -static void lineCount() -{ - for (const char* c=vhdlscannerYYtext ; *c ; ++c ) - { - yyLineNr += (*c == '\n') ; - } -} - - -static void startCodeBlock(int index){ - int ll=strComment.length(); - iCodeLen=inputVhdlString.findRev(strComment.data())+ll; - // fprintf(stderr,"\n startin code..%d %d %d\n",iCodeLen,num_chars,ll); - //assert(false); - gBlock.reset(); - int len=strComment.length(); - QCString name=strComment.right(len-index);// - name=VhdlDocGen::getIndexWord(name.data(),1); - if (!name) - gBlock.name="misc"+ VhdlDocGen::getRecordNumber(); - else - gBlock.name=name; - strComment=strComment.left(index); - gBlock.startLine=yyLineNr+1; - gBlock.bodyLine=yyLineNr+1; - VhdlDocGen::prepareComment(strComment); - gBlock.brief+=strComment; -} -static void makeInlineDoc(int endCode) -{ - int len=endCode-iCodeLen; - QCString par=inputVhdlString.mid(iCodeLen,len); - gBlock.doc=par; - gBlock.inbodyDocs=par; - gBlock.section=Entry::VARIABLE_SEC; - gBlock.spec=VhdlDocGen::MISCELLANEOUS; - gBlock.fileName = yyFileName; - gBlock.endBodyLine=yyLineNr-1; - gBlock.lang=SrcLangExt_VHDL; - Entry *temp=new Entry(gBlock); - - Entry* compound=getVhdlCompound(); - - if (compound) - { - compound->addSubEntry(temp); - } - else - { - temp->type="misc"; // global code like library ieee... - current_root->addSubEntry(temp); - } - strComment.resize(0); - gBlock.reset(); - - -}// makeInlineDoc - -static bool isConstraintFile(const QCString &fileName,const QCString &ext) -{ - return fileName.right(ext.length())==ext; -} - -//static void resetScanner(const char* s,MyParserVhdl* parse); - -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) result=vhdlscannerYYread(buf,max_size); - - -static int vhdlscannerYYread(char *buf,int max_size) -{ - int c=0; - while ( c < max_size && inputVhdlString.at(inputPosition) ) - { - *buf = inputVhdlString.at(inputPosition++) ; - c++; buf++; - } - return c; -} - -%} - -upper_case_letter [A-Z] -digit [0-9] -special_character [\#\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\_\|] -space_character [ \t] -format_effector [\t\v\r\l\f] -end_of_line \n -lower_case_letter [a-z] -other_special_character [\!\$\@\?\[\\\]\^\`\{\}\~] - -graphic_character ({basic_graphic_character}|{lower_case_letter}|{other_special_character}) -basic_graphic_character ({upper_case_letter}|{digit}|{special_character}|{space_character}) -letter ({upper_case_letter}|{lower_case_letter}) -letter_or_digit ({letter}|{digit}) -decimal_literal {integer}(\.{integer})?({exponent})? -integer {digit}(_?{digit})* -exponent ([eE][-+]?{integer}) -base {integer} -based_integer {extended_digit}(_?{extended_digit})* -extended_digit ({digit}|[a-fA-F]) - -extended_character [\\]{graphic_character}*[\\] - -base_specifier {digit}*(B|b|D|O|o|X|x|"UB"|"UO"|"UX"|"SB"|"SO"|"SX") - -vhdl2008tooldir `{graphic_character}+ - -B [ \t] -BR [ \t\n\r] - - -%option noyywrap -%x Comment -%x Vhdl2008Comment -%x EndVhdl2008Comment -%% - -{space_character} { /* nothing */ } -\& { return(t_Ampersand); } -\' { return(t_Apostrophe); } -\( { return(t_LeftParen); } -\) { return(t_RightParen); } -"**" { return(t_DoubleStar); } -\* { return(t_Star); } -\+ { return(t_Plus); } -\, { return(t_Comma); } -\- { return(t_Minus); } -":=" { return(t_VarAsgn); } -\: { return(t_Colon); } -\; { return(t_Semicolon); } -"<=" { return(t_LESym); } -">=" { return(t_GESym); } -\< { return(t_LTSym); } -\> { return(t_GTSym); } -\= { return(t_EQSym); } -\/= { return(t_NESym); } -"=>" { return(t_Arrow); } -"<>" { return(t_Box); } -"<<" { return(t_SLSL); } -">>" { return(t_SRSR); } -"??" { return(t_QQ); } -"?>=" { return(t_QGT); } -"?<=" { return(t_QLT); } -"?>" { return(t_QG); } -"?<" { return(t_QL); } -"?=" { return(t_QEQU); } -"?/=" { return(t_QNEQU); } -\? { return(t_Q); } -\| { return(t_Bar); } -\. { return(t_Dot); } -\/ { return(t_Slash); } -\@ { return(t_At); } -\^ { return(t_Neg); } -\[ { return(t_LEFTBR); } -\] { return(t_RIGHTBR); } - - -{letter}(_?{letter_or_digit})*|{extended_character} { - int itoken=find_keyword(vhdlscannerYYtext); - - // fprintf(stderr,"\n <<<< search tok: %s %d %d>>>\n",vhdlscannerYYtext,itoken,yyLineNr); - - // tokens in vhdlparser.hpp 258..412 - if (itoken>200 && itoken<500 && prevToken!=t_END) - { - // printf("\n <<<< insert tok: %s %d %d>>>\n",vhdlscannerYYtext,itoken,yyLineNr); - lineIndex[itoken]=yyLineNr; - } - - // global members - if (( itoken==t_ARCHITECTURE ) || - ( itoken==t_ENTITY) || - ( itoken==t_PACKAGE ) || - ( itoken==t_LIBRARY ) || - ( itoken==t_USE ) || - ( itoken==t_CONFIGURATION ) || - ( itoken==t_CONTEXT ) ) - { - lineIndex[itoken]=yyLineNr; - } - - prevToken=itoken; - - yycont->qstr=vhdlscannerYYtext; - yycont->yyLineNr=yyLineNr; - if (itoken== -1) - { - yycont->iLine=yyLineNr; - return ( t_LETTER ); - } - else - { - return ( itoken ); - } - } - -({decimal_literal})|({base}#{based_integer}(\.{based_integer})?#({exponent})?)|({base}:{based_integer}(\.{based_integer})?:({exponent})?) { - yycont->qstr=vhdlscannerYYtext; - return ( t_ABSTRLIST ); - } - -'({graphic_character}|\"|\%)' { - QCString q(vhdlscannerYYtext); - yycont->qstr=vhdlscannerYYtext; - - if (q=="'('") // std_logic'('1') ? - { - char c=yy_hold_char; - if (isalpha(c) || isdigit(c)) - { - unput('\''); - unput('('); - return(t_Apostrophe); - } - else - { - return ( t_CHARLIST ); - } - } - return ( t_CHARLIST ); - } - -(\"({graphic_character}|(\"\")|\%)*\")|(\%({graphic_character}|(\%\%)|\")*\%) { - yycont->qstr=vhdlscannerYYtext; - yycont->iLine=yyLineNr; - return ( t_STRING ); - } - -{base_specifier}(\"{extended_digit}(_?{extended_digit})*\"|\%{extended_digit}(_?{extended_digit})*\%) { - yycont->qstr=vhdlscannerYYtext; - yycont->iLine=yyLineNr; - return ( t_DIGIT ); - } - -{vhdl2008tooldir} { - yycont->qstr=vhdlscannerYYtext; - yycont->iLine=yyLineNr; - return(t_ToolDir); - } - -\n { - yyLineNr++; - yycont->yyLineNr=yyLineNr; - } - -<*>"--"[^\n]* { - /* comment */ - QCString qcs(vhdlscannerYYtext); - // vhdl comment ? - if (qcs.stripPrefix("--!")) - { - REJECT; - } - else if (qcs.stripPrefix("--#")) - { - if (VhdlDocGen::getFlowMember()) - { - FlowChart::addFlowChart(FlowChart::COMMENT_NO,0,0,qcs.data()); - } - } - } -. { /* unknown characters */ } - - -<*>{B}*"--!"[^{}\n]*[^\n]*\n/{B}*"--!" { // multi line comment - if (iDocLine==-1) iDocLine=yyLineNr; - QCString qc(vhdlscannerYYtext); - int len=qc.contains('\n')+yyLineNr-1; - if (YY_START!=Comment) // Start of the comment block - { - startComment=yyLineNr; - g_lastCommentContext=YY_START; - } - - if(!checkMultiComment(qc,len)) - { - strComment+=vhdlscannerYYtext; - } - lineCount(); - BEGIN(Comment); -} - -<Comment>^{B}*"--!"[^\n]* { - if (iDocLine==-1) iDocLine=yyLineNr; - strComment+=vhdlscannerYYtext; - int index=strComment.find("\\code"); - if (index>0) - { - startCodeBlock(index); - doxComment=TRUE; - } - lineCount(); - BEGIN(Comment); -} - -<Comment>.|\n { - // found end of comment block - - int index =strComment.find("\\code"); - if (index>0) - { - startCodeBlock(index); - } - - VhdlDocGen::prepareComment(strComment); - - - if (index==-1 && !doxComment) - { - handleCommentBlock(strComment,FALSE); - } - strComment.resize(0);; - unput(*vhdlscannerYYtext); - doxComment=FALSE; - BEGIN(g_lastCommentContext); - } - -<*>"--!"[^\n]* { // one line comment - if (iDocLine==-1) iDocLine=yyLineNr; - QCString qcs(vhdlscannerYYtext); - - bool isEndCode=qcs.contains("\\endcode"); - - int index = qcs.find("\\code"); - if (isEndCode) - { - int end=inputVhdlString.find(qcs.data(),iCodeLen); - makeInlineDoc(end); - } - else if (index > 0 ) - { - // assert(false); - strComment=qcs; - startCodeBlock(index); - strComment.resize(0); - } - - //printf("--> handleCommentBlock line %d\n",yyLineNr); - if (!isEndCode && index==-1) - { - int j=qcs.find("--!"); - qcs=qcs.right(qcs.length()-3-j); - - if(!checkMultiComment(qcs,yyLineNr)) - { - handleCommentBlock(qcs,TRUE); - } - }//endcode - } - -<*>"/*" { - strComment+=vhdlscannerYYtext; - if (yy_hold_char=='!') // found comment starting with "/*!" - { - doxComment=TRUE; - } - BEGIN(Vhdl2008Comment); - } - -<Vhdl2008Comment>[^*]*[*]+ { - QCString tt(vhdlscannerYYtext); - int len=tt.length(); - yyLineNr+=tt.contains('\n'); - - // delete * from comments - // /*! - // * see vim ! - // */ - - if (yytext[len-1]=='*' && tt.contains('\n')) - { - QCString ss=tt; - VhdlDocGen::deleteAllChars(ss,' '); - VhdlDocGen::deleteAllChars(ss,'\t'); - if (ss.data() && ss.at(ss.length()-2)=='\n') - { - tt=tt.left(len-1); - len--; - } - } - - // fprintf(stderr,"\n << %s >>",tt.data()); - strComment+=tt; - char c=yy_hold_char; - if (c =='/') - { - unput('*'); - BEGIN(EndVhdl2008Comment); - } - else - { - BEGIN(Vhdl2008Comment); - } - } - -<EndVhdl2008Comment>"*/" { - if (doxComment) - { - strComment.stripPrefix("/*!"); - strComment= strComment.left( strComment.length()-1); - handleCommentBlock( strComment,TRUE); - } - doxComment=FALSE; - strComment.resize(0); - BEGIN(INITIAL); - } - - -%% - -static void parserInit() -{ - num_chars=0; - lineIndex=(int*)malloc(500*sizeof(int)); - - if (!g_lexInit) - { - VhdlDocGen::init(); - el_mc oop; - int p=0; - while ((oop=tab_mc[p++]).kval!=-1) - { - QCString q(&oop.nom[0]); - keyMap.insert(q,oop.kval); - } - } -} - -void vhdlscanFreeScanner() -{ -#if defined(YY_FLEX_SUBMINOR_VERSION) - if (g_lexInit) - { - vhdlscannerYYlex_destroy(); - } -#endif -} - -void VHDLLanguageScanner::resetCodeParserState() -{ -} - -bool VHDLLanguageScanner::needsPreprocessing(const QCString & /*extension*/) -{ - return TRUE; -} - -void VHDLLanguageScanner::parsePrototype(const char *text) -{ - varName=text; - varr=TRUE; -} - -// do parsing -//int VhdlParser::doLex() -//{ -// int token=vhdlscannerYYlex(); -// //fprintf(stderr,"\ntoken: %d at line: %d",token,yyLineNr); -// return token; -//} - -void VHDLLanguageScanner::parseInput(const char *fileName, - const char *fileBuf, - Entry *root, - bool /*sameTranslationUnit*/, - QStrList & /*filesInSameTranslationUnit*/) -{ - yyFileName=QCString(fileName); - - bool xilinx_ucf=isConstraintFile(yyFileName,".ucf"); - bool altera_qsf=isConstraintFile(yyFileName,".qsf"); - - // support XILINX(ucf) and ALTERA (qsf) file - - if (xilinx_ucf) - { - VhdlDocGen::parseUCF(fileBuf,root,yyFileName,FALSE); - return; - } - if (altera_qsf) - { - VhdlDocGen::parseUCF(fileBuf,root,yyFileName,TRUE); - return; - } - printlex(yy_flex_debug, TRUE, __FILE__, fileName); - - ::parserInit(); - yycont=getVhdlCont(); - yycont->root=root; - yycont->fileName=fileName; - initVhdlParser(); - QCString pPuffer(" "); - pPuffer+=fileBuf; - - inputFile.setName(fileName); - if (g_lexInit) - { - vhdlscannerYYrestart( vhdlscannerYYin ); - } - g_lexInit=TRUE; - g_thisParser=this; - inputPosition=0; - inputVhdlString=fileBuf; - yyLineNr=1; - current_root=root; - groupEnterFile(fileName,yyLineNr); - vhdlParse(); - Entry* curr=getCurrentVhdlEntry(); // delete last current - delete curr; - curr=0; - free(lineIndex); - inputFile.close(); - mapLibPackage(root); - printlex(yy_flex_debug, FALSE, __FILE__, fileName); -} - -void VHDLLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf, - const char *scopeName, - const QCString &input, - SrcLangExt /*lang*/, - bool isExampleBlock, - const char *exampleName, - FileDef *fileDef, - int startLine, - int endLine, - bool inlineFragment, - MemberDef *memberDef, - bool showLineNumbers, - Definition *searchCtx, - bool collectXRefs - ) -{ - ::parseVhdlCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName, - fileDef,startLine,endLine,inlineFragment,memberDef, - showLineNumbers,searchCtx,collectXRefs); -} - -/* - * adds the library|use statements to the next class (entity|package|architecture|package body - * library ieee - * entity xxx - * ..... - * library - * package - * enity zzz - * ..... - * and so on.. - */ -static void mapLibPackage( Entry* root) -{ - QList<Entry> epp=getLibUse(); - EntryListIterator eli(epp); - Entry *rt; - for (;(rt=eli.current());++eli) - { - if (addLibUseClause(rt->name)) - { - Entry *current; - EntryListIterator eLib(*root->children()); - bool bFound=FALSE; - for (eLib.toFirst();(current=eLib.current());++eLib) - { - if (VhdlDocGen::isVhdlClass(current)) - if (current->startLine > rt->startLine) - { - bFound=TRUE; - current->addSubEntry(rt); - break; - } - }//for - if (!bFound) - { - root->addSubEntry(rt); - } - } //if - }// for - - epp.clear(); -}//MapLib - -static bool addLibUseClause(const QCString &type) -{ - static bool showIEEESTD=Config_getBool("FORCE_LOCAL_INCLUDES"); - - if (showIEEESTD) // all standard packages and libraries will not be shown - { - if (type.lower().stripPrefix("ieee")) return FALSE; - if (type.lower().stripPrefix("std")) return FALSE; - } - return TRUE; -} - -static void handleCommentBlock(const QCString &doc,bool brief) -{ - int position=0; - - // empty comment --! - if (doc.isEmpty()) return; - - bool needsEntry=FALSE; - Protection protection=Public; - int lineNr = iDocLine; - - Entry* current=getCurrentVhdlEntry(); - - if (oldEntry==current) - { - //printf("\n find pending message < %s > at line: %d \n ",doc.data(),iDocLine); - str_doc.doc=doc; - str_doc.iDocLine=iDocLine; - str_doc.brief=brief; - str_doc.pending=TRUE; - return; - } - - oldEntry=current; - - if (brief) - { - current->briefLine = iDocLine; - } - else - { - current->docLine = iDocLine; - } - -// printf("parseCommentBlock file<%s>\n [%s]\n",yyFileName.data(),doc.data()); - while (parseCommentBlock( - g_thisParser, - current, - doc, // text - yyFileName, // file - lineNr, // line of block start - brief, - 0, - FALSE, - protection, - position, - needsEntry - ) - ) - { - //printf("parseCommentBlock position=%d [%s]\n",position,doc.data()+position); - if (needsEntry) newVhdlEntry(); - } - if (needsEntry) - { - if (varr) - { - varr=FALSE; - current->name=varName; - current->section=Entry::VARIABLEDOC_SEC; - varName=""; - strComment.resize(0); - } - - newVhdlEntry(); - } - iDocLine=-1; - strComment.resize(0); -} - -// returns the vhdl parsed types at line xxx -QList<Entry>* getEntryAtLine(const Entry* ce,int line) -{ - EntryListIterator eli(*ce->children()); - Entry *rt; - for (;(rt=eli.current());++eli) - { - if (rt->bodyLine==line) - { - lineEntry.insert(0,rt); - } // if - - getEntryAtLine(rt,line); - } - return &lineEntry; -} - -// token index in vhdlparser.hpp 258..416 -int getParsedLine(int object) -{ - //assert(object>254 && object <416); - return lineIndex [object]; -} - -void isVhdlDocPending() -{ - if (!str_doc.pending) - { - return; - } - str_doc.pending=FALSE; - oldEntry=0; // prevents endless recursion - iDocLine=str_doc.iDocLine; - handleCommentBlock(str_doc.doc,str_doc.brief); - iDocLine=-1; -} - -static bool checkMultiComment(QCString& qcs,int line) -{ - QList<Entry> *pTemp=getEntryAtLine(current_root,line); - - if (pTemp->isEmpty()) return false; - - //int ii=pTemp->count(); - qcs.stripPrefix("--!"); - while (!pTemp->isEmpty()) - { - Entry *e=(Entry*)pTemp->getFirst(); - e->briefLine=line; - e->brief+=qcs; - iDocLine=-1; - pTemp->removeFirst(); - //ii=pTemp->count(); - } - return true; -} - - diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index f74a6a2..f2da28c 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -209,6 +209,11 @@ void XmlDocVisitor::visit(DocVerbatim *s) filter(s->text()); m_t << "</msc>"; break; + case DocVerbatim::PlantUML: + m_t << "<plantuml>"; + filter(s->text()); + m_t << "</plantuml>"; + break; } } @@ -651,7 +656,9 @@ void XmlDocVisitor::visitPost(DocInternal *) void XmlDocVisitor::visitPre(DocHRef *href) { if (m_hide) return; - m_t << "<ulink url=\"" << href->url() << "\">"; + m_t << "<ulink url=\""; + filter(href->url()); + m_t << "\">"; } void XmlDocVisitor::visitPost(DocHRef *) @@ -678,9 +685,10 @@ void XmlDocVisitor::visitPre(DocImage *img) m_t << "<image type=\""; switch(img->type()) { - case DocImage::Html: m_t << "html"; break; - case DocImage::Latex: m_t << "latex"; break; - case DocImage::Rtf: m_t << "rtf"; break; + case DocImage::Html: m_t << "html"; break; + case DocImage::Latex: m_t << "latex"; break; + case DocImage::Rtf: m_t << "rtf"; break; + case DocImage::DocBook: m_t << "docbook"; break; } m_t << "\""; diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index efddcd4..549ff0f 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -129,10 +129,10 @@ inline void writeXMLCodeString(FTextStream &t,const char *s, int &col) { switch(c) { - case '\t': - { + case '\t': + { static int tabSize = Config_getInt("TAB_SIZE"); - int spacesToNextTabStop = tabSize - (col%tabSize); + int spacesToNextTabStop = tabSize - (col%tabSize); col+=spacesToNextTabStop; while (spacesToNextTabStop--) t << "<sp/>"; break; @@ -141,11 +141,16 @@ inline void writeXMLCodeString(FTextStream &t,const char *s, int &col) case '<': t << "<"; col++; break; case '>': t << ">"; col++; break; case '&': t << "&"; col++; break; - case '\'': t << "'"; col++; break; + case '\'': t << "'"; col++; break; case '"': t << """; col++; break; - default: s=writeUtf8Char(t,s-1); col++; break; + case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: + case 11: case 12: case 13: case 14: case 15: case 16: case 17: case 18: + case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: + case 27: case 28: case 29: case 30: case 31: + break; // skip invalid XML characters (see http://www.w3.org/TR/2000/REC-xml-20001006#NT-Char) + default: s=writeUtf8Char(t,s-1); col++; break; } - } + } } @@ -646,6 +651,11 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De t << " required=\"yes\""; } + if (al && al->volatileSpecifier) + { + t << " volatile=\"yes\""; + } + t << " virt=\""; switch (md->virtualness()) { @@ -671,7 +681,6 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De { t << " initonly=\"yes\""; } - if (md->isAttribute()) { t << " attribute=\"yes\""; @@ -727,10 +736,26 @@ static void generateXMLForMember(MemberDef *md,FTextStream &ti,FTextStream &t,De if (md->isGettable()) t << "yes"; else t << "no"; t << "\""; + t << " privategettable=\""; + if (md->isPrivateGettable()) t << "yes"; else t << "no"; + t << "\""; + + t << " protectedgettable=\""; + if (md->isProtectedGettable()) t << "yes"; else t << "no"; + t << "\""; + t << " settable=\""; if (md->isSettable()) t << "yes"; else t << "no"; t << "\""; + t << " privatesettable=\""; + if (md->isPrivateSettable()) t << "yes"; else t << "no"; + t << "\""; + + t << " protectedsettable=\""; + if (md->isProtectedSettable()) t << "yes"; else t << "no"; + t << "\""; + if (md->isAssign() || md->isCopy() || md->isRetain() || md->isStrong() || md->isWeak()) { t << " accessor=\""; diff --git a/testing/021/indexpage.xml b/testing/021/indexpage.xml index 38ee1ad..20e1ad2 100644 --- a/testing/021/indexpage.xml +++ b/testing/021/indexpage.xml @@ -4,7 +4,7 @@ <compoundname>index</compoundname> <title>My Project</title> <detaileddescription> - <para> Our main function starts like this: <programlisting><codeline/></programlisting> First we create a object <computeroutput>t</computeroutput> of the <ref refid="class_test" kindref="compound">Test</ref> class. <programlisting><codeline><highlight class="normal"><sp/>*<sp/><sp/>First<sp/>we<sp/>create<sp/>a<sp/>object<sp/>\c<sp/>t<sp/>of<sp/>the<sp/><ref refid="class_test" kindref="compound">Test</ref><sp/></highlight><highlight class="keyword">class</highlight><highlight class="normal">.</highlight></codeline></programlisting> Then we call the example member function <programlisting/> After that our little test routine ends. <programlisting/> </para> + <para> Our main function starts like this: <programlisting><codeline><highlight class="normal">void<sp/>main()</highlight></codeline><codeline><highlight class="normal">{</highlight></codeline></programlisting> First we create a object <computeroutput>t</computeroutput> of the <ref refid="class_test" kindref="compound">Test</ref> class. <programlisting><codeline><highlight class="normal"><sp/><sp/>Test<sp/>t;</highlight></codeline></programlisting> Then we call the example member function <programlisting><codeline><highlight class="normal"><sp/><sp/>t.example();</highlight></codeline></programlisting> After that our little test routine ends. <programlisting><codeline><highlight class="normal">}</highlight></codeline></programlisting> </para> </detaileddescription> </compounddef> </doxygen> diff --git a/testing/021_dontinclude.cpp b/testing/021_dontinclude.cpp index 9fea1c6..107991a 100644 --- a/testing/021_dontinclude.cpp +++ b/testing/021_dontinclude.cpp @@ -11,7 +11,7 @@ class Test }; /*! \mainpage - * \dontinclude 021_dontinclude.cpp + * \dontinclude example_test.cpp * Our main function starts like this: * \skip main * \until { diff --git a/testing/057/057__caller__graphs_8tcl.xml b/testing/057/057__caller__graphs_8tcl.xml new file mode 100644 index 0000000..4c54e1c --- /dev/null +++ b/testing/057/057__caller__graphs_8tcl.xml @@ -0,0 +1,92 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="057__caller__graphs_8tcl" kind="file"> + <compoundname>057_caller_graphs.tcl</compoundname> + <innernamespace refid="namespacebar">bar</innernamespace> + <innernamespace refid="namespacefoo">foo</innernamespace> + <innernamespace refid="namespace1_1_11_1_11">1::1::1</innernamespace> + <innernamespace refid="namespace1">1</innernamespace> + <innernamespace refid="namespace1_1_11">1::1</innernamespace> + <innernamespace refid="namespace2_1_12_1_12_1_12_1_12">2::2::2::2::2</innernamespace> + <innernamespace refid="namespace2">2</innernamespace> + <innernamespace refid="namespace2_1_12">2::2</innernamespace> + <innernamespace refid="namespace2_1_12_1_12">2::2::2</innernamespace> + <innernamespace refid="namespace2_1_12_1_12_1_12">2::2::2::2</innernamespace> + <sectiondef kind="func"> + <memberdef kind="function" id="057__caller__graphs_8tcl_1a85c692c418fec91930cfc7b3e82857d7" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>baz</definition> + <argsstring>args</argsstring> + <name>baz</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="59" bodyend="61"/> + </memberdef> + <memberdef kind="function" id="057__caller__graphs_8tcl_1ae4e1c2bb3adfdfbb71f52de84a8285b0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>bar</definition> + <argsstring>args</argsstring> + <name>bar</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="65" bodyend="67"/> + <referencedby refid="namespace1_1a9722420639306872cea2593b83028a45" compoundref="057__caller__graphs_8tcl" startline="85" endline="88">1::test3</referencedby> + </memberdef> + <memberdef kind="function" id="057__caller__graphs_8tcl_1a3f808a00e1b937978455d707851ab33a" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>next</definition> + <argsstring>args</argsstring> + <name>next</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="102" bodyend="105"/> + <references refid="namespace2_1a2839d9dea7f0d08f48958c3fc0cd00d3" compoundref="057__caller__graphs_8tcl" startline="106" endline="114">2::next</references> + </memberdef> + <memberdef kind="function" id="057__caller__graphs_8tcl_1a12acb916374f925e7b7ba302a1ca4efb" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>master</definition> + <argsstring>args</argsstring> + <name>master</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="136" bodyend="140"/> + <references refid="__057__caller__graphs_8tcl_1a7c3c8acee94bf61ba9e911dafe35adac" compoundref="__057__caller__graphs_8tcl" startline="1" endline="4">inFileB</references> + </memberdef> + <memberdef kind="function" id="057__caller__graphs_8tcl_1a7482c00c17357cf4846b0c1bd715979c" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>inFileA</definition> + <argsstring>args</argsstring> + <name>inFileA</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="141" bodyend="144"/> + <referencedby refid="__057__caller__graphs_8tcl_1a7c3c8acee94bf61ba9e911dafe35adac" compoundref="__057__caller__graphs_8tcl" startline="1" endline="4">inFileB</referencedby> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="057_caller_graphs.tcl"/> + </compounddef> +</doxygen> diff --git a/testing/057/__057__caller__graphs_8tcl.xml b/testing/057/__057__caller__graphs_8tcl.xml new file mode 100644 index 0000000..2fdcf6a --- /dev/null +++ b/testing/057/__057__caller__graphs_8tcl.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="__057__caller__graphs_8tcl" kind="file"> + <compoundname>_057_caller_graphs.tcl</compoundname> + <sectiondef kind="func"> + <memberdef kind="function" id="__057__caller__graphs_8tcl_1a7c3c8acee94bf61ba9e911dafe35adac" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>inFileB</definition> + <argsstring>args</argsstring> + <name>inFileB</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="_057_caller_graphs.tcl" bodystart="1" bodyend="4"/> + <references refid="057__caller__graphs_8tcl_1a7482c00c17357cf4846b0c1bd715979c" compoundref="057__caller__graphs_8tcl" startline="141" endline="144">inFileA</references> + <referencedby refid="057__caller__graphs_8tcl_1a12acb916374f925e7b7ba302a1ca4efb" compoundref="057__caller__graphs_8tcl" startline="136" endline="140">master</referencedby> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="_057_caller_graphs.tcl"/> + </compounddef> +</doxygen> diff --git a/testing/057/namespace1.xml b/testing/057/namespace1.xml new file mode 100644 index 0000000..e74d8fe --- /dev/null +++ b/testing/057/namespace1.xml @@ -0,0 +1,113 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespace1" kind="namespace"> + <compoundname>1</compoundname> + <innernamespace refid="namespace1_1_11">1::1</innernamespace> + <sectiondef kind="func"> + <memberdef kind="function" id="namespace1_1a5024a7bc323958c7230615f2fcaeaef8" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>1::baz</definition> + <argsstring>args</argsstring> + <name>baz</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="62" bodyend="64"/> + <referencedby refid="namespace1_1a4a8285288ee1994ac886e2039777339e" compoundref="057__caller__graphs_8tcl" startline="77" endline="80">test1</referencedby> + <referencedby refid="namespace1_1a11615154d3c207ed4106dd0bcb0639e8" compoundref="057__caller__graphs_8tcl" startline="93" endline="96">test5</referencedby> + </memberdef> + <memberdef kind="function" id="namespace1_1ad58c8f16ad5f12178c71ca988865bb58" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>1::bar</definition> + <argsstring>args</argsstring> + <name>bar</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="68" bodyend="70"/> + <referencedby refid="namespace1_1ae1e88bb7ddd332348d7e29ac4a211b00" compoundref="057__caller__graphs_8tcl" startline="81" endline="84">test2</referencedby> + </memberdef> + <memberdef kind="function" id="namespace1_1a4a8285288ee1994ac886e2039777339e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>1::test1</definition> + <argsstring>args</argsstring> + <name>test1</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="77" bodyend="80"/> + <references refid="namespace1_1a5024a7bc323958c7230615f2fcaeaef8" compoundref="057__caller__graphs_8tcl" startline="62" endline="64">baz</references> + </memberdef> + <memberdef kind="function" id="namespace1_1ae1e88bb7ddd332348d7e29ac4a211b00" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>1::test2</definition> + <argsstring>args</argsstring> + <name>test2</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="81" bodyend="84"/> + <references refid="namespace1_1ad58c8f16ad5f12178c71ca988865bb58" compoundref="057__caller__graphs_8tcl" startline="68" endline="70">bar</references> + </memberdef> + <memberdef kind="function" id="namespace1_1a9722420639306872cea2593b83028a45" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>1::test3</definition> + <argsstring>args</argsstring> + <name>test3</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="85" bodyend="88"/> + <references refid="057__caller__graphs_8tcl_1ae4e1c2bb3adfdfbb71f52de84a8285b0" compoundref="057__caller__graphs_8tcl" startline="65" endline="67">bar</references> + </memberdef> + <memberdef kind="function" id="namespace1_1addc9b30656419de5e2651e27a013db29" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>1::test4</definition> + <argsstring>args</argsstring> + <name>test4</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="89" bodyend="92"/> + <references refid="namespace1_1_11_1acebecc4cb718010d00c3c150158b75ab" compoundref="057__caller__graphs_8tcl" startline="71" endline="73">1::1::bar</references> + </memberdef> + <memberdef kind="function" id="namespace1_1a11615154d3c207ed4106dd0bcb0639e8" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>1::test5</definition> + <argsstring>args</argsstring> + <name>test5</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="93" bodyend="96"/> + <references refid="namespace1_1a5024a7bc323958c7230615f2fcaeaef8" compoundref="057__caller__graphs_8tcl" startline="62" endline="64">baz</references> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="[generated]" line="1" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/057/namespace1_1_11.xml b/testing/057/namespace1_1_11.xml new file mode 100644 index 0000000..e5c5596 --- /dev/null +++ b/testing/057/namespace1_1_11.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespace1_1_11" kind="namespace"> + <compoundname>1::1</compoundname> + <innernamespace refid="namespace1_1_11_1_11">1::1::1</innernamespace> + <sectiondef kind="func"> + <memberdef kind="function" id="namespace1_1_11_1acebecc4cb718010d00c3c150158b75ab" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>1::1::bar</definition> + <argsstring>args</argsstring> + <name>bar</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="71" bodyend="73"/> + <referencedby refid="namespace1_1addc9b30656419de5e2651e27a013db29" compoundref="057__caller__graphs_8tcl" startline="89" endline="92">1::test4</referencedby> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="[generated]" line="1" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/057/namespace1_1_11_1_11.xml b/testing/057/namespace1_1_11_1_11.xml new file mode 100644 index 0000000..caccbe4 --- /dev/null +++ b/testing/057/namespace1_1_11_1_11.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespace1_1_11_1_11" kind="namespace"> + <compoundname>1::1::1</compoundname> + <sectiondef kind="func"> + <memberdef kind="function" id="namespace1_1_11_1_11_1aa604df053f7ebe36205d1a5675459b96" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>1::1::1::bar</definition> + <argsstring>args</argsstring> + <name>bar</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="74" bodyend="76"/> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="057_caller_graphs.tcl" line="58" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/057/namespace2.xml b/testing/057/namespace2.xml new file mode 100644 index 0000000..6ea122c --- /dev/null +++ b/testing/057/namespace2.xml @@ -0,0 +1,30 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespace2" kind="namespace"> + <compoundname>2</compoundname> + <innernamespace refid="namespace2_1_12">2::2</innernamespace> + <sectiondef kind="func"> + <memberdef kind="function" id="namespace2_1a2839d9dea7f0d08f48958c3fc0cd00d3" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>2::next</definition> + <argsstring>args</argsstring> + <name>next</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="106" bodyend="114"/> + <references refid="namespace2_1_12_1aceefa876cf364f44da1f523d3f7b0649" compoundref="057__caller__graphs_8tcl" startline="115" endline="118">2::2::next</references> + <referencedby refid="057__caller__graphs_8tcl_1a3f808a00e1b937978455d707851ab33a" compoundref="057__caller__graphs_8tcl" startline="102" endline="105">next</referencedby> + <referencedby refid="namespace2_1_12_1_12_1_12_1_12_1ac07f64c62783fd8b44317389b4a711f8" compoundref="057__caller__graphs_8tcl" startline="127" endline="130">2::2::2::2::2::next</referencedby> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="[generated]" line="1" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/057/namespace2_1_12.xml b/testing/057/namespace2_1_12.xml new file mode 100644 index 0000000..d2a589a --- /dev/null +++ b/testing/057/namespace2_1_12.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespace2_1_12" kind="namespace"> + <compoundname>2::2</compoundname> + <innernamespace refid="namespace2_1_12_1_12">2::2::2</innernamespace> + <sectiondef kind="func"> + <memberdef kind="function" id="namespace2_1_12_1aceefa876cf364f44da1f523d3f7b0649" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>2::2::next</definition> + <argsstring>args</argsstring> + <name>next</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="115" bodyend="118"/> + <references refid="namespace2_1_12_1_12_1a85524e2015e377d433cd8384335c11d6" compoundref="057__caller__graphs_8tcl" startline="119" endline="122">2::2::2::next</references> + <referencedby refid="namespace2_1a2839d9dea7f0d08f48958c3fc0cd00d3" compoundref="057__caller__graphs_8tcl" startline="106" endline="114">2::next</referencedby> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="[generated]" line="1" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/057/namespace2_1_12_1_12.xml b/testing/057/namespace2_1_12_1_12.xml new file mode 100644 index 0000000..d04a73c --- /dev/null +++ b/testing/057/namespace2_1_12_1_12.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespace2_1_12_1_12" kind="namespace"> + <compoundname>2::2::2</compoundname> + <innernamespace refid="namespace2_1_12_1_12_1_12">2::2::2::2</innernamespace> + <sectiondef kind="func"> + <memberdef kind="function" id="namespace2_1_12_1_12_1a85524e2015e377d433cd8384335c11d6" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>2::2::2::next</definition> + <argsstring>args</argsstring> + <name>next</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="119" bodyend="122"/> + <references refid="namespace2_1_12_1_12_1_12_1a3ea6e2ce66f4a9c30009852e4c7da2fe" compoundref="057__caller__graphs_8tcl" startline="123" endline="126">2::2::2::2::next</references> + <referencedby refid="namespace2_1_12_1aceefa876cf364f44da1f523d3f7b0649" compoundref="057__caller__graphs_8tcl" startline="115" endline="118">2::2::next</referencedby> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="[generated]" line="1" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/057/namespace2_1_12_1_12_1_12.xml b/testing/057/namespace2_1_12_1_12_1_12.xml new file mode 100644 index 0000000..980906d --- /dev/null +++ b/testing/057/namespace2_1_12_1_12_1_12.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespace2_1_12_1_12_1_12" kind="namespace"> + <compoundname>2::2::2::2</compoundname> + <innernamespace refid="namespace2_1_12_1_12_1_12_1_12">2::2::2::2::2</innernamespace> + <sectiondef kind="func"> + <memberdef kind="function" id="namespace2_1_12_1_12_1_12_1a3ea6e2ce66f4a9c30009852e4c7da2fe" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>2::2::2::2::next</definition> + <argsstring>args</argsstring> + <name>next</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="123" bodyend="126"/> + <references refid="namespace2_1_12_1_12_1_12_1_12_1ac07f64c62783fd8b44317389b4a711f8" compoundref="057__caller__graphs_8tcl" startline="127" endline="130">2::2::2::2::2::next</references> + <referencedby refid="namespace2_1_12_1_12_1a85524e2015e377d433cd8384335c11d6" compoundref="057__caller__graphs_8tcl" startline="119" endline="122">2::2::2::next</referencedby> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="[generated]" line="1" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/057/namespace2_1_12_1_12_1_12_1_12.xml b/testing/057/namespace2_1_12_1_12_1_12_1_12.xml new file mode 100644 index 0000000..0c6957b --- /dev/null +++ b/testing/057/namespace2_1_12_1_12_1_12_1_12.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespace2_1_12_1_12_1_12_1_12" kind="namespace"> + <compoundname>2::2::2::2::2</compoundname> + <sectiondef kind="func"> + <memberdef kind="function" id="namespace2_1_12_1_12_1_12_1_12_1ac07f64c62783fd8b44317389b4a711f8" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>2::2::2::2::2::next</definition> + <argsstring>args</argsstring> + <name>next</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="127" bodyend="130"/> + <references refid="namespace2_1a2839d9dea7f0d08f48958c3fc0cd00d3" compoundref="057__caller__graphs_8tcl" startline="106" endline="114">2::next</references> + <referencedby refid="namespace2_1_12_1_12_1_12_1a3ea6e2ce66f4a9c30009852e4c7da2fe" compoundref="057__caller__graphs_8tcl" startline="123" endline="126">2::2::2::2::next</referencedby> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="057_caller_graphs.tcl" line="101" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/057/namespacebar.xml b/testing/057/namespacebar.xml new file mode 100644 index 0000000..3c0f6e9 --- /dev/null +++ b/testing/057/namespacebar.xml @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespacebar" kind="namespace"> + <compoundname>bar</compoundname> + <sectiondef kind="func"> + <memberdef kind="function" id="namespacebar_1aa1678a9adb588c0b91b118de7cc38ddb" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>bar::slave</definition> + <argsstring/> + <name>slave</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="29" bodyend="35"/> + <references refid="namespacebar_1a3426cd3a2eebcffa0dc333bcf5e2fe5e" compoundref="057__caller__graphs_8tcl" startline="36" endline="39">baz</references> + <referencedby refid="namespacefoo_1a265acdcaea6da32c3bbd9afb5d0e32a4" compoundref="057__caller__graphs_8tcl" startline="44" endline="48">foo::master</referencedby> + </memberdef> + <memberdef kind="function" id="namespacebar_1a3426cd3a2eebcffa0dc333bcf5e2fe5e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>bar::baz</definition> + <argsstring/> + <name>baz</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="36" bodyend="39"/> + <references refid="namespacebar_1a88879545dee287d377e638b87cdf6dd7" compoundref="057__caller__graphs_8tcl" startline="40" endline="42">bazbaz</references> + <referencedby refid="namespacebar_1aa1678a9adb588c0b91b118de7cc38ddb" compoundref="057__caller__graphs_8tcl" startline="29" endline="35">slave</referencedby> + </memberdef> + <memberdef kind="function" id="namespacebar_1a88879545dee287d377e638b87cdf6dd7" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>bar::bazbaz</definition> + <argsstring/> + <name>bazbaz</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="40" bodyend="42"/> + <referencedby refid="namespacebar_1a3426cd3a2eebcffa0dc333bcf5e2fe5e" compoundref="057__caller__graphs_8tcl" startline="36" endline="39">baz</referencedby> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="057_caller_graphs.tcl" line="28" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/057/namespacefoo.xml b/testing/057/namespacefoo.xml new file mode 100644 index 0000000..2aae8ea --- /dev/null +++ b/testing/057/namespacefoo.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespacefoo" kind="namespace"> + <compoundname>foo</compoundname> + <sectiondef kind="func"> + <memberdef kind="function" id="namespacefoo_1a265acdcaea6da32c3bbd9afb5d0e32a4" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>foo::master</definition> + <argsstring/> + <name>master</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="057_caller_graphs.tcl" bodystart="44" bodyend="48"/> + <references refid="namespacebar_1aa1678a9adb588c0b91b118de7cc38ddb" compoundref="057__caller__graphs_8tcl" startline="29" endline="35">bar::slave</references> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="057_caller_graphs.tcl" line="43" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/057_caller_graphs.tcl b/testing/057_caller_graphs.tcl new file mode 100644 index 0000000..f6e0e77 --- /dev/null +++ b/testing/057_caller_graphs.tcl @@ -0,0 +1,155 @@ +#// objective: test for completeness and correctness of references/referencedby relations +#// check: 057__caller__graphs_8tcl.xml +#// check: __057__caller__graphs_8tcl.xml +#// check: namespacebar.xml +#// check: namespacefoo.xml +#// check: namespace1.xml +#// check: namespace1_1_11.xml +#// check: namespace1_1_11_1_11.xml +#// check: namespace2.xml +#// check: namespace2_1_12.xml +#// check: namespace2_1_12_1_12.xml +#// check: namespace2_1_12_1_12_1_12.xml +#// check: namespace2_1_12_1_12_1_12_1_12.xml +#// config: EXTRACT_ALL = yes +#// config: INLINE_SOURCES = no +#// config: REFERENCED_BY_RELATION = yes +#// config: REFERENCES_RELATION = yes +#// config: INPUT = 057_caller_graphs.tcl _057_caller_graphs.tcl +# config: HAVE_DOT = yes +# config: CALLER_GRAPH = yes +# config: CALL_GRAPH = yes +# config: GENERATE_HTML = yes + +# This is a stripped down example from my code. +# Doxygen 1.8.7 generates the correct relations (xml) +# but caller graphs will be incomplete. +# It does not generate any relations at all if INLINE_SOURCES = no. +namespace eval bar {} +proc bar::slave { } { + array set info [info frame 0]; puts -nonewline ->$info(proc) + if {1} then { + bar::baz + } + return +} +proc bar::baz {} { + array set info [info frame 0]; puts -nonewline ->$info(proc) + bar::bazbaz +} +proc bar::bazbaz {} { + array set info [info frame 0]; puts -nonewline ->$info(proc) +} +namespace eval foo {} +proc foo::master { } { + array set info [info frame 0]; puts -nonewline $info(proc) + bar::slave + return +} +# +# now we check tcl's rules: from the help +# NAME RESOLUTION +#... Command names are also always resolved by looking in the current +#namespace first. If not found there, they are searched for in every namespace on +#the current namespace's command path (which is empty by default). If not found +#there, command names are looked up in the global namespace (or, failing that, +#are processed by the unknown command.) ... +# +namespace eval ::1::1::1 {} +proc ::baz args { + array set info [info frame 0]; puts -nonewline ->$info(proc) +} +proc ::1::baz args { + array set info [info frame 0]; puts -nonewline ->$info(proc) +} +proc ::bar args { + array set info [info frame 0]; puts -nonewline ->$info(proc) +} +proc ::1::bar args { + array set info [info frame 0]; puts -nonewline ->$info(proc) +} +proc ::1::1::bar args { + array set info [info frame 0]; puts -nonewline ->$info(proc) +} +proc ::1::1::1::bar args { + array set info [info frame 0]; puts -nonewline ->$info(proc) +} +proc ::1::test1 args { + array set info [info frame 0]; puts -nonewline $info(proc) + baz +} +proc ::1::test2 args { + array set info [info frame 0]; puts -nonewline $info(proc) + bar +} +proc ::1::test3 args { + array set info [info frame 0]; puts -nonewline $info(proc) + ::bar +} +proc ::1::test4 args { + array set info [info frame 0]; puts -nonewline $info(proc) + 1::bar +} +proc ::1::test5 args { + array set info [info frame 0]; puts -nonewline $info(proc) + 1::baz +} +# +# funny example, do you see the infinite loop? +# we stop before the interpreter crashes +set ::countdown 10 +namespace eval ::2::2::2::2::2 {} +proc ::next args { + array set info [info frame 0]; puts $info(proc) + 2::next +} +proc ::2::next args { + array set info [info frame 0]; puts $info(proc) + incr ::countdown -1 + if {$::countdown>0} then { + 2::next + } else { + puts "stop after 10 rounds." + } +} +proc ::2::2::next args { + array set info [info frame 0]; puts $info(proc) + 2::next +} +proc ::2::2::2::next args { + array set info [info frame 0]; puts $info(proc) + 2::next +} +proc ::2::2::2::2::next args { + array set info [info frame 0]; puts $info(proc) + 2::next +} +proc ::2::2::2::2::2::next args { + array set info [info frame 0]; puts $info(proc) + 2::next +} +# +# cross check with two files +# If doxygen did not do two passes, then xrefs would depend on file order +# and would be incomplete. +source _057_caller_graphs.tcl +proc master args { + array set info [info frame 0]; puts -nonewline ->$info(proc) + inFileB + return +} +proc inFileA args { + array set info [info frame 0]; puts -nonewline ->$info(proc) + return +} +# now, check with tcl what is called +foo::master +puts "" +foreach proc [lsort [info procs ::1::test?]] { + $proc + puts "" +} +::next +master +exit + diff --git a/testing/058/058__bracket__recursion_8tcl.xml b/testing/058/058__bracket__recursion_8tcl.xml new file mode 100644 index 0000000..fd36cee --- /dev/null +++ b/testing/058/058__bracket__recursion_8tcl.xml @@ -0,0 +1,384 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="058__bracket__recursion_8tcl" kind="file"> + <compoundname>058_bracket_recursion.tcl</compoundname> + <sectiondef kind="func"> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>Invoked</definition> + <argsstring>args</argsstring> + <name>Invoked</name> + <briefdescription> + <para>should be reference by every proc below </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="10" bodyend="13"/> + <referencedby refid="058__bracket__recursion_8tcl_1ab08ae027fc5777bc4f0629f1b60b35db" compoundref="058__bracket__recursion_8tcl" startline="22" endline="25">a</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1a68bdb74c144118d936931c46f75d4b3e" compoundref="058__bracket__recursion_8tcl" startline="28" endline="32">b</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1ab14f56bc3bd7680490ece4ad7815465f" compoundref="058__bracket__recursion_8tcl" startline="33" endline="37">c</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1af43f4b1f0064a33b2d662af9f06d3a00" compoundref="058__bracket__recursion_8tcl" startline="38" endline="42">d</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1aff65a51a703804e0ad1adbcfd76c86f8" compoundref="058__bracket__recursion_8tcl" startline="43" endline="46">e</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1af6830d2c644b45088ea8f1f74a46b778" compoundref="058__bracket__recursion_8tcl" startline="47" endline="50">f</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1af08b4b5bfa9edf0b0a7dee1c2b2c29e0" compoundref="058__bracket__recursion_8tcl" startline="51" endline="55">g</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1af96fd0966e32a310a0778d2e5c357700" compoundref="058__bracket__recursion_8tcl" startline="56" endline="59">h</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1a8c90afd4641b25be86bd09983c3cbee0" compoundref="058__bracket__recursion_8tcl" startline="64" endline="68">i</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1a2aaa92757686acea102cba3475f0c13b" compoundref="058__bracket__recursion_8tcl" startline="69" endline="73">j</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1a20363f854eb4098a446733d63d34dbc1" compoundref="058__bracket__recursion_8tcl" startline="74" endline="77">k</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1aff56f84b49947b84b2a304f51cf8e678" compoundref="058__bracket__recursion_8tcl" startline="78" endline="81">l</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1a78d127e8bda64d4471ac811ad512fbd9" compoundref="058__bracket__recursion_8tcl" startline="82" endline="85">m</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1acdde3cd86eb2421ce8dbb2e85227d368" compoundref="058__bracket__recursion_8tcl" startline="86" endline="89">n</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1a495e7a4ede0831107e9d435080a7c268" compoundref="058__bracket__recursion_8tcl" startline="90" endline="94">o</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1a15229b450f26d8fa1c10bea4f3279f4d" compoundref="058__bracket__recursion_8tcl" startline="102" endline="107">p</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1ab678a0a9a7e94bce5b17141f40220d88" compoundref="058__bracket__recursion_8tcl" startline="108" endline="114">q</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1a0a0bd3dc69dd06934c4e6362155e0ace" compoundref="058__bracket__recursion_8tcl" startline="115" endline="120">r</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1a011c73f2dbb87635a3b4206c72355f6e" compoundref="058__bracket__recursion_8tcl" startline="121" endline="126">s</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1a69e959f6901827e4d8271aeaa5fba0fc" compoundref="058__bracket__recursion_8tcl" startline="128" endline="131">t</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1a2fb1c5cf58867b5bbc9a1b145a86f3a0" compoundref="058__bracket__recursion_8tcl" startline="137" endline="142">y</referencedby> + <referencedby refid="058__bracket__recursion_8tcl_1a25ed1bcb423b0b7200f485fc5ff71c8e" compoundref="058__bracket__recursion_8tcl" startline="143" endline="148">z</referencedby> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1a3f55465410c57ed00ab28827a741b1c3" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>NotInvoked</definition> + <argsstring>args</argsstring> + <name>NotInvoked</name> + <briefdescription> + <para>must not be reference by every proc below </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="16" bodyend="19"/> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1ab08ae027fc5777bc4f0629f1b60b35db" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>a</definition> + <argsstring>args</argsstring> + <name>a</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="22" bodyend="25"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1a68bdb74c144118d936931c46f75d4b3e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>b</definition> + <argsstring>args</argsstring> + <name>b</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="28" bodyend="32"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1ab14f56bc3bd7680490ece4ad7815465f" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>c</definition> + <argsstring>args</argsstring> + <name>c</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="33" bodyend="37"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1af43f4b1f0064a33b2d662af9f06d3a00" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>d</definition> + <argsstring>args</argsstring> + <name>d</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="38" bodyend="42"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1aff65a51a703804e0ad1adbcfd76c86f8" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>e</definition> + <argsstring>args</argsstring> + <name>e</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="43" bodyend="46"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1af6830d2c644b45088ea8f1f74a46b778" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>f</definition> + <argsstring>args</argsstring> + <name>f</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="47" bodyend="50"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1af08b4b5bfa9edf0b0a7dee1c2b2c29e0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>g</definition> + <argsstring>args</argsstring> + <name>g</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="51" bodyend="55"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1af96fd0966e32a310a0778d2e5c357700" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>h</definition> + <argsstring>args</argsstring> + <name>h</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="56" bodyend="59"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1a8c90afd4641b25be86bd09983c3cbee0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>i</definition> + <argsstring>args</argsstring> + <name>i</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="64" bodyend="68"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1a2aaa92757686acea102cba3475f0c13b" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>j</definition> + <argsstring>args</argsstring> + <name>j</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="69" bodyend="73"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1a20363f854eb4098a446733d63d34dbc1" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>k</definition> + <argsstring>args</argsstring> + <name>k</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="74" bodyend="77"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1aff56f84b49947b84b2a304f51cf8e678" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>l</definition> + <argsstring>args</argsstring> + <name>l</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="78" bodyend="81"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1a78d127e8bda64d4471ac811ad512fbd9" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>m</definition> + <argsstring>args</argsstring> + <name>m</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="82" bodyend="85"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1acdde3cd86eb2421ce8dbb2e85227d368" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>n</definition> + <argsstring>args</argsstring> + <name>n</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="86" bodyend="89"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1a495e7a4ede0831107e9d435080a7c268" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>o</definition> + <argsstring>args</argsstring> + <name>o</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="90" bodyend="94"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1a8a57650834f5708d404e9c386b2edf87" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>$NotInvoked</definition> + <argsstring>args</argsstring> + <name>$NotInvoked</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="98" bodyend="101"/> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1a15229b450f26d8fa1c10bea4f3279f4d" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>p</definition> + <argsstring>args</argsstring> + <name>p</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="102" bodyend="107"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1ab678a0a9a7e94bce5b17141f40220d88" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>q</definition> + <argsstring>args</argsstring> + <name>q</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="108" bodyend="114"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1a0a0bd3dc69dd06934c4e6362155e0ace" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>r</definition> + <argsstring>args</argsstring> + <name>r</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="115" bodyend="120"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1a011c73f2dbb87635a3b4206c72355f6e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>s</definition> + <argsstring>args</argsstring> + <name>s</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="121" bodyend="126"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1a69e959f6901827e4d8271aeaa5fba0fc" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>t</definition> + <argsstring>args</argsstring> + <name>t</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="128" bodyend="131"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1a2fb1c5cf58867b5bbc9a1b145a86f3a0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>y</definition> + <argsstring/> + <name>y</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="137" bodyend="142"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="058__bracket__recursion_8tcl_1a25ed1bcb423b0b7200f485fc5ff71c8e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>z</definition> + <argsstring/> + <name>z</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="058_bracket_recursion.tcl" bodystart="143" bodyend="148"/> + <references refid="058__bracket__recursion_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="058__bracket__recursion_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="058_bracket_recursion.tcl"/> + </compounddef> +</doxygen> diff --git a/testing/058_bracket_recursion.tcl b/testing/058_bracket_recursion.tcl new file mode 100644 index 0000000..2ecd673 --- /dev/null +++ b/testing/058_bracket_recursion.tcl @@ -0,0 +1,157 @@ +#// objective: tests processing of commands inside brackets [], only references/referencedby relations are relevant +#// check: 058__bracket__recursion_8tcl.xml +#// config: REFERENCED_BY_RELATION = yes +#// config: REFERENCES_RELATION = yes +#// config: EXTRACT_ALL = yes +#// config: INLINE_SOURCES = yes + +## +# \brief should be reference by every proc below +proc Invoked args { + puts "Procedure \"Invoked\" is invoked indeed. Ok." + return $args +} +## +# \brief must not be reference by every proc below +proc NotInvoked args { + puts "Procedure \"NotInvoked\" is invoked. Not Ok!" + return $args +} +# +# check if call references work at all +proc a args { + Invoked NotInvoked + return +} +# +# check brackets with various quoting, bracing +proc b args { + set r [Invoked] + set r [list \[NotInvoked \]] + return +} +proc c args { + set r \{[Invoked]\} + set r {[NotInvoked]} + return +} +proc d args { + set r "[Invoked]" + set r "\[NotInvoked \]" + return +} +proc e args { + set r [list \[NotInvoked [Invoked]\]] + return +} +proc f args { + set r [list [Invoked \[NotInvoked \]]] + return +} +proc g args { + set r "{[Invoked]}" + set r "{\[NotInvoked \]}" + return +} +proc h args { + [Invoked set] r {[NotInvoked]} + return +} +# check brackets in tcl commands containing script arguments +# +# example generated according to +# https://groups.google.com/d/msg/comp.lang.tcl/G5-mc3GiIyY/e-AVD9t7xMkJ +proc i args { + foreach item [Invoked] { + return + } +} +proc j args { + foreach [Invoked item] [list one two three] { + } + return +} +proc k args { + while {[Invoked 0]} { + } +} +proc l args { + for {} {[Invoked 0]} {} { + } +} +proc m args { + if {[Invoked 1]} { + } +} +proc n args { + if [Invoked 1] { + } +} +proc o args { + if {0} { + } elseif {[Invoked 0]} { + } +} +# these are really nasty examples +# they shows, that the condition argument may not be parsed as a script +set NotInvoked \$NotInvoked +proc $NotInvoked args { + puts "Procedure \"\$NotInvoked\" is invoked. Not Ok!" + return $args +} +proc p args { + set NotInvoked \$NotInvoked + if {$NotInvoked eq [Invoked 1]} { + } + return +} +proc q args { + set NotInvoked \$NotInvoked + if {0} { + } elseif {$NotInvoked eq [Invoked 1]} { + } + return +} +proc r args { + set NotInvoked \$NotInvoked + while {$NotInvoked eq [Invoked 1]} { + } + return +} +proc s args { + set NotInvoked \$NotInvoked + for {} {$NotInvoked eq [Invoked 1]} {} { + } + return +} +# dangling open brackets should not confuse the scanner +proc t args { + set foo ]]]][Invoked] + return +} +# Example according to +# https://bugzilla.gnome.org/show_bug.cgi?id=729135 +# | +# Note the subtle difference in this | whitespace +# V +proc y {} { + set classifier_state {{bphy} } + if { ($classifier_state == {{bphy} }) } { + Invoked + } +} +proc z {} { + set classifier_state {{bphy} } + if { ($classifier_state == {{bphy} } ) } { + Invoked + } +} +# +# call all single letter procs +# let tcl check what is called and what is not called +foreach p [info procs ?] { + puts "Check procedure \"$p\"" + $p +} +exit + diff --git a/testing/059/059__command__catch_8tcl.xml b/testing/059/059__command__catch_8tcl.xml new file mode 100644 index 0000000..6604413 --- /dev/null +++ b/testing/059/059__command__catch_8tcl.xml @@ -0,0 +1,191 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="059__command__catch_8tcl" kind="file"> + <compoundname>059_command_catch.tcl</compoundname> + <sectiondef kind="func"> + <memberdef kind="function" id="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>Invoked</definition> + <argsstring>args</argsstring> + <name>Invoked</name> + <briefdescription> + <para>should be reference by every proc below </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="059_command_catch.tcl" bodystart="10" bodyend="13"/> + <referencedby refid="059__command__catch_8tcl_1ab08ae027fc5777bc4f0629f1b60b35db" compoundref="059__command__catch_8tcl" startline="22" endline="25">a</referencedby> + <referencedby refid="059__command__catch_8tcl_1a68bdb74c144118d936931c46f75d4b3e" compoundref="059__command__catch_8tcl" startline="29" endline="32">b</referencedby> + <referencedby refid="059__command__catch_8tcl_1ab14f56bc3bd7680490ece4ad7815465f" compoundref="059__command__catch_8tcl" startline="33" endline="36">c</referencedby> + <referencedby refid="059__command__catch_8tcl_1af43f4b1f0064a33b2d662af9f06d3a00" compoundref="059__command__catch_8tcl" startline="37" endline="40">d</referencedby> + <referencedby refid="059__command__catch_8tcl_1aff65a51a703804e0ad1adbcfd76c86f8" compoundref="059__command__catch_8tcl" startline="41" endline="44">e</referencedby> + <referencedby refid="059__command__catch_8tcl_1af6830d2c644b45088ea8f1f74a46b778" compoundref="059__command__catch_8tcl" startline="45" endline="48">f</referencedby> + <referencedby refid="059__command__catch_8tcl_1af08b4b5bfa9edf0b0a7dee1c2b2c29e0" compoundref="059__command__catch_8tcl" startline="49" endline="54">g</referencedby> + <referencedby refid="059__command__catch_8tcl_1af96fd0966e32a310a0778d2e5c357700" compoundref="059__command__catch_8tcl" startline="56" endline="59">h</referencedby> + <referencedby refid="059__command__catch_8tcl_1a8c90afd4641b25be86bd09983c3cbee0" compoundref="059__command__catch_8tcl" startline="60" endline="63">i</referencedby> + <referencedby refid="059__command__catch_8tcl_1a2aaa92757686acea102cba3475f0c13b" compoundref="059__command__catch_8tcl" startline="75" endline="78">j</referencedby> + </memberdef> + <memberdef kind="function" id="059__command__catch_8tcl_1a3f55465410c57ed00ab28827a741b1c3" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>NotInvoked</definition> + <argsstring>args</argsstring> + <name>NotInvoked</name> + <briefdescription> + <para>must not be reference by every proc below </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="059_command_catch.tcl" bodystart="16" bodyend="19"/> + </memberdef> + <memberdef kind="function" id="059__command__catch_8tcl_1ab08ae027fc5777bc4f0629f1b60b35db" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>a</definition> + <argsstring>args</argsstring> + <name>a</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="059_command_catch.tcl" bodystart="22" bodyend="25"/> + <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="059__command__catch_8tcl_1a68bdb74c144118d936931c46f75d4b3e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>b</definition> + <argsstring>args</argsstring> + <name>b</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="059_command_catch.tcl" bodystart="29" bodyend="32"/> + <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="059__command__catch_8tcl_1ab14f56bc3bd7680490ece4ad7815465f" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>c</definition> + <argsstring>args</argsstring> + <name>c</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="059_command_catch.tcl" bodystart="33" bodyend="36"/> + <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="059__command__catch_8tcl_1af43f4b1f0064a33b2d662af9f06d3a00" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>d</definition> + <argsstring>args</argsstring> + <name>d</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="059_command_catch.tcl" bodystart="37" bodyend="40"/> + <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="059__command__catch_8tcl_1aff65a51a703804e0ad1adbcfd76c86f8" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>e</definition> + <argsstring>args</argsstring> + <name>e</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="059_command_catch.tcl" bodystart="41" bodyend="44"/> + <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="059__command__catch_8tcl_1af6830d2c644b45088ea8f1f74a46b778" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>f</definition> + <argsstring>args</argsstring> + <name>f</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="059_command_catch.tcl" bodystart="45" bodyend="48"/> + <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="059__command__catch_8tcl_1af08b4b5bfa9edf0b0a7dee1c2b2c29e0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>g</definition> + <argsstring>args</argsstring> + <name>g</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="059_command_catch.tcl" bodystart="49" bodyend="54"/> + <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="059__command__catch_8tcl_1af96fd0966e32a310a0778d2e5c357700" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>h</definition> + <argsstring>args</argsstring> + <name>h</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="059_command_catch.tcl" bodystart="56" bodyend="59"/> + <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="059__command__catch_8tcl_1a8c90afd4641b25be86bd09983c3cbee0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>i</definition> + <argsstring>args</argsstring> + <name>i</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="059_command_catch.tcl" bodystart="60" bodyend="63"/> + <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="059__command__catch_8tcl_1a2aaa92757686acea102cba3475f0c13b" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>j</definition> + <argsstring>args</argsstring> + <name>j</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="059_command_catch.tcl" bodystart="75" bodyend="78"/> + <references refid="059__command__catch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="059__command__catch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="059_command_catch.tcl"/> + </compounddef> +</doxygen> diff --git a/testing/059_command_catch.tcl b/testing/059_command_catch.tcl new file mode 100644 index 0000000..4227da7 --- /dev/null +++ b/testing/059_command_catch.tcl @@ -0,0 +1,87 @@ +#// objective: tests processing of catch/eval, only references/referencedby relations are relevant +#// check: 059__command__catch_8tcl.xml +#// config: REFERENCED_BY_RELATION = yes +#// config: REFERENCES_RELATION = yes +#// config: EXTRACT_ALL = yes +#// config: INLINE_SOURCES = no + +## +# \brief should be reference by every proc below +proc Invoked args { + puts "Procedure \"Invoked\" is invoked indeed. Ok." + return $args +} +## +# \brief must not be reference by every proc below +proc NotInvoked args { + puts "Procedure \"NotInvoked\" is invoked. Not Ok!" + return $args +} +# +# check if call references work at all +proc a args { + Invoked NotInvoked + return +} +# +# catch command +# Tcl8.5: catch script ?resultVarName? ?optionsVarName? +proc b args { + catch Invoked + return +} +proc c args { + catch Invoked NotInvoked + return +} +proc d args { + catch Invoked NotInvoked NotInvoked + return +} +proc e args { + set r [catch Invoked NotInvoked NotInvoked] + return +} +proc f args { + set r [catch {Invoked} NotInvoked NotInvoked] + return +} +proc g args { + set r [catch { + set x [Invoked] + } NotInvoked NotInvoked] + return +} +# eval arg ?arg ...? +proc h args { + eval Invoked NotInvoked + return +} +proc i args { + eval set NotInvoked [Invoked NotInvoked] + return +} +# This is a striped down example. Original: +# +# jpeg.tcl -- +# +# Querying and modifying JPEG image files. +# +# Copyright (c) 2004 Aaron Faupell <afaupell@users.sourceforge.net> +# +# ... +# eval [list addComment $file] [lreplace $com 0 0 $comment] +# ... +proc j args { + eval [list set] [list NotInvoked] [Invoked NotInvoked] + return +} +# +# call all single letter procs +# let tcl check what is called and what is not called +foreach p [info procs ?] { + puts "Check procedure \"$p\"" + $p +} +exit + diff --git a/testing/060/060__command__switch_8tcl.xml b/testing/060/060__command__switch_8tcl.xml new file mode 100644 index 0000000..05e01c6 --- /dev/null +++ b/testing/060/060__command__switch_8tcl.xml @@ -0,0 +1,326 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="060__command__switch_8tcl" kind="file"> + <compoundname>060_command_switch.tcl</compoundname> + <sectiondef kind="func"> + <memberdef kind="function" id="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>Invoked</definition> + <argsstring>args</argsstring> + <name>Invoked</name> + <briefdescription> + <para>should be reference by every proc below </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="10" bodyend="13"/> + <referencedby refid="060__command__switch_8tcl_1ab08ae027fc5777bc4f0629f1b60b35db" compoundref="060__command__switch_8tcl" startline="22" endline="25">a</referencedby> + <referencedby refid="060__command__switch_8tcl_1a68bdb74c144118d936931c46f75d4b3e" compoundref="060__command__switch_8tcl" startline="29" endline="36">b</referencedby> + <referencedby refid="060__command__switch_8tcl_1ab14f56bc3bd7680490ece4ad7815465f" compoundref="060__command__switch_8tcl" startline="37" endline="43">c</referencedby> + <referencedby refid="060__command__switch_8tcl_1af43f4b1f0064a33b2d662af9f06d3a00" compoundref="060__command__switch_8tcl" startline="44" endline="50">d</referencedby> + <referencedby refid="060__command__switch_8tcl_1aff65a51a703804e0ad1adbcfd76c86f8" compoundref="060__command__switch_8tcl" startline="51" endline="57">e</referencedby> + <referencedby refid="060__command__switch_8tcl_1af6830d2c644b45088ea8f1f74a46b778" compoundref="060__command__switch_8tcl" startline="58" endline="65">f</referencedby> + <referencedby refid="060__command__switch_8tcl_1af08b4b5bfa9edf0b0a7dee1c2b2c29e0" compoundref="060__command__switch_8tcl" startline="66" endline="73">g</referencedby> + <referencedby refid="060__command__switch_8tcl_1af96fd0966e32a310a0778d2e5c357700" compoundref="060__command__switch_8tcl" startline="74" endline="81">h</referencedby> + <referencedby refid="060__command__switch_8tcl_1a8c90afd4641b25be86bd09983c3cbee0" compoundref="060__command__switch_8tcl" startline="83" endline="94">i</referencedby> + <referencedby refid="060__command__switch_8tcl_1a2aaa92757686acea102cba3475f0c13b" compoundref="060__command__switch_8tcl" startline="95" endline="106">j</referencedby> + <referencedby refid="060__command__switch_8tcl_1a20363f854eb4098a446733d63d34dbc1" compoundref="060__command__switch_8tcl" startline="107" endline="118">k</referencedby> + <referencedby refid="060__command__switch_8tcl_1aff56f84b49947b84b2a304f51cf8e678" compoundref="060__command__switch_8tcl" startline="119" endline="129">l</referencedby> + <referencedby refid="060__command__switch_8tcl_1a78d127e8bda64d4471ac811ad512fbd9" compoundref="060__command__switch_8tcl" startline="130" endline="141">m</referencedby> + <referencedby refid="060__command__switch_8tcl_1acdde3cd86eb2421ce8dbb2e85227d368" compoundref="060__command__switch_8tcl" startline="142" endline="153">n</referencedby> + <referencedby refid="060__command__switch_8tcl_1a495e7a4ede0831107e9d435080a7c268" compoundref="060__command__switch_8tcl" startline="154" endline="165">o</referencedby> + <referencedby refid="060__command__switch_8tcl_1a15229b450f26d8fa1c10bea4f3279f4d" compoundref="060__command__switch_8tcl" startline="166" endline="175">p</referencedby> + <referencedby refid="060__command__switch_8tcl_1ab678a0a9a7e94bce5b17141f40220d88" compoundref="060__command__switch_8tcl" startline="176" endline="185">q</referencedby> + <referencedby refid="060__command__switch_8tcl_1a0a0bd3dc69dd06934c4e6362155e0ace" compoundref="060__command__switch_8tcl" startline="186" endline="195">r</referencedby> + <referencedby refid="060__command__switch_8tcl_1a011c73f2dbb87635a3b4206c72355f6e" compoundref="060__command__switch_8tcl" startline="196" endline="205">s</referencedby> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1a3f55465410c57ed00ab28827a741b1c3" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>NotInvoked</definition> + <argsstring>args</argsstring> + <name>NotInvoked</name> + <briefdescription> + <para>must not be reference by every proc below </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="16" bodyend="19"/> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1ab08ae027fc5777bc4f0629f1b60b35db" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>a</definition> + <argsstring>args</argsstring> + <name>a</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="22" bodyend="25"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1a68bdb74c144118d936931c46f75d4b3e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>b</definition> + <argsstring>args</argsstring> + <name>b</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="29" bodyend="36"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1ab14f56bc3bd7680490ece4ad7815465f" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>c</definition> + <argsstring>args</argsstring> + <name>c</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="37" bodyend="43"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1af43f4b1f0064a33b2d662af9f06d3a00" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>d</definition> + <argsstring>args</argsstring> + <name>d</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="44" bodyend="50"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1aff65a51a703804e0ad1adbcfd76c86f8" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>e</definition> + <argsstring>args</argsstring> + <name>e</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="51" bodyend="57"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1af6830d2c644b45088ea8f1f74a46b778" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>f</definition> + <argsstring>args</argsstring> + <name>f</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="58" bodyend="65"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1af08b4b5bfa9edf0b0a7dee1c2b2c29e0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>g</definition> + <argsstring>args</argsstring> + <name>g</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="66" bodyend="73"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1af96fd0966e32a310a0778d2e5c357700" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>h</definition> + <argsstring>args</argsstring> + <name>h</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="74" bodyend="81"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1a8c90afd4641b25be86bd09983c3cbee0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>i</definition> + <argsstring>args</argsstring> + <name>i</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="83" bodyend="94"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1a2aaa92757686acea102cba3475f0c13b" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>j</definition> + <argsstring>args</argsstring> + <name>j</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="95" bodyend="106"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1a20363f854eb4098a446733d63d34dbc1" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>k</definition> + <argsstring>args</argsstring> + <name>k</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="107" bodyend="118"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1aff56f84b49947b84b2a304f51cf8e678" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>l</definition> + <argsstring>args</argsstring> + <name>l</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="119" bodyend="129"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1a78d127e8bda64d4471ac811ad512fbd9" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>m</definition> + <argsstring>args</argsstring> + <name>m</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="130" bodyend="141"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1acdde3cd86eb2421ce8dbb2e85227d368" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>n</definition> + <argsstring>args</argsstring> + <name>n</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="142" bodyend="153"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1a495e7a4ede0831107e9d435080a7c268" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>o</definition> + <argsstring>args</argsstring> + <name>o</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="154" bodyend="165"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1a15229b450f26d8fa1c10bea4f3279f4d" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>p</definition> + <argsstring>args</argsstring> + <name>p</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="166" bodyend="175"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1ab678a0a9a7e94bce5b17141f40220d88" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>q</definition> + <argsstring>args</argsstring> + <name>q</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="176" bodyend="185"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1a0a0bd3dc69dd06934c4e6362155e0ace" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>r</definition> + <argsstring>args</argsstring> + <name>r</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="186" bodyend="195"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + <memberdef kind="function" id="060__command__switch_8tcl_1a011c73f2dbb87635a3b4206c72355f6e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>s</definition> + <argsstring>args</argsstring> + <name>s</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="060_command_switch.tcl" bodystart="196" bodyend="205"/> + <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="060_command_switch.tcl"/> + </compounddef> +</doxygen> diff --git a/testing/060_command_switch.tcl b/testing/060_command_switch.tcl new file mode 100644 index 0000000..407f2e9 --- /dev/null +++ b/testing/060_command_switch.tcl @@ -0,0 +1,238 @@ +#// objective: tests processing of switch, only references/referencedby relations are relevant +#// check: 060__command__switch_8tcl.xml +#// config: REFERENCED_BY_RELATION = yes +#// config: REFERENCES_RELATION = yes +#// config: EXTRACT_ALL = yes +#// config: INLINE_SOURCES = no + +## +# \brief should be reference by every proc below +proc Invoked args { + puts "Procedure \"Invoked\" is invoked indeed. Ok." + return $args +} +## +# \brief must not be reference by every proc below +proc NotInvoked args { + puts "Procedure \"NotInvoked\" is invoked. Not Ok!" + return $args +} +# +# check if call references work at all +proc a args { + Invoked NotInvoked + return +} +# +# switch command +# switch ?options? string pattern body ?pattern body ...? +proc b args { + switch value NotInvoked { + } NotInvoked { + } default { + Invoked + } + return +} +proc c args { + switch value NotInvoked { + } [Invoked] { + } default { + } + return +} +proc d args { + switch NotInvoked pattern { + } [Invoked] { + } default { + } + return +} +proc e args { + switch [Invoked] pattern { + } NotInvoked { + } default { + } + return +} +proc f args { + switch -exact value pattern { + } NotInvoked { + } default { + Invoked + } + return +} +proc g args { + switch -exact -- value pattern { + } NotInvoked { + } default { + Invoked + } + return +} +proc h args { + switch -exact -- -value pattern { + } NotInvoked { + } default { + Invoked + } + return +} +# switch ?options? string {pattern body ?pattern body ...?} +proc i args { + switch value { + NotInvoked { + } + NotInvoked { + } + default { + Invoked + } + } + return +} +proc j args { + switch vale { + NotInvoked { + } + [NotInvoked] { + } + default { + Invoked + } + } + return +} +proc k args { + switch NotInvoked { + [NotInvoked] { + } + NotInvoked { + Invoked + } + default { + } + } + return +} +proc l args { + switch [Invoked] { + pattern { + } + NotInvoked { + } + default { + } + } + return +} +proc m args { + switch -exact value { + pattern { + } + NotInvoked { + } + default { + Invoked + } + } + return +} +proc n args { + switch -exact -- value { + pattern { + } + NotInvoked { + } + default { + Invoked + } + } + return +} +proc o args { + switch -exact -- -value { + pattern { + } + NotInvoked { + } + default { + Invoked + } + } + return +} +proc p args { + switch -exact -- inquotes { + "inquotes" { + Invoked + } + default { + } + } + return +} +proc q args { + switch -exact -- "in quotes" { + "in quotes" { + Invoked + } + default { + } + } + return +} +proc r args { + switch -exact -- inbraces { + {inbraces} { + Invoked + } + default { + } + } + return +} +proc s args { + switch -exact -- {in braces} { + {in braces} { + Invoked + } + default { + } + } + return +} +# wrong syntax +#proc x args { +# catch {switch -exact -- [Invoked] pattern1 NotInvoked pattern2} +# return +#} +# The current version does not check the last argument beforehand. +# Therefore, all script elements are evaluated as scripts before +# the parser detects the dangling pattern. It throws a warning, at the very least. +# Anyway, for working code the documentation will be correct. +#proc y args { +# catch {switch -exact -- [Invoked] { +# pattern { +# NotInvoked +# } +# NotInvoked { +# NotInvoked +# } +# default { +# NotInvoked +# } +# pattern +# }} +# return +#} +# +# call all single letter procs +# let tcl check what is called and what is not called +foreach p [info procs ?] { + puts "Check procedure \"$p\"" + $p +} +exit + diff --git a/testing/061/class_test.xml b/testing/061/class_test.xml new file mode 100644 index 0000000..0922539 --- /dev/null +++ b/testing/061/class_test.xml @@ -0,0 +1,70 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="class_test" kind="class" prot="public"> + <compoundname>Test</compoundname> + <sectiondef kind="public-func"> + <memberdef kind="function" id="class_test_1af863c78bca81b4e276dcbb30f12e8ec6" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>Test::testmethod_one</definition> + <argsstring>args</argsstring> + <name>testmethod_one</name> + <briefdescription> + <para><ref refid="class_test" kindref="compound">Test</ref> method 1. </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="061_bug_705503.tcl" bodystart="12" bodyend="12"/> + </memberdef> + <memberdef kind="function" id="class_test_1ac7148d2852b30d157e078fe0fe58a350" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>Test::constructor</definition> + <argsstring>args</argsstring> + <name>constructor</name> + <briefdescription> + <para>Construction of class. </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="061_bug_705503.tcl" bodystart="16" bodyend="16"/> + </memberdef> + <memberdef kind="function" id="class_test_1abdf3375950ec49e29f4bae947b7e3f26" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>Test::testmethod_two</definition> + <argsstring>args</argsstring> + <name>testmethod_two</name> + <briefdescription> + <para><ref refid="class_test" kindref="compound">Test</ref> method 2. </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="061_bug_705503.tcl" bodystart="19" bodyend="19"/> + </memberdef> + </sectiondef> + <briefdescription> + <para>Testclass. </para> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="061_bug_705503.tcl" bodystart="10" bodyend="13"/> + <listofallmembers> + <member refid="class_test_1ac7148d2852b30d157e078fe0fe58a350" prot="public" virt="non-virtual"> + <scope>Test</scope> + <name>constructor</name> + </member> + <member refid="class_test_1af863c78bca81b4e276dcbb30f12e8ec6" prot="public" virt="non-virtual"> + <scope>Test</scope> + <name>testmethod_one</name> + </member> + <member refid="class_test_1abdf3375950ec49e29f4bae947b7e3f26" prot="public" virt="non-virtual"> + <scope>Test</scope> + <name>testmethod_two</name> + </member> + </listofallmembers> + </compounddef> +</doxygen> diff --git a/testing/061_bug_705503.tcl b/testing/061_bug_705503.tcl new file mode 100644 index 0000000..ce25d6e --- /dev/null +++ b/testing/061_bug_705503.tcl @@ -0,0 +1,19 @@ +#// objective: test for bug 705503 - TCL: Documentation of oo::define is not working +#// check: class_test.xml +#// config: EXTRACT_ALL = yes + +# taken from +# https://bugzilla.gnome.org/show_bug.cgi?id=705503 + +## @class Test +# @brief Testclass +oo::class create Test { + ## @brief Test method 1. + method testmethod_one args {} +} + +## @brief Construction of class +oo::define Test constructor args {} + +## @brief Test method 2 +oo::define Test method testmethod_two args {} diff --git a/testing/062/namespacen1.xml b/testing/062/namespacen1.xml new file mode 100644 index 0000000..0ef31ff --- /dev/null +++ b/testing/062/namespacen1.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespacen1" kind="namespace"> + <compoundname>n1</compoundname> + <innernamespace refid="namespacen1_1_1n1">n1::n1</innernamespace> + <sectiondef kind="func"> + <memberdef kind="function" id="namespacen1_1a9f23d7a7f141915457e8e26023d70cb4" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>n1::p1</definition> + <argsstring>args</argsstring> + <name>p1</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="062_namespace_resolution.tcl" bodystart="12" bodyend="16"/> + <references refid="namespacen1_1a0bff29f718fa43e49b7ca79985afb5fa" compoundref="062__namespace__resolution_8tcl" startline="17" endline="20">p2</references> + </memberdef> + <memberdef kind="function" id="namespacen1_1a0bff29f718fa43e49b7ca79985afb5fa" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>n1::p2</definition> + <argsstring>args</argsstring> + <name>p2</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="062_namespace_resolution.tcl" bodystart="17" bodyend="20"/> + <referencedby refid="namespacen1_1a9f23d7a7f141915457e8e26023d70cb4" compoundref="062__namespace__resolution_8tcl" startline="12" endline="16">p1</referencedby> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="062_namespace_resolution.tcl" line="11" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/062/namespacen2.xml b/testing/062/namespacen2.xml new file mode 100644 index 0000000..39c21d2 --- /dev/null +++ b/testing/062/namespacen2.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespacen2" kind="namespace"> + <compoundname>n2</compoundname> + <innernamespace refid="namespacen2_1_1n2">n2::n2</innernamespace> + <sectiondef kind="func"> + <memberdef kind="function" id="namespacen2_1a74950c0185232e374220a0707b4903c6" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>n2::p1</definition> + <argsstring>args</argsstring> + <name>p1</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="062_namespace_resolution.tcl" bodystart="31" bodyend="35"/> + <references refid="namespacen2_1a49fadfbefa795204a3c566ec76ff632f" compoundref="062__namespace__resolution_8tcl" startline="36" endline="39">p2</references> + </memberdef> + <memberdef kind="function" id="namespacen2_1a49fadfbefa795204a3c566ec76ff632f" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>n2::p2</definition> + <argsstring>args</argsstring> + <name>p2</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="062_namespace_resolution.tcl" bodystart="36" bodyend="39"/> + <referencedby refid="namespacen2_1a74950c0185232e374220a0707b4903c6" compoundref="062__namespace__resolution_8tcl" startline="31" endline="35">p1</referencedby> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="062_namespace_resolution.tcl" line="29" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/062/namespacen3.xml b/testing/062/namespacen3.xml new file mode 100644 index 0000000..25c803c --- /dev/null +++ b/testing/062/namespacen3.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespacen3" kind="namespace"> + <compoundname>n3</compoundname> + <innernamespace refid="namespacen3_1_1n3">n3::n3</innernamespace> + <sectiondef kind="func"> + <memberdef kind="function" id="namespacen3_1ae7e87e49507bd56dad087cffecd35b29" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>n3::p1</definition> + <argsstring>args</argsstring> + <name>p1</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="062_namespace_resolution.tcl" bodystart="47" bodyend="51"/> + <references refid="namespacen3_1a14e9fe1b27a6d36db9ace2eef4509979" compoundref="062__namespace__resolution_8tcl" startline="52" endline="55">p2</references> + </memberdef> + <memberdef kind="function" id="namespacen3_1a14e9fe1b27a6d36db9ace2eef4509979" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>n3::p2</definition> + <argsstring>args</argsstring> + <name>p2</name> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="062_namespace_resolution.tcl" bodystart="52" bodyend="55"/> + <referencedby refid="namespacen3_1ae7e87e49507bd56dad087cffecd35b29" compoundref="062__namespace__resolution_8tcl" startline="47" endline="51">p1</referencedby> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="062_namespace_resolution.tcl" line="45" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/062_namespace_resolution.tcl b/testing/062_namespace_resolution.tcl new file mode 100644 index 0000000..dcc6701 --- /dev/null +++ b/testing/062_namespace_resolution.tcl @@ -0,0 +1,68 @@ +#// objective: tests correct namespace resolution, only references/referencedby relations are relevant +#// check: namespacen1.xml +#// check: namespacen2.xml +#// check: namespacen3.xml +#// config: REFERENCED_BY_RELATION = yes +#// config: REFERENCES_RELATION = yes +#// config: EXTRACT_ALL = yes +#// config: INLINE_SOURCES = yes + +# now: combine namespace eval and qualified names +namespace eval n1 { + proc p1 args { + array set info [info frame 0]; puts -nonewline ->$info(proc) + p2 + return + } + proc p2 args { + array set info [info frame 0]; puts -nonewline ->$info(proc) + return + } + namespace eval n1 { + proc p1 args { + array set info [info frame 0]; puts -nonewline ->$info(proc) + return + } + } +} +# same thing, but fully qualified proc names +namespace eval ::n2 {} +namespace eval ::n2::n2 {} +proc ::n2::p1 args { + array set info [info frame 0]; puts -nonewline ->$info(proc) + p2 + return +} +proc ::n2::p2 args { + array set info [info frame 0]; puts -nonewline ->$info(proc) + return +} +proc ::n2::n2::p2 args { + array set info [info frame 0]; puts -nonewline ->$info(proc) + return +} +# same thing, without leading :: +namespace eval n3 {} +namespace eval n3::n3 {} +proc n3::p1 args { + array set info [info frame 0]; puts -nonewline ->$info(proc) + p2 + return +} +proc n3::p2 args { + array set info [info frame 0]; puts -nonewline ->$info(proc) + return +} +proc n3::n3::p2 args { + array set info [info frame 0]; puts -nonewline ->$info(proc) + return +} +# now, check with tcl what is called +n1::p1 +puts "" +n2::p1 +puts "" +n3::p1 +puts "" +exit + diff --git a/testing/063/namespaceoo.xml b/testing/063/namespaceoo.xml new file mode 100644 index 0000000..eb0c93c --- /dev/null +++ b/testing/063/namespaceoo.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespaceoo" kind="namespace"> + <compoundname>oo</compoundname> + <innernamespace refid="namespaceoo_1_1define">oo::define</innernamespace> + <innernamespace refid="namespaceoo_1_1_helpers">oo::Helpers</innernamespace> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="[generated]" line="1" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/063/namespaceoo_1_1_helpers.xml b/testing/063/namespaceoo_1_1_helpers.xml new file mode 100644 index 0000000..ff309cf --- /dev/null +++ b/testing/063/namespaceoo_1_1_helpers.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespaceoo_1_1_helpers" kind="namespace"> + <compoundname>oo::Helpers</compoundname> + <sectiondef kind="func"> + <memberdef kind="function" id="namespaceoo_1_1_helpers_1a96c5b755588beb2e930cff23ce811d6c" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>oo::Helpers::classvar</definition> + <argsstring>args</argsstring> + <name>classvar</name> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>Extension to TclOO to add static variables. Defines variables on the class instead of on the object. Can be used to enforce a limited number of instantiations. </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="063_bug_729092.tcl" bodystart="34" bodyend="43"/> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="063_bug_729092.tcl" line="1" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/063/namespaceoo_1_1define.xml b/testing/063/namespaceoo_1_1define.xml new file mode 100644 index 0000000..aa62fbd --- /dev/null +++ b/testing/063/namespaceoo_1_1define.xml @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version=""> + <compounddef id="namespaceoo_1_1define" kind="namespace"> + <compoundname>oo::define</compoundname> + <sectiondef kind="func"> + <memberdef kind="function" id="namespaceoo_1_1define_1a89e7ea222a316f1926c1f9f30f2cc5c1" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual"> + <type/> + <definition>oo::define::classmethod</definition> + <argsstring>name?args??body?</argsstring> + <name>classmethod</name> + <briefdescription> + </briefdescription> + <detaileddescription> + <para>Extension to TclOO to add static methods. Defines the method on the class instead of on the object. Can be used for the creation of megawidgets using TclOO by overriding the unknown method to detect if the user is trying to instantiate a widget (because the method will be unknown and start with a dot). </para> + </detaileddescription> + <inbodydescription> + </inbodydescription> + <location file="063_bug_729092.tcl" bodystart="18" bodyend="27"/> + </memberdef> + </sectiondef> + <briefdescription> + </briefdescription> + <detaileddescription> + </detaileddescription> + <location file="063_bug_729092.tcl" line="1" column="1"/> + </compounddef> +</doxygen> diff --git a/testing/063_bug_729092.tcl b/testing/063_bug_729092.tcl new file mode 100644 index 0000000..a6d3341 --- /dev/null +++ b/testing/063_bug_729092.tcl @@ -0,0 +1,43 @@ +#// objective: test for bug 729092 - TCL: Full documentation not shown for procs in namespaces. +#// check: namespaceoo.xml +#// check: namespaceoo_1_1_helpers.xml +#// check: namespaceoo_1_1define.xml +#// config: EXTRACT_ALL = yes +#// config: GENERATE_HTML = yes + +# taken from +# https://bugzilla.gnome.org/show_bug.cgi?id=729092 + +## +# Extension to TclOO to add static methods. +# Defines the method on the class instead of on the object. Can be used for +# the creation of megawidgets using TclOO by overriding the unknown method to +# detect if the user is trying to instantiate a widget (because the method +# will be unknown and start with a dot). +# +proc ::oo::define::classmethod {name {args ""} {body ""}} { + # Create the method on the class if the caller gave arguments and body. + if {[llength [info level 0]] == 4} { + uplevel 1 [list self method $name $args $body] + } + # Get the name of the class being defined. + set cls [lindex [info level -1] 1] + # Make connection to private class "my" command by forwarding. + uplevel forward $name [info object namespace $cls]::my $name +} + +## +# Extension to TclOO to add static variables. +# Defines variables on the class instead of on the object. Can be used to +# enforce a limited number of instantiations. +# +proc ::oo::Helpers::classvar {args} { + # Get reference to class's namespace. + set nsCl [info object namespace [uplevel 1 {self class}]] + set nsObj [uplevel 1 {namespace current}] + # Link variables into local (caller's) scope. + foreach v $args { + uplevel "my variable $v" + upvar #0 ${nsCl}::$v ${nsObj}::$v + } +} diff --git a/testing/_057_caller_graphs.tcl b/testing/_057_caller_graphs.tcl new file mode 100644 index 0000000..24b9c20 --- /dev/null +++ b/testing/_057_caller_graphs.tcl @@ -0,0 +1,4 @@ +proc inFileB args { + array set info [info frame 0]; puts -nonewline ->$info(proc) + inFileA +} diff --git a/testing/runtests.pl b/testing/runtests.pl index bbbd1be..6b705aa 100755 --- a/testing/runtests.pl +++ b/testing/runtests.pl @@ -2,7 +2,7 @@ # perl script to execute doxygen's regression test suite. # -# Copyright (C) 1997-2013 by Dimitri van Heesch. +# Copyright (C) 1997-2014 by Dimitri van Heesch. # # Permission to use, copy, modify, and distribute this software and its # documentation under the terms of the GNU General Public License is hereby diff --git a/tmake/lib/macosx-c++/tmake.conf b/tmake/lib/macosx-c++/tmake.conf index 8aebf31..ade3437 100644 --- a/tmake/lib/macosx-c++/tmake.conf +++ b/tmake/lib/macosx-c++/tmake.conf @@ -17,7 +17,7 @@ TMAKE_CFLAGS_SHLIB = -fPIC TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses TMAKE_CXX = c++ -TMAKE_CXXFLAGS = $$TMAKE_CFLAGS -DYY_TYPEDEF_YY_SIZE_T -Dyy_size_t=int +TMAKE_CXXFLAGS = $$TMAKE_CFLAGS -mmacosx-version-min=10.5 -DYY_TYPEDEF_YY_SIZE_T -Dyy_size_t=int TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE diff --git a/tmake/lib/macosx-intel-c++/tmake.conf b/tmake/lib/macosx-intel-c++/tmake.conf index ddc024d..33af519 100644 --- a/tmake/lib/macosx-intel-c++/tmake.conf +++ b/tmake/lib/macosx-intel-c++/tmake.conf @@ -9,7 +9,7 @@ CONFIG = qt warn_on release TMAKE_CC = cc TMAKE_CFLAGS = -pipe -arch i386 -arch x86_64 -TMAKE_CFLAGS_WARN_ON = -Wall -W -Wno-deprecated-declarations -Wno-invalid-source-encoding +TMAKE_CFLAGS_WARN_ON = -Wall -W -Wno-deprecated-declarations TMAKE_CFLAGS_WARN_OFF = TMAKE_CFLAGS_RELEASE = -O2 TMAKE_CFLAGS_DEBUG = -g diff --git a/vhdlparser/CharStream.cc b/vhdlparser/CharStream.cc new file mode 100644 index 0000000..8cc17c3 --- /dev/null +++ b/vhdlparser/CharStream.cc @@ -0,0 +1,212 @@ +/* Generated By:JavaCC: Do not edit this line. CharStream.cc Version 6.0 */ +/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ +#include "CharStream.h" + +namespace { +template <class T> +void ArrayCopy(T* src, int src_offset, T* dest, int dest_offset, int len) { + for (int i = 0; i < len; i++) { + dest[dest_offset + i] = src[src_offset + i]; + } +} + +class StringReaderStream : public ReaderStream { + public: + StringReaderStream(const JAVACC_STRING_TYPE& str) : str_(str), cur_(0), max_(str.size()) {} + virtual size_t read(JAVACC_CHAR_TYPE *bufptr, int offset, size_t len) { + size_t count = str_.copy(bufptr + offset, len > max_ ? max_ : len, cur_); + cur_ += count; + max_ -= count; + return count; + } + virtual ~StringReaderStream() {} + virtual bool endOfInput() { + return max_ == 0; + } + + private: + const JAVACC_STRING_TYPE str_; + size_t cur_; + size_t max_; +}; +} + +namespace vhdl { +namespace parser { +void CharStream::ReInit(const JAVACC_STRING_TYPE& str, int startline, + int startcolumn, int buffersize) { + StringReaderStream *stream = new StringReaderStream(str); + ReInit(stream, startline, startcolumn, buffersize); + deleteStream = true; +} + +void CharStream::ReInit(ReaderStream *input_stream, int startline, + int startcolumn, int buffersize) { + if (deleteStream) { + delete inputStream; + } + + if (buffer != NULL) { + DeleteBuffers(); + } + + available = bufsize = buffersize; + buffer = new JAVACC_CHAR_TYPE[buffersize]; + bufline = new int[buffersize]; + bufcolumn = new int[buffersize]; + + column = startcolumn - 1; + inputStream = input_stream; + line = startline; + prevCharIsLF = prevCharIsCR = false; + tokenBegin = inBuf = maxNextCharInd = 0; + bufpos = -1; + deleteStream = false; +} + +void CharStream::DeleteBuffers() { + delete[] buffer; + delete[] bufline; + delete[] bufcolumn; +} + +void CharStream::adjustBeginLineColumn(int newLine, int newCol) { + int start = tokenBegin; + int len; + + if (bufpos >= tokenBegin) { + len = bufpos - tokenBegin + inBuf + 1; + } else { + len = bufsize - tokenBegin + bufpos + 1 + inBuf; + } + + int i = 0, j = 0, k = 0; + int nextColDiff = 0, columnDiff = 0; + + while (i < len && bufline[j = start % bufsize] == + bufline[k = (start + 1) % bufsize]) { + bufline[j] = newLine; + nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j]; + bufcolumn[j] = newCol + columnDiff; + columnDiff = nextColDiff; + i++; + start++; + } + + if (i < len) { + bufline[j] = newLine++; + bufcolumn[j] = newCol + columnDiff; + + while (i++ < len) { + if (bufline[j = start % bufsize] != bufline[(start + 1) % bufsize]) + bufline[j] = newLine++; + else + bufline[j] = newLine; + start++; + } + } + + line = bufline[j]; + column = bufcolumn[j]; +} + +void CharStream::ExpandBuff(bool wrapAround) { + JAVACC_CHAR_TYPE *newbuffer = new JAVACC_CHAR_TYPE[bufsize + 2048]; + int *newbufline = new int[bufsize + 2048]; + int *newbufcolumn = new int[bufsize + 2048]; + + if (wrapAround) { + ArrayCopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); + ArrayCopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos); + ArrayCopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); + ArrayCopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos); + ArrayCopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); + ArrayCopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos); + bufpos += (bufsize - tokenBegin); + } else { + ArrayCopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); + ArrayCopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); + ArrayCopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); + bufpos -= tokenBegin; + } + + maxNextCharInd = bufpos; + DeleteBuffers(); + buffer = newbuffer; + bufline = newbufline; + bufcolumn = newbufcolumn; + bufsize += 2048; + available = bufsize; + tokenBegin = 0; +} + +void CharStream::FillBuff() { + if (maxNextCharInd == available) { + if (available == bufsize) { + if (tokenBegin > 2048) { + bufpos = maxNextCharInd = 0; + available = tokenBegin; + } else if (tokenBegin < 0) { + bufpos = maxNextCharInd = 0; + } else { + ExpandBuff(false); + } + } else if (available > tokenBegin) { + available = bufsize; + } else if ((tokenBegin - available) < 2048) { + ExpandBuff(true); + } else { + available = tokenBegin; + } + } + + int i = inputStream->read(buffer, maxNextCharInd, available - maxNextCharInd); + if (i > 0) { + maxNextCharInd += i; + } else { + --bufpos; + backup(0); + if (tokenBegin == -1) { + tokenBegin = bufpos; + } + } +} + +void CharStream::UpdateLineColumn(JAVACC_CHAR_TYPE c) { + column++; + if (prevCharIsLF) { + prevCharIsLF = false; + column = 1; + line++; + } else if (prevCharIsCR) { + prevCharIsCR = false; + if (c == '\n') { + prevCharIsLF = true; + } else { + column = 1; + line++; + } + } + + switch (c) { + case '\r' : + prevCharIsCR = true; + break; + case '\n' : + prevCharIsLF = true; + break; + case '\t' : + column--; + column += (tabSize - (column % tabSize)); + break; + default : + break; + } + + bufline[bufpos] = line; + bufcolumn[bufpos] = column; +} + +} +} +/* JavaCC - OriginalChecksum=e709b9ee1adf0fcb6b1c5e1641f10348 (do not edit this line) */ diff --git a/vhdlparser/CharStream.h b/vhdlparser/CharStream.h new file mode 100644 index 0000000..b0e74b6 --- /dev/null +++ b/vhdlparser/CharStream.h @@ -0,0 +1,257 @@ +/* Generated By:JavaCC: Do not edit this line. CharStream.h Version 6.0 */ +/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ +#ifndef CHARSTREAM_H +#define CHARSTREAM_H +#include "JavaCC.h" + +#ifndef INITIAL_BUFFER_SIZE +#define INITIAL_BUFFER_SIZE 4096 +#endif + +namespace vhdl { +namespace parser { + +/** + * This class describes a character stream that maintains line and + * column number positions of the characters. It also has the capability + * to backup the stream to some extent. An implementation of this + * class is used in the TokenManager implementation generated by + * JavaCCParser. + * + * All the methods except backup can be implemented in any fashion. backup + * needs to be implemented correctly for the correct operation of the lexer. + * Rest of the methods are all used to get information like line number, + * column number and the string that constitutes a token and are not used + * by the lexer. Hence their implementation won't affect the generated lexer's + * operation. + */ + + +class CharStream { + public: + void setTabSize(int i) { tabSize = i; } + int getTabSize(int) { return tabSize; } + virtual int getColumn() { return trackLineColumn ? bufcolumn[bufpos] : -1; } + virtual int getLine() { return trackLineColumn ? bufline[bufpos] : -1; } + virtual int getEndColumn() { return trackLineColumn ? bufcolumn[bufpos] : -1; } + virtual int getEndLine() { return trackLineColumn ? bufline[bufpos] : -1; } + virtual int getBeginColumn() { return trackLineColumn ? bufcolumn[tokenBegin] : -1; } + virtual int getBeginLine() { return trackLineColumn ? bufline[tokenBegin] : -1; } + + virtual bool getTrackLineColumn() { return trackLineColumn; } + virtual void setTrackLineColumn(bool val) { trackLineColumn = val; } + +/** + * Backs up the input stream by amount steps. Lexer calls this method if it + * had already read some characters, but could not use them to match a + * (longer) token. So, they will be used again as the prefix of the next + * token and it is the implemetation's responsibility to do this right. + */ +virtual inline void backup(int amount) { + inBuf += amount; + bufpos -= amount; + if (bufpos < 0) { + bufpos += bufsize; + } +} + +/** + * Returns the next character that marks the beginning of the next token. + * All characters must remain in the buffer between two successive calls + * to this method to implement backup correctly. + */ +virtual inline JAVACC_CHAR_TYPE BeginToken() { + tokenBegin = -1; + JAVACC_CHAR_TYPE c = readChar(); + tokenBegin = bufpos; + return c; +} + + +/** + * Returns the next character from the selected input. The method + * of selecting the input is the responsibility of the class + * implementing this class. + */ +virtual inline JAVACC_CHAR_TYPE readChar() { + if (inBuf > 0) { + --inBuf; + ++bufpos; + if (bufpos == bufsize) { + bufpos = 0; + } + + return buffer[bufpos]; + } + + ++bufpos; + if (bufpos >= maxNextCharInd) { + FillBuff(); + } + + JAVACC_CHAR_TYPE c = buffer[bufpos]; + + if (trackLineColumn) { + UpdateLineColumn(c); + } + + return c; +} + + + virtual void ExpandBuff(bool wrapAround); + virtual void FillBuff(); + + /** + * Returns a string made up of characters from the marked token beginning + * to the current buffer position. Implementations can return + * anything that they want to. For example, for efficiency, one might decide + * to just return NULL, which is a valid implementation. + */ + virtual JAVACC_STRING_TYPE GetImage() { + if (bufpos >= tokenBegin) + return JAVACC_STRING_TYPE(buffer + tokenBegin, bufpos - tokenBegin + 1); + else + return JAVACC_STRING_TYPE(buffer + tokenBegin, bufsize - tokenBegin) + .append(buffer, bufpos + 1); + } + + /** + * Returns an array of characters that make up the suffix of length 'len' for + * the currently matched token. This is used to build up the matched string + * for use in actions in the case of MORE. A simple and inefficient + * implementation of this is as follows : + */ + virtual JAVACC_STRING_TYPE GetSuffix(int len) { + if ((bufpos + 1) >= len) { + return JAVACC_STRING_TYPE(buffer + bufpos - len + 1, len); + } + return JAVACC_STRING_TYPE(buffer + bufsize - (len - bufpos - 1), len - bufpos - 1) + .append(buffer, bufpos + 1); + } + + /** + * The lexer calls this function to indicate that it is done with the stream + * and hence implementations can free any resources held by this class. + */ + virtual void DeleteBuffers(); + + virtual ~CharStream() { + if (deleteStream) { + delete inputStream; + } + DeleteBuffers(); + } + + bool endOfInput() { + return inBuf == 0 && bufpos + 1 >= maxNextCharInd && + inputStream->endOfInput(); + } + + CharStream(const JAVACC_CHAR_TYPE *buf, int sz, int startline, + int startcolumn, int buffersize) : + bufline(NULL), bufcolumn(NULL), inputStream(NULL), deleteStream(false), + buffer(NULL), bufpos(0), bufsize(0), tokenBegin(0), column(0), line(0), + prevCharIsCR (false), prevCharIsLF (false), available(0), maxNextCharInd(0), + inBuf(0),tabSize(8), trackLineColumn(true) { + ReInit(JAVACC_STRING_TYPE(buf, sz), startline, startcolumn, buffersize); + } + + CharStream(const JAVACC_CHAR_TYPE *buf, int sz, int startline, int startcolumn) : + bufline(NULL), bufcolumn(NULL), inputStream(NULL), deleteStream(false), + buffer(NULL), bufpos(0), bufsize(0), tokenBegin(0), column(0), line(0), + prevCharIsCR (false), prevCharIsLF (false), available(0), maxNextCharInd(0), + inBuf(0),tabSize(8), trackLineColumn(true) { + ReInit(JAVACC_STRING_TYPE(buf, sz), startline, startcolumn, INITIAL_BUFFER_SIZE); + } + + CharStream(const JAVACC_STRING_TYPE& str, int startline, + int startcolumn, int buffersize) : + bufline(NULL), bufcolumn(NULL), inputStream(NULL), deleteStream(false), + buffer(NULL), bufpos(0), bufsize(0), tokenBegin(0), column(0), line(0), + prevCharIsCR (false), prevCharIsLF (false), available(0), maxNextCharInd(0), + inBuf(0),tabSize(8), trackLineColumn(true) { + ReInit(str, startline, startcolumn, buffersize); + } + + CharStream(const JAVACC_STRING_TYPE& str, int startline, int startcolumn) : + bufline(NULL), bufcolumn(NULL), inputStream(NULL), deleteStream(false), + buffer(NULL), bufpos(0), bufsize(0), tokenBegin(0), column(0), line(0), + prevCharIsCR (false), prevCharIsLF (false), available(0), maxNextCharInd(0), + inBuf(0) ,tabSize(8), trackLineColumn(true){ + ReInit(str, startline, startcolumn, INITIAL_BUFFER_SIZE); + } + + CharStream(ReaderStream *input_stream, int startline, + int startcolumn, int) : + bufline(NULL), bufcolumn(NULL), inputStream(NULL), deleteStream(false), + buffer(NULL), bufpos(0), bufsize(0), tokenBegin(0), column(0), line(0), + prevCharIsCR (false), prevCharIsLF (false), available(0), maxNextCharInd(0), + inBuf(0),tabSize(8), trackLineColumn(true) { + ReInit(input_stream, startline, startcolumn, INITIAL_BUFFER_SIZE); + } + + CharStream(ReaderStream *input_stream, int startline, int startcolumn) : + bufline(NULL), bufcolumn(NULL), inputStream(NULL), deleteStream(false), + buffer(NULL), bufpos(0), bufsize(0), tokenBegin(0), column(0), line(0), + prevCharIsCR (false), prevCharIsLF (false), available(0), maxNextCharInd(0), + inBuf(0),tabSize(8), trackLineColumn(true) { + ReInit(input_stream, startline, startcolumn, INITIAL_BUFFER_SIZE); + } + + CharStream(ReaderStream *input_stream) : + bufline(NULL), bufcolumn(NULL), inputStream(NULL), deleteStream(false), + buffer(NULL), bufpos(0), bufsize(0), tokenBegin(0), column(0), line(0), + prevCharIsCR (false), prevCharIsLF (false), available(0), maxNextCharInd(0), + inBuf(0),tabSize(8), trackLineColumn(true) { + ReInit(input_stream, 1, 1, INITIAL_BUFFER_SIZE); + } + + virtual void ReInit(ReaderStream *input_stream, int startline, int startcolumn, + int buffersize); + + virtual void ReInit(ReaderStream *input_stream, int startline, + int startcolumn) { + ReInit(input_stream, startline, startcolumn, INITIAL_BUFFER_SIZE); + } + + virtual void ReInit(ReaderStream *input_stream) { + ReInit(input_stream, 1, 1, INITIAL_BUFFER_SIZE); + } + + virtual void ReInit(const JAVACC_STRING_TYPE& str, int startline, + int startcolumn, int buffersize); + + virtual void ReInit(const JAVACC_STRING_TYPE& str, int startline, + int startcolumn) { + ReInit(str, startline, startcolumn, INITIAL_BUFFER_SIZE); + } + + virtual void adjustBeginLineColumn(int newLine, int newCol); + + protected: + virtual void UpdateLineColumn(JAVACC_CHAR_TYPE c); + + int *bufline; + int *bufcolumn; + ReaderStream *inputStream; + bool deleteStream; + JAVACC_CHAR_TYPE * buffer; + int bufpos; + int bufsize; + int tokenBegin; + int column; + int line; + bool prevCharIsCR ; + bool prevCharIsLF ; + int available; + int maxNextCharInd; + int inBuf ; + int tabSize ; + bool trackLineColumn; +}; + +} +} +#endif +/* JavaCC - OriginalChecksum=5eaf75ef6a2c7859369c80cf6fd037e0 (do not edit this line) */ diff --git a/vhdlparser/ErrorHandler.h b/vhdlparser/ErrorHandler.h new file mode 100644 index 0000000..fba0a0e --- /dev/null +++ b/vhdlparser/ErrorHandler.h @@ -0,0 +1,78 @@ +/* Generated By:JavaCC: Do not edit this line. ErrorHandler.h Version 6.0 */ +/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true,BUILD_PARSER=true,BUILD_TOKEN_MANAGER=true */ +#ifndef ERRORHANDLER_H +#define ERRORHANDLER_H +//#include <string> +#include "JavaCC.h" +#include "Token.h" + +namespace vhdl { +namespace parser { + +//JAVACC_SIMPLE_STRING addUnicodeEscapes(JAVACC_STRING_TYPE str); + + class VhdlParser; + class ErrorHandler { + friend class VhdlParserTokenManager; + friend class VhdlParser; + protected: + int error_count; + public: + // Called when the parser encounters a different token when expecting to + // consume a specific kind of token. + // expectedKind - token kind that the parser was trying to consume. + // expectedToken - the image of the token - tokenImages[expectedKind]. + // actual - the actual token that the parser got instead. + virtual void handleUnexpectedToken(int , JAVACC_STRING_TYPE , Token *, VhdlParser *) { + error_count++; + // fprintf(stderr, "Expecting %s at: %d:%d but got %s\n", addUnicodeEscapes(expectedToken).c_str(), actual->beginLine, actual->beginColumn, addUnicodeEscapes(actual->image).c_str()); + } + // Called when the parser cannot continue parsing. + // last - the last token successfully parsed. + // unexpected - the token at which the error occurs. + // production - the production in which this error occurrs. + virtual void handleParseError(Token *, Token *, JAVACC_SIMPLE_STRING , VhdlParser *) { + error_count++; + // fprintf(stderr, "Encountered: %s at: %d:%d while parsing: %s\n", addUnicodeEscapes(unexpected->image).c_str(), unexpected->beginLine, unexpected->beginColumn, production.c_str()); + } + virtual int getErrorCount() { + return error_count; + } + virtual void handleOtherError(JAVACC_STRING_TYPE message, VhdlParser *) { + fprintf(stderr, "Error: %s\n", (char*)message.c_str()); + } + virtual ~ErrorHandler() {} + ErrorHandler() { error_count = 0; } + }; + + class VhdlParserTokenManager; + class TokenManagerErrorHandler { + friend class VhdlParserTokenManager; + protected: + int error_count; + public: + // Returns a detailed message for the Error when it is thrown by the + // token manager to indicate a lexical error. + // Parameters : + // EOFSeen : indicates if EOF caused the lexical error + // curLexState : lexical state in which this error occurred + // errorLine : line number when the error occurred + // errorColumn : column number when the error occurred + // errorAfter : prefix that was seen before this error occurred + // curchar : the offending character + // + virtual void lexicalError(bool EOFSeen, int /*lexState*/, int errorLine, int errorColumn, JAVACC_STRING_TYPE errorAfter, JAVACC_CHAR_TYPE curChar, VhdlParserTokenManager*) { + // by default, we just print an error message and return. + fprintf(stderr, "Lexical error at: %d:%d. Encountered: %c after: %s.\n", errorLine, errorColumn, curChar, (EOFSeen? "EOF" : (const char*)errorAfter.c_str())); + } + virtual void lexicalError(JAVACC_STRING_TYPE errorMessage, VhdlParserTokenManager* ) { + fprintf(stderr, "%s\n", (char*)errorMessage.c_str()); + } + virtual ~TokenManagerErrorHandler() {} + }; + +} +} + +#endif +/* JavaCC - OriginalChecksum=685d19cb4cd943b60089f599e45f23ad (do not edit this line) */ diff --git a/vhdlparser/JavaCC.h b/vhdlparser/JavaCC.h new file mode 100644 index 0000000..b97c20d --- /dev/null +++ b/vhdlparser/JavaCC.h @@ -0,0 +1,52 @@ +/* Generated By:JavaCC: Do not edit this line. JavaCC.h Version 6.0 */ +/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ +#ifndef __JAVACC_H +#define __JAVACC_H +#include <stdio.h> +#include <string.h> +#include <memory.h> +#include <assert.h> +#include <cstring> + +#include "vhdlstring.h" + +#ifndef JAVACC_CHAR_TYPE +#define JAVACC_CHAR_TYPE char +#endif + +#ifndef JAVACC_STRING_TYPE +#define JAVACC_STRING_TYPE VhdlString +#endif + +#define finally // TODO(Sreeni): Get rid of when we fix jjtree + +#define JAVACC_SIMPLE_STRING VhdlString + +JAVACC_SIMPLE_STRING addUnicodeEscapes(JAVACC_STRING_TYPE str); + + +typedef JAVACC_STRING_TYPE StringBuffer; +typedef JAVACC_STRING_TYPE String; + +// Abstraction on stream classes to read a block of data into a buffer. +class ReaderStream { + public: + // Read block of data into a buffer and return the actual number read. + virtual size_t read(JAVACC_CHAR_TYPE *, int, size_t) { + return 0; + } + virtual bool endOfInput() { return true; } + virtual ~ReaderStream() {} +}; + +const JAVACC_CHAR_TYPE EMPTY[] = { 0 }; + +#ifndef MAX +#define MAX(a,b) ((a)>(b)?(a):(b)) +#endif +#ifndef MIN +#define MIN(a,b) ((a)<(b)?(a):(b)) +#endif + +#endif +/* JavaCC - OriginalChecksum=775c677272b259e2a33aac80851ba9f1 (do not edit this line) */ diff --git a/vhdlparser/JavaCC.h.in b/vhdlparser/JavaCC.h.in new file mode 100644 index 0000000..b97c20d --- /dev/null +++ b/vhdlparser/JavaCC.h.in @@ -0,0 +1,52 @@ +/* Generated By:JavaCC: Do not edit this line. JavaCC.h Version 6.0 */ +/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ +#ifndef __JAVACC_H +#define __JAVACC_H +#include <stdio.h> +#include <string.h> +#include <memory.h> +#include <assert.h> +#include <cstring> + +#include "vhdlstring.h" + +#ifndef JAVACC_CHAR_TYPE +#define JAVACC_CHAR_TYPE char +#endif + +#ifndef JAVACC_STRING_TYPE +#define JAVACC_STRING_TYPE VhdlString +#endif + +#define finally // TODO(Sreeni): Get rid of when we fix jjtree + +#define JAVACC_SIMPLE_STRING VhdlString + +JAVACC_SIMPLE_STRING addUnicodeEscapes(JAVACC_STRING_TYPE str); + + +typedef JAVACC_STRING_TYPE StringBuffer; +typedef JAVACC_STRING_TYPE String; + +// Abstraction on stream classes to read a block of data into a buffer. +class ReaderStream { + public: + // Read block of data into a buffer and return the actual number read. + virtual size_t read(JAVACC_CHAR_TYPE *, int, size_t) { + return 0; + } + virtual bool endOfInput() { return true; } + virtual ~ReaderStream() {} +}; + +const JAVACC_CHAR_TYPE EMPTY[] = { 0 }; + +#ifndef MAX +#define MAX(a,b) ((a)>(b)?(a):(b)) +#endif +#ifndef MIN +#define MIN(a,b) ((a)<(b)?(a):(b)) +#endif + +#endif +/* JavaCC - OriginalChecksum=775c677272b259e2a33aac80851ba9f1 (do not edit this line) */ diff --git a/vhdlparser/Makefile.in b/vhdlparser/Makefile.in new file mode 100644 index 0000000..2838700 --- /dev/null +++ b/vhdlparser/Makefile.in @@ -0,0 +1,40 @@ +# +# +# +# Copyright (C) 1997-2000 by Dimitri van Heesch. +# +# Permission to use, copy, modify, and distribute this software and its +# documentation under the terms of the GNU General Public License is hereby +# granted. No representations are made about the suitability of this software +# for any purpose. It is provided "as is" without express or implied warranty. +# See the GNU General Public License for more details. +# +# Documents produced by Doxygen are derivative works derived from the +# input used in their production; they are not affected by this license. +# + +all: Makefile.vhdlparser Makefile + $(MAKE) -f Makefile.vhdlparser $@ + +Makefile.vhdlparser: vhdlparser.pro + $(ENV) $(PERL) "$(TMAKE)" vhdlparser.pro >Makefile.vhdlparser + +tmake: + $(ENV) $(PERL) "$(TMAKE)" vhdlparser.pro >Makefile.vhdlparser + +clean: Makefile.vhdlparser + $(MAKE) -f Makefile.vhdlparser clean + +regenerate: + $(RM) CharStream.cc CharStream.h ErrorHandler.h ParseException.cc ParseException.h \ + Token.cc Token.h TokenManager.h TokenMgrError.cc TokenMgrError.h VhdlParser.cc VhdlParser.h \ + VhdlParserConstants.h VhdlParserTokenManager.cc VhdlParserTokenManager.h \ + JavaCC.h + javacc vhdlparser.jj + patch <vhdlparser.patch + $(CP) JavaCC.h.in JavaCC.h + +distclean: clean + $(RM) Makefile vhdlparser.pro + +FORCE: diff --git a/vhdlparser/ParseException.cc b/vhdlparser/ParseException.cc new file mode 100644 index 0000000..31ee7a3 --- /dev/null +++ b/vhdlparser/ParseException.cc @@ -0,0 +1,186 @@ +/* Generated By:JavaCC: Do not edit this line. ParseException.cc Version 6.0 */ +/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ +#include "ParseException.h" + + +namespace vhdl { +namespace parser { +/** + * This exception is thrown when parse errors are encountered. + * You can explicitly create objects of this exception type by + * calling the method generate_ParseException in the generated + * parser. + * + * You can modify this class to customize your error reporting + * mechanisms so long as you retain the fields. + */ + + /** + * This constructor is used by the method "generate_ParseException" + * in the generated parser. Calling this constructor generates + * a new object of this type with the fields "currentToken", + * "expectedTokenSequences", and "tokenImage" set. + */ + ParseException::ParseException(Token currentTokenVal, + int** expectedTokenSequencesVal, + JAVACC_STRING_TYPE* tokenImageVal + ) + { + initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal); + currentToken = currentTokenVal; + expectedTokenSequences = expectedTokenSequencesVal; + tokenImage = tokenImageVal; + } + + /** + * The following constructors are for use by you for whatever + * purpose you can think of. Constructing the exception in this + * manner makes the exception behave in the normal way - i.e., as + * documented in the class "Throwable". The fields "errorToken", + * "expectedTokenSequences", and "tokenImage" do not contain + * relevant information. The JavaCC generated code does not use + * these constructors. + */ + + ParseException::ParseException() { + } + + /** Constructor with message. */ + ParseException::ParseException(JAVACC_STRING_TYPE message) { + } + + + /** + * This is the last token that has been consumed successfully. If + * this object has been created due to a parse error, the token + * followng this token will (therefore) be the first error token. + */ + Token currentToken; + + /** + * Each entry in this array is an array of integers. Each array + * of integers represents a sequence of tokens (by their ordinal + * values) that is expected at this point of the parse. + */ + int** expectedTokenSequences; + + /** + * This is a reference to the "tokenImage" array of the generated + * parser within which the parse error occurred. This array is + * defined in the generated ...Constants class. + */ + JAVACC_STRING_TYPE* tokenImage; + + /** + * It uses "currentToken" and "expectedTokenSequences" to generate a parse + * error message and returns it. If this object has been created + * due to a parse error, and you do not catch it (it gets thrown + * from the parser) the correct error message + * gets displayed. + */ + JAVACC_STRING_TYPE ParseException::initialise(Token currentToken, + int** expectedTokenSequences, + JAVACC_STRING_TYPE* tokenImage) { +#if 0 + //JAVACC_STRING_TYPE eol = System.getProperty("line.separator", "\n"); + expected = new JAVACC_STRING_TYPE(); + int maxSize = 0; + for (int i = 0; i < expectedTokenSequences.length; i++) { + if (maxSize < expectedTokenSequences[i].length) { + maxSize = expectedTokenSequences[i].length; + } + for (int j = 0; j < expectedTokenSequences[i].length; j++) { + expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' '); + } + if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { + expected.append((JAVACC_CHAR_TYPE*)"..."); + } + expected.append(eol).append(" "); + } + JAVACC_STRING_TYPE retval = (JAVACC_CHAR_TYPE*)"Encountered \""; + Token tok = currentToken.next; + for (int i = 0; i < maxSize; i++) { + if (i != 0) retval += (JAVACC_CHAR_TYPE*)" "; + if (tok.kind == 0) { + retval += tokenImage[0]; + break; + } + retval += (JAVACC_CHAR_TYPE*)" " + tokenImage[tok.kind]; + retval += (JAVACC_CHAR_TYPE*)" \""; + retval += add_escapes(tok.image); + retval += (JAVACC_CHAR_TYPE*)" \""; + tok = tok.next; + } + retval += (JAVACC_CHAR_TYPE*)"\" at line " + currentToken.next.beginLine + (JAVACC_CHAR_TYPE*)", column " + currentToken.next.beginColumn; + retval += (JAVACC_CHAR_TYPE*)"." + eol; + if (expectedTokenSequences.length == 1) { + retval += (JAVACC_CHAR_TYPE*)"Was expecting:" + eol + (JAVACC_CHAR_TYPE*)" "; + } else { + retval += (JAVACC_CHAR_TYPE*)"Was expecting one of:" + eol + (JAVACC_CHAR_TYPE*)" "; + } + retval += expected.toString(); + return retval; +#endif + return (JAVACC_CHAR_TYPE*)"Parse exception"; + } + + /** + * The end of line JAVACC_STRING_TYPE for this machine. + */ +#define eol "\n" + + /** + * Used to convert raw characters to their escaped version + * when these raw version cannot be used as part of an ASCII + * string literal. + */ + JAVACC_STRING_TYPE ParseException::add_escapes(JAVACC_STRING_TYPE str) { +/* + JAVACC_STRING_TYPE *retval = new JAVACC_STRING_TYPE(); + JAVACC_CHAR_TYPE ch; + for (int i = 0; i < str.length(); i++) { + switch (str.charAt(i)) + { + case 0 : + continue; + case '\b': + retval.append("\\b"); + continue; + case '\t': + retval.append("\\t"); + continue; + case '\n': + retval.append("\\n"); + continue; + case '\f': + retval.append("\\f"); + continue; + case '\r': + retval.append("\\r"); + continue; + case '\"': + retval.append("\\\""); + continue; + case '\'': + retval.append("\\\'"); + continue; + case '\\': + retval.append("\\\\"); + continue; + default: + if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { + JAVACC_STRING_TYPE s = "0000" + Integer.toString(ch, 16); + retval.append("\\u" + s.substring(s.length() - 4, s.length())); + } else { + retval.append(ch); + } + continue; + } + } + return retval.toString(); +*/ return str; + } + +} +} +/* JavaCC - OriginalChecksum=99d488e13335cf377284c90700f070ed (do not edit this line) */ diff --git a/vhdlparser/ParseException.h b/vhdlparser/ParseException.h new file mode 100644 index 0000000..1f3a3dc --- /dev/null +++ b/vhdlparser/ParseException.h @@ -0,0 +1,99 @@ +/* Generated By:JavaCC: Do not edit this line. ParseException.h Version 6.0 */ +/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ +#ifndef _PARSE_EXCEPTION_H +#define _PARSE_EXCEPTION_H +#include "JavaCC.h" +#include "Token.h" + + +namespace vhdl { +namespace parser { +/** + * This exception is thrown when parse errors are encountered. + * You can explicitly create objects of this exception type by + * calling the method generateParseException in the generated + * parser. + * + * You can modify this class to customize your error reporting + * mechanisms so long as you retain the fields. + */ +class ParseException { + public: + + /** + * This constructor is used by the method "generateParseException" + * in the generated parser. Calling this constructor generates + * a new object of this type with the fields "currentToken", + * "expectedTokenSequences", and "tokenImage" set. + */ + ParseException(Token currentTokenVal, + int** expectedTokenSequencesVal, + JAVACC_STRING_TYPE* tokenImageVal + ); + + /** + * The following constructors are for use by you for whatever + * purpose you can think of. Constructing the exception in this + * manner makes the exception behave in the normal way - i.e., as + * documented in the class "Throwable". The fields "errorToken", + * "expectedTokenSequences", and "tokenImage" do not contain + * relevant information. The JavaCC generated code does not use + * these constructors. + */ + + ParseException(); + + /** Constructor with message. */ + ParseException(JAVACC_STRING_TYPE message); + + + /** + * This is the last token that has been consumed successfully. If + * this object has been created due to a parse error, the token + * followng this token will (therefore) be the first error token. + */ + Token currentToken; + + /** + * Each entry in this array is an array of integers. Each array + * of integers represents a sequence of tokens (by their ordinal + * values) that is expected at this point of the parse. + */ + int** expectedTokenSequences; + + /** + * This is a reference to the "tokenImage" array of the generated + * parser within which the parse error occurred. This array is + * defined in the generated ...Constants class. + */ + JAVACC_STRING_TYPE* tokenImage; + + /** + * It uses "currentToken" and "expectedTokenSequences" to generate a parse + * error message and returns it. If this object has been created + * due to a parse error, and you do not catch it (it gets thrown + * from the parser) the correct error message + * gets displayed. + */ + private: JAVACC_STRING_TYPE initialise(Token currentToken, + int** expectedTokenSequences, + JAVACC_STRING_TYPE* tokenImage); + + /** + * The end of line string for this machine. + */ +#define eol "\n" + + /** + * Used to convert raw characters to their escaped version + * when these raw version cannot be used as part of an ASCII + * string literal. + */ + JAVACC_STRING_TYPE add_escapes(JAVACC_STRING_TYPE str); + +}; + +} +} +#endif +/* JavaCC - OriginalChecksum=8c47c56fc2030f05b43e20cae6ca5d66 (do not edit this line) */ diff --git a/vhdlparser/Token.cc b/vhdlparser/Token.cc new file mode 100644 index 0000000..62a8169 --- /dev/null +++ b/vhdlparser/Token.cc @@ -0,0 +1,92 @@ +/* Generated By:JavaCC: Do not edit this line. Token.cc Version 6.0 */ +/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true,TOKEN_INCLUDES=,TOKEN_EXTENDS= */ +#include "Token.h" + +namespace vhdl { +namespace parser { + +/** + * Describes the input token stream. + */ + + /** + * An optional attribute value of the Token. + * Tokens which are not used as syntactic sugar will often contain + * meaningful values that will be used later on by the compiler or + * interpreter. This attribute value is often different from the image. + * Any subclass of Token that actually wants to return a non-NULL value can + * override this method as appropriate. + */ + void * Token::getValue() { + return NULL; + } + + /** + * No-argument constructor + */ + Token::Token() { + this->next = NULL; + this->specialToken = NULL; + } + + /** + * Constructs a new token for the specified Image. + */ + Token::Token(int kind) + { + this->kind = kind; + this->next = NULL; + this->specialToken = NULL; + } + + /** + * Constructs a new token for the specified Image and Kind. + */ + Token::Token(int kind, JAVACC_STRING_TYPE image) + { + this->kind = kind; + this->image = image; + this->next = NULL; + this->specialToken = NULL; + } + + /** + * Returns the image. + */ + JAVACC_STRING_TYPE Token::toString() + { + return image; + } + + /** + * Returns a new Token object, by default. However, if you want, you + * can create and return subclass objects based on the value of ofKind. + * Simply add the cases to the switch for all those special cases. + * For example, if you have a subclass of Token called IDToken that + * you want to create if ofKind is ID, simply add something like : + * + * case MyParserConstants.ID : return new IDToken(ofKind, image); + * + * to the following switch statement. Then you can cast matchedToken + * variable to the appropriate type and use sit in your lexical actions. + */ + Token *Token::newToken(int ofKind, JAVACC_STRING_TYPE image) + { + switch(ofKind) + { + default : return new Token(ofKind, image); + } + } + + Token *Token::newToken(int ofKind) + { + return newToken(ofKind, JAVACC_STRING_TYPE((JAVACC_CHAR_TYPE*)"")); + } + + Token::~Token() { + if (specialToken) delete specialToken; + } + +} +} +/* JavaCC - OriginalChecksum=9db9ca693072c4c37bb7cc933c0c5e35 (do not edit this line) */ diff --git a/vhdlparser/Token.h b/vhdlparser/Token.h new file mode 100644 index 0000000..5fce69f --- /dev/null +++ b/vhdlparser/Token.h @@ -0,0 +1,116 @@ +/* Generated By:JavaCC: Do not edit this line. Token.h Version 6.0 */ +/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true,TOKEN_INCLUDES=,TOKEN_EXTENDS= */ +#ifndef TOKEN_H +#define TOKEN_H +#include "JavaCC.h" + + +namespace vhdl { +namespace parser { + +/** + * Describes the input token stream. + */ + +class Token +{ + public: + + /** + * An integer that describes the kind of this token. This numbering + * system is determined by JavaCCParser, and a table of these numbers is + * stored in the file ...Constants.java. + */ + int kind; + + /** The line number of the first character of this Token. */ + int beginLine; + /** The column number of the first character of this Token. */ + int beginColumn; + /** The line number of the last character of this Token. */ + int endLine; + /** The column number of the last character of this Token. */ + int endColumn; + + /** + * The string image of the token. + */ + JAVACC_STRING_TYPE image; + + /** + * A reference to the next regular (non-special) token from the input + * stream. If this is the last token from the input stream, or if the + * token manager has not read tokens beyond this one, this field is + * set to NULL. This is true only if this token is also a regular + * token. Otherwise, see below for a description of the contents of + * this field. + */ + Token *next; + + /** + * This field is used to access special tokens that occur prior to this + * token, but after the immediately preceding regular (non-special) token. + * If there are no such special tokens, this field is set to NULL. + * When there are more than one such special token, this field refers + * to the last of these special tokens, which in turn refers to the next + * previous special token through its specialToken field, and so on + * until the first special token (whose specialToke_ field is NULL). + * The next fields of special tokens refer to other special tokens that + * immediately follow it (without an intervening regular token). If there + * is no such token, this field is NULL. + */ + Token *specialToken; + + /** + * An optional attribute value of the Token. + * Tokens which are not used as syntactic sugar will often contain + * meaningful values that will be used later on by the compiler or + * interpreter. This attribute value is often different from the image. + * Any subclass of Token that actually wants to return a non-NULL value can + * override this method as appropriate. + */ + void * getValue(); + + /** + * No-argument constructor + */ + Token(); + + /** + * Constructs a new token for the specified Image. + */ + Token(int kind); + + /** + * Constructs a new token for the specified Image and Kind. + */ + Token(int kind, JAVACC_STRING_TYPE image); + + /** + * Returns the image. + */ + JAVACC_STRING_TYPE toString(); + + public: virtual ~Token(); + + /** + * Returns a new Token void *, by default. However, if you want, you + * can create and return subclass objects based on the value of ofKind. + * Simply add the cases to the switch for all those special cases. + * For example, if you have a subclass of Token called IDToken that + * you want to create if ofKind is ID, simply add something like : + * + * case MyParserConstants.ID : return new IDToken(ofKind, image); + * + * to the following switch statement. Then you can cast matchedToken + * variable to the appropriate type and use sit in your lexical actions. + */ + static Token *newToken(int ofKind, JAVACC_STRING_TYPE image); + + static Token *newToken(int ofKind); +}; + +} +} +#endif +/* JavaCC - OriginalChecksum=2f5eb1c937adc983dfa2008c4fe383a7 (do not edit this line) */ diff --git a/vhdlparser/TokenManager.h b/vhdlparser/TokenManager.h new file mode 100644 index 0000000..efffce6 --- /dev/null +++ b/vhdlparser/TokenManager.h @@ -0,0 +1,33 @@ +/* Generated By:JavaCC: Do not edit this line. TokenManager.h Version 6.0 */ +/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ +#ifndef TOKENMANAGER_H +#define TOKENMANAGER_H +#include "JavaCC.h" +#include "Token.h" + + +namespace vhdl { +namespace parser { +/** + * An implementation for this interface is generated by + * JavaCCParser. The user is free to use any implementation + * of their choice. + */ + +class TokenManager { +public: + /** This gets the next token from the input stream. + * A token of kind 0 (<EOF>) should be returned on EOF. + */ + public: virtual Token *getNextToken() = 0; + public: virtual ~TokenManager() { } + public: virtual void lexicalError() { + fprintf(stderr, "Lexical error encountered\n"); + } + +}; + +} +} +#endif +/* JavaCC - OriginalChecksum=d4725ee75465725057819b3b07fadaa7 (do not edit this line) */ diff --git a/vhdlparser/TokenMgrError.cc b/vhdlparser/TokenMgrError.cc new file mode 100644 index 0000000..9093e6e --- /dev/null +++ b/vhdlparser/TokenMgrError.cc @@ -0,0 +1,121 @@ +/* Generated By:JavaCC: Do not edit this line. TokenMgrError.cc Version 6.0 */ +/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ +#include "TokenMgrError.h" + +namespace vhdl { +namespace parser { + + /** + * Returns a detailed message for the Error when it is thrown by the + * token manager to indicate a lexical error. + * Parameters : + * EOFSeen : indicates if EOF caused the lexical error + * curLexState : lexical state in which this error occurred + * errorLine : line number when the error occurred + * errorColumn : column number when the error occurred + * errorAfter : prefix that was seen before this error occurred + * curJAVACC_CHAR_TYPE : the offending character + * Note: You can customize the lexical error message by modifying this method. + */ + JAVACC_STRING_TYPE TokenMgrError::LexicalError(bool EOFSeen, int lexState, int errorLine, int errorColumn, JAVACC_STRING_TYPE errorAfter, JAVACC_CHAR_TYPE curChar) { +#if 0 + JAVACC_STRING_TYPE s; + stringstream<JAVACC_STRING_TYPE> ss; + ss << "Lexical error at line " << errorLine << " column " << errorColumn + << ". Encountered: " << curChar << "(" << (int)curChar + << ") after : \"" << errorAfter.c_str() << "\""; + return (JAVACC_STRING_TYPE)ss.rdbuf()->str(); +#endif + return EMPTY; + } + + /** + * You can also modify the body of this method to customize your error messages. + * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not + * of end-users concern, so you can return something like : + * + * "Internal Error : Please file a bug report .... " + * + * from this method for such cases in the release version of your parser. + */ + JAVACC_STRING_TYPE TokenMgrError::getMessage() { + return message; + } + + /* + * Constructors of various flavors follow. + */ + + /** No arg constructor. */ + TokenMgrError::TokenMgrError() { + } + + /** Constructor with message and reason. */ + TokenMgrError::TokenMgrError(JAVACC_STRING_TYPE message, int reason) { + errorCode = reason; + } + + /** Full Constructor. */ + TokenMgrError::TokenMgrError(bool EOFSeen, int lexState, int errorLine, int errorColumn, JAVACC_STRING_TYPE errorAfter, JAVACC_CHAR_TYPE curChar, int reason) { + message = LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar); + errorCode = reason; + } + +// i < 16 - guaranteed +char hexChar(int i) { + if (i < 10) { + return i - '0'; + } + return 'a' + (i - 10); +} + +/** + * Replaces unprintable characters by their escaped (or unicode escaped) + * equivalents in the given string + */ +JAVACC_SIMPLE_STRING addUnicodeEscapes(JAVACC_STRING_TYPE str) { + JAVACC_SIMPLE_STRING retval; + for (size_t i = 0; i < str.size(); i++) { + JAVACC_CHAR_TYPE ch = str[i]; + switch (ch) + { + case 0 : + retval += EMPTY[0]; + continue; + case '\b': + retval.append("\\b"); + continue; + case '\t': + retval.append("\\t"); + continue; + case '\n': + retval.append("\\n"); + continue; + case '\f': + retval.append("\\f"); + continue; + case '\r': + retval.append("\\r"); + continue; + case '\\': + retval.append("\\\\"); + continue; + default: + if (ch < 0xff) { + retval += ch; + continue; + } + retval.append("\\u"); + retval += (hexChar(ch >> 12)); + retval += (hexChar((ch & 0x0f00) >> 8)); + retval += (hexChar((ch & 0x00f0) >> 4)); + retval += (hexChar(ch & 0x000f)); + continue; + } + } + return retval; +} + +} +} +/* JavaCC - OriginalChecksum=2bf63f131c8e60fd30c70d0b4f660016 (do not edit this line) */ diff --git a/vhdlparser/TokenMgrError.h b/vhdlparser/TokenMgrError.h new file mode 100644 index 0000000..2702b29 --- /dev/null +++ b/vhdlparser/TokenMgrError.h @@ -0,0 +1,90 @@ +/* Generated By:JavaCC: Do not edit this line. TokenMgrError.h Version 6.0 */ +/* JavaCCOptions:STATIC=false,SUPPORT_CLASS_VISIBILITY_PUBLIC=true */ +#ifndef _TOKENMGRERROR_H +#define _TOKENMGRERROR_H +#include "JavaCC.h" + + +namespace vhdl { +namespace parser { + + enum LexerErrors { + /** + * Lexical error occurred. + */ + LEXICAL_ERROR = 0, + + /** + * An attempt was made to create a second instance of a token manager. + */ + STATIC_LEXER_ERROR = 1, + + /** + * Tried to change to an invalid lexical state. + */ + INVALID_LEXICAL_STATE = 2, + + /** + * Detected (and bailed out of) an infinite loop in the token manager. + */ + LOOP_DETECTED = 3, + }; + +class TokenMgrError +{ + public: + /* + * Ordinals for various reasons why an Error of this type can be thrown. + */ + + /** + * Indicates the reason why the exception is thrown. It will have + * one of the above 4 values. + */ + int errorCode; + + /** + * Returns a detailed message for the Error when it is thrown by the + * token manager to indicate a lexical error. + * Parameters : + * EOFSeen : indicates if EOF caused the lexical error + * curLexState : lexical state in which this error occurred + * errorLine : line number when the error occurred + * errorColumn : column number when the error occurred + * errorAfter : prefix that was seen before this error occurred + * curchar : the offending character + * Note: You can customize the lexical error message by modifying this method. + */ + JAVACC_STRING_TYPE LexicalError(bool EOFSeen, int lexState, int errorLine, int errorColumn, JAVACC_STRING_TYPE errorAfter, JAVACC_CHAR_TYPE curChar); + + private: JAVACC_STRING_TYPE message; + + /** + * You can also modify the body of this method to customize your error messages. + * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not + * of end-users concern, so you can return something like : + * + * "Internal Error : Please file a bug report .... " + * + * from this method for such cases in the release version of your parser. + */ + JAVACC_STRING_TYPE getMessage() ; + + /* + * Constructors of various flavors follow. + */ + + /** No arg constructor. */ + public: TokenMgrError() ; + + /** Constructor with message and reason. */ + public: TokenMgrError(JAVACC_STRING_TYPE message, int reason) ; + + /** Full Constructor. */ + public: TokenMgrError(bool EOFSeen, int lexState, int errorLine, int errorColumn, JAVACC_STRING_TYPE errorAfter, JAVACC_CHAR_TYPE curChar, int reason) ; +}; + +} +} +#endif +/* JavaCC - OriginalChecksum=c7d825cb4d037b031ae43569d383f738 (do not edit this line) */ diff --git a/vhdlparser/VhdlParser.cc b/vhdlparser/VhdlParser.cc new file mode 100644 index 0000000..47ecf49 --- /dev/null +++ b/vhdlparser/VhdlParser.cc @@ -0,0 +1,13071 @@ +/* VhdlParser.cc */ +#include "./VhdlParser.h" +namespace vhdl { +namespace parser { + unsigned int jj_la1_0[] = { +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000,0x0,0x90404000,0x20080000,0x40000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x90004000,0x400000,0x0,0x90404000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20080000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x0,0x0,0x0,0x0,0x20000000,0x0,0x0,0x40000000,0x0,0x400000,0x400000,0x0,0x0,0x0,0x0,0x0,0x0,0x40020000,0x40020001,0x0,0x0,0x0,0x40000000,0xd0020000,0x0,0x0,0x800000,0x0,0x0,0x80004000,0x400000,0x0,0x0,0x80404000,0x0,0x0,0x0,0x0,0x8000,0x0,0x80000,0x0,0x0,0x0,0x0,0x0,0x0,0x10000,0x10000,0x0,0x800,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800,0x10000000,0x0,0x50000000,0x8000,0x0,0x80000000,0x0,0x80000000,0x80000000,0x4000000,0x8000000,0x0,0x0,0x20000,0x0,0x0,0x0,0x0,0x800,0x4000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80000000,0x0,0x0,0x0,0x0,0x80004000,0x0,0x80004000,0x0,0x0,0x0,0x0,0x90004000,0x400000,0x0,0x0,0x90404000,0x0,0x0,0x0,0x40000000,0x0,0x0,0x80004000,0x400000,0x0,0x80404000,0x0,0x0,0x8000,0x0,0x0,0x0,0x0,0x20080000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800,0x0,0x20000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000000,0x0,0x8000000,0x0,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x80004000,0x400000,0x0,0x80404000,0x0,0x0,0x0,0x0,0x0,0x0,0x20080000,0x8000,0x0,0x0,0x41000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800,0x2000,0x0,0x80004000,0x400000,0x0,0x80404000,0x0,0x400000,0x400000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x90404000,0x20080000,0x20080000,0x80000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + unsigned int jj_la1_1[] = { +0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x125808,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10000,0x0,0x0,0x1000,0x104800,0x1008,0x20000,0x125808,0x10000,0x0,0x0,0x0,0x0,0x1000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x10000,0x1000,0x1000000,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x20000,0x20000,0x1000,0x0,0x4000000,0x4000000,0x0,0x400000,0x4000101,0x4000101,0x0,0x10,0x0,0x100,0x12024900,0x0,0x0,0x0,0x100,0x0,0x104800,0x8,0x20000,0x0,0x124808,0x0,0x10000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x0,0x0,0x0,0x0,0x81000,0x0,0x0,0x0,0x0,0x0,0x40,0x20,0x0,0x0,0x0,0x0,0x0,0x100,0x0,0x0,0x800,0x0,0x0,0x0,0x8a00000,0x0,0x0,0x1000,0x1,0x0,0x0,0x1000,0x0,0x0,0x8a00000,0x80000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x800,0x40000,0x400000,0x0,0x0,0x104800,0x20000,0x124800,0x0,0x0,0x10000,0x10000,0x104800,0x8,0x20000,0x0,0x124808,0x0,0x0,0x0,0x100,0x0,0x0,0x104800,0x0,0x20000,0x124800,0x0,0x0,0x0,0x0,0x1000000,0x0,0x0,0x20081200,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x400000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000,0x0,0x104000,0x1000000,0x1104800,0x0,0x20000,0x1124800,0x4000,0x0,0x100000,0x100000,0x0,0x104000,0x20081200,0x0,0x0,0x0,0x800,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000,0x0,0x0,0x0,0x0,0x1104800,0x0,0x20000,0x1124800,0x0,0x104000,0x104000,0x4000001,0x1,0x0,0x4000001,0x10000,0x10000,0x10000,0x0,0x0,0x125808,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x400000,0x20,0x0,0x200000,0x0,0x0,0x0,0x0,0x0,0x400000,0x0,0x200000,0x0,0x0,0x0,0x200000,0x0,0x20,0x104000,0x100000,0x100000,0x0,0x1000000,0x0,0x0,0x104000,}; + unsigned int jj_la1_2[] = { +0x0,0x100,0x0,0x0,0x0,0x0,0x0,0x0,0x2,0x0,0x0,0x110000,0x28000,0x0,0x20000000,0x0,0x0,0x0,0x200000,0x0,0x0,0x0,0x4000,0x0,0x0,0x110000,0x0,0x0,0x110000,0x0,0x4000,0x4000,0x0,0x0,0x0,0x0,0x28000,0x0,0x0,0x0,0x400,0x0,0x4000,0x0,0x0,0x0,0x4000,0x0,0x4000,0x400000,0x8000,0x8000,0x8000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x1000000,0x1000,0x1000,0x0,0x0,0x0,0x100,0x11000,0x0,0x0,0x0,0x0,0x0,0x110000,0x0,0x0,0x1000,0x111000,0x0,0x0,0x4000,0x0,0x400,0x8000,0x28000,0x0,0x0,0x0,0x0,0x0,0x0,0x209,0x209,0x0,0x32,0x100,0x100,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x32,0x0,0x0,0x0,0x400,0x1000,0x0,0x0,0x0,0x0,0x800,0x0,0x0,0x0,0x1000,0x20,0x0,0x0,0x0,0x10,0x800,0x10000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x1000,0x0,0x110000,0x0,0x110000,0x1000,0x0,0x0,0x0,0x110000,0x0,0x0,0x1000,0x111000,0x0,0x0,0x2,0x0,0x1000,0x0,0x110000,0x0,0x0,0x110000,0x0,0x8000,0x0,0x0,0x0,0x8000,0x0,0x20000024,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x32,0x200000,0x1000,0x0,0x0,0x20,0xc0000000,0xc0000000,0x0,0x1000000,0x0,0x800000,0x0,0x800000,0x0,0x400,0x0,0x0,0x0,0x0,0x10000,0x0,0x110000,0x0,0x110000,0x0,0x0,0x110000,0x10000,0x0,0x100000,0x100000,0x0,0x110000,0x20000024,0x0,0x0,0x0,0x600000,0x80000,0x0,0x0,0x0,0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x32,0x0,0x0,0x110000,0x0,0x0,0x110000,0x0,0x110000,0x110000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x110000,0x28000,0x28000,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x0,0x0,0x800,0x32,0x0,0x0,0x0,0x0,0x1000000,0x0,0x800,0x0,0x0,0x0,0x800,0x0,0x0,0x110000,0x100000,0x100000,0x0,0x0,0x2000,0x0,0x138000,}; + unsigned int jj_la1_3[] = { +0x0,0x0,0x0,0x40000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x188830,0x8000000,0x0,0x0,0x8,0x0,0x0,0x0,0x0,0x80000,0x0,0x0,0x80000,0x0,0x108830,0x80000,0x0,0x188830,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000000,0x0,0x2000000,0x0,0x0,0x0,0x80000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000000,0x0,0x0,0x2000000,0x0,0x0,0x80000,0x80000,0x0,0x0,0x80000,0x80000,0x0,0x4000,0x80000,0x80000,0x0,0x2000,0x0,0x0,0x128810,0x0,0x0,0x0,0x0,0x0,0x108830,0x80000,0x0,0x0,0x188830,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2000000,0x30000000,0x30000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x108030,0x0,0x100030,0x100030,0x0,0x0,0x0,0x4000000,0x0,0x0,0x0,0x4000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2000000,0x0,0x0,0x108030,0x0,0x4000,0x0,0x0,0x188820,0x0,0x188820,0x0,0x0,0x0,0x0,0x108830,0x80000,0x0,0x0,0x188830,0x0,0x0,0x0,0x0,0x0,0x0,0x108820,0x80000,0x0,0x188820,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xd000001,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3c0,0x3c0,0x0,0x4000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x108820,0x80000,0x0,0x188820,0x0,0x0,0x0,0x0,0x0,0x0,0xd000001,0x0,0x0,0x8000,0x0,0x0,0x0,0x0,0x8000000,0x20,0x0,0x0,0x0,0x40000,0x0,0x0,0x10000,0x0,0x0,0x108820,0x80000,0x0,0x188820,0x0,0x80000,0x80000,0x80000,0x0,0x0,0x80000,0x0,0x0,0x0,0x2000000,0x0,0x188830,0x8000000,0x8000000,0x100010,0x0,0x0,0x0,0x0,0x0,0x4000,0x0,0x2000000,0x0,0x0,0x8000000,0x0,0x0,0x0,0x4000,0x0,0x0,0x0,0x0,0x0,0x0,0x2000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; + unsigned int jj_la1_4[] = { +0x0,0x0,0x60000,0x30,0x40,0x100,0x0,0x0,0x0,0x0,0x40000,0x0,0x40001,0x0,0x0,0x0,0x0,0x40,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x40001,0x0,0x0,0x0,0x0,0x10000000,0x200,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x20000,0x40,0x0,0x0,0x40000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x40000,0x40000,0x40000,0x40000,0x0,0x40,0x0,0x0,0x0,0x0,0x0,0x4,0x40001,0x0,0x0,0x40000,0x1,0x0,0x0,0x40000,0x40,0x0,0x40,0x0,0x0,0x0,0x0,0x40,0x40031,0x0,0x1,0x0,0x0,0x0,0x0,0x200,0x0,0x0,0x0,0x0,0x80,0x0,0x0,0x0,0x0,0x0,0x0,0x4,0x0,0x40000008,0x40000,0x40,0x1,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x0,0x0,0x0,0x0,0x40000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x1,0x0,0x0,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x40000,0x1,0x0,0x0,0x0,0x40001,0x1,0x0,0x40000,0xfc00,0xfc00,0x0,0x0,0x0,0x40031,0x1,0x0,0x40,0x40,0x0,0x0,0x0,0x30,0x0,0x40001,0x0,0x80,0x0,0x40,0x40000,0x40,0x40000,0x0,0x30,0x0,0x0,0x0,0x200,0x0,0x0,0x0,0x0,0x0,0x1,0x0,0x0,0x1,0x0,0x40001,0x0,0x40001,0x0,0x1,0x0,0x40,0x40,0x40001,0x0,0x80,0x0,0x0,0x0,0x0,0x40,0x40031,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40001,0x40001,0x0,0xa0000000,0x20000000,0x0,0x1,0x40001,0x0,0x0,0x0,0x0,0x40031,0x0,0x8000000,0x40000,0x8000000,0x0,0x8000000,0x0,0x240,0x240,0x40,0x0,0x0,0x0,0x0,0x0,0x0,0x20000,0x0,0x0,0x1,0x0,}; + unsigned int jj_la1_5[] = { +0x1420,0x0,0x1c0,0x0,0x0,0x0,0x2,0x3c0,0x0,0x0,0x1c0,0x4000000,0x40001c0,0x0,0x0,0x0,0x180,0x0,0x180,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000000,0x4000000,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x40001c0,0x180,0x0,0x180,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000000,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x4000000,0x4000000,0x2,0x0,0x0,0x3c0,0x3c0,0x1c0,0x1c0,0x3c0,0x380,0x0,0x180,0x180,0x0,0x0,0x0,0x0,0x817e0,0x0,0x0,0x1e0,0x0,0x180,0x0,0x3c0,0x0,0x180,0x0,0x180,0x0,0x0,0x180,0x0,0x817e0,0x0,0x0,0x180,0x180,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x180,0x0,0x180,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x180,0x180,0x0,0x180,0x1420,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x0,0x1c0,0x0,0x0,0x0,0x180,0x1c0,0x0,0x180,0x1c0,0x0,0x0,0x180,0x0,0x180,0x817e0,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x1c0,0x0,0x1c0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x240,0x1c0,0x0,0x0,0x0,0x0,0x0,0x1c0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x817e0,0x0,0x180,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x0,0x180,0x4000000,0x40001c0,0x40001c0,0x0,0x1,0x0,0x1,0x0,0x1c0,0x0,0x0,0x0,0x0,0x817e0,0x0,0x0,0x1c0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x180,}; + + /** Constructor with user supplied TokenManager. */ + + + + +QCString VhdlParser::abstract_literal() {Token *tok; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case DECIMAL_LITERAL:{if (!hasError) { + + tok = jj_consume_token(DECIMAL_LITERAL); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + case INTEGER:{if (!hasError) { + + tok = jj_consume_token(INTEGER); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + case BASED_LITERAL:{if (!hasError) { + + tok = jj_consume_token(BASED_LITERAL); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + default: + jj_la1[0] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::access_type_definition() {Token *tok;QCString str,str1;if (!hasError) { + + tok = jj_consume_token(ACCESS_T); + } + if (!hasError) { + + str1 = subtype_indication(); + } + +str=tok->image.c_str(); return str+str1; +assert(false); + } + + +QCString VhdlParser::actual_designator() {QCString str;Token *t; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case OPEN_T:{if (!hasError) { + + t = jj_consume_token(OPEN_T); + } + if (!hasError) { + +return t->image.c_str(); + } + + break; + } + default: + jj_la1[1] = jj_gen; + if (jj_2_1(2147483647)) {if (!hasError) { + + str = expression(); + } + if (!hasError) { + +return str; + } + + } else if (jj_2_2(2147483647)) {if (!hasError) { + + str = name(); + } + if (!hasError) { + +return str; + } + + } else { + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } +assert(false); + } + + +QCString VhdlParser::actual_parameter_part() {QCString s;if (!hasError) { + + s = association_list(); + } + +return s; +assert(false); + } + + +QCString VhdlParser::actual_part() {QCString s,s1; + if (jj_2_3(2147483647)) {if (!hasError) { + + s = actual_designator(); + } + if (!hasError) { + +return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BOX_T:{if (!hasError) { + + jj_consume_token(BOX_T); + } + if (!hasError) { + +return "<>"; + } + + break; + } + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = name(); + } + if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = actual_designator(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + +s+="(";s+=s1+")";return s; + } + + break; + } + default: + jj_la1[2] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } +assert(false); + } + + +QCString VhdlParser::adding_operator() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PLUS_T:{if (!hasError) { + + jj_consume_token(PLUS_T); + } + if (!hasError) { + +return "+"; + } + + break; + } + case MINUS_T:{if (!hasError) { + + jj_consume_token(MINUS_T); + } + if (!hasError) { + +return "-"; + } + + break; + } + case AMPERSAND_T:{if (!hasError) { + + jj_consume_token(AMPERSAND_T); + } + if (!hasError) { + +return "&"; + } + + break; + } + default: + jj_la1[3] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::aggregate() {QCString s,s1,s2;if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s = element_association(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[4] = jj_gen; + goto end_label_1; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + s1 = element_association(); + } + if (!hasError) { + +s+=","+s1; + } + + } + end_label_1: ; + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + +return "("+s+")"; +assert(false); + } + + +QCString VhdlParser::alias_declaration() {QCString s,s1,s2;if (!hasError) { + + jj_consume_token(ALIAS_T); + } + if (!hasError) { + + s2 = alias_designator(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COLON_T:{if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + +s+=":"; + } + if (!hasError) { + + s1 = subtype_indication(); + } + if (!hasError) { + +s+=s1; + } + + break; + } + default: + jj_la1[5] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + +s+=" is "; + } + if (!hasError) { + + s1 = name(); + } + if (!hasError) { + +s+=s1; + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LBRACKET_T:{if (!hasError) { + + s1 = signature(); + } + if (!hasError) { + +s+=s1; + } + + break; + } + default: + jj_la1[6] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +addVhdlType(s2.data(),getLine(ALIAS_T),Entry::VARIABLE_SEC,VhdlDocGen::ALIAS,0,s.data(),Public); + + return s2+" "+s+";"; +assert(false); + } + + +QCString VhdlParser::alias_designator() {Token *tok=0;QCString s; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = identifier(); + } + if (!hasError) { + +return s; + } + + break; + } + case CHARACTER_LITERAL:{if (!hasError) { + + tok = jj_consume_token(CHARACTER_LITERAL); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + case STRINGLITERAL:{if (!hasError) { + + s = operator_symbol(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[7] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +void VhdlParser::allocator() { + if (jj_2_4(3)) {if (!hasError) { + + jj_consume_token(NEW_T); + } + if (!hasError) { + + qualified_expression(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case NEW_T:{if (!hasError) { + + jj_consume_token(NEW_T); + } + if (!hasError) { + + subtype_indication(); + } + + break; + } + default: + jj_la1[8] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + + +void VhdlParser::architecture_body() {QCString s,s1;if (!hasError) { + + jj_consume_token(ARCHITECTURE_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(OF_T); + } + if (!hasError) { + + s1 = name(); + } + if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + +QCString t=s1+"::"+s; + genLabels.resize(0); + pushLabel(genLabels,s1); + lastCompound=current; + addVhdlType(t,getLine(ARCHITECTURE_T),Entry::CLASS_SEC,VhdlDocGen::ARCHITECTURE,0,0,Private); + } + if (!hasError) { + + try {if (!hasError) { + + architecture_declarative_part(); + } + + } catch ( ...) { +error_skipto(BEGIN_T); + } + } + if (!hasError) { + + jj_consume_token(BEGIN_T); + } + if (!hasError) { + + architecture_statement_part(); + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ARCHITECTURE_T:{if (!hasError) { + + jj_consume_token(ARCHITECTURE_T); + } + + break; + } + default: + jj_la1[9] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + name(); + } + + break; + } + default: + jj_la1[10] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +lastEntity=0;lastCompound=0; genLabels.resize(0); + } + + +void VhdlParser::architecture_declarative_part() {if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ALIAS_T: + case ATTRIBUTE_T: + case COMPONENT_T: + case CONSTANT_T: + case DISCONNECT_T: + case FILE_T: + case FOR_T: + case FUNCTION_T: + case GROUP_T: + case IMPURE_T: + case PROCEDURE_T: + case PURE_T: + case SIGNAL_T: + case SHARED_T: + case SUBTYPE_T: + case TYPE_T: + case USE_T: + case VARIABLE_T: + case VHDL2008TOOLDIR:{ + ; + break; + } + default: + jj_la1[11] = jj_gen; + goto end_label_2; + }if (!hasError) { + + block_declarative_item(); + } + + } + end_label_2: ; + } + + } + + +void VhdlParser::architecture_statement_part() {if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ASSERT_T: + case CASE_T: + case POSTPONED_T: + case PROCESS_T: + case WITH_T: + case LPAREN_T: + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER: + case VHDL2008TOOLDIR:{ + ; + break; + } + default: + jj_la1[12] = jj_gen; + goto end_label_3; + }if (!hasError) { + + concurrent_statement(); + } + + } + end_label_3: ; + } + + } + + +QCString VhdlParser::array_type_definition() {QCString s; + if (jj_2_5(2147483647)) {if (!hasError) { + + s = unconstraint_array_definition(); + } + if (!hasError) { + +return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ARRAY_T:{if (!hasError) { + + s = constraint_array_definition(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[13] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } +assert(false); + } + + +QCString VhdlParser::assertion() {QCString s,s1,s2;Token *t=0;Token *t1=0;if (!hasError) { + + jj_consume_token(ASSERT_T); + } + if (!hasError) { + + s = condition(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case REPORT_T:{if (!hasError) { + + t = jj_consume_token(REPORT_T); + } + if (!hasError) { + + s1 = expression(); + } + + break; + } + default: + jj_la1[14] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SEVERITY_T:{if (!hasError) { + + t1 = jj_consume_token(SEVERITY_T); + } + if (!hasError) { + + s2 = expression(); + } + + break; + } + default: + jj_la1[15] = jj_gen; + ; + } + } + +s.prepend("assert "); + if(t) s1.prepend(" report "); + if(t1) s2.prepend(" report "); + return s+s1+s2; +assert(false); + } + + +QCString VhdlParser::assertion_statement() {QCString s,s1,s2;Token *t=0;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = label(); + } + if (!hasError) { + + t = jj_consume_token(COLON_T); + } + + break; + } + default: + jj_la1[16] = jj_gen; + ; + } + } + if (!hasError) { + + s1 = assertion(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +if(t) s+=":"; + return s+s1+";"; +assert(false); + } + + +QCString VhdlParser::association_element() {QCString s,s1;if (!hasError) { + + if (jj_2_6(2147483647)) {if (!hasError) { + + s = formal_part(); + } + if (!hasError) { + + jj_consume_token(ARROW_T); + } + + } else { + ; + } + } + if (!hasError) { + + s1 = actual_part(); + } + +return s+" => "+s1; +assert(false); + } + + +QCString VhdlParser::association_list() {QCString s,s1;if (!hasError) { + + s = association_element(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[17] = jj_gen; + goto end_label_4; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + s1 = association_element(); + } + if (!hasError) { + +s+=","+s1; + } + + } + end_label_4: ; + } + +return s; +assert(false); + } + + +QCString VhdlParser::attribute_declaration() {QCString s,s1;if (!hasError) { + + jj_consume_token(ATTRIBUTE_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + s1 = type_mark(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +addVhdlType(s.data(),getLine(ATTRIBUTE_T),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,s1.data(),Public); + return " attribute "+s+":"+s1+";"; +assert(false); + } + + +QCString VhdlParser::attribute_designator() {QCString s;Token *tok; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = identifier(); + } + if (!hasError) { + +return s; + } + + break; + } + case RANGE_T:{if (!hasError) { + + tok = jj_consume_token(RANGE_T); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + default: + jj_la1[18] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::attribute_name() {QCString s,s1;if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(APOSTROPHE_T); + } + if (!hasError) { + + s1 = name(); + } + if (!hasError) { + +s+="'"+s1; + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T:{if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = expression(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + +s+"("+s1+")"; + } + + break; + } + default: + jj_la1[19] = jj_gen; + ; + } + } + +return s; +assert(false); + } + + +QCString VhdlParser::attribute_specification() {QCString s,s1,s2;if (!hasError) { + + jj_consume_token(ATTRIBUTE_T); + } + if (!hasError) { + + s = attribute_designator(); + } + if (!hasError) { + + jj_consume_token(OF_T); + } + if (!hasError) { + + s1 = entity_specification(); + } + if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + + s2 = expression(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +QCString t= s1+" is "+s2; + addVhdlType(s.data(),getLine(ATTRIBUTE_T),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,t.data(),Public); + return " attribute "+s+" of "+s1+ " is "+s2+";"; +assert(false); + } + + +QCString VhdlParser::base() {Token *tok;if (!hasError) { + + tok = jj_consume_token(INTEGER); + } + +return tok->image.c_str(); +assert(false); + } + + +QCString VhdlParser::base_specifier() {Token *tok;if (!hasError) { + + tok = jj_consume_token(BASIC_IDENTIFIER); + } + +return tok->image.c_str(); +assert(false); + } + + +QCString VhdlParser::base_unit_declaration() {QCString s;if (!hasError) { + + s = identifier(); + } + +return s; +assert(false); + } + + +QCString VhdlParser::based_integer() {Token *tok;if (!hasError) { + + tok = jj_consume_token(BASIC_IDENTIFIER); + } + +return tok->image.c_str(); +assert(false); + } + + +QCString VhdlParser::based_literal() {Token *tok;if (!hasError) { + + tok = jj_consume_token(BASED_LITERAL); + } + +return tok->image.c_str(); +assert(false); + } + + +QCString VhdlParser::basic_identifier() {Token *tok;if (!hasError) { + + tok = jj_consume_token(BASIC_IDENTIFIER); + } + +return tok->image.c_str(); +assert(false); + } + + +void VhdlParser::binding_indication() {if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case USE_T:{if (!hasError) { + + jj_consume_token(USE_T); + } + if (!hasError) { + + entity_aspect(); + } + + break; + } + default: + jj_la1[20] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GENERIC_T:{if (!hasError) { + + generic_map_aspect(); + } + + break; + } + default: + jj_la1[21] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PORT_T:{if (!hasError) { + + port_map_aspect(); + } + + break; + } + default: + jj_la1[22] = jj_gen; + ; + } + } + + } + + +QCString VhdlParser::bit_string_literal() {Token *tok;if (!hasError) { + + tok = jj_consume_token(BIT_STRING_LITERAL); + } + +return tok->image.c_str(); +assert(false); + } + + +QCString VhdlParser::bit_value() {Token *tok;if (!hasError) { + + tok = jj_consume_token(BASIC_IDENTIFIER); + } + +return tok->image.c_str(); +assert(false); + } + + +void VhdlParser::block_configuration() {if (!hasError) { + + jj_consume_token(FOR_T); + } + if (!hasError) { + + block_specification(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case USE_T:{ + ; + break; + } + default: + jj_la1[23] = jj_gen; + goto end_label_5; + }if (!hasError) { + + use_clause(); + } + + } + end_label_5: ; + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FOR_T:{ + ; + break; + } + default: + jj_la1[24] = jj_gen; + goto end_label_6; + }if (!hasError) { + + configuration_item(); + } + + } + end_label_6: ; + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + jj_consume_token(FOR_T); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + + +void VhdlParser::block_declarative_item() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FUNCTION_T: + case IMPURE_T: + case PROCEDURE_T: + case PURE_T:{if (!hasError) { + + subprogram_declaration(); + } + + break; + } + case TYPE_T:{if (!hasError) { + + type_declaration(); + } + + break; + } + case SUBTYPE_T:{if (!hasError) { + + subtype_declaration(); + } + + break; + } + case CONSTANT_T:{if (!hasError) { + + constant_declaration(); + } + + break; + } + case SIGNAL_T:{if (!hasError) { + + signal_declaration(); + } + + break; + } + case SHARED_T: + case VARIABLE_T:{if (!hasError) { + + variable_declaration(); + } + + break; + } + case FILE_T:{if (!hasError) { + + file_declaration(); + } + + break; + } + case ALIAS_T:{if (!hasError) { + + alias_declaration(); + } + + break; + } + case COMPONENT_T:{if (!hasError) { + + component_declaration(); + } + + break; + } + default: + jj_la1[25] = jj_gen; + if (jj_2_7(2147483647)) {if (!hasError) { + + attribute_declaration(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ATTRIBUTE_T:{if (!hasError) { + + attribute_specification(); + } + + break; + } + case FOR_T:{if (!hasError) { + + configuration_specification(); + } + + break; + } + case DISCONNECT_T:{if (!hasError) { + + disconnection_specification(); + } + + break; + } + case USE_T:{if (!hasError) { + + use_clause(); + } + + break; + } + default: + jj_la1[26] = jj_gen; + if (jj_2_8(3)) {if (!hasError) { + + group_template_declaration(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GROUP_T:{if (!hasError) { + + group_declaration(); + } + + break; + } + case VHDL2008TOOLDIR:{if (!hasError) { + + jj_consume_token(VHDL2008TOOLDIR); + } + + break; + } + default: + jj_la1[27] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + } + } + } + + +void VhdlParser::block_declarative_part() {if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ALIAS_T: + case ATTRIBUTE_T: + case COMPONENT_T: + case CONSTANT_T: + case DISCONNECT_T: + case FILE_T: + case FOR_T: + case FUNCTION_T: + case GROUP_T: + case IMPURE_T: + case PROCEDURE_T: + case PURE_T: + case SIGNAL_T: + case SHARED_T: + case SUBTYPE_T: + case TYPE_T: + case USE_T: + case VARIABLE_T: + case VHDL2008TOOLDIR:{ + ; + break; + } + default: + jj_la1[28] = jj_gen; + goto end_label_7; + }if (!hasError) { + + block_declarative_item(); + } + + } + end_label_7: ; + } + + } + + +void VhdlParser::block_header() {if (!hasError) { + + if (jj_2_9(2147483647)) {if (!hasError) { + + generic_clause(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GENERIC_T:{if (!hasError) { + + generic_map_aspect(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + break; + } + default: + jj_la1[29] = jj_gen; + ; + } + } + + } else { + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PORT_T:{if (!hasError) { + + port_clause(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PORT_T:{if (!hasError) { + + port_map_aspect(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + break; + } + default: + jj_la1[30] = jj_gen; + ; + } + } + + break; + } + default: + jj_la1[31] = jj_gen; + ; + } + } + + } + + +void VhdlParser::block_specification() {if (!hasError) { + + name(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T:{if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + index_specification(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + + break; + } + default: + jj_la1[32] = jj_gen; + ; + } + } + + } + + +void VhdlParser::block_statement() {QCString s;if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + jj_consume_token(BLOCK_T); + } + if (!hasError) { + +pushLabel(genLabels,s); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T:{if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + expression(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + + break; + } + default: + jj_la1[33] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case IS_T:{if (!hasError) { + + jj_consume_token(IS_T); + } + + break; + } + default: + jj_la1[34] = jj_gen; + ; + } + } + if (!hasError) { + + block_header(); + } + if (!hasError) { + + block_declarative_part(); + } + if (!hasError) { + + jj_consume_token(BEGIN_T); + } + if (!hasError) { + + block_statement_part(); + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + jj_consume_token(BLOCK_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + identifier(); + } + + break; + } + default: + jj_la1[35] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +genLabels=popLabel(genLabels); + } + + +void VhdlParser::block_statement_part() {if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ASSERT_T: + case CASE_T: + case POSTPONED_T: + case PROCESS_T: + case WITH_T: + case LPAREN_T: + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER: + case VHDL2008TOOLDIR:{ + ; + break; + } + default: + jj_la1[36] = jj_gen; + goto end_label_8; + }if (!hasError) { + + concurrent_statement(); + } + + } + end_label_8: ; + } + + } + + +void VhdlParser::case_statement() {QCString s;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + + break; + } + default: + jj_la1[37] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(CASE_T); + } + if (!hasError) { + + s = expression(); + } + if (!hasError) { + +QCString ca="case "+s; + FlowChart::addFlowChart(FlowChart::CASE_NO,0,ca); + } + if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + + case_statement_alternative(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case WHEN_T:{ + ; + break; + } + default: + jj_la1[38] = jj_gen; + goto end_label_9; + }if (!hasError) { + + case_statement_alternative(); + } + + } + end_label_9: ; + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + jj_consume_token(CASE_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + identifier(); + } + + break; + } + default: + jj_la1[39] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +FlowChart::moveToPrevLevel(); + FlowChart::addFlowChart(FlowChart::END_CASE,"end case",0); + } + + +void VhdlParser::case_statement_alternative() {QCString s;if (!hasError) { + + jj_consume_token(WHEN_T); + } + if (!hasError) { + + s = choices(); + } + if (!hasError) { + + jj_consume_token(ARROW_T); + } + if (!hasError) { + +QCString t="when "; + t+=s+"=> "; + FlowChart::addFlowChart(FlowChart::WHEN_NO,s.data(),t); + } + if (!hasError) { + + sequence_of_statement(); + } + +FlowChart::moveToPrevLevel(); + } + + +QCString VhdlParser::character_literal() {Token *tok;if (!hasError) { + + tok = jj_consume_token(CHARACTER_LITERAL); + } + +return tok->image.c_str(); +assert(false); + } + + +QCString VhdlParser::choice() {QCString s; + if (jj_2_10(2147483647)) {if (!hasError) { + + s = simple_expression(); + } + if (!hasError) { + +return s; + } + + } else if (jj_2_11(2147483647)) {if (!hasError) { + + s = discrete_range(); + } + if (!hasError) { + +return s; + } + + } else if (jj_2_12(2147483647)) {if (!hasError) { + + s = identifier(); + } + if (!hasError) { + +return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case OTHER_T:{if (!hasError) { + + jj_consume_token(OTHER_T); + } + if (!hasError) { + +return " others "; + } + + break; + } + default: + jj_la1[40] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } +assert(false); + } + + +QCString VhdlParser::choices() {QCString s,s1;if (!hasError) { + + s = choice(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BAR_T:{ + ; + break; + } + default: + jj_la1[41] = jj_gen; + goto end_label_10; + }if (!hasError) { + + jj_consume_token(BAR_T); + } + if (!hasError) { + + s1 = choice(); + } + if (!hasError) { + +s+="|";s+=s1; + } + + } + end_label_10: ; + } + +return s; +assert(false); + } + + +void VhdlParser::component_configuration() {if (!hasError) { + + jj_consume_token(FOR_T); + } + if (!hasError) { + + component_specification(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GENERIC_T: + case PORT_T: + case USE_T: + case SEMI_T:{if (!hasError) { + + binding_indication(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + break; + } + default: + jj_la1[42] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FOR_T:{if (!hasError) { + + block_configuration(); + } + + break; + } + default: + jj_la1[43] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + jj_consume_token(FOR_T); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + + +void VhdlParser::component_declaration() {QCString s;if (!hasError) { + + jj_consume_token(COMPONENT_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case IS_T:{if (!hasError) { + + jj_consume_token(IS_T); + } + + break; + } + default: + jj_la1[44] = jj_gen; + ; + } + } + if (!hasError) { + +currP=VhdlDocGen::COMPONENT; + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GENERIC_T:{if (!hasError) { + + generic_clause(); + } + + break; + } + default: + jj_la1[45] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PORT_T:{if (!hasError) { + + port_clause(); + } + + break; + } + default: + jj_la1[46] = jj_gen; + ; + } + } + if (!hasError) { + +addVhdlType(s.data(),getLine(COMPONENT_T),Entry::VARIABLE_SEC,VhdlDocGen::COMPONENT,0,0,Public); + currP=0; + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + jj_consume_token(COMPONENT_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + identifier(); + } + + break; + } + default: + jj_la1[47] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + + +void VhdlParser::component_instantiation_statement() {QCString s,s1;if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + s1 = instantiation_unit(); + } + if (!hasError) { + +addCompInst(s.lower().data(),s1.lower().data(),0,getLine()); + } + if (!hasError) { + + if (jj_2_13(2147483647)) {if (!hasError) { + + generic_map_aspect(); + } + + } else { + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PORT_T:{if (!hasError) { + + port_map_aspect(); + } + + break; + } + default: + jj_la1[48] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + + +void VhdlParser::component_specification() {if (!hasError) { + + instantiation_list(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + name(); + } + + } + + +QCString VhdlParser::composite_type_definition() {QCString s,s1; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ARRAY_T:{if (!hasError) { + + s = array_type_definition(); + } + if (!hasError) { + +return s; + } + + break; + } + case RECORD_T:{if (!hasError) { + + record_type_definition(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[49] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +void VhdlParser::concurrent_assertion_statement() {if (!hasError) { + + if (jj_2_14(2)) {if (!hasError) { + + identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + + } else { + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case POSTPONED_T:{if (!hasError) { + + jj_consume_token(POSTPONED_T); + } + + break; + } + default: + jj_la1[50] = jj_gen; + ; + } + } + if (!hasError) { + + assertion(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + + +void VhdlParser::concurrent_procedure_call_statement() {if (!hasError) { + + if (jj_2_15(2)) {if (!hasError) { + + identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + + } else { + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case POSTPONED_T:{if (!hasError) { + + jj_consume_token(POSTPONED_T); + } + + break; + } + default: + jj_la1[51] = jj_gen; + ; + } + } + if (!hasError) { + + procedure_call(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + + +void VhdlParser::concurrent_signal_assignment_statement() {if (!hasError) { + + if (jj_2_16(2)) {if (!hasError) { + + identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + + } else { + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case POSTPONED_T:{if (!hasError) { + + jj_consume_token(POSTPONED_T); + } + + break; + } + default: + jj_la1[52] = jj_gen; + ; + } + } + if (!hasError) { + + if (jj_2_17(2147483647)) {if (!hasError) { + + conditional_signal_assignment(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case WITH_T:{if (!hasError) { + + selected_signal_assignment(); + } + + break; + } + default: + jj_la1[53] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + + } + + +void VhdlParser::concurrent_statement() { + if (jj_2_18(2147483647)) {if (!hasError) { + + block_statement(); + } + + } else if (jj_2_19(2147483647)) {if (!hasError) { + + process_statement(); + } + + } else if (jj_2_20(2147483647)) {if (!hasError) { + + generate_statement(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case CASE_T:{if (!hasError) { + + case_scheme(); + } + + break; + } + default: + jj_la1[54] = jj_gen; + if (jj_2_21(2147483647)) {if (!hasError) { + + concurrent_assertion_statement(); + } + + } else if (jj_2_22(2147483647)) {if (!hasError) { + + concurrent_signal_assignment_statement(); + } + + } else if (jj_2_23(2147483647)) {if (!hasError) { + + component_instantiation_statement(); + } + + } else if (jj_2_24(2147483647)) {if (!hasError) { + + concurrent_procedure_call_statement(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case VHDL2008TOOLDIR:{if (!hasError) { + + jj_consume_token(VHDL2008TOOLDIR); + } + + break; + } + default: + jj_la1[55] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + } + } + + +QCString VhdlParser::condition() {QCString s;if (!hasError) { + + s = expression(); + } + +return s; +assert(false); + } + + +QCString VhdlParser::condition_clause() {QCString s;if (!hasError) { + + jj_consume_token(UNTIL_T); + } + if (!hasError) { + + s = condition(); + } + +return " until "+s; +assert(false); + } + + +void VhdlParser::conditional_signal_assignment() {if (!hasError) { + + target(); + } + if (!hasError) { + + jj_consume_token(LESSTHAN_T); + } + if (!hasError) { + + options(); + } + if (!hasError) { + + conditional_waveforms(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + + +void VhdlParser::conditional_waveforms() {if (!hasError) { + + waveform(); + } + if (!hasError) { + + while (!hasError) { + if (jj_2_25(2147483647)) { + ; + } else { + goto end_label_11; + }if (!hasError) { + + jj_consume_token(WHEN_T); + } + if (!hasError) { + + condition(); + } + if (!hasError) { + + jj_consume_token(ELSE_T); + } + if (!hasError) { + + waveform(); + } + + } + end_label_11: ; + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case WHEN_T:{if (!hasError) { + + jj_consume_token(WHEN_T); + } + if (!hasError) { + + condition(); + } + + break; + } + default: + jj_la1[56] = jj_gen; + ; + } + } + + } + + +void VhdlParser::configuration_declaration() {QCString s,s1;if (!hasError) { + + jj_consume_token(CONFIGURATION_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(OF_T); + } + if (!hasError) { + + s1 = name(); + } + if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + +confName=s+"::"+s1; + addVhdlType(s.data(),getLine(CONFIGURATION_T),Entry::VARIABLE_SEC,VhdlDocGen::CONFIG,"configuration",s1.data(),Public); + } + if (!hasError) { + + configuration_declarative_part(); + } + if (!hasError) { + + block_configuration(); + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case CONFIGURATION_T:{if (!hasError) { + + jj_consume_token(CONFIGURATION_T); + } + + break; + } + default: + jj_la1[57] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + name(); + } + + break; + } + default: + jj_la1[58] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +genLabels.resize(0); confName=""; + } + + +void VhdlParser::configuration_declarative_item() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case USE_T:{if (!hasError) { + + use_clause(); + } + + break; + } + case ATTRIBUTE_T:{if (!hasError) { + + attribute_specification(); + } + + break; + } + case GROUP_T:{if (!hasError) { + + group_declaration(); + } + + break; + } + default: + jj_la1[59] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + + +void VhdlParser::configuration_declarative_part() {if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ATTRIBUTE_T: + case GROUP_T: + case USE_T:{ + ; + break; + } + default: + jj_la1[60] = jj_gen; + goto end_label_12; + }if (!hasError) { + + configuration_declarative_item(); + } + + } + end_label_12: ; + } + + } + + +void VhdlParser::configuration_item() { + if (jj_2_26(2147483647)) {if (!hasError) { + + component_configuration(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FOR_T:{if (!hasError) { + + block_configuration(); + } + + break; + } + default: + jj_la1[61] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + + +void VhdlParser::configuration_specification() {if (!hasError) { + + jj_consume_token(FOR_T); + } + if (!hasError) { + + component_specification(); + } + if (!hasError) { + + binding_indication(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + + +QCString VhdlParser::constant_declaration() {QCString s,s1,s2;Token *t=0;if (!hasError) { + + jj_consume_token(CONSTANT_T); + } + if (!hasError) { + + s = identifier_list(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + s1 = subtype_indication(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case VARASSIGN_T:{if (!hasError) { + + t = jj_consume_token(VARASSIGN_T); + } + if (!hasError) { + + s2 = expression(); + } + + break; + } + default: + jj_la1[62] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +if(t) + s2.prepend(":="); + QCString it=s1+s2; + addVhdlType(s.data(),getLine(CONSTANT_T),Entry::VARIABLE_SEC,VhdlDocGen::CONSTANT,0,it.data(),Public); + it.prepend("constant "); + return it; +assert(false); + } + + +QCString VhdlParser::constraint_array_definition() {QCString s,s1;if (!hasError) { + + jj_consume_token(ARRAY_T); + } + if (!hasError) { + + s = index_constraint(); + } + if (!hasError) { + + jj_consume_token(OF_T); + } + if (!hasError) { + + s1 = subtype_indication(); + } + +return s+" "+s1; +assert(false); + } + + +void VhdlParser::context_clause() {if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LIBRARY_T: + case USE_T:{ + ; + break; + } + default: + jj_la1[63] = jj_gen; + goto end_label_13; + }if (!hasError) { + + context_item(); + } + + } + end_label_13: ; + } + + } + + +QCString VhdlParser::constraint() {QCString s; + if (jj_2_27(2147483647)) {if (!hasError) { + + s = range_constraint(); + } + if (!hasError) { + +return s; + } + + } else if (jj_2_28(2147483647)) {if (!hasError) { + + s = index_constraint(); + } + if (!hasError) { + +return s; + } + + } else { + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +void VhdlParser::context_item() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LIBRARY_T:{if (!hasError) { + + library_clause(); + } + + break; + } + case USE_T:{if (!hasError) { + + use_clause(); + } + + break; + } + default: + jj_la1[64] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + + +QCString VhdlParser::decimal_literal() {Token *tok;if (!hasError) { + + tok = jj_consume_token(DECIMAL_LITERAL); + } + +return tok->image.c_str(); +assert(false); + } + + +QCString VhdlParser::delay_mechanism() {QCString s; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case TRANSPORT_T:{if (!hasError) { + + jj_consume_token(TRANSPORT_T); + } + if (!hasError) { + +return " transport "; + } + + break; + } + case INERTIAL_T: + case REJECT_T:{if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case REJECT_T:{if (!hasError) { + + jj_consume_token(REJECT_T); + } + if (!hasError) { + + s = expression(); + } + if (!hasError) { + +s.prepend(" reject "); + } + + break; + } + default: + jj_la1[65] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(INERTIAL_T); + } + if (!hasError) { + +return s+" inertial "; + } + + break; + } + default: + jj_la1[66] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +void VhdlParser::design_file() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ARCHITECTURE_T: + case CONFIGURATION_T: + case CONTEXT_T: + case ENTITY_T: + case LIBRARY_T: + case PACKAGE_T: + case USE_T:{if (!hasError) { + + while (!hasError) {if (!hasError) { + + design_unit(); + } + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ARCHITECTURE_T: + case CONFIGURATION_T: + case CONTEXT_T: + case ENTITY_T: + case LIBRARY_T: + case PACKAGE_T: + case USE_T:{ + ; + break; + } + default: + jj_la1[67] = jj_gen; + goto end_label_14; + } + } + end_label_14: ; + } + if (!hasError) { + + + } + + break; + } + case 0:{if (!hasError) { + + jj_consume_token(0); + } + + break; + } + default: + jj_la1[68] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + + +void VhdlParser::design_unit() {if (!hasError) { + + context_clause(); + } + if (!hasError) { + + library_unit(); + } + + } + + +QCString VhdlParser::designator() {QCString s; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = identifier(); + } + if (!hasError) { + +return s; + } + + break; + } + case STRINGLITERAL:{if (!hasError) { + + s = operator_symbol(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[69] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::direction() {Token *tok; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case TO_T:{if (!hasError) { + + tok = jj_consume_token(TO_T); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + case DOWNTO_T:{if (!hasError) { + + tok = jj_consume_token(DOWNTO_T); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + default: + jj_la1[70] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +void VhdlParser::disconnection_specification() {if (!hasError) { + + jj_consume_token(DISCONNECT_T); + } + if (!hasError) { + + guarded_signal_specificatio(); + } + if (!hasError) { + + jj_consume_token(AFTER_T); + } + if (!hasError) { + + expression(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + + +void VhdlParser::guarded_signal_specificatio() {if (!hasError) { + + signal_list(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + name(); + } + + } + + +QCString VhdlParser::discrete_range() {QCString s; + if (jj_2_29(2147483647)) {if (!hasError) { + + s = range(); + } + if (!hasError) { + +return s; + } + + } else if (jj_2_30(2147483647)) {if (!hasError) { + + s = subtype_indication(); + } + if (!hasError) { + +return s; + } + + } else { + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::element_association() {QCString s,s1;if (!hasError) { + + if (jj_2_31(2147483647)) {if (!hasError) { + + s = choices(); + } + if (!hasError) { + + jj_consume_token(ARROW_T); + } + + } else { + ; + } + } + if (!hasError) { + + s1 = expression(); + } + +if(!s.isEmpty()) + return s+"=>"+s1; +return s1; +assert(false); + } + + +QCString VhdlParser::element_declaration() {QCString s,s1;if (!hasError) { + + s = identifier_list(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + s1 = subtype_indication(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +return s+":"+s1; +assert(false); + } + + +QCString VhdlParser::entity_aspect() {Token *tok;QCString s,s1; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ENTITY_T:{if (!hasError) { + + tok = jj_consume_token(ENTITY_T); + } + if (!hasError) { + + s = name(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T:{if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = identifier(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + +s+="("+s1+")"; + } + + break; + } + default: + jj_la1[71] = jj_gen; + ; + } + } + if (!hasError) { + +return s; + } + + break; + } + case CONFIGURATION_T:{if (!hasError) { + + tok = jj_consume_token(CONFIGURATION_T); + } + if (!hasError) { + + s = name(); + } + if (!hasError) { + +return tok->image.c_str()+s; + } + + break; + } + case OPEN_T:{if (!hasError) { + + tok = jj_consume_token(OPEN_T); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + default: + jj_la1[72] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::entity_class() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ENTITY_T:{if (!hasError) { + + jj_consume_token(ENTITY_T); + } + if (!hasError) { + +return "entity"; + } + + break; + } + case ARCHITECTURE_T:{if (!hasError) { + + jj_consume_token(ARCHITECTURE_T); + } + if (!hasError) { + +return "architecture"; + } + + break; + } + case CONFIGURATION_T:{if (!hasError) { + + jj_consume_token(CONFIGURATION_T); + } + if (!hasError) { + +return "configuration"; + } + + break; + } + case PROCEDURE_T:{if (!hasError) { + + jj_consume_token(PROCEDURE_T); + } + if (!hasError) { + +return "procedure"; + } + + break; + } + case FUNCTION_T:{if (!hasError) { + + jj_consume_token(FUNCTION_T); + } + if (!hasError) { + +return "function"; + } + + break; + } + case PACKAGE_T:{if (!hasError) { + + jj_consume_token(PACKAGE_T); + } + if (!hasError) { + +return "package"; + } + + break; + } + case TYPE_T:{if (!hasError) { + + jj_consume_token(TYPE_T); + } + if (!hasError) { + +return "type"; + } + + break; + } + case SUBTYPE_T:{if (!hasError) { + + jj_consume_token(SUBTYPE_T); + } + if (!hasError) { + +return "subtype"; + } + + break; + } + case CONSTANT_T:{if (!hasError) { + + jj_consume_token(CONSTANT_T); + } + if (!hasError) { + +return "constant"; + } + + break; + } + case SIGNAL_T:{if (!hasError) { + + jj_consume_token(SIGNAL_T); + } + if (!hasError) { + +return "signal"; + } + + break; + } + case VARIABLE_T:{if (!hasError) { + + jj_consume_token(VARIABLE_T); + } + if (!hasError) { + +return "variable"; + } + + break; + } + case COMPONENT_T:{if (!hasError) { + + jj_consume_token(COMPONENT_T); + } + if (!hasError) { + +return "component"; + } + + break; + } + case LABEL_T:{if (!hasError) { + + jj_consume_token(LABEL_T); + } + if (!hasError) { + +return "label"; + } + + break; + } + case LITERAL_T:{if (!hasError) { + + jj_consume_token(LITERAL_T); + } + if (!hasError) { + +return "literal"; + } + + break; + } + case UNITS_T:{if (!hasError) { + + jj_consume_token(UNITS_T); + } + if (!hasError) { + +return "units"; + } + + break; + } + case GROUP_T:{if (!hasError) { + + jj_consume_token(GROUP_T); + } + if (!hasError) { + +return "group"; + } + + break; + } + case FILE_T:{if (!hasError) { + + jj_consume_token(FILE_T); + } + if (!hasError) { + +return "file"; + } + + break; + } + default: + jj_la1[73] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::entity_class_entry() {QCString s;if (!hasError) { + + s = entity_class(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BOX_T:{if (!hasError) { + + jj_consume_token(BOX_T); + } + if (!hasError) { + +s+="<>"; + } + + break; + } + default: + jj_la1[74] = jj_gen; + ; + } + } + +return s; +assert(false); + } + + +QCString VhdlParser::entity_class_entry_list() {QCString s,s1,s2;if (!hasError) { + if (!hasError) { + + s1 = entity_class_entry(); + } + if (!hasError) { + +s+=s1; + } + + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[75] = jj_gen; + goto end_label_15; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + s = entity_class_entry(); + } + if (!hasError) { + +s2+=",";s2+=s; + } + + } + end_label_15: ; + } + +return s1+s2; +assert(false); + } + + +void VhdlParser::entity_declaration() {QCString s;if (!hasError) { + + jj_consume_token(ENTITY_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + +lastEntity=current; + lastCompound=0; + addVhdlType(s.data(),getLine(ENTITY_T),Entry::CLASS_SEC,VhdlDocGen::ENTITY,0,0,Public); + } + if (!hasError) { + + entity_header(); + } + if (!hasError) { + + entity_declarative_part(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BEGIN_T:{if (!hasError) { + + jj_consume_token(BEGIN_T); + } + if (!hasError) { + + entity_statement_part(); + } + + break; + } + default: + jj_la1[76] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ENTITY_T:{if (!hasError) { + + jj_consume_token(ENTITY_T); + } + + break; + } + default: + jj_la1[77] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + name(); + } + + break; + } + default: + jj_la1[78] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +lastEntity=0;lastCompound=0; genLabels.resize(0); + } + + +void VhdlParser::entity_declarative_item() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FUNCTION_T: + case IMPURE_T: + case PROCEDURE_T: + case PURE_T:{if (!hasError) { + + subprogram_declaration(); + } + + break; + } + case TYPE_T:{if (!hasError) { + + type_declaration(); + } + + break; + } + case SUBTYPE_T:{if (!hasError) { + + subtype_declaration(); + } + + break; + } + case CONSTANT_T:{if (!hasError) { + + constant_declaration(); + } + + break; + } + case SIGNAL_T:{if (!hasError) { + + signal_declaration(); + } + + break; + } + case SHARED_T: + case VARIABLE_T:{if (!hasError) { + + variable_declaration(); + } + + break; + } + case FILE_T:{if (!hasError) { + + file_declaration(); + } + + break; + } + case ALIAS_T:{if (!hasError) { + + alias_declaration(); + } + + break; + } + default: + jj_la1[79] = jj_gen; + if (jj_2_32(2147483647)) {if (!hasError) { + + attribute_declaration(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ATTRIBUTE_T:{if (!hasError) { + + attribute_specification(); + } + + break; + } + case DISCONNECT_T:{if (!hasError) { + + disconnection_specification(); + } + + break; + } + case USE_T:{if (!hasError) { + + use_clause(); + } + + break; + } + default: + jj_la1[80] = jj_gen; + if (jj_2_33(3)) {if (!hasError) { + + group_template_declaration(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GROUP_T:{if (!hasError) { + + group_declaration(); + } + + break; + } + default: + jj_la1[81] = jj_gen; + if (jj_2_34(5)) {if (!hasError) { + + package_instantiation_declaration(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PACKAGE_T:{if (!hasError) { + + package_declaration(); + } + + break; + } + case VHDL2008TOOLDIR:{if (!hasError) { + + jj_consume_token(VHDL2008TOOLDIR); + } + + break; + } + default: + jj_la1[82] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + } + } + } + } + } + + +void VhdlParser::entity_declarative_part() {if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ALIAS_T: + case ATTRIBUTE_T: + case CONSTANT_T: + case DISCONNECT_T: + case FILE_T: + case FUNCTION_T: + case GROUP_T: + case IMPURE_T: + case PACKAGE_T: + case PROCEDURE_T: + case PURE_T: + case SIGNAL_T: + case SHARED_T: + case SUBTYPE_T: + case TYPE_T: + case USE_T: + case VARIABLE_T: + case VHDL2008TOOLDIR:{ + ; + break; + } + default: + jj_la1[83] = jj_gen; + goto end_label_16; + }if (!hasError) { + + entity_declarative_item(); + } + + } + end_label_16: ; + } + + } + + +QCString VhdlParser::entity_designator() {QCString s,s1;if (!hasError) { + + s = entity_tag(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LBRACKET_T:{if (!hasError) { + + s1 = signature(); + } + + break; + } + default: + jj_la1[84] = jj_gen; + ; + } + } + +return s+s1; +assert(false); + } + + +void VhdlParser::entity_header() {if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GENERIC_T:{if (!hasError) { + +currP=VhdlDocGen::GENERIC;parse_sec=GEN_SEC; + } + if (!hasError) { + + generic_clause(); + } + + break; + } + default: + jj_la1[85] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PORT_T:{if (!hasError) { + +currP=VhdlDocGen::PORT; + } + if (!hasError) { + + port_clause(); + } + + break; + } + default: + jj_la1[86] = jj_gen; + ; + } + } + + } + + +QCString VhdlParser::entity_name_list() {QCString s,s1; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER: + case CHARACTER_LITERAL:{if (!hasError) { + + while (!hasError) {if (!hasError) { + + s1 = entity_designator(); + } + if (!hasError) { + +s+=s1; + } + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER: + case CHARACTER_LITERAL:{ + ; + break; + } + default: + jj_la1[87] = jj_gen; + goto end_label_17; + } + } + end_label_17: ; + } + if (!hasError) { + +return s; + } + + break; + } + case OTHER_T:{if (!hasError) { + + jj_consume_token(OTHER_T); + } + if (!hasError) { + +return "other"; + } + + break; + } + case ALL_T:{if (!hasError) { + + jj_consume_token(ALL_T); + } + if (!hasError) { + +return "all"; + } + + break; + } + default: + jj_la1[88] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::entity_specification() {QCString s,s1;if (!hasError) { + + s = entity_name_list(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + s1 = entity_class(); + } + +return s+":"+s1; +assert(false); + } + + +void VhdlParser::entity_statement() { + if (jj_2_35(2147483647)) {if (!hasError) { + + concurrent_assertion_statement(); + } + + } else if (jj_2_36(2147483647)) {if (!hasError) { + + process_statement(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case POSTPONED_T: + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + concurrent_procedure_call_statement(); + } + + break; + } + default: + jj_la1[89] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + + +void VhdlParser::entity_statement_part() {if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ASSERT_T: + case POSTPONED_T: + case PROCESS_T: + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{ + ; + break; + } + default: + jj_la1[90] = jj_gen; + goto end_label_18; + }if (!hasError) { + + entity_statement(); + } + + } + end_label_18: ; + } + + } + + +QCString VhdlParser::entity_tag() {QCString s; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = name(); + } + if (!hasError) { + +return s; + } + + break; + } + case CHARACTER_LITERAL:{if (!hasError) { + + s = character_literal(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[91] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::enumeration_literal() {QCString s; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = identifier(); + } + if (!hasError) { + +return s; + } + + break; + } + case CHARACTER_LITERAL:{if (!hasError) { + + s = character_literal(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[92] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::enumeration_type_definition() {QCString s,s1;if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s = enumeration_literal(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[93] = jj_gen; + goto end_label_19; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + s1 = enumeration_literal(); + } + if (!hasError) { + +s+=",";s+=s1; + } + + } + end_label_19: ; + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + +return "("+s+")"; +assert(false); + } + + +QCString VhdlParser::exit_statement() {QCString s,s1,s2;Token *t=0;Token *t1=0;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + t = jj_consume_token(COLON_T); + } + + break; + } + default: + jj_la1[94] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(EXIT_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s1 = identifier(); + } + + break; + } + default: + jj_la1[95] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case WHEN_T:{if (!hasError) { + + t1 = jj_consume_token(WHEN_T); + } + if (!hasError) { + + s2 = condition(); + } + + break; + } + default: + jj_la1[96] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +lab.resize(0); + if(t) s+=":"; + if(t1) s2.prepend(" when "); + FlowChart::addFlowChart(FlowChart::EXIT_NO,"exit",s2.data(),s1.data()); + + return s+s1+s2+";"; +assert(false); + } + + +QCString VhdlParser::expression() {QCString s,s1,s2;if (!hasError) { + + s = relation(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case AND_T: + case NAND_T: + case NOR_T: + case OR_T: + case XOR_T: + case XNOR_T:{ + ; + break; + } + default: + jj_la1[97] = jj_gen; + goto end_label_20; + }if (!hasError) { + + s1 = logop(); + } + if (!hasError) { + + s2 = relation(); + } + if (!hasError) { + +s+=s1;s+=s2; + } + + } + end_label_20: ; + } + +return s; +assert(false); + } + + +QCString VhdlParser::logop() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case AND_T:{if (!hasError) { + + jj_consume_token(AND_T); + } + if (!hasError) { + +return "and" ; + } + + break; + } + case NAND_T:{if (!hasError) { + + jj_consume_token(NAND_T); + } + if (!hasError) { + +return "nand" ; + } + + break; + } + case NOR_T:{if (!hasError) { + + jj_consume_token(NOR_T); + } + if (!hasError) { + +return "nor" ; + } + + break; + } + case XNOR_T:{if (!hasError) { + + jj_consume_token(XNOR_T); + } + if (!hasError) { + +return "xnor" ; + } + + break; + } + case XOR_T:{if (!hasError) { + + jj_consume_token(XOR_T); + } + if (!hasError) { + +return "xor" ; + } + + break; + } + case OR_T:{if (!hasError) { + + jj_consume_token(OR_T); + } + if (!hasError) { + +return "or" ; + } + + break; + } + default: + jj_la1[98] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::extended_identifier() {Token *t;if (!hasError) { + + t = jj_consume_token(EXTENDED_CHARACTER); + } + +return t->image.c_str(); +assert(false); + } + + +QCString VhdlParser::factor() {QCString s,s1; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case NEW_T: + case NULL_T: + case LPAREN_T: + case SLSL_T: + case INTEGER: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER: + case CHARACTER_LITERAL: + case DECIMAL_LITERAL: + case BASED_LITERAL: + case BIT_STRING_LITERAL:{if (!hasError) { + + s = primary(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case DOUBLEMULT_T:{if (!hasError) { + + jj_consume_token(DOUBLEMULT_T); + } + if (!hasError) { + + s1 = primary(); + } + if (!hasError) { + +s+="**";s+=s1; + } + + break; + } + default: + jj_la1[99] = jj_gen; + ; + } + } + if (!hasError) { + +return s; + } + + break; + } + case ABS_T:{if (!hasError) { + + jj_consume_token(ABS_T); + } + if (!hasError) { + + s = primary(); + } + if (!hasError) { + +s1 = "abs "; return s1+s; + } + + break; + } + case NOT_T:{if (!hasError) { + + jj_consume_token(NOT_T); + } + if (!hasError) { + + s = primary(); + } + if (!hasError) { + +s1="not ";return s1+s; + } + + break; + } + default: + jj_la1[100] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::file_declaration() {QCString s,s1,s2,s3;if (!hasError) { + + jj_consume_token(FILE_T); + } + if (!hasError) { + + s = identifier_list(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + s2 = subtype_indication(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case IS_T: + case OPEN_T:{if (!hasError) { + + s3 = file_open_information(); + } + + break; + } + default: + jj_la1[101] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +QCString t1=s2+" "+s3; + addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,t1.data(),Public); + return " file "+s+":"+s2+" "+s3+";"; +assert(false); + } + + +QCString VhdlParser::file_logical_name() {QCString s;if (!hasError) { + + s = expression(); + } + +return s; +assert(false); + } + + +QCString VhdlParser::file_open_information() {QCString s,s1,s2;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case OPEN_T:{if (!hasError) { + + jj_consume_token(OPEN_T); + } + if (!hasError) { + + s = expression(); + } + + break; + } + default: + jj_la1[102] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + + s1 = file_logical_name(); + } + +s2="open "+s+" is "+s1; return s2; +assert(false); + } + + +QCString VhdlParser::file_type_definition() {QCString s,s1;if (!hasError) { + + jj_consume_token(FILE_T); + } + if (!hasError) { + + jj_consume_token(OF_T); + } + if (!hasError) { + + s = type_mark(); + } + +s1=" file of "+s; return s1; +assert(false); + } + + +QCString VhdlParser::floating_type_definition() {QCString s;if (!hasError) { + + s = range_constraint(); + } + +return s; +assert(false); + } + + +QCString VhdlParser::formal_designator() {QCString s;Token *tok; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = name(); + } + if (!hasError) { + +return s; + } + + break; + } + case INTEGER:{if (!hasError) { + + tok = jj_consume_token(INTEGER); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + default: + jj_la1[103] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::formal_parameter_list() {QCString s;if (!hasError) { + + s = interface_list(); + } + +return s; +assert(false); + } + + +QCString VhdlParser::formal_part() {QCString s,s1;if (!hasError) { + + s = name(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T:{if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + formal_designator(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + +s+"("+s1+")"; + } + + break; + } + default: + jj_la1[104] = jj_gen; + ; + } + } + +return s; +assert(false); + } + + +QCString VhdlParser::full_type_declaration() {QCString s,s1,s2;if (!hasError) { + + jj_consume_token(TYPE_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + + try {if (!hasError) { + + s2 = type_definition(); + } + + } catch ( ...) { +error_skipto(SEMI_T); + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +addVhdlType(s.data(),getLine(TYPE_T),Entry::VARIABLE_SEC,VhdlDocGen::TYPE,0,s2.data(),Public); + return "type "+s+" is "+s2+";"; +assert(false); + } + + +QCString VhdlParser::function_call() {QCString s,s1;if (!hasError) { + + s = name(); + } + if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = actual_parameter_part(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + +return s+"("+s1+")"; +assert(false); + } + + +void VhdlParser::generate_statement() {QCString s;if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + try {if (!hasError) { + + generate_scheme(); + } + if (!hasError) { + + jj_consume_token(GENERATE_T); + } + if (!hasError) { + +pushLabel(genLabels,s); + } + if (!hasError) { + + generate_statement_body1(); + } + if (!hasError) { + + jj_consume_token(END_T); + } + + } catch ( ...) { +error_skipto(GENERATE_T); + } + } + if (!hasError) { + + jj_consume_token(GENERATE_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + identifier(); + } + + break; + } + default: + jj_la1[105] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +genLabels=popLabel(genLabels); + } + + +void VhdlParser::generate_scheme() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FOR_T:{if (!hasError) { + + jj_consume_token(FOR_T); + } + if (!hasError) { + + parameter_specification(); + } + + break; + } + case IF_T:{if (!hasError) { + + jj_consume_token(IF_T); + } + if (!hasError) { + + condition(); + } + + break; + } + default: + jj_la1[106] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + + +void VhdlParser::generic_clause() {QCString s;if (!hasError) { + + jj_consume_token(GENERIC_T); + } + if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + +parse_sec=GEN_SEC; + } + if (!hasError) { + + s = generic_list(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +parse_sec=0; + } + + +QCString VhdlParser::generic_list() {QCString s;if (!hasError) { + + s = interface_list(); + } + +return s; +assert(false); + } + + +void VhdlParser::generic_map_aspect() {if (!hasError) { + + jj_consume_token(GENERIC_T); + } + if (!hasError) { + + jj_consume_token(MAP_T); + } + if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + association_list(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + + } + + +QCString VhdlParser::group_constituent() {QCString s; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = name(); + } + if (!hasError) { + +return s; + } + + break; + } + case CHARACTER_LITERAL:{if (!hasError) { + + s = character_literal(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[107] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::group_constituent_list() {QCString s,s1,s2;if (!hasError) { + if (!hasError) { + + s1 = group_constituent(); + } + + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[108] = jj_gen; + goto end_label_21; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + s = group_constituent(); + } + if (!hasError) { + +s2+=",";s2+=s1; + } + + } + end_label_21: ; + } + +return s+s2; +assert(false); + } + + +QCString VhdlParser::group_declaration() {QCString s,s1,s2;if (!hasError) { + + jj_consume_token(GROUP_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + s1 = identifier(); + } + if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s2 = group_constituent_list(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +return "group "+s+":"+s1+"("+s2+");"; +assert(false); + } + + +QCString VhdlParser::group_template_declaration() {QCString s,s1;if (!hasError) { + + jj_consume_token(GROUP_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = entity_class_entry_list(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +return "group "+s+ "is ("+s1+");"; +assert(false); + } + + +void VhdlParser::guarded_signal_specification() {if (!hasError) { + + signal_list(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + type_mark(); + } + + } + + +QCString VhdlParser::identifier() {Token *tok; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case EXTENDED_CHARACTER:{if (!hasError) { + + tok = jj_consume_token(EXTENDED_CHARACTER); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + case BASIC_IDENTIFIER:{if (!hasError) { + + tok = jj_consume_token(BASIC_IDENTIFIER); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + default: + jj_la1[109] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::identifier_list() {QCString str,str1;if (!hasError) { + + str = identifier(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[110] = jj_gen; + goto end_label_22; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + str1 = identifier(); + } + if (!hasError) { + +str+=",";str+=str1; + } + + } + end_label_22: ; + } + +return str; +assert(false); + } + + +void VhdlParser::if_statement() {QCString s,s1;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + + break; + } + default: + jj_la1[111] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(IF_T); + } + if (!hasError) { + + s = condition(); + } + if (!hasError) { + + jj_consume_token(THEN_T); + } + if (!hasError) { + +s.prepend("if "); + FlowChart::addFlowChart(FlowChart::IF_NO,0,s); + } + if (!hasError) { + + sequence_of_statement(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ELSIF_T:{ + ; + break; + } + default: + jj_la1[112] = jj_gen; + goto end_label_23; + }if (!hasError) { + + jj_consume_token(ELSIF_T); + } + if (!hasError) { + + s1 = condition(); + } + if (!hasError) { + + jj_consume_token(THEN_T); + } + if (!hasError) { + +s1.prepend("elsif "); + FlowChart::addFlowChart(FlowChart::ELSIF_NO,0,s1.data()); + } + if (!hasError) { + + sequence_of_statement(); + } + + } + end_label_23: ; + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ELSE_T:{if (!hasError) { + + jj_consume_token(ELSE_T); + } + if (!hasError) { + +FlowChart::addFlowChart(FlowChart::ELSE_NO,0,0); + } + if (!hasError) { + + sequence_of_statement(); + } + + break; + } + default: + jj_la1[113] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + jj_consume_token(IF_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + identifier(); + } + + break; + } + default: + jj_la1[114] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +FlowChart::moveToPrevLevel(); + FlowChart::addFlowChart(FlowChart::ENDIF_NO,0,0); + } + + +QCString VhdlParser::incomplete_type_declaration() {QCString s;if (!hasError) { + + jj_consume_token(TYPE_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +return "type "+s+";"; +assert(false); + } + + +QCString VhdlParser::index_constraint() {QCString s="("; QCString s1,s2;if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s2 = discrete_range(); + } + if (!hasError) { + +s+=s2; + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[115] = jj_gen; + goto end_label_24; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + s1 = discrete_range(); + } + if (!hasError) { + +s+=",";s+=s1; + } + + } + end_label_24: ; + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + +return s+")"; +assert(false); + } + + +QCString VhdlParser::index_specification() {QCString s; + if (jj_2_37(2147483647)) {if (!hasError) { + + s = discrete_range(); + } + if (!hasError) { + +return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ABS_T: + case NEW_T: + case NOT_T: + case NULL_T: + case LPAREN_T: + case PLUS_T: + case MINUS_T: + case SLSL_T: + case INTEGER: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER: + case CHARACTER_LITERAL: + case DECIMAL_LITERAL: + case BASED_LITERAL: + case BIT_STRING_LITERAL:{if (!hasError) { + + s = expression(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[116] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } +assert(false); + } + + +QCString VhdlParser::index_subtype_definition() {QCString s;if (!hasError) { + + s = type_mark(); + } + if (!hasError) { + + jj_consume_token(RANGE_T); + } + if (!hasError) { + + jj_consume_token(BOX_T); + } + +return s+" range <> "; +assert(false); + } + + +QCString VhdlParser::instantiation_unit() {QCString s,s1,s2;Token *tok; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMPONENT_T: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMPONENT_T:{if (!hasError) { + + tok = jj_consume_token(COMPONENT_T); + } + + break; + } + default: + jj_la1[117] = jj_gen; + ; + } + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + +s1="component"; return s; + } + + break; + } + case ENTITY_T:{if (!hasError) { + + tok = jj_consume_token(ENTITY_T); + } + if (!hasError) { + + s2 = name(); + } + if (!hasError) { + +s=tok->image.c_str()+s2; + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T:{if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = identifier(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + +s+="(";s+=s1;s+=")" ; + } + + break; + } + default: + jj_la1[118] = jj_gen; + ; + } + } + if (!hasError) { + +return s; + } + + break; + } + case CONFIGURATION_T:{if (!hasError) { + + jj_consume_token(CONFIGURATION_T); + } + if (!hasError) { + + s = name(); + } + if (!hasError) { + +s1="configuration ";return s; + } + + break; + } + default: + jj_la1[119] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::instantiation_list() {QCString s;Token *tok; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = identifier_list(); + } + if (!hasError) { + +return s; + } + + break; + } + case OTHER_T:{if (!hasError) { + + tok = jj_consume_token(OTHER_T); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + case ALL_T:{if (!hasError) { + + tok = jj_consume_token(ALL_T); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + default: + jj_la1[120] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::integer() {Token *t;if (!hasError) { + + t = jj_consume_token(INTEGER); + } + +return t->image.c_str(); +assert(false); + } + + +QCString VhdlParser::integer_type_definition() {QCString s;if (!hasError) { + + s = range_constraint(); + } + +return s; +assert(false); + } + + +QCString VhdlParser::interface_declaration() {QCString s,s1; + if (jj_2_38(5)) {if (!hasError) { + + s = interface_subprogram_declaration(); + } + if (!hasError) { + +return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PACKAGE_T:{if (!hasError) { + + interface_package_declaration(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[121] = jj_gen; + if (jj_2_39(5)) {if (!hasError) { + + s = interface_variable_declaration(); + } + if (!hasError) { + +return s; + } + + } else if (jj_2_40(5)) {if (!hasError) { + + interface_file_declaration(); + } + if (!hasError) { + +return s; + } + + } else if (jj_2_41(2147483647)) {if (!hasError) { + + subprogram_declaration(); + } + if (!hasError) { + +return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case CONSTANT_T: + case FILE_T: + case SIGNAL_T: + case SHARED_T: + case TYPE_T: + case VARIABLE_T:{if (!hasError) { + + s = object_class(); + } + if (!hasError) { + + s1 = identifier(); + } + if (!hasError) { + +if (parse_sec==GEN_SEC) + addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,currP,s1.data(),0,Public); + return s; + } + + break; + } + default: + jj_la1[122] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + } +assert(false); + } + + +QCString VhdlParser::interface_element() {QCString s;if (!hasError) { + + s = interface_declaration(); + } + +return s; +assert(false); + } + + +QCString VhdlParser::interface_file_declaration() {QCString s,s1;if (!hasError) { + + jj_consume_token(FILE_T); + } + if (!hasError) { + + s = identifier_list(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + s1 = subtype_indication(); + } + +addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,s1.data(),Public); + return " file "+s+":"+s1; +assert(false); + } + + +QCString VhdlParser::interface_list() {QCString s,s1,s2;if (!hasError) { + + s = interface_element(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SEMI_T:{ + ; + break; + } + default: + jj_la1[123] = jj_gen; + goto end_label_25; + }if (!hasError) { + + jj_consume_token(SEMI_T); + } + if (!hasError) { + + s1 = interface_element(); + } + if (!hasError) { + +s2+=";";s2+=s1; + } + + } + end_label_25: ; + } + +return s+s2; +assert(false); + } + + +QCString VhdlParser::interface_variable_declaration() {Token *tok=0;Token *tok1=0;Token *tok2=0;QCString s,s1,s2,s3,s4,s5;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case CONSTANT_T: + case SIGNAL_T: + case SHARED_T: + case VARIABLE_T:{if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case VARIABLE_T:{if (!hasError) { + + tok = jj_consume_token(VARIABLE_T); + } + + break; + } + case SIGNAL_T:{if (!hasError) { + + tok = jj_consume_token(SIGNAL_T); + } + + break; + } + case CONSTANT_T:{if (!hasError) { + + tok = jj_consume_token(CONSTANT_T); + } + + break; + } + case SHARED_T:{if (!hasError) { + + tok = jj_consume_token(SHARED_T); + } + + break; + } + default: + jj_la1[124] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + + break; + } + default: + jj_la1[125] = jj_gen; + ; + } + } + if (!hasError) { + + s = identifier_list(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BUFFER_T: + case IN_T: + case INOUT_T: + case LINKAGE_T: + case OUT_T:{if (!hasError) { + + s1 = mode(); + } + + break; + } + default: + jj_la1[126] = jj_gen; + ; + } + } + if (!hasError) { + + s2 = subtype_indication(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BUS_T:{if (!hasError) { + + tok1 = jj_consume_token(BUS_T); + } + + break; + } + default: + jj_la1[127] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case VARASSIGN_T:{if (!hasError) { + + tok2 = jj_consume_token(VARASSIGN_T); + } + if (!hasError) { + + s4 = expression(); + } + + break; + } + default: + jj_la1[128] = jj_gen; + ; + } + } + +if(tok) + s5=tok->image.c_str(); + + if(tok1) + s3=tok->image.data(); + + if(tok2) + s3+=":="; + + QCString it=s+":"+s1+" "+s2+" "+s3+" "+s4; + if (currP!=VhdlDocGen::COMPONENT) + { + if (currP==VhdlDocGen::FUNCTION || currP==VhdlDocGen::PROCEDURE) + { + addProto(s5.data(),s.data(),s1.data(),s2.data(),s3.data(),s4.data()); + } + else + { + QCString i=s2+s3+s4; + if (currP==VhdlDocGen::GENERIC && param_sec==0) + addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,currP,i.data(),s1.data(),Public); + else if(parse_sec != GEN_SEC) + addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,currP,i.data(),s1.data(),Public); + } + // fprintf(stderr,"\n\n <<port %s >>\n",$$.data()); + } // if component + return it; +assert(false); + } + + +QCString VhdlParser::iteration_scheme() {QCString s; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case WHILE_T:{if (!hasError) { + + jj_consume_token(WHILE_T); + } + if (!hasError) { + + s = condition(); + } + if (!hasError) { + +s.prepend("while "); + FlowChart::addFlowChart(FlowChart::WHILE_NO,0,s.data(),lab.data()); + lab=""; + return s; + } + + break; + } + case FOR_T:{if (!hasError) { + + jj_consume_token(FOR_T); + } + if (!hasError) { + + s = parameter_specification(); + } + if (!hasError) { + +QCString q=lab+" for "+s; + FlowChart::addFlowChart(FlowChart::FOR_NO,0,q.data(),lab.data()); + lab=""; + return q; + } + + break; + } + default: + jj_la1[129] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::label() {QCString s;if (!hasError) { + + s = identifier(); + } + +return s; +assert(false); + } + + +QCString VhdlParser::library_clause() {QCString s;if (!hasError) { + if (!hasError) { + + jj_consume_token(LIBRARY_T); + } + if (!hasError) { + + s = identifier_list(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + +if ( parse_sec==0 && Config_getBool("SHOW_INCLUDE_FILES") ) + { + addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,s.data(),"_library_",Public); + } + QCString s1="library "+s; + return s1; +assert(false); + } + + +QCString VhdlParser::library_unit() {QCString s; + if (jj_2_42(2)) {if (!hasError) { + + primary_unit(); + } + if (!hasError) { + +return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ARCHITECTURE_T: + case PACKAGE_T:{if (!hasError) { + + secondary_unit(); + } + if (!hasError) { + +return s; + } + + break; + } + case CONTEXT_T:{if (!hasError) { + + context_declaration(); + } + + break; + } + default: + jj_la1[130] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } +assert(false); + } + + +QCString VhdlParser::literal() {QCString s; + if (jj_2_43(2147483647)) {if (!hasError) { + + s = bit_string_literal(); + } + if (!hasError) { + +return s; + } + + } else if (jj_2_44(2147483647)) {if (!hasError) { + + s = numeric_literal(); + } + if (!hasError) { + +return s; + } + + } else if (jj_2_45(2147483647)) {if (!hasError) { + + s = enumeration_literal(); + } + if (!hasError) { + +return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case STRINGLITERAL:{if (!hasError) { + + s = string_literal(); + } + if (!hasError) { + +return s; + } + + break; + } + case NULL_T:{if (!hasError) { + + jj_consume_token(NULL_T); + } + if (!hasError) { + +return "null"; + } + + break; + } + default: + jj_la1[131] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } +assert(false); + } + + +QCString VhdlParser::logical_operator() {QCString s;if (!hasError) { + + s = logop(); + } + +return s; +assert(false); + } + + +QCString VhdlParser::loop_statement() {QCString s,s1,s2,s3;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + +s+=":"; + } + + break; + } + default: + jj_la1[132] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FOR_T: + case WHILE_T:{if (!hasError) { + + s1 = iteration_scheme(); + } + + break; + } + default: + jj_la1[133] = jj_gen; + ; + } + } + if (!hasError) { + +if(s1.isEmpty()) + FlowChart::addFlowChart(FlowChart::LOOP_NO,0,"infinite"); + } + if (!hasError) { + + jj_consume_token(LOOP_T); + } + if (!hasError) { + + s2 = sequence_of_statement(); + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + jj_consume_token(LOOP_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s3 = identifier(); + } + + break; + } + default: + jj_la1[134] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +QCString q = s+" loop "+s2+" end loop" +s3; + QCString endLoop="end loop" + s3; + FlowChart::moveToPrevLevel(); + FlowChart::addFlowChart(FlowChart::END_LOOP,endLoop.data(),0); + return q; +assert(false); + } + + +QCString VhdlParser::miscellaneous_operator() {Token *t=0; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case DOUBLEMULT_T:{if (!hasError) { + + jj_consume_token(DOUBLEMULT_T); + } + if (!hasError) { + +return "**"; + } + + break; + } + case ABS_T:{if (!hasError) { + + jj_consume_token(ABS_T); + } + if (!hasError) { + +return "abs"; + } + + break; + } + case NOT_T:{if (!hasError) { + + jj_consume_token(NOT_T); + } + if (!hasError) { + +return "not"; + } + + break; + } + default: + jj_la1[135] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::mode() {Token *tok; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case IN_T:{if (!hasError) { + + tok = jj_consume_token(IN_T); + } + if (!hasError) { + +return "in"; + } + + break; + } + case OUT_T:{if (!hasError) { + + tok = jj_consume_token(OUT_T); + } + if (!hasError) { + +return "out"; + } + + break; + } + case INOUT_T:{if (!hasError) { + + tok = jj_consume_token(INOUT_T); + } + if (!hasError) { + +return "inout"; + } + + break; + } + case BUFFER_T:{if (!hasError) { + + tok = jj_consume_token(BUFFER_T); + } + if (!hasError) { + +return "buffer"; + } + + break; + } + case LINKAGE_T:{if (!hasError) { + + tok = jj_consume_token(LINKAGE_T); + } + if (!hasError) { + +return "linkage"; + } + + break; + } + default: + jj_la1[136] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::multiplying_operation() {Token *tok; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case MULT_T:{if (!hasError) { + + tok = jj_consume_token(MULT_T); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + case SLASH_T:{if (!hasError) { + + tok = jj_consume_token(SLASH_T); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + case MOD_T:{if (!hasError) { + + tok = jj_consume_token(MOD_T); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + case REM_T:{if (!hasError) { + + tok = jj_consume_token(REM_T); + } + if (!hasError) { + +return tok->image.c_str(); + } + + break; + } + default: + jj_la1[137] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::name() {QCString s,s1;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case STRINGLITERAL:{if (!hasError) { + + s = operator_symbol(); + } + + break; + } + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = identifier(); + } + + break; + } + case SLSL_T:{if (!hasError) { + + s = external_name(); + } + + break; + } + default: + jj_la1[138] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + if (!hasError) { + + if (jj_2_46(2147483647)) {if (!hasError) { + + s1 = name_ext1(); + } + if (!hasError) { + +s+=s1; + } + + } else { + ; + } + } + +return s; +assert(false); + } + + +QCString VhdlParser::name_ext1() {QCString s,s1,s2;if (!hasError) { + + s = name_ext(); + } + if (!hasError) { + + while (!hasError) { + if (jj_2_47(2147483647)) { + ; + } else { + goto end_label_26; + }if (!hasError) { + + s1 = name_ext(); + } + if (!hasError) { + +s+=s1; + } + + } + end_label_26: ; + } + +return s; +assert(false); + } + + +QCString VhdlParser::name_ext() {QCString s,s1,s2;if (!hasError) { + + if (jj_2_48(2147483647)) {if (!hasError) { + + jj_consume_token(DOT_T); + } + if (!hasError) { + + s1 = suffix(); + } + if (!hasError) { + +s+=".";s+=s1; + } + + } else if (jj_2_49(2147483647)) {if (!hasError) { + + s1 = test_att_name(); + } + if (!hasError) { + +s+=s1; + } + + } else if (jj_2_50(2147483647)) {if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = discrete_range(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + +s+="(";s+=s1;s+=")"; + } + + } else if (jj_2_51(2147483647)) {if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = expression(); + } + if (!hasError) { + +s+="(";s+=s1; + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[139] = jj_gen; + goto end_label_27; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + s1 = expression(); + } + if (!hasError) { + +s+=",";s+=s1; + } + + } + end_label_27: ; + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + +s+=")"; + } + + } else { + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + +return s; +assert(false); + } + + +QCString VhdlParser::test_att_name() {QCString s,s1;if (!hasError) { + + if (jj_2_52(2147483647)) {if (!hasError) { + + s1 = signature(); + } + if (!hasError) { + +s=s1; + } + + } else { + ; + } + } + if (!hasError) { + + jj_consume_token(APOSTROPHE_T); + } + if (!hasError) { + + s1 = attribute_designator(); + } + if (!hasError) { + +s+="'";s+=s1; + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T:{if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = expression(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + +s+="(";s+=s1;s+=")"; + } + + break; + } + default: + jj_la1[140] = jj_gen; + ; + } + } + +return s; +assert(false); + } + + +QCString VhdlParser::indexed_name() {QCString s,s1,s2;if (!hasError) { + + s2 = identifier(); + } + if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = expression(); + } + if (!hasError) { + +s=s2+"("+s1; + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[141] = jj_gen; + goto end_label_28; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + s1 = expression(); + } + if (!hasError) { + +s+=",";s+=s1; + } + + } + end_label_28: ; + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + +return s+")"; +assert(false); + } + + +QCString VhdlParser::next_statement() {QCString s,s1,s2;Token *t=0;Token *t1=0;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + t = jj_consume_token(COLON_T); + } + + break; + } + default: + jj_la1[142] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(NEXT_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s1 = identifier(); + } + + break; + } + default: + jj_la1[143] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case WHEN_T:{if (!hasError) { + + t1 = jj_consume_token(WHEN_T); + } + if (!hasError) { + + s2 = condition(); + } + + break; + } + default: + jj_la1[144] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +if(t) s+=":"; + FlowChart::addFlowChart(FlowChart::NEXT_NO,"next ",s2.data(),s1.data()); + lab.resize(0); + if(t1) s2.prepend("when "); + return s+s1+s2+";"; +assert(false); + } + + +QCString VhdlParser::null_statement() {QCString s;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + +s+=":"; + } + + break; + } + default: + jj_la1[145] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(NULL_T); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +return s+="null"; +assert(false); + } + + +QCString VhdlParser::numeric_literal() {QCString s; + if (jj_2_53(2147483647)) {if (!hasError) { + + s = physical_literal(); + } + if (!hasError) { + +return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case INTEGER: + case DECIMAL_LITERAL: + case BASED_LITERAL:{if (!hasError) { + + s = abstract_literal(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[146] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } +assert(false); + } + + +QCString VhdlParser::object_class() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case CONSTANT_T:{if (!hasError) { + + jj_consume_token(CONSTANT_T); + } + if (!hasError) { + +return "constant"; + } + + break; + } + case SIGNAL_T:{if (!hasError) { + + jj_consume_token(SIGNAL_T); + } + if (!hasError) { + +return "signal"; + } + + break; + } + case VARIABLE_T:{if (!hasError) { + + jj_consume_token(VARIABLE_T); + } + if (!hasError) { + +return "variable"; + } + + break; + } + case SHARED_T:{if (!hasError) { + + jj_consume_token(SHARED_T); + } + if (!hasError) { + + jj_consume_token(VARIABLE_T); + } + if (!hasError) { + +return "shared variable"; + } + + break; + } + case FILE_T:{if (!hasError) { + + jj_consume_token(FILE_T); + } + if (!hasError) { + +return "file"; + } + + break; + } + case TYPE_T:{if (!hasError) { + + jj_consume_token(TYPE_T); + } + if (!hasError) { + +return "type"; + } + + break; + } + default: + jj_la1[147] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::operator_symbol() {Token *tok;if (!hasError) { + + tok = jj_consume_token(STRINGLITERAL); + } + +return tok->image.c_str(); +assert(false); + } + + +void VhdlParser::options() {if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GUARDED_T:{if (!hasError) { + + jj_consume_token(GUARDED_T); + } + + break; + } + default: + jj_la1[148] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case INERTIAL_T: + case REJECT_T: + case TRANSPORT_T:{if (!hasError) { + + delay_mechanism(); + } + + break; + } + default: + jj_la1[149] = jj_gen; + ; + } + } + + } + + +void VhdlParser::package_body() {QCString s;if (!hasError) { + + jj_consume_token(PACKAGE_T); + } + if (!hasError) { + + jj_consume_token(BODY_T); + } + if (!hasError) { + + s = name(); + } + if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + +lastCompound=current; + s.prepend("_"); + addVhdlType(s,getLine(),Entry::CLASS_SEC,VhdlDocGen::PACKAGE_BODY,0,0,Protected); + } + if (!hasError) { + + package_body_declarative_part(); + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PACKAGE_T:{if (!hasError) { + + jj_consume_token(PACKAGE_T); + } + if (!hasError) { + + jj_consume_token(BODY_T); + } + + break; + } + default: + jj_la1[150] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + name(); + } + + break; + } + default: + jj_la1[151] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +lastCompound=0; genLabels.resize(0); + } + + +void VhdlParser::package_body_declarative_item() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FUNCTION_T: + case IMPURE_T: + case PROCEDURE_T: + case PURE_T:{if (!hasError) { + + subprogram_declaration(); + } + + break; + } + case TYPE_T:{if (!hasError) { + + type_declaration(); + } + + break; + } + case SUBTYPE_T:{if (!hasError) { + + subtype_declaration(); + } + + break; + } + case CONSTANT_T:{if (!hasError) { + + constant_declaration(); + } + + break; + } + case SHARED_T: + case VARIABLE_T:{if (!hasError) { + + variable_declaration(); + } + + break; + } + case FILE_T:{if (!hasError) { + + file_declaration(); + } + + break; + } + case ALIAS_T:{if (!hasError) { + + alias_declaration(); + } + + break; + } + case USE_T:{if (!hasError) { + + use_clause(); + } + + break; + } + default: + jj_la1[152] = jj_gen; + if (jj_2_54(3)) {if (!hasError) { + + group_template_declaration(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GROUP_T:{if (!hasError) { + + group_declaration(); + } + + break; + } + default: + jj_la1[153] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + } + + +void VhdlParser::package_body_declarative_part() {if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ALIAS_T: + case CONSTANT_T: + case FILE_T: + case FUNCTION_T: + case GROUP_T: + case IMPURE_T: + case PROCEDURE_T: + case PURE_T: + case SHARED_T: + case SUBTYPE_T: + case TYPE_T: + case USE_T: + case VARIABLE_T:{ + ; + break; + } + default: + jj_la1[154] = jj_gen; + goto end_label_29; + }if (!hasError) { + + package_body_declarative_item(); + } + + } + end_label_29: ; + } + + } + + +void VhdlParser::package_declaration() {QCString s;if (!hasError) { + + jj_consume_token(PACKAGE_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + +lastCompound=current; + Entry *clone=new Entry(*current); + clone->section=Entry::NAMESPACE_SEC; + clone->spec=VhdlDocGen::PACKAGE; + clone->name=s; + clone->startLine=getLine(); + clone->bodyLine=getLine(); + clone->protection=Package; + current_root->addSubEntry(clone); + addVhdlType(s,getLine(),Entry::CLASS_SEC,VhdlDocGen::PACKAGE,0,0,Package); + } + if (!hasError) { + + package_declarative_part(); + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PACKAGE_T:{if (!hasError) { + + jj_consume_token(PACKAGE_T); + } + + break; + } + default: + jj_la1[155] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + name(); + } + + break; + } + default: + jj_la1[156] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +lastEntity=0;lastCompound=0; genLabels.resize(0); + } + + +void VhdlParser::geninter() {if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GENERIC_T:{if (!hasError) { + + gen_interface_list(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GENERIC_T:{if (!hasError) { + + gen_assoc_list(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + break; + } + default: + jj_la1[157] = jj_gen; + ; + } + } + + break; + } + default: + jj_la1[158] = jj_gen; + ; + } + } + + } + + +void VhdlParser::package_declarative_item() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FUNCTION_T: + case IMPURE_T: + case PROCEDURE_T: + case PURE_T:{if (!hasError) { + + subprogram_declaration(); + } + + break; + } + case TYPE_T:{if (!hasError) { + + type_declaration(); + } + + break; + } + case SUBTYPE_T:{if (!hasError) { + + subtype_declaration(); + } + + break; + } + case CONSTANT_T:{if (!hasError) { + + constant_declaration(); + } + + break; + } + case SIGNAL_T:{if (!hasError) { + + signal_declaration(); + } + + break; + } + case SHARED_T: + case VARIABLE_T:{if (!hasError) { + + variable_declaration(); + } + + break; + } + case FILE_T:{if (!hasError) { + + file_declaration(); + } + + break; + } + case ALIAS_T:{if (!hasError) { + + alias_declaration(); + } + + break; + } + case COMPONENT_T:{if (!hasError) { + + component_declaration(); + } + + break; + } + default: + jj_la1[159] = jj_gen; + if (jj_2_55(2147483647)) {if (!hasError) { + + attribute_declaration(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ATTRIBUTE_T:{if (!hasError) { + + attribute_specification(); + } + + break; + } + case DISCONNECT_T:{if (!hasError) { + + disconnection_specification(); + } + + break; + } + case USE_T:{if (!hasError) { + + use_clause(); + } + + break; + } + default: + jj_la1[160] = jj_gen; + if (jj_2_56(3)) {if (!hasError) { + + group_template_declaration(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GROUP_T:{if (!hasError) { + + group_declaration(); + } + + break; + } + default: + jj_la1[161] = jj_gen; + if (jj_2_57(5)) {if (!hasError) { + + package_instantiation_declaration(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PACKAGE_T:{if (!hasError) { + + package_declaration(); + } + + break; + } + default: + jj_la1[162] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + } + } + } + } + } + + +void VhdlParser::package_declarative_part() {if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ALIAS_T: + case ATTRIBUTE_T: + case COMPONENT_T: + case CONSTANT_T: + case DISCONNECT_T: + case FILE_T: + case FUNCTION_T: + case GROUP_T: + case IMPURE_T: + case PACKAGE_T: + case PROCEDURE_T: + case PURE_T: + case SIGNAL_T: + case SHARED_T: + case SUBTYPE_T: + case TYPE_T: + case USE_T: + case VARIABLE_T:{ + ; + break; + } + default: + jj_la1[163] = jj_gen; + goto end_label_30; + }if (!hasError) { + + package_declarative_item(); + } + + } + end_label_30: ; + } + + } + + +QCString VhdlParser::parameter_specification() {QCString s,s1;if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(IN_T); + } + if (!hasError) { + + s1 = discrete_range(); + } + +return s+" in "+s1; +assert(false); + } + + +QCString VhdlParser::physical_literal() {QCString s,s1;if (!hasError) { + + if (jj_2_58(2147483647)) {if (!hasError) { + + s = abstract_literal(); + } + + } else { + ; + } + } + if (!hasError) { + + s1 = name(); + } + +s+=" ";s+=s1;s.prepend(" "); return s; +assert(false); + } + + +QCString VhdlParser::physical_type_definition() {QCString s,s1,s2;if (!hasError) { + + jj_consume_token(UNITS_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{ + ; + break; + } + default: + jj_la1[164] = jj_gen; + goto end_label_31; + }if (!hasError) { + + s1 = secondary_unit_declaration(); + } + if (!hasError) { + +s2+=s1;s2+="#"; + } + + } + end_label_31: ; + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + jj_consume_token(UNITS_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + name(); + } + + break; + } + default: + jj_la1[165] = jj_gen; + ; + } + } + +current->args=s2; + current->args.prepend("units"); + current->spec=VhdlDocGen::UNITS; + return s2; +assert(false); + } + + +void VhdlParser::port_clause() {if (!hasError) { + + jj_consume_token(PORT_T); + } + if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + port_list(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +currP=0; + } + + +QCString VhdlParser::port_list() {QCString s;if (!hasError) { + + s = interface_list(); + } + +return s; +assert(false); + } + + +void VhdlParser::port_map_aspect() {if (!hasError) { + + jj_consume_token(PORT_T); + } + if (!hasError) { + + jj_consume_token(MAP_T); + } + if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + association_list(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + + } + + +QCString VhdlParser::primary() {QCString s,s1; + if (jj_2_59(2147483647)) {if (!hasError) { + + s = function_call(); + } + if (!hasError) { + +return s; + } + + } else if (jj_2_60(2147483647)) {if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = expression(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + +s="("+s1+")"; return s; + } + + } else if (jj_2_61(2147483647)) {if (!hasError) { + + s = qualified_expression(); + } + if (!hasError) { + +return s; + } + + } else if (jj_2_62(2147483647)) {if (!hasError) { + + s = type_conversion(); + } + if (!hasError) { + +return s; + } + + } else if (jj_2_63(2147483647)) {if (!hasError) { + + s = literal(); + } + if (!hasError) { + +s.prepend(" ");return s; + } + + } else if (jj_2_64(2147483647)) {if (!hasError) { + + s = name(); + } + if (!hasError) { + +return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case NEW_T:{if (!hasError) { + + allocator(); + } + if (!hasError) { + +return ""; + } + + break; + } + case LPAREN_T:{if (!hasError) { + + s = aggregate(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[166] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } +assert(false); + } + + +void VhdlParser::primary_unit() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ENTITY_T:{if (!hasError) { + + entity_declaration(); + } + + break; + } + case CONFIGURATION_T:{if (!hasError) { + + configuration_declaration(); + } + + break; + } + default: + jj_la1[167] = jj_gen; + if (jj_2_65(2147483647)) {if (!hasError) { + + package_instantiation_declaration(); + } + + } else if (jj_2_66(4)) {if (!hasError) { + + interface_package_declaration(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PACKAGE_T:{if (!hasError) { + + package_declaration(); + } + + break; + } + default: + jj_la1[168] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + } + + +QCString VhdlParser::procedure_call() {QCString s,s1;if (!hasError) { + + s = name(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T:{if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = actual_parameter_part(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + +s1.prepend("("); s1.append(")"); + } + + break; + } + default: + jj_la1[169] = jj_gen; + ; + } + } + +return s+s1; +assert(false); + } + + +QCString VhdlParser::procedure_call_statement() {QCString s,s1;if (!hasError) { + + if (jj_2_67(2)) {if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + +s+=":"; + } + + } else { + ; + } + } + if (!hasError) { + + s1 = procedure_call(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +return s+s1+";"; +assert(false); + } + + +QCString VhdlParser::process_declarative_item() {QCString s; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FUNCTION_T: + case IMPURE_T: + case PROCEDURE_T: + case PURE_T:{if (!hasError) { + + subprogram_declaration(); + } + if (!hasError) { + +return ""; + } + + break; + } + case TYPE_T:{if (!hasError) { + + s = type_declaration(); + } + if (!hasError) { + +return s; + } + + break; + } + case SUBTYPE_T:{if (!hasError) { + + s = subtype_declaration(); + } + if (!hasError) { + +return s; + } + + break; + } + case CONSTANT_T:{if (!hasError) { + + s = constant_declaration(); + } + if (!hasError) { + +return s; + } + + break; + } + case SHARED_T: + case VARIABLE_T:{if (!hasError) { + + s = variable_declaration(); + } + if (!hasError) { + +return s; + } + + break; + } + case FILE_T:{if (!hasError) { + + s = file_declaration(); + } + if (!hasError) { + +return s; + } + + break; + } + case ALIAS_T:{if (!hasError) { + + s = alias_declaration(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[170] = jj_gen; + if (jj_2_68(3)) {if (!hasError) { + + s = attribute_declaration(); + } + if (!hasError) { + +return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ATTRIBUTE_T:{if (!hasError) { + + s = attribute_specification(); + } + if (!hasError) { + +return s; + } + + break; + } + case USE_T:{if (!hasError) { + + s = use_clause(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[171] = jj_gen; + if (jj_2_69(3)) {if (!hasError) { + + s = group_template_declaration(); + } + if (!hasError) { + +return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GROUP_T:{if (!hasError) { + + s = group_declaration(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[172] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + } + } +assert(false); + } + + +QCString VhdlParser::process_declarative_part() {QCString s,s1;if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ALIAS_T: + case ATTRIBUTE_T: + case CONSTANT_T: + case FILE_T: + case FUNCTION_T: + case GROUP_T: + case IMPURE_T: + case PROCEDURE_T: + case PURE_T: + case SHARED_T: + case SUBTYPE_T: + case TYPE_T: + case USE_T: + case VARIABLE_T:{ + ; + break; + } + default: + jj_la1[173] = jj_gen; + goto end_label_32; + }if (!hasError) { + + s1 = process_declarative_item(); + } + if (!hasError) { + +s+=s1; + } + + } + end_label_32: ; + } + +return s; +assert(false); + } + + +void VhdlParser::process_statement() {QCString s,s1,s2;Token *tok=0;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + + break; + } + default: + jj_la1[174] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case POSTPONED_T:{if (!hasError) { + + jj_consume_token(POSTPONED_T); + } + + break; + } + default: + jj_la1[175] = jj_gen; + ; + } + } + if (!hasError) { + +currP=VhdlDocGen::PROCESS; + current->startLine=getLine(); + current->bodyLine=getLine(); + } + if (!hasError) { + + jj_consume_token(PROCESS_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T:{if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ALL_T:{if (!hasError) { + + tok = jj_consume_token(ALL_T); + } + + break; + } + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s1 = sensitivity_list(); + } + + break; + } + default: + jj_la1[176] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + + break; + } + default: + jj_la1[177] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case IS_T:{if (!hasError) { + + jj_consume_token(IS_T); + } + + break; + } + default: + jj_la1[178] = jj_gen; + ; + } + } + if (!hasError) { + + s2 = process_declarative_part(); + } + if (!hasError) { + +if (s2.data()) + FlowChart::addFlowChart(FlowChart::VARIABLE_NO,s2.data(),0); + FlowChart::addFlowChart(FlowChart::BEGIN_NO,"BEGIN",0); + } + if (!hasError) { + + jj_consume_token(BEGIN_T); + } + if (!hasError) { + + process_statement_part(); + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case POSTPONED_T:{if (!hasError) { + + jj_consume_token(POSTPONED_T); + } + + break; + } + default: + jj_la1[179] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(PROCESS_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + identifier(); + } + + break; + } + default: + jj_la1[180] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +if(s.isEmpty()) + currName=VhdlDocGen::getProcessNumber(); + else + currName=s; + + current->name=currName; + tempEntry=current; + current->endBodyLine=getLine(); + currP=0; + if(tok) + s1=tok->image.data(); + createFunction(currName,VhdlDocGen::PROCESS,s1.data()); + createFlow(); + currName=""; + newEntry(); + } + + +void VhdlParser::process_statement_part() {if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ASSERT_T: + case CASE_T: + case EXIT_T: + case FOR_T: + case IF_T: + case LOOP_T: + case NEXT_T: + case NULL_T: + case REPORT_T: + case RETURN_T: + case WAIT_T: + case WHILE_T: + case WITH_T: + case LPAREN_T: + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{ + ; + break; + } + default: + jj_la1[181] = jj_gen; + goto end_label_33; + }if (!hasError) { + + sequential_statement(); + } + + } + end_label_33: ; + } + + } + + +QCString VhdlParser::qualified_expression() {QCString s,s1;if (!hasError) { + + s1 = identifier(); + } + if (!hasError) { + + jj_consume_token(APOSTROPHE_T); + } + if (!hasError) { + +s=s1+"'"; + } + if (!hasError) { + + if (jj_2_70(2147483647)) {if (!hasError) { + + s1 = aggregate(); + } + if (!hasError) { + +s+=s1; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T:{if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = expression(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + +s+="(";s+=s1;s+=")"; + } + + break; + } + default: + jj_la1[182] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + +return s; +assert(false); + } + + +QCString VhdlParser::range() {QCString s,s1,s2; + if (jj_2_71(2147483647)) {if (!hasError) { + + s = simple_expression(); + } + if (!hasError) { + + s1 = direction(); + } + if (!hasError) { + + s2 = simple_expression(); + } + if (!hasError) { + +return s+" "+s1+" "+s2; + } + + } else if (jj_2_72(2147483647)) {if (!hasError) { + + s = attribute_name(); + } + if (!hasError) { + +return s; + } + + } else { + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::range_constraint() {QCString s,s1;if (!hasError) { + + jj_consume_token(RANGE_T); + } + if (!hasError) { + + s = range(); + } + +return " range "+s; +assert(false); + } + + +void VhdlParser::record_type_definition() {if (!hasError) { + + jj_consume_token(RECORD_T); + } + if (!hasError) { + + while (!hasError) {if (!hasError) { + + element_declaration(); + } + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{ + ; + break; + } + default: + jj_la1[183] = jj_gen; + goto end_label_34; + } + } + end_label_34: ; + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + jj_consume_token(RECORD_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + name(); + } + + break; + } + default: + jj_la1[184] = jj_gen; + ; + } + } + + } + + +QCString VhdlParser::relation() {QCString s,s1,s2;if (!hasError) { + + s = shift_expression(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LESSTHAN_T: + case GREATERTHAN_T: + case LT_T: + case GT_T: + case EQU_T: + case NOTEQU_T:{if (!hasError) { + + s1 = relation_operator(); + } + if (!hasError) { + + s2 = shift_expression(); + } + + break; + } + default: + jj_la1[185] = jj_gen; + ; + } + } + +return s+s1+s2; +assert(false); + } + + +QCString VhdlParser::relation_operator() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LT_T:{if (!hasError) { + + jj_consume_token(LT_T); + } + if (!hasError) { + +return "<"; + } + + break; + } + case GT_T:{if (!hasError) { + + jj_consume_token(GT_T); + } + if (!hasError) { + +return ">"; + } + + break; + } + case EQU_T:{if (!hasError) { + + jj_consume_token(EQU_T); + } + if (!hasError) { + +return "="; + } + + break; + } + case GREATERTHAN_T:{if (!hasError) { + + jj_consume_token(GREATERTHAN_T); + } + if (!hasError) { + +return ">="; + } + + break; + } + case LESSTHAN_T:{if (!hasError) { + + jj_consume_token(LESSTHAN_T); + } + if (!hasError) { + +return "<="; + } + + break; + } + case NOTEQU_T:{if (!hasError) { + + jj_consume_token(NOTEQU_T); + } + if (!hasError) { + +return "/="; + } + + break; + } + default: + jj_la1[186] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::report_statement() {Token *t=0;Token *t1=0;QCString s,s1,s2;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + t = jj_consume_token(COLON_T); + } + + break; + } + default: + jj_la1[187] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(REPORT_T); + } + if (!hasError) { + + s1 = expression(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SEVERITY_T:{if (!hasError) { + + t1 = jj_consume_token(SEVERITY_T); + } + if (!hasError) { + + s2 = expression(); + } + + break; + } + default: + jj_la1[188] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +if(t) s.append(":"); + s1.prepend(" report "); + if(t1) s2.prepend(" severity "); + return s+s1+s2+";"; +assert(false); + } + + +QCString VhdlParser::return_statement() {QCString s,s1;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + +s+=":"; + } + + break; + } + default: + jj_la1[189] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(RETURN_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ABS_T: + case NEW_T: + case NOT_T: + case NULL_T: + case LPAREN_T: + case PLUS_T: + case MINUS_T: + case SLSL_T: + case INTEGER: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER: + case CHARACTER_LITERAL: + case DECIMAL_LITERAL: + case BASED_LITERAL: + case BIT_STRING_LITERAL:{if (!hasError) { + + s1 = expression(); + } + + break; + } + default: + jj_la1[190] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +return s+" return "+s1+";"; +assert(false); + } + + +QCString VhdlParser::scalar_type_definition() {QCString s,s1; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T:{if (!hasError) { + + s = enumeration_type_definition(); + } + if (!hasError) { + +return s; + } + + break; + } + case RANGE_T:{if (!hasError) { + + s = range_constraint(); + } + if (!hasError) { + + if (jj_2_73(2147483647)) {if (!hasError) { + + s1 = physical_type_definition(); + } + + } else { + ; + } + } + if (!hasError) { + +s+=" ";s+=s1;return s; + } + + break; + } + default: + jj_la1[191] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +void VhdlParser::secondary_unit() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ARCHITECTURE_T:{if (!hasError) { + + architecture_body(); + } + + break; + } + case PACKAGE_T:{if (!hasError) { + + package_body(); + } + + break; + } + default: + jj_la1[192] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + + +QCString VhdlParser::secondary_unit_declaration() {QCString s,s1;if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(EQU_T); + } + if (!hasError) { + + s1 = physical_literal(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +return s+"="+s1; +assert(false); + } + + +QCString VhdlParser::selected_name() {QCString s,s1;if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(DOT_T); + } + if (!hasError) { + + s1 = suffix(); + } + +return s+"."+s1; +assert(false); + } + + +void VhdlParser::selected_signal_assignment() {if (!hasError) { + + jj_consume_token(WITH_T); + } + if (!hasError) { + + expression(); + } + if (!hasError) { + + jj_consume_token(SELECT_T); + } + if (!hasError) { + + target(); + } + if (!hasError) { + + jj_consume_token(LESSTHAN_T); + } + if (!hasError) { + + options(); + } + if (!hasError) { + + selected_waveforms(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + + +void VhdlParser::selected_waveforms() {if (!hasError) { + + waveform(); + } + if (!hasError) { + + jj_consume_token(WHEN_T); + } + if (!hasError) { + + choices(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[193] = jj_gen; + goto end_label_35; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + waveform(); + } + if (!hasError) { + + jj_consume_token(WHEN_T); + } + if (!hasError) { + + choices(); + } + + } + end_label_35: ; + } + + } + + +QCString VhdlParser::sensitivity_clause() {QCString s;if (!hasError) { + + jj_consume_token(ON_T); + } + if (!hasError) { + + s = sensitivity_list(); + } + +s.prepend(" on "); + return s; +assert(false); + } + + +QCString VhdlParser::sensitivity_list() {QCString s,s1;if (!hasError) { + + s = name(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[194] = jj_gen; + goto end_label_36; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + s1 = name(); + } + if (!hasError) { + +s+=",";s+=s1; + } + + } + end_label_36: ; + } + +return s; +assert(false); + } + + +QCString VhdlParser::sequence_of_statement() {QCString s,s1;if (!hasError) { + + while (!hasError) { + if (jj_2_74(3)) { + ; + } else { + goto end_label_37; + }if (!hasError) { + + s1 = sequential_statement(); + } + if (!hasError) { + +s+=s1; + } + + } + end_label_37: ; + } + +return s; +assert(false); + } + + +QCString VhdlParser::sequential_statement() {QCString s; + if (jj_2_75(2147483647)) {if (!hasError) { + + s = signal_assignment_statement(); + } + if (!hasError) { + +FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s; + } + + } else if (jj_2_76(3)) {if (!hasError) { + + s = assertion_statement(); + } + if (!hasError) { + +FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s; + } + + } else if (jj_2_77(3)) {if (!hasError) { + + s = report_statement(); + } + if (!hasError) { + +FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s; + } + + } else if (jj_2_78(3)) {if (!hasError) { + + s = wait_statement(); + } + if (!hasError) { + +FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s; + } + + } else if (jj_2_79(2147483647)) {if (!hasError) { + + s = variable_assignment_statement(); + } + if (!hasError) { + +FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s; + } + + } else if (jj_2_80(3)) {if (!hasError) { + + s = procedure_call_statement(); + } + if (!hasError) { + +FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s; + } + + } else if (jj_2_81(3)) {if (!hasError) { + + if_statement(); + } + if (!hasError) { + +return s; + } + + } else if (jj_2_82(3)) {if (!hasError) { + + case_statement(); + } + if (!hasError) { + +return s; + } + + } else if (jj_2_83(3)) {if (!hasError) { + + loop_statement(); + } + if (!hasError) { + +return s; + } + + } else if (jj_2_84(3)) {if (!hasError) { + + s = next_statement(); + } + if (!hasError) { + +return s; + } + + } else if (jj_2_85(3)) {if (!hasError) { + + s = exit_statement(); + } + if (!hasError) { + +return s; + } + + } else if (jj_2_86(3)) {if (!hasError) { + + s = return_statement(); + } + if (!hasError) { + +FlowChart::addFlowChart(FlowChart::RETURN_NO,s.data(),0);return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case NULL_T: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = null_statement(); + } + if (!hasError) { + +FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s; + } + + break; + } + default: + jj_la1[195] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } +assert(false); + } + + +QCString VhdlParser::shift_expression() {QCString s,s1,s2;if (!hasError) { + + s = simple_expression(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ROL_T: + case ROR_T: + case SLA_T: + case SLL_T: + case SRA_T: + case SRL_T:{if (!hasError) { + + s1 = shift_operator(); + } + if (!hasError) { + + s2 = simple_expression(); + } + + break; + } + default: + jj_la1[196] = jj_gen; + ; + } + } + +return s+s1+s2; +assert(false); + } + + +QCString VhdlParser::shift_operator() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLL_T:{if (!hasError) { + + jj_consume_token(SLL_T); + } + if (!hasError) { + +return "sll"; + } + + break; + } + case SRL_T:{if (!hasError) { + + jj_consume_token(SRL_T); + } + if (!hasError) { + +return "srl"; + } + + break; + } + case SLA_T:{if (!hasError) { + + jj_consume_token(SLA_T); + } + if (!hasError) { + +return "sla"; + } + + break; + } + case SRA_T:{if (!hasError) { + + jj_consume_token(SRA_T); + } + if (!hasError) { + +return "sra"; + } + + break; + } + case ROL_T:{if (!hasError) { + + jj_consume_token(ROL_T); + } + if (!hasError) { + +return "rol"; + } + + break; + } + case ROR_T:{if (!hasError) { + + jj_consume_token(ROR_T); + } + if (!hasError) { + +return "ror"; + } + + break; + } + default: + jj_la1[197] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::sign() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PLUS_T:{if (!hasError) { + + jj_consume_token(PLUS_T); + } + if (!hasError) { + +return "+"; + } + + break; + } + case MINUS_T:{if (!hasError) { + + jj_consume_token(MINUS_T); + } + if (!hasError) { + +return "-"; + } + + break; + } + default: + jj_la1[198] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::signal_assignment_statement() {QCString s,s1,s2,s3; + if (jj_2_88(2147483647)) {if (!hasError) { + + conditional_signal_assignment_wave(); + } + if (!hasError) { + +return ""; + } + + } else if (jj_2_89(2147483647)) {if (!hasError) { + + selected_signal_assignment_wave(); + } + if (!hasError) { + +return ""; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T: + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + if (jj_2_87(2)) {if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + +s+=":"; + } + + } else { + ; + } + } + if (!hasError) { + + s1 = target(); + } + if (!hasError) { + + jj_consume_token(LESSTHAN_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case INERTIAL_T: + case REJECT_T: + case TRANSPORT_T:{if (!hasError) { + + s2 = delay_mechanism(); + } + + break; + } + default: + jj_la1[199] = jj_gen; + ; + } + } + if (!hasError) { + + s3 = waveform(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + if (!hasError) { + +return s+s1+"<="+s2+s3+";"; + } + + break; + } + default: + jj_la1[200] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } +assert(false); + } + + +void VhdlParser::semi() {if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + + +void VhdlParser::signal_declaration() {Token* tok=0;QCString s,s1,s2,s3,s4;if (!hasError) { + + jj_consume_token(SIGNAL_T); + } + if (!hasError) { + + s = identifier_list(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + s1 = subtype_indication(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BUS_T: + case REGISTER_T:{if (!hasError) { + + s2 = signal_kind(); + } + + break; + } + default: + jj_la1[201] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case VARASSIGN_T:{if (!hasError) { + + tok = jj_consume_token(VARASSIGN_T); + } + if (!hasError) { + + s3 = expression(); + } + + break; + } + default: + jj_la1[202] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +if(tok) + s3.prepend(":="); + s4=s1+s2+s3; + addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::SIGNAL,0,s4.data(),Public); + } + + +QCString VhdlParser::signal_kind() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case REGISTER_T:{if (!hasError) { + + jj_consume_token(REGISTER_T); + } + if (!hasError) { + +return "register"; + } + + break; + } + case BUS_T:{if (!hasError) { + + jj_consume_token(BUS_T); + } + if (!hasError) { + +return "bus"; + } + + break; + } + default: + jj_la1[203] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::signal_list() {QCString s,s1; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = name(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[204] = jj_gen; + goto end_label_38; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + s1 = name(); + } + if (!hasError) { + +s+=",";s+=s1; + } + + } + end_label_38: ; + } + + break; + } + case OTHER_T:{if (!hasError) { + + jj_consume_token(OTHER_T); + } + if (!hasError) { + +return "other"; + } + + break; + } + case ALL_T:{if (!hasError) { + + jj_consume_token(ALL_T); + } + if (!hasError) { + +return "all"; + } + + break; + } + default: + jj_la1[205] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::signature() {QCString s,s1,s2;if (!hasError) { + + jj_consume_token(LBRACKET_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = name(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[206] = jj_gen; + goto end_label_39; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + s1 = name(); + } + if (!hasError) { + +s+=",";s+=s1; + } + + } + end_label_39: ; + } + + break; + } + default: + jj_la1[207] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case RETURN_T:{if (!hasError) { + + jj_consume_token(RETURN_T); + } + if (!hasError) { + + s1 = name(); + } + if (!hasError) { + +s+="return ";s+=s1; + } + + break; + } + default: + jj_la1[208] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(RBRACKET_T); + } + +s1="["+s+"]";return s1; +assert(false); + } + + +QCString VhdlParser::simple_expression() {QCString s,s1,s2;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PLUS_T: + case MINUS_T:{if (!hasError) { + + s = sign(); + } + + break; + } + default: + jj_la1[209] = jj_gen; + ; + } + } + if (!hasError) { + + s1 = term(); + } + if (!hasError) { + +s+=s1; + } + if (!hasError) { + + while (!hasError) { + if (jj_2_90(2147483647)) { + ; + } else { + goto end_label_40; + }if (!hasError) { + + s1 = adding_operator(); + } + if (!hasError) { + + s2 = term(); + } + if (!hasError) { + +s+=s1;s+=s2; + } + + } + end_label_40: ; + } + +return s; +assert(false); + } + + +void VhdlParser::simple_name() {if (!hasError) { + + name(); + } + + } + + +QCString VhdlParser::slice_name() {QCString s,s1;if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = discrete_range(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + +return s+"("+s1+")"; +assert(false); + } + + +QCString VhdlParser::string_literal() {Token *tok;if (!hasError) { + + tok = jj_consume_token(STRINGLITERAL); + } + +return tok->image.c_str(); +assert(false); + } + + +void VhdlParser::subprogram_body() {QCString s;if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + + //try{ + s = subprogram_declarative_part(); + } + if (!hasError) { + +if (s.data()) + { + FlowChart::addFlowChart(FlowChart::VARIABLE_NO,s,0); + } + FlowChart::addFlowChart(FlowChart::BEGIN_NO,"BEGIN",0); + } + if (!hasError) { + + jj_consume_token(BEGIN_T); + } + if (!hasError) { + + subprogram_statement_part(); + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FUNCTION_T: + case PROCEDURE_T:{if (!hasError) { + + subprogram_kind(); + } + + break; + } + default: + jj_la1[210] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + designator(); + } + + break; + } + default: + jj_la1[211] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +tempEntry->endBodyLine=getLine(END_T); + createFlow(); + currP=0; + } + + +void VhdlParser::subprogram_declaration() { + if (jj_2_91(2147483647)) {if (!hasError) { + + subprogram_instantiation_declaration(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FUNCTION_T: + case IMPURE_T: + case PROCEDURE_T: + case PURE_T:{if (!hasError) { + + subprogram_specification(); + } + if (!hasError) { + + subprogram_1(); + } + if (!hasError) { + +currP=0; + } + + break; + } + default: + jj_la1[212] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + + +void VhdlParser::subprogram_1() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case IS_T:{if (!hasError) { + + subprogram_body(); + } + + break; + } + case SEMI_T:{if (!hasError) { + + jj_consume_token(SEMI_T); + } + + break; + } + default: + jj_la1[213] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + + +QCString VhdlParser::subprogram_declarative_item() {QCString s; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FUNCTION_T: + case IMPURE_T: + case PROCEDURE_T: + case PURE_T:{if (!hasError) { + + subprogram_declaration(); + } + if (!hasError) { + +return ""; + } + + break; + } + case TYPE_T:{if (!hasError) { + + s = type_declaration(); + } + if (!hasError) { + +return s; + } + + break; + } + case IS_T:{if (!hasError) { + + subprogram_body(); + } + if (!hasError) { + +return ""; + } + + break; + } + case SUBTYPE_T:{if (!hasError) { + + s = subtype_declaration(); + } + if (!hasError) { + +return s; + } + + break; + } + case CONSTANT_T:{if (!hasError) { + + s = constant_declaration(); + } + if (!hasError) { + +return s; + } + + break; + } + case SHARED_T: + case VARIABLE_T:{if (!hasError) { + + s = variable_declaration(); + } + if (!hasError) { + +return s; + } + + break; + } + case FILE_T:{if (!hasError) { + + s = file_declaration(); + } + if (!hasError) { + +return s; + } + + break; + } + case ALIAS_T:{if (!hasError) { + + s = alias_declaration(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[214] = jj_gen; + if (jj_2_92(2147483647)) {if (!hasError) { + + s = attribute_declaration(); + } + if (!hasError) { + +return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ATTRIBUTE_T:{if (!hasError) { + + s = attribute_specification(); + } + if (!hasError) { + +return s; + } + + break; + } + case USE_T:{if (!hasError) { + + s = use_clause(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[215] = jj_gen; + if (jj_2_93(3)) {if (!hasError) { + + s = group_template_declaration(); + } + if (!hasError) { + +return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GROUP_T:{if (!hasError) { + + s = group_declaration(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[216] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + } + } +assert(false); + } + + +QCString VhdlParser::subprogram_declarative_part() {QCString s,s1;if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ALIAS_T: + case ATTRIBUTE_T: + case CONSTANT_T: + case FILE_T: + case FUNCTION_T: + case GROUP_T: + case IMPURE_T: + case IS_T: + case PROCEDURE_T: + case PURE_T: + case SHARED_T: + case SUBTYPE_T: + case TYPE_T: + case USE_T: + case VARIABLE_T:{ + ; + break; + } + default: + jj_la1[217] = jj_gen; + goto end_label_41; + }if (!hasError) { + + s1 = subprogram_declarative_item(); + } + if (!hasError) { + +s+=s1; + } + + } + end_label_41: ; + } + +return s; +assert(false); + } + + +void VhdlParser::subprogram_kind() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FUNCTION_T:{if (!hasError) { + + jj_consume_token(FUNCTION_T); + } + + break; + } + case PROCEDURE_T:{if (!hasError) { + + jj_consume_token(PROCEDURE_T); + } + + break; + } + default: + jj_la1[218] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + + +void VhdlParser::subprogram_specification() {QCString s;Token *tok=0;Token *t; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PROCEDURE_T:{if (!hasError) { + + jj_consume_token(PROCEDURE_T); + } + if (!hasError) { + + s = designator(); + } + if (!hasError) { + +currP=VhdlDocGen::PROCEDURE; + createFunction(s.data(),currP,0); + tempEntry=current; + current->startLine=getLine(PROCEDURE_T); + current->bodyLine=getLine(PROCEDURE_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T:{if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + +param_sec=PARAM_SEC; + } + if (!hasError) { + + interface_list(); + } + if (!hasError) { + +param_sec=0; + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + + break; + } + default: + jj_la1[219] = jj_gen; + ; + } + } + if (!hasError) { + + if (jj_2_94(2)) {if (!hasError) { + + gen_interface_list(); + } + + } else { + ; + } + } + if (!hasError) { + + if (jj_2_95(2)) {if (!hasError) { + + gen_assoc_list(); + } + + } else { + ; + } + } + if (!hasError) { + + param(); + } + if (!hasError) { + +newEntry(); + } + + break; + } + case FUNCTION_T: + case IMPURE_T: + case PURE_T:{if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case IMPURE_T: + case PURE_T:{if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PURE_T:{if (!hasError) { + + tok = jj_consume_token(PURE_T); + } + + break; + } + case IMPURE_T:{if (!hasError) { + + tok = jj_consume_token(IMPURE_T); + } + + break; + } + default: + jj_la1[220] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + + break; + } + default: + jj_la1[221] = jj_gen; + ; + } + } + if (!hasError) { + + t = jj_consume_token(FUNCTION_T); + } + if (!hasError) { + + s = designator(); + } + if (!hasError) { + +currP=VhdlDocGen::FUNCTION; + if(tok) + createFunction(tok->image.c_str(),currP,s.data()); + else + createFunction(0,currP,s.data()); + tempEntry=current; + current->startLine=getLine(FUNCTION_T); + current->bodyLine=getLine(FUNCTION_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T:{if (!hasError) { + +param_sec=PARAM_SEC; + } + if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + formal_parameter_list(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + +param_sec=0; + } + + break; + } + default: + jj_la1[222] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(RETURN_T); + } + if (!hasError) { + + s = type_mark(); + } + if (!hasError) { + +tempEntry=current; + current->type=s; + newEntry(); + } + + break; + } + default: + jj_la1[223] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + + +void VhdlParser::subprogram_statement_part() {if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ASSERT_T: + case CASE_T: + case EXIT_T: + case FOR_T: + case IF_T: + case LOOP_T: + case NEXT_T: + case NULL_T: + case REPORT_T: + case RETURN_T: + case WAIT_T: + case WHILE_T: + case WITH_T: + case LPAREN_T: + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{ + ; + break; + } + default: + jj_la1[224] = jj_gen; + goto end_label_42; + }if (!hasError) { + + sequential_statement(); + } + + } + end_label_42: ; + } + + } + + +QCString VhdlParser::subtype_declaration() {QCString s,s1;if (!hasError) { + + jj_consume_token(SUBTYPE_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + + s1 = subtype_indication(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::SUBTYPE,0,s1.data(),Public); + return " subtype "+s+" is "+s1+";"; +assert(false); + } + + +QCString VhdlParser::subtype_indication() {QCString s,s1,s2;if (!hasError) { + + s = name(); + } + if (!hasError) { + + if (jj_2_96(2147483647)) {if (!hasError) { + + s1 = name(); + } + + } else { + ; + } + } + if (!hasError) { + + if (jj_2_97(2147483647)) {if (!hasError) { + + s2 = constraint(); + } + + } else { + ; + } + } + +return s+" "+s1+" "+s2; +assert(false); + } + + +QCString VhdlParser::suffix() {QCString s; + if (jj_2_98(2147483647)) {if (!hasError) { + + s = name(); + } + if (!hasError) { + +return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case CHARACTER_LITERAL:{if (!hasError) { + + s = character_literal(); + } + if (!hasError) { + +return s; + } + + break; + } + case STRINGLITERAL:{if (!hasError) { + + s = operator_symbol(); + } + if (!hasError) { + +return s; + } + + break; + } + case ALL_T:{if (!hasError) { + + jj_consume_token(ALL_T); + } + if (!hasError) { + +return " all "; + } + + break; + } + default: + jj_la1[225] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } +assert(false); + } + + +QCString VhdlParser::target() {QCString s; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = name(); + } + if (!hasError) { + +return s; + } + + break; + } + case LPAREN_T:{if (!hasError) { + + s = aggregate(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[226] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::term() {QCString s,s1,s2;if (!hasError) { + + s = factor(); + } + if (!hasError) { + + while (!hasError) { + if (jj_2_99(2)) { + ; + } else { + goto end_label_43; + }if (!hasError) { + + s1 = multiplying_operation(); + } + if (!hasError) { + + s2 = factor(); + } + if (!hasError) { + +s+=s1;s+=s2; + } + + } + end_label_43: ; + } + +return s; +assert(false); + } + + +QCString VhdlParser::timeout_clause() {QCString s;if (!hasError) { + + jj_consume_token(FOR_T); + } + if (!hasError) { + + s = expression(); + } + +return " for "+s; +assert(false); + } + + +QCString VhdlParser::type_conversion() {QCString s,s1;if (!hasError) { + + s = name(); + } + if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = expression(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + +return s+"("+s1+")"; +assert(false); + } + + +QCString VhdlParser::type_declaration() {QCString s; + if (jj_2_100(3)) {if (!hasError) { + + s = full_type_declaration(); + } + if (!hasError) { + +return s; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case TYPE_T:{if (!hasError) { + + s = incomplete_type_declaration(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[227] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } +assert(false); + } + + +QCString VhdlParser::type_definition() {QCString s; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case RANGE_T: + case LPAREN_T:{if (!hasError) { + + //try{ + s = scalar_type_definition(); + } + if (!hasError) { + +return s; + } + + break; + } + case ARRAY_T: + case RECORD_T:{if (!hasError) { + + s = composite_type_definition(); + } + if (!hasError) { + +return s; + } + + break; + } + case ACCESS_T:{if (!hasError) { + + s = access_type_definition(); + } + if (!hasError) { + +return s; + } + + break; + } + case FILE_T:{if (!hasError) { + + s = file_type_definition(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[228] = jj_gen; + if (jj_2_101(2)) {if (!hasError) { + + protected_type_body(); + } + if (!hasError) { + +return ""; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PROTECTED_T:{if (!hasError) { + + protected_type_declaration(); + } + if (!hasError) { + +return ""; + } + + break; + } + default: + jj_la1[229] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } +assert(false); + } + + +QCString VhdlParser::type_mark() {QCString s;if (!hasError) { + + s = name(); + } + +return s; +assert(false); + } + + +QCString VhdlParser::unconstraint_array_definition() {QCString s,s1,s2,s3;if (!hasError) { + + jj_consume_token(ARRAY_T); + } + if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s = index_subtype_definition(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[230] = jj_gen; + goto end_label_44; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + s1 = index_subtype_definition(); + } + if (!hasError) { + +s3+=",";s3+=s1; + } + + } + end_label_44: ; + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + if (!hasError) { + + jj_consume_token(OF_T); + } + if (!hasError) { + + s2 = subtype_indication(); + } + +return "array("+s+s3+") of "+s2; +assert(false); + } + + +QCString VhdlParser::use_clause() {QCString s,s1;if (!hasError) { + + jj_consume_token(USE_T); + } + if (!hasError) { + + s = selected_name(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[231] = jj_gen; + goto end_label_45; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + s1 = selected_name(); + } + if (!hasError) { + +s+=",";s+=s1; + } + + } + end_label_45: ; + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +QStringList ql1=QStringList::split(",",s,FALSE); + for (uint j=0;j<ql1.count();j++) + { + QStringList ql=QStringList::split(".",ql1[j],FALSE); + QCString it=ql[1].utf8(); + if ( parse_sec==0 && Config_getBool("SHOW_INCLUDE_FILES") ) + { + VhdlParser::addVhdlType(it.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::USE,it.data(),"_use_",Public); + } + } + s1="use "+s; + return s1; +assert(false); + } + + +QCString VhdlParser::variable_assignment_statement() {QCString s,s1,s2; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T: + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + if (jj_2_102(2)) {if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + +s+=":"; + } + + } else { + ; + } + } + if (!hasError) { + + s1 = target(); + } + if (!hasError) { + + jj_consume_token(VARASSIGN_T); + } + if (!hasError) { + + s2 = expression(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + if (!hasError) { + +return s+s1+":="+s2+";"; + } + + break; + } + case WITH_T:{if (!hasError) { + + selected_variable_assignment(); + } + if (!hasError) { + +return ""; + } + + break; + } + default: + jj_la1[232] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::variable_declaration() {Token *tok=0;Token *t1=0;QCString s,s1,s2;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SHARED_T:{if (!hasError) { + + tok = jj_consume_token(SHARED_T); + } + + break; + } + default: + jj_la1[233] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(VARIABLE_T); + } + if (!hasError) { + + s = identifier_list(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + s1 = subtype_indication(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case VARASSIGN_T:{if (!hasError) { + + t1 = jj_consume_token(VARASSIGN_T); + } + if (!hasError) { + + s2 = expression(); + } + + break; + } + default: + jj_la1[234] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +int spec; + if(t1) + s2.prepend(":="); + QCString val=" variable "+s+":"+s1+s2+";"; + QCString it=s1; + if(tok != 0) + { + it.prepend(" shared "); + val.prepend(" shared"); + spec=VhdlDocGen::SHAREDVARIABLE; + } + else + spec=VhdlDocGen::SHAREDVARIABLE; + + if(t1){ + it+=":="; + it+=s2; + } + addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,spec,0,it.data(),Public); + return val; +assert(false); + } + + +QCString VhdlParser::wait_statement() {QCString s,s1,s2,s3;Token *t=0;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + t = jj_consume_token(COLON_T); + } + + break; + } + default: + jj_la1[235] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(WAIT_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ON_T:{if (!hasError) { + + s1 = sensitivity_clause(); + } + + break; + } + default: + jj_la1[236] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case UNTIL_T:{if (!hasError) { + + s2 = condition_clause(); + } + + break; + } + default: + jj_la1[237] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FOR_T:{if (!hasError) { + + s3 = timeout_clause(); + } + + break; + } + default: + jj_la1[238] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +if(t) s.append(":"); + return s+" wait "+s1+s2+s3+";"; +assert(false); + } + + +QCString VhdlParser::waveform() {QCString s,s1; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ABS_T: + case NEW_T: + case NOT_T: + case NULL_T: + case LPAREN_T: + case PLUS_T: + case MINUS_T: + case SLSL_T: + case INTEGER: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER: + case CHARACTER_LITERAL: + case DECIMAL_LITERAL: + case BASED_LITERAL: + case BIT_STRING_LITERAL:{if (!hasError) { + + s = waveform_element(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[239] = jj_gen; + goto end_label_46; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + s1 = waveform_element(); + } + if (!hasError) { + +s+=","; s+=s1; + } + + } + end_label_46: ; + } + if (!hasError) { + +return s; + } + + break; + } + case UNAFFECTED_T:{if (!hasError) { + + jj_consume_token(UNAFFECTED_T); + } + if (!hasError) { + +return " unaffected "; + } + + break; + } + default: + jj_la1[240] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::waveform_element() {QCString s,s1;if (!hasError) { + + s = expression(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case AFTER_T:{if (!hasError) { + + jj_consume_token(AFTER_T); + } + if (!hasError) { + + s1 = expression(); + } + if (!hasError) { + +s1.prepend(" after "); + } + + break; + } + default: + jj_la1[241] = jj_gen; + ; + } + } + +return s+s1; +assert(false); + } + + +QCString VhdlParser::protected_type_body() {if (!hasError) { + + jj_consume_token(PROTECTED_T); + } + if (!hasError) { + + jj_consume_token(BODY_T); + } + if (!hasError) { + + protected_type_body_declarative_part(); + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + jj_consume_token(PROTECTED_T); + } + if (!hasError) { + + jj_consume_token(BODY_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + identifier(); + } + + break; + } + default: + jj_la1[242] = jj_gen; + ; + } + } + +return ""; +assert(false); + } + + +void VhdlParser::protected_type_body_declarative_item() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FUNCTION_T: + case IMPURE_T: + case PROCEDURE_T: + case PURE_T:{if (!hasError) { + + subprogram_declaration(); + } + + break; + } + case IS_T:{if (!hasError) { + + subprogram_body(); + } + + break; + } + case TYPE_T:{if (!hasError) { + + type_declaration(); + } + + break; + } + case SUBTYPE_T:{if (!hasError) { + + subtype_declaration(); + } + + break; + } + case CONSTANT_T:{if (!hasError) { + + constant_declaration(); + } + + break; + } + case SHARED_T: + case VARIABLE_T:{if (!hasError) { + + variable_declaration(); + } + + break; + } + case FILE_T:{if (!hasError) { + + file_declaration(); + } + + break; + } + case ALIAS_T:{if (!hasError) { + + alias_declaration(); + } + + break; + } + default: + jj_la1[243] = jj_gen; + if (jj_2_103(2147483647)) {if (!hasError) { + + attribute_declaration(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ATTRIBUTE_T:{if (!hasError) { + + attribute_specification(); + } + + break; + } + case USE_T:{if (!hasError) { + + use_clause(); + } + + break; + } + default: + jj_la1[244] = jj_gen; + if (jj_2_104(3)) {if (!hasError) { + + group_template_declaration(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GROUP_T:{if (!hasError) { + + group_declaration(); + } + + break; + } + default: + jj_la1[245] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + } + } + } + + +void VhdlParser::protected_type_body_declarative_part() {if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ALIAS_T: + case ATTRIBUTE_T: + case CONSTANT_T: + case FILE_T: + case FUNCTION_T: + case GROUP_T: + case IMPURE_T: + case IS_T: + case PROCEDURE_T: + case PURE_T: + case SHARED_T: + case SUBTYPE_T: + case TYPE_T: + case USE_T: + case VARIABLE_T:{ + ; + break; + } + default: + jj_la1[246] = jj_gen; + goto end_label_47; + }if (!hasError) { + + protected_type_body_declarative_item(); + } + + } + end_label_47: ; + } + + } + + +QCString VhdlParser::protected_type_declaration() {if (!hasError) { + + jj_consume_token(PROTECTED_T); + } + if (!hasError) { + + try {if (!hasError) { + + protected_type_declarative_part(); + } + + } catch ( ...) { +error_skipto(END_T); + } + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + jj_consume_token(PROTECTED_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + identifier(); + } + + break; + } + default: + jj_la1[247] = jj_gen; + ; + } + } + +return ""; +assert(false); + } + + +void VhdlParser::protected_type_declarative_item() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case FUNCTION_T: + case IMPURE_T: + case PROCEDURE_T: + case PURE_T:{if (!hasError) { + + subprogram_specification(); + } + + break; + } + case ATTRIBUTE_T:{if (!hasError) { + + attribute_specification(); + } + + break; + } + case USE_T:{if (!hasError) { + + use_clause(); + } + + break; + } + default: + jj_la1[248] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + + +void VhdlParser::protected_type_declarative_part() {if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ATTRIBUTE_T: + case FUNCTION_T: + case IMPURE_T: + case PROCEDURE_T: + case PURE_T: + case USE_T:{ + ; + break; + } + default: + jj_la1[249] = jj_gen; + goto end_label_48; + }if (!hasError) { + + protected_type_declarative_item(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + end_label_48: ; + } + + } + + +QCString VhdlParser::context_ref() {QCString s;if (!hasError) { + + jj_consume_token(CONTEXT_T); + } + if (!hasError) { + + s = identifier_list(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +return "context "+s ; +assert(false); + } + + +void VhdlParser::context_declaration() {QCString s,s1;if (!hasError) { + + jj_consume_token(CONTEXT_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + +parse_sec=CONTEXT_SEC; + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case CONTEXT_T: + case LIBRARY_T: + case USE_T:{ + ; + break; + } + default: + jj_la1[250] = jj_gen; + goto end_label_49; + }if (!hasError) { + + s1 = libustcont_stats(); + } + + } + end_label_49: ; + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case CONTEXT_T:{if (!hasError) { + + jj_consume_token(CONTEXT_T); + } + + break; + } + default: + jj_la1[251] = jj_gen; + ; + } + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + identifier(); + } + + break; + } + default: + jj_la1[252] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +parse_sec=0; + addVhdlType(s.data(),getLine(LIBRARY_T),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,"context",s1.data(),Public); + } + + +QCString VhdlParser::libustcont_stats() {QCString s; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case USE_T:{if (!hasError) { + + s = use_clause(); + } + if (!hasError) { + +return s; + } + + break; + } + case LIBRARY_T:{if (!hasError) { + + s = library_clause(); + } + if (!hasError) { + +return s; + } + + break; + } + case CONTEXT_T:{if (!hasError) { + + s = context_ref(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[253] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +void VhdlParser::package_instantiation_declaration() {QCString s,s1,s2;if (!hasError) { + + jj_consume_token(PACKAGE_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + + jj_consume_token(NEW_T); + } + if (!hasError) { + + s1 = name(); + } + if (!hasError) { + + s2 = signature(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GENERIC_T:{if (!hasError) { + + gen_assoc_list(); + } + + break; + } + default: + jj_la1[254] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +QCString q=" is new "+s1+s2; + addVhdlType(s.data(),getLine(PACKAGE_T),Entry::VARIABLE_SEC,VhdlDocGen::INSTANTIATION,"package",q.data(),Public); + } + + +QCString VhdlParser::interface_package_declaration() {QCString s,s1;if (!hasError) { + + jj_consume_token(PACKAGE_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + + jj_consume_token(NEW_T); + } + if (!hasError) { + + s1 = name(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GENERIC_T:{if (!hasError) { + + gen_assoc_list(); + } + + break; + } + default: + jj_la1[255] = jj_gen; + ; + } + } + +current->name=s; + return "package "+s+" is new "+s1; +assert(false); + } + + +QCString VhdlParser::subprogram_instantiation_declaration() {QCString s,s1,s2;if (!hasError) { + + jj_consume_token(FUNCTION_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + jj_consume_token(IS_T); + } + if (!hasError) { + + jj_consume_token(NEW_T); + } + if (!hasError) { + + s1 = name(); + } + if (!hasError) { + + s2 = signature(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case GENERIC_T:{if (!hasError) { + + gen_assoc_list(); + } + + break; + } + default: + jj_la1[256] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + +QCString q= " is new "+s1+s2; + addVhdlType(s.data(),getLine(FUNCTION_T),Entry::VARIABLE_SEC,VhdlDocGen::INSTANTIATION,"function ",q.data(),Public); + return q; +assert(false); + } + + +void VhdlParser::gen_assoc_list() {if (!hasError) { + + jj_consume_token(GENERIC_T); + } + if (!hasError) { + + jj_consume_token(MAP_T); + } + if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + association_list(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + + } + + +void VhdlParser::gen_interface_list() {if (!hasError) { + + jj_consume_token(GENERIC_T); + } + if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + +//int u=s_str.iLine; + parse_sec=GEN_SEC; + } + if (!hasError) { + + interface_list(); + } + if (!hasError) { + +// QCString vo=$3; + parse_sec=0; + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + + } + + +void VhdlParser::case_scheme() {if (!hasError) { + + jj_consume_token(CASE_T); + } + if (!hasError) { + + expression(); + } + if (!hasError) { + + jj_consume_token(GENERATE_T); + } + if (!hasError) { + + when_stats(); + } + if (!hasError) { + + if (jj_2_105(3)) {if (!hasError) { + + ttend(); + } + + } else { + ; + } + } + if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + jj_consume_token(GENERATE_T); + } + if (!hasError) { + + generate_statement_body(); + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + + +void VhdlParser::when_stats() {if (!hasError) { + + while (!hasError) {if (!hasError) { + + jj_consume_token(WHEN_T); + } + if (!hasError) { + + if (jj_2_106(2)) {if (!hasError) { + + label(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + + } else { + ; + } + } + if (!hasError) { + + choices(); + } + if (!hasError) { + + jj_consume_token(ARROW_T); + } + if (!hasError) { + + generate_statement_body(); + } + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case WHEN_T:{ + ; + break; + } + default: + jj_la1[257] = jj_gen; + goto end_label_50; + } + } + end_label_50: ; + } + + } + + +void VhdlParser::ttend() {if (!hasError) { + + jj_consume_token(END_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + identifier(); + } + + break; + } + default: + jj_la1[258] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + + +void VhdlParser::generate_statement_body() {if (!hasError) { + + jj_consume_token(BEGIN_T); + } + if (!hasError) { + + generate_statement_body(); + } + + } + + +void VhdlParser::generate_statement_body1() { + if (jj_2_107(2147483647)) {if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ALIAS_T: + case ATTRIBUTE_T: + case COMPONENT_T: + case CONSTANT_T: + case DISCONNECT_T: + case FILE_T: + case FOR_T: + case FUNCTION_T: + case GROUP_T: + case IMPURE_T: + case PROCEDURE_T: + case PURE_T: + case SIGNAL_T: + case SHARED_T: + case SUBTYPE_T: + case TYPE_T: + case USE_T: + case VARIABLE_T: + case VHDL2008TOOLDIR:{ + ; + break; + } + default: + jj_la1[259] = jj_gen; + goto end_label_51; + }if (!hasError) { + + block_declarative_item(); + } + + } + end_label_51: ; + } + if (!hasError) { + + jj_consume_token(BEGIN_T); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ASSERT_T: + case CASE_T: + case POSTPONED_T: + case PROCESS_T: + case WITH_T: + case LPAREN_T: + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER: + case VHDL2008TOOLDIR:{ + ; + break; + } + default: + jj_la1[260] = jj_gen; + goto end_label_52; + }if (!hasError) { + + concurrent_statement(); + } + + } + end_label_52: ; + } + + } else {if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ASSERT_T: + case CASE_T: + case POSTPONED_T: + case PROCESS_T: + case WITH_T: + case LPAREN_T: + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER: + case VHDL2008TOOLDIR:{ + ; + break; + } + default: + jj_la1[261] = jj_gen; + goto end_label_53; + }if (!hasError) { + + concurrent_statement(); + } + + } + end_label_53: ; + } + + } + } + + +QCString VhdlParser::external_name() {QCString s,s1,s2;if (!hasError) { + + jj_consume_token(SLSL_T); + } + if (!hasError) { + + s = sig_stat(); + } + if (!hasError) { + + s1 = external_pathname(); + } + if (!hasError) { + + jj_consume_token(COLON_T); + } + if (!hasError) { + + s2 = subtype_indication(); + } + if (!hasError) { + + jj_consume_token(RSRS_T); + } + +QCString t="<<"+s; + QCString t1=s1+":"+s2+">>"; + return s+s1; +assert(false); + } + + +QCString VhdlParser::sig_stat() {Token *t; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case CONSTANT_T:{if (!hasError) { + + t = jj_consume_token(CONSTANT_T); + } + if (!hasError) { + +return t->image.data(); + } + + break; + } + case SIGNAL_T:{if (!hasError) { + + t = jj_consume_token(SIGNAL_T); + } + if (!hasError) { + +return t->image.data(); + } + + break; + } + case VARIABLE_T:{if (!hasError) { + + t = jj_consume_token(VARIABLE_T); + } + if (!hasError) { + +return t->image.data(); + } + + break; + } + default: + jj_la1[262] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::external_pathname() {QCString s; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case DOT_T:{if (!hasError) { + + s = absolute_pathname(); + } + if (!hasError) { + +return s; + } + + break; + } + case NEG_T:{if (!hasError) { + + s = relative_pathname(); + } + if (!hasError) { + +return s; + } + + break; + } + case AT_T:{if (!hasError) { + + s = package_path_name(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[263] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::absolute_pathname() {QCString s,s1; + if (jj_2_108(2147483647)) {if (!hasError) { + + jj_consume_token(DOT_T); + } + if (!hasError) { + + s = pathname_element_list(); + } + if (!hasError) { + + s1 = identifier(); + } + if (!hasError) { + +return "."+s+s1; + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case DOT_T:{if (!hasError) { + + jj_consume_token(DOT_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + +return "."+s; + } + + break; + } + default: + jj_la1[264] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } +assert(false); + } + + +QCString VhdlParser::relative_pathname() {QCString s,s1,s2;if (!hasError) { + + s = neg_list(); + } + if (!hasError) { + + if (jj_2_109(2147483647)) {if (!hasError) { + + s1 = pathname_element_list(); + } + + } else { + ; + } + } + if (!hasError) { + + s2 = identifier(); + } + +return s+s1+s2; +assert(false); + } + + +QCString VhdlParser::neg_list() {QCString s;if (!hasError) { + + while (!hasError) {if (!hasError) { + + jj_consume_token(NEG_T); + } + if (!hasError) { + + jj_consume_token(DOT_T); + } + if (!hasError) { + +s+="^."; + } + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case NEG_T:{ + ; + break; + } + default: + jj_la1[265] = jj_gen; + goto end_label_54; + } + } + end_label_54: ; + } + +return s; +assert(false); + } + + +QCString VhdlParser::pathname_element() {QCString s,s1;if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T:{if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = expression(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + + break; + } + default: + jj_la1[266] = jj_gen; + ; + } + } + +if(!s1.isEmpty()) + return s+"("+s1+")"; + + return s; +assert(false); + } + + +QCString VhdlParser::pathname_element_list() {QCString s,s1,s2;if (!hasError) { + if (!hasError) { + + s = pathname_element(); + } + if (!hasError) { + + jj_consume_token(DOT_T); + } + + } + if (!hasError) { + +s+="."; + } + if (!hasError) { + + while (!hasError) { + if (jj_2_110(2147483647)) { + ; + } else { + goto end_label_55; + }if (!hasError) { + + s1 = pathname_element(); + } + if (!hasError) { + + jj_consume_token(DOT_T); + } + if (!hasError) { + +s2+=s1;s2+="."; + } + + } + end_label_55: ; + } + +return s+s2; +assert(false); + } + + +QCString VhdlParser::package_path_name() {QCString s;if (!hasError) { + + jj_consume_token(AT_T); + } + if (!hasError) { + + s = name(); + } + +return "@"+s; +assert(false); + } + + +void VhdlParser::conditional_signal_assignment_wave() { + if (jj_2_111(2147483647)) {if (!hasError) { + + conditional_force_assignment(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T: + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + conditional_waveform_assignment(); + } + + break; + } + default: + jj_la1[267] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + + +void VhdlParser::conditional_waveform_assignment() {if (!hasError) { + + target(); + } + if (!hasError) { + + jj_consume_token(LESSTHAN_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case INERTIAL_T: + case REJECT_T: + case TRANSPORT_T:{if (!hasError) { + + delay_mechanism(); + } + + break; + } + default: + jj_la1[268] = jj_gen; + ; + } + } + if (!hasError) { + + waveform_element(); + } + if (!hasError) { + + jj_consume_token(WHEN_T); + } + if (!hasError) { + + expression(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ELSE_T:{if (!hasError) { + + else_wave_list(); + } + + break; + } + default: + jj_la1[269] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + + +void VhdlParser::else_wave_list() {if (!hasError) { + + jj_consume_token(ELSE_T); + } + if (!hasError) { + + expression(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case WHEN_T:{if (!hasError) { + + jj_consume_token(WHEN_T); + } + if (!hasError) { + + expression(); + } + + break; + } + default: + jj_la1[270] = jj_gen; + ; + } + } + + } + + +void VhdlParser::conditional_force_assignment() {if (!hasError) { + + target(); + } + if (!hasError) { + + jj_consume_token(LESSTHAN_T); + } + if (!hasError) { + + jj_consume_token(FORCE_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case IN_T: + case OUT_T:{if (!hasError) { + + inout_stat(); + } + + break; + } + default: + jj_la1[271] = jj_gen; + ; + } + } + if (!hasError) { + + expression(); + } + if (!hasError) { + + jj_consume_token(WHEN_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ABS_T: + case NEW_T: + case NOT_T: + case NULL_T: + case LPAREN_T: + case PLUS_T: + case MINUS_T: + case SLSL_T: + case INTEGER: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER: + case CHARACTER_LITERAL: + case DECIMAL_LITERAL: + case BASED_LITERAL: + case BIT_STRING_LITERAL:{if (!hasError) { + + expression(); + } + if (!hasError) { + + else_stat(); + } + + break; + } + default: + jj_la1[272] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + + +void VhdlParser::selected_signal_assignment_wave() { + if (jj_2_112(2147483647)) {if (!hasError) { + + selected_force_assignment(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case WITH_T:{if (!hasError) { + + selected_waveform_assignment(); + } + + break; + } + default: + jj_la1[273] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + + +void VhdlParser::selected_variable_assignment() {if (!hasError) { + + jj_consume_token(WITH_T); + } + if (!hasError) { + + expression(); + } + if (!hasError) { + + jj_consume_token(SELECT_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case Q_T:{if (!hasError) { + + jj_consume_token(Q_T); + } + + break; + } + default: + jj_la1[274] = jj_gen; + ; + } + } + if (!hasError) { + + select_name(); + } + if (!hasError) { + + jj_consume_token(VARASSIGN_T); + } + if (!hasError) { + + sel_var_list(); + } + + } + + +void VhdlParser::select_name() { + if (jj_2_113(2147483647)) {if (!hasError) { + + aggregate(); + } + + } else { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case SLSL_T: + case STRINGLITERAL: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + name(); + } + + break; + } + default: + jj_la1[275] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + } + + +void VhdlParser::selected_waveform_assignment() {if (!hasError) { + + jj_consume_token(WITH_T); + } + if (!hasError) { + + expression(); + } + if (!hasError) { + + jj_consume_token(SELECT_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case Q_T:{if (!hasError) { + + jj_consume_token(Q_T); + } + + break; + } + default: + jj_la1[276] = jj_gen; + ; + } + } + if (!hasError) { + + target(); + } + if (!hasError) { + + jj_consume_token(LESSTHAN_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case INERTIAL_T: + case REJECT_T: + case TRANSPORT_T:{if (!hasError) { + + delay_mechanism(); + } + + break; + } + default: + jj_la1[277] = jj_gen; + ; + } + } + if (!hasError) { + + sel_wave_list(); + } + + } + + +void VhdlParser::selected_force_assignment() {if (!hasError) { + + jj_consume_token(WITH_T); + } + if (!hasError) { + + expression(); + } + if (!hasError) { + + jj_consume_token(SELECT_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case Q_T:{if (!hasError) { + + jj_consume_token(Q_T); + } + + break; + } + default: + jj_la1[278] = jj_gen; + ; + } + } + if (!hasError) { + + target(); + } + if (!hasError) { + + jj_consume_token(LESSTHAN_T); + } + if (!hasError) { + + jj_consume_token(FORCE_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case IN_T: + case OUT_T:{if (!hasError) { + + inout_stat(); + } + + break; + } + default: + jj_la1[279] = jj_gen; + ; + } + } + if (!hasError) { + + sel_var_list(); + } + + } + + +void VhdlParser::sel_var_list() {if (!hasError) { + if (!hasError) { + + expression(); + } + if (!hasError) { + + jj_consume_token(WHEN_T); + } + if (!hasError) { + + choices(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{if (!hasError) { + + jj_consume_token(COMMA_T); + } + + break; + } + case SEMI_T:{if (!hasError) { + + jj_consume_token(SEMI_T); + } + + break; + } + default: + jj_la1[280] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + + } + if (!hasError) { + + while (!hasError) { + if (jj_2_114(2147483647)) { + ; + } else { + goto end_label_56; + }if (!hasError) { + + expression(); + } + if (!hasError) { + + jj_consume_token(WHEN_T); + } + if (!hasError) { + + choices(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{if (!hasError) { + + jj_consume_token(COMMA_T); + } + + break; + } + case SEMI_T:{if (!hasError) { + + jj_consume_token(SEMI_T); + } + + break; + } + default: + jj_la1[281] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + + } + end_label_56: ; + } + + } + + +void VhdlParser::sel_wave_list() {if (!hasError) { + + waveform_element(); + } + if (!hasError) { + + jj_consume_token(WHEN_T); + } + if (!hasError) { + + choices(); + } + if (!hasError) { + + while (!hasError) { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case COMMA_T:{ + ; + break; + } + default: + jj_la1[282] = jj_gen; + goto end_label_57; + }if (!hasError) { + + jj_consume_token(COMMA_T); + } + if (!hasError) { + + sel_wave_list(); + } + + } + end_label_57: ; + } + if (!hasError) { + + jj_consume_token(SEMI_T); + } + + } + + +void VhdlParser::inout_stat() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case IN_T:{if (!hasError) { + + jj_consume_token(IN_T); + } + + break; + } + case OUT_T:{if (!hasError) { + + jj_consume_token(OUT_T); + } + + break; + } + default: + jj_la1[283] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + + +void VhdlParser::else_stat() {if (!hasError) { + + while (!hasError) {if (!hasError) { + + jj_consume_token(ELSE_T); + } + if (!hasError) { + + expression(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case WHEN_T:{if (!hasError) { + + jj_consume_token(WHEN_T); + } + if (!hasError) { + + expression(); + } + + break; + } + default: + jj_la1[284] = jj_gen; + ; + } + } + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case ELSE_T:{ + ; + break; + } + default: + jj_la1[285] = jj_gen; + goto end_label_58; + } + } + end_label_58: ; + } + + } + + +QCString VhdlParser::interface_subprogram_declaration() {QCString s; + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PROCEDURE_T:{if (!hasError) { + + s = iproc(); + } + if (!hasError) { + +return s; + } + + break; + } + case FUNCTION_T: + case IMPURE_T: + case PURE_T:{if (!hasError) { + + s = ifunc(); + } + if (!hasError) { + +return s; + } + + break; + } + default: + jj_la1[286] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } +assert(false); + } + + +QCString VhdlParser::iproc() {QCString s,s1;if (!hasError) { + + jj_consume_token(PROCEDURE_T); + } + if (!hasError) { + + s = identifier(); + } + if (!hasError) { + + s1 = param(); + } + +current->name=s; + return "procedure "+s+s1; +assert(false); + } + + +QCString VhdlParser::ifunc() {QCString s,s1,s2,s3;Token *t=0;Token *t1=0;Token *t2=0;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case IMPURE_T: + case PURE_T:{ + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PURE_T:{if (!hasError) { + + t = jj_consume_token(PURE_T); + } + + break; + } + case IMPURE_T:{if (!hasError) { + + t = jj_consume_token(IMPURE_T); + } + + break; + } + default: + jj_la1[287] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + break; + } + default: + jj_la1[288] = jj_gen; + ; + } + } + if (!hasError) { + + jj_consume_token(FUNCTION_T); + } + if (!hasError) { + + s = name(); + } + if (!hasError) { + + s1 = param(); + } + if (!hasError) { + + jj_consume_token(RETURN_T); + } + if (!hasError) { + + s2 = name(); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case IS_T:{if (!hasError) { + + t1 = jj_consume_token(IS_T); + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + s3 = identifier(); + } + + break; + } + case BOX_T:{if (!hasError) { + + t2 = jj_consume_token(BOX_T); + } + + break; + } + default: + jj_la1[289] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + + break; + } + default: + jj_la1[290] = jj_gen; + ; + } + } + +QCString q; + if(t) q=t->image.data(); + if(t2) s3="<>"; + if (!s3.isEmpty()) + { + s3.prepend(" is "); + } + current->name=s; + if (parse_sec==GEN_SEC) + { + QCString ss=q+" function "+s1+" return "+s2+s3; + int a=getLine(FUNCTION_T); + int b=getLine(PROCEDURE_T); + + if (a>b) b=a; + addVhdlType(current->name.data(),b,Entry::VARIABLE_SEC,VhdlDocGen::GENERIC,ss.data(),0,Public); + } + currP=0;return ""; +assert(false); + } + + +QCString VhdlParser::param() {QCString s,s1;Token *tok=0;if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case PARAMETER_T:{if (!hasError) { + + tok = jj_consume_token(PARAMETER_T); + } + + break; + } + default: + jj_la1[291] = jj_gen; + ; + } + } + if (!hasError) { + +param_sec=PARAM_SEC; + } + if (!hasError) { + + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case LPAREN_T:{if (!hasError) { + + jj_consume_token(LPAREN_T); + } + if (!hasError) { + + s1 = interface_list(); + } + if (!hasError) { + + jj_consume_token(RPAREN_T); + } + + break; + } + default: + jj_la1[292] = jj_gen; + ; + } + } + +if(tok) + { + s = tok->image.data(); + param_sec=0; + } + return s+"("+s1+")"; +assert(false); + } + + +void VhdlParser::parseInline() { + switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) { + case POSTPONED_T: + case PROCESS_T: + case BASIC_IDENTIFIER: + case EXTENDED_CHARACTER:{if (!hasError) { + + process_statement(); + } + + break; + } + case FUNCTION_T: + case IMPURE_T: + case PROCEDURE_T: + case PURE_T:{if (!hasError) { + + subprogram_declaration(); + } + + break; + } + default: + jj_la1[293] = jj_gen; + jj_consume_token(-1); + errorHandler->handleParseError(token, getToken(1), __FUNCTION__, this), hasError = true; + } + } + + + VhdlParser::VhdlParser(TokenManager *tm){ + head = NULL; + ReInit(tm); +} + VhdlParser::~VhdlParser() +{ + if (token_source) delete token_source; + if (head) { + Token *next, *t = head; + while (t) { + next = t->next; + delete t; + t = next; + } + } + if (errorHandlerCreated) { + delete errorHandler; + } +} + +void VhdlParser::ReInit(TokenManager *tm){ + if (head) delete head; + errorHandler = new ErrorHandler(); + errorHandlerCreated = true; + hasError = false; + token_source = tm; + head = token = new Token(); + token->kind = 0; + token->next = NULL; + jj_lookingAhead = false; + jj_rescan = false; + jj_done = false; + jj_scanpos = jj_lastpos = NULL; + jj_gc = 0; + jj_kind = -1; + trace_indent = 0; + trace_enabled = false; + jj_ntk = -1; + jj_gen = 0; + for (int i = 0; i < 294; i++) jj_la1[i] = -1; + } + + +Token * VhdlParser::jj_consume_token(int kind) { + Token *oldToken; + if ((oldToken = token)->next != NULL) token = token->next; + else token = token->next = token_source->getNextToken(); + jj_ntk = -1; + if (token->kind == kind) { + jj_gen++; + if (++jj_gc > 100) { + jj_gc = 0; + for (int i = 0; i < 114; i++) { + JJCalls *c = &jj_2_rtns[i]; + while (c != NULL) { + if (c->gen < jj_gen) c->first = NULL; + c = c->next; + } + } + } + return token; + } + token = oldToken; + jj_kind = kind; + JAVACC_STRING_TYPE image = kind >= 0 ? tokenImage[kind] : tokenImage[0]; + errorHandler->handleUnexpectedToken(kind, image.substr(1, image.size() - 2), getToken(1), this), hasError = true; + return token; + } + + +bool VhdlParser::jj_scan_token(int kind){ + if (jj_scanpos == jj_lastpos) { + jj_la--; + if (jj_scanpos->next == NULL) { + jj_lastpos = jj_scanpos = jj_scanpos->next = token_source->getNextToken(); + } else { + jj_lastpos = jj_scanpos = jj_scanpos->next; + } + } else { + jj_scanpos = jj_scanpos->next; + } + if (jj_rescan) { + int i = 0; Token *tok = token; + while (tok != NULL && tok != jj_scanpos) { i++; tok = tok->next; } + if (tok != NULL) jj_add_error_token(kind, i); + } + if (jj_scanpos->kind != kind) return true; + if (jj_la == 0 && jj_scanpos == jj_lastpos) { return jj_done = true; } + return false; + } + + +/** Get the next Token. */ + +Token * VhdlParser::getNextToken(){ + if (token->next != NULL) token = token->next; + else token = token->next = token_source->getNextToken(); + jj_ntk = -1; + jj_gen++; + return token; + } + +/** Get the specific Token. */ + +Token * VhdlParser::getToken(int index){ + Token *t = token; + for (int i = 0; i < index; i++) { + if (t->next != NULL) t = t->next; + else t = t->next = token_source->getNextToken(); + } + return t; + } + + +int VhdlParser::jj_ntk_f(){ + if ((jj_nt=token->next) == NULL) + return (jj_ntk = (token->next=token_source->getNextToken())->kind); + else + return (jj_ntk = jj_nt->kind); + } + + +void VhdlParser::jj_add_error_token(int kind, int pos) { + } + + /** Generate ParseException. */ + + void VhdlParser::parseError() { + // fprintf(stderr, "Parse error at: %d:%d, after token: %s encountered: %s\n", token->beginLine, token->beginColumn, addUnicodeEscapes(token->image).c_str(), addUnicodeEscapes(getToken(1)->image).c_str()); + } + + + void VhdlParser::enable_tracing() { + } + + /** Disable tracing. */ + + void VhdlParser::disable_tracing() { + } + + +void VhdlParser::jj_rescan_token(){ + jj_rescan = true; + for (int i = 0; i < 114; i++) { + JJCalls *p = &jj_2_rtns[i]; + do { + if (p->gen > jj_gen) { + jj_la = p->arg; jj_lastpos = jj_scanpos = p->first; + switch (i) { + case 0: jj_3_1(); break; + case 1: jj_3_2(); break; + case 2: jj_3_3(); break; + case 3: jj_3_4(); break; + case 4: jj_3_5(); break; + case 5: jj_3_6(); break; + case 6: jj_3_7(); break; + case 7: jj_3_8(); break; + case 8: jj_3_9(); break; + case 9: jj_3_10(); break; + case 10: jj_3_11(); break; + case 11: jj_3_12(); break; + case 12: jj_3_13(); break; + case 13: jj_3_14(); break; + case 14: jj_3_15(); break; + case 15: jj_3_16(); break; + case 16: jj_3_17(); break; + case 17: jj_3_18(); break; + case 18: jj_3_19(); break; + case 19: jj_3_20(); break; + case 20: jj_3_21(); break; + case 21: jj_3_22(); break; + case 22: jj_3_23(); break; + case 23: jj_3_24(); break; + case 24: jj_3_25(); break; + case 25: jj_3_26(); break; + case 26: jj_3_27(); break; + case 27: jj_3_28(); break; + case 28: jj_3_29(); break; + case 29: jj_3_30(); break; + case 30: jj_3_31(); break; + case 31: jj_3_32(); break; + case 32: jj_3_33(); break; + case 33: jj_3_34(); break; + case 34: jj_3_35(); break; + case 35: jj_3_36(); break; + case 36: jj_3_37(); break; + case 37: jj_3_38(); break; + case 38: jj_3_39(); break; + case 39: jj_3_40(); break; + case 40: jj_3_41(); break; + case 41: jj_3_42(); break; + case 42: jj_3_43(); break; + case 43: jj_3_44(); break; + case 44: jj_3_45(); break; + case 45: jj_3_46(); break; + case 46: jj_3_47(); break; + case 47: jj_3_48(); break; + case 48: jj_3_49(); break; + case 49: jj_3_50(); break; + case 50: jj_3_51(); break; + case 51: jj_3_52(); break; + case 52: jj_3_53(); break; + case 53: jj_3_54(); break; + case 54: jj_3_55(); break; + case 55: jj_3_56(); break; + case 56: jj_3_57(); break; + case 57: jj_3_58(); break; + case 58: jj_3_59(); break; + case 59: jj_3_60(); break; + case 60: jj_3_61(); break; + case 61: jj_3_62(); break; + case 62: jj_3_63(); break; + case 63: jj_3_64(); break; + case 64: jj_3_65(); break; + case 65: jj_3_66(); break; + case 66: jj_3_67(); break; + case 67: jj_3_68(); break; + case 68: jj_3_69(); break; + case 69: jj_3_70(); break; + case 70: jj_3_71(); break; + case 71: jj_3_72(); break; + case 72: jj_3_73(); break; + case 73: jj_3_74(); break; + case 74: jj_3_75(); break; + case 75: jj_3_76(); break; + case 76: jj_3_77(); break; + case 77: jj_3_78(); break; + case 78: jj_3_79(); break; + case 79: jj_3_80(); break; + case 80: jj_3_81(); break; + case 81: jj_3_82(); break; + case 82: jj_3_83(); break; + case 83: jj_3_84(); break; + case 84: jj_3_85(); break; + case 85: jj_3_86(); break; + case 86: jj_3_87(); break; + case 87: jj_3_88(); break; + case 88: jj_3_89(); break; + case 89: jj_3_90(); break; + case 90: jj_3_91(); break; + case 91: jj_3_92(); break; + case 92: jj_3_93(); break; + case 93: jj_3_94(); break; + case 94: jj_3_95(); break; + case 95: jj_3_96(); break; + case 96: jj_3_97(); break; + case 97: jj_3_98(); break; + case 98: jj_3_99(); break; + case 99: jj_3_100(); break; + case 100: jj_3_101(); break; + case 101: jj_3_102(); break; + case 102: jj_3_103(); break; + case 103: jj_3_104(); break; + case 104: jj_3_105(); break; + case 105: jj_3_106(); break; + case 106: jj_3_107(); break; + case 107: jj_3_108(); break; + case 108: jj_3_109(); break; + case 109: jj_3_110(); break; + case 110: jj_3_111(); break; + case 111: jj_3_112(); break; + case 112: jj_3_113(); break; + case 113: jj_3_114(); break; + } + } + p = p->next; + } while (p != NULL); + } + jj_rescan = false; + } + + +void VhdlParser::jj_save(int index, int xla){ + JJCalls *p = &jj_2_rtns[index]; + while (p->gen > jj_gen) { + if (p->next == NULL) { p = p->next = new JJCalls(); break; } + p = p->next; + } + p->gen = jj_gen + xla - jj_la; p->first = token; p->arg = xla; + } + + +} +} diff --git a/vhdlparser/VhdlParser.h b/vhdlparser/VhdlParser.h new file mode 100644 index 0000000..78450d1 --- /dev/null +++ b/vhdlparser/VhdlParser.h @@ -0,0 +1,8984 @@ +#ifndef VHDLPARSER_H +#define VHDLPARSER_H +#include "JavaCC.h" +#include "CharStream.h" +#include "Token.h" +#include "TokenManager.h" +#include "VhdlParserTokenManager.h" +#include "vhdljjparser.h" + +#include "VhdlParserConstants.h" +#include "ErrorHandler.h" +namespace vhdl { +namespace parser { + struct JJCalls { + int gen; + Token *first; + int arg; + JJCalls *next; + ~JJCalls() { if (next) delete next; } + JJCalls() { next = NULL; arg = 0; gen = -1; first = NULL; } + }; + +class VhdlParser { + public: + +QCString abstract_literal(); + +QCString access_type_definition(); + +QCString actual_designator(); + +QCString actual_parameter_part(); + +QCString actual_part(); + +QCString adding_operator(); + +QCString aggregate(); + +QCString alias_declaration(); + +QCString alias_designator(); + +void allocator(); + +void architecture_body(); + +void architecture_declarative_part(); + +void architecture_statement_part(); + +QCString array_type_definition(); + +QCString assertion(); + +QCString assertion_statement(); + +QCString association_element(); + +QCString association_list(); + +QCString attribute_declaration(); + +QCString attribute_designator(); + +QCString attribute_name(); + +QCString attribute_specification(); + +QCString base(); + +QCString base_specifier(); + +QCString base_unit_declaration(); + +QCString based_integer(); + +QCString based_literal(); + +QCString basic_identifier(); + +void binding_indication(); + +QCString bit_string_literal(); + +QCString bit_value(); + +void block_configuration(); + +void block_declarative_item(); + +void block_declarative_part(); + +void block_header(); + +void block_specification(); + +void block_statement(); + +void block_statement_part(); + +void case_statement(); + +void case_statement_alternative(); + +QCString character_literal(); + +QCString choice(); + +QCString choices(); + +void component_configuration(); + +void component_declaration(); + +void component_instantiation_statement(); + +void component_specification(); + +QCString composite_type_definition(); + +void concurrent_assertion_statement(); + +void concurrent_procedure_call_statement(); + +void concurrent_signal_assignment_statement(); + +void concurrent_statement(); + +QCString condition(); + +QCString condition_clause(); + +void conditional_signal_assignment(); + +void conditional_waveforms(); + +void configuration_declaration(); + +void configuration_declarative_item(); + +void configuration_declarative_part(); + +void configuration_item(); + +void configuration_specification(); + +QCString constant_declaration(); + +QCString constraint_array_definition(); + +void context_clause(); + +QCString constraint(); + +void context_item(); + +QCString decimal_literal(); + +QCString delay_mechanism(); + +void design_file(); + +void design_unit(); + +QCString designator(); + +QCString direction(); + +void disconnection_specification(); + +void guarded_signal_specificatio(); + +QCString discrete_range(); + +QCString element_association(); + +QCString element_declaration(); + +QCString entity_aspect(); + +QCString entity_class(); + +QCString entity_class_entry(); + +QCString entity_class_entry_list(); + +void entity_declaration(); + +void entity_declarative_item(); + +void entity_declarative_part(); + +QCString entity_designator(); + +void entity_header(); + +QCString entity_name_list(); + +QCString entity_specification(); + +void entity_statement(); + +void entity_statement_part(); + +QCString entity_tag(); + +QCString enumeration_literal(); + +QCString enumeration_type_definition(); + +QCString exit_statement(); + +QCString expression(); + +QCString logop(); + +QCString extended_identifier(); + +QCString factor(); + +QCString file_declaration(); + +QCString file_logical_name(); + +QCString file_open_information(); + +QCString file_type_definition(); + +QCString floating_type_definition(); + +QCString formal_designator(); + +QCString formal_parameter_list(); + +QCString formal_part(); + +QCString full_type_declaration(); + +QCString function_call(); + +void generate_statement(); + +void generate_scheme(); + +void generic_clause(); + +QCString generic_list(); + +void generic_map_aspect(); + +QCString group_constituent(); + +QCString group_constituent_list(); + +QCString group_declaration(); + +QCString group_template_declaration(); + +void guarded_signal_specification(); + +QCString identifier(); + +QCString identifier_list(); + +void if_statement(); + +QCString incomplete_type_declaration(); + +QCString index_constraint(); + +QCString index_specification(); + +QCString index_subtype_definition(); + +QCString instantiation_unit(); + +QCString instantiation_list(); + +QCString integer(); + +QCString integer_type_definition(); + +QCString interface_declaration(); + +QCString interface_element(); + +QCString interface_file_declaration(); + +QCString interface_list(); + +QCString interface_variable_declaration(); + +QCString iteration_scheme(); + +QCString label(); + +QCString library_clause(); + +QCString library_unit(); + +QCString literal(); + +QCString logical_operator(); + +QCString loop_statement(); + +QCString miscellaneous_operator(); + +QCString mode(); + +QCString multiplying_operation(); + +QCString name(); + +QCString name_ext1(); + +QCString name_ext(); + +QCString test_att_name(); + +QCString indexed_name(); + +QCString next_statement(); + +QCString null_statement(); + +QCString numeric_literal(); + +QCString object_class(); + +QCString operator_symbol(); + +void options(); + +void package_body(); + +void package_body_declarative_item(); + +void package_body_declarative_part(); + +void package_declaration(); + +void geninter(); + +void package_declarative_item(); + +void package_declarative_part(); + +QCString parameter_specification(); + +QCString physical_literal(); + +QCString physical_type_definition(); + +void port_clause(); + +QCString port_list(); + +void port_map_aspect(); + +QCString primary(); + +void primary_unit(); + +QCString procedure_call(); + +QCString procedure_call_statement(); + +QCString process_declarative_item(); + +QCString process_declarative_part(); + +void process_statement(); + +void process_statement_part(); + +QCString qualified_expression(); + +QCString range(); + +QCString range_constraint(); + +void record_type_definition(); + +QCString relation(); + +QCString relation_operator(); + +QCString report_statement(); + +QCString return_statement(); + +QCString scalar_type_definition(); + +void secondary_unit(); + +QCString secondary_unit_declaration(); + +QCString selected_name(); + +void selected_signal_assignment(); + +void selected_waveforms(); + +QCString sensitivity_clause(); + +QCString sensitivity_list(); + +QCString sequence_of_statement(); + +QCString sequential_statement(); + +QCString shift_expression(); + +QCString shift_operator(); + +QCString sign(); + +QCString signal_assignment_statement(); + +void semi(); + +void signal_declaration(); + +QCString signal_kind(); + +QCString signal_list(); + +QCString signature(); + +QCString simple_expression(); + +void simple_name(); + +QCString slice_name(); + +QCString string_literal(); + +void subprogram_body(); + +void subprogram_declaration(); + +void subprogram_1(); + +QCString subprogram_declarative_item(); + +QCString subprogram_declarative_part(); + +void subprogram_kind(); + +void subprogram_specification(); + +void subprogram_statement_part(); + +QCString subtype_declaration(); + +QCString subtype_indication(); + +QCString suffix(); + +QCString target(); + +QCString term(); + +QCString timeout_clause(); + +QCString type_conversion(); + +QCString type_declaration(); + +QCString type_definition(); + +QCString type_mark(); + +QCString unconstraint_array_definition(); + +QCString use_clause(); + +QCString variable_assignment_statement(); + +QCString variable_declaration(); + +QCString wait_statement(); + +QCString waveform(); + +QCString waveform_element(); + +QCString protected_type_body(); + +void protected_type_body_declarative_item(); + +void protected_type_body_declarative_part(); + +QCString protected_type_declaration(); + +void protected_type_declarative_item(); + +void protected_type_declarative_part(); + +QCString context_ref(); + +void context_declaration(); + +QCString libustcont_stats(); + +void package_instantiation_declaration(); + +QCString interface_package_declaration(); + +QCString subprogram_instantiation_declaration(); + +void gen_assoc_list(); + +void gen_interface_list(); + +void case_scheme(); + +void when_stats(); + +void ttend(); + +void generate_statement_body(); + +void generate_statement_body1(); + +QCString external_name(); + +QCString sig_stat(); + +QCString external_pathname(); + +QCString absolute_pathname(); + +QCString relative_pathname(); + +QCString neg_list(); + +QCString pathname_element(); + +QCString pathname_element_list(); + +QCString package_path_name(); + +void conditional_signal_assignment_wave(); + +void conditional_waveform_assignment(); + +void else_wave_list(); + +void conditional_force_assignment(); + +void selected_signal_assignment_wave(); + +void selected_variable_assignment(); + +void select_name(); + +void selected_waveform_assignment(); + +void selected_force_assignment(); + +void sel_var_list(); + +void sel_wave_list(); + +void inout_stat(); + +void else_stat(); + +QCString interface_subprogram_declaration(); + +QCString iproc(); + +QCString ifunc(); + +QCString param(); + +void parseInline(); + inline bool jj_2_1(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_1() || jj_done; + { jj_save(0, xla); } + } + + inline bool jj_2_2(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_2() || jj_done; + { jj_save(1, xla); } + } + + inline bool jj_2_3(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_3() || jj_done; + { jj_save(2, xla); } + } + + inline bool jj_2_4(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_4() || jj_done; + { jj_save(3, xla); } + } + + inline bool jj_2_5(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_5() || jj_done; + { jj_save(4, xla); } + } + + inline bool jj_2_6(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_6() || jj_done; + { jj_save(5, xla); } + } + + inline bool jj_2_7(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_7() || jj_done; + { jj_save(6, xla); } + } + + inline bool jj_2_8(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_8() || jj_done; + { jj_save(7, xla); } + } + + inline bool jj_2_9(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_9() || jj_done; + { jj_save(8, xla); } + } + + inline bool jj_2_10(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_10() || jj_done; + { jj_save(9, xla); } + } + + inline bool jj_2_11(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_11() || jj_done; + { jj_save(10, xla); } + } + + inline bool jj_2_12(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_12() || jj_done; + { jj_save(11, xla); } + } + + inline bool jj_2_13(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_13() || jj_done; + { jj_save(12, xla); } + } + + inline bool jj_2_14(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_14() || jj_done; + { jj_save(13, xla); } + } + + inline bool jj_2_15(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_15() || jj_done; + { jj_save(14, xla); } + } + + inline bool jj_2_16(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_16() || jj_done; + { jj_save(15, xla); } + } + + inline bool jj_2_17(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_17() || jj_done; + { jj_save(16, xla); } + } + + inline bool jj_2_18(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_18() || jj_done; + { jj_save(17, xla); } + } + + inline bool jj_2_19(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_19() || jj_done; + { jj_save(18, xla); } + } + + inline bool jj_2_20(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_20() || jj_done; + { jj_save(19, xla); } + } + + inline bool jj_2_21(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_21() || jj_done; + { jj_save(20, xla); } + } + + inline bool jj_2_22(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_22() || jj_done; + { jj_save(21, xla); } + } + + inline bool jj_2_23(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_23() || jj_done; + { jj_save(22, xla); } + } + + inline bool jj_2_24(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_24() || jj_done; + { jj_save(23, xla); } + } + + inline bool jj_2_25(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_25() || jj_done; + { jj_save(24, xla); } + } + + inline bool jj_2_26(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_26() || jj_done; + { jj_save(25, xla); } + } + + inline bool jj_2_27(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_27() || jj_done; + { jj_save(26, xla); } + } + + inline bool jj_2_28(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_28() || jj_done; + { jj_save(27, xla); } + } + + inline bool jj_2_29(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_29() || jj_done; + { jj_save(28, xla); } + } + + inline bool jj_2_30(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_30() || jj_done; + { jj_save(29, xla); } + } + + inline bool jj_2_31(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_31() || jj_done; + { jj_save(30, xla); } + } + + inline bool jj_2_32(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_32() || jj_done; + { jj_save(31, xla); } + } + + inline bool jj_2_33(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_33() || jj_done; + { jj_save(32, xla); } + } + + inline bool jj_2_34(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_34() || jj_done; + { jj_save(33, xla); } + } + + inline bool jj_2_35(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_35() || jj_done; + { jj_save(34, xla); } + } + + inline bool jj_2_36(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_36() || jj_done; + { jj_save(35, xla); } + } + + inline bool jj_2_37(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_37() || jj_done; + { jj_save(36, xla); } + } + + inline bool jj_2_38(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_38() || jj_done; + { jj_save(37, xla); } + } + + inline bool jj_2_39(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_39() || jj_done; + { jj_save(38, xla); } + } + + inline bool jj_2_40(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_40() || jj_done; + { jj_save(39, xla); } + } + + inline bool jj_2_41(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_41() || jj_done; + { jj_save(40, xla); } + } + + inline bool jj_2_42(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_42() || jj_done; + { jj_save(41, xla); } + } + + inline bool jj_2_43(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_43() || jj_done; + { jj_save(42, xla); } + } + + inline bool jj_2_44(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_44() || jj_done; + { jj_save(43, xla); } + } + + inline bool jj_2_45(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_45() || jj_done; + { jj_save(44, xla); } + } + + inline bool jj_2_46(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_46() || jj_done; + { jj_save(45, xla); } + } + + inline bool jj_2_47(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_47() || jj_done; + { jj_save(46, xla); } + } + + inline bool jj_2_48(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_48() || jj_done; + { jj_save(47, xla); } + } + + inline bool jj_2_49(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_49() || jj_done; + { jj_save(48, xla); } + } + + inline bool jj_2_50(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_50() || jj_done; + { jj_save(49, xla); } + } + + inline bool jj_2_51(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_51() || jj_done; + { jj_save(50, xla); } + } + + inline bool jj_2_52(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_52() || jj_done; + { jj_save(51, xla); } + } + + inline bool jj_2_53(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_53() || jj_done; + { jj_save(52, xla); } + } + + inline bool jj_2_54(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_54() || jj_done; + { jj_save(53, xla); } + } + + inline bool jj_2_55(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_55() || jj_done; + { jj_save(54, xla); } + } + + inline bool jj_2_56(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_56() || jj_done; + { jj_save(55, xla); } + } + + inline bool jj_2_57(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_57() || jj_done; + { jj_save(56, xla); } + } + + inline bool jj_2_58(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_58() || jj_done; + { jj_save(57, xla); } + } + + inline bool jj_2_59(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_59() || jj_done; + { jj_save(58, xla); } + } + + inline bool jj_2_60(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_60() || jj_done; + { jj_save(59, xla); } + } + + inline bool jj_2_61(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_61() || jj_done; + { jj_save(60, xla); } + } + + inline bool jj_2_62(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_62() || jj_done; + { jj_save(61, xla); } + } + + inline bool jj_2_63(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_63() || jj_done; + { jj_save(62, xla); } + } + + inline bool jj_2_64(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_64() || jj_done; + { jj_save(63, xla); } + } + + inline bool jj_2_65(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_65() || jj_done; + { jj_save(64, xla); } + } + + inline bool jj_2_66(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_66() || jj_done; + { jj_save(65, xla); } + } + + inline bool jj_2_67(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_67() || jj_done; + { jj_save(66, xla); } + } + + inline bool jj_2_68(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_68() || jj_done; + { jj_save(67, xla); } + } + + inline bool jj_2_69(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_69() || jj_done; + { jj_save(68, xla); } + } + + inline bool jj_2_70(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_70() || jj_done; + { jj_save(69, xla); } + } + + inline bool jj_2_71(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_71() || jj_done; + { jj_save(70, xla); } + } + + inline bool jj_2_72(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_72() || jj_done; + { jj_save(71, xla); } + } + + inline bool jj_2_73(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_73() || jj_done; + { jj_save(72, xla); } + } + + inline bool jj_2_74(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_74() || jj_done; + { jj_save(73, xla); } + } + + inline bool jj_2_75(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_75() || jj_done; + { jj_save(74, xla); } + } + + inline bool jj_2_76(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_76() || jj_done; + { jj_save(75, xla); } + } + + inline bool jj_2_77(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_77() || jj_done; + { jj_save(76, xla); } + } + + inline bool jj_2_78(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_78() || jj_done; + { jj_save(77, xla); } + } + + inline bool jj_2_79(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_79() || jj_done; + { jj_save(78, xla); } + } + + inline bool jj_2_80(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_80() || jj_done; + { jj_save(79, xla); } + } + + inline bool jj_2_81(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_81() || jj_done; + { jj_save(80, xla); } + } + + inline bool jj_2_82(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_82() || jj_done; + { jj_save(81, xla); } + } + + inline bool jj_2_83(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_83() || jj_done; + { jj_save(82, xla); } + } + + inline bool jj_2_84(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_84() || jj_done; + { jj_save(83, xla); } + } + + inline bool jj_2_85(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_85() || jj_done; + { jj_save(84, xla); } + } + + inline bool jj_2_86(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_86() || jj_done; + { jj_save(85, xla); } + } + + inline bool jj_2_87(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_87() || jj_done; + { jj_save(86, xla); } + } + + inline bool jj_2_88(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_88() || jj_done; + { jj_save(87, xla); } + } + + inline bool jj_2_89(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_89() || jj_done; + { jj_save(88, xla); } + } + + inline bool jj_2_90(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_90() || jj_done; + { jj_save(89, xla); } + } + + inline bool jj_2_91(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_91() || jj_done; + { jj_save(90, xla); } + } + + inline bool jj_2_92(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_92() || jj_done; + { jj_save(91, xla); } + } + + inline bool jj_2_93(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_93() || jj_done; + { jj_save(92, xla); } + } + + inline bool jj_2_94(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_94() || jj_done; + { jj_save(93, xla); } + } + + inline bool jj_2_95(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_95() || jj_done; + { jj_save(94, xla); } + } + + inline bool jj_2_96(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_96() || jj_done; + { jj_save(95, xla); } + } + + inline bool jj_2_97(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_97() || jj_done; + { jj_save(96, xla); } + } + + inline bool jj_2_98(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_98() || jj_done; + { jj_save(97, xla); } + } + + inline bool jj_2_99(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_99() || jj_done; + { jj_save(98, xla); } + } + + inline bool jj_2_100(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_100() || jj_done; + { jj_save(99, xla); } + } + + inline bool jj_2_101(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_101() || jj_done; + { jj_save(100, xla); } + } + + inline bool jj_2_102(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_102() || jj_done; + { jj_save(101, xla); } + } + + inline bool jj_2_103(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_103() || jj_done; + { jj_save(102, xla); } + } + + inline bool jj_2_104(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_104() || jj_done; + { jj_save(103, xla); } + } + + inline bool jj_2_105(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_105() || jj_done; + { jj_save(104, xla); } + } + + inline bool jj_2_106(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_106() || jj_done; + { jj_save(105, xla); } + } + + inline bool jj_2_107(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_107() || jj_done; + { jj_save(106, xla); } + } + + inline bool jj_2_108(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_108() || jj_done; + { jj_save(107, xla); } + } + + inline bool jj_2_109(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_109() || jj_done; + { jj_save(108, xla); } + } + + inline bool jj_2_110(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_110() || jj_done; + { jj_save(109, xla); } + } + + inline bool jj_2_111(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_111() || jj_done; + { jj_save(110, xla); } + } + + inline bool jj_2_112(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_112() || jj_done; + { jj_save(111, xla); } + } + + inline bool jj_2_113(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_113() || jj_done; + { jj_save(112, xla); } + } + + inline bool jj_2_114(int xla) + { + jj_la = xla; jj_lastpos = jj_scanpos = token; + jj_done = false; + return !jj_3_114() || jj_done; + { jj_save(113, xla); } + } + + inline bool jj_3R_430() + { + if (jj_done) return true; + if (jj_scan_token(INOUT_T)) return true; + return false; + } + + inline bool jj_3R_429() + { + if (jj_done) return true; + if (jj_scan_token(OUT_T)) return true; + return false; + } + + inline bool jj_3R_346() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_428()) { + jj_scanpos = xsp; + if (jj_3R_429()) { + jj_scanpos = xsp; + if (jj_3R_430()) { + jj_scanpos = xsp; + if (jj_3R_431()) { + jj_scanpos = xsp; + if (jj_3R_432()) return true; + } + } + } + } + return false; + } + + inline bool jj_3R_428() + { + if (jj_done) return true; + if (jj_scan_token(IN_T)) return true; + return false; + } + + inline bool jj_3R_258() + { + if (jj_done) return true; + if (jj_3R_367()) return true; + return false; + } + + inline bool jj_3R_257() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_123() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_257()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_258()) jj_scanpos = xsp; + if (jj_scan_token(LOOP_T)) return true; + if (jj_3R_259()) return true; + if (jj_scan_token(END_T)) return true; + if (jj_scan_token(LOOP_T)) return true; + xsp = jj_scanpos; + if (jj_3R_625()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3_45() + { + if (jj_done) return true; + if (jj_3R_97()) return true; + return false; + } + + inline bool jj_3_44() + { + if (jj_done) return true; + if (jj_3R_96()) return true; + return false; + } + + inline bool jj_3R_233() + { + if (jj_done) return true; + if (jj_scan_token(NULL_T)) return true; + return false; + } + + inline bool jj_3_43() + { + if (jj_done) return true; + if (jj_3R_95()) return true; + return false; + } + + inline bool jj_3R_232() + { + if (jj_done) return true; + if (jj_3R_356()) return true; + return false; + } + + inline bool jj_3R_231() + { + if (jj_done) return true; + if (jj_3R_97()) return true; + return false; + } + + inline bool jj_3R_230() + { + if (jj_done) return true; + if (jj_3R_96()) return true; + return false; + } + + inline bool jj_3R_229() + { + if (jj_done) return true; + if (jj_3R_95()) return true; + return false; + } + + inline bool jj_3R_107() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_229()) { + jj_scanpos = xsp; + if (jj_3R_230()) { + jj_scanpos = xsp; + if (jj_3R_231()) { + jj_scanpos = xsp; + if (jj_3R_232()) { + jj_scanpos = xsp; + if (jj_3R_233()) return true; + } + } + } + } + return false; + } + + inline bool jj_3_42() + { + if (jj_done) return true; + if (jj_3R_94()) return true; + return false; + } + + inline bool jj_3R_140() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_199() + { + if (jj_done) return true; + if (jj_scan_token(VARASSIGN_T)) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_444() + { + if (jj_done) return true; + if (jj_scan_token(FOR_T)) return true; + if (jj_3R_408()) return true; + return false; + } + + inline bool jj_3R_367() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_443()) { + jj_scanpos = xsp; + if (jj_3R_444()) return true; + } + return false; + } + + inline bool jj_3R_443() + { + if (jj_done) return true; + if (jj_scan_token(WHILE_T)) return true; + if (jj_3R_80()) return true; + return false; + } + + inline bool jj_3R_198() + { + if (jj_done) return true; + if (jj_3R_346()) return true; + return false; + } + + inline bool jj_3R_400() + { + if (jj_done) return true; + if (jj_scan_token(SEMI_T)) return true; + if (jj_3R_399()) return true; + return false; + } + + inline bool jj_3R_196() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_scan_token(116)) { + jj_scanpos = xsp; + if (jj_scan_token(100)) { + jj_scanpos = xsp; + if (jj_scan_token(31)) { + jj_scanpos = xsp; + if (jj_scan_token(101)) return true; + } + } + } + return false; + } + + inline bool jj_3R_91() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_196()) jj_scanpos = xsp; + if (jj_3R_197()) return true; + if (jj_scan_token(COLON_T)) return true; + xsp = jj_scanpos; + if (jj_3R_198()) jj_scanpos = xsp; + if (jj_3R_85()) return true; + xsp = jj_scanpos; + if (jj_scan_token(27)) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_199()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_313() + { + if (jj_done) return true; + if (jj_3R_399()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_400()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_413() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_92() + { + if (jj_done) return true; + if (jj_scan_token(FILE_T)) return true; + if (jj_3R_197()) return true; + if (jj_scan_token(COLON_T)) return true; + if (jj_3R_85()) return true; + return false; + } + + inline bool jj_3R_399() + { + if (jj_done) return true; + if (jj_3R_491()) return true; + return false; + } + + inline bool jj_3_41() + { + if (jj_done) return true; + if (jj_3R_93()) return true; + return false; + } + + inline bool jj_3R_552() + { + if (jj_done) return true; + if (jj_3R_613()) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_551() + { + if (jj_done) return true; + if (jj_3R_93()) return true; + return false; + } + + inline bool jj_3_40() + { + if (jj_done) return true; + if (jj_3R_92()) return true; + return false; + } + + inline bool jj_3_39() + { + if (jj_done) return true; + if (jj_3R_91()) return true; + return false; + } + + inline bool jj_3R_550() + { + if (jj_done) return true; + if (jj_3R_108()) return true; + return false; + } + + inline bool jj_3_38() + { + if (jj_done) return true; + if (jj_3R_90()) return true; + return false; + } + + inline bool jj_3R_491() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3_38()) { + jj_scanpos = xsp; + if (jj_3R_550()) { + jj_scanpos = xsp; + if (jj_3_39()) { + jj_scanpos = xsp; + if (jj_3_40()) { + jj_scanpos = xsp; + if (jj_3R_551()) { + jj_scanpos = xsp; + if (jj_3R_552()) return true; + } + } + } + } + } + return false; + } + + inline bool jj_3R_621() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_181() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_69()) return true; + return false; + } + + inline bool jj_3R_416() + { + if (jj_done) return true; + if (jj_scan_token(ALL_T)) return true; + return false; + } + + inline bool jj_3R_415() + { + if (jj_done) return true; + if (jj_scan_token(OTHER_T)) return true; + return false; + } + + inline bool jj_3R_331() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_414()) { + jj_scanpos = xsp; + if (jj_3R_415()) { + jj_scanpos = xsp; + if (jj_3R_416()) return true; + } + } + return false; + } + + inline bool jj_3R_414() + { + if (jj_done) return true; + if (jj_3R_197()) return true; + return false; + } + + inline bool jj_3R_698() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_328() + { + if (jj_done) return true; + if (jj_scan_token(CONFIGURATION_T)) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_327() + { + if (jj_done) return true; + if (jj_scan_token(ENTITY_T)) return true; + if (jj_3R_60()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_413()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_174() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_326()) { + jj_scanpos = xsp; + if (jj_3R_327()) { + jj_scanpos = xsp; + if (jj_3R_328()) return true; + } + } + return false; + } + + inline bool jj_3_37() + { + if (jj_done) return true; + if (jj_3R_69()) return true; + return false; + } + + inline bool jj_3R_326() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_scan_token(28)) jj_scanpos = xsp; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_155() + { + if (jj_done) return true; + if (jj_3R_158()) return true; + if (jj_scan_token(RANGE_T)) return true; + if (jj_scan_token(BOX_T)) return true; + return false; + } + + inline bool jj_3R_427() + { + if (jj_done) return true; + if (jj_scan_token(IS_T)) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_698()) { + jj_scanpos = xsp; + if (jj_scan_token(145)) return true; + } + return false; + } + + inline bool jj_3R_618() + { + if (jj_done) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_617() + { + if (jj_done) return true; + if (jj_3R_69()) return true; + return false; + } + + inline bool jj_3R_565() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_617()) { + jj_scanpos = xsp; + if (jj_3R_618()) return true; + } + return false; + } + + inline bool jj_3R_83() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_69()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_181()) { jj_scanpos = xsp; break; } + } + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_620() + { + if (jj_done) return true; + if (jj_scan_token(ELSE_T)) return true; + if (jj_3R_259()) return true; + return false; + } + + inline bool jj_3R_526() + { + if (jj_done) return true; + if (jj_scan_token(TYPE_T)) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_619() + { + if (jj_done) return true; + if (jj_scan_token(ELSIF_T)) return true; + if (jj_3R_80()) return true; + if (jj_scan_token(THEN_T)) return true; + if (jj_3R_259()) return true; + return false; + } + + inline bool jj_3R_345() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_514() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_313()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_255() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_121() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_255()) jj_scanpos = xsp; + if (jj_scan_token(IF_T)) return true; + if (jj_3R_80()) return true; + if (jj_scan_token(THEN_T)) return true; + if (jj_3R_259()) return true; + while (true) { + xsp = jj_scanpos; + if (jj_3R_619()) { jj_scanpos = xsp; break; } + } + xsp = jj_scanpos; + if (jj_3R_620()) jj_scanpos = xsp; + if (jj_scan_token(END_T)) return true; + if (jj_scan_token(IF_T)) return true; + xsp = jj_scanpos; + if (jj_3R_621()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_197() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_345()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_165() + { + if (jj_done) return true; + if (jj_scan_token(BASIC_IDENTIFIER)) return true; + return false; + } + + inline bool jj_3R_164() + { + if (jj_done) return true; + if (jj_scan_token(EXTENDED_CHARACTER)) return true; + return false; + } + + inline bool jj_3R_70() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_164()) { + jj_scanpos = xsp; + if (jj_3R_165()) return true; + } + return false; + } + + inline bool jj_3R_539() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_538()) return true; + return false; + } + + inline bool jj_3R_425() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_scan_token(77)) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_514()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3_114() + { + if (jj_done) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(WHEN_T)) return true; + return false; + } + + inline bool jj_3R_66() + { + if (jj_done) return true; + if (jj_scan_token(GROUP_T)) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(IS_T)) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_475()) return true; + if (jj_scan_token(RPAREN_T)) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_386() + { + if (jj_done) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(WHEN_T)) return true; + if (jj_3R_86()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_scan_token(134)) { + jj_scanpos = xsp; + if (jj_scan_token(137)) return true; + } + return false; + } + + inline bool jj_3R_447() + { + if (jj_done) return true; + if (jj_3R_523()) return true; + return false; + } + + inline bool jj_3R_383() + { + if (jj_done) return true; + if (jj_scan_token(GROUP_T)) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_476()) return true; + if (jj_scan_token(RPAREN_T)) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_524() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_449()) return true; + return false; + } + + inline bool jj_3R_540() + { + if (jj_done) return true; + if (jj_scan_token(WHEN_T)) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_305() + { + if (jj_done) return true; + if (jj_3R_384()) return true; + return false; + } + + inline bool jj_3R_476() + { + if (jj_done) return true; + if (jj_3R_538()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_539()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_426() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_scan_token(84)) { + jj_scanpos = xsp; + if (jj_scan_token(52)) return true; + } + return false; + } + + inline bool jj_3R_344() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_426()) jj_scanpos = xsp; + if (jj_scan_token(FUNCTION_T)) return true; + if (jj_3R_60()) return true; + if (jj_3R_425()) return true; + if (jj_scan_token(RETURN_T)) return true; + if (jj_3R_60()) return true; + xsp = jj_scanpos; + if (jj_3R_427()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_171() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_608() + { + if (jj_done) return true; + if (jj_3R_352()) return true; + return false; + } + + inline bool jj_3R_607() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_538() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_607()) { + jj_scanpos = xsp; + if (jj_3R_608()) return true; + } + return false; + } + + inline bool jj_3R_71() + { + if (jj_done) return true; + if (jj_scan_token(GENERIC_T)) return true; + if (jj_scan_token(MAP_T)) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_166()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_304() + { + if (jj_done) return true; + if (jj_3R_59()) return true; + if (jj_3R_385()) return true; + return false; + } + + inline bool jj_3R_343() + { + if (jj_done) return true; + if (jj_scan_token(PROCEDURE_T)) return true; + if (jj_3R_70()) return true; + if (jj_3R_425()) return true; + return false; + } + + inline bool jj_3R_195() + { + if (jj_done) return true; + if (jj_3R_344()) return true; + return false; + } + + inline bool jj_3R_159() + { + if (jj_done) return true; + if (jj_3R_313()) return true; + return false; + } + + inline bool jj_3R_194() + { + if (jj_done) return true; + if (jj_3R_343()) return true; + return false; + } + + inline bool jj_3R_90() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_194()) { + jj_scanpos = xsp; + if (jj_3R_195()) return true; + } + return false; + } + + inline bool jj_3R_67() + { + if (jj_done) return true; + if (jj_scan_token(GENERIC_T)) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_159()) return true; + if (jj_scan_token(RPAREN_T)) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_477() + { + if (jj_done) return true; + if (jj_scan_token(ELSE_T)) return true; + if (jj_3R_59()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_540()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_385() + { + if (jj_done) return true; + Token * xsp; + if (jj_3R_477()) return true; + while (true) { + xsp = jj_scanpos; + if (jj_3R_477()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_322() + { + if (jj_done) return true; + if (jj_scan_token(IF_T)) return true; + if (jj_3R_80()) return true; + return false; + } + + inline bool jj_3R_169() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_321()) { + jj_scanpos = xsp; + if (jj_3R_322()) return true; + } + return false; + } + + inline bool jj_3R_321() + { + if (jj_done) return true; + if (jj_scan_token(FOR_T)) return true; + if (jj_3R_408()) return true; + return false; + } + + inline bool jj_3R_384() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_scan_token(53)) { + jj_scanpos = xsp; + if (jj_scan_token(75)) return true; + } + return false; + } + + inline bool jj_3R_448() + { + if (jj_done) return true; + if (jj_3R_405()) return true; + return false; + } + + inline bool jj_3R_449() + { + if (jj_done) return true; + if (jj_3R_446()) return true; + if (jj_scan_token(WHEN_T)) return true; + if (jj_3R_86()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_524()) { jj_scanpos = xsp; break; } + } + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_464() + { + if (jj_done) return true; + if (jj_3R_528()) return true; + return false; + } + + inline bool jj_3R_75() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + if (jj_3R_169()) return true; + if (jj_scan_token(GENERATE_T)) return true; + if (jj_3R_170()) return true; + if (jj_scan_token(END_T)) return true; + if (jj_scan_token(GENERATE_T)) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_171()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_306() + { + if (jj_done) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(WHEN_T)) return true; + if (jj_3R_86()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_scan_token(134)) { + jj_scanpos = xsp; + if (jj_scan_token(137)) return true; + } + while (true) { + xsp = jj_scanpos; + if (jj_3R_386()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_105() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_226()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_303() + { + if (jj_done) return true; + if (jj_3R_384()) return true; + return false; + } + + inline bool jj_3_110() + { + if (jj_done) return true; + if (jj_3R_143()) return true; + if (jj_scan_token(DOT_T)) return true; + return false; + } + + inline bool jj_3R_145() + { + if (jj_done) return true; + if (jj_scan_token(WITH_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(SELECT_T)) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_scan_token(155)) jj_scanpos = xsp; + if (jj_3R_115()) return true; + if (jj_scan_token(LESSTHAN_T)) return true; + if (jj_scan_token(FORCE_T)) return true; + xsp = jj_scanpos; + if (jj_3R_305()) jj_scanpos = xsp; + if (jj_3R_306()) return true; + return false; + } + + inline bool jj_3R_157() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_312()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3_113() + { + if (jj_done) return true; + if (jj_3R_109()) return true; + return false; + } + + inline bool jj_3R_369() + { + if (jj_done) return true; + if (jj_scan_token(WITH_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(SELECT_T)) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_scan_token(155)) jj_scanpos = xsp; + if (jj_3R_115()) return true; + if (jj_scan_token(LESSTHAN_T)) return true; + xsp = jj_scanpos; + if (jj_3R_448()) jj_scanpos = xsp; + if (jj_3R_449()) return true; + return false; + } + + inline bool jj_3R_301() + { + if (jj_done) return true; + if (jj_3R_143()) return true; + if (jj_scan_token(DOT_T)) return true; + return false; + } + + inline bool jj_3R_689() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_137() + { + if (jj_done) return true; + if (jj_scan_token(TYPE_T)) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(IS_T)) return true; + if (jj_3R_577()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_575() + { + if (jj_done) return true; + if (jj_scan_token(WHEN_T)) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_688() + { + if (jj_done) return true; + if (jj_3R_109()) return true; + return false; + } + + inline bool jj_3R_662() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_688()) { + jj_scanpos = xsp; + if (jj_3R_689()) return true; + } + return false; + } + + inline bool jj_3R_64() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_157()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_398() + { + if (jj_done) return true; + if (jj_scan_token(INTEGER)) return true; + return false; + } + + inline bool jj_3_112() + { + if (jj_done) return true; + if (jj_3R_145()) return true; + return false; + } + + inline bool jj_3R_570() + { + if (jj_done) return true; + if (jj_3R_313()) return true; + return false; + } + + inline bool jj_3R_521() + { + if (jj_done) return true; + if (jj_scan_token(WITH_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(SELECT_T)) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_scan_token(155)) jj_scanpos = xsp; + if (jj_3R_662()) return true; + if (jj_scan_token(VARASSIGN_T)) return true; + if (jj_3R_306()) return true; + return false; + } + + inline bool jj_3R_445() + { + if (jj_done) return true; + if (jj_3R_405()) return true; + return false; + } + + inline bool jj_3R_312() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_397()) { + jj_scanpos = xsp; + if (jj_3R_398()) return true; + } + return false; + } + + inline bool jj_3R_397() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_271() + { + if (jj_done) return true; + if (jj_3R_369()) return true; + return false; + } + + inline bool jj_3R_128() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_270()) { + jj_scanpos = xsp; + if (jj_3R_271()) return true; + } + return false; + } + + inline bool jj_3R_270() + { + if (jj_done) return true; + if (jj_3R_145()) return true; + return false; + } + + inline bool jj_3R_144() + { + if (jj_done) return true; + if (jj_3R_115()) return true; + if (jj_scan_token(LESSTHAN_T)) return true; + if (jj_scan_token(FORCE_T)) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_303()) jj_scanpos = xsp; + if (jj_3R_59()) return true; + if (jj_scan_token(WHEN_T)) return true; + xsp = jj_scanpos; + if (jj_3R_304()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_654() + { + if (jj_done) return true; + if (jj_scan_token(FILE_T)) return true; + if (jj_scan_token(OF_T)) return true; + if (jj_3R_158()) return true; + return false; + } + + inline bool jj_3R_523() + { + if (jj_done) return true; + if (jj_scan_token(ELSE_T)) return true; + if (jj_3R_59()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_575()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3_111() + { + if (jj_done) return true; + if (jj_3R_144()) return true; + return false; + } + + inline bool jj_3R_580() + { + if (jj_done) return true; + if (jj_scan_token(OPEN_T)) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_528() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_580()) jj_scanpos = xsp; + if (jj_scan_token(IS_T)) return true; + if (jj_3R_581()) return true; + return false; + } + + inline bool jj_3R_368() + { + if (jj_done) return true; + if (jj_3R_115()) return true; + if (jj_scan_token(LESSTHAN_T)) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_445()) jj_scanpos = xsp; + if (jj_3R_446()) return true; + if (jj_scan_token(WHEN_T)) return true; + if (jj_3R_59()) return true; + xsp = jj_scanpos; + if (jj_3R_447()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_269() + { + if (jj_done) return true; + if (jj_3R_368()) return true; + return false; + } + + inline bool jj_3R_581() + { + if (jj_done) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_127() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_268()) { + jj_scanpos = xsp; + if (jj_3R_269()) return true; + } + return false; + } + + inline bool jj_3R_268() + { + if (jj_done) return true; + if (jj_3R_144()) return true; + return false; + } + + inline bool jj_3R_450() + { + if (jj_done) return true; + if (jj_scan_token(DOUBLEMULT_T)) return true; + if (jj_3R_370()) return true; + return false; + } + + inline bool jj_3R_142() + { + if (jj_done) return true; + if (jj_3R_143()) return true; + if (jj_scan_token(DOT_T)) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_301()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_549() + { + if (jj_done) return true; + if (jj_scan_token(AT_T)) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_302() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3_109() + { + if (jj_done) return true; + if (jj_3R_142()) return true; + return false; + } + + inline bool jj_3R_376() + { + if (jj_done) return true; + if (jj_scan_token(FILE_T)) return true; + if (jj_3R_197()) return true; + if (jj_scan_token(COLON_T)) return true; + if (jj_3R_85()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_464()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_264() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_284() + { + if (jj_done) return true; + if (jj_scan_token(NOT_T)) return true; + if (jj_3R_370()) return true; + return false; + } + + inline bool jj_3R_283() + { + if (jj_done) return true; + if (jj_scan_token(ABS_T)) return true; + if (jj_3R_370()) return true; + return false; + } + + inline bool jj_3R_136() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_282()) { + jj_scanpos = xsp; + if (jj_3R_283()) { + jj_scanpos = xsp; + if (jj_3R_284()) return true; + } + } + return false; + } + + inline bool jj_3R_282() + { + if (jj_done) return true; + if (jj_3R_370()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_450()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_612() + { + if (jj_done) return true; + if (jj_3R_142()) return true; + return false; + } + + inline bool jj_3R_699() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_97()) return true; + return false; + } + + inline bool jj_3R_147() + { + if (jj_done) return true; + if (jj_3R_309()) return true; + if (jj_3R_146()) return true; + return false; + } + + inline bool jj_3R_143() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_302()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_394() + { + if (jj_done) return true; + if (jj_scan_token(OR_T)) return true; + return false; + } + + inline bool jj_3R_393() + { + if (jj_done) return true; + if (jj_scan_token(XOR_T)) return true; + return false; + } + + inline bool jj_3R_392() + { + if (jj_done) return true; + if (jj_scan_token(XNOR_T)) return true; + return false; + } + + inline bool jj_3R_391() + { + if (jj_done) return true; + if (jj_scan_token(NOR_T)) return true; + return false; + } + + inline bool jj_3R_636() + { + if (jj_done) return true; + if (jj_scan_token(NEG_T)) return true; + if (jj_scan_token(DOT_T)) return true; + return false; + } + + inline bool jj_3R_390() + { + if (jj_done) return true; + if (jj_scan_token(NAND_T)) return true; + return false; + } + + inline bool jj_3R_611() + { + if (jj_done) return true; + Token * xsp; + if (jj_3R_636()) return true; + while (true) { + xsp = jj_scanpos; + if (jj_3R_636()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_410() + { + if (jj_done) return true; + if (jj_3R_498()) return true; + return false; + } + + inline bool jj_3R_309() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_389()) { + jj_scanpos = xsp; + if (jj_3R_390()) { + jj_scanpos = xsp; + if (jj_3R_391()) { + jj_scanpos = xsp; + if (jj_3R_392()) { + jj_scanpos = xsp; + if (jj_3R_393()) { + jj_scanpos = xsp; + if (jj_3R_394()) return true; + } + } + } + } + } + return false; + } + + inline bool jj_3R_389() + { + if (jj_done) return true; + if (jj_scan_token(AND_T)) return true; + return false; + } + + inline bool jj_3_108() + { + if (jj_done) return true; + if (jj_scan_token(DOT_T)) return true; + if (jj_3R_142()) return true; + return false; + } + + inline bool jj_3R_548() + { + if (jj_done) return true; + if (jj_3R_611()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_612()) jj_scanpos = xsp; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_610() + { + if (jj_done) return true; + if (jj_scan_token(DOT_T)) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_59() + { + if (jj_done) return true; + if (jj_3R_146()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_147()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_609() + { + if (jj_done) return true; + if (jj_scan_token(DOT_T)) return true; + if (jj_3R_142()) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_547() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_609()) { + jj_scanpos = xsp; + if (jj_3R_610()) return true; + } + return false; + } + + inline bool jj_3R_490() + { + if (jj_done) return true; + if (jj_3R_549()) return true; + return false; + } + + inline bool jj_3R_489() + { + if (jj_done) return true; + if (jj_3R_548()) return true; + return false; + } + + inline bool jj_3R_396() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_488()) { + jj_scanpos = xsp; + if (jj_3R_489()) { + jj_scanpos = xsp; + if (jj_3R_490()) return true; + } + } + return false; + } + + inline bool jj_3R_488() + { + if (jj_done) return true; + if (jj_3R_547()) return true; + return false; + } + + inline bool jj_3_105() + { + if (jj_done) return true; + if (jj_3R_139()) return true; + return false; + } + + inline bool jj_3R_265() + { + if (jj_done) return true; + if (jj_scan_token(WHEN_T)) return true; + if (jj_3R_80()) return true; + return false; + } + + inline bool jj_3R_263() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_487() + { + if (jj_done) return true; + if (jj_scan_token(VARIABLE_T)) return true; + return false; + } + + inline bool jj_3R_125() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_263()) jj_scanpos = xsp; + if (jj_scan_token(EXIT_T)) return true; + xsp = jj_scanpos; + if (jj_3R_264()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_265()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_486() + { + if (jj_done) return true; + if (jj_scan_token(SIGNAL_T)) return true; + return false; + } + + inline bool jj_3R_395() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_485()) { + jj_scanpos = xsp; + if (jj_3R_486()) { + jj_scanpos = xsp; + if (jj_3R_487()) return true; + } + } + return false; + } + + inline bool jj_3R_485() + { + if (jj_done) return true; + if (jj_scan_token(CONSTANT_T)) return true; + return false; + } + + inline bool jj_3R_690() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_97()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_699()) { jj_scanpos = xsp; break; } + } + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_275() + { + if (jj_done) return true; + if (jj_3R_133()) return true; + return false; + } + + inline bool jj_3R_209() + { + if (jj_done) return true; + if (jj_3R_352()) return true; + return false; + } + + inline bool jj_3_107() + { + if (jj_done) return true; + if (jj_3R_141()) return true; + if (jj_scan_token(BEGIN_T)) return true; + return false; + } + + inline bool jj_3R_208() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_97() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_208()) { + jj_scanpos = xsp; + if (jj_3R_209()) return true; + } + return false; + } + + inline bool jj_3R_311() + { + if (jj_done) return true; + if (jj_scan_token(SLSL_T)) return true; + if (jj_3R_395()) return true; + if (jj_3R_396()) return true; + if (jj_scan_token(COLON_T)) return true; + if (jj_3R_85()) return true; + if (jj_scan_token(RSRS_T)) return true; + return false; + } + + inline bool jj_3R_411() + { + if (jj_done) return true; + if (jj_3R_498()) return true; + return false; + } + + inline bool jj_3R_697() + { + if (jj_done) return true; + if (jj_3R_352()) return true; + return false; + } + + inline bool jj_3R_324() + { + if (jj_done) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_411()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_409() + { + if (jj_done) return true; + if (jj_3R_141()) return true; + return false; + } + + inline bool jj_3R_696() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_683() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_696()) { + jj_scanpos = xsp; + if (jj_3R_697()) return true; + } + return false; + } + + inline bool jj_3R_170() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_323()) { + jj_scanpos = xsp; + if (jj_3R_324()) return true; + } + return false; + } + + inline bool jj_3R_323() + { + if (jj_done) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_409()) { jj_scanpos = xsp; break; } + } + if (jj_scan_token(BEGIN_T)) return true; + while (true) { + xsp = jj_scanpos; + if (jj_3R_410()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3_36() + { + if (jj_done) return true; + if (jj_3R_89()) return true; + return false; + } + + inline bool jj_3R_285() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_687() + { + if (jj_done) return true; + if (jj_scan_token(BEGIN_T)) return true; + if (jj_3R_687()) return true; + return false; + } + + inline bool jj_3_35() + { + if (jj_done) return true; + if (jj_3R_88()) return true; + return false; + } + + inline bool jj_3R_235() + { + if (jj_done) return true; + if (jj_3R_133()) return true; + return false; + } + + inline bool jj_3_106() + { + if (jj_done) return true; + if (jj_3R_140()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_139() + { + if (jj_done) return true; + if (jj_scan_token(END_T)) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_285()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_637() + { + if (jj_done) return true; + if (jj_3R_133()) return true; + return false; + } + + inline bool jj_3R_661() + { + if (jj_done) return true; + if (jj_scan_token(WHEN_T)) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3_106()) jj_scanpos = xsp; + if (jj_3R_86()) return true; + if (jj_scan_token(ARROW_T)) return true; + if (jj_3R_687()) return true; + return false; + } + + inline bool jj_3R_649() + { + if (jj_done) return true; + Token * xsp; + if (jj_3R_661()) return true; + while (true) { + xsp = jj_scanpos; + if (jj_3R_661()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_471() + { + if (jj_done) return true; + if (jj_3R_533()) return true; + if (jj_scan_token(COLON_T)) return true; + if (jj_3R_534()) return true; + return false; + } + + inline bool jj_3R_684() + { + if (jj_done) return true; + if (jj_3R_234()) return true; + return false; + } + + inline bool jj_3R_585() + { + if (jj_done) return true; + if (jj_scan_token(ALL_T)) return true; + return false; + } + + inline bool jj_3R_584() + { + if (jj_done) return true; + if (jj_scan_token(OTHER_T)) return true; + return false; + } + + inline bool jj_3R_615() + { + if (jj_done) return true; + if (jj_scan_token(CASE_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(GENERATE_T)) return true; + if (jj_3R_649()) return true; + return false; + } + + inline bool jj_3R_634() + { + if (jj_done) return true; + if (jj_3R_656()) return true; + return false; + } + + inline bool jj_3R_583() + { + if (jj_done) return true; + Token * xsp; + if (jj_3R_634()) return true; + while (true) { + xsp = jj_scanpos; + if (jj_3R_634()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_533() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_583()) { + jj_scanpos = xsp; + if (jj_3R_584()) { + jj_scanpos = xsp; + if (jj_3R_585()) return true; + } + } + return false; + } + + inline bool jj_3R_656() + { + if (jj_done) return true; + if (jj_3R_683()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_684()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_132() + { + if (jj_done) return true; + if (jj_scan_token(GENERIC_T)) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_313()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_133() + { + if (jj_done) return true; + if (jj_scan_token(GENERIC_T)) return true; + if (jj_scan_token(MAP_T)) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_166()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3_32() + { + if (jj_done) return true; + if (jj_3R_65()) return true; + return false; + } + + inline bool jj_3_34() + { + if (jj_done) return true; + if (jj_3R_87()) return true; + return false; + } + + inline bool jj_3_33() + { + if (jj_done) return true; + if (jj_3R_66()) return true; + return false; + } + + inline bool jj_3R_537() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_536()) return true; + return false; + } + + inline bool jj_3R_131() + { + if (jj_done) return true; + if (jj_scan_token(FUNCTION_T)) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(IS_T)) return true; + if (jj_scan_token(NEW_T)) return true; + if (jj_3R_60()) return true; + if (jj_3R_234()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_275()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_108() + { + if (jj_done) return true; + if (jj_scan_token(PACKAGE_T)) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(IS_T)) return true; + if (jj_scan_token(NEW_T)) return true; + if (jj_3R_60()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_637()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_87() + { + if (jj_done) return true; + if (jj_scan_token(PACKAGE_T)) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(IS_T)) return true; + if (jj_scan_token(NEW_T)) return true; + if (jj_3R_60()) return true; + if (jj_3R_234()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_235()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_606() + { + if (jj_done) return true; + if (jj_scan_token(BOX_T)) return true; + return false; + } + + inline bool jj_3R_349() + { + if (jj_done) return true; + if (jj_scan_token(ENTITY_T)) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_682() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_475() + { + if (jj_done) return true; + if (jj_3R_536()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_537()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_254() + { + if (jj_done) return true; + if (jj_3R_366()) return true; + return false; + } + + inline bool jj_3R_536() + { + if (jj_done) return true; + if (jj_3R_534()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_606()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_616() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_602() + { + if (jj_done) return true; + if (jj_scan_token(FILE_T)) return true; + return false; + } + + inline bool jj_3R_695() + { + if (jj_done) return true; + if (jj_3R_705()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_601() + { + if (jj_done) return true; + if (jj_scan_token(GROUP_T)) return true; + return false; + } + + inline bool jj_3R_681() + { + if (jj_done) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_695()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_600() + { + if (jj_done) return true; + if (jj_scan_token(UNITS_T)) return true; + return false; + } + + inline bool jj_3R_599() + { + if (jj_done) return true; + if (jj_scan_token(LITERAL_T)) return true; + return false; + } + + inline bool jj_3R_598() + { + if (jj_done) return true; + if (jj_scan_token(LABEL_T)) return true; + return false; + } + + inline bool jj_3R_722() + { + if (jj_done) return true; + if (jj_3R_382()) return true; + return false; + } + + inline bool jj_3R_597() + { + if (jj_done) return true; + if (jj_scan_token(COMPONENT_T)) return true; + return false; + } + + inline bool jj_3R_721() + { + if (jj_done) return true; + if (jj_3R_379()) return true; + return false; + } + + inline bool jj_3R_596() + { + if (jj_done) return true; + if (jj_scan_token(VARIABLE_T)) return true; + return false; + } + + inline bool jj_3R_595() + { + if (jj_done) return true; + if (jj_scan_token(SIGNAL_T)) return true; + return false; + } + + inline bool jj_3R_594() + { + if (jj_done) return true; + if (jj_scan_token(CONSTANT_T)) return true; + return false; + } + + inline bool jj_3R_720() + { + if (jj_done) return true; + if (jj_3R_347()) return true; + return false; + } + + inline bool jj_3R_705() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_720()) { + jj_scanpos = xsp; + if (jj_3R_721()) { + jj_scanpos = xsp; + if (jj_3R_722()) return true; + } + } + return false; + } + + inline bool jj_3R_593() + { + if (jj_done) return true; + if (jj_scan_token(SUBTYPE_T)) return true; + return false; + } + + inline bool jj_3R_592() + { + if (jj_done) return true; + if (jj_scan_token(TYPE_T)) return true; + return false; + } + + inline bool jj_3R_591() + { + if (jj_done) return true; + if (jj_scan_token(PACKAGE_T)) return true; + return false; + } + + inline bool jj_3R_590() + { + if (jj_done) return true; + if (jj_scan_token(FUNCTION_T)) return true; + return false; + } + + inline bool jj_3R_589() + { + if (jj_done) return true; + if (jj_scan_token(PROCEDURE_T)) return true; + return false; + } + + inline bool jj_3R_680() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_588() + { + if (jj_done) return true; + if (jj_scan_token(CONFIGURATION_T)) return true; + return false; + } + + inline bool jj_3R_587() + { + if (jj_done) return true; + if (jj_scan_token(ARCHITECTURE_T)) return true; + return false; + } + + inline bool jj_3R_586() + { + if (jj_done) return true; + if (jj_scan_token(ENTITY_T)) return true; + return false; + } + + inline bool jj_3R_534() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_586()) { + jj_scanpos = xsp; + if (jj_3R_587()) { + jj_scanpos = xsp; + if (jj_3R_588()) { + jj_scanpos = xsp; + if (jj_3R_589()) { + jj_scanpos = xsp; + if (jj_3R_590()) { + jj_scanpos = xsp; + if (jj_3R_591()) { + jj_scanpos = xsp; + if (jj_3R_592()) { + jj_scanpos = xsp; + if (jj_3R_593()) { + jj_scanpos = xsp; + if (jj_3R_594()) { + jj_scanpos = xsp; + if (jj_3R_595()) { + jj_scanpos = xsp; + if (jj_3R_596()) { + jj_scanpos = xsp; + if (jj_3R_597()) { + jj_scanpos = xsp; + if (jj_3R_598()) { + jj_scanpos = xsp; + if (jj_3R_599()) { + jj_scanpos = xsp; + if (jj_3R_600()) { + jj_scanpos = xsp; + if (jj_3R_601()) { + jj_scanpos = xsp; + if (jj_3R_602()) return true; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + return false; + } + + inline bool jj_3R_253() + { + if (jj_done) return true; + if (jj_3R_365()) return true; + return false; + } + + inline bool jj_3R_655() + { + if (jj_done) return true; + if (jj_scan_token(PROTECTED_T)) return true; + if (jj_3R_681()) return true; + if (jj_scan_token(END_T)) return true; + if (jj_scan_token(PROTECTED_T)) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_682()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3_103() + { + if (jj_done) return true; + if (jj_3R_65()) return true; + return false; + } + + inline bool jj_3R_564() + { + if (jj_done) return true; + if (jj_scan_token(OPEN_T)) return true; + return false; + } + + inline bool jj_3R_563() + { + if (jj_done) return true; + if (jj_scan_token(CONFIGURATION_T)) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_694() + { + if (jj_done) return true; + if (jj_3R_704()) return true; + return false; + } + + inline bool jj_3R_679() + { + if (jj_done) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_694()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_562() + { + if (jj_done) return true; + if (jj_scan_token(ENTITY_T)) return true; + if (jj_3R_60()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_616()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_500() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_562()) { + jj_scanpos = xsp; + if (jj_3R_563()) { + jj_scanpos = xsp; + if (jj_3R_564()) return true; + } + } + return false; + } + + inline bool jj_3R_719() + { + if (jj_done) return true; + if (jj_3R_383()) return true; + return false; + } + + inline bool jj_3_31() + { + if (jj_done) return true; + if (jj_3R_86()) return true; + if (jj_scan_token(ARROW_T)) return true; + return false; + } + + inline bool jj_3R_716() + { + if (jj_done) return true; + if (jj_3R_65()) return true; + return false; + } + + inline bool jj_3R_707() + { + if (jj_done) return true; + if (jj_3R_197()) return true; + if (jj_scan_token(COLON_T)) return true; + if (jj_3R_85()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3_104() + { + if (jj_done) return true; + if (jj_3R_66()) return true; + return false; + } + + inline bool jj_3R_718() + { + if (jj_done) return true; + if (jj_3R_382()) return true; + return false; + } + + inline bool jj_3R_717() + { + if (jj_done) return true; + if (jj_3R_379()) return true; + return false; + } + + inline bool jj_3_30() + { + if (jj_done) return true; + if (jj_3R_85()) return true; + return false; + } + + inline bool jj_3R_715() + { + if (jj_done) return true; + if (jj_3R_377()) return true; + return false; + } + + inline bool jj_3R_714() + { + if (jj_done) return true; + if (jj_3R_376()) return true; + return false; + } + + inline bool jj_3_29() + { + if (jj_done) return true; + if (jj_3R_84()) return true; + return false; + } + + inline bool jj_3R_713() + { + if (jj_done) return true; + if (jj_3R_375()) return true; + return false; + } + + inline bool jj_3R_712() + { + if (jj_done) return true; + if (jj_3R_373()) return true; + return false; + } + + inline bool jj_3R_359() + { + if (jj_done) return true; + if (jj_3R_86()) return true; + if (jj_scan_token(ARROW_T)) return true; + return false; + } + + inline bool jj_3R_711() + { + if (jj_done) return true; + if (jj_3R_372()) return true; + return false; + } + + inline bool jj_3R_236() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_359()) jj_scanpos = xsp; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_710() + { + if (jj_done) return true; + if (jj_3R_371()) return true; + return false; + } + + inline bool jj_3R_708() + { + if (jj_done) return true; + if (jj_3R_93()) return true; + return false; + } + + inline bool jj_3R_704() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_708()) { + jj_scanpos = xsp; + if (jj_3R_709()) { + jj_scanpos = xsp; + if (jj_3R_710()) { + jj_scanpos = xsp; + if (jj_3R_711()) { + jj_scanpos = xsp; + if (jj_3R_712()) { + jj_scanpos = xsp; + if (jj_3R_713()) { + jj_scanpos = xsp; + if (jj_3R_714()) { + jj_scanpos = xsp; + if (jj_3R_715()) { + jj_scanpos = xsp; + if (jj_3R_716()) { + jj_scanpos = xsp; + if (jj_3R_717()) { + jj_scanpos = xsp; + if (jj_3R_718()) { + jj_scanpos = xsp; + if (jj_3_104()) { + jj_scanpos = xsp; + if (jj_3R_719()) return true; + } + } + } + } + } + } + } + } + } + } + } + } + return false; + } + + inline bool jj_3R_709() + { + if (jj_done) return true; + if (jj_3R_519()) return true; + return false; + } + + inline bool jj_3R_163() + { + if (jj_done) return true; + if (jj_3R_85()) return true; + return false; + } + + inline bool jj_3R_252() + { + if (jj_done) return true; + if (jj_3R_364()) return true; + return false; + } + + inline bool jj_3R_162() + { + if (jj_done) return true; + if (jj_3R_84()) return true; + return false; + } + + inline bool jj_3R_69() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_162()) { + jj_scanpos = xsp; + if (jj_3R_163()) return true; + } + return false; + } + + inline bool jj_3R_522() + { + if (jj_done) return true; + if (jj_scan_token(AFTER_T)) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_472() + { + if (jj_done) return true; + if (jj_3R_535()) return true; + if (jj_scan_token(COLON_T)) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_138() + { + if (jj_done) return true; + if (jj_scan_token(PROTECTED_T)) return true; + if (jj_scan_token(BODY_T)) return true; + if (jj_3R_679()) return true; + if (jj_scan_token(END_T)) return true; + if (jj_scan_token(PROTECTED_T)) return true; + if (jj_scan_token(BODY_T)) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_680()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_497() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_446()) return true; + return false; + } + + inline bool jj_3R_381() + { + if (jj_done) return true; + if (jj_scan_token(DISCONNECT_T)) return true; + if (jj_3R_472()) return true; + if (jj_scan_token(AFTER_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_460() + { + if (jj_done) return true; + if (jj_scan_token(VARASSIGN_T)) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_239() + { + if (jj_done) return true; + if (jj_scan_token(DOWNTO_T)) return true; + return false; + } + + inline bool jj_3R_110() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_238()) { + jj_scanpos = xsp; + if (jj_3R_239()) return true; + } + return false; + } + + inline bool jj_3R_238() + { + if (jj_done) return true; + if (jj_scan_token(TO_T)) return true; + return false; + } + + inline bool jj_3R_569() + { + if (jj_done) return true; + if (jj_3R_310()) return true; + return false; + } + + inline bool jj_3R_446() + { + if (jj_done) return true; + if (jj_3R_59()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_522()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_568() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_515() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_568()) { + jj_scanpos = xsp; + if (jj_3R_569()) return true; + } + return false; + } + + inline bool jj_3R_407() + { + if (jj_done) return true; + if (jj_scan_token(UNAFFECTED_T)) return true; + return false; + } + + inline bool jj_3R_318() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_406()) { + jj_scanpos = xsp; + if (jj_3R_407()) return true; + } + return false; + } + + inline bool jj_3R_406() + { + if (jj_done) return true; + if (jj_3R_446()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_497()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_553() + { + if (jj_done) return true; + if (jj_scan_token(REJECT_T)) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_251() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_496() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_553()) jj_scanpos = xsp; + if (jj_scan_token(INERTIAL_T)) return true; + return false; + } + + inline bool jj_3R_118() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_251()) jj_scanpos = xsp; + if (jj_scan_token(WAIT_T)) return true; + xsp = jj_scanpos; + if (jj_3R_252()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_253()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_254()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3_28() + { + if (jj_done) return true; + if (jj_3R_83()) return true; + return false; + } + + inline bool jj_3R_405() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_495()) { + jj_scanpos = xsp; + if (jj_3R_496()) return true; + } + return false; + } + + inline bool jj_3R_495() + { + if (jj_done) return true; + if (jj_scan_token(TRANSPORT_T)) return true; + return false; + } + + inline bool jj_3_27() + { + if (jj_done) return true; + if (jj_3R_82()) return true; + return false; + } + + inline bool jj_3R_277() + { + if (jj_done) return true; + if (jj_3R_83()) return true; + return false; + } + + inline bool jj_3R_156() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_155()) return true; + return false; + } + + inline bool jj_3R_134() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_276()) { + jj_scanpos = xsp; + if (jj_3R_277()) return true; + } + return false; + } + + inline bool jj_3R_276() + { + if (jj_done) return true; + if (jj_3R_82()) return true; + return false; + } + + inline bool jj_3R_463() + { + if (jj_done) return true; + if (jj_scan_token(VARASSIGN_T)) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_375() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_scan_token(101)) jj_scanpos = xsp; + if (jj_scan_token(VARIABLE_T)) return true; + if (jj_3R_197()) return true; + if (jj_scan_token(COLON_T)) return true; + if (jj_3R_85()) return true; + xsp = jj_scanpos; + if (jj_3R_463()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_474() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_473()) return true; + return false; + } + + inline bool jj_3R_706() + { + if (jj_done) return true; + if (jj_scan_token(ARRAY_T)) return true; + if (jj_3R_83()) return true; + if (jj_scan_token(OF_T)) return true; + if (jj_3R_85()) return true; + return false; + } + + inline bool jj_3R_441() + { + if (jj_done) return true; + if (jj_3R_521()) return true; + return false; + } + + inline bool jj_3_102() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_362() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_440()) { + jj_scanpos = xsp; + if (jj_3R_441()) return true; + } + return false; + } + + inline bool jj_3R_440() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3_102()) jj_scanpos = xsp; + if (jj_3R_115()) return true; + if (jj_scan_token(VARASSIGN_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_373() + { + if (jj_done) return true; + if (jj_scan_token(CONSTANT_T)) return true; + if (jj_3R_197()) return true; + if (jj_scan_token(COLON_T)) return true; + if (jj_3R_85()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_460()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3_26() + { + if (jj_done) return true; + if (jj_3R_81()) return true; + return false; + } + + inline bool jj_3R_380() + { + if (jj_done) return true; + if (jj_scan_token(FOR_T)) return true; + if (jj_3R_178()) return true; + if (jj_3R_332()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_567() + { + if (jj_done) return true; + if (jj_3R_333()) return true; + return false; + } + + inline bool jj_3R_382() + { + if (jj_done) return true; + if (jj_scan_token(USE_T)) return true; + if (jj_3R_473()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_474()) { jj_scanpos = xsp; break; } + } + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_566() + { + if (jj_done) return true; + if (jj_3R_81()) return true; + return false; + } + + inline bool jj_3R_502() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_566()) { + jj_scanpos = xsp; + if (jj_3R_567()) return true; + } + return false; + } + + inline bool jj_3R_63() + { + if (jj_done) return true; + if (jj_scan_token(ARRAY_T)) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_155()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_156()) { jj_scanpos = xsp; break; } + } + if (jj_scan_token(RPAREN_T)) return true; + if (jj_scan_token(OF_T)) return true; + if (jj_3R_85()) return true; + return false; + } + + inline bool jj_3R_158() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_633() + { + if (jj_done) return true; + if (jj_3R_655()) return true; + return false; + } + + inline bool jj_3_101() + { + if (jj_done) return true; + if (jj_3R_138()) return true; + return false; + } + + inline bool jj_3R_632() + { + if (jj_done) return true; + if (jj_3R_654()) return true; + return false; + } + + inline bool jj_3R_631() + { + if (jj_done) return true; + if (jj_3R_653()) return true; + return false; + } + + inline bool jj_3R_630() + { + if (jj_done) return true; + if (jj_3R_652()) return true; + return false; + } + + inline bool jj_3R_629() + { + if (jj_done) return true; + if (jj_3R_651()) return true; + return false; + } + + inline bool jj_3R_577() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_629()) { + jj_scanpos = xsp; + if (jj_3R_630()) { + jj_scanpos = xsp; + if (jj_3R_631()) { + jj_scanpos = xsp; + if (jj_3R_632()) { + jj_scanpos = xsp; + if (jj_3_101()) { + jj_scanpos = xsp; + if (jj_3R_633()) return true; + } + } + } + } + } + return false; + } + + inline bool jj_3_25() + { + if (jj_done) return true; + if (jj_scan_token(WHEN_T)) return true; + if (jj_3R_80()) return true; + if (jj_scan_token(ELSE_T)) return true; + return false; + } + + inline bool jj_3R_350() + { + if (jj_done) return true; + if (jj_scan_token(CONFIGURATION_T)) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3_97() + { + if (jj_done) return true; + if (jj_3R_134()) return true; + return false; + } + + inline bool jj_3R_459() + { + if (jj_done) return true; + if (jj_3R_526()) return true; + return false; + } + + inline bool jj_3_100() + { + if (jj_done) return true; + if (jj_3R_137()) return true; + return false; + } + + inline bool jj_3R_371() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3_100()) { + jj_scanpos = xsp; + if (jj_3R_459()) return true; + } + return false; + } + + inline bool jj_3R_320() + { + if (jj_done) return true; + if (jj_scan_token(WHEN_T)) return true; + if (jj_3R_80()) return true; + return false; + } + + inline bool jj_3R_106() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_319() + { + if (jj_done) return true; + if (jj_scan_token(WHEN_T)) return true; + if (jj_3R_80()) return true; + if (jj_scan_token(ELSE_T)) return true; + if (jj_3R_318()) return true; + return false; + } + + inline bool jj_3_99() + { + if (jj_done) return true; + if (jj_3R_135()) return true; + if (jj_3R_136()) return true; + return false; + } + + inline bool jj_3R_185() + { + if (jj_done) return true; + if (jj_3R_134()) return true; + return false; + } + + inline bool jj_3R_168() + { + if (jj_done) return true; + if (jj_3R_318()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_319()) { jj_scanpos = xsp; break; } + } + xsp = jj_scanpos; + if (jj_3R_320()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_366() + { + if (jj_done) return true; + if (jj_scan_token(FOR_T)) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_72() + { + if (jj_done) return true; + if (jj_3R_115()) return true; + if (jj_scan_token(LESSTHAN_T)) return true; + if (jj_3R_167()) return true; + if (jj_3R_168()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_130() + { + if (jj_done) return true; + if (jj_3R_136()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_99()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_247() + { + if (jj_done) return true; + if (jj_3R_109()) return true; + return false; + } + + inline bool jj_3R_365() + { + if (jj_done) return true; + if (jj_scan_token(UNTIL_T)) return true; + if (jj_3R_80()) return true; + return false; + } + + inline bool jj_3R_115() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_246()) { + jj_scanpos = xsp; + if (jj_3R_247()) return true; + } + return false; + } + + inline bool jj_3_98() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_246() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3_96() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_218() + { + if (jj_done) return true; + if (jj_scan_token(ALL_T)) return true; + return false; + } + + inline bool jj_3R_80() + { + if (jj_done) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_217() + { + if (jj_done) return true; + if (jj_3R_310()) return true; + return false; + } + + inline bool jj_3R_216() + { + if (jj_done) return true; + if (jj_3R_352()) return true; + return false; + } + + inline bool jj_3_24() + { + if (jj_done) return true; + if (jj_3R_79()) return true; + return false; + } + + inline bool jj_3R_215() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_100() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_215()) { + jj_scanpos = xsp; + if (jj_3R_216()) { + jj_scanpos = xsp; + if (jj_3R_217()) { + jj_scanpos = xsp; + if (jj_3R_218()) return true; + } + } + } + return false; + } + + inline bool jj_3_23() + { + if (jj_done) return true; + if (jj_3R_78()) return true; + return false; + } + + inline bool jj_3R_184() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3_22() + { + if (jj_done) return true; + if (jj_3R_77()) return true; + return false; + } + + inline bool jj_3R_85() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_184()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_185()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_76() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3_21() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_76()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_scan_token(79)) jj_scanpos = xsp; + if (jj_scan_token(ASSERT_T)) return true; + return false; + } + + inline bool jj_3R_561() + { + if (jj_done) return true; + if (jj_3R_79()) return true; + return false; + } + + inline bool jj_3R_560() + { + if (jj_done) return true; + if (jj_3R_78()) return true; + return false; + } + + inline bool jj_3_20() + { + if (jj_done) return true; + if (jj_3R_75()) return true; + return false; + } + + inline bool jj_3R_559() + { + if (jj_done) return true; + if (jj_3R_77()) return true; + return false; + } + + inline bool jj_3R_74() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_372() + { + if (jj_done) return true; + if (jj_scan_token(SUBTYPE_T)) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(IS_T)) return true; + if (jj_3R_85()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3_19() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_74()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_scan_token(79)) jj_scanpos = xsp; + if (jj_scan_token(PROCESS_T)) return true; + return false; + } + + inline bool jj_3R_627() + { + if (jj_done) return true; + if (jj_3R_113()) return true; + return false; + } + + inline bool jj_3R_572() + { + if (jj_done) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_627()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_558() + { + if (jj_done) return true; + if (jj_3R_88()) return true; + return false; + } + + inline bool jj_3R_73() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3_18() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_73()) jj_scanpos = xsp; + if (jj_scan_token(BLOCK_T)) return true; + return false; + } + + inline bool jj_3_95() + { + if (jj_done) return true; + if (jj_3R_133()) return true; + return false; + } + + inline bool jj_3R_516() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_313()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_557() + { + if (jj_done) return true; + if (jj_3R_615()) return true; + return false; + } + + inline bool jj_3_94() + { + if (jj_done) return true; + if (jj_3R_132()) return true; + return false; + } + + inline bool jj_3R_556() + { + if (jj_done) return true; + if (jj_3R_75()) return true; + return false; + } + + inline bool jj_3R_555() + { + if (jj_done) return true; + if (jj_3R_89()) return true; + return false; + } + + inline bool jj_3R_554() + { + if (jj_done) return true; + if (jj_3R_614()) return true; + return false; + } + + inline bool jj_3R_498() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_554()) { + jj_scanpos = xsp; + if (jj_3R_555()) { + jj_scanpos = xsp; + if (jj_3R_556()) { + jj_scanpos = xsp; + if (jj_3R_557()) { + jj_scanpos = xsp; + if (jj_3R_558()) { + jj_scanpos = xsp; + if (jj_3R_559()) { + jj_scanpos = xsp; + if (jj_3R_560()) { + jj_scanpos = xsp; + if (jj_3R_561()) { + jj_scanpos = xsp; + if (jj_scan_token(186)) return true; + } + } + } + } + } + } + } + } + return false; + } + + inline bool jj_3R_518() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_570()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3_17() + { + if (jj_done) return true; + if (jj_3R_72()) return true; + return false; + } + + inline bool jj_3R_173() + { + if (jj_done) return true; + if (jj_3R_325()) return true; + return false; + } + + inline bool jj_3R_517() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_scan_token(84)) { + jj_scanpos = xsp; + if (jj_scan_token(52)) return true; + } + return false; + } + + inline bool jj_3R_172() + { + if (jj_done) return true; + if (jj_3R_72()) return true; + return false; + } + + inline bool jj_3_16() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_434() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_517()) jj_scanpos = xsp; + if (jj_scan_token(FUNCTION_T)) return true; + if (jj_3R_515()) return true; + xsp = jj_scanpos; + if (jj_3R_518()) jj_scanpos = xsp; + if (jj_scan_token(RETURN_T)) return true; + if (jj_3R_158()) return true; + return false; + } + + inline bool jj_3R_77() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3_16()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_scan_token(79)) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_172()) { + jj_scanpos = xsp; + if (jj_3R_173()) return true; + } + return false; + } + + inline bool jj_3_15() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_79() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3_15()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_scan_token(79)) jj_scanpos = xsp; + if (jj_3R_177()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3_14() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3_13() + { + if (jj_done) return true; + if (jj_3R_71()) return true; + return false; + } + + inline bool jj_3R_88() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3_14()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_scan_token(79)) jj_scanpos = xsp; + if (jj_3R_188()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_678() + { + if (jj_done) return true; + if (jj_3R_693()) return true; + return false; + } + + inline bool jj_3R_470() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_347() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_433()) { + jj_scanpos = xsp; + if (jj_3R_434()) return true; + } + return false; + } + + inline bool jj_3R_433() + { + if (jj_done) return true; + if (jj_scan_token(PROCEDURE_T)) return true; + if (jj_3R_515()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_516()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3_94()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3_95()) jj_scanpos = xsp; + if (jj_3R_425()) return true; + return false; + } + + inline bool jj_3R_677() + { + if (jj_done) return true; + if (jj_3R_692()) return true; + return false; + } + + inline bool jj_3R_652() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_677()) { + jj_scanpos = xsp; + if (jj_3R_678()) return true; + } + return false; + } + + inline bool jj_3R_176() + { + if (jj_done) return true; + if (jj_3R_329()) return true; + return false; + } + + inline bool jj_3R_175() + { + if (jj_done) return true; + if (jj_3R_71()) return true; + return false; + } + + inline bool jj_3R_628() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_scan_token(46)) { + jj_scanpos = xsp; + if (jj_scan_token(80)) return true; + } + return false; + } + + inline bool jj_3R_178() + { + if (jj_done) return true; + if (jj_3R_331()) return true; + if (jj_scan_token(COLON_T)) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_626() + { + if (jj_done) return true; + if (jj_3R_650()) return true; + return false; + } + + inline bool jj_3R_571() + { + if (jj_done) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_626()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3_92() + { + if (jj_done) return true; + if (jj_3R_65()) return true; + return false; + } + + inline bool jj_3R_674() + { + if (jj_done) return true; + if (jj_3R_383()) return true; + return false; + } + + inline bool jj_3R_673() + { + if (jj_done) return true; + if (jj_3R_382()) return true; + return false; + } + + inline bool jj_3R_78() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + if (jj_3R_174()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_175()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_176()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3_93() + { + if (jj_done) return true; + if (jj_3R_66()) return true; + return false; + } + + inline bool jj_3R_672() + { + if (jj_done) return true; + if (jj_3R_379()) return true; + return false; + } + + inline bool jj_3R_671() + { + if (jj_done) return true; + if (jj_3R_65()) return true; + return false; + } + + inline bool jj_3R_670() + { + if (jj_done) return true; + if (jj_3R_377()) return true; + return false; + } + + inline bool jj_3R_669() + { + if (jj_done) return true; + if (jj_3R_376()) return true; + return false; + } + + inline bool jj_3R_668() + { + if (jj_done) return true; + if (jj_3R_375()) return true; + return false; + } + + inline bool jj_3R_574() + { + if (jj_done) return true; + if (jj_3R_515()) return true; + return false; + } + + inline bool jj_3R_667() + { + if (jj_done) return true; + if (jj_3R_373()) return true; + return false; + } + + inline bool jj_3R_469() + { + if (jj_done) return true; + if (jj_3R_532()) return true; + return false; + } + + inline bool jj_3R_666() + { + if (jj_done) return true; + if (jj_3R_372()) return true; + return false; + } + + inline bool jj_3R_665() + { + if (jj_done) return true; + if (jj_3R_519()) return true; + return false; + } + + inline bool jj_3R_468() + { + if (jj_done) return true; + if (jj_3R_67()) return true; + return false; + } + + inline bool jj_3R_180() + { + if (jj_done) return true; + if (jj_3R_333()) return true; + return false; + } + + inline bool jj_3R_179() + { + if (jj_done) return true; + if (jj_3R_332()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_664() + { + if (jj_done) return true; + if (jj_3R_371()) return true; + return false; + } + + inline bool jj_3R_187() + { + if (jj_done) return true; + if (jj_scan_token(BAR_T)) return true; + if (jj_3R_186()) return true; + return false; + } + + inline bool jj_3R_663() + { + if (jj_done) return true; + if (jj_3R_93()) return true; + return false; + } + + inline bool jj_3R_650() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_663()) { + jj_scanpos = xsp; + if (jj_3R_664()) { + jj_scanpos = xsp; + if (jj_3R_665()) { + jj_scanpos = xsp; + if (jj_3R_666()) { + jj_scanpos = xsp; + if (jj_3R_667()) { + jj_scanpos = xsp; + if (jj_3R_668()) { + jj_scanpos = xsp; + if (jj_3R_669()) { + jj_scanpos = xsp; + if (jj_3R_670()) { + jj_scanpos = xsp; + if (jj_3R_671()) { + jj_scanpos = xsp; + if (jj_3R_672()) { + jj_scanpos = xsp; + if (jj_3R_673()) { + jj_scanpos = xsp; + if (jj_3_93()) { + jj_scanpos = xsp; + if (jj_3R_674()) return true; + } + } + } + } + } + } + } + } + } + } + } + } + return false; + } + + inline bool jj_3R_378() + { + if (jj_done) return true; + if (jj_scan_token(COMPONENT_T)) return true; + if (jj_3R_70()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_scan_token(56)) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_468()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_469()) jj_scanpos = xsp; + if (jj_scan_token(END_T)) return true; + if (jj_scan_token(COMPONENT_T)) return true; + xsp = jj_scanpos; + if (jj_3R_470()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_462() + { + if (jj_done) return true; + if (jj_scan_token(VARASSIGN_T)) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_81() + { + if (jj_done) return true; + if (jj_scan_token(FOR_T)) return true; + if (jj_3R_178()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_179()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_180()) jj_scanpos = xsp; + if (jj_scan_token(END_T)) return true; + if (jj_scan_token(FOR_T)) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3_91() + { + if (jj_done) return true; + if (jj_3R_131()) return true; + return false; + } + + inline bool jj_3R_348() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_435()) { + jj_scanpos = xsp; + if (jj_scan_token(137)) return true; + } + return false; + } + + inline bool jj_3R_435() + { + if (jj_done) return true; + if (jj_3R_519()) return true; + return false; + } + + inline bool jj_3_12() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3_11() + { + if (jj_done) return true; + if (jj_3R_69()) return true; + return false; + } + + inline bool jj_3R_86() + { + if (jj_done) return true; + if (jj_3R_186()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_187()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_201() + { + if (jj_done) return true; + if (jj_3R_347()) return true; + if (jj_3R_348()) return true; + return false; + } + + inline bool jj_3_10() + { + if (jj_done) return true; + if (jj_3R_68()) return true; + return false; + } + + inline bool jj_3R_337() + { + if (jj_done) return true; + if (jj_scan_token(OTHER_T)) return true; + return false; + } + + inline bool jj_3R_573() + { + if (jj_done) return true; + if (jj_3R_628()) return true; + return false; + } + + inline bool jj_3R_200() + { + if (jj_done) return true; + if (jj_3R_131()) return true; + return false; + } + + inline bool jj_3R_93() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_200()) { + jj_scanpos = xsp; + if (jj_3R_201()) return true; + } + return false; + } + + inline bool jj_3_90() + { + if (jj_done) return true; + if (jj_3R_129()) return true; + if (jj_3R_130()) return true; + return false; + } + + inline bool jj_3R_624() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_336() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_335() + { + if (jj_done) return true; + if (jj_3R_69()) return true; + return false; + } + + inline bool jj_3R_186() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_334()) { + jj_scanpos = xsp; + if (jj_3R_335()) { + jj_scanpos = xsp; + if (jj_3R_336()) { + jj_scanpos = xsp; + if (jj_3R_337()) return true; + } + } + } + return false; + } + + inline bool jj_3R_334() + { + if (jj_done) return true; + if (jj_3R_68()) return true; + return false; + } + + inline bool jj_3R_461() + { + if (jj_done) return true; + if (jj_3R_527()) return true; + return false; + } + + inline bool jj_3R_161() + { + if (jj_done) return true; + if (jj_3R_129()) return true; + if (jj_3R_130()) return true; + return false; + } + + inline bool jj_3R_648() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_352() + { + if (jj_done) return true; + if (jj_scan_token(CHARACTER_LITERAL)) return true; + return false; + } + + inline bool jj_3R_644() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_519() + { + if (jj_done) return true; + if (jj_scan_token(IS_T)) return true; + if (jj_3R_571()) return true; + if (jj_scan_token(BEGIN_T)) return true; + if (jj_3R_572()) return true; + if (jj_scan_token(END_T)) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_573()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_574()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_622() + { + if (jj_done) return true; + if (jj_scan_token(WHEN_T)) return true; + if (jj_3R_86()) return true; + if (jj_scan_token(ARROW_T)) return true; + if (jj_3R_259()) return true; + return false; + } + + inline bool jj_3R_623() + { + if (jj_done) return true; + if (jj_3R_622()) return true; + return false; + } + + inline bool jj_3R_685() + { + if (jj_done) return true; + if (jj_3R_71()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_356() + { + if (jj_done) return true; + if (jj_scan_token(STRINGLITERAL)) return true; + return false; + } + + inline bool jj_3R_436() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_160() + { + if (jj_done) return true; + if (jj_3R_314()) return true; + return false; + } + + inline bool jj_3R_256() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_68() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_160()) jj_scanpos = xsp; + if (jj_3R_130()) return true; + while (true) { + xsp = jj_scanpos; + if (jj_3R_161()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_122() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_256()) jj_scanpos = xsp; + if (jj_scan_token(CASE_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(IS_T)) return true; + if (jj_3R_622()) return true; + while (true) { + xsp = jj_scanpos; + if (jj_3R_623()) { jj_scanpos = xsp; break; } + } + if (jj_scan_token(END_T)) return true; + if (jj_scan_token(CASE_T)) return true; + xsp = jj_scanpos; + if (jj_3R_624()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_660() + { + if (jj_done) return true; + if (jj_3R_498()) return true; + return false; + } + + inline bool jj_3R_647() + { + if (jj_done) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_660()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_358() + { + if (jj_done) return true; + if (jj_scan_token(RETURN_T)) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_635() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_357() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_436()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_234() + { + if (jj_done) return true; + if (jj_scan_token(LBRACKET_T)) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_357()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_358()) jj_scanpos = xsp; + if (jj_scan_token(RBRACKET_T)) return true; + return false; + } + + inline bool jj_3R_686() + { + if (jj_done) return true; + if (jj_3R_329()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_605() + { + if (jj_done) return true; + if (jj_scan_token(ALL_T)) return true; + return false; + } + + inline bool jj_3R_604() + { + if (jj_done) return true; + if (jj_scan_token(OTHER_T)) return true; + return false; + } + + inline bool jj_3R_603() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_635()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_535() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_603()) { + jj_scanpos = xsp; + if (jj_3R_604()) { + jj_scanpos = xsp; + if (jj_3R_605()) return true; + } + } + return false; + } + + inline bool jj_3R_501() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_565()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_579() + { + if (jj_done) return true; + if (jj_scan_token(BUS_T)) return true; + return false; + } + + inline bool jj_3R_614() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + if (jj_scan_token(BLOCK_T)) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_644()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_scan_token(56)) jj_scanpos = xsp; + if (jj_3R_645()) return true; + if (jj_3R_646()) return true; + if (jj_scan_token(BEGIN_T)) return true; + if (jj_3R_647()) return true; + if (jj_scan_token(END_T)) return true; + if (jj_scan_token(BLOCK_T)) return true; + xsp = jj_scanpos; + if (jj_3R_648()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_578() + { + if (jj_done) return true; + if (jj_scan_token(REGISTER_T)) return true; + return false; + } + + inline bool jj_3R_527() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_578()) { + jj_scanpos = xsp; + if (jj_3R_579()) return true; + } + return false; + } + + inline bool jj_3_9() + { + if (jj_done) return true; + if (jj_3R_67()) return true; + return false; + } + + inline bool jj_3R_420() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_501()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_658() + { + if (jj_done) return true; + if (jj_3R_532()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_686()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_657() + { + if (jj_done) return true; + if (jj_3R_67()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_685()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_645() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_657()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_658()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_659() + { + if (jj_done) return true; + if (jj_3R_141()) return true; + return false; + } + + inline bool jj_3R_374() + { + if (jj_done) return true; + if (jj_scan_token(SIGNAL_T)) return true; + if (jj_3R_197()) return true; + if (jj_scan_token(COLON_T)) return true; + if (jj_3R_85()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_461()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_462()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_646() + { + if (jj_done) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_659()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_300() + { + if (jj_done) return true; + if (jj_3R_383()) return true; + return false; + } + + inline bool jj_3_89() + { + if (jj_done) return true; + if (jj_3R_128()) return true; + return false; + } + + inline bool jj_3_7() + { + if (jj_done) return true; + if (jj_3R_65()) return true; + return false; + } + + inline bool jj_3_88() + { + if (jj_done) return true; + if (jj_3R_127()) return true; + return false; + } + + inline bool jj_3_8() + { + if (jj_done) return true; + if (jj_3R_66()) return true; + return false; + } + + inline bool jj_3R_299() + { + if (jj_done) return true; + if (jj_3R_382()) return true; + return false; + } + + inline bool jj_3R_520() + { + if (jj_done) return true; + if (jj_3R_405()) return true; + return false; + } + + inline bool jj_3R_298() + { + if (jj_done) return true; + if (jj_3R_381()) return true; + return false; + } + + inline bool jj_3R_297() + { + if (jj_done) return true; + if (jj_3R_380()) return true; + return false; + } + + inline bool jj_3_87() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_296() + { + if (jj_done) return true; + if (jj_3R_379()) return true; + return false; + } + + inline bool jj_3R_439() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3_87()) jj_scanpos = xsp; + if (jj_3R_115()) return true; + if (jj_scan_token(LESSTHAN_T)) return true; + xsp = jj_scanpos; + if (jj_3R_520()) jj_scanpos = xsp; + if (jj_3R_318()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_438() + { + if (jj_done) return true; + if (jj_3R_128()) return true; + return false; + } + + inline bool jj_3R_294() + { + if (jj_done) return true; + if (jj_3R_378()) return true; + return false; + } + + inline bool jj_3R_295() + { + if (jj_done) return true; + if (jj_3R_65()) return true; + return false; + } + + inline bool jj_3R_387() + { + if (jj_done) return true; + if (jj_3R_478()) return true; + if (jj_3R_68()) return true; + return false; + } + + inline bool jj_3R_293() + { + if (jj_done) return true; + if (jj_3R_377()) return true; + return false; + } + + inline bool jj_3R_292() + { + if (jj_done) return true; + if (jj_3R_376()) return true; + return false; + } + + inline bool jj_3R_361() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_437()) { + jj_scanpos = xsp; + if (jj_3R_438()) { + jj_scanpos = xsp; + if (jj_3R_439()) return true; + } + } + return false; + } + + inline bool jj_3R_437() + { + if (jj_done) return true; + if (jj_3R_127()) return true; + return false; + } + + inline bool jj_3R_291() + { + if (jj_done) return true; + if (jj_3R_375()) return true; + return false; + } + + inline bool jj_3R_290() + { + if (jj_done) return true; + if (jj_3R_374()) return true; + return false; + } + + inline bool jj_3R_289() + { + if (jj_done) return true; + if (jj_3R_373()) return true; + return false; + } + + inline bool jj_3R_288() + { + if (jj_done) return true; + if (jj_3R_372()) return true; + return false; + } + + inline bool jj_3R_287() + { + if (jj_done) return true; + if (jj_3R_371()) return true; + return false; + } + + inline bool jj_3R_422() + { + if (jj_done) return true; + if (jj_3R_502()) return true; + return false; + } + + inline bool jj_3R_402() + { + if (jj_done) return true; + if (jj_scan_token(MINUS_T)) return true; + return false; + } + + inline bool jj_3R_421() + { + if (jj_done) return true; + if (jj_3R_382()) return true; + return false; + } + + inline bool jj_3R_141() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_286()) { + jj_scanpos = xsp; + if (jj_3R_287()) { + jj_scanpos = xsp; + if (jj_3R_288()) { + jj_scanpos = xsp; + if (jj_3R_289()) { + jj_scanpos = xsp; + if (jj_3R_290()) { + jj_scanpos = xsp; + if (jj_3R_291()) { + jj_scanpos = xsp; + if (jj_3R_292()) { + jj_scanpos = xsp; + if (jj_3R_293()) { + jj_scanpos = xsp; + if (jj_3R_294()) { + jj_scanpos = xsp; + if (jj_3R_295()) { + jj_scanpos = xsp; + if (jj_3R_296()) { + jj_scanpos = xsp; + if (jj_3R_297()) { + jj_scanpos = xsp; + if (jj_3R_298()) { + jj_scanpos = xsp; + if (jj_3R_299()) { + jj_scanpos = xsp; + if (jj_3_8()) { + jj_scanpos = xsp; + if (jj_3R_300()) { + jj_scanpos = xsp; + if (jj_scan_token(186)) return true; + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + return false; + } + + inline bool jj_3R_286() + { + if (jj_done) return true; + if (jj_3R_93()) return true; + return false; + } + + inline bool jj_3R_314() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_401()) { + jj_scanpos = xsp; + if (jj_3R_402()) return true; + } + return false; + } + + inline bool jj_3R_401() + { + if (jj_done) return true; + if (jj_scan_token(PLUS_T)) return true; + return false; + } + + inline bool jj_3R_546() + { + if (jj_done) return true; + if (jj_scan_token(ROR_T)) return true; + return false; + } + + inline bool jj_3R_545() + { + if (jj_done) return true; + if (jj_scan_token(ROL_T)) return true; + return false; + } + + inline bool jj_3R_544() + { + if (jj_done) return true; + if (jj_scan_token(SRA_T)) return true; + return false; + } + + inline bool jj_3R_543() + { + if (jj_done) return true; + if (jj_scan_token(SLA_T)) return true; + return false; + } + + inline bool jj_3R_333() + { + if (jj_done) return true; + if (jj_scan_token(FOR_T)) return true; + if (jj_3R_420()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_421()) { jj_scanpos = xsp; break; } + } + while (true) { + xsp = jj_scanpos; + if (jj_3R_422()) { jj_scanpos = xsp; break; } + } + if (jj_scan_token(END_T)) return true; + if (jj_scan_token(FOR_T)) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_542() + { + if (jj_done) return true; + if (jj_scan_token(SRL_T)) return true; + return false; + } + + inline bool jj_3R_541() + { + if (jj_done) return true; + if (jj_scan_token(SLL_T)) return true; + return false; + } + + inline bool jj_3R_478() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_541()) { + jj_scanpos = xsp; + if (jj_3R_542()) { + jj_scanpos = xsp; + if (jj_3R_543()) { + jj_scanpos = xsp; + if (jj_3R_544()) { + jj_scanpos = xsp; + if (jj_3R_545()) { + jj_scanpos = xsp; + if (jj_3R_546()) return true; + } + } + } + } + } + return false; + } + + inline bool jj_3R_245() + { + if (jj_done) return true; + if (jj_3R_363()) return true; + return false; + } + + inline bool jj_3R_307() + { + if (jj_done) return true; + if (jj_3R_68()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_387()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_95() + { + if (jj_done) return true; + if (jj_scan_token(BIT_STRING_LITERAL)) return true; + return false; + } + + inline bool jj_3R_240() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3_85() + { + if (jj_done) return true; + if (jj_3R_125()) return true; + return false; + } + + inline bool jj_3_86() + { + if (jj_done) return true; + if (jj_3R_126()) return true; + return false; + } + + inline bool jj_3_84() + { + if (jj_done) return true; + if (jj_3R_124()) return true; + return false; + } + + inline bool jj_3R_419() + { + if (jj_done) return true; + if (jj_3R_329()) return true; + return false; + } + + inline bool jj_3R_418() + { + if (jj_done) return true; + if (jj_3R_71()) return true; + return false; + } + + inline bool jj_3R_417() + { + if (jj_done) return true; + if (jj_scan_token(USE_T)) return true; + if (jj_3R_500()) return true; + return false; + } + + inline bool jj_3_83() + { + if (jj_done) return true; + if (jj_3R_123()) return true; + return false; + } + + inline bool jj_3R_332() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_417()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_418()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_419()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_119() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3_82() + { + if (jj_done) return true; + if (jj_3R_122()) return true; + return false; + } + + inline bool jj_3_79() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_119()) jj_scanpos = xsp; + if (jj_3R_115()) return true; + if (jj_scan_token(VARASSIGN_T)) return true; + return false; + } + + inline bool jj_3_81() + { + if (jj_done) return true; + if (jj_3R_121()) return true; + return false; + } + + inline bool jj_3_80() + { + if (jj_done) return true; + if (jj_3R_120()) return true; + return false; + } + + inline bool jj_3R_114() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3_78() + { + if (jj_done) return true; + if (jj_3R_118()) return true; + return false; + } + + inline bool jj_3R_244() + { + if (jj_done) return true; + if (jj_3R_362()) return true; + return false; + } + + inline bool jj_3_75() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_114()) jj_scanpos = xsp; + if (jj_3R_115()) return true; + if (jj_scan_token(LESSTHAN_T)) return true; + return false; + } + + inline bool jj_3_77() + { + if (jj_done) return true; + if (jj_3R_117()) return true; + return false; + } + + inline bool jj_3_76() + { + if (jj_done) return true; + if (jj_3R_116()) return true; + return false; + } + + inline bool jj_3R_499() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_318()) return true; + if (jj_scan_token(WHEN_T)) return true; + if (jj_3R_86()) return true; + return false; + } + + inline bool jj_3R_113() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_243()) { + jj_scanpos = xsp; + if (jj_3_76()) { + jj_scanpos = xsp; + if (jj_3_77()) { + jj_scanpos = xsp; + if (jj_3_78()) { + jj_scanpos = xsp; + if (jj_3R_244()) { + jj_scanpos = xsp; + if (jj_3_80()) { + jj_scanpos = xsp; + if (jj_3_81()) { + jj_scanpos = xsp; + if (jj_3_82()) { + jj_scanpos = xsp; + if (jj_3_83()) { + jj_scanpos = xsp; + if (jj_3_84()) { + jj_scanpos = xsp; + if (jj_3_85()) { + jj_scanpos = xsp; + if (jj_3_86()) { + jj_scanpos = xsp; + if (jj_3R_245()) return true; + } + } + } + } + } + } + } + } + } + } + } + } + return false; + } + + inline bool jj_3R_243() + { + if (jj_done) return true; + if (jj_3R_361()) return true; + return false; + } + + inline bool jj_3R_503() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_339() + { + if (jj_done) return true; + if (jj_scan_token(SEVERITY_T)) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3_74() + { + if (jj_done) return true; + if (jj_3R_113()) return true; + return false; + } + + inline bool jj_3R_259() + { + if (jj_done) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3_74()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_267() + { + if (jj_done) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_423() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_503()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_379() + { + if (jj_done) return true; + if (jj_scan_token(ATTRIBUTE_T)) return true; + if (jj_3R_220()) return true; + if (jj_scan_token(OF_T)) return true; + if (jj_3R_471()) return true; + if (jj_scan_token(IS_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_316() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_315()) return true; + return false; + } + + inline bool jj_3R_111() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(APOSTROPHE_T)) return true; + if (jj_3R_60()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_240()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3_73() + { + if (jj_done) return true; + if (jj_3R_112()) return true; + return false; + } + + inline bool jj_3R_364() + { + if (jj_done) return true; + if (jj_scan_token(ON_T)) return true; + if (jj_3R_423()) return true; + return false; + } + + inline bool jj_3R_355() + { + if (jj_done) return true; + if (jj_scan_token(RANGE_T)) return true; + return false; + } + + inline bool jj_3R_220() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_354()) { + jj_scanpos = xsp; + if (jj_3R_355()) return true; + } + return false; + } + + inline bool jj_3R_354() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_412() + { + if (jj_done) return true; + if (jj_3R_318()) return true; + if (jj_scan_token(WHEN_T)) return true; + if (jj_3R_86()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_499()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_691() + { + if (jj_done) return true; + if (jj_3R_112()) return true; + return false; + } + + inline bool jj_3R_325() + { + if (jj_done) return true; + if (jj_scan_token(WITH_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(SELECT_T)) return true; + if (jj_3R_115()) return true; + if (jj_scan_token(LESSTHAN_T)) return true; + if (jj_3R_167()) return true; + if (jj_3R_412()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3_6() + { + if (jj_done) return true; + if (jj_3R_64()) return true; + if (jj_scan_token(ARROW_T)) return true; + return false; + } + + inline bool jj_3R_65() + { + if (jj_done) return true; + if (jj_scan_token(ATTRIBUTE_T)) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + if (jj_3R_158()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_338() + { + if (jj_done) return true; + if (jj_scan_token(REPORT_T)) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_473() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(DOT_T)) return true; + if (jj_3R_100()) return true; + return false; + } + + inline bool jj_3R_166() + { + if (jj_done) return true; + if (jj_3R_315()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_316()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_360() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(EQU_T)) return true; + if (jj_3R_103()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_403() + { + if (jj_done) return true; + if (jj_3R_64()) return true; + if (jj_scan_token(ARROW_T)) return true; + return false; + } + + inline bool jj_3R_315() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_403()) jj_scanpos = xsp; + if (jj_3R_404()) return true; + return false; + } + + inline bool jj_3R_248() + { + if (jj_done) return true; + if (jj_3R_140()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_676() + { + if (jj_done) return true; + if (jj_3R_82()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_691()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_116() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_248()) jj_scanpos = xsp; + if (jj_3R_188()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_675() + { + if (jj_done) return true; + if (jj_3R_690()) return true; + return false; + } + + inline bool jj_3R_651() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_675()) { + jj_scanpos = xsp; + if (jj_3R_676()) return true; + } + return false; + } + + inline bool jj_3R_266() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_188() + { + if (jj_done) return true; + if (jj_scan_token(ASSERT_T)) return true; + if (jj_3R_80()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_338()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_339()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_126() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_266()) jj_scanpos = xsp; + if (jj_scan_token(RETURN_T)) return true; + xsp = jj_scanpos; + if (jj_3R_267()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3_5() + { + if (jj_done) return true; + if (jj_3R_63()) return true; + return false; + } + + inline bool jj_3R_250() + { + if (jj_done) return true; + if (jj_scan_token(SEVERITY_T)) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_701() + { + if (jj_done) return true; + if (jj_3R_706()) return true; + return false; + } + + inline bool jj_3R_308() + { + if (jj_done) return true; + if (jj_3R_388()) return true; + if (jj_3R_307()) return true; + return false; + } + + inline bool jj_3R_703() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_700() + { + if (jj_done) return true; + if (jj_3R_63()) return true; + return false; + } + + inline bool jj_3R_692() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_700()) { + jj_scanpos = xsp; + if (jj_3R_701()) return true; + } + return false; + } + + inline bool jj_3R_249() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_117() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_249()) jj_scanpos = xsp; + if (jj_scan_token(REPORT_T)) return true; + if (jj_3R_59()) return true; + xsp = jj_scanpos; + if (jj_3R_250()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_484() + { + if (jj_done) return true; + if (jj_scan_token(NOTEQU_T)) return true; + return false; + } + + inline bool jj_3R_483() + { + if (jj_done) return true; + if (jj_scan_token(LESSTHAN_T)) return true; + return false; + } + + inline bool jj_3R_482() + { + if (jj_done) return true; + if (jj_scan_token(GREATERTHAN_T)) return true; + return false; + } + + inline bool jj_3R_481() + { + if (jj_done) return true; + if (jj_scan_token(EQU_T)) return true; + return false; + } + + inline bool jj_3R_480() + { + if (jj_done) return true; + if (jj_scan_token(GT_T)) return true; + return false; + } + + inline bool jj_3R_388() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_479()) { + jj_scanpos = xsp; + if (jj_3R_480()) { + jj_scanpos = xsp; + if (jj_3R_481()) { + jj_scanpos = xsp; + if (jj_3R_482()) { + jj_scanpos = xsp; + if (jj_3R_483()) { + jj_scanpos = xsp; + if (jj_3R_484()) return true; + } + } + } + } + } + return false; + } + + inline bool jj_3R_479() + { + if (jj_done) return true; + if (jj_scan_token(LT_T)) return true; + return false; + } + + inline bool jj_3R_702() + { + if (jj_done) return true; + if (jj_3R_707()) return true; + return false; + } + + inline bool jj_3R_467() + { + if (jj_done) return true; + if (jj_3R_234()) return true; + return false; + } + + inline bool jj_3R_146() + { + if (jj_done) return true; + if (jj_3R_307()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_308()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_693() + { + if (jj_done) return true; + if (jj_scan_token(RECORD_T)) return true; + Token * xsp; + if (jj_3R_702()) return true; + while (true) { + xsp = jj_scanpos; + if (jj_3R_702()) { jj_scanpos = xsp; break; } + } + if (jj_scan_token(END_T)) return true; + if (jj_scan_token(RECORD_T)) return true; + xsp = jj_scanpos; + if (jj_3R_703()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_237() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_236()) return true; + return false; + } + + inline bool jj_3_71() + { + if (jj_done) return true; + if (jj_3R_68()) return true; + if (jj_3R_110()) return true; + if (jj_3R_68()) return true; + return false; + } + + inline bool jj_3_72() + { + if (jj_done) return true; + if (jj_3R_111()) return true; + return false; + } + + inline bool jj_3R_82() + { + if (jj_done) return true; + if (jj_scan_token(RANGE_T)) return true; + if (jj_3R_84()) return true; + return false; + } + + inline bool jj_3R_576() + { + if (jj_done) return true; + if (jj_scan_token(NEW_T)) return true; + if (jj_3R_85()) return true; + return false; + } + + inline bool jj_3_70() + { + if (jj_done) return true; + if (jj_3R_109()) return true; + return false; + } + + inline bool jj_3R_183() + { + if (jj_done) return true; + if (jj_3R_111()) return true; + return false; + } + + inline bool jj_3R_228() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_182() + { + if (jj_done) return true; + if (jj_3R_68()) return true; + if (jj_3R_110()) return true; + if (jj_3R_68()) return true; + return false; + } + + inline bool jj_3R_84() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_182()) { + jj_scanpos = xsp; + if (jj_3R_183()) return true; + } + return false; + } + + inline bool jj_3R_525() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3_4()) { + jj_scanpos = xsp; + if (jj_3R_576()) return true; + } + return false; + } + + inline bool jj_3_4() + { + if (jj_done) return true; + if (jj_scan_token(NEW_T)) return true; + if (jj_3R_62()) return true; + return false; + } + + inline bool jj_3R_531() + { + if (jj_done) return true; + if (jj_3R_310()) return true; + return false; + } + + inline bool jj_3R_530() + { + if (jj_done) return true; + if (jj_scan_token(CHARACTER_LITERAL)) return true; + return false; + } + + inline bool jj_3R_529() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_465() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_529()) { + jj_scanpos = xsp; + if (jj_3R_530()) { + jj_scanpos = xsp; + if (jj_3R_531()) return true; + } + } + return false; + } + + inline bool jj_3R_227() + { + if (jj_done) return true; + if (jj_3R_109()) return true; + return false; + } + + inline bool jj_3R_193() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_62() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(APOSTROPHE_T)) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_227()) { + jj_scanpos = xsp; + if (jj_3R_228()) return true; + } + return false; + } + + inline bool jj_3R_342() + { + if (jj_done) return true; + if (jj_3R_113()) return true; + return false; + } + + inline bool jj_3R_192() + { + if (jj_done) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_342()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_466() + { + if (jj_done) return true; + if (jj_scan_token(COLON_T)) return true; + if (jj_3R_85()) return true; + return false; + } + + inline bool jj_3R_377() + { + if (jj_done) return true; + if (jj_scan_token(ALIAS_T)) return true; + if (jj_3R_465()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_466()) jj_scanpos = xsp; + if (jj_scan_token(IS_T)) return true; + if (jj_3R_60()) return true; + xsp = jj_scanpos; + if (jj_3R_467()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_340() + { + if (jj_done) return true; + if (jj_3R_423()) return true; + return false; + } + + inline bool jj_3R_109() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_236()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_237()) { jj_scanpos = xsp; break; } + } + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_273() + { + if (jj_done) return true; + if (jj_scan_token(MINUS_T)) return true; + return false; + } + + inline bool jj_3R_274() + { + if (jj_done) return true; + if (jj_scan_token(AMPERSAND_T)) return true; + return false; + } + + inline bool jj_3R_129() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_272()) { + jj_scanpos = xsp; + if (jj_3R_273()) { + jj_scanpos = xsp; + if (jj_3R_274()) return true; + } + } + return false; + } + + inline bool jj_3R_272() + { + if (jj_done) return true; + if (jj_scan_token(PLUS_T)) return true; + return false; + } + + inline bool jj_3_3() + { + if (jj_done) return true; + if (jj_3R_61()) return true; + return false; + } + + inline bool jj_3R_493() + { + if (jj_done) return true; + if (jj_scan_token(BOX_T)) return true; + return false; + } + + inline bool jj_3R_494() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_61()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_404() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_492()) { + jj_scanpos = xsp; + if (jj_3R_493()) { + jj_scanpos = xsp; + if (jj_3R_494()) return true; + } + } + return false; + } + + inline bool jj_3R_492() + { + if (jj_done) return true; + if (jj_3R_61()) return true; + return false; + } + + inline bool jj_3_2() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_226() + { + if (jj_done) return true; + if (jj_3R_166()) return true; + return false; + } + + inline bool jj_3R_190() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_scan_token(15)) { + jj_scanpos = xsp; + if (jj_3R_340()) return true; + } + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3_1() + { + if (jj_done) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_154() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_189() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_89() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_189()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_scan_token(79)) jj_scanpos = xsp; + if (jj_scan_token(PROCESS_T)) return true; + xsp = jj_scanpos; + if (jj_3R_190()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_scan_token(56)) jj_scanpos = xsp; + if (jj_3R_191()) return true; + if (jj_scan_token(BEGIN_T)) return true; + if (jj_3R_192()) return true; + if (jj_scan_token(END_T)) return true; + xsp = jj_scanpos; + if (jj_scan_token(79)) jj_scanpos = xsp; + if (jj_scan_token(PROCESS_T)) return true; + xsp = jj_scanpos; + if (jj_3R_193()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_153() + { + if (jj_done) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_341() + { + if (jj_done) return true; + if (jj_3R_424()) return true; + return false; + } + + inline bool jj_3R_152() + { + if (jj_done) return true; + if (jj_scan_token(OPEN_T)) return true; + return false; + } + + inline bool jj_3R_61() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_152()) { + jj_scanpos = xsp; + if (jj_3R_153()) { + jj_scanpos = xsp; + if (jj_3R_154()) return true; + } + } + return false; + } + + inline bool jj_3R_191() + { + if (jj_done) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_341()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_513() + { + if (jj_done) return true; + if (jj_3R_383()) return true; + return false; + } + + inline bool jj_3R_653() + { + if (jj_done) return true; + if (jj_scan_token(ACCESS_T)) return true; + if (jj_3R_85()) return true; + return false; + } + + inline bool jj_3R_225() + { + if (jj_done) return true; + if (jj_scan_token(BASED_LITERAL)) return true; + return false; + } + + inline bool jj_3_69() + { + if (jj_done) return true; + if (jj_3R_66()) return true; + return false; + } + + inline bool jj_3R_512() + { + if (jj_done) return true; + if (jj_3R_382()) return true; + return false; + } + + inline bool jj_3R_224() + { + if (jj_done) return true; + if (jj_scan_token(INTEGER)) return true; + return false; + } + + inline bool jj_3R_511() + { + if (jj_done) return true; + if (jj_3R_379()) return true; + return false; + } + + inline bool jj_3R_223() + { + if (jj_done) return true; + if (jj_scan_token(DECIMAL_LITERAL)) return true; + return false; + } + + inline bool jj_3R_104() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_223()) { + jj_scanpos = xsp; + if (jj_3R_224()) { + jj_scanpos = xsp; + if (jj_3R_225()) return true; + } + } + return false; + } + + inline bool jj_3_68() + { + if (jj_done) return true; + if (jj_3R_65()) return true; + return false; + } + + inline bool jj_3R_510() + { + if (jj_done) return true; + if (jj_3R_377()) return true; + return false; + } + + inline bool jj_3R_509() + { + if (jj_done) return true; + if (jj_3R_376()) return true; + return false; + } + + inline bool jj_3R_508() + { + if (jj_done) return true; + if (jj_3R_375()) return true; + return false; + } + + inline bool jj_3R_507() + { + if (jj_done) return true; + if (jj_3R_373()) return true; + return false; + } + + inline bool jj_3R_506() + { + if (jj_done) return true; + if (jj_3R_372()) return true; + return false; + } + + inline bool jj_3R_505() + { + if (jj_done) return true; + if (jj_3R_371()) return true; + return false; + } + + inline bool jj_3R_424() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_504()) { + jj_scanpos = xsp; + if (jj_3R_505()) { + jj_scanpos = xsp; + if (jj_3R_506()) { + jj_scanpos = xsp; + if (jj_3R_507()) { + jj_scanpos = xsp; + if (jj_3R_508()) { + jj_scanpos = xsp; + if (jj_3R_509()) { + jj_scanpos = xsp; + if (jj_3R_510()) { + jj_scanpos = xsp; + if (jj_3_68()) { + jj_scanpos = xsp; + if (jj_3R_511()) { + jj_scanpos = xsp; + if (jj_3R_512()) { + jj_scanpos = xsp; + if (jj_3_69()) { + jj_scanpos = xsp; + if (jj_3R_513()) return true; + } + } + } + } + } + } + } + } + } + } + } + return false; + } + + inline bool jj_3R_504() + { + if (jj_done) return true; + if (jj_3R_93()) return true; + return false; + } + + inline bool jj_3R_330() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_226()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3_67() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_120() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3_67()) jj_scanpos = xsp; + if (jj_3R_177()) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_177() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_330()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3_65() + { + if (jj_done) return true; + if (jj_3R_87()) return true; + return false; + } + + inline bool jj_3R_205() + { + if (jj_done) return true; + if (jj_3R_351()) return true; + return false; + } + + inline bool jj_3_66() + { + if (jj_done) return true; + if (jj_3R_108()) return true; + return false; + } + + inline bool jj_3R_204() + { + if (jj_done) return true; + if (jj_3R_87()) return true; + return false; + } + + inline bool jj_3R_203() + { + if (jj_done) return true; + if (jj_3R_350()) return true; + return false; + } + + inline bool jj_3R_202() + { + if (jj_done) return true; + if (jj_3R_349()) return true; + return false; + } + + inline bool jj_3R_94() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_202()) { + jj_scanpos = xsp; + if (jj_3R_203()) { + jj_scanpos = xsp; + if (jj_3R_204()) { + jj_scanpos = xsp; + if (jj_3_66()) { + jj_scanpos = xsp; + if (jj_3R_205()) return true; + } + } + } + } + return false; + } + + inline bool jj_3_64() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3_63() + { + if (jj_done) return true; + if (jj_3R_107()) return true; + return false; + } + + inline bool jj_3R_458() + { + if (jj_done) return true; + if (jj_3R_109()) return true; + return false; + } + + inline bool jj_3_62() + { + if (jj_done) return true; + if (jj_3R_106()) return true; + return false; + } + + inline bool jj_3R_242() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_457() + { + if (jj_done) return true; + if (jj_3R_525()) return true; + return false; + } + + inline bool jj_3_61() + { + if (jj_done) return true; + if (jj_3R_62()) return true; + return false; + } + + inline bool jj_3R_456() + { + if (jj_done) return true; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3_60() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_455() + { + if (jj_done) return true; + if (jj_3R_107()) return true; + return false; + } + + inline bool jj_3_59() + { + if (jj_done) return true; + if (jj_3R_105()) return true; + return false; + } + + inline bool jj_3R_454() + { + if (jj_done) return true; + if (jj_3R_106()) return true; + return false; + } + + inline bool jj_3R_453() + { + if (jj_done) return true; + if (jj_3R_62()) return true; + return false; + } + + inline bool jj_3R_452() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_370() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_451()) { + jj_scanpos = xsp; + if (jj_3R_452()) { + jj_scanpos = xsp; + if (jj_3R_453()) { + jj_scanpos = xsp; + if (jj_3R_454()) { + jj_scanpos = xsp; + if (jj_3R_455()) { + jj_scanpos = xsp; + if (jj_3R_456()) { + jj_scanpos = xsp; + if (jj_3R_457()) { + jj_scanpos = xsp; + if (jj_3R_458()) return true; + } + } + } + } + } + } + } + return false; + } + + inline bool jj_3R_451() + { + if (jj_done) return true; + if (jj_3R_105()) return true; + return false; + } + + inline bool jj_3R_329() + { + if (jj_done) return true; + if (jj_scan_token(PORT_T)) return true; + if (jj_scan_token(MAP_T)) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_166()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_582() + { + if (jj_done) return true; + if (jj_3R_313()) return true; + return false; + } + + inline bool jj_3R_532() + { + if (jj_done) return true; + if (jj_scan_token(PORT_T)) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_582()) return true; + if (jj_scan_token(RPAREN_T)) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_241() + { + if (jj_done) return true; + if (jj_3R_360()) return true; + return false; + } + + inline bool jj_3R_112() + { + if (jj_done) return true; + if (jj_scan_token(UNITS_T)) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(SEMI_T)) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_241()) { jj_scanpos = xsp; break; } + } + if (jj_scan_token(END_T)) return true; + if (jj_scan_token(UNITS_T)) return true; + xsp = jj_scanpos; + if (jj_3R_242()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3_58() + { + if (jj_done) return true; + if (jj_3R_104()) return true; + return false; + } + + inline bool jj_3R_222() + { + if (jj_done) return true; + if (jj_3R_104()) return true; + return false; + } + + inline bool jj_3R_103() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_222()) jj_scanpos = xsp; + if (jj_3R_60()) return true; + return false; + } + + inline bool jj_3R_408() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(IN_T)) return true; + if (jj_3R_69()) return true; + return false; + } + + inline bool jj_3_57() + { + if (jj_done) return true; + if (jj_3R_87()) return true; + return false; + } + + inline bool jj_3_55() + { + if (jj_done) return true; + if (jj_3R_65()) return true; + return false; + } + + inline bool jj_3_56() + { + if (jj_done) return true; + if (jj_3R_66()) return true; + return false; + } + + inline bool jj_3R_351() + { + if (jj_done) return true; + if (jj_scan_token(PACKAGE_T)) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3_54() + { + if (jj_done) return true; + if (jj_3R_66()) return true; + return false; + } + + inline bool jj_3R_317() + { + if (jj_done) return true; + if (jj_3R_405()) return true; + return false; + } + + inline bool jj_3R_261() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_167() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_scan_token(50)) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_317()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_310() + { + if (jj_done) return true; + if (jj_scan_token(STRINGLITERAL)) return true; + return false; + } + + inline bool jj_3R_643() + { + if (jj_done) return true; + if (jj_scan_token(TYPE_T)) return true; + return false; + } + + inline bool jj_3R_642() + { + if (jj_done) return true; + if (jj_scan_token(FILE_T)) return true; + return false; + } + + inline bool jj_3R_641() + { + if (jj_done) return true; + if (jj_scan_token(SHARED_T)) return true; + if (jj_scan_token(VARIABLE_T)) return true; + return false; + } + + inline bool jj_3_53() + { + if (jj_done) return true; + if (jj_3R_103()) return true; + return false; + } + + inline bool jj_3R_640() + { + if (jj_done) return true; + if (jj_scan_token(VARIABLE_T)) return true; + return false; + } + + inline bool jj_3R_639() + { + if (jj_done) return true; + if (jj_scan_token(SIGNAL_T)) return true; + return false; + } + + inline bool jj_3R_638() + { + if (jj_done) return true; + if (jj_scan_token(CONSTANT_T)) return true; + return false; + } + + inline bool jj_3R_613() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_638()) { + jj_scanpos = xsp; + if (jj_3R_639()) { + jj_scanpos = xsp; + if (jj_3R_640()) { + jj_scanpos = xsp; + if (jj_3R_641()) { + jj_scanpos = xsp; + if (jj_3R_642()) { + jj_scanpos = xsp; + if (jj_3R_643()) return true; + } + } + } + } + } + return false; + } + + inline bool jj_3R_353() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_207() + { + if (jj_done) return true; + if (jj_3R_104()) return true; + return false; + } + + inline bool jj_3R_206() + { + if (jj_done) return true; + if (jj_3R_103()) return true; + return false; + } + + inline bool jj_3R_96() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_206()) { + jj_scanpos = xsp; + if (jj_3R_207()) return true; + } + return false; + } + + inline bool jj_3R_442() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_363() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_442()) jj_scanpos = xsp; + if (jj_scan_token(NULL_T)) return true; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_102() + { + if (jj_done) return true; + if (jj_scan_token(COMMA_T)) return true; + if (jj_3R_59()) return true; + return false; + } + + inline bool jj_3R_262() + { + if (jj_done) return true; + if (jj_scan_token(WHEN_T)) return true; + if (jj_3R_80()) return true; + return false; + } + + inline bool jj_3_52() + { + if (jj_done) return true; + if (jj_scan_token(LBRACKET_T)) return true; + return false; + } + + inline bool jj_3R_260() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + if (jj_scan_token(COLON_T)) return true; + return false; + } + + inline bool jj_3R_124() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_260()) jj_scanpos = xsp; + if (jj_scan_token(NEXT_T)) return true; + xsp = jj_scanpos; + if (jj_3R_261()) jj_scanpos = xsp; + xsp = jj_scanpos; + if (jj_3R_262()) jj_scanpos = xsp; + if (jj_scan_token(SEMI_T)) return true; + return false; + } + + inline bool jj_3R_221() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_59()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_219() + { + if (jj_done) return true; + if (jj_3R_234()) return true; + return false; + } + + inline bool jj_3_51() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_59()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_102()) { jj_scanpos = xsp; break; } + } + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_101() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_219()) jj_scanpos = xsp; + if (jj_scan_token(APOSTROPHE_T)) return true; + if (jj_3R_220()) return true; + xsp = jj_scanpos; + if (jj_3R_221()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3_47() + { + if (jj_done) return true; + if (jj_3R_99()) return true; + return false; + } + + inline bool jj_3_50() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_69()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3_49() + { + if (jj_done) return true; + if (jj_3R_101()) return true; + return false; + } + + inline bool jj_3R_214() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_59()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_353()) { jj_scanpos = xsp; break; } + } + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3_48() + { + if (jj_done) return true; + if (jj_scan_token(DOT_T)) return true; + if (jj_3R_100()) return true; + return false; + } + + inline bool jj_3R_210() + { + if (jj_done) return true; + if (jj_3R_99()) return true; + return false; + } + + inline bool jj_3R_213() + { + if (jj_done) return true; + if (jj_scan_token(LPAREN_T)) return true; + if (jj_3R_69()) return true; + if (jj_scan_token(RPAREN_T)) return true; + return false; + } + + inline bool jj_3R_150() + { + if (jj_done) return true; + if (jj_3R_311()) return true; + return false; + } + + inline bool jj_3R_212() + { + if (jj_done) return true; + if (jj_3R_101()) return true; + return false; + } + + inline bool jj_3R_211() + { + if (jj_done) return true; + if (jj_scan_token(DOT_T)) return true; + if (jj_3R_100()) return true; + return false; + } + + inline bool jj_3R_99() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_211()) { + jj_scanpos = xsp; + if (jj_3R_212()) { + jj_scanpos = xsp; + if (jj_3R_213()) { + jj_scanpos = xsp; + if (jj_3R_214()) return true; + } + } + } + return false; + } + + inline bool jj_3_46() + { + if (jj_done) return true; + if (jj_3R_98()) return true; + return false; + } + + inline bool jj_3R_98() + { + if (jj_done) return true; + if (jj_3R_99()) return true; + Token * xsp; + while (true) { + xsp = jj_scanpos; + if (jj_3R_210()) { jj_scanpos = xsp; break; } + } + return false; + } + + inline bool jj_3R_149() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_151() + { + if (jj_done) return true; + if (jj_3R_98()) return true; + return false; + } + + inline bool jj_3R_148() + { + if (jj_done) return true; + if (jj_3R_310()) return true; + return false; + } + + inline bool jj_3R_60() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_148()) { + jj_scanpos = xsp; + if (jj_3R_149()) { + jj_scanpos = xsp; + if (jj_3R_150()) return true; + } + } + xsp = jj_scanpos; + if (jj_3R_151()) jj_scanpos = xsp; + return false; + } + + inline bool jj_3R_625() + { + if (jj_done) return true; + if (jj_3R_70()) return true; + return false; + } + + inline bool jj_3R_281() + { + if (jj_done) return true; + if (jj_scan_token(REM_T)) return true; + return false; + } + + inline bool jj_3R_280() + { + if (jj_done) return true; + if (jj_scan_token(MOD_T)) return true; + return false; + } + + inline bool jj_3R_279() + { + if (jj_done) return true; + if (jj_scan_token(SLASH_T)) return true; + return false; + } + + inline bool jj_3R_135() + { + if (jj_done) return true; + Token * xsp; + xsp = jj_scanpos; + if (jj_3R_278()) { + jj_scanpos = xsp; + if (jj_3R_279()) { + jj_scanpos = xsp; + if (jj_3R_280()) { + jj_scanpos = xsp; + if (jj_3R_281()) return true; + } + } + } + return false; + } + + inline bool jj_3R_278() + { + if (jj_done) return true; + if (jj_scan_token(MULT_T)) return true; + return false; + } + + inline bool jj_3R_432() + { + if (jj_done) return true; + if (jj_scan_token(LINKAGE_T)) return true; + return false; + } + + inline bool jj_3R_431() + { + if (jj_done) return true; + if (jj_scan_token(BUFFER_T)) return true; + return false; + } + + public: TokenManager *token_source; + public: CharStream *jj_input_stream; + /** Current token. */ + public: Token *token; + /** Next token. */ + public: Token *jj_nt; + private: int jj_ntk; + private: JJCalls jj_2_rtns[115]; + private: bool jj_rescan; + private: int jj_gc; + private: Token *jj_scanpos, *jj_lastpos; + private: int jj_la; + /** Whether we are looking ahead. */ + private: bool jj_lookingAhead; + private: bool jj_semLA; + private: int jj_gen; + private: int jj_la1[295]; + private: ErrorHandler *errorHandler; + private: bool errorHandlerCreated; + protected: bool hasError; + public: void setErrorHandler(ErrorHandler *eh) { + if (errorHandlerCreated) delete errorHandler; + errorHandler = eh; + errorHandlerCreated = false; + } + Token *head; + public: + + VhdlParser(TokenManager *tm); + public: virtual ~VhdlParser(); + +void ReInit(TokenManager *tm); + +Token * jj_consume_token(int kind); + +bool jj_scan_token(int kind); + +Token * getNextToken(); + +Token * getToken(int index); + +int jj_ntk_f(); + private: int jj_kind; + int **jj_expentries; + int *jj_expentry; + +void jj_add_error_token(int kind, int pos); + +protected: virtual void parseError(); + private: int trace_indent; + private: bool trace_enabled; + /** Enable tracing. */ + +public: void enable_tracing(); + +public: void disable_tracing(); + +void jj_rescan_token(); + +void jj_save(int index, int xla); +typedef unsigned long long uint64; + + +static Entry* current_root; +static Entry* tempEntry; +static Entry* lastEntity ; +static Entry* lastCompound ; +static Entry* current; +static QCString compSpec; +static QCString currName; +static int levelCounter; +static QCString confName; +static QCString genLabels; +static QCString lab; +static QCString forL; +static int param_sec ; +static int parse_sec; +static int currP; +static Entry* currentCompound; + +//---------------------------------------- + +static void setLineParsed(int tok); +static int getLine(int tok); +static int getLine(); +static void lineCount(const char*); +static void lineCount(); +static void addProto(const char *s1,const char *s2,const char *s3,const char *s4,const char *s5,const char *s6); +static void addConfigureNode(const char* a,const char*b, bool,bool isLeaf,bool inlineConf); +static void createFunction(const char *impure,uint64 spec,const char *fname); +static void addVhdlType(const char *n,int startLine,int section, uint64 spec,const char* args,const char* type,Protection prot); +static void addCompInst(char *n, char* instName, char* comp,int iLine); +static void handleCommentBlock(const char* doc,bool brief); +static void handleFlowComment(const char*); +static void initEntry(Entry *e); +static void newEntry(); +static bool isFuncProcProced(); +static void pushLabel(QCString &,QCString&); +static QCString popLabel(QCString & q); +static bool addLibUseClause(const QCString &type); +static void mapLibPackage( Entry* root); +static void createFlow(); +static void error_skipto(int kind);private: bool jj_done; + +}; +} +} +#endif diff --git a/vhdlparser/VhdlParserConstants.h b/vhdlparser/VhdlParserConstants.h new file mode 100644 index 0000000..0c2c0e5 --- /dev/null +++ b/vhdlparser/VhdlParserConstants.h @@ -0,0 +1,950 @@ +/* Generated By:JavaCC: Do not edit this line. VhdlParserConstants.java */ + +/** + * Token literal values and constants. + * Generated by org.javacc.parser.OtherFilesGen#start() + */ +#ifndef VHDLPARSERCONSTANTS_H +#define VHDLPARSERCONSTANTS_H +#include "JavaCC.h" + +namespace vhdl { +namespace parser { + /** End of File. */ +const int _EOF = 0; + /** RegularExpression Id. */ +const int DOXYGEN_VHDL_COMMENT = 5; + /** RegularExpression Id. */ +const int MULT_DOXYGEN_COMMENT = 6; + /** RegularExpression Id. */ +const int VHDL_FLOWCHART_COMMENT = 7; + /** RegularExpression Id. */ +const int VHDL_COMMENT = 8; + /** RegularExpression Id. */ +const int MULT_DOXYGEN_VHDL_COMMENT_2008 = 9; + /** RegularExpression Id. */ +const int MULT_VHDL_2008_COMMENT = 10; + /** RegularExpression Id. */ +const int ABS_T = 11; + /** RegularExpression Id. */ +const int ACCESS_T = 12; + /** RegularExpression Id. */ +const int AFTER_T = 13; + /** RegularExpression Id. */ +const int ALIAS_T = 14; + /** RegularExpression Id. */ +const int ALL_T = 15; + /** RegularExpression Id. */ +const int AND_T = 16; + /** RegularExpression Id. */ +const int ARCHITECTURE_T = 17; + /** RegularExpression Id. */ +const int ARRAY_T = 18; + /** RegularExpression Id. */ +const int ASSERT_T = 19; + /** RegularExpression Id. */ +const int ASSUME_T = 20; + /** RegularExpression Id. */ +const int ASSUME_GUARANTEE_T = 21; + /** RegularExpression Id. */ +const int ATTRIBUTE_T = 22; + /** RegularExpression Id. */ +const int BEGIN_T = 23; + /** RegularExpression Id. */ +const int BLOCK_T = 24; + /** RegularExpression Id. */ +const int BODY_T = 25; + /** RegularExpression Id. */ +const int BUFFER_T = 26; + /** RegularExpression Id. */ +const int BUS_T = 27; + /** RegularExpression Id. */ +const int COMPONENT_T = 28; + /** RegularExpression Id. */ +const int CASE_T = 29; + /** RegularExpression Id. */ +const int CONFIGURATION_T = 30; + /** RegularExpression Id. */ +const int CONSTANT_T = 31; + /** RegularExpression Id. */ +const int CONTEXT_T = 32; + /** RegularExpression Id. */ +const int COVER_T = 33; + /** RegularExpression Id. */ +const int DEFAULT_T = 34; + /** RegularExpression Id. */ +const int DISCONNECT_T = 35; + /** RegularExpression Id. */ +const int DOWNTO_T = 36; + /** RegularExpression Id. */ +const int ELSE_T = 37; + /** RegularExpression Id. */ +const int ELSIF_T = 38; + /** RegularExpression Id. */ +const int END_T = 39; + /** RegularExpression Id. */ +const int ENTITY_T = 40; + /** RegularExpression Id. */ +const int EXIT_T = 41; + /** RegularExpression Id. */ +const int FAIRNESS_T = 42; + /** RegularExpression Id. */ +const int FILE_T = 43; + /** RegularExpression Id. */ +const int FOR_T = 44; + /** RegularExpression Id. */ +const int FORCE_T = 45; + /** RegularExpression Id. */ +const int FUNCTION_T = 46; + /** RegularExpression Id. */ +const int GENERATE_T = 47; + /** RegularExpression Id. */ +const int GENERIC_T = 48; + /** RegularExpression Id. */ +const int GROUP_T = 49; + /** RegularExpression Id. */ +const int GUARDED_T = 50; + /** RegularExpression Id. */ +const int IF_T = 51; + /** RegularExpression Id. */ +const int IMPURE_T = 52; + /** RegularExpression Id. */ +const int IN_T = 53; + /** RegularExpression Id. */ +const int INERTIAL_T = 54; + /** RegularExpression Id. */ +const int INOUT_T = 55; + /** RegularExpression Id. */ +const int IS_T = 56; + /** RegularExpression Id. */ +const int LABEL_T = 57; + /** RegularExpression Id. */ +const int LIBRARY_T = 58; + /** RegularExpression Id. */ +const int LINKAGE_T = 59; + /** RegularExpression Id. */ +const int LITERAL_T = 60; + /** RegularExpression Id. */ +const int LOOP_T = 61; + /** RegularExpression Id. */ +const int MAP_T = 62; + /** RegularExpression Id. */ +const int MOD_T = 63; + /** RegularExpression Id. */ +const int NAND_T = 64; + /** RegularExpression Id. */ +const int NEW_T = 65; + /** RegularExpression Id. */ +const int NEXT_T = 66; + /** RegularExpression Id. */ +const int NOR_T = 67; + /** RegularExpression Id. */ +const int NOT_T = 68; + /** RegularExpression Id. */ +const int NULL_T = 69; + /** RegularExpression Id. */ +const int OF_T = 70; + /** RegularExpression Id. */ +const int ON_T = 71; + /** RegularExpression Id. */ +const int OPEN_T = 72; + /** RegularExpression Id. */ +const int OR_T = 73; + /** RegularExpression Id. */ +const int OTHER_T = 74; + /** RegularExpression Id. */ +const int OUT_T = 75; + /** RegularExpression Id. */ +const int PACKAGE_T = 76; + /** RegularExpression Id. */ +const int PARAMETER_T = 77; + /** RegularExpression Id. */ +const int PORT_T = 78; + /** RegularExpression Id. */ +const int POSTPONED_T = 79; + /** RegularExpression Id. */ +const int PROCEDURE_T = 80; + /** RegularExpression Id. */ +const int PROCESS_T = 81; + /** RegularExpression Id. */ +const int PROPERTY_T = 82; + /** RegularExpression Id. */ +const int PROTECTED_T = 83; + /** RegularExpression Id. */ +const int PURE_T = 84; + /** RegularExpression Id. */ +const int RANGE_T = 85; + /** RegularExpression Id. */ +const int RECORD_T = 86; + /** RegularExpression Id. */ +const int REGISTER_T = 87; + /** RegularExpression Id. */ +const int REJECT_T = 88; + /** RegularExpression Id. */ +const int RELEASE_T = 89; + /** RegularExpression Id. */ +const int RESTRICT_T = 90; + /** RegularExpression Id. */ +const int RESTRICT_GUARANTEE_T = 91; + /** RegularExpression Id. */ +const int REM_T = 92; + /** RegularExpression Id. */ +const int REPORT_T = 93; + /** RegularExpression Id. */ +const int ROL_T = 94; + /** RegularExpression Id. */ +const int ROR_T = 95; + /** RegularExpression Id. */ +const int RETURN_T = 96; + /** RegularExpression Id. */ +const int SELECT_T = 97; + /** RegularExpression Id. */ +const int SEQUENCE_T = 98; + /** RegularExpression Id. */ +const int SEVERITY_T = 99; + /** RegularExpression Id. */ +const int SIGNAL_T = 100; + /** RegularExpression Id. */ +const int SHARED_T = 101; + /** RegularExpression Id. */ +const int SLA_T = 102; + /** RegularExpression Id. */ +const int SLL_T = 103; + /** RegularExpression Id. */ +const int SRA_T = 104; + /** RegularExpression Id. */ +const int SRL_T = 105; + /** RegularExpression Id. */ +const int STRONG_T = 106; + /** RegularExpression Id. */ +const int SUBTYPE_T = 107; + /** RegularExpression Id. */ +const int THEN_T = 108; + /** RegularExpression Id. */ +const int TO_T = 109; + /** RegularExpression Id. */ +const int TRANSPORT_T = 110; + /** RegularExpression Id. */ +const int TYPE_T = 111; + /** RegularExpression Id. */ +const int UNAFFECTED_T = 112; + /** RegularExpression Id. */ +const int UNITS_T = 113; + /** RegularExpression Id. */ +const int UNTIL_T = 114; + /** RegularExpression Id. */ +const int USE_T = 115; + /** RegularExpression Id. */ +const int VARIABLE_T = 116; + /** RegularExpression Id. */ +const int VMODE_T = 117; + /** RegularExpression Id. */ +const int VPROP_T = 118; + /** RegularExpression Id. */ +const int VUNIT_T = 119; + /** RegularExpression Id. */ +const int WAIT_T = 120; + /** RegularExpression Id. */ +const int WHEN_T = 121; + /** RegularExpression Id. */ +const int WHILE_T = 122; + /** RegularExpression Id. */ +const int WITH_T = 123; + /** RegularExpression Id. */ +const int XOR_T = 124; + /** RegularExpression Id. */ +const int XNOR_T = 125; + /** RegularExpression Id. */ +const int AMPERSAND_T = 126; + /** RegularExpression Id. */ +const int APOSTROPHE_T = 127; + /** RegularExpression Id. */ +const int LPAREN_T = 128; + /** RegularExpression Id. */ +const int RPAREN_T = 129; + /** RegularExpression Id. */ +const int DOUBLEMULT_T = 130; + /** RegularExpression Id. */ +const int MULT_T = 131; + /** RegularExpression Id. */ +const int PLUS_T = 132; + /** RegularExpression Id. */ +const int MINUS_T = 133; + /** RegularExpression Id. */ +const int COMMA_T = 134; + /** RegularExpression Id. */ +const int VARASSIGN_T = 135; + /** RegularExpression Id. */ +const int COLON_T = 136; + /** RegularExpression Id. */ +const int SEMI_T = 137; + /** RegularExpression Id. */ +const int LESSTHAN_T = 138; + /** RegularExpression Id. */ +const int GREATERTHAN_T = 139; + /** RegularExpression Id. */ +const int LT_T = 140; + /** RegularExpression Id. */ +const int GT_T = 141; + /** RegularExpression Id. */ +const int EQU_T = 142; + /** RegularExpression Id. */ +const int NOTEQU_T = 143; + /** RegularExpression Id. */ +const int ARROW_T = 144; + /** RegularExpression Id. */ +const int BOX_T = 145; + /** RegularExpression Id. */ +const int SLSL_T = 146; + /** RegularExpression Id. */ +const int RSRS_T = 147; + /** RegularExpression Id. */ +const int QQ_T = 148; + /** RegularExpression Id. */ +const int QGT_T = 149; + /** RegularExpression Id. */ +const int QLT_T = 150; + /** RegularExpression Id. */ +const int QG_T = 151; + /** RegularExpression Id. */ +const int QL_T = 152; + /** RegularExpression Id. */ +const int QEQU_T = 153; + /** RegularExpression Id. */ +const int QNEQU_T = 154; + /** RegularExpression Id. */ +const int Q_T = 155; + /** RegularExpression Id. */ +const int BAR_T = 156; + /** RegularExpression Id. */ +const int DOT_T = 157; + /** RegularExpression Id. */ +const int SLASH_T = 158; + /** RegularExpression Id. */ +const int AT_T = 159; + /** RegularExpression Id. */ +const int NEG_T = 160; + /** RegularExpression Id. */ +const int LBRACKET_T = 161; + /** RegularExpression Id. */ +const int RBRACKET_T = 162; + /** RegularExpression Id. */ +const int LBRACE = 163; + /** RegularExpression Id. */ +const int RBRACE = 164; + /** RegularExpression Id. */ +const int INTEGER = 165; + /** RegularExpression Id. */ +const int STRINGLITERAL = 166; + /** RegularExpression Id. */ +const int BASIC_IDENTIFIER = 167; + /** RegularExpression Id. */ +const int EXTENDED_CHARACTER = 168; + /** RegularExpression Id. */ +const int CHARACTER_LITERAL = 169; + /** RegularExpression Id. */ +const int DECIMAL_LITERAL = 170; + /** RegularExpression Id. */ +const int BASED_INTEGER = 171; + /** RegularExpression Id. */ +const int BASED_LITERAL = 172; + /** RegularExpression Id. */ +const int EXPONENT = 173; + /** RegularExpression Id. */ +const int BASIC_GRAPHIC_CHARACTER = 174; + /** RegularExpression Id. */ +const int GRAPHIC_CHARACTER = 175; + /** RegularExpression Id. */ +const int LETTER_OR_DIGIT = 176; + /** RegularExpression Id. */ +const int LETTER = 177; + /** RegularExpression Id. */ +const int UPPER_CASE_LETTER = 178; + /** RegularExpression Id. */ +const int BIT_STRING_LITERAL = 179; + /** RegularExpression Id. */ +const int BASE_SPECIFIER = 180; + /** RegularExpression Id. */ +const int DIGIT = 181; + /** RegularExpression Id. */ +const int SPECIAL_CHARACTER = 182; + /** RegularExpression Id. */ +const int OTHER_SPECIAL_CHARACTER = 183; + /** RegularExpression Id. */ +const int SPACE_CHARACTER = 184; + /** RegularExpression Id. */ +const int LOWER_CASE_LETTER = 185; + /** RegularExpression Id. */ +const int VHDL2008TOOLDIR = 186; + + /** Lexical state. */ +const int DEFAULT = 0; + + /** Literal token values. */ + static JAVACC_CHAR_TYPE tokenImage_arr_0[] = +{0x3c, 0x45, 0x4f, 0x46, 0x3e, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_1[] = +{0x22, 0x20, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_2[] = +{0x22, 0x9, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_3[] = +{0x22, 0xa, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_4[] = +{0x22, 0xd, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_5[] = +{0x22, 0x3c, 0x44, 0x4f, 0x58, 0x59, 0x47, 0x45, 0x4e, 0x5f, 0x56, 0x48, 0x44, 0x4c, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_6[] = +{0x22, 0x3c, 0x4d, 0x55, 0x4c, 0x54, 0x5f, 0x44, 0x4f, 0x58, 0x59, 0x47, 0x45, 0x4e, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_7[] = +{0x22, 0x3c, 0x56, 0x48, 0x44, 0x4c, 0x5f, 0x46, 0x4c, 0x4f, 0x57, 0x43, 0x48, 0x41, 0x52, 0x54, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_8[] = +{0x22, 0x3c, 0x56, 0x48, 0x44, 0x4c, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_9[] = +{0x22, 0x3c, 0x4d, 0x55, 0x4c, 0x54, 0x5f, 0x44, 0x4f, 0x58, 0x59, 0x47, 0x45, 0x4e, 0x5f, 0x56, 0x48, 0x44, 0x4c, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x32, 0x30, 0x30, 0x38, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_10[] = +{0x22, 0x3c, 0x4d, 0x55, 0x4c, 0x54, 0x5f, 0x56, 0x48, 0x44, 0x4c, 0x5f, 0x32, 0x30, 0x30, 0x38, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_11[] = +{0x22, 0x61, 0x62, 0x73, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_12[] = +{0x22, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_13[] = +{0x22, 0x61, 0x66, 0x74, 0x65, 0x72, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_14[] = +{0x22, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_15[] = +{0x22, 0x61, 0x6c, 0x6c, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_16[] = +{0x22, 0x61, 0x6e, 0x64, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_17[] = +{0x22, 0x61, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_18[] = +{0x22, 0x61, 0x72, 0x72, 0x61, 0x79, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_19[] = +{0x22, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_20[] = +{0x22, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_21[] = +{0x22, 0x61, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x5f, 0x67, 0x75, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x65, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_22[] = +{0x22, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_23[] = +{0x22, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_24[] = +{0x22, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_25[] = +{0x22, 0x62, 0x6f, 0x64, 0x79, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_26[] = +{0x22, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_27[] = +{0x22, 0x62, 0x75, 0x73, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_28[] = +{0x22, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_29[] = +{0x22, 0x63, 0x61, 0x73, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_30[] = +{0x22, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_31[] = +{0x22, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_32[] = +{0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_33[] = +{0x22, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_34[] = +{0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_35[] = +{0x22, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_36[] = +{0x22, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x6f, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_37[] = +{0x22, 0x65, 0x6c, 0x73, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_38[] = +{0x22, 0x65, 0x6c, 0x73, 0x69, 0x66, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_39[] = +{0x22, 0x65, 0x6e, 0x64, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_40[] = +{0x22, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_41[] = +{0x22, 0x65, 0x78, 0x69, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_42[] = +{0x22, 0x66, 0x61, 0x69, 0x72, 0x6e, 0x65, 0x73, 0x73, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_43[] = +{0x22, 0x66, 0x69, 0x6c, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_44[] = +{0x22, 0x66, 0x6f, 0x72, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_45[] = +{0x22, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_46[] = +{0x22, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_47[] = +{0x22, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_48[] = +{0x22, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_49[] = +{0x22, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_50[] = +{0x22, 0x67, 0x75, 0x61, 0x72, 0x64, 0x65, 0x64, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_51[] = +{0x22, 0x69, 0x66, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_52[] = +{0x22, 0x69, 0x6d, 0x70, 0x75, 0x72, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_53[] = +{0x22, 0x69, 0x6e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_54[] = +{0x22, 0x69, 0x6e, 0x65, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_55[] = +{0x22, 0x69, 0x6e, 0x6f, 0x75, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_56[] = +{0x22, 0x69, 0x73, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_57[] = +{0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_58[] = +{0x22, 0x6c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_59[] = +{0x22, 0x6c, 0x69, 0x6e, 0x6b, 0x61, 0x67, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_60[] = +{0x22, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_61[] = +{0x22, 0x6c, 0x6f, 0x6f, 0x70, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_62[] = +{0x22, 0x6d, 0x61, 0x70, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_63[] = +{0x22, 0x6d, 0x6f, 0x64, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_64[] = +{0x22, 0x6e, 0x61, 0x6e, 0x64, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_65[] = +{0x22, 0x6e, 0x65, 0x77, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_66[] = +{0x22, 0x6e, 0x65, 0x78, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_67[] = +{0x22, 0x6e, 0x6f, 0x72, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_68[] = +{0x22, 0x6e, 0x6f, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_69[] = +{0x22, 0x6e, 0x75, 0x6c, 0x6c, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_70[] = +{0x22, 0x6f, 0x66, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_71[] = +{0x22, 0x6f, 0x6e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_72[] = +{0x22, 0x6f, 0x70, 0x65, 0x6e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_73[] = +{0x22, 0x6f, 0x72, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_74[] = +{0x22, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x73, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_75[] = +{0x22, 0x6f, 0x75, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_76[] = +{0x22, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_77[] = +{0x22, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_78[] = +{0x22, 0x70, 0x6f, 0x72, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_79[] = +{0x22, 0x70, 0x6f, 0x73, 0x74, 0x70, 0x6f, 0x6e, 0x65, 0x64, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_80[] = +{0x22, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x75, 0x72, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_81[] = +{0x22, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_82[] = +{0x22, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_83[] = +{0x22, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_84[] = +{0x22, 0x70, 0x75, 0x72, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_85[] = +{0x22, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_86[] = +{0x22, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_87[] = +{0x22, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_88[] = +{0x22, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_89[] = +{0x22, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_90[] = +{0x22, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_91[] = +{0x22, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x5f, 0x67, 0x75, 0x61, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_92[] = +{0x22, 0x72, 0x65, 0x6d, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_93[] = +{0x22, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_94[] = +{0x22, 0x72, 0x6f, 0x6c, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_95[] = +{0x22, 0x72, 0x6f, 0x72, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_96[] = +{0x22, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_97[] = +{0x22, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_98[] = +{0x22, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_99[] = +{0x22, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_100[] = +{0x22, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_101[] = +{0x22, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_102[] = +{0x22, 0x73, 0x6c, 0x61, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_103[] = +{0x22, 0x73, 0x6c, 0x6c, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_104[] = +{0x22, 0x73, 0x72, 0x61, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_105[] = +{0x22, 0x73, 0x72, 0x6c, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_106[] = +{0x22, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_107[] = +{0x22, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_108[] = +{0x22, 0x74, 0x68, 0x65, 0x6e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_109[] = +{0x22, 0x74, 0x6f, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_110[] = +{0x22, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_111[] = +{0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_112[] = +{0x22, 0x75, 0x6e, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_113[] = +{0x22, 0x75, 0x6e, 0x69, 0x74, 0x73, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_114[] = +{0x22, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_115[] = +{0x22, 0x75, 0x73, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_116[] = +{0x22, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_117[] = +{0x22, 0x76, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_118[] = +{0x22, 0x76, 0x70, 0x72, 0x6f, 0x70, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_119[] = +{0x22, 0x76, 0x75, 0x6e, 0x69, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_120[] = +{0x22, 0x77, 0x61, 0x69, 0x74, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_121[] = +{0x22, 0x77, 0x68, 0x65, 0x6e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_122[] = +{0x22, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_123[] = +{0x22, 0x77, 0x69, 0x74, 0x68, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_124[] = +{0x22, 0x78, 0x6f, 0x72, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_125[] = +{0x22, 0x78, 0x6e, 0x6f, 0x72, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_126[] = +{0x22, 0x26, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_127[] = +{0x22, 0x27, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_128[] = +{0x22, 0x28, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_129[] = +{0x22, 0x29, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_130[] = +{0x22, 0x2a, 0x2a, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_131[] = +{0x22, 0x2a, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_132[] = +{0x22, 0x2b, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_133[] = +{0x22, 0x2d, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_134[] = +{0x22, 0x2c, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_135[] = +{0x22, 0x3a, 0x3d, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_136[] = +{0x22, 0x3a, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_137[] = +{0x22, 0x3b, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_138[] = +{0x22, 0x3c, 0x3d, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_139[] = +{0x22, 0x3e, 0x3d, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_140[] = +{0x22, 0x3c, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_141[] = +{0x22, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_142[] = +{0x22, 0x3d, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_143[] = +{0x22, 0x2f, 0x3d, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_144[] = +{0x22, 0x3d, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_145[] = +{0x22, 0x3c, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_146[] = +{0x22, 0x3c, 0x3c, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_147[] = +{0x22, 0x3e, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_148[] = +{0x22, 0x3f, 0x3f, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_149[] = +{0x22, 0x3f, 0x3e, 0x3d, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_150[] = +{0x22, 0x3f, 0x3c, 0x3d, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_151[] = +{0x22, 0x3f, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_152[] = +{0x22, 0x3f, 0x3c, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_153[] = +{0x22, 0x3f, 0x3d, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_154[] = +{0x22, 0x3f, 0x2f, 0x3d, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_155[] = +{0x22, 0x3f, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_156[] = +{0x22, 0x7c, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_157[] = +{0x22, 0x2e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_158[] = +{0x22, 0x2f, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_159[] = +{0x22, 0x40, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_160[] = +{0x22, 0x5e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_161[] = +{0x22, 0x5b, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_162[] = +{0x22, 0x5d, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_163[] = +{0x22, 0x7b, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_164[] = +{0x22, 0x7d, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_165[] = +{0x22, 0x3c, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_166[] = +{0x22, 0x3c, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x4c, 0x49, 0x54, 0x45, 0x52, 0x41, 0x4c, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_167[] = +{0x22, 0x3c, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x46, 0x49, 0x45, 0x52, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_168[] = +{0x22, 0x3c, 0x45, 0x58, 0x54, 0x45, 0x4e, 0x44, 0x45, 0x44, 0x5f, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_169[] = +{0x22, 0x3c, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52, 0x5f, 0x4c, 0x49, 0x54, 0x45, 0x52, 0x41, 0x4c, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_170[] = +{0x22, 0x3c, 0x44, 0x45, 0x43, 0x49, 0x4d, 0x41, 0x4c, 0x5f, 0x4c, 0x49, 0x54, 0x45, 0x52, 0x41, 0x4c, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_171[] = +{0x22, 0x3c, 0x42, 0x41, 0x53, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x45, 0x52, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_172[] = +{0x22, 0x3c, 0x42, 0x41, 0x53, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x54, 0x45, 0x52, 0x41, 0x4c, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_173[] = +{0x22, 0x3c, 0x45, 0x58, 0x50, 0x4f, 0x4e, 0x45, 0x4e, 0x54, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_174[] = +{0x22, 0x3c, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x47, 0x52, 0x41, 0x50, 0x48, 0x49, 0x43, 0x5f, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_175[] = +{0x22, 0x3c, 0x47, 0x52, 0x41, 0x50, 0x48, 0x49, 0x43, 0x5f, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_176[] = +{0x22, 0x3c, 0x4c, 0x45, 0x54, 0x54, 0x45, 0x52, 0x5f, 0x4f, 0x52, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_177[] = +{0x22, 0x3c, 0x4c, 0x45, 0x54, 0x54, 0x45, 0x52, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_178[] = +{0x22, 0x3c, 0x55, 0x50, 0x50, 0x45, 0x52, 0x5f, 0x43, 0x41, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x54, 0x54, 0x45, 0x52, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_179[] = +{0x22, 0x3c, 0x42, 0x49, 0x54, 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x4c, 0x49, 0x54, 0x45, 0x52, 0x41, 0x4c, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_180[] = +{0x22, 0x3c, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x52, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_181[] = +{0x22, 0x3c, 0x44, 0x49, 0x47, 0x49, 0x54, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_182[] = +{0x22, 0x3c, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x5f, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_183[] = +{0x22, 0x3c, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, 0x41, 0x4c, 0x5f, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_184[] = +{0x22, 0x3c, 0x53, 0x50, 0x41, 0x43, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x52, 0x41, 0x43, 0x54, 0x45, 0x52, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_185[] = +{0x22, 0x3c, 0x4c, 0x4f, 0x57, 0x45, 0x52, 0x5f, 0x43, 0x41, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x54, 0x54, 0x45, 0x52, 0x3e, 0x22, 0}; + static JAVACC_CHAR_TYPE tokenImage_arr_186[] = +{0x22, 0x3c, 0x56, 0x48, 0x44, 0x4c, 0x32, 0x30, 0x30, 0x38, 0x54, 0x4f, 0x4f, 0x4c, 0x44, 0x49, 0x52, 0x3e, 0x22, 0}; + static JAVACC_STRING_TYPE tokenImage[] = { +tokenImage_arr_0, +tokenImage_arr_1, +tokenImage_arr_2, +tokenImage_arr_3, +tokenImage_arr_4, +tokenImage_arr_5, +tokenImage_arr_6, +tokenImage_arr_7, +tokenImage_arr_8, +tokenImage_arr_9, +tokenImage_arr_10, +tokenImage_arr_11, +tokenImage_arr_12, +tokenImage_arr_13, +tokenImage_arr_14, +tokenImage_arr_15, +tokenImage_arr_16, +tokenImage_arr_17, +tokenImage_arr_18, +tokenImage_arr_19, +tokenImage_arr_20, +tokenImage_arr_21, +tokenImage_arr_22, +tokenImage_arr_23, +tokenImage_arr_24, +tokenImage_arr_25, +tokenImage_arr_26, +tokenImage_arr_27, +tokenImage_arr_28, +tokenImage_arr_29, +tokenImage_arr_30, +tokenImage_arr_31, +tokenImage_arr_32, +tokenImage_arr_33, +tokenImage_arr_34, +tokenImage_arr_35, +tokenImage_arr_36, +tokenImage_arr_37, +tokenImage_arr_38, +tokenImage_arr_39, +tokenImage_arr_40, +tokenImage_arr_41, +tokenImage_arr_42, +tokenImage_arr_43, +tokenImage_arr_44, +tokenImage_arr_45, +tokenImage_arr_46, +tokenImage_arr_47, +tokenImage_arr_48, +tokenImage_arr_49, +tokenImage_arr_50, +tokenImage_arr_51, +tokenImage_arr_52, +tokenImage_arr_53, +tokenImage_arr_54, +tokenImage_arr_55, +tokenImage_arr_56, +tokenImage_arr_57, +tokenImage_arr_58, +tokenImage_arr_59, +tokenImage_arr_60, +tokenImage_arr_61, +tokenImage_arr_62, +tokenImage_arr_63, +tokenImage_arr_64, +tokenImage_arr_65, +tokenImage_arr_66, +tokenImage_arr_67, +tokenImage_arr_68, +tokenImage_arr_69, +tokenImage_arr_70, +tokenImage_arr_71, +tokenImage_arr_72, +tokenImage_arr_73, +tokenImage_arr_74, +tokenImage_arr_75, +tokenImage_arr_76, +tokenImage_arr_77, +tokenImage_arr_78, +tokenImage_arr_79, +tokenImage_arr_80, +tokenImage_arr_81, +tokenImage_arr_82, +tokenImage_arr_83, +tokenImage_arr_84, +tokenImage_arr_85, +tokenImage_arr_86, +tokenImage_arr_87, +tokenImage_arr_88, +tokenImage_arr_89, +tokenImage_arr_90, +tokenImage_arr_91, +tokenImage_arr_92, +tokenImage_arr_93, +tokenImage_arr_94, +tokenImage_arr_95, +tokenImage_arr_96, +tokenImage_arr_97, +tokenImage_arr_98, +tokenImage_arr_99, +tokenImage_arr_100, +tokenImage_arr_101, +tokenImage_arr_102, +tokenImage_arr_103, +tokenImage_arr_104, +tokenImage_arr_105, +tokenImage_arr_106, +tokenImage_arr_107, +tokenImage_arr_108, +tokenImage_arr_109, +tokenImage_arr_110, +tokenImage_arr_111, +tokenImage_arr_112, +tokenImage_arr_113, +tokenImage_arr_114, +tokenImage_arr_115, +tokenImage_arr_116, +tokenImage_arr_117, +tokenImage_arr_118, +tokenImage_arr_119, +tokenImage_arr_120, +tokenImage_arr_121, +tokenImage_arr_122, +tokenImage_arr_123, +tokenImage_arr_124, +tokenImage_arr_125, +tokenImage_arr_126, +tokenImage_arr_127, +tokenImage_arr_128, +tokenImage_arr_129, +tokenImage_arr_130, +tokenImage_arr_131, +tokenImage_arr_132, +tokenImage_arr_133, +tokenImage_arr_134, +tokenImage_arr_135, +tokenImage_arr_136, +tokenImage_arr_137, +tokenImage_arr_138, +tokenImage_arr_139, +tokenImage_arr_140, +tokenImage_arr_141, +tokenImage_arr_142, +tokenImage_arr_143, +tokenImage_arr_144, +tokenImage_arr_145, +tokenImage_arr_146, +tokenImage_arr_147, +tokenImage_arr_148, +tokenImage_arr_149, +tokenImage_arr_150, +tokenImage_arr_151, +tokenImage_arr_152, +tokenImage_arr_153, +tokenImage_arr_154, +tokenImage_arr_155, +tokenImage_arr_156, +tokenImage_arr_157, +tokenImage_arr_158, +tokenImage_arr_159, +tokenImage_arr_160, +tokenImage_arr_161, +tokenImage_arr_162, +tokenImage_arr_163, +tokenImage_arr_164, +tokenImage_arr_165, +tokenImage_arr_166, +tokenImage_arr_167, +tokenImage_arr_168, +tokenImage_arr_169, +tokenImage_arr_170, +tokenImage_arr_171, +tokenImage_arr_172, +tokenImage_arr_173, +tokenImage_arr_174, +tokenImage_arr_175, +tokenImage_arr_176, +tokenImage_arr_177, +tokenImage_arr_178, +tokenImage_arr_179, +tokenImage_arr_180, +tokenImage_arr_181, +tokenImage_arr_182, +tokenImage_arr_183, +tokenImage_arr_184, +tokenImage_arr_185, +tokenImage_arr_186, + }; + +} +} +#endif diff --git a/vhdlparser/VhdlParserErrorHandler.hpp b/vhdlparser/VhdlParserErrorHandler.hpp new file mode 100644 index 0000000..d98f029 --- /dev/null +++ b/vhdlparser/VhdlParserErrorHandler.hpp @@ -0,0 +1,40 @@ +#ifndef VHDLPARSERERRORHANDLER_H +#define VHDLPARSERERRORHANDLER_H + +#include <stdio.h> +#include <stdlib.h> +#include <exception> +#include "VhdlParser.h" +#include "ErrorHandler.h" +#include "vhdlstring.h" + +namespace vhdl { namespace parser { + +class VhdlErrorHandler: public ErrorHandler + { + virtual void handleUnexpectedToken(int expectedKind, JAVACC_STRING_TYPE expectedToken, Token *actual, VhdlParser *parser) + { + fprintf(stderr,"\n\n syntax error at line: %d : %s\n", actual->beginLine,actual->image.data()); + error_count++; + throw std::exception(); + } + + virtual void handleParseError(Token *last, Token *unexpected, JAVACC_SIMPLE_STRING production, VhdlParser *parser) + { + fprintf(stderr,"\n\n unexpected token at line: %d %s\n", last->beginLine,unexpected->image.data()); + error_count++; + throw std::exception(); + } + + virtual void handleOtherError(JAVACC_STRING_TYPE message, VhdlParser *parser) + { + fprintf(stderr, "\n\n unexpected error: %s\n", (char*)message.c_str()); + error_count++; + throw std::exception(); + } + }; +} +} + +#endif + diff --git a/vhdlparser/VhdlParserIF.cpp b/vhdlparser/VhdlParserIF.cpp new file mode 100644 index 0000000..e8768ee --- /dev/null +++ b/vhdlparser/VhdlParserIF.cpp @@ -0,0 +1,55 @@ + +#include "VhdlParserTokenManager.h" +#include "VhdlParserErrorHandler.hpp" +#include "VhdlParser.h" +#include "VhdlParserIF.h" +#include "CharStream.h" + +using namespace vhdl::parser; + +static VhdlParser * myParser=0; + +void VhdlParserIF::parseVhdlfile(const char* inputBuffer,bool inLine) +{ + JAVACC_STRING_TYPE s =inputBuffer; + CharStream *stream = new CharStream(s.c_str(), (int)s.size(), 1, 1); + VhdlParserTokenManager *tokenManager = new VhdlParserTokenManager(stream); + myParser=new VhdlParser(tokenManager); + VhdlErrorHandler *myErr=new VhdlErrorHandler(); + myParser->setErrorHandler(myErr); + try + { + if(inLine) + { + myParser->parseInline(); + } + else + { + myParser->design_file(); + } + } + catch( std::exception &){ /* fprintf(stderr,"\n[%s]",e.what()); */ } + // fprintf(stderr,"\n\nparsed lines: %d\n",yyLineNr); + // fprintf(stderr,"\n\nerrors : %d\n\n",myErr->getErrorCount()); + delete myParser; + +} + +void VhdlParser::error_skipto(int kind) +{ + Token *op; + do + { + Token *t = myParser->getNextToken();// step to next token + op=myParser->getToken(1); // get first token + if (op==0) break; + //fprintf(stderr,"\n %s",t->image.data()); + } while (op->kind != kind); + myParser->hasError=false; + // The above loop consumes tokens all the way up to a token of + // "kind". We use a do-while loop rather than a while because the + // current token is the one immediately before the erroneous token + // (in our case the token immediately before what should have been + // "if"/"while". + +} diff --git a/vhdlparser/VhdlParserIF.h b/vhdlparser/VhdlParserIF.h new file mode 100644 index 0000000..d11389b --- /dev/null +++ b/vhdlparser/VhdlParserIF.h @@ -0,0 +1,12 @@ +#ifndef VHDLPARSERIF +#define VHDLPARSERIF + +#include "VhdlParser.h" + +class VhdlParserIF +{ + public: + static void parseVhdlfile(const char* inputBuffer,bool inLine); + +}; +#endif diff --git a/vhdlparser/VhdlParserTokenManager.cc b/vhdlparser/VhdlParserTokenManager.cc new file mode 100644 index 0000000..a35deb2 --- /dev/null +++ b/vhdlparser/VhdlParserTokenManager.cc @@ -0,0 +1,3605 @@ +/* VhdlParserTokenManager.cc */ +#include "./VhdlParserTokenManager.h" +namespace vhdl { +namespace parser { +static const unsigned long long jjbitVec0[] = { + 0xfffffffffffffffeULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL +}; +static const unsigned long long jjbitVec2[] = { + 0x0ULL, 0x0ULL, 0xffffffffffffffffULL, 0xffffffffffffffffULL +}; +static const unsigned long long jjbitVec3[] = { + 0x0ULL, 0x0ULL, 0xffffffff00000000ULL, 0xffffffffffffffffULL +}; +static const int jjnextStates[] = { + 53, 54, 55, 56, 57, 60, 64, 65, 66, 47, 48, 2, 36, 37, 0, 3, + 4, 5, 7, 12, 13, 15, 16, 32, 33, 35, 38, 39, 41, 55, 56, 57, + 60, 59, 58, 60, 64, 65, 66, 67, 68, 70, 9, 10, 23, 24, 27, 28, + 44, 46, 49, 51, 26, 29, +}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_0[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_1[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_2[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_3[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_4[] = {0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_5[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_6[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_7[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_8[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_9[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_10[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_11[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_12[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_13[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_14[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_15[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_16[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_17[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_18[] = {0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_19[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_20[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_21[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_22[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_23[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_24[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_25[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_26[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_27[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_28[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_29[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_30[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_31[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_32[] = {0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_33[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_34[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_35[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_36[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_37[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_38[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_39[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_40[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_41[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_42[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_43[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_44[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_45[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_46[] = {0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_47[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_48[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_49[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_50[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_51[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_52[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_53[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_54[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_55[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_56[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_57[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_58[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_59[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_60[] = {0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_61[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_62[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_63[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_64[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_65[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_66[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_67[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_68[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_69[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_70[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_71[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_72[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_73[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_74[] = {0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_75[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_76[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_77[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_78[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_79[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_80[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_81[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_82[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_83[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_84[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_85[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_86[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_87[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_88[] = {0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_89[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_90[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_91[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_92[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_93[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_94[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_95[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_96[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_97[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_98[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_99[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_100[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_101[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_102[] = {0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_103[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_104[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_105[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_106[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_107[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_108[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_109[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_110[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_111[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_112[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_113[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_114[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_115[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_116[] = {0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_117[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_118[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_119[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_120[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_121[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_122[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_123[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_124[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_125[] = {0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_126[] = {0x26, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_127[] = {0x27, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_128[] = {0x28, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_129[] = {0x29, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_130[] = {0x2a, 0x2a, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_131[] = {0x2a, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_132[] = {0x2b, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_133[] = {0x2d, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_134[] = {0x2c, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_135[] = {0x3a, 0x3d, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_136[] = {0x3a, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_137[] = {0x3b, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_138[] = {0x3c, 0x3d, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_139[] = {0x3e, 0x3d, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_140[] = {0x3c, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_141[] = {0x3e, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_142[] = {0x3d, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_143[] = {0x2f, 0x3d, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_144[] = {0x3d, 0x3e, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_145[] = {0x3c, 0x3e, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_146[] = {0x3c, 0x3c, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_147[] = {0x3e, 0x3e, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_148[] = {0x3f, 0x3f, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_149[] = {0x3f, 0x3e, 0x3d, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_150[] = {0x3f, 0x3c, 0x3d, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_151[] = {0x3f, 0x3e, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_152[] = {0x3f, 0x3c, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_153[] = {0x3f, 0x3d, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_154[] = {0x3f, 0x2f, 0x3d, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_155[] = {0x3f, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_156[] = {0x7c, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_157[] = {0x2e, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_158[] = {0x2f, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_159[] = {0x40, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_160[] = {0x5e, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_161[] = {0x5b, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_162[] = {0x5d, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_163[] = {0x7b, 0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_164[] = {0x7d, 0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_165[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_166[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_167[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_168[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_169[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_170[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_171[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_172[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_173[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_174[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_175[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_176[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_177[] = {0}; + +static JAVACC_CHAR_TYPE jjstrLiteralChars_178[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_179[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_180[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_181[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_182[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_183[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_184[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_185[] = {0}; +static JAVACC_CHAR_TYPE jjstrLiteralChars_186[] = {0}; +static const JAVACC_STRING_TYPE jjstrLiteralImages[] = { +jjstrLiteralChars_0, +jjstrLiteralChars_1, +jjstrLiteralChars_2, +jjstrLiteralChars_3, +jjstrLiteralChars_4, +jjstrLiteralChars_5, +jjstrLiteralChars_6, +jjstrLiteralChars_7, +jjstrLiteralChars_8, +jjstrLiteralChars_9, +jjstrLiteralChars_10, +jjstrLiteralChars_11, +jjstrLiteralChars_12, +jjstrLiteralChars_13, +jjstrLiteralChars_14, +jjstrLiteralChars_15, +jjstrLiteralChars_16, +jjstrLiteralChars_17, +jjstrLiteralChars_18, +jjstrLiteralChars_19, +jjstrLiteralChars_20, +jjstrLiteralChars_21, +jjstrLiteralChars_22, +jjstrLiteralChars_23, +jjstrLiteralChars_24, +jjstrLiteralChars_25, +jjstrLiteralChars_26, +jjstrLiteralChars_27, +jjstrLiteralChars_28, +jjstrLiteralChars_29, +jjstrLiteralChars_30, +jjstrLiteralChars_31, +jjstrLiteralChars_32, +jjstrLiteralChars_33, +jjstrLiteralChars_34, +jjstrLiteralChars_35, +jjstrLiteralChars_36, +jjstrLiteralChars_37, +jjstrLiteralChars_38, +jjstrLiteralChars_39, +jjstrLiteralChars_40, +jjstrLiteralChars_41, +jjstrLiteralChars_42, +jjstrLiteralChars_43, +jjstrLiteralChars_44, +jjstrLiteralChars_45, +jjstrLiteralChars_46, +jjstrLiteralChars_47, +jjstrLiteralChars_48, +jjstrLiteralChars_49, +jjstrLiteralChars_50, +jjstrLiteralChars_51, +jjstrLiteralChars_52, +jjstrLiteralChars_53, +jjstrLiteralChars_54, +jjstrLiteralChars_55, +jjstrLiteralChars_56, +jjstrLiteralChars_57, +jjstrLiteralChars_58, +jjstrLiteralChars_59, +jjstrLiteralChars_60, +jjstrLiteralChars_61, +jjstrLiteralChars_62, +jjstrLiteralChars_63, +jjstrLiteralChars_64, +jjstrLiteralChars_65, +jjstrLiteralChars_66, +jjstrLiteralChars_67, +jjstrLiteralChars_68, +jjstrLiteralChars_69, +jjstrLiteralChars_70, +jjstrLiteralChars_71, +jjstrLiteralChars_72, +jjstrLiteralChars_73, +jjstrLiteralChars_74, +jjstrLiteralChars_75, +jjstrLiteralChars_76, +jjstrLiteralChars_77, +jjstrLiteralChars_78, +jjstrLiteralChars_79, +jjstrLiteralChars_80, +jjstrLiteralChars_81, +jjstrLiteralChars_82, +jjstrLiteralChars_83, +jjstrLiteralChars_84, +jjstrLiteralChars_85, +jjstrLiteralChars_86, +jjstrLiteralChars_87, +jjstrLiteralChars_88, +jjstrLiteralChars_89, +jjstrLiteralChars_90, +jjstrLiteralChars_91, +jjstrLiteralChars_92, +jjstrLiteralChars_93, +jjstrLiteralChars_94, +jjstrLiteralChars_95, +jjstrLiteralChars_96, +jjstrLiteralChars_97, +jjstrLiteralChars_98, +jjstrLiteralChars_99, +jjstrLiteralChars_100, +jjstrLiteralChars_101, +jjstrLiteralChars_102, +jjstrLiteralChars_103, +jjstrLiteralChars_104, +jjstrLiteralChars_105, +jjstrLiteralChars_106, +jjstrLiteralChars_107, +jjstrLiteralChars_108, +jjstrLiteralChars_109, +jjstrLiteralChars_110, +jjstrLiteralChars_111, +jjstrLiteralChars_112, +jjstrLiteralChars_113, +jjstrLiteralChars_114, +jjstrLiteralChars_115, +jjstrLiteralChars_116, +jjstrLiteralChars_117, +jjstrLiteralChars_118, +jjstrLiteralChars_119, +jjstrLiteralChars_120, +jjstrLiteralChars_121, +jjstrLiteralChars_122, +jjstrLiteralChars_123, +jjstrLiteralChars_124, +jjstrLiteralChars_125, +jjstrLiteralChars_126, +jjstrLiteralChars_127, +jjstrLiteralChars_128, +jjstrLiteralChars_129, +jjstrLiteralChars_130, +jjstrLiteralChars_131, +jjstrLiteralChars_132, +jjstrLiteralChars_133, +jjstrLiteralChars_134, +jjstrLiteralChars_135, +jjstrLiteralChars_136, +jjstrLiteralChars_137, +jjstrLiteralChars_138, +jjstrLiteralChars_139, +jjstrLiteralChars_140, +jjstrLiteralChars_141, +jjstrLiteralChars_142, +jjstrLiteralChars_143, +jjstrLiteralChars_144, +jjstrLiteralChars_145, +jjstrLiteralChars_146, +jjstrLiteralChars_147, +jjstrLiteralChars_148, +jjstrLiteralChars_149, +jjstrLiteralChars_150, +jjstrLiteralChars_151, +jjstrLiteralChars_152, +jjstrLiteralChars_153, +jjstrLiteralChars_154, +jjstrLiteralChars_155, +jjstrLiteralChars_156, +jjstrLiteralChars_157, +jjstrLiteralChars_158, +jjstrLiteralChars_159, +jjstrLiteralChars_160, +jjstrLiteralChars_161, +jjstrLiteralChars_162, +jjstrLiteralChars_163, +jjstrLiteralChars_164, +jjstrLiteralChars_165, +jjstrLiteralChars_166, +jjstrLiteralChars_167, +jjstrLiteralChars_168, +jjstrLiteralChars_169, +jjstrLiteralChars_170, +jjstrLiteralChars_171, +jjstrLiteralChars_172, +jjstrLiteralChars_173, +jjstrLiteralChars_174, +jjstrLiteralChars_175, +jjstrLiteralChars_176, +jjstrLiteralChars_177, +jjstrLiteralChars_178, +jjstrLiteralChars_179, +jjstrLiteralChars_180, +jjstrLiteralChars_181, +jjstrLiteralChars_182, +jjstrLiteralChars_183, +jjstrLiteralChars_184, +jjstrLiteralChars_185, +jjstrLiteralChars_186, +}; + +/** Lexer state names. */ +static const JAVACC_CHAR_TYPE lexStateNames_arr_0[] = +{0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0}; +static const JAVACC_STRING_TYPE lexStateNames[] = { +lexStateNames_arr_0, +}; +static const unsigned long long jjtoToken[] = { + 0xfffffffffffff801ULL, 0xffffffffffffffffULL, 0x4081fffffffffffULL, +}; +static const unsigned long long jjtoSkip[] = { + 0x7deULL, 0x0ULL, 0x0ULL, +}; + +void VhdlParserTokenManager::setDebugStream(FILE *ds){ debugStream = ds; } + + int VhdlParserTokenManager::jjStopAtPos(int pos, int kind){ + jjmatchedKind = kind; + jjmatchedPos = pos; + return pos + 1; +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa0_0(){ + switch(curChar) + { + case 9: + jjmatchedKind = 2; + return jjMoveNfa_0(11, 0); + case 10: + jjmatchedKind = 3; + return jjMoveNfa_0(11, 0); + case 13: + jjmatchedKind = 4; + return jjMoveNfa_0(11, 0); + case 32: + jjmatchedKind = 1; + return jjMoveNfa_0(11, 0); + case 38: + jjmatchedKind = 126; + return jjMoveNfa_0(11, 0); + case 39: + jjmatchedKind = 127; + return jjMoveNfa_0(11, 0); + case 40: + jjmatchedKind = 128; + return jjMoveNfa_0(11, 0); + case 41: + jjmatchedKind = 129; + return jjMoveNfa_0(11, 0); + case 42: + jjmatchedKind = 131; + return jjMoveStringLiteralDfa1_0(0x0ULL, 0x0ULL, 0x4ULL); + case 43: + jjmatchedKind = 132; + return jjMoveNfa_0(11, 0); + case 44: + jjmatchedKind = 134; + return jjMoveNfa_0(11, 0); + case 45: + jjmatchedKind = 133; + return jjMoveNfa_0(11, 0); + case 46: + jjmatchedKind = 157; + return jjMoveNfa_0(11, 0); + case 47: + jjmatchedKind = 158; + return jjMoveStringLiteralDfa1_0(0x0ULL, 0x0ULL, 0x8000ULL); + case 58: + jjmatchedKind = 136; + return jjMoveStringLiteralDfa1_0(0x0ULL, 0x0ULL, 0x80ULL); + case 59: + jjmatchedKind = 137; + return jjMoveNfa_0(11, 0); + case 60: + jjmatchedKind = 140; + return jjMoveStringLiteralDfa1_0(0x0ULL, 0x0ULL, 0x60400ULL); + case 61: + jjmatchedKind = 142; + return jjMoveStringLiteralDfa1_0(0x0ULL, 0x0ULL, 0x10000ULL); + case 62: + jjmatchedKind = 141; + return jjMoveStringLiteralDfa1_0(0x0ULL, 0x0ULL, 0x80800ULL); + case 63: + jjmatchedKind = 155; + return jjMoveStringLiteralDfa1_0(0x0ULL, 0x0ULL, 0x7f00000ULL); + case 64: + jjmatchedKind = 159; + return jjMoveNfa_0(11, 0); + case 65: + return jjMoveStringLiteralDfa1_0(0x7ff800ULL, 0x0ULL, 0x0ULL); + case 66: + return jjMoveStringLiteralDfa1_0(0xf800000ULL, 0x0ULL, 0x0ULL); + case 67: + return jjMoveStringLiteralDfa1_0(0x3f0000000ULL, 0x0ULL, 0x0ULL); + case 68: + return jjMoveStringLiteralDfa1_0(0x1c00000000ULL, 0x0ULL, 0x0ULL); + case 69: + return jjMoveStringLiteralDfa1_0(0x3e000000000ULL, 0x0ULL, 0x0ULL); + case 70: + return jjMoveStringLiteralDfa1_0(0x7c0000000000ULL, 0x0ULL, 0x0ULL); + case 71: + return jjMoveStringLiteralDfa1_0(0x7800000000000ULL, 0x0ULL, 0x0ULL); + case 73: + return jjMoveStringLiteralDfa1_0(0x1f8000000000000ULL, 0x0ULL, 0x0ULL); + case 76: + return jjMoveStringLiteralDfa1_0(0x3e00000000000000ULL, 0x0ULL, 0x0ULL); + case 77: + return jjMoveStringLiteralDfa1_0(0xc000000000000000ULL, 0x0ULL, 0x0ULL); + case 78: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0x3fULL, 0x0ULL); + case 79: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0xfc0ULL, 0x0ULL); + case 80: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0x1ff000ULL, 0x0ULL); + case 82: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0x1ffe00000ULL, 0x0ULL); + case 83: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0xffe00000000ULL, 0x0ULL); + case 84: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0xf00000000000ULL, 0x0ULL); + case 85: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0xf000000000000ULL, 0x0ULL); + case 86: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0xf0000000000000ULL, 0x0ULL); + case 87: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0xf00000000000000ULL, 0x0ULL); + case 88: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0x3000000000000000ULL, 0x0ULL); + case 91: + jjmatchedKind = 161; + return jjMoveNfa_0(11, 0); + case 93: + jjmatchedKind = 162; + return jjMoveNfa_0(11, 0); + case 94: + jjmatchedKind = 160; + return jjMoveNfa_0(11, 0); + case 97: + return jjMoveStringLiteralDfa1_0(0x7ff800ULL, 0x0ULL, 0x0ULL); + case 98: + return jjMoveStringLiteralDfa1_0(0xf800000ULL, 0x0ULL, 0x0ULL); + case 99: + return jjMoveStringLiteralDfa1_0(0x3f0000000ULL, 0x0ULL, 0x0ULL); + case 100: + return jjMoveStringLiteralDfa1_0(0x1c00000000ULL, 0x0ULL, 0x0ULL); + case 101: + return jjMoveStringLiteralDfa1_0(0x3e000000000ULL, 0x0ULL, 0x0ULL); + case 102: + return jjMoveStringLiteralDfa1_0(0x7c0000000000ULL, 0x0ULL, 0x0ULL); + case 103: + return jjMoveStringLiteralDfa1_0(0x7800000000000ULL, 0x0ULL, 0x0ULL); + case 105: + return jjMoveStringLiteralDfa1_0(0x1f8000000000000ULL, 0x0ULL, 0x0ULL); + case 108: + return jjMoveStringLiteralDfa1_0(0x3e00000000000000ULL, 0x0ULL, 0x0ULL); + case 109: + return jjMoveStringLiteralDfa1_0(0xc000000000000000ULL, 0x0ULL, 0x0ULL); + case 110: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0x3fULL, 0x0ULL); + case 111: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0xfc0ULL, 0x0ULL); + case 112: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0x1ff000ULL, 0x0ULL); + case 114: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0x1ffe00000ULL, 0x0ULL); + case 115: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0xffe00000000ULL, 0x0ULL); + case 116: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0xf00000000000ULL, 0x0ULL); + case 117: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0xf000000000000ULL, 0x0ULL); + case 118: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0xf0000000000000ULL, 0x0ULL); + case 119: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0xf00000000000000ULL, 0x0ULL); + case 120: + return jjMoveStringLiteralDfa1_0(0x0ULL, 0x3000000000000000ULL, 0x0ULL); + case 123: + jjmatchedKind = 163; + return jjMoveNfa_0(11, 0); + case 124: + jjmatchedKind = 156; + return jjMoveNfa_0(11, 0); + case 125: + jjmatchedKind = 164; + return jjMoveNfa_0(11, 0); + default : + return jjMoveNfa_0(11, 0); + } +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa1_0(unsigned long long active0, unsigned long long active1, unsigned long long active2){ + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 0); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 42: + if ((active2 & 0x4ULL) != 0L) + { + jjmatchedKind = 130; + jjmatchedPos = 1; + } + break; + case 47: + return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x4000000ULL); + case 60: + if ((active2 & 0x40000ULL) != 0L) + { + jjmatchedKind = 146; + jjmatchedPos = 1; + } + else if ((active2 & 0x1000000ULL) != 0L) + { + jjmatchedKind = 152; + jjmatchedPos = 1; + } + return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x400000ULL); + case 61: + if ((active2 & 0x80ULL) != 0L) + { + jjmatchedKind = 135; + jjmatchedPos = 1; + } + else if ((active2 & 0x400ULL) != 0L) + { + jjmatchedKind = 138; + jjmatchedPos = 1; + } + else if ((active2 & 0x800ULL) != 0L) + { + jjmatchedKind = 139; + jjmatchedPos = 1; + } + else if ((active2 & 0x8000ULL) != 0L) + { + jjmatchedKind = 143; + jjmatchedPos = 1; + } + else if ((active2 & 0x2000000ULL) != 0L) + { + jjmatchedKind = 153; + jjmatchedPos = 1; + } + break; + case 62: + if ((active2 & 0x10000ULL) != 0L) + { + jjmatchedKind = 144; + jjmatchedPos = 1; + } + else if ((active2 & 0x20000ULL) != 0L) + { + jjmatchedKind = 145; + jjmatchedPos = 1; + } + else if ((active2 & 0x80000ULL) != 0L) + { + jjmatchedKind = 147; + jjmatchedPos = 1; + } + else if ((active2 & 0x800000ULL) != 0L) + { + jjmatchedKind = 151; + jjmatchedPos = 1; + } + return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0L, active2, 0x200000ULL); + case 63: + if ((active2 & 0x100000ULL) != 0L) + { + jjmatchedKind = 148; + jjmatchedPos = 1; + } + break; + case 65: + return jjMoveStringLiteralDfa2_0(active0, 0x4200040020000000ULL, active1, 0x110000000203001ULL, active2, 0L); + case 66: + return jjMoveStringLiteralDfa2_0(active0, 0x800ULL, active1, 0L, active2, 0L); + case 67: + return jjMoveStringLiteralDfa2_0(active0, 0x1000ULL, active1, 0L, active2, 0L); + case 69: + return jjMoveStringLiteralDfa2_0(active0, 0x1800400800000ULL, active1, 0xf3fc00006ULL, active2, 0L); + case 70: + if ((active0 & 0x8000000000000ULL) != 0L) + { + jjmatchedKind = 51; + jjmatchedPos = 1; + } + else if ((active1 & 0x40ULL) != 0L) + { + jjmatchedKind = 70; + jjmatchedPos = 1; + } + return jjMoveStringLiteralDfa2_0(active0, 0x2000ULL, active1, 0L, active2, 0L); + case 72: + return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x600102000000000ULL, active2, 0L); + case 73: + return jjMoveStringLiteralDfa2_0(active0, 0x1c00080800000000ULL, active1, 0x800001000000000ULL, active2, 0L); + case 76: + return jjMoveStringLiteralDfa2_0(active0, 0x600100c000ULL, active1, 0xc000000000ULL, active2, 0L); + case 77: + return jjMoveStringLiteralDfa2_0(active0, 0x10000000000000ULL, active1, 0x20000000000000ULL, active2, 0L); + case 78: + if ((active0 & 0x20000000000000ULL) != 0L) + { + jjmatchedKind = 53; + jjmatchedPos = 1; + } + else if ((active1 & 0x80ULL) != 0L) + { + jjmatchedKind = 71; + jjmatchedPos = 1; + } + return jjMoveStringLiteralDfa2_0(active0, 0xc0018000010000ULL, active1, 0x2007000000000000ULL, active2, 0L); + case 79: + if ((active1 & 0x200000000000ULL) != 0L) + { + jjmatchedKind = 109; + jjmatchedPos = 1; + } + return jjMoveStringLiteralDfa2_0(active0, 0xa0003013d2000000ULL, active1, 0x10000000c000c018ULL, active2, 0L); + case 80: + return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x40000000000100ULL, active2, 0L); + case 82: + if ((active1 & 0x200ULL) != 0L) + { + jjmatchedKind = 73; + jjmatchedPos = 1; + } + return jjMoveStringLiteralDfa2_0(active0, 0x2000000060000ULL, active1, 0x4300000f0000ULL, active2, 0L); + case 83: + if ((active0 & 0x100000000000000ULL) != 0L) + { + jjmatchedKind = 56; + jjmatchedPos = 1; + } + return jjMoveStringLiteralDfa2_0(active0, 0x380000ULL, active1, 0x8000000000000ULL, active2, 0L); + case 84: + return jjMoveStringLiteralDfa2_0(active0, 0x400000ULL, active1, 0x40000000400ULL, active2, 0L); + case 85: + return jjMoveStringLiteralDfa2_0(active0, 0x440000c000000ULL, active1, 0x80080000100820ULL, active2, 0L); + case 88: + return jjMoveStringLiteralDfa2_0(active0, 0x20000000000ULL, active1, 0L, active2, 0L); + case 89: + return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x800000000000ULL, active2, 0L); + case 97: + return jjMoveStringLiteralDfa2_0(active0, 0x4200040020000000ULL, active1, 0x110000000203001ULL, active2, 0L); + case 98: + return jjMoveStringLiteralDfa2_0(active0, 0x800ULL, active1, 0L, active2, 0L); + case 99: + return jjMoveStringLiteralDfa2_0(active0, 0x1000ULL, active1, 0L, active2, 0L); + case 101: + return jjMoveStringLiteralDfa2_0(active0, 0x1800400800000ULL, active1, 0xf3fc00006ULL, active2, 0L); + case 102: + if ((active0 & 0x8000000000000ULL) != 0L) + { + jjmatchedKind = 51; + jjmatchedPos = 1; + } + else if ((active1 & 0x40ULL) != 0L) + { + jjmatchedKind = 70; + jjmatchedPos = 1; + } + return jjMoveStringLiteralDfa2_0(active0, 0x2000ULL, active1, 0L, active2, 0L); + case 104: + return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x600102000000000ULL, active2, 0L); + case 105: + return jjMoveStringLiteralDfa2_0(active0, 0x1c00080800000000ULL, active1, 0x800001000000000ULL, active2, 0L); + case 108: + return jjMoveStringLiteralDfa2_0(active0, 0x600100c000ULL, active1, 0xc000000000ULL, active2, 0L); + case 109: + return jjMoveStringLiteralDfa2_0(active0, 0x10000000000000ULL, active1, 0x20000000000000ULL, active2, 0L); + case 110: + if ((active0 & 0x20000000000000ULL) != 0L) + { + jjmatchedKind = 53; + jjmatchedPos = 1; + } + else if ((active1 & 0x80ULL) != 0L) + { + jjmatchedKind = 71; + jjmatchedPos = 1; + } + return jjMoveStringLiteralDfa2_0(active0, 0xc0018000010000ULL, active1, 0x2007000000000000ULL, active2, 0L); + case 111: + if ((active1 & 0x200000000000ULL) != 0L) + { + jjmatchedKind = 109; + jjmatchedPos = 1; + } + return jjMoveStringLiteralDfa2_0(active0, 0xa0003013d2000000ULL, active1, 0x10000000c000c018ULL, active2, 0L); + case 112: + return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x40000000000100ULL, active2, 0L); + case 114: + if ((active1 & 0x200ULL) != 0L) + { + jjmatchedKind = 73; + jjmatchedPos = 1; + } + return jjMoveStringLiteralDfa2_0(active0, 0x2000000060000ULL, active1, 0x4300000f0000ULL, active2, 0L); + case 115: + if ((active0 & 0x100000000000000ULL) != 0L) + { + jjmatchedKind = 56; + jjmatchedPos = 1; + } + return jjMoveStringLiteralDfa2_0(active0, 0x380000ULL, active1, 0x8000000000000ULL, active2, 0L); + case 116: + return jjMoveStringLiteralDfa2_0(active0, 0x400000ULL, active1, 0x40000000400ULL, active2, 0L); + case 117: + return jjMoveStringLiteralDfa2_0(active0, 0x440000c000000ULL, active1, 0x80080000100820ULL, active2, 0L); + case 120: + return jjMoveStringLiteralDfa2_0(active0, 0x20000000000ULL, active1, 0L, active2, 0L); + case 121: + return jjMoveStringLiteralDfa2_0(active0, 0L, active1, 0x800000000000ULL, active2, 0L); + default : + break; + } + return jjMoveNfa_0(11, 1); +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa2_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1, unsigned long long old2, unsigned long long active2){ + if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L) + return jjMoveNfa_0(11, 1); + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 1); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 61: + if ((active2 & 0x200000ULL) != 0L) + { + jjmatchedKind = 149; + jjmatchedPos = 2; + } + else if ((active2 & 0x400000ULL) != 0L) + { + jjmatchedKind = 150; + jjmatchedPos = 2; + } + else if ((active2 & 0x4000000ULL) != 0L) + { + jjmatchedKind = 154; + jjmatchedPos = 2; + } + break; + case 65: + if ((active1 & 0x4000000000ULL) != 0L) + { + jjmatchedKind = 102; + jjmatchedPos = 2; + } + else if ((active1 & 0x10000000000ULL) != 0L) + { + jjmatchedKind = 104; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000ULL, active1, 0x1402000000000ULL, active2, 0L); + case 66: + return jjMoveStringLiteralDfa3_0(active0, 0x600000000000000ULL, active1, 0x80000000000ULL, active2, 0L); + case 67: + return jjMoveStringLiteralDfa3_0(active0, 0x21000ULL, active1, 0x401000ULL, active2, 0L); + case 68: + if ((active0 & 0x10000ULL) != 0L) + { + jjmatchedKind = 16; + jjmatchedPos = 2; + } + else if ((active0 & 0x8000000000ULL) != 0L) + { + jjmatchedKind = 39; + jjmatchedPos = 2; + } + else if ((active0 & 0x8000000000000000ULL) != 0L) + { + jjmatchedKind = 63; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x2000000ULL, active1, 0L, active2, 0L); + case 69: + if ((active1 & 0x8000000000000ULL) != 0L) + { + jjmatchedKind = 115; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x40000000000000ULL, active1, 0x200100000000100ULL, active2, 0L); + case 70: + return jjMoveStringLiteralDfa3_0(active0, 0x404000000ULL, active1, 0L, active2, 0L); + case 71: + return jjMoveStringLiteralDfa3_0(active0, 0x800000ULL, active1, 0x1000800000ULL, active2, 0L); + case 72: + return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x400ULL, active2, 0L); + case 73: + return jjMoveStringLiteralDfa3_0(active0, 0x60000004000ULL, active1, 0x502000000000000ULL, active2, 0L); + case 74: + return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x1000000ULL, active2, 0L); + case 76: + if ((active0 & 0x8000ULL) != 0L) + { + jjmatchedKind = 15; + jjmatchedPos = 2; + } + else if ((active1 & 0x40000000ULL) != 0L) + { + jjmatchedKind = 94; + jjmatchedPos = 2; + } + else if ((active1 & 0x8000000000ULL) != 0L) + { + jjmatchedKind = 103; + jjmatchedPos = 2; + } + else if ((active1 & 0x20000000000ULL) != 0L) + { + jjmatchedKind = 105; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x80000000000ULL, active1, 0x202000020ULL, active2, 0L); + case 77: + if ((active1 & 0x10000000ULL) != 0L) + { + jjmatchedKind = 92; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x10000000ULL, active1, 0L, active2, 0L); + case 78: + return jjMoveStringLiteralDfa3_0(active0, 0x801c001c0000000ULL, active1, 0x80000000200001ULL, active2, 0L); + case 79: + return jjMoveStringLiteralDfa3_0(active0, 0x2082000001000000ULL, active1, 0x20200000000f0000ULL, active2, 0L); + case 80: + if ((active0 & 0x4000000000000000ULL) != 0L) + { + jjmatchedKind = 62; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x10000000000000ULL, active1, 0x800020000000ULL, active2, 0L); + case 81: + return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x400000000ULL, active2, 0L); + case 82: + if ((active0 & 0x100000000000ULL) != 0L) + { + jjmatchedKind = 44; + jjmatchedPos = 2; + } + else if ((active1 & 0x8ULL) != 0L) + { + jjmatchedKind = 67; + jjmatchedPos = 2; + } + else if ((active1 & 0x80000000ULL) != 0L) + { + jjmatchedKind = 95; + jjmatchedPos = 2; + } + else if ((active1 & 0x1000000000000000ULL) != 0L) + { + jjmatchedKind = 124; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x200000040000ULL, active1, 0x50040000106000ULL, active2, 0L); + case 83: + if ((active0 & 0x800ULL) != 0L) + { + jjmatchedKind = 11; + jjmatchedPos = 2; + } + else if ((active0 & 0x8000000ULL) != 0L) + { + jjmatchedKind = 27; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x6820380000ULL, active1, 0xc008000ULL, active2, 0L); + case 84: + if ((active1 & 0x10ULL) != 0L) + { + jjmatchedKind = 68; + jjmatchedPos = 2; + } + else if ((active1 & 0x800ULL) != 0L) + { + jjmatchedKind = 75; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x1000010000402000ULL, active1, 0x804000100000000ULL, active2, 0L); + case 86: + return jjMoveStringLiteralDfa3_0(active0, 0x200000000ULL, active1, 0x800000000ULL, active2, 0L); + case 87: + if ((active1 & 0x2ULL) != 0L) + { + jjmatchedKind = 65; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x1000000000ULL, active1, 0L, active2, 0L); + case 88: + return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x4ULL, active2, 0L); + case 97: + if ((active1 & 0x4000000000ULL) != 0L) + { + jjmatchedKind = 102; + jjmatchedPos = 2; + } + else if ((active1 & 0x10000000000ULL) != 0L) + { + jjmatchedKind = 104; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x4000000000000ULL, active1, 0x1402000000000ULL, active2, 0L); + case 98: + return jjMoveStringLiteralDfa3_0(active0, 0x600000000000000ULL, active1, 0x80000000000ULL, active2, 0L); + case 99: + return jjMoveStringLiteralDfa3_0(active0, 0x21000ULL, active1, 0x401000ULL, active2, 0L); + case 100: + if ((active0 & 0x10000ULL) != 0L) + { + jjmatchedKind = 16; + jjmatchedPos = 2; + } + else if ((active0 & 0x8000000000ULL) != 0L) + { + jjmatchedKind = 39; + jjmatchedPos = 2; + } + else if ((active0 & 0x8000000000000000ULL) != 0L) + { + jjmatchedKind = 63; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x2000000ULL, active1, 0L, active2, 0L); + case 101: + if ((active1 & 0x8000000000000ULL) != 0L) + { + jjmatchedKind = 115; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x40000000000000ULL, active1, 0x200100000000100ULL, active2, 0L); + case 102: + return jjMoveStringLiteralDfa3_0(active0, 0x404000000ULL, active1, 0L, active2, 0L); + case 103: + return jjMoveStringLiteralDfa3_0(active0, 0x800000ULL, active1, 0x1000800000ULL, active2, 0L); + case 104: + return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x400ULL, active2, 0L); + case 105: + return jjMoveStringLiteralDfa3_0(active0, 0x60000004000ULL, active1, 0x502000000000000ULL, active2, 0L); + case 106: + return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x1000000ULL, active2, 0L); + case 108: + if ((active0 & 0x8000ULL) != 0L) + { + jjmatchedKind = 15; + jjmatchedPos = 2; + } + else if ((active1 & 0x40000000ULL) != 0L) + { + jjmatchedKind = 94; + jjmatchedPos = 2; + } + else if ((active1 & 0x8000000000ULL) != 0L) + { + jjmatchedKind = 103; + jjmatchedPos = 2; + } + else if ((active1 & 0x20000000000ULL) != 0L) + { + jjmatchedKind = 105; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x80000000000ULL, active1, 0x202000020ULL, active2, 0L); + case 109: + if ((active1 & 0x10000000ULL) != 0L) + { + jjmatchedKind = 92; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x10000000ULL, active1, 0L, active2, 0L); + case 110: + return jjMoveStringLiteralDfa3_0(active0, 0x801c001c0000000ULL, active1, 0x80000000200001ULL, active2, 0L); + case 111: + return jjMoveStringLiteralDfa3_0(active0, 0x2082000001000000ULL, active1, 0x20200000000f0000ULL, active2, 0L); + case 112: + if ((active0 & 0x4000000000000000ULL) != 0L) + { + jjmatchedKind = 62; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x10000000000000ULL, active1, 0x800020000000ULL, active2, 0L); + case 113: + return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x400000000ULL, active2, 0L); + case 114: + if ((active0 & 0x100000000000ULL) != 0L) + { + jjmatchedKind = 44; + jjmatchedPos = 2; + } + else if ((active1 & 0x8ULL) != 0L) + { + jjmatchedKind = 67; + jjmatchedPos = 2; + } + else if ((active1 & 0x80000000ULL) != 0L) + { + jjmatchedKind = 95; + jjmatchedPos = 2; + } + else if ((active1 & 0x1000000000000000ULL) != 0L) + { + jjmatchedKind = 124; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x200000040000ULL, active1, 0x50040000106000ULL, active2, 0L); + case 115: + if ((active0 & 0x800ULL) != 0L) + { + jjmatchedKind = 11; + jjmatchedPos = 2; + } + else if ((active0 & 0x8000000ULL) != 0L) + { + jjmatchedKind = 27; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x6820380000ULL, active1, 0xc008000ULL, active2, 0L); + case 116: + if ((active1 & 0x10ULL) != 0L) + { + jjmatchedKind = 68; + jjmatchedPos = 2; + } + else if ((active1 & 0x800ULL) != 0L) + { + jjmatchedKind = 75; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x1000010000402000ULL, active1, 0x804000100000000ULL, active2, 0L); + case 118: + return jjMoveStringLiteralDfa3_0(active0, 0x200000000ULL, active1, 0x800000000ULL, active2, 0L); + case 119: + if ((active1 & 0x2ULL) != 0L) + { + jjmatchedKind = 65; + jjmatchedPos = 2; + } + return jjMoveStringLiteralDfa3_0(active0, 0x1000000000ULL, active1, 0L, active2, 0L); + case 120: + return jjMoveStringLiteralDfa3_0(active0, 0L, active1, 0x4ULL, active2, 0L); + default : + break; + } + return jjMoveNfa_0(11, 2); +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa3_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1, unsigned long long old2, unsigned long long active2){ + if (((active0 &= old0) | (active1 &= old1) | (active2 &= old2)) == 0L) + return jjMoveNfa_0(11, 2); + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 2); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 65: + return jjMoveStringLiteralDfa4_0(active0, 0x400044000ULL, active1, 0x2000ULL); + case 67: + return jjMoveStringLiteralDfa4_0(active0, 0x600801000000ULL, active1, 0x30000ULL); + case 68: + if ((active1 & 0x1ULL) != 0L) + { + jjmatchedKind = 64; + jjmatchedPos = 3; + } + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x20000000000000ULL); + case 69: + if ((active0 & 0x20000000ULL) != 0L) + { + jjmatchedKind = 29; + jjmatchedPos = 3; + } + else if ((active0 & 0x2000000000ULL) != 0L) + { + jjmatchedKind = 37; + jjmatchedPos = 3; + } + else if ((active0 & 0x80000000000ULL) != 0L) + { + jjmatchedKind = 43; + jjmatchedPos = 3; + } + else if ((active1 & 0x100000ULL) != 0L) + { + jjmatchedKind = 84; + jjmatchedPos = 3; + } + else if ((active1 & 0x800000000000ULL) != 0L) + { + jjmatchedKind = 111; + jjmatchedPos = 3; + } + return jjMoveStringLiteralDfa4_0(active0, 0x1201800200083000ULL, active1, 0xa03000400ULL); + case 70: + return jjMoveStringLiteralDfa4_0(active0, 0x44000000ULL, active1, 0x1000000000000ULL); + case 71: + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x200000ULL); + case 72: + if ((active1 & 0x800000000000000ULL) != 0L) + { + jjmatchedKind = 123; + jjmatchedPos = 3; + } + return jjMoveStringLiteralDfa4_0(active0, 0x20000ULL, active1, 0L); + case 73: + return jjMoveStringLiteralDfa4_0(active0, 0x14000800000ULL, active1, 0x94000000800000ULL); + case 75: + return jjMoveStringLiteralDfa4_0(active0, 0x800000000000000ULL, active1, 0x1000ULL); + case 76: + if ((active1 & 0x20ULL) != 0L) + { + jjmatchedKind = 69; + jjmatchedPos = 3; + } + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x400000000000000ULL); + case 78: + if ((active1 & 0x100ULL) != 0L) + { + jjmatchedKind = 72; + jjmatchedPos = 3; + } + else if ((active1 & 0x100000000000ULL) != 0L) + { + jjmatchedKind = 108; + jjmatchedPos = 3; + } + else if ((active1 & 0x200000000000000ULL) != 0L) + { + jjmatchedKind = 121; + jjmatchedPos = 3; + } + return jjMoveStringLiteralDfa4_0(active0, 0x1000000000ULL, active1, 0x401000000000ULL); + case 79: + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x40040020400000ULL); + case 80: + if ((active0 & 0x2000000000000000ULL) != 0L) + { + jjmatchedKind = 61; + jjmatchedPos = 3; + } + return jjMoveStringLiteralDfa4_0(active0, 0x10000000ULL, active1, 0x40000ULL); + case 82: + if ((active1 & 0x2000000000000000ULL) != 0L) + { + jjmatchedKind = 125; + jjmatchedPos = 3; + } + return jjMoveStringLiteralDfa4_0(active0, 0x444040000400000ULL, active1, 0x2000000000ULL); + case 83: + return jjMoveStringLiteralDfa4_0(active0, 0x80000000ULL, active1, 0L); + case 84: + if ((active0 & 0x20000000000ULL) != 0L) + { + jjmatchedKind = 41; + jjmatchedPos = 3; + } + else if ((active1 & 0x4ULL) != 0L) + { + jjmatchedKind = 66; + jjmatchedPos = 3; + } + else if ((active1 & 0x4000ULL) != 0L) + { + jjmatchedKind = 78; + jjmatchedPos = 3; + } + else if ((active1 & 0x100000000000000ULL) != 0L) + { + jjmatchedKind = 120; + jjmatchedPos = 3; + } + return jjMoveStringLiteralDfa4_0(active0, 0x100000000ULL, active1, 0x208000c088000ULL); + case 85: + return jjMoveStringLiteralDfa4_0(active0, 0x92000000300000ULL, active1, 0x500000000ULL); + case 89: + if ((active0 & 0x2000000ULL) != 0L) + { + jjmatchedKind = 25; + jjmatchedPos = 3; + } + break; + case 97: + return jjMoveStringLiteralDfa4_0(active0, 0x400044000ULL, active1, 0x2000ULL); + case 99: + return jjMoveStringLiteralDfa4_0(active0, 0x600801000000ULL, active1, 0x30000ULL); + case 100: + if ((active1 & 0x1ULL) != 0L) + { + jjmatchedKind = 64; + jjmatchedPos = 3; + } + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x20000000000000ULL); + case 101: + if ((active0 & 0x20000000ULL) != 0L) + { + jjmatchedKind = 29; + jjmatchedPos = 3; + } + else if ((active0 & 0x2000000000ULL) != 0L) + { + jjmatchedKind = 37; + jjmatchedPos = 3; + } + else if ((active0 & 0x80000000000ULL) != 0L) + { + jjmatchedKind = 43; + jjmatchedPos = 3; + } + else if ((active1 & 0x100000ULL) != 0L) + { + jjmatchedKind = 84; + jjmatchedPos = 3; + } + else if ((active1 & 0x800000000000ULL) != 0L) + { + jjmatchedKind = 111; + jjmatchedPos = 3; + } + return jjMoveStringLiteralDfa4_0(active0, 0x1201800200083000ULL, active1, 0xa03000400ULL); + case 102: + return jjMoveStringLiteralDfa4_0(active0, 0x44000000ULL, active1, 0x1000000000000ULL); + case 103: + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x200000ULL); + case 104: + if ((active1 & 0x800000000000000ULL) != 0L) + { + jjmatchedKind = 123; + jjmatchedPos = 3; + } + return jjMoveStringLiteralDfa4_0(active0, 0x20000ULL, active1, 0L); + case 105: + return jjMoveStringLiteralDfa4_0(active0, 0x14000800000ULL, active1, 0x94000000800000ULL); + case 107: + return jjMoveStringLiteralDfa4_0(active0, 0x800000000000000ULL, active1, 0x1000ULL); + case 108: + if ((active1 & 0x20ULL) != 0L) + { + jjmatchedKind = 69; + jjmatchedPos = 3; + } + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x400000000000000ULL); + case 110: + if ((active1 & 0x100ULL) != 0L) + { + jjmatchedKind = 72; + jjmatchedPos = 3; + } + else if ((active1 & 0x100000000000ULL) != 0L) + { + jjmatchedKind = 108; + jjmatchedPos = 3; + } + else if ((active1 & 0x200000000000000ULL) != 0L) + { + jjmatchedKind = 121; + jjmatchedPos = 3; + } + return jjMoveStringLiteralDfa4_0(active0, 0x1000000000ULL, active1, 0x401000000000ULL); + case 111: + return jjMoveStringLiteralDfa4_0(active0, 0L, active1, 0x40040020400000ULL); + case 112: + if ((active0 & 0x2000000000000000ULL) != 0L) + { + jjmatchedKind = 61; + jjmatchedPos = 3; + } + return jjMoveStringLiteralDfa4_0(active0, 0x10000000ULL, active1, 0x40000ULL); + case 114: + if ((active1 & 0x2000000000000000ULL) != 0L) + { + jjmatchedKind = 125; + jjmatchedPos = 3; + } + return jjMoveStringLiteralDfa4_0(active0, 0x444040000400000ULL, active1, 0x2000000000ULL); + case 115: + return jjMoveStringLiteralDfa4_0(active0, 0x80000000ULL, active1, 0L); + case 116: + if ((active0 & 0x20000000000ULL) != 0L) + { + jjmatchedKind = 41; + jjmatchedPos = 3; + } + else if ((active1 & 0x4ULL) != 0L) + { + jjmatchedKind = 66; + jjmatchedPos = 3; + } + else if ((active1 & 0x4000ULL) != 0L) + { + jjmatchedKind = 78; + jjmatchedPos = 3; + } + else if ((active1 & 0x100000000000000ULL) != 0L) + { + jjmatchedKind = 120; + jjmatchedPos = 3; + } + return jjMoveStringLiteralDfa4_0(active0, 0x100000000ULL, active1, 0x208000c088000ULL); + case 117: + return jjMoveStringLiteralDfa4_0(active0, 0x92000000300000ULL, active1, 0x500000000ULL); + case 121: + if ((active0 & 0x2000000ULL) != 0L) + { + jjmatchedKind = 25; + jjmatchedPos = 3; + } + break; + default : + break; + } + return jjMoveNfa_0(11, 3); +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa4_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1){ + if (((active0 &= old0) | (active1 &= old1)) == 0L) + return jjMoveNfa_0(11, 3); + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 3); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 65: + return jjMoveStringLiteralDfa5_0(active0, 0xc00000000000000ULL, active1, 0x10001002001000ULL); + case 67: + return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x201000000ULL); + case 68: + return jjMoveStringLiteralDfa5_0(active0, 0x4000000000000ULL, active1, 0L); + case 69: + if ((active0 & 0x200000000000ULL) != 0L) + { + jjmatchedKind = 45; + jjmatchedPos = 4; + } + else if ((active1 & 0x200000ULL) != 0L) + { + jjmatchedKind = 85; + jjmatchedPos = 4; + } + else if ((active1 & 0x20000000000000ULL) != 0L) + { + jjmatchedKind = 117; + jjmatchedPos = 4; + } + else if ((active1 & 0x400000000000000ULL) != 0L) + { + jjmatchedKind = 122; + jjmatchedPos = 4; + } + return jjMoveStringLiteralDfa5_0(active0, 0x104000000ULL, active1, 0x24000f0000ULL); + case 70: + if ((active0 & 0x4000000000ULL) != 0L) + { + jjmatchedKind = 38; + jjmatchedPos = 4; + } + return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x1000000000000ULL); + case 73: + return jjMoveStringLiteralDfa5_0(active0, 0x40420000ULL, active1, 0L); + case 75: + if ((active0 & 0x1000000ULL) != 0L) + { + jjmatchedKind = 24; + jjmatchedPos = 4; + } + break; + case 76: + if ((active0 & 0x200000000000000ULL) != 0L) + { + jjmatchedKind = 57; + jjmatchedPos = 4; + } + else if ((active1 & 0x4000000000000ULL) != 0L) + { + jjmatchedKind = 114; + jjmatchedPos = 4; + } + break; + case 77: + return jjMoveStringLiteralDfa5_0(active0, 0x300000ULL, active1, 0x2000ULL); + case 78: + if ((active0 & 0x800000ULL) != 0L) + { + jjmatchedKind = 23; + jjmatchedPos = 4; + } + return jjMoveStringLiteralDfa5_0(active0, 0x40000000000ULL, active1, 0x40000000000ULL); + case 79: + return jjMoveStringLiteralDfa5_0(active0, 0x810000000ULL, active1, 0L); + case 80: + if ((active0 & 0x2000000000000ULL) != 0L) + { + jjmatchedKind = 49; + jjmatchedPos = 4; + } + else if ((active1 & 0x40000000000000ULL) != 0L) + { + jjmatchedKind = 118; + jjmatchedPos = 4; + } + return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x8000ULL); + case 82: + if ((active0 & 0x2000ULL) != 0L) + { + jjmatchedKind = 13; + jjmatchedPos = 4; + } + else if ((active0 & 0x200000000ULL) != 0L) + { + jjmatchedKind = 33; + jjmatchedPos = 4; + } + return jjMoveStringLiteralDfa5_0(active0, 0x1011800000080000ULL, active1, 0x92c400400ULL); + case 83: + if ((active0 & 0x4000ULL) != 0L) + { + jjmatchedKind = 14; + jjmatchedPos = 4; + } + else if ((active1 & 0x2000000000000ULL) != 0L) + { + jjmatchedKind = 113; + jjmatchedPos = 4; + } + return jjMoveStringLiteralDfa5_0(active0, 0x1000ULL, active1, 0x400000800000ULL); + case 84: + if ((active0 & 0x80000000000000ULL) != 0L) + { + jjmatchedKind = 55; + jjmatchedPos = 4; + } + else if ((active1 & 0x80000000000000ULL) != 0L) + { + jjmatchedKind = 119; + jjmatchedPos = 4; + } + return jjMoveStringLiteralDfa5_0(active0, 0x40411080000000ULL, active1, 0L); + case 85: + return jjMoveStringLiteralDfa5_0(active0, 0x400000000ULL, active1, 0L); + case 89: + if ((active0 & 0x40000ULL) != 0L) + { + jjmatchedKind = 18; + jjmatchedPos = 4; + } + return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x80000000000ULL); + case 97: + return jjMoveStringLiteralDfa5_0(active0, 0xc00000000000000ULL, active1, 0x10001002001000ULL); + case 99: + return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x201000000ULL); + case 100: + return jjMoveStringLiteralDfa5_0(active0, 0x4000000000000ULL, active1, 0L); + case 101: + if ((active0 & 0x200000000000ULL) != 0L) + { + jjmatchedKind = 45; + jjmatchedPos = 4; + } + else if ((active1 & 0x200000ULL) != 0L) + { + jjmatchedKind = 85; + jjmatchedPos = 4; + } + else if ((active1 & 0x20000000000000ULL) != 0L) + { + jjmatchedKind = 117; + jjmatchedPos = 4; + } + else if ((active1 & 0x400000000000000ULL) != 0L) + { + jjmatchedKind = 122; + jjmatchedPos = 4; + } + return jjMoveStringLiteralDfa5_0(active0, 0x104000000ULL, active1, 0x24000f0000ULL); + case 102: + if ((active0 & 0x4000000000ULL) != 0L) + { + jjmatchedKind = 38; + jjmatchedPos = 4; + } + return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x1000000000000ULL); + case 105: + return jjMoveStringLiteralDfa5_0(active0, 0x40420000ULL, active1, 0L); + case 107: + if ((active0 & 0x1000000ULL) != 0L) + { + jjmatchedKind = 24; + jjmatchedPos = 4; + } + break; + case 108: + if ((active0 & 0x200000000000000ULL) != 0L) + { + jjmatchedKind = 57; + jjmatchedPos = 4; + } + else if ((active1 & 0x4000000000000ULL) != 0L) + { + jjmatchedKind = 114; + jjmatchedPos = 4; + } + break; + case 109: + return jjMoveStringLiteralDfa5_0(active0, 0x300000ULL, active1, 0x2000ULL); + case 110: + if ((active0 & 0x800000ULL) != 0L) + { + jjmatchedKind = 23; + jjmatchedPos = 4; + } + return jjMoveStringLiteralDfa5_0(active0, 0x40000000000ULL, active1, 0x40000000000ULL); + case 111: + return jjMoveStringLiteralDfa5_0(active0, 0x810000000ULL, active1, 0L); + case 112: + if ((active0 & 0x2000000000000ULL) != 0L) + { + jjmatchedKind = 49; + jjmatchedPos = 4; + } + else if ((active1 & 0x40000000000000ULL) != 0L) + { + jjmatchedKind = 118; + jjmatchedPos = 4; + } + return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x8000ULL); + case 114: + if ((active0 & 0x2000ULL) != 0L) + { + jjmatchedKind = 13; + jjmatchedPos = 4; + } + else if ((active0 & 0x200000000ULL) != 0L) + { + jjmatchedKind = 33; + jjmatchedPos = 4; + } + return jjMoveStringLiteralDfa5_0(active0, 0x1011800000080000ULL, active1, 0x92c400400ULL); + case 115: + if ((active0 & 0x4000ULL) != 0L) + { + jjmatchedKind = 14; + jjmatchedPos = 4; + } + else if ((active1 & 0x2000000000000ULL) != 0L) + { + jjmatchedKind = 113; + jjmatchedPos = 4; + } + return jjMoveStringLiteralDfa5_0(active0, 0x1000ULL, active1, 0x400000800000ULL); + case 116: + if ((active0 & 0x80000000000000ULL) != 0L) + { + jjmatchedKind = 55; + jjmatchedPos = 4; + } + else if ((active1 & 0x80000000000000ULL) != 0L) + { + jjmatchedKind = 119; + jjmatchedPos = 4; + } + return jjMoveStringLiteralDfa5_0(active0, 0x40411080000000ULL, active1, 0L); + case 117: + return jjMoveStringLiteralDfa5_0(active0, 0x400000000ULL, active1, 0L); + case 121: + if ((active0 & 0x40000ULL) != 0L) + { + jjmatchedKind = 18; + jjmatchedPos = 4; + } + return jjMoveStringLiteralDfa5_0(active0, 0L, active1, 0x80000000000ULL); + default : + break; + } + return jjMoveNfa_0(11, 4); +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa5_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1){ + if (((active0 &= old0) | (active1 &= old1)) == 0L) + return jjMoveNfa_0(11, 4); + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 4); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 65: + return jjMoveStringLiteralDfa6_0(active0, 0x1000800080000000ULL, active1, 0L); + case 66: + return jjMoveStringLiteralDfa6_0(active0, 0x400000ULL, active1, 0x10000000000000ULL); + case 67: + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x80000ULL); + case 68: + if ((active1 & 0x400000ULL) != 0L) + { + jjmatchedKind = 86; + jjmatchedPos = 5; + } + else if ((active1 & 0x2000000000ULL) != 0L) + { + jjmatchedKind = 101; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x10000ULL); + case 69: + if ((active0 & 0x100000ULL) != 0L) + { + jjmatchedKind = 20; + jjmatchedPos = 5; + } + else if ((active0 & 0x10000000000000ULL) != 0L) + { + jjmatchedKind = 52; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0x4040000200000ULL, active1, 0x1000000002000ULL); + case 71: + if ((active1 & 0x40000000000ULL) != 0L) + { + jjmatchedKind = 106; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0x800000040000000ULL, active1, 0x1000ULL); + case 73: + return jjMoveStringLiteralDfa6_0(active0, 0x41400000000000ULL, active1, 0x80c000000ULL); + case 76: + if ((active1 & 0x1000000000ULL) != 0L) + { + jjmatchedKind = 100; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0x400000000ULL, active1, 0L); + case 78: + if ((active1 & 0x100000000ULL) != 0L) + { + jjmatchedKind = 96; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0x810000000ULL, active1, 0x400000000ULL); + case 79: + if ((active0 & 0x1000000000ULL) != 0L) + { + jjmatchedKind = 36; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x8000ULL); + case 80: + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x480000000000ULL); + case 82: + if ((active0 & 0x4000000ULL) != 0L) + { + jjmatchedKind = 26; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0x400000000000000ULL, active1, 0x40000ULL); + case 83: + if ((active0 & 0x1000ULL) != 0L) + { + jjmatchedKind = 12; + jjmatchedPos = 5; + } + else if ((active1 & 0x400ULL) != 0L) + { + jjmatchedKind = 74; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2020000ULL); + case 84: + if ((active0 & 0x80000ULL) != 0L) + { + jjmatchedKind = 19; + jjmatchedPos = 5; + } + else if ((active1 & 0x1000000ULL) != 0L) + { + jjmatchedKind = 88; + jjmatchedPos = 5; + } + else if ((active1 & 0x20000000ULL) != 0L) + { + jjmatchedKind = 93; + jjmatchedPos = 5; + } + else if ((active1 & 0x200000000ULL) != 0L) + { + jjmatchedKind = 97; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0x20000ULL, active1, 0x800000ULL); + case 88: + return jjMoveStringLiteralDfa6_0(active0, 0x100000000ULL, active1, 0L); + case 89: + if ((active0 & 0x10000000000ULL) != 0L) + { + jjmatchedKind = 40; + jjmatchedPos = 5; + } + break; + case 97: + return jjMoveStringLiteralDfa6_0(active0, 0x1000800080000000ULL, active1, 0L); + case 98: + return jjMoveStringLiteralDfa6_0(active0, 0x400000ULL, active1, 0x10000000000000ULL); + case 99: + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x80000ULL); + case 100: + if ((active1 & 0x400000ULL) != 0L) + { + jjmatchedKind = 86; + jjmatchedPos = 5; + } + else if ((active1 & 0x2000000000ULL) != 0L) + { + jjmatchedKind = 101; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x10000ULL); + case 101: + if ((active0 & 0x100000ULL) != 0L) + { + jjmatchedKind = 20; + jjmatchedPos = 5; + } + else if ((active0 & 0x10000000000000ULL) != 0L) + { + jjmatchedKind = 52; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0x4040000200000ULL, active1, 0x1000000002000ULL); + case 103: + if ((active1 & 0x40000000000ULL) != 0L) + { + jjmatchedKind = 106; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0x800000040000000ULL, active1, 0x1000ULL); + case 105: + return jjMoveStringLiteralDfa6_0(active0, 0x41400000000000ULL, active1, 0x80c000000ULL); + case 108: + if ((active1 & 0x1000000000ULL) != 0L) + { + jjmatchedKind = 100; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0x400000000ULL, active1, 0L); + case 110: + if ((active1 & 0x100000000ULL) != 0L) + { + jjmatchedKind = 96; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0x810000000ULL, active1, 0x400000000ULL); + case 111: + if ((active0 & 0x1000000000ULL) != 0L) + { + jjmatchedKind = 36; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x8000ULL); + case 112: + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x480000000000ULL); + case 114: + if ((active0 & 0x4000000ULL) != 0L) + { + jjmatchedKind = 26; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0x400000000000000ULL, active1, 0x40000ULL); + case 115: + if ((active0 & 0x1000ULL) != 0L) + { + jjmatchedKind = 12; + jjmatchedPos = 5; + } + else if ((active1 & 0x400ULL) != 0L) + { + jjmatchedKind = 74; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0L, active1, 0x2020000ULL); + case 116: + if ((active0 & 0x80000ULL) != 0L) + { + jjmatchedKind = 19; + jjmatchedPos = 5; + } + else if ((active1 & 0x1000000ULL) != 0L) + { + jjmatchedKind = 88; + jjmatchedPos = 5; + } + else if ((active1 & 0x20000000ULL) != 0L) + { + jjmatchedKind = 93; + jjmatchedPos = 5; + } + else if ((active1 & 0x200000000ULL) != 0L) + { + jjmatchedKind = 97; + jjmatchedPos = 5; + } + return jjMoveStringLiteralDfa6_0(active0, 0x20000ULL, active1, 0x800000ULL); + case 120: + return jjMoveStringLiteralDfa6_0(active0, 0x100000000ULL, active1, 0L); + case 121: + if ((active0 & 0x10000000000ULL) != 0L) + { + jjmatchedKind = 40; + jjmatchedPos = 5; + } + break; + default : + break; + } + return jjMoveNfa_0(11, 5); +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa6_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1){ + if (((active0 &= old0) | (active1 &= old1)) == 0L) + return jjMoveNfa_0(11, 5); + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 5); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 65: + return jjMoveStringLiteralDfa7_0(active0, 0x40000000000000ULL, active1, 0L); + case 67: + if ((active0 & 0x1000000000000ULL) != 0L) + { + jjmatchedKind = 48; + jjmatchedPos = 6; + } + return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x100040c000000ULL); + case 68: + if ((active0 & 0x4000000000000ULL) != 0L) + { + jjmatchedKind = 50; + jjmatchedPos = 6; + } + break; + case 69: + if ((active0 & 0x800000000000000ULL) != 0L) + { + jjmatchedKind = 59; + jjmatchedPos = 6; + } + else if ((active1 & 0x1000ULL) != 0L) + { + jjmatchedKind = 76; + jjmatchedPos = 6; + } + else if ((active1 & 0x2000000ULL) != 0L) + { + jjmatchedKind = 89; + jjmatchedPos = 6; + } + else if ((active1 & 0x80000000000ULL) != 0L) + { + jjmatchedKind = 107; + jjmatchedPos = 6; + } + return jjMoveStringLiteralDfa7_0(active0, 0x10020000ULL, active1, 0x800000ULL); + case 76: + if ((active0 & 0x1000000000000000ULL) != 0L) + { + jjmatchedKind = 60; + jjmatchedPos = 6; + } + return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000000000000ULL); + case 78: + return jjMoveStringLiteralDfa7_0(active0, 0x880000000ULL, active1, 0x8000ULL); + case 79: + return jjMoveStringLiteralDfa7_0(active0, 0x400000000000ULL, active1, 0x400000000000ULL); + case 83: + if ((active1 & 0x20000ULL) != 0L) + { + jjmatchedKind = 81; + jjmatchedPos = 6; + } + return jjMoveStringLiteralDfa7_0(active0, 0x40000000000ULL, active1, 0L); + case 84: + if ((active0 & 0x100000000ULL) != 0L) + { + jjmatchedKind = 32; + jjmatchedPos = 6; + } + else if ((active0 & 0x400000000ULL) != 0L) + { + jjmatchedKind = 34; + jjmatchedPos = 6; + } + return jjMoveStringLiteralDfa7_0(active0, 0x800000000000ULL, active1, 0x8000c2000ULL); + case 85: + return jjMoveStringLiteralDfa7_0(active0, 0x40400000ULL, active1, 0x10000ULL); + case 89: + if ((active0 & 0x400000000000000ULL) != 0L) + { + jjmatchedKind = 58; + jjmatchedPos = 6; + } + break; + case 95: + return jjMoveStringLiteralDfa7_0(active0, 0x200000ULL, active1, 0L); + case 97: + return jjMoveStringLiteralDfa7_0(active0, 0x40000000000000ULL, active1, 0L); + case 99: + if ((active0 & 0x1000000000000ULL) != 0L) + { + jjmatchedKind = 48; + jjmatchedPos = 6; + } + return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x100040c000000ULL); + case 100: + if ((active0 & 0x4000000000000ULL) != 0L) + { + jjmatchedKind = 50; + jjmatchedPos = 6; + } + break; + case 101: + if ((active0 & 0x800000000000000ULL) != 0L) + { + jjmatchedKind = 59; + jjmatchedPos = 6; + } + else if ((active1 & 0x1000ULL) != 0L) + { + jjmatchedKind = 76; + jjmatchedPos = 6; + } + else if ((active1 & 0x2000000ULL) != 0L) + { + jjmatchedKind = 89; + jjmatchedPos = 6; + } + else if ((active1 & 0x80000000000ULL) != 0L) + { + jjmatchedKind = 107; + jjmatchedPos = 6; + } + return jjMoveStringLiteralDfa7_0(active0, 0x10020000ULL, active1, 0x800000ULL); + case 108: + if ((active0 & 0x1000000000000000ULL) != 0L) + { + jjmatchedKind = 60; + jjmatchedPos = 6; + } + return jjMoveStringLiteralDfa7_0(active0, 0L, active1, 0x10000000000000ULL); + case 110: + return jjMoveStringLiteralDfa7_0(active0, 0x880000000ULL, active1, 0x8000ULL); + case 111: + return jjMoveStringLiteralDfa7_0(active0, 0x400000000000ULL, active1, 0x400000000000ULL); + case 115: + if ((active1 & 0x20000ULL) != 0L) + { + jjmatchedKind = 81; + jjmatchedPos = 6; + } + return jjMoveStringLiteralDfa7_0(active0, 0x40000000000ULL, active1, 0L); + case 116: + if ((active0 & 0x100000000ULL) != 0L) + { + jjmatchedKind = 32; + jjmatchedPos = 6; + } + else if ((active0 & 0x400000000ULL) != 0L) + { + jjmatchedKind = 34; + jjmatchedPos = 6; + } + return jjMoveStringLiteralDfa7_0(active0, 0x800000000000ULL, active1, 0x8000c2000ULL); + case 117: + return jjMoveStringLiteralDfa7_0(active0, 0x40400000ULL, active1, 0x10000ULL); + case 121: + if ((active0 & 0x400000000000000ULL) != 0L) + { + jjmatchedKind = 58; + jjmatchedPos = 6; + } + break; + default : + break; + } + return jjMoveNfa_0(11, 6); +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa7_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1){ + if (((active0 &= old0) | (active1 &= old1)) == 0L) + return jjMoveNfa_0(11, 6); + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 6); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 67: + return jjMoveStringLiteralDfa8_0(active0, 0x20000ULL, active1, 0L); + case 69: + if ((active0 & 0x800000000000ULL) != 0L) + { + jjmatchedKind = 47; + jjmatchedPos = 7; + } + else if ((active1 & 0x400000000ULL) != 0L) + { + jjmatchedKind = 98; + jjmatchedPos = 7; + } + else if ((active1 & 0x10000000000000ULL) != 0L) + { + jjmatchedKind = 116; + jjmatchedPos = 7; + } + return jjMoveStringLiteralDfa8_0(active0, 0x800000000ULL, active1, 0x8a000ULL); + case 71: + return jjMoveStringLiteralDfa8_0(active0, 0x200000ULL, active1, 0L); + case 76: + if ((active0 & 0x40000000000000ULL) != 0L) + { + jjmatchedKind = 54; + jjmatchedPos = 7; + } + break; + case 78: + if ((active0 & 0x400000000000ULL) != 0L) + { + jjmatchedKind = 46; + jjmatchedPos = 7; + } + return jjMoveStringLiteralDfa8_0(active0, 0x10000000ULL, active1, 0L); + case 82: + if ((active1 & 0x800000ULL) != 0L) + { + jjmatchedKind = 87; + jjmatchedPos = 7; + } + return jjMoveStringLiteralDfa8_0(active0, 0x40000000ULL, active1, 0x400000010000ULL); + case 83: + if ((active0 & 0x40000000000ULL) != 0L) + { + jjmatchedKind = 42; + jjmatchedPos = 7; + } + break; + case 84: + if ((active0 & 0x80000000ULL) != 0L) + { + jjmatchedKind = 31; + jjmatchedPos = 7; + } + else if ((active1 & 0x4000000ULL) != 0L) + { + jjmatchedKind = 90; + jjmatchedPos = 7; + } + return jjMoveStringLiteralDfa8_0(active0, 0x400000ULL, active1, 0x1000008000000ULL); + case 89: + if ((active1 & 0x40000ULL) != 0L) + { + jjmatchedKind = 82; + jjmatchedPos = 7; + } + else if ((active1 & 0x800000000ULL) != 0L) + { + jjmatchedKind = 99; + jjmatchedPos = 7; + } + break; + case 99: + return jjMoveStringLiteralDfa8_0(active0, 0x20000ULL, active1, 0L); + case 101: + if ((active0 & 0x800000000000ULL) != 0L) + { + jjmatchedKind = 47; + jjmatchedPos = 7; + } + else if ((active1 & 0x400000000ULL) != 0L) + { + jjmatchedKind = 98; + jjmatchedPos = 7; + } + else if ((active1 & 0x10000000000000ULL) != 0L) + { + jjmatchedKind = 116; + jjmatchedPos = 7; + } + return jjMoveStringLiteralDfa8_0(active0, 0x800000000ULL, active1, 0x8a000ULL); + case 103: + return jjMoveStringLiteralDfa8_0(active0, 0x200000ULL, active1, 0L); + case 108: + if ((active0 & 0x40000000000000ULL) != 0L) + { + jjmatchedKind = 54; + jjmatchedPos = 7; + } + break; + case 110: + if ((active0 & 0x400000000000ULL) != 0L) + { + jjmatchedKind = 46; + jjmatchedPos = 7; + } + return jjMoveStringLiteralDfa8_0(active0, 0x10000000ULL, active1, 0L); + case 114: + if ((active1 & 0x800000ULL) != 0L) + { + jjmatchedKind = 87; + jjmatchedPos = 7; + } + return jjMoveStringLiteralDfa8_0(active0, 0x40000000ULL, active1, 0x400000010000ULL); + case 115: + if ((active0 & 0x40000000000ULL) != 0L) + { + jjmatchedKind = 42; + jjmatchedPos = 7; + } + break; + case 116: + if ((active0 & 0x80000000ULL) != 0L) + { + jjmatchedKind = 31; + jjmatchedPos = 7; + } + else if ((active1 & 0x4000000ULL) != 0L) + { + jjmatchedKind = 90; + jjmatchedPos = 7; + } + return jjMoveStringLiteralDfa8_0(active0, 0x400000ULL, active1, 0x1000008000000ULL); + case 121: + if ((active1 & 0x40000ULL) != 0L) + { + jjmatchedKind = 82; + jjmatchedPos = 7; + } + else if ((active1 & 0x800000000ULL) != 0L) + { + jjmatchedKind = 99; + jjmatchedPos = 7; + } + break; + default : + break; + } + return jjMoveNfa_0(11, 7); +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa8_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1){ + if (((active0 &= old0) | (active1 &= old1)) == 0L) + return jjMoveNfa_0(11, 7); + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 7); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 65: + return jjMoveStringLiteralDfa9_0(active0, 0x40000000ULL, active1, 0L); + case 67: + return jjMoveStringLiteralDfa9_0(active0, 0x800000000ULL, active1, 0L); + case 68: + if ((active1 & 0x8000ULL) != 0L) + { + jjmatchedKind = 79; + jjmatchedPos = 8; + } + else if ((active1 & 0x80000ULL) != 0L) + { + jjmatchedKind = 83; + jjmatchedPos = 8; + } + break; + case 69: + if ((active0 & 0x400000ULL) != 0L) + { + jjmatchedKind = 22; + jjmatchedPos = 8; + } + else if ((active1 & 0x10000ULL) != 0L) + { + jjmatchedKind = 80; + jjmatchedPos = 8; + } + return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x1000000000000ULL); + case 82: + if ((active1 & 0x2000ULL) != 0L) + { + jjmatchedKind = 77; + jjmatchedPos = 8; + } + break; + case 84: + if ((active0 & 0x10000000ULL) != 0L) + { + jjmatchedKind = 28; + jjmatchedPos = 8; + } + else if ((active1 & 0x400000000000ULL) != 0L) + { + jjmatchedKind = 110; + jjmatchedPos = 8; + } + return jjMoveStringLiteralDfa9_0(active0, 0x20000ULL, active1, 0L); + case 85: + return jjMoveStringLiteralDfa9_0(active0, 0x200000ULL, active1, 0L); + case 95: + return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x8000000ULL); + case 97: + return jjMoveStringLiteralDfa9_0(active0, 0x40000000ULL, active1, 0L); + case 99: + return jjMoveStringLiteralDfa9_0(active0, 0x800000000ULL, active1, 0L); + case 100: + if ((active1 & 0x8000ULL) != 0L) + { + jjmatchedKind = 79; + jjmatchedPos = 8; + } + else if ((active1 & 0x80000ULL) != 0L) + { + jjmatchedKind = 83; + jjmatchedPos = 8; + } + break; + case 101: + if ((active0 & 0x400000ULL) != 0L) + { + jjmatchedKind = 22; + jjmatchedPos = 8; + } + else if ((active1 & 0x10000ULL) != 0L) + { + jjmatchedKind = 80; + jjmatchedPos = 8; + } + return jjMoveStringLiteralDfa9_0(active0, 0L, active1, 0x1000000000000ULL); + case 114: + if ((active1 & 0x2000ULL) != 0L) + { + jjmatchedKind = 77; + jjmatchedPos = 8; + } + break; + case 116: + if ((active0 & 0x10000000ULL) != 0L) + { + jjmatchedKind = 28; + jjmatchedPos = 8; + } + else if ((active1 & 0x400000000000ULL) != 0L) + { + jjmatchedKind = 110; + jjmatchedPos = 8; + } + return jjMoveStringLiteralDfa9_0(active0, 0x20000ULL, active1, 0L); + case 117: + return jjMoveStringLiteralDfa9_0(active0, 0x200000ULL, active1, 0L); + default : + break; + } + return jjMoveNfa_0(11, 8); +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa9_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1){ + if (((active0 &= old0) | (active1 &= old1)) == 0L) + return jjMoveNfa_0(11, 8); + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 8); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 65: + return jjMoveStringLiteralDfa10_0(active0, 0x200000ULL, active1, 0L); + case 68: + if ((active1 & 0x1000000000000ULL) != 0L) + { + jjmatchedKind = 112; + jjmatchedPos = 9; + } + break; + case 71: + return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0x8000000ULL); + case 84: + if ((active0 & 0x800000000ULL) != 0L) + { + jjmatchedKind = 35; + jjmatchedPos = 9; + } + return jjMoveStringLiteralDfa10_0(active0, 0x40000000ULL, active1, 0L); + case 85: + return jjMoveStringLiteralDfa10_0(active0, 0x20000ULL, active1, 0L); + case 97: + return jjMoveStringLiteralDfa10_0(active0, 0x200000ULL, active1, 0L); + case 100: + if ((active1 & 0x1000000000000ULL) != 0L) + { + jjmatchedKind = 112; + jjmatchedPos = 9; + } + break; + case 103: + return jjMoveStringLiteralDfa10_0(active0, 0L, active1, 0x8000000ULL); + case 116: + if ((active0 & 0x800000000ULL) != 0L) + { + jjmatchedKind = 35; + jjmatchedPos = 9; + } + return jjMoveStringLiteralDfa10_0(active0, 0x40000000ULL, active1, 0L); + case 117: + return jjMoveStringLiteralDfa10_0(active0, 0x20000ULL, active1, 0L); + default : + break; + } + return jjMoveNfa_0(11, 9); +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa10_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1){ + if (((active0 &= old0) | (active1 &= old1)) == 0L) + return jjMoveNfa_0(11, 9); + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 9); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 73: + return jjMoveStringLiteralDfa11_0(active0, 0x40000000ULL, active1, 0L); + case 82: + return jjMoveStringLiteralDfa11_0(active0, 0x220000ULL, active1, 0L); + case 85: + return jjMoveStringLiteralDfa11_0(active0, 0L, active1, 0x8000000ULL); + case 105: + return jjMoveStringLiteralDfa11_0(active0, 0x40000000ULL, active1, 0L); + case 114: + return jjMoveStringLiteralDfa11_0(active0, 0x220000ULL, active1, 0L); + case 117: + return jjMoveStringLiteralDfa11_0(active0, 0L, active1, 0x8000000ULL); + default : + break; + } + return jjMoveNfa_0(11, 10); +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa11_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1){ + if (((active0 &= old0) | (active1 &= old1)) == 0L) + return jjMoveNfa_0(11, 10); + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 10); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 65: + return jjMoveStringLiteralDfa12_0(active0, 0L, active1, 0x8000000ULL); + case 69: + if ((active0 & 0x20000ULL) != 0L) + { + jjmatchedKind = 17; + jjmatchedPos = 11; + } + return jjMoveStringLiteralDfa12_0(active0, 0x200000ULL, active1, 0L); + case 79: + return jjMoveStringLiteralDfa12_0(active0, 0x40000000ULL, active1, 0L); + case 97: + return jjMoveStringLiteralDfa12_0(active0, 0L, active1, 0x8000000ULL); + case 101: + if ((active0 & 0x20000ULL) != 0L) + { + jjmatchedKind = 17; + jjmatchedPos = 11; + } + return jjMoveStringLiteralDfa12_0(active0, 0x200000ULL, active1, 0L); + case 111: + return jjMoveStringLiteralDfa12_0(active0, 0x40000000ULL, active1, 0L); + default : + break; + } + return jjMoveNfa_0(11, 11); +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa12_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1){ + if (((active0 &= old0) | (active1 &= old1)) == 0L) + return jjMoveNfa_0(11, 11); + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 11); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 78: + if ((active0 & 0x40000000ULL) != 0L) + { + jjmatchedKind = 30; + jjmatchedPos = 12; + } + return jjMoveStringLiteralDfa13_0(active0, 0x200000ULL, active1, 0L); + case 82: + return jjMoveStringLiteralDfa13_0(active0, 0L, active1, 0x8000000ULL); + case 110: + if ((active0 & 0x40000000ULL) != 0L) + { + jjmatchedKind = 30; + jjmatchedPos = 12; + } + return jjMoveStringLiteralDfa13_0(active0, 0x200000ULL, active1, 0L); + case 114: + return jjMoveStringLiteralDfa13_0(active0, 0L, active1, 0x8000000ULL); + default : + break; + } + return jjMoveNfa_0(11, 12); +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa13_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1){ + if (((active0 &= old0) | (active1 &= old1)) == 0L) + return jjMoveNfa_0(11, 12); + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 12); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 65: + return jjMoveStringLiteralDfa14_0(active0, 0L, active1, 0x8000000ULL); + case 84: + return jjMoveStringLiteralDfa14_0(active0, 0x200000ULL, active1, 0L); + case 97: + return jjMoveStringLiteralDfa14_0(active0, 0L, active1, 0x8000000ULL); + case 116: + return jjMoveStringLiteralDfa14_0(active0, 0x200000ULL, active1, 0L); + default : + break; + } + return jjMoveNfa_0(11, 13); +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa14_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1){ + if (((active0 &= old0) | (active1 &= old1)) == 0L) + return jjMoveNfa_0(11, 13); + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 13); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 69: + return jjMoveStringLiteralDfa15_0(active0, 0x200000ULL, active1, 0L); + case 78: + return jjMoveStringLiteralDfa15_0(active0, 0L, active1, 0x8000000ULL); + case 101: + return jjMoveStringLiteralDfa15_0(active0, 0x200000ULL, active1, 0L); + case 110: + return jjMoveStringLiteralDfa15_0(active0, 0L, active1, 0x8000000ULL); + default : + break; + } + return jjMoveNfa_0(11, 14); +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa15_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1){ + if (((active0 &= old0) | (active1 &= old1)) == 0L) + return jjMoveNfa_0(11, 14); + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 14); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 69: + if ((active0 & 0x200000ULL) != 0L) + { + jjmatchedKind = 21; + jjmatchedPos = 15; + } + break; + case 84: + return jjMoveStringLiteralDfa16_0(active0, 0L, active1, 0x8000000ULL); + case 101: + if ((active0 & 0x200000ULL) != 0L) + { + jjmatchedKind = 21; + jjmatchedPos = 15; + } + break; + case 116: + return jjMoveStringLiteralDfa16_0(active0, 0L, active1, 0x8000000ULL); + default : + break; + } + return jjMoveNfa_0(11, 15); +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa16_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1){ + if (((active0 &= old0) | (active1 &= old1)) == 0L) + return jjMoveNfa_0(11, 15); + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 15); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 69: + return jjMoveStringLiteralDfa17_0(active1, 0x8000000ULL); + case 101: + return jjMoveStringLiteralDfa17_0(active1, 0x8000000ULL); + default : + break; + } + return jjMoveNfa_0(11, 16); +} + + int VhdlParserTokenManager::jjMoveStringLiteralDfa17_0(unsigned long long old1, unsigned long long active1){ + if (((active1 &= old1)) == 0L) + return jjMoveNfa_0(11, 16); + if (input_stream->endOfInput()) { + return jjMoveNfa_0(11, 16); + } + curChar = input_stream->readChar(); + switch(curChar) + { + case 69: + if ((active1 & 0x8000000ULL) != 0L) + { + jjmatchedKind = 91; + jjmatchedPos = 17; + } + break; + case 101: + if ((active1 & 0x8000000ULL) != 0L) + { + jjmatchedKind = 91; + jjmatchedPos = 17; + } + break; + default : + break; + } + return jjMoveNfa_0(11, 17); +} + +int VhdlParserTokenManager::jjMoveNfa_0(int startState, int curPos){ + int strKind = jjmatchedKind; + int strPos = jjmatchedPos; + int seenUpto; + input_stream->backup(seenUpto = curPos + 1); + assert(!input_stream->endOfInput()); + curChar = input_stream->readChar(); + curPos = 0; + int startsAt = 0; + jjnewStateCnt = 75; + int i = 1; + jjstateSet[0] = startState; + int kind = 0x7fffffff; + for (;;) + { + if (++jjround == 0x7fffffff) + ReInitRounds(); + if (curChar < 64) + { + unsigned long long l = 1ULL << curChar; + (void)l; + do + { + switch(jjstateSet[--i]) + { + case 11: + if ((0x3ff000000000000ULL & l) != 0L) + { + if (kind > 165) + kind = 165; + { jjCheckNAddStates(0, 8); } + } + else if ((0x100000200ULL & l) != 0L) + { jjCheckNAddTwoStates(0, 3); } + else if (curChar == 47) + { jjAddStates(9, 10); } + else if (curChar == 45) + { jjCheckNAddStates(11, 13); } + else if (curChar == 39) + jjstateSet[jjnewStateCnt++] = 18; + else if (curChar == 34) + { jjCheckNAddTwoStates(9, 10); } + if ((0x3ff000000000000ULL & l) != 0L) + { + if (kind > 171) + kind = 171; + { jjCheckNAdd(20); } + } + break; + case 0: + if ((0x100000200ULL & l) != 0L) + { jjCheckNAddTwoStates(0, 3); } + break; + case 1: + if (curChar != 33) + break; + if (kind > 6) + kind = 6; + { jjCheckNAddStates(14, 18); } + break; + case 2: + if (curChar == 45) + jjstateSet[jjnewStateCnt++] = 1; + break; + case 3: + if (curChar == 45) + { jjCheckNAdd(2); } + break; + case 4: + if ((0xffffffffffffdbffULL & l) == 0L) + break; + if (kind > 6) + kind = 6; + { jjCheckNAddStates(14, 18); } + break; + case 5: + if ((0x2400ULL & l) == 0L) + break; + if (kind > 6) + kind = 6; + { jjCheckNAddTwoStates(0, 3); } + break; + case 6: + if (curChar != 10) + break; + if (kind > 6) + kind = 6; + { jjCheckNAddTwoStates(0, 3); } + break; + case 7: + if (curChar == 13) + jjstateSet[jjnewStateCnt++] = 6; + break; + case 8: + if (curChar == 34) + { jjCheckNAddTwoStates(9, 10); } + break; + case 9: + if ((0xfffffffb00000200ULL & l) != 0L) + { jjCheckNAddTwoStates(9, 10); } + break; + case 10: + if (curChar != 34) + break; + if (kind > 166) + kind = 166; + jjstateSet[jjnewStateCnt++] = 8; + break; + case 13: + if ((0x3ff000000000000ULL & l) == 0L) + break; + if (kind > 167) + kind = 167; + { jjAddStates(19, 20); } + break; + case 15: + if ((0xfffffffb00000200ULL & l) != 0L) + { jjAddStates(21, 22); } + break; + case 17: + if (curChar == 39) + jjstateSet[jjnewStateCnt++] = 18; + break; + case 18: + if ((0xfffffffb00000200ULL & l) != 0L) + jjstateSet[jjnewStateCnt++] = 19; + break; + case 19: + if (curChar == 39 && kind > 169) + kind = 169; + break; + case 20: + if ((0x3ff000000000000ULL & l) == 0L) + break; + if (kind > 171) + kind = 171; + { jjCheckNAdd(20); } + break; + case 22: + if (curChar == 34) + { jjCheckNAddTwoStates(23, 24); } + break; + case 23: + if ((0x3ff000000000000ULL & l) != 0L) + { jjCheckNAddTwoStates(23, 24); } + break; + case 24: + if (curChar == 34 && kind > 179) + kind = 179; + break; + case 26: + if (curChar == 34) + { jjCheckNAddTwoStates(27, 28); } + break; + case 27: + if ((0xfffffffb00000200ULL & l) != 0L) + { jjCheckNAddTwoStates(27, 28); } + break; + case 28: + if (curChar != 34) + break; + if (kind > 186) + kind = 186; + { jjCheckNAddTwoStates(26, 29); } + break; + case 29: + if ((0xfffffffb00000200ULL & l) == 0L) + break; + if (kind > 186) + kind = 186; + { jjCheckNAddTwoStates(26, 29); } + break; + case 30: + if (curChar == 45) + { jjCheckNAddStates(11, 13); } + break; + case 31: + if (curChar != 35) + break; + if (kind > 7) + kind = 7; + { jjCheckNAddStates(23, 25); } + break; + case 32: + if ((0xffffffffffffdbffULL & l) == 0L) + break; + if (kind > 7) + kind = 7; + { jjCheckNAddStates(23, 25); } + break; + case 33: + if ((0x2400ULL & l) != 0L && kind > 7) + kind = 7; + break; + case 34: + if (curChar == 10 && kind > 7) + kind = 7; + break; + case 35: + if (curChar == 13) + jjstateSet[jjnewStateCnt++] = 34; + break; + case 36: + if (curChar == 45) + jjstateSet[jjnewStateCnt++] = 31; + break; + case 37: + if (curChar != 45) + break; + if (kind > 8) + kind = 8; + { jjCheckNAddStates(26, 28); } + break; + case 38: + if ((0xffffffffffffdbffULL & l) == 0L) + break; + if (kind > 8) + kind = 8; + { jjCheckNAddStates(26, 28); } + break; + case 39: + if ((0x2400ULL & l) != 0L && kind > 8) + kind = 8; + break; + case 40: + if (curChar == 10 && kind > 8) + kind = 8; + break; + case 41: + if (curChar == 13) + jjstateSet[jjnewStateCnt++] = 40; + break; + case 42: + if (curChar == 47) + { jjAddStates(9, 10); } + break; + case 43: + if (curChar == 33) + { jjCheckNAddTwoStates(44, 46); } + break; + case 44: + { jjCheckNAddTwoStates(44, 46); } + break; + case 45: + if (curChar == 47 && kind > 9) + kind = 9; + break; + case 46: + if (curChar == 42) + jjstateSet[jjnewStateCnt++] = 45; + break; + case 47: + if (curChar == 42) + jjstateSet[jjnewStateCnt++] = 43; + break; + case 48: + if (curChar == 42) + { jjCheckNAddTwoStates(49, 51); } + break; + case 49: + { jjCheckNAddTwoStates(49, 51); } + break; + case 50: + if (curChar == 47 && kind > 10) + kind = 10; + break; + case 51: + if (curChar == 42) + jjstateSet[jjnewStateCnt++] = 50; + break; + case 52: + if ((0x3ff000000000000ULL & l) == 0L) + break; + if (kind > 165) + kind = 165; + { jjCheckNAddStates(0, 8); } + break; + case 54: + if ((0x3ff000000000000ULL & l) == 0L) + break; + if (kind > 165) + kind = 165; + { jjCheckNAddTwoStates(53, 54); } + break; + case 56: + if ((0x3ff000000000000ULL & l) == 0L) + break; + if (kind > 170) + kind = 170; + { jjCheckNAddStates(29, 32); } + break; + case 57: + if (curChar == 46) + { jjCheckNAdd(58); } + break; + case 58: + if ((0x3ff000000000000ULL & l) == 0L) + break; + if (kind > 170) + kind = 170; + { jjCheckNAddStates(33, 35); } + break; + case 61: + if ((0x280000000000ULL & l) != 0L) + { jjCheckNAdd(62); } + break; + case 62: + if ((0x3ff000000000000ULL & l) == 0L) + break; + if (kind > 170) + kind = 170; + { jjCheckNAddTwoStates(63, 62); } + break; + case 65: + if ((0x3ff000000000000ULL & l) != 0L) + { jjCheckNAddStates(36, 38); } + break; + case 66: + if (curChar == 35) + { jjCheckNAdd(67); } + break; + case 67: + if ((0x3ff000000000000ULL & l) != 0L) + { jjCheckNAddStates(39, 41); } + break; + case 68: + if (curChar == 46) + { jjCheckNAdd(69); } + break; + case 69: + if ((0x3ff000000000000ULL & l) != 0L) + { jjCheckNAddTwoStates(69, 70); } + break; + case 70: + if (curChar != 35) + break; + if (kind > 172) + kind = 172; + jjstateSet[jjnewStateCnt++] = 71; + break; + case 72: + if ((0x280000000000ULL & l) != 0L) + { jjCheckNAdd(73); } + break; + case 73: + if ((0x3ff000000000000ULL & l) == 0L) + break; + if (kind > 172) + kind = 172; + { jjCheckNAddTwoStates(74, 73); } + break; + default : break; + } + } while(i != startsAt); + } + else if (curChar < 128) + { + unsigned long long l = 1ULL << (curChar & 077); + (void)l; + do + { + switch(jjstateSet[--i]) + { + case 11: + if ((0x7fffffe07fffffeULL & l) != 0L) + { + if (kind > 171) + kind = 171; + { jjCheckNAdd(20); } + } + else if (curChar == 96) + { jjCheckNAddTwoStates(26, 29); } + else if (curChar == 92) + { jjCheckNAddTwoStates(15, 16); } + if ((0x7fffffe07fffffeULL & l) != 0L) + { + if (kind > 167) + kind = 167; + { jjCheckNAddTwoStates(12, 13); } + } + if ((0x100800401008004ULL & l) != 0L) + jjstateSet[jjnewStateCnt++] = 22; + break; + case 4: + if (kind > 6) + kind = 6; + { jjAddStates(14, 18); } + break; + case 9: + if ((0x7fffffffffffffffULL & l) != 0L) + { jjAddStates(42, 43); } + break; + case 12: + if (curChar == 95) + { jjCheckNAddTwoStates(12, 13); } + break; + case 13: + if ((0x7fffffe07fffffeULL & l) == 0L) + break; + if (kind > 167) + kind = 167; + { jjCheckNAddTwoStates(12, 13); } + break; + case 14: + if (curChar == 92) + { jjCheckNAddTwoStates(15, 16); } + break; + case 15: + if ((0x7fffffffffffffffULL & l) != 0L) + { jjCheckNAddTwoStates(15, 16); } + break; + case 16: + if (curChar == 92 && kind > 168) + kind = 168; + break; + case 18: + if ((0x7fffffffffffffffULL & l) != 0L) + jjstateSet[jjnewStateCnt++] = 19; + break; + case 20: + if ((0x7fffffe07fffffeULL & l) == 0L) + break; + if (kind > 171) + kind = 171; + { jjCheckNAdd(20); } + break; + case 21: + if ((0x100800401008004ULL & l) != 0L) + jjstateSet[jjnewStateCnt++] = 22; + break; + case 23: + if ((0x7fffffe07fffffeULL & l) != 0L) + { jjAddStates(44, 45); } + break; + case 25: + if (curChar == 96) + { jjCheckNAddTwoStates(26, 29); } + break; + case 27: + if ((0x7fffffffffffffffULL & l) != 0L) + { jjAddStates(46, 47); } + break; + case 29: + if ((0x7fffffffffffffffULL & l) == 0L) + break; + if (kind > 186) + kind = 186; + { jjCheckNAddTwoStates(26, 29); } + break; + case 32: + if (kind > 7) + kind = 7; + { jjAddStates(23, 25); } + break; + case 38: + if (kind > 8) + kind = 8; + { jjAddStates(26, 28); } + break; + case 44: + { jjAddStates(48, 49); } + break; + case 49: + { jjAddStates(50, 51); } + break; + case 53: + if (curChar == 95) + jjstateSet[jjnewStateCnt++] = 54; + break; + case 55: + if (curChar == 95) + jjstateSet[jjnewStateCnt++] = 56; + break; + case 59: + if (curChar == 95) + jjstateSet[jjnewStateCnt++] = 58; + break; + case 60: + if ((0x2000000020ULL & l) != 0L) + { jjCheckNAddTwoStates(61, 62); } + break; + case 63: + if (curChar == 95) + { jjCheckNAdd(62); } + break; + case 64: + if (curChar == 95) + jjstateSet[jjnewStateCnt++] = 65; + break; + case 67: + if ((0x7fffffe07fffffeULL & l) != 0L) + { jjCheckNAddStates(39, 41); } + break; + case 69: + if ((0x7fffffe07fffffeULL & l) != 0L) + { jjCheckNAddTwoStates(69, 70); } + break; + case 71: + if ((0x2000000020ULL & l) != 0L) + { jjCheckNAddTwoStates(72, 73); } + break; + case 74: + if (curChar == 95) + { jjCheckNAdd(73); } + break; + default : break; + } + } while(i != startsAt); + } + else + { + int hiByte = (curChar >> 8); + int i1 = hiByte >> 6; + unsigned long long l1 = 1ULL << (hiByte & 077); + int i2 = (curChar & 0xff) >> 6; + unsigned long long l2 = 1ULL << (curChar & 077); + do + { + switch(jjstateSet[--i]) + { + case 4: + if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) + break; + if (kind > 6) + kind = 6; + { jjAddStates(14, 18); } + break; + case 9: + if (jjCanMove_1(hiByte, i1, i2, l1, l2)) + { jjAddStates(42, 43); } + break; + case 15: + if (jjCanMove_1(hiByte, i1, i2, l1, l2)) + { jjAddStates(21, 22); } + break; + case 18: + if (jjCanMove_1(hiByte, i1, i2, l1, l2)) + jjstateSet[jjnewStateCnt++] = 19; + break; + case 27: + if (jjCanMove_1(hiByte, i1, i2, l1, l2)) + { jjAddStates(46, 47); } + break; + case 29: + if (!jjCanMove_1(hiByte, i1, i2, l1, l2)) + break; + if (kind > 186) + kind = 186; + { jjAddStates(52, 53); } + break; + case 32: + if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) + break; + if (kind > 7) + kind = 7; + { jjAddStates(23, 25); } + break; + case 38: + if (!jjCanMove_0(hiByte, i1, i2, l1, l2)) + break; + if (kind > 8) + kind = 8; + { jjAddStates(26, 28); } + break; + case 44: + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) + { jjAddStates(48, 49); } + break; + case 49: + if (jjCanMove_0(hiByte, i1, i2, l1, l2)) + { jjAddStates(50, 51); } + break; + default : if (i1 == 0 || l1 == 0 || i2 == 0 || l2 == 0) break; else break; + } + } while(i != startsAt); + } + if (kind != 0x7fffffff) + { + jjmatchedKind = kind; + jjmatchedPos = curPos; + kind = 0x7fffffff; + } + ++curPos; + if ((i = jjnewStateCnt), (jjnewStateCnt = startsAt), (i == (startsAt = 75 - startsAt))) + break; + if (input_stream->endOfInput()) { break; } + curChar = input_stream->readChar(); + } + if (jjmatchedPos > strPos) + return curPos; + + int toRet = MAX(curPos, seenUpto); + + if (curPos < toRet) + for (i = toRet - MIN(curPos, seenUpto); i-- > 0; ) + { assert(!input_stream->endOfInput()); + curChar = input_stream->readChar(); } + + if (jjmatchedPos < strPos) + { + jjmatchedKind = strKind; + jjmatchedPos = strPos; + } + else if (jjmatchedPos == strPos && jjmatchedKind > strKind) + jjmatchedKind = strKind; + + return toRet; +} + +bool VhdlParserTokenManager::jjCanMove_0(int hiByte, int i1, int i2, unsigned long long l1, unsigned long long l2){ + switch(hiByte) + { + case 0: + return ((jjbitVec2[i2] & l2) != 0L); + default : + if ((jjbitVec0[i1] & l1) != 0L) + return true; + return false; + } +} + +bool VhdlParserTokenManager::jjCanMove_1(int hiByte, int i1, int i2, unsigned long long l1, unsigned long long l2){ + switch(hiByte) + { + case 0: + return ((jjbitVec3[i2] & l2) != 0L); + default : + return false; + } +} + +/** Token literal values. */ + +Token * VhdlParserTokenManager::jjFillToken(){ + Token *t; + JAVACC_STRING_TYPE curTokenImage; + int beginLine; + int endLine; + int beginColumn; + int endColumn; + JAVACC_STRING_TYPE im = jjstrLiteralImages[jjmatchedKind]; + curTokenImage = (im.length() == 0) ? input_stream->GetImage() : im; + if (input_stream->getTrackLineColumn()) { + beginLine = input_stream->getBeginLine(); + beginColumn = input_stream->getBeginColumn(); + endLine = input_stream->getEndLine(); + endColumn = input_stream->getEndColumn(); + } + t = Token::newToken(jjmatchedKind, curTokenImage); + t->specialToken = NULL; + t->next = NULL; + + if (input_stream->getTrackLineColumn()) { + t->beginLine = beginLine; + t->endLine = endLine; + t->beginColumn = beginColumn; + t->endColumn = endColumn; + } + + return t; +} +const int defaultLexState = 0; +/** Get the next Token. */ + +Token * VhdlParserTokenManager::getNextToken(){ + Token *matchedToken; + int curPos = 0; + + for (;;) + { + EOFLoop: + if (input_stream->endOfInput()) + { + jjmatchedKind = 0; + jjmatchedPos = -1; + matchedToken = jjFillToken(); + return matchedToken; + } + curChar = input_stream->BeginToken(); + image = jjimage; + image.clear(); + jjimageLen = 0; + + jjmatchedKind = 0x7fffffff; + jjmatchedPos = 0; + curPos = jjMoveStringLiteralDfa0_0(); + if (jjmatchedKind != 0x7fffffff) + { + if (jjmatchedPos + 1 < curPos) + input_stream->backup(curPos - jjmatchedPos - 1); + if ((jjtoToken[jjmatchedKind >> 6] & (1ULL << (jjmatchedKind & 077))) != 0L) + { + matchedToken = jjFillToken(); + TokenLexicalActions(matchedToken); + return matchedToken; + } + else + { + SkipLexicalActions(NULL); + goto EOFLoop; + } + } + int error_line = input_stream->getEndLine(); + int error_column = input_stream->getEndColumn(); + JAVACC_STRING_TYPE error_after; + bool EOFSeen = false; + if (input_stream->endOfInput()) { + EOFSeen = true; + error_after = curPos <= 1 ? EMPTY : input_stream->GetImage(); + if (curChar == '\n' || curChar == '\r') { + error_line++; + error_column = 0; + } + else + error_column++; + } + if (!EOFSeen) { + error_after = curPos <= 1 ? EMPTY : input_stream->GetImage(); + } + errorHandler->lexicalError(EOFSeen, curLexState, error_line, error_column, error_after, curChar, this); + } +} + + +void VhdlParserTokenManager::SkipLexicalActions(Token *matchedToken){ + switch(jjmatchedKind) + { + case 3 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::lineCount(); + break; + } + case 6 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::handleCommentBlock(image.data(),TRUE); + break; + } + case 7 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::handleFlowComment(image.data()); + break; + } + case 8 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::lineCount(image.data()); + break; + } + case 9 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + QCString q(image.data()); + q.stripPrefix("/*!"); + q.resize(q.length()-2); + ::vhdl::parser::VhdlParser::handleCommentBlock(q.data(),TRUE);image.clear(); + break; + } + case 10 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::lineCount(image.data());image.clear(); + break; + } + default : + break; + } +} + +void VhdlParserTokenManager::TokenLexicalActions(Token *matchedToken){ + switch(jjmatchedKind) + { + case 17 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::setLineParsed(ARCHITECTURE_T); + break; + } + case 18 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + VhdlParser::setLineParsed(ARRAY_T); + break; + } + case 22 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::setLineParsed(ATTRIBUTE_T); + break; + } + case 25 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::setLineParsed(BODY_T); + break; + } + case 28 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + VhdlParser::setLineParsed(COMPONENT_T); + break; + } + case 30 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + VhdlParser::setLineParsed(CONFIGURATION_T); + break; + } + case 31 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + VhdlParser::setLineParsed(CONSTANT_T); + break; + } + case 32 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + VhdlParser::setLineParsed(CONTEXT_T); + break; + } + case 39 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + VhdlParser::setLineParsed(END_T); + break; + } + case 40 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + VhdlParser::setLineParsed(ENTITY_T); + break; + } + case 43 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + VhdlParser::setLineParsed(FILE_T); + break; + } + case 46 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + VhdlParser::setLineParsed(FUNCTION_T); + break; + } + case 49 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + VhdlParser::setLineParsed(GROUP_T); + break; + } + case 58 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + VhdlParser::setLineParsed(LIBRARY_T); + break; + } + case 76 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::setLineParsed(PACKAGE_T); + break; + } + case 78 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::setLineParsed(PORT_T); + break; + } + case 80 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::setLineParsed(PROCEDURE_T); + break; + } + case 81 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::setLineParsed(PROCESS_T); + break; + } + case 86 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::setLineParsed(RECORD_T); + break; + } + case 100 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::setLineParsed(SIGNAL_T); + break; + } + case 107 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::setLineParsed(SUBTYPE_T); + break; + } + case 111 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::setLineParsed(TYPE_T); + break; + } + case 113 : { + image.append(input_stream->GetSuffix(jjimageLen + (lengthOfMatch = jjmatchedPos + 1))); + ::vhdl::parser::VhdlParser::setLineParsed(UNITS_T); + break; + } + default : + break; + } +} + /** Reinitialise parser. */ + void VhdlParserTokenManager::ReInit(JAVACC_CHARSTREAM *stream, int lexState, VhdlParser *parserArg) { + if (input_stream) delete input_stream; + jjmatchedPos = jjnewStateCnt = 0; + curLexState = lexState; + input_stream = stream; + ReInitRounds(); + debugStream = stdout; // init + SwitchTo(lexState); + parser = parserArg; + errorHandler = new TokenManagerErrorHandler(); + errorHandlerCreated = true; + } + + void VhdlParserTokenManager::ReInitRounds() { + int i; + jjround = 0x80000001; + for (i = 75; i-- > 0;) + jjrounds[i] = 0x80000000; + } + + /** Switch to specified lex state. */ + void VhdlParserTokenManager::SwitchTo(int lexState) { + if (lexState >= 1 || lexState < 0) + assert(false); + //throw 1;//new TokenMgrError("Error: Ignoring invalid lexical state : " + lexState + ". State unchanged.", TokenMgrError.INVALID_LEXICAL_STATE); + else + curLexState = lexState; + } + + /** Constructor. */ + VhdlParserTokenManager::VhdlParserTokenManager (JAVACC_CHARSTREAM *stream, int lexState, VhdlParser *parserArg) + { + input_stream = NULL; + ReInit(stream, lexState, parserArg); + } + + // Destructor + VhdlParserTokenManager::~VhdlParserTokenManager () { + if (input_stream) delete input_stream; + if (errorHandlerCreated) delete errorHandler; + } + +} +} diff --git a/vhdlparser/VhdlParserTokenManager.h b/vhdlparser/VhdlParserTokenManager.h new file mode 100644 index 0000000..3916069 --- /dev/null +++ b/vhdlparser/VhdlParserTokenManager.h @@ -0,0 +1,139 @@ +#ifndef VHDLPARSERTOKENMANAGER_H +#define VHDLPARSERTOKENMANAGER_H +#include "JavaCC.h" +#include "CharStream.h" +#include "Token.h" +#include "ErrorHandler.h" +#include "TokenManager.h" +#include "VhdlParserConstants.h" +#include "VhdlParser.h" + +namespace vhdl { +namespace parser { +class VhdlParser; + +/** Token Manager. */ +class VhdlParserTokenManager : public TokenManager { + public: + + /** Debug output. */ + FILE *debugStream; + /** Set debug output. */ + +void setDebugStream(FILE *ds); + + int jjStopAtPos(int pos, int kind); + + int jjMoveStringLiteralDfa0_0(); + + int jjMoveStringLiteralDfa1_0(unsigned long long active0, unsigned long long active1, unsigned long long active2); + + int jjMoveStringLiteralDfa2_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1, unsigned long long old2, unsigned long long active2); + + int jjMoveStringLiteralDfa3_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1, unsigned long long old2, unsigned long long active2); + + int jjMoveStringLiteralDfa4_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1); + + int jjMoveStringLiteralDfa5_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1); + + int jjMoveStringLiteralDfa6_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1); + + int jjMoveStringLiteralDfa7_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1); + + int jjMoveStringLiteralDfa8_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1); + + int jjMoveStringLiteralDfa9_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1); + + int jjMoveStringLiteralDfa10_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1); + + int jjMoveStringLiteralDfa11_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1); + + int jjMoveStringLiteralDfa12_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1); + + int jjMoveStringLiteralDfa13_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1); + + int jjMoveStringLiteralDfa14_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1); + + int jjMoveStringLiteralDfa15_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1); + + int jjMoveStringLiteralDfa16_0(unsigned long long old0, unsigned long long active0, unsigned long long old1, unsigned long long active1); + + int jjMoveStringLiteralDfa17_0(unsigned long long old1, unsigned long long active1); + +int jjMoveNfa_0(int startState, int curPos); + +bool jjCanMove_0(int hiByte, int i1, int i2, unsigned long long l1, unsigned long long l2); + +bool jjCanMove_1(int hiByte, int i1, int i2, unsigned long long l1, unsigned long long l2); + +Token * jjFillToken(); + +public: int curLexState; +public: int jjnewStateCnt; +public: int jjround; +public: int jjmatchedPos; +public: int jjmatchedKind; + + +Token * getNextToken(); + +void SkipLexicalActions(Token *matchedToken); + +void TokenLexicalActions(Token *matchedToken); +#define jjCheckNAdd(state)\ +{\ + if (jjrounds[state] != jjround)\ + {\ + jjstateSet[jjnewStateCnt++] = state;\ + jjrounds[state] = jjround;\ + }\ +} +#define jjAddStates(start, end)\ +{\ + for (int x = start; x <= end; x++) {\ + jjstateSet[jjnewStateCnt++] = jjnextStates[x];\ + } /*while (start++ != end);*/\ +} +#define jjCheckNAddTwoStates(state1, state2)\ +{\ + jjCheckNAdd(state1);\ + jjCheckNAdd(state2);\ +} + +#define jjCheckNAddStates(start, end)\ +{\ + for (int x = start; x <= end; x++) {\ + jjCheckNAdd(jjnextStates[x]);\ + } /*while (start++ != end);*/\ +} + +#ifndef JAVACC_CHARSTREAM +#define JAVACC_CHARSTREAM CharStream +#endif + private: VhdlParser*parser; + private: void ReInitRounds(); + public: VhdlParserTokenManager(JAVACC_CHARSTREAM *stream, int lexState = 0, VhdlParser *parserArg = NULL); + public: virtual ~VhdlParserTokenManager(); + void ReInit(JAVACC_CHARSTREAM *stream, int lexState = 0, VhdlParser *parserArg = NULL); + void SwitchTo(int lexState); + const JAVACC_SIMPLE_STRING jjKindsForBitVector(int i, unsigned long long vec); + const JAVACC_SIMPLE_STRING jjKindsForStateVector(int lexState, int vec[], int start, int end); + JAVACC_CHARSTREAM *input_stream; + int jjrounds[75]; + int jjstateSet[2 * 75]; + JAVACC_STRING_TYPE jjimage; + JAVACC_STRING_TYPE image; + int jjimageLen; + int lengthOfMatch; + JAVACC_CHAR_TYPE curChar; + TokenManagerErrorHandler *errorHandler; + bool errorHandlerCreated; + public: void setErrorHandler(TokenManagerErrorHandler *eh) { + if (errorHandlerCreated && errorHandler != NULL) delete errorHandler; + errorHandler = eh; + errorHandlerCreated = false; + } +}; +} +} +#endif diff --git a/vhdlparser/vhdlparser.jj b/vhdlparser/vhdlparser.jj new file mode 100644 index 0000000..7a4283f --- /dev/null +++ b/vhdlparser/vhdlparser.jj @@ -0,0 +1,2816 @@ +/****************************************************************************** + * + * Copyright (C) 2014 by M. Kreis + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + */ +options { + JAVA_UNICODE_ESCAPE = true; + OUTPUT_LANGUAGE = "c++"; + NAMESPACE = "vhdl::parser"; + STATIC=false; + PARSER_INCLUDES="vhdljjparser.h"; + TOKEN_MANAGER_INCLUDES="VhdlParser.h"; + + //OUTPUT_DIRECTORY = "."; +// DEBUG_PARSER=true; + //DEBUG_LOOKAHEAD=true; + + } + +PARSER_BEGIN(VhdlParser) + +typedef unsigned long long uint64; + + +static Entry* current_root; +static Entry* tempEntry; +static Entry* lastEntity ; +static Entry* lastCompound ; +static Entry* current; +static QCString compSpec; +static QCString currName; +static int levelCounter; +static QCString confName; +static QCString genLabels; +static QCString lab; +static QCString forL; +static int param_sec ; +static int parse_sec; +static int currP; +static Entry* currentCompound; + +//---------------------------------------- + +static void setLineParsed(int tok); +static int getLine(int tok); +static int getLine(); +static void lineCount(const char*); +static void lineCount(); +static void addProto(const char *s1,const char *s2,const char *s3,const char *s4,const char *s5,const char *s6); +static void addConfigureNode(const char* a,const char*b, bool,bool isLeaf,bool inlineConf); +static void createFunction(const char *impure,uint64 spec,const char *fname); +static void addVhdlType(const char *n,int startLine,int section, uint64 spec,const char* args,const char* type,Protection prot); +static void addCompInst(char *n, char* instName, char* comp,int iLine); +static void handleCommentBlock(const char* doc,bool brief); +static void handleFlowComment(const char*); +static void initEntry(Entry *e); +static void newEntry(); +static bool isFuncProcProced(); +static void pushLabel(QCString &,QCString&); +static QCString popLabel(QCString & q); +static bool addLibUseClause(const QCString &type); +static void mapLibPackage( Entry* root); +static void createFlow(); +static void error_skipto(int kind); + +PARSER_END(VhdlParser) + +SKIP : +{ + " " +| "\t" +| "\n" {::vhdl::parser::VhdlParser::lineCount();} +| "\r" +} + +SKIP: +{ + // VHDL comment -- ...... + // VHDL doxygen line comment --! .... + <#DOXYGEN_VHDL_COMMENT: (" "|"\t")*"--!"(~["\n", "\r"])* ("\n" | "\r" | "\r\n")?> + | <MULT_DOXYGEN_COMMENT: (<DOXYGEN_VHDL_COMMENT>)+ > { ::vhdl::parser::VhdlParser::handleCommentBlock(image.data(),TRUE); } + |<VHDL_FLOWCHART_COMMENT: "--#" (~["\n", "\r"])* ("\n" | "\r" | "\r\n")?> { ::vhdl::parser::VhdlParser::handleFlowComment(image.data());} + |<VHDL_COMMENT: "--" (~["\n", "\r"])* ("\n" | "\r" | "\r\n")?> { ::vhdl::parser::VhdlParser::lineCount(image.data());} + } + +// VHDL 2008 comment /* .... */ +// VHDL 2008 doxygen comment /*! .... */ +SKIP : +{ + <MULT_DOXYGEN_VHDL_COMMENT_2008 : "/*!" (~[])* "*/" > + { + QCString q(image.data()); + q.stripPrefix("/*!"); + q.resize(q.length()-2); + ::vhdl::parser::VhdlParser::handleCommentBlock(q.data(),TRUE);image.clear(); + } + | <MULT_VHDL_2008_COMMENT : "/*" (~[])* "*/" > {::vhdl::parser::VhdlParser::lineCount(image.data());image.clear();} +} + +/* KEYWORDS */ + +TOKEN [IGNORE_CASE] : +{ + <ABS_T: "abs"> +| <ACCESS_T: "access"> +| <AFTER_T: "after"> +| <ALIAS_T: "alias"> +| <ALL_T: "all"> +| <AND_T: "and"> +| <ARCHITECTURE_T: "architecture"> {::vhdl::parser::VhdlParser::setLineParsed(ARCHITECTURE_T);} +| <ARRAY_T: "array"> {VhdlParser::setLineParsed(ARRAY_T);} +| <ASSERT_T: "assert"> +| <ASSUME_T: "assume"> +| <ASSUME_GUARANTEE_T: "assume_guarentee"> +| <ATTRIBUTE_T: "attribute"> {::vhdl::parser::VhdlParser::setLineParsed(ATTRIBUTE_T);} +| <BEGIN_T: "begin"> +| <BLOCK_T: "block"> +| <BODY_T: "body"> {::vhdl::parser::VhdlParser::setLineParsed(BODY_T);} +| <BUFFER_T: "buffer"> +| <BUS_T: "bus"> +| <COMPONENT_T: "component"> {VhdlParser::setLineParsed(COMPONENT_T);} +| <CASE_T: "case"> +| <CONFIGURATION_T: "configuration"> {VhdlParser::setLineParsed(CONFIGURATION_T);} +| <CONSTANT_T: "constant"> {VhdlParser::setLineParsed(CONSTANT_T);} +| <CONTEXT_T: "context"> {VhdlParser::setLineParsed(CONTEXT_T);} +| <COVER_T: "cover"> +| <DEFAULT_T: "default"> +| <DISCONNECT_T: "disconnect"> +| <DOWNTO_T: "downto"> +| <ELSE_T: "else"> +| <ELSIF_T: "elsif"> +| <END_T: "end"> {VhdlParser::setLineParsed(END_T);} +| <ENTITY_T: "entity"> {VhdlParser::setLineParsed(ENTITY_T);} +| <EXIT_T: "exit"> +| <FAIRNESS_T: "fairness"> +| <FILE_T: "file"> {VhdlParser::setLineParsed(FILE_T);} +| <FOR_T: "for"> +| <FORCE_T: "force"> +| <FUNCTION_T: "function"> {VhdlParser::setLineParsed(FUNCTION_T);} +| <GENERATE_T: "generate"> +| <GENERIC_T: "generic"> +| <GROUP_T: "group"> {VhdlParser::setLineParsed(GROUP_T);} +| <GUARDED_T: "guarded"> +| <IF_T: "if"> +| <IMPURE_T: "impure"> +| <IN_T: "in"> +| <INERTIAL_T: "inertial"> +| <INOUT_T: "inout"> +| <IS_T: "is"> +| <LABEL_T: "label"> +| <LIBRARY_T: "library"> {VhdlParser::setLineParsed(LIBRARY_T);} +| <LINKAGE_T: "linkage"> +| <LITERAL_T: "literal"> +| <LOOP_T: "loop"> +| <MAP_T: "map"> +| <MOD_T: "mod"> +| <NAND_T: "nand"> +| <NEW_T: "new"> +| <NEXT_T: "next"> +| <NOR_T: "nor"> +| <NOT_T: "not"> +| <NULL_T: "null"> +| <OF_T: "of"> +| <ON_T: "on"> +| <OPEN_T: "open"> +| <OR_T: "or"> +| <OTHER_T: "others"> +| <OUT_T: "out"> +| <PACKAGE_T: "package"> {::vhdl::parser::VhdlParser::setLineParsed(PACKAGE_T);} +| <PARAMETER_T: "parameter"> +| <PORT_T: "port"> {::vhdl::parser::VhdlParser::setLineParsed(PORT_T);} +| <POSTPONED_T: "postponed"> +| <PROCEDURE_T: "procedure"> {::vhdl::parser::VhdlParser::setLineParsed(PROCEDURE_T);} +| <PROCESS_T: "process"> {::vhdl::parser::VhdlParser::setLineParsed(PROCESS_T);} +| <PROPERTY_T: "property"> +| <PROTECTED_T: "protected"> +| <PURE_T: "pure"> +| <RANGE_T: "range"> +| <RECORD_T: "record"> {::vhdl::parser::VhdlParser::setLineParsed(RECORD_T);} +| <REGISTER_T: "register"> +| <REJECT_T: "reject"> +| <RELEASE_T: "release"> +| <RESTRICT_T: "restrict"> +| <RESTRICT_GUARANTEE_T: "restrict_guarantee"> +| <REM_T: "rem"> +| <REPORT_T: "report"> +| <ROL_T: "rol"> +| <ROR_T: "ror"> +| <RETURN_T: "return"> +| <SELECT_T: "select"> +| <SEQUENCE_T: "sequence"> +| <SEVERITY_T: "severity"> +| <SIGNAL_T: "signal"> {::vhdl::parser::VhdlParser::setLineParsed(SIGNAL_T);} +| <SHARED_T: "shared"> +| <SLA_T: "sla"> +| <SLL_T: "sll"> +| <SRA_T: "sra"> +| <SRL_T: "srl"> +| <STRONG_T: "strong"> +| <SUBTYPE_T: "subtype"> {::vhdl::parser::VhdlParser::setLineParsed(SUBTYPE_T);} +| <THEN_T: "then"> +| <TO_T: "to"> +| <TRANSPORT_T: "transport"> +| <TYPE_T: "type"> {::vhdl::parser::VhdlParser::setLineParsed(TYPE_T);} +| <UNAFFECTED_T: "unaffected"> +| <UNITS_T: "units"> {::vhdl::parser::VhdlParser::setLineParsed(UNITS_T);} +| <UNTIL_T: "until"> +| <USE_T: "use"> +| <VARIABLE_T: "variable"> +| <VMODE_T: "vmode"> +| <VPROP_T: "vprop"> +| <VUNIT_T: "vunit"> +| <WAIT_T: "wait"> +| <WHEN_T: "when"> +| <WHILE_T: "while"> +| <WITH_T: "with"> +| <XOR_T: "xor"> +| <XNOR_T: "xnor"> +} + +/* OPERATORS */ + +TOKEN : +{ + < AMPERSAND_T: "&" > +| < APOSTROPHE_T: "'" > +| < LPAREN_T: "(" > +| < RPAREN_T: ")" > +| < DOUBLEMULT_T: "**" > +| < MULT_T: "*" > +| < PLUS_T: "+" > +| < MINUS_T: "-" > +| < COMMA_T: "," > +| < VARASSIGN_T: ":=" > +| < COLON_T: ":" > +| < SEMI_T: ";" > +| < LESSTHAN_T: "<=" > +| < GREATERTHAN_T: ">=" > +| < LT_T: "<" > +| < GT_T: ">" > +| < EQU_T: "=" > +| < NOTEQU_T: "/=" > +| < ARROW_T: "=>" > +| < BOX_T: "<>" > +| < SLSL_T: "<<" > +| < RSRS_T: ">>" > +| < QQ_T: "??" > +| < QGT_T: "?>=" > +| < QLT_T: "?<=" > +| < QG_T: "?>" > +| < QL_T: "?<" > +| < QEQU_T: "?=" > +| < QNEQU_T: "?/=" > +| < Q_T: "?" > +| < BAR_T: "|" > +| <DOT_T: "." > +| < SLASH_T: "/" > +| < AT_T: "@" > +| < NEG_T: "^" > +| < LBRACKET_T: "[" > +| < RBRACKET_T: "]" > +| < LBRACE: "{" > +| < RBRACE: "}" > + +} + +TOKEN: +{ + <INTEGER: <DIGIT> ((["_"])? (<DIGIT>))* > + | <STRINGLITERAL: (( ["\""](<GRAPHIC_CHARACTER>)*) "\"")+ > + | <BASIC_IDENTIFIER: (<LETTER> ( (["_"])* <LETTER_OR_DIGIT> )*) > + | <EXTENDED_CHARACTER: ( ["\\"](<GRAPHIC_CHARACTER>)*["\\"] ) > + | <CHARACTER_LITERAL: (["'"]<GRAPHIC_CHARACTER>["'"]) > + | <DECIMAL_LITERAL: (<INTEGER> (["."]<INTEGER>)? (<EXPONENT>)? ) > + | <BASED_INTEGER: <LETTER_OR_DIGIT>( <LETTER_OR_DIGIT>)* > + | <BASED_LITERAL: <INTEGER>["#"]<BASED_INTEGER>(["."] <BASED_INTEGER>)? ["#"] (<EXPONENT>)? > + | <#EXPONENT: (["e","E"] (["+","-"])? (<INTEGER>)+) > + | < #BASIC_GRAPHIC_CHARACTER: (<UPPER_CASE_LETTER>|<DIGIT>|<SPECIAL_CHARACTER>|<SPACE_CHARACTER>) > + | < #GRAPHIC_CHARACTER: ( <BASIC_GRAPHIC_CHARACTER>|<LOWER_CASE_LETTER>|<OTHER_SPECIAL_CHARACTER> ) > + | < #LETTER_OR_DIGIT: ( <LETTER> | <DIGIT> ) > + | < #LETTER: (<UPPER_CASE_LETTER>|<LOWER_CASE_LETTER>) > + | < #UPPER_CASE_LETTER: ["A"-"Z"] > + | <BIT_STRING_LITERAL : <BASE_SPECIFIER >["\""](<LETTER_OR_DIGIT>)* ["\""] > + | <#BASE_SPECIFIER:["B","O","X","b","o","x"]> + | < #DIGIT: ["0"-"9"] > + | < #SPECIAL_CHARACTER: ["#","&","'","(",")","*","+",",","-",".","/",":",";","<","=",">","_","|"] > + | < #OTHER_SPECIAL_CHARACTER: ["%","!","$","@","?","[","\\","]","^","`","{","}","~","\u00A0"-"\u00FF"]> + | < #SPACE_CHARACTER: [" ","\t"] > + | < #LOWER_CASE_LETTER: ["a"-"z"] > + | <VHDL2008TOOLDIR : ["`"](<GRAPHIC_CHARACTER>|<STRINGLITERAL>)+ > + +} + +QCString abstract_literal() : +{Token *tok;} +{ + tok=<DECIMAL_LITERAL> { return tok->image.c_str(); } + | tok=<INTEGER> { return tok->image.c_str(); } + | tok=<BASED_LITERAL> { return tok->image.c_str(); } +} + +QCString access_type_definition() : +{Token *tok;QCString str,str1;} +{ +tok=<ACCESS_T> str1=subtype_indication() {str=tok->image.c_str(); return str+str1;} +} + +QCString actual_designator() : +{QCString str;Token *t;} +{ +t=<OPEN_T> { return t->image.c_str(); } +| +LOOKAHEAD(expression()) + str=expression() { return str; } +| + LOOKAHEAD(name()) + str=name() { return str; } +} + +QCString actual_parameter_part() : +{QCString s;} +{ + s=association_list() { return s;} +} + +QCString actual_part() : +{QCString s,s1;} +{ + LOOKAHEAD(actual_designator()) + s=actual_designator() { return s;} + | + <BOX_T> { return "<>";} + | + s=name() <LPAREN_T> s1=actual_designator() <RPAREN_T> {s+="(";s+=s1+")";return s;} + + } + +QCString adding_operator () : +{} +{ + <PLUS_T> { return "+";} + | <MINUS_T> { return "-";} + |<AMPERSAND_T> { return "&";} +} + +QCString aggregate() : {QCString s,s1,s2;} +{ + <LPAREN_T> s=element_association() (<COMMA_T> s1=element_association(){s+=","+s1;})* <RPAREN_T> { return "("+s+")";} +} + +QCString alias_declaration() : {QCString s,s1,s2;} +{ + <ALIAS_T> s2=alias_designator() + [ <COLON_T>{ s+=":"; } s1=subtype_indication() { s+=s1; }] + <IS_T> { s+=" is "; } s1=name() {s+=s1;} [s1=signature() {s+=s1;}] + <SEMI_T> +{ + addVhdlType(s2.data(),getLine(ALIAS_T),Entry::VARIABLE_SEC,VhdlDocGen::ALIAS,0,s.data(),Public); + + return s2+" "+s+";"; +} + } + +QCString alias_designator() : {Token *tok=0;QCString s;} +{ + s=identifier() { return s;} + | tok=<CHARACTER_LITERAL> { return tok->image.c_str(); } + | s=operator_symbol() { return s; } +} + +void allocator() :{} +{ + LOOKAHEAD(3) + <NEW_T> qualified_expression() + | <NEW_T> subtype_indication() +} + +void architecture_body() : {QCString s,s1;} +{ + + <ARCHITECTURE_T> s=identifier() <OF_T> s1=name() <IS_T> + { + QCString t=s1+"::"+s; + genLabels.resize(0); + pushLabel(genLabels,s1); + lastCompound=current; + addVhdlType(t,getLine(ARCHITECTURE_T),Entry::CLASS_SEC,VhdlDocGen::ARCHITECTURE,0,0,Private); + } + try{ + architecture_declarative_part() + }catch(...){error_skipto(BEGIN_T);} + <BEGIN_T> + architecture_statement_part() + <END_T> [<ARCHITECTURE_T>] [name()] <SEMI_T> + { lastEntity=0;lastCompound=0; genLabels.resize(0); } +} + +void architecture_declarative_part() : {} +{ + (block_declarative_item() )* + // | (<VHDL2008TOOLDIR>) +} + +void architecture_statement_part() : {} +{ + (concurrent_statement())* + // | (<VHDL2008TOOLDIR>) +} + +QCString array_type_definition (): { QCString s;} +{ + + LOOKAHEAD(unconstraint_array_definition()) + + s=unconstraint_array_definition() {return s;} + | s=constraint_array_definition() {return s;} + +} + +QCString assertion() : {QCString s,s1,s2;Token *t=0;Token *t1=0;} +{ + <ASSERT_T> s=condition() [ t=<REPORT_T> s1=expression() ] [t1=<SEVERITY_T> s2=expression()] + { + s.prepend("assert "); + if(t) s1.prepend(" report "); + if(t1) s2.prepend(" report "); + return s+s1+s2; + } +} + +QCString assertion_statement() : {QCString s,s1,s2;Token *t=0;} +{ + [ s=label() t=<COLON_T> ] s1=assertion() <SEMI_T> + { + if(t) s+=":"; + return s+s1+";"; + } +} +QCString association_element() : {QCString s,s1;} +{ + [LOOKAHEAD(formal_part() <ARROW_T>) s=formal_part() <ARROW_T> ] s1=actual_part() + { return s+" => "+s1;} +} + +QCString association_list (): {QCString s,s1;} +{ +s=association_element() (<COMMA_T> s1=association_element() { s+=","+s1; })* { return s; } +} + +QCString attribute_declaration() : {QCString s,s1;} +{ + <ATTRIBUTE_T> s=identifier() <COLON_T> s1=type_mark() <SEMI_T> + { + addVhdlType(s.data(),getLine(ATTRIBUTE_T),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,s1.data(),Public); + return " attribute "+s+":"+s1+";"; + } + } + +QCString attribute_designator (): {QCString s;Token *tok;} +{ + s=identifier() { return s;} + | tok=<RANGE_T> { return tok->image.c_str(); } +} + +QCString attribute_name (): {QCString s,s1;} +{ + s=identifier() <APOSTROPHE_T> s1=name(){ s+="'"+s1; }[LOOKAHEAD(1)<LPAREN_T>s1=expression() <RPAREN_T> {s+"("+s1+")";}] { return s; } +} + + +QCString attribute_specification(): {QCString s,s1,s2;} +{ + <ATTRIBUTE_T> s=attribute_designator() <OF_T> s1=entity_specification() <IS_T> s2=expression() <SEMI_T> + { + QCString t= s1+" is "+s2; + addVhdlType(s.data(),getLine(ATTRIBUTE_T),Entry::VARIABLE_SEC,VhdlDocGen::ATTRIBUTE,0,t.data(),Public); + return " attribute "+s+" of "+s1+ " is "+s2+";"; + } +} + +QCString base() : {Token *tok;} +{ + tok=<INTEGER> { return tok->image.c_str();} +} + +QCString base_specifier (): {Token *tok;} +{ + tok=<BASIC_IDENTIFIER> { return tok->image.c_str();} +} + +QCString base_unit_declaration() : +{QCString s;} +{ + s=identifier() { return s; } +} + +QCString based_integer() : {Token *tok;} +{ + tok=<BASIC_IDENTIFIER> { return tok->image.c_str();} +} + +QCString based_literal(): {Token *tok;} +{ + tok=<BASED_LITERAL> { return tok->image.c_str();} +} + +QCString basic_identifier() : {Token *tok;} +{ + tok=<BASIC_IDENTIFIER> { return tok->image.c_str();} +} + +void binding_indication() : {} +{ + [ <USE_T> entity_aspect() ] + [ generic_map_aspect() ] + [ port_map_aspect() ] +} + +QCString bit_string_literal (): {Token *tok;} +{ + tok=<BIT_STRING_LITERAL> { return tok->image.c_str();} +} + + +QCString bit_value() : {Token *tok;} +{ + tok=<BASIC_IDENTIFIER> { return tok->image.c_str();} +} + +void block_configuration() : {} +{ + <FOR_T> block_specification() + ( use_clause() )* + ( configuration_item())* + <END_T> <FOR_T> <SEMI_T> +} + +void block_declarative_item (): {} +{ + subprogram_declaration() +//| subprogram_body() +| type_declaration() +| subtype_declaration() +| constant_declaration() +| signal_declaration() +| variable_declaration() +| file_declaration() +| alias_declaration() +| component_declaration() +| +LOOKAHEAD(attribute_declaration()) +attribute_declaration() +| attribute_specification() +| configuration_specification() +| disconnection_specification () +| use_clause() +| +LOOKAHEAD(3) +group_template_declaration() +| group_declaration() +| <VHDL2008TOOLDIR> +} + +void block_declarative_part() : {} +{ + (block_declarative_item() )* +} + +void block_header() : {} +{ +[LOOKAHEAD(generic_clause()) generic_clause()[ generic_map_aspect() <SEMI_T> ] ] +[ port_clause() [ port_map_aspect() <SEMI_T> ] ] +} + +void block_specification() : {} +{ + name()[LOOKAHEAD(1) <LPAREN_T> index_specification() <RPAREN_T>] +} + +void block_statement() : {QCString s;} +{ + s=identifier() <COLON_T> + <BLOCK_T> { pushLabel(genLabels,s); }[ <LPAREN_T> expression() <RPAREN_T> ] [ <IS_T> ] + block_header() + block_declarative_part() + <BEGIN_T> + block_statement_part() + <END_T> <BLOCK_T> [ identifier() ] <SEMI_T> + { + genLabels=popLabel(genLabels); + } +} + +void block_statement_part() : {} +{ + ( concurrent_statement() )* +} + +void case_statement() : {QCString s;} +{ +[ identifier() <COLON_T> ] + <CASE_T> s=expression() + { + QCString ca="case "+s; + FlowChart::addFlowChart(FlowChart::CASE_NO,0,ca); + } + <IS_T> + case_statement_alternative() + ( case_statement_alternative ())* + <END_T> <CASE_T> [ identifier() ] <SEMI_T> + { + FlowChart::moveToPrevLevel(); + FlowChart::addFlowChart(FlowChart::END_CASE,"end case",0); + } +} + +void case_statement_alternative() : {QCString s;} +{ + <WHEN_T> s=choices() <ARROW_T> + { + QCString t="when "; + t+=s+"=> "; + FlowChart::addFlowChart(FlowChart::WHEN_NO,s.data(),t); + } + sequence_of_statement(){FlowChart::moveToPrevLevel(); } +} + +QCString character_literal() : {Token *tok;} +{ + tok=<CHARACTER_LITERAL>{ return tok->image.c_str();} +} + +QCString choice() : {QCString s;} +{ + LOOKAHEAD(simple_expression()) + s=simple_expression(){ return s; } + | + LOOKAHEAD(discrete_range()) + s=discrete_range(){ return s; } + | + LOOKAHEAD(identifier()) + s=identifier(){ return s; } + | <OTHER_T> { return " others "; } +} + +QCString choices() : {QCString s,s1;} +{ + s=choice() (<BAR_T> s1=choice(){s+="|";s+=s1;})* { return s; } +} + +void component_configuration () :{} +{ + <FOR_T> component_specification() + [ binding_indication() <SEMI_T> ] + [ block_configuration() ] + <END_T> <FOR_T> <SEMI_T> +} +void component_declaration() : {QCString s;} +{ + <COMPONENT_T> s=identifier() [ <IS_T> ] + { currP=VhdlDocGen::COMPONENT; } + [ generic_clause() ] + [ port_clause() ] + { + addVhdlType(s.data(),getLine(COMPONENT_T),Entry::VARIABLE_SEC,VhdlDocGen::COMPONENT,0,0,Public); + currP=0; + } + <END_T> <COMPONENT_T> [ identifier() ] <SEMI_T> + +} + +void component_instantiation_statement() : {QCString s,s1;} +{ + +s=identifier() <COLON_T> + s1=instantiation_unit() + { + addCompInst(s.lower().data(),s1.lower().data(),0,getLine()); + } + [ LOOKAHEAD(generic_map_aspect()) generic_map_aspect() ] + [ port_map_aspect() ] <SEMI_T> +} + +void component_specification() : {} +{ +instantiation_list() <COLON_T> name() +} + +QCString composite_type_definition() : { QCString s,s1;} +{ + s=array_type_definition(){ return s; } +| record_type_definition(){ return s; } +} + +void concurrent_assertion_statement() : {} +{ +[ LOOKAHEAD(2) identifier() <COLON_T> ] [ <POSTPONED_T> ] assertion() <SEMI_T> +} + +void concurrent_procedure_call_statement() : {} +{ +[ LOOKAHEAD(2) identifier() <COLON_T> ] [ <POSTPONED_T> ] procedure_call() <SEMI_T> +} + +void concurrent_signal_assignment_statement() : {} +{ +[ LOOKAHEAD(2) identifier() <COLON_T> ] [<POSTPONED_T> ] +( +LOOKAHEAD(conditional_signal_assignment() ) + conditional_signal_assignment() +| selected_signal_assignment() + +) +} + +void concurrent_statement() : {} +{ + +// try { +LOOKAHEAD([identifier() ":"] <BLOCK_T>) +block_statement() +| +LOOKAHEAD([identifier() ":"] [<POSTPONED_T>] <PROCESS_T>) +process_statement() +| +LOOKAHEAD(generate_statement()) +generate_statement() +| +case_scheme() +| +LOOKAHEAD([identifier() ":"] [<POSTPONED_T>] <ASSERT_T>) +concurrent_assertion_statement() +| +LOOKAHEAD(concurrent_signal_assignment_statement()) + concurrent_signal_assignment_statement() +| +LOOKAHEAD(component_instantiation_statement() ) +component_instantiation_statement() +| +LOOKAHEAD(concurrent_procedure_call_statement()) +concurrent_procedure_call_statement() +| <VHDL2008TOOLDIR> + /* + catch( ParseException e ) + { + error_skipto(SEMI_T, "syntax error in declarative item"); + } + */ +} + +QCString condition() : {QCString s;} +{ + s=expression() { return s; } +} + +QCString condition_clause() : {QCString s;} +{ + <UNTIL_T> s=condition() + { + return " until "+s; + } +} + +void conditional_signal_assignment() : {} +{ + // LOOKAHEAD( target() "<=" options_() conditional_waveforms() ";") + target() <LESSTHAN_T> options() conditional_waveforms() <SEMI_T> +} + +void conditional_waveforms() : {} +{ +waveform() + ( LOOKAHEAD(<WHEN_T> condition() <ELSE_T>) + <WHEN_T> condition() <ELSE_T> waveform() )* + [ <WHEN_T> condition() ] +} + +// ( waveform() < WHEN_T> condition() <ELSE_T> )* +// waveform() [ <WHEN_T> condition() ] + +//waveform() + // ( LOOKAHEAD( <WHEN> condition() <ELSE>) + // <WHEN> condition() <ELSE> waveform() )* + //[ <WHEN> condition() ] + +void configuration_declaration() : {QCString s,s1;} +{ + <CONFIGURATION_T> s=identifier() <OF_T> s1=name() <IS_T> + { + + confName=s+"::"+s1; + addVhdlType(s.data(),getLine(CONFIGURATION_T),Entry::VARIABLE_SEC,VhdlDocGen::CONFIG,"configuration",s1.data(),Public); + } + configuration_declarative_part() + block_configuration() + <END_T> [ <CONFIGURATION_T> ] [ name() ] <SEMI_T> + { genLabels.resize(0); confName="";} +} + +void configuration_declarative_item() : {} +{ + use_clause() +| attribute_specification() +| group_declaration() +} + +void configuration_declarative_part() : {} +{ + (configuration_declarative_item())* +} + +void configuration_item (): {} +{ + LOOKAHEAD(component_configuration()) + component_configuration() + | block_configuration() + +} + +void configuration_specification() : {} +{ +<FOR_T> component_specification() binding_indication() <SEMI_T> +} + +QCString constant_declaration() : {QCString s,s1,s2;Token *t=0;} +{ + <CONSTANT_T> s=identifier_list() <COLON_T> s1= subtype_indication() [ t=<VARASSIGN_T> s2=expression() ] <SEMI_T> + { + if(t) + s2.prepend(":="); + QCString it=s1+s2; + addVhdlType(s.data(),getLine(CONSTANT_T),Entry::VARIABLE_SEC,VhdlDocGen::CONSTANT,0,it.data(),Public); + it.prepend("constant "); + return it; + } +} + +QCString constraint_array_definition (): {QCString s,s1;} +{ +<ARRAY_T> s=index_constraint() <OF_T> s1=subtype_indication(){ return s+" "+s1;} +} + +void context_clause (): {} +{ + (context_item())* +} + +QCString constraint () :{QCString s;} + { + LOOKAHEAD(range_constraint()) + s=range_constraint(){ return s;} + | + LOOKAHEAD(index_constraint()) + s=index_constraint(){ return s;} +} + +void context_item() : {} +{ + library_clause() +| use_clause() +} + +QCString decimal_literal() : {Token *tok;} +{ + tok=<DECIMAL_LITERAL> { return tok->image.c_str(); } +} + + +QCString delay_mechanism (): {QCString s;} +{ +<TRANSPORT_T> { return " transport ";} +| [ <REJECT_T> s=expression() {s.prepend(" reject ");}] <INERTIAL_T> { return s+" inertial "; } +} + +void design_file() : {} +{ + (design_unit() )+ {} + | <EOF> +} + +void design_unit() : {} +{ + context_clause()library_unit() + +} + +QCString designator() : {QCString s;} +{ + s=identifier() {return s;} + | s=operator_symbol(){return s;} +} + +QCString direction (): {Token *tok;} +{ +tok=<TO_T> { return tok->image.c_str();} +| tok=<DOWNTO_T> { return tok->image.c_str();} +} + +void disconnection_specification() : {} +{ +<DISCONNECT_T> guarded_signal_specificatio() <AFTER_T> expression() <SEMI_T> +} + +void guarded_signal_specificatio() : {} +{ + signal_list() <COLON_T> name() +} + +QCString discrete_range() : {QCString s;} +{ + LOOKAHEAD(range()) + s=range() { return s;} + | + LOOKAHEAD(subtype_indication()) + s=subtype_indication() { return s;} +} + +QCString element_association() : {QCString s,s1;} +{ +[LOOKAHEAD(choices() <ARROW_T>) s=choices() <ARROW_T> ] s1=expression() + { +if(!s.isEmpty()) + return s+"=>"+s1; +return s1; + } +} + +QCString element_declaration() : {QCString s,s1;} +{ +s=identifier_list() <COLON_T> s1=subtype_indication() <SEMI_T> {return s+":"+s1;} +} + + +QCString entity_aspect() : {Token *tok;QCString s,s1;} +{ +tok=<ENTITY_T> s=name() [ LOOKAHEAD(1)<LPAREN_T> s1=identifier() <RPAREN_T> {s+="("+s1+")";} ] { return s;} +| tok=<CONFIGURATION_T> s=name() { return tok->image.c_str()+s;} +| tok=<OPEN_T> { return tok->image.c_str(); } +} + +QCString entity_class() : {} +{ +<ENTITY_T> { return "entity";} +| <ARCHITECTURE_T> {return "architecture";} +| <CONFIGURATION_T> {return "configuration";} +| <PROCEDURE_T> {return "procedure";} +| <FUNCTION_T> {return "function";} +| <PACKAGE_T> {return "package";} +| <TYPE_T> {return "type";} +| <SUBTYPE_T> {return "subtype";} +| <CONSTANT_T> {return "constant";} +| <SIGNAL_T> {return "signal";} +| <VARIABLE_T> {return "variable";} +| <COMPONENT_T> {return "component";} +| <LABEL_T> {return "label";} +| <LITERAL_T> {return "literal";} +| <UNITS_T> {return "units";} +| <GROUP_T> {return "group";} +| <FILE_T> {return "file";} +} + +QCString entity_class_entry() : {QCString s;} +{ + s=entity_class() [ <BOX_T> {s+="<>";} ] { return s;} +} + +QCString entity_class_entry_list() : {QCString s,s1,s2;} +{ + ( s1=entity_class_entry() {s+=s1;} )(<COMMA_T> s=entity_class_entry(){s2+=",";s2+=s;} )* { return s1+s2;} +} + +void entity_declaration() : {QCString s;} +{ + // try{ + <ENTITY_T> s=identifier() <IS_T> + { + lastEntity=current; + lastCompound=0; + addVhdlType(s.data(),getLine(ENTITY_T),Entry::CLASS_SEC,VhdlDocGen::ENTITY,0,0,Public); + } + entity_header() + entity_declarative_part () + [ <BEGIN_T> entity_statement_part() ] + <END_T> [ <ENTITY_T> ] [ name() ] + // }catch(...){error_skipto(SEMI_T);} + <SEMI_T> + { lastEntity=0;lastCompound=0; genLabels.resize(0); } +} + +void entity_declarative_item() : {} +{ +subprogram_declaration() +//| subprogram_body() +| type_declaration() +| subtype_declaration() +| constant_declaration() +| signal_declaration() +| variable_declaration() +| file_declaration() +| alias_declaration() +| +LOOKAHEAD(attribute_declaration()) +attribute_declaration() +| attribute_specification() +| disconnection_specification() +| use_clause() +| +LOOKAHEAD(3) +group_template_declaration() +| group_declaration() +| +LOOKAHEAD(5) + package_instantiation_declaration() +|package_declaration() +| <VHDL2008TOOLDIR> +} + +void entity_declarative_part() : {} +{ + (entity_declarative_item() )* +} + +QCString entity_designator() : {QCString s,s1;} +{ +s=entity_tag() [ s1=signature() ] { return s+s1;} +} + +void entity_header() : {} +{ + [ { currP=VhdlDocGen::GENERIC;parse_sec=GEN_SEC; } generic_clause()] + [ { currP=VhdlDocGen::PORT; } port_clause()] +} + +QCString entity_name_list() : {QCString s,s1;} +{ +(s1=entity_designator() {s+=s1;})+ { return s;} +| <OTHER_T> { return "other";} +| <ALL_T> {return "all";} +} + +QCString entity_specification() : {QCString s,s1;} +{ +s=entity_name_list() <COLON_T> s1=entity_class(){ return s+":"+s1;} +} + +void entity_statement() : {} +{ +LOOKAHEAD(concurrent_assertion_statement()) +concurrent_assertion_statement() +| +LOOKAHEAD(process_statement()) + process_statement() +| concurrent_procedure_call_statement() + +} + +void entity_statement_part() : {} +{ + (entity_statement())* +} + + +QCString entity_tag (): {QCString s;} +{ +s=name() { return s;} +| s=character_literal() { return s;} +} + +QCString enumeration_literal() : {QCString s;} +{ + s=identifier() { return s;} + | s=character_literal() { return s;} +} + +QCString enumeration_type_definition() : {QCString s,s1;} +{ + <LPAREN_T>s=enumeration_literal() (LOOKAHEAD(1)<COMMA_T> s1=enumeration_literal() {s+=",";s+=s1;} )* <RPAREN_T> + { return "("+s+")";} +} + +QCString exit_statement() : {QCString s,s1,s2;Token *t=0;Token *t1=0;} +{ +[ s=identifier() t=<COLON_T> ] <EXIT_T> [ s1=identifier() ] +[ t1=<WHEN_T> s2=condition() ] <SEMI_T> +{ + lab.resize(0); + if(t) s+=":"; + if(t1) s2.prepend(" when "); + FlowChart::addFlowChart(FlowChart::EXIT_NO,"exit",s2.data(),s1.data()); + + return s+s1+s2+";"; +} +} + +QCString expression (): {QCString s,s1,s2;} +{ +s=relation() ( s1=logop() s2=relation() {s+=s1;s+=s2;} )* +{ return s; } +} + +QCString logop() : {} +{ + <AND_T> { return "and" ;} + |<NAND_T> { return "nand" ;} + |<NOR_T> { return "nor" ;} + |<XNOR_T> { return "xnor" ;} + |<XOR_T> { return "xor" ;} + |<OR_T> { return "or" ;} + } + +QCString extended_identifier (): {Token *t;} +{ + t=<EXTENDED_CHARACTER> { return t->image.c_str(); } +} + +QCString factor(): {QCString s,s1;} +{ +s=primary() [LOOKAHEAD(1) <DOUBLEMULT_T> s1=primary(){ s+="**";s+=s1;} ] { return s;} +| <ABS_T> s=primary(){ s1 = "abs "; return s1+s; } +| <NOT_T> s=primary(){s1="not ";return s1+s;} +} + +QCString file_declaration() : {QCString s,s1,s2,s3;} +{ + <FILE_T> s=identifier_list() <COLON_T> s2=subtype_indication() [ s3=file_open_information() ] <SEMI_T> + { + QCString t1=s2+" "+s3; + addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,t1.data(),Public); + return " file "+s+":"+s2+" "+s3+";"; + } + } + +QCString file_logical_name(): {QCString s;} +{ + s=expression() { return s; } +} + +QCString file_open_information() : {QCString s,s1,s2;} +{ + [ <OPEN_T> s=expression() ] <IS_T> s1=file_logical_name() {s2="open "+s+" is "+s1; return s2; } +} + +QCString file_type_definition() : {QCString s,s1;} +{ + <FILE_T> <OF_T> s=type_mark() { s1=" file of "+s; return s1;} +} + +QCString floating_type_definition() : {QCString s;} +{ + s=range_constraint(){ return s;} +} + +QCString formal_designator() : {QCString s;Token *tok;} +{ + s=name() { return s; } + |tok=<INTEGER> { return tok->image.c_str();} +} + + +QCString formal_parameter_list() : {QCString s;} +{ + s=interface_list(){ return s; } +} + +QCString formal_part() : {QCString s,s1;} +{ +s=name() [<LPAREN_T> formal_designator() <RPAREN_T> {s+"("+s1+")";}] {return s;} +} + +QCString full_type_declaration() : {QCString s,s1,s2;} +{ +<TYPE_T> s=identifier() <IS_T> + try{ + s2=type_definition() + }catch(...){error_skipto(SEMI_T);} + <SEMI_T> + { + addVhdlType(s.data(),getLine(TYPE_T),Entry::VARIABLE_SEC,VhdlDocGen::TYPE,0,s2.data(),Public); + return "type "+s+" is "+s2+";"; + } +} + +QCString function_call() : {QCString s,s1;} +{ +s=name() <LPAREN_T> s1=actual_parameter_part() <RPAREN_T> { return s+"("+s1+")";} +} + +void generate_statement() : {QCString s;} +{ +s=identifier() <COLON_T> + try{ + generate_scheme() <GENERATE_T> + { pushLabel(genLabels,s); } + generate_statement_body1() + <END_T> + }catch(...){error_skipto(GENERATE_T);} + <GENERATE_T> [ identifier() ] <SEMI_T> {genLabels=popLabel(genLabels); } +} + +void generate_scheme() : {} +{ +<FOR_T> parameter_specification() +| <IF_T> condition() +} + +void generic_clause() : {QCString s;} +{ + <GENERIC_T> <LPAREN_T> { parse_sec=GEN_SEC; } s=generic_list() <RPAREN_T> <SEMI_T> { parse_sec=0; } +} + +QCString generic_list() : {QCString s;} +{ + s=interface_list() { return s; } +} + +void generic_map_aspect() : {} +{ + <GENERIC_T> <MAP_T> <LPAREN_T> association_list() <RPAREN_T> +} + +QCString group_constituent() : {QCString s;} +{ + s=name() { return s; } + | s=character_literal() { return s;} +} + +QCString group_constituent_list() : {QCString s,s1,s2;} +{ + (s1=group_constituent())(<COMMA_T> s=group_constituent(){s2+=",";s2+=s1;})* { return s+s2;} +} + +QCString group_declaration() : {QCString s,s1,s2;} +{ + <GROUP_T> s=identifier() <COLON_T> s1=identifier() <LPAREN_T> s2=group_constituent_list() <RPAREN_T> <SEMI_T> + { + return "group "+s+":"+s1+"("+s2+");"; + } +} + +QCString group_template_declaration() : {QCString s,s1;} +{ + <GROUP_T> s=identifier() <IS_T> <LPAREN_T> s1=entity_class_entry_list() <RPAREN_T> <SEMI_T> + { + return "group "+s+ "is ("+s1+");"; + } + } + +void guarded_signal_specification() : {} +{ + signal_list() <COLON_T> type_mark() +} + +QCString identifier() : {Token *tok;} +{ + tok=<EXTENDED_CHARACTER>{ return tok->image.c_str(); } + |tok=<BASIC_IDENTIFIER> { return tok->image.c_str(); } +} + +QCString identifier_list() : {QCString str,str1;} +{ + str=identifier() (<COMMA_T> str1=identifier() {str+=",";str+=str1;})* { return str; } +} + +void if_statement() : {QCString s,s1;} +{ +[LOOKAHEAD(1) identifier() <COLON_T> ] + <IF_T> s=condition() <THEN_T> + { + s.prepend("if "); + FlowChart::addFlowChart(FlowChart::IF_NO,0,s); + } + sequence_of_statement() + ( + <ELSIF_T> s1=condition() <THEN_T> + { + s1.prepend("elsif "); + FlowChart::addFlowChart(FlowChart::ELSIF_NO,0,s1.data()); + } + sequence_of_statement() + )* + [LOOKAHEAD(1) <ELSE_T> + { + FlowChart::addFlowChart(FlowChart::ELSE_NO,0,0); + } + sequence_of_statement() ] <END_T> <IF_T> [ identifier() ] <SEMI_T> + { + FlowChart::moveToPrevLevel(); + FlowChart::addFlowChart(FlowChart::ENDIF_NO,0,0); + } +} + +QCString incomplete_type_declaration() : {QCString s;} +{ + <TYPE_T> s=identifier() <SEMI_T> + { + return "type "+s+";"; + } +} + +QCString index_constraint() : {QCString s="("; QCString s1,s2;} +{ + //try{ + <LPAREN_T> s2=discrete_range(){s+=s2;}(LOOKAHEAD(1)<COMMA_T> s1=discrete_range(){s+=",";s+=s1;})* <RPAREN_T> {return s+")";} +//}catch(...){ error_skipto(SEMI_T);hasError=false;return "";} + } + +QCString index_specification() : {QCString s;} +{ + LOOKAHEAD( discrete_range()) + s=discrete_range() { return s;} +| s=expression(){ return s;} +} + +QCString index_subtype_definition() : {QCString s;} +{ + s=type_mark() <RANGE_T> <BOX_T> { return s+" range <> ";} +} + +QCString instantiation_unit() : {QCString s,s1,s2;Token *tok;} +{ +[ tok=<COMPONENT_T> ] s=identifier() {s1="component"; return s; } +| tok=<ENTITY_T> s2=name() {s=tok->image.c_str()+s2;} [ <LPAREN_T> s1=identifier() <RPAREN_T> {s+="(";s+=s1;s+=")" ;}] { return s;} +| <CONFIGURATION_T> s=name() {s1="configuration ";return s;} +} + +QCString instantiation_list() : {QCString s;Token *tok;} +{ + s=identifier_list() { return s;} +| tok=<OTHER_T> {return tok->image.c_str();} +| tok=<ALL_T> {return tok->image.c_str();} +} + +QCString integer() : {Token *t;} +{ + t=<INTEGER> {return t->image.c_str();} +} + +QCString integer_type_definition() : {QCString s;} +{ + s=range_constraint(){ return s;} +} + +QCString interface_declaration() : {QCString s,s1;} +{ + +LOOKAHEAD(5) + s=interface_subprogram_declaration() { return s;} + +|interface_package_declaration() { return s;} +| + LOOKAHEAD(5) + s=interface_variable_declaration() { return s;} +| +LOOKAHEAD(5) +interface_file_declaration() { return s;} +| +LOOKAHEAD(subprogram_declaration()) +subprogram_declaration() { return s;} +| + s=object_class() s1=identifier() + { + if (parse_sec==GEN_SEC) + addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,currP,s1.data(),0,Public); + return s; + } +} + +QCString interface_element() : {QCString s;} +{ +s=interface_declaration(){ return s;} +} + +QCString interface_file_declaration() : {QCString s,s1;} +{ +<FILE_T> s=identifier_list() <COLON_T> s1=subtype_indication() +{ + addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::VFILE,0,s1.data(),Public); + return " file "+s+":"+s1; +} +} + +QCString interface_list() : {QCString s,s1,s2;} +{ +s=interface_element() (LOOKAHEAD(1) <SEMI_T> s1=interface_element(){s2+=";";s2+=s1;})* { return s+s2;} +} + + + +QCString interface_variable_declaration() : {Token *tok=0;Token *tok1=0;Token *tok2=0;QCString s,s1,s2,s3,s4,s5;} +{ +[( tok=<VARIABLE_T> | tok=<SIGNAL_T> | tok=<CONSTANT_T>|tok=<SHARED_T>) ] + s=identifier_list() <COLON_T> [ s1=mode() ] + s2=subtype_indication() [ tok1=<BUS_T> ] [ tok2=<VARASSIGN_T> s4=expression() ] +{ + if(tok) + s5=tok->image.c_str(); + + if(tok1) + s3=tok->image.data(); + + if(tok2) + s3+=":="; + + QCString it=s+":"+s1+" "+s2+" "+s3+" "+s4; + if (currP!=VhdlDocGen::COMPONENT) + { + if (currP==VhdlDocGen::FUNCTION || currP==VhdlDocGen::PROCEDURE) + { + addProto(s5.data(),s.data(),s1.data(),s2.data(),s3.data(),s4.data()); + } + else + { + QCString i=s2+s3+s4; + if (currP==VhdlDocGen::GENERIC && param_sec==0) + addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,currP,i.data(),s1.data(),Public); + else if(parse_sec != GEN_SEC) + addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,currP,i.data(),s1.data(),Public); + } + // fprintf(stderr,"\n\n <<port %s >>\n",$$.data()); + } // if component + return it; + } +} + +QCString iteration_scheme() : {QCString s;} +{ +<WHILE_T> s=condition() +{ + s.prepend("while "); + FlowChart::addFlowChart(FlowChart::WHILE_NO,0,s.data(),lab.data()); + lab=""; + return s; +} +| <FOR_T> s=parameter_specification() +{ + QCString q=lab+" for "+s; + FlowChart::addFlowChart(FlowChart::FOR_NO,0,q.data(),lab.data()); + lab=""; + return q; +} +} + +QCString label() : {QCString s;} +{ + s=identifier() { return s;} +} + +QCString library_clause() : {QCString s;} +{ + (<LIBRARY_T> s=identifier_list() <SEMI_T> + ) + { + if ( parse_sec==0 && Config_getBool("SHOW_INCLUDE_FILES") ) + { + addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,s.data(),"_library_",Public); + } + QCString s1="library "+s; + return s1; + } +} + +QCString library_unit() : {QCString s;} +{ +LOOKAHEAD(2) +primary_unit() { return s; } +| secondary_unit() { return s; } +| context_declaration() + +} + +QCString literal() : {QCString s;} +{ + + LOOKAHEAD(bit_string_literal()) +s=bit_string_literal() { return s;} +| + LOOKAHEAD(numeric_literal()) + s=numeric_literal() { return s;} +| + +LOOKAHEAD(enumeration_literal()) +s=enumeration_literal() { return s;} +| s=string_literal() { return s;} +| <NULL_T> {return "null";} +} + +QCString logical_operator() : {QCString s;} +{ + s=logop() { return s;} +} + +QCString loop_statement() : {QCString s,s1,s2,s3;} +{ +[ s=identifier() <COLON_T> {s+=":";} ] + [ s1=iteration_scheme() ] + { + if(s1.isEmpty()) + FlowChart::addFlowChart(FlowChart::LOOP_NO,0,"infinite"); + } + <LOOP_T> + s2=sequence_of_statement() + <END_T> <LOOP_T> [ s3=identifier() ] <SEMI_T> + { + QCString q = s+" loop "+s2+" end loop" +s3; + QCString endLoop="end loop" + s3; + FlowChart::moveToPrevLevel(); + FlowChart::addFlowChart(FlowChart::END_LOOP,endLoop.data(),0); + return q; + } + +} + + +QCString miscellaneous_operator():{Token *t=0;} +{ + <DOUBLEMULT_T> {return "**";} + | <ABS_T> {return "abs";} + | <NOT_T> {return "not";} +} + +QCString mode() : {Token *tok;} +{ +tok=<IN_T> { return "in"; } +| tok=<OUT_T> { return "out"; } +| tok=<INOUT_T> { return "inout"; } +| tok=<BUFFER_T> { return "buffer"; } +| tok=<LINKAGE_T> { return "linkage"; } +} + +QCString multiplying_operation() : {Token *tok;} +{ +tok=<MULT_T> { return tok->image.c_str(); } +| tok=<SLASH_T> { return tok->image.c_str(); } +| tok=<MOD_T> { return tok->image.c_str(); } +| tok=<REM_T> { return tok->image.c_str(); } +} + + + QCString name() : {QCString s,s1;} +{ + ( + s=operator_symbol() + | s=identifier()| s=external_name() + ) + [LOOKAHEAD(name_ext1()) s1=name_ext1(){ s+=s1;}] { return s; } +} + +QCString name_ext1() : {QCString s,s1,s2;} + { + s=name_ext() (LOOKAHEAD(name_ext()) s1=name_ext(){s+=s1;})* { return s;} + } + + QCString name_ext() : {QCString s,s1,s2;} + { + + ( + LOOKAHEAD(<DOT_T> suffix()) + <DOT_T> s1=suffix(){s+=".";s+=s1;} +| + LOOKAHEAD(test_att_name()) + s1=test_att_name() { s+=s1;} + | + LOOKAHEAD( <LPAREN_T> discrete_range() <RPAREN_T>) + <LPAREN_T> s1=discrete_range() <RPAREN_T> {s+="(";s+=s1;s+=")";} + | + LOOKAHEAD( "(" expression() ("," expression() )* ")" ) + <LPAREN_T> s1=expression() {s+="(";s+=s1;} (LOOKAHEAD(1) <COMMA_T> s1=expression(){s+=",";s+=s1;})* <RPAREN_T> { s+=")";} + + ) + {return s;} + } + + QCString test_att_name() : {QCString s,s1;} + { + [ LOOKAHEAD(<LBRACKET_T>) s1=signature() {s=s1;}] + <APOSTROPHE_T> s1=attribute_designator() {s+="'";s+=s1;} + [LOOKAHEAD(1) <LPAREN_T> s1=expression() <RPAREN_T> {s+="(";s+=s1;s+=")";}] + { return s;} + } + + QCString indexed_name() : {QCString s,s1,s2;} + { + s2=identifier() <LPAREN_T> s1=expression(){s=s2+"("+s1;} (<COMMA_T> s1=expression(){s+=",";s+=s1;})* <RPAREN_T> {return s+")";} + } + +QCString next_statement() : {QCString s,s1,s2;Token *t=0;Token *t1=0;} +{ +[LOOKAHEAD(1) s=identifier() t=<COLON_T> ] <NEXT_T> [ s1=identifier() ] +[LOOKAHEAD(1) t1=<WHEN_T> s2=condition() ] <SEMI_T> +{ + if(t) s+=":"; + FlowChart::addFlowChart(FlowChart::NEXT_NO,"next ",s2.data(),s1.data()); + lab.resize(0); + if(t1) s2.prepend("when "); + return s+s1+s2+";"; +} +} + +QCString null_statement() : {QCString s;} +{ +[ s=identifier() <COLON_T> {s+=":";}] <NULL_T> <SEMI_T>{return s+="null";} +} + +QCString numeric_literal() : {QCString s;} +{ + + LOOKAHEAD(physical_literal()) + s=physical_literal(){ return s;} + | s=abstract_literal() { return s;} +} + +QCString object_class() : {} +{ +<CONSTANT_T> { return "constant"; } +|<SIGNAL_T> { return "signal"; } +|<VARIABLE_T> { return "variable"; } +|<SHARED_T> <VARIABLE_T> { return "shared variable"; } +|<FILE_T> { return "file"; } +|<TYPE_T> { return "type"; } +} + +QCString operator_symbol() : {Token *tok;} +{ +tok=<STRINGLITERAL> {return tok->image.c_str();} +} + +void options() : {} +{ + [ <GUARDED_T> ] [ delay_mechanism() ] +} + +void package_body() : {QCString s;} +{ +<PACKAGE_T> <BODY_T> s=name() <IS_T> + { + lastCompound=current; + s.prepend("_"); + addVhdlType(s,getLine(),Entry::CLASS_SEC,VhdlDocGen::PACKAGE_BODY,0,0,Protected); + } + package_body_declarative_part() + +<END_T> [<PACKAGE_T> <BODY_T> ] [ name() ] <SEMI_T> { lastCompound=0; genLabels.resize(0); } +} + +void package_body_declarative_item() : {} +{ +subprogram_declaration() +//| subprogram_body() +| type_declaration() +| subtype_declaration() +| constant_declaration() +| variable_declaration() +| file_declaration() +| alias_declaration() +| use_clause() +| +LOOKAHEAD(3) +group_template_declaration() +| group_declaration() +} + +void package_body_declarative_part() : {} +{ +(package_body_declarative_item() )* +} + +void package_declaration(): {QCString s;} +{ + + <PACKAGE_T> s=identifier() <IS_T> + { + lastCompound=current; + Entry *clone=new Entry(*current); + clone->section=Entry::NAMESPACE_SEC; + clone->spec=VhdlDocGen::PACKAGE; + clone->name=s; + clone->startLine=getLine(); + clone->bodyLine=getLine(); + clone->protection=Package; + current_root->addSubEntry(clone); + addVhdlType(s,getLine(),Entry::CLASS_SEC,VhdlDocGen::PACKAGE,0,0,Package); + } + package_declarative_part() +<END_T> [ <PACKAGE_T>] [ name() ] <SEMI_T> +{ lastEntity=0;lastCompound=0; genLabels.resize(0); } +} + +void geninter():{} +{ + [gen_interface_list() <SEMI_T> [gen_assoc_list() <SEMI_T>]] +} + +void package_declarative_item() : {} +{ +//LOOKAHEAD(3) +//interface_subprogram_declaration() +subprogram_declaration() +| type_declaration() +| subtype_declaration() +| constant_declaration() +| signal_declaration() +| variable_declaration() +| file_declaration() +| alias_declaration() +| component_declaration() +| +LOOKAHEAD(attribute_declaration()) + attribute_declaration() +| attribute_specification() +| disconnection_specification() +| use_clause() +| +LOOKAHEAD(3) + group_template_declaration() +| group_declaration() +| + LOOKAHEAD(5) + package_instantiation_declaration() +|package_declaration() + +} + +void package_declarative_part() : {} +{ + (package_declarative_item())* +} + +QCString parameter_specification() : {QCString s,s1;} +{ +s=identifier() <IN_T> s1=discrete_range(){ return s+" in "+s1;} +} + +QCString physical_literal() : {QCString s,s1;} +{ + [LOOKAHEAD(abstract_literal()) s=abstract_literal()] s1=name(){s+=" ";s+=s1;s.prepend(" "); return s;} +} + +QCString physical_type_definition() : {QCString s,s1,s2;} +{ + <UNITS_T> + s=identifier()<SEMI_T> + (s1=secondary_unit_declaration(){s2+=s1;s2+="#";})* + <END_T> <UNITS_T> [name()] + { + current->args=s2; + current->args.prepend("units"); + current->spec=VhdlDocGen::UNITS; + return s2; + } +} + +void port_clause() : {} +{ + <PORT_T> <LPAREN_T> port_list()<RPAREN_T> <SEMI_T>{ currP=0; } +} + +QCString port_list() : {QCString s;} +{ + s=interface_list(){return s;} +} + +void port_map_aspect() : {} +{ + <PORT_T> <MAP_T> <LPAREN_T> association_list() <RPAREN_T> +} + +QCString primary() : {QCString s,s1;} +{ +LOOKAHEAD(function_call()) +s=function_call() { return s;} +| +LOOKAHEAD(<LPAREN_T> expression() <RPAREN_T>) + <LPAREN_T> s1=expression() <RPAREN_T>{ s="("+s1+")"; return s;} +| +LOOKAHEAD(qualified_expression()) +s=qualified_expression() { return s;} +| +LOOKAHEAD(type_conversion()) +s=type_conversion() { return s;} +| +LOOKAHEAD(literal()) +s=literal() { s.prepend(" ");return s;} +| +LOOKAHEAD(name()) +s=name() { return s;} +| +allocator() { return "";} +| +s=aggregate() { return s; } +} + + +void primary_unit() : {} +{ +entity_declaration() +| configuration_declaration() +| +LOOKAHEAD(package_instantiation_declaration()) +package_instantiation_declaration() +| +LOOKAHEAD(4) + interface_package_declaration() +| package_declaration() + +} + +QCString procedure_call() : {QCString s,s1;} +{ + s=name() [ <LPAREN_T> s1=actual_parameter_part() <RPAREN_T>{ s1.prepend("("); s1.append(")");}] +{ return s+s1;} + } + +QCString procedure_call_statement() : {QCString s,s1;} +{ +[LOOKAHEAD(2) s=identifier() <COLON_T> { s+=":"; }] s1=procedure_call() <SEMI_T> +{ + return s+s1+";"; +} +} + +QCString process_declarative_item() : {QCString s;} +{ +subprogram_declaration() { return "";} +//| subprogram_body() +| s=type_declaration() { return s;} +| s=subtype_declaration() { return s;} +| s=constant_declaration() { return s;} +| s=variable_declaration() { return s;} +| s=file_declaration() { return s;} +| s=alias_declaration() { return s;} +| +LOOKAHEAD(3) +s=attribute_declaration() { return s;} +| s=attribute_specification() { return s;} +| s=use_clause() { return s;} +| +LOOKAHEAD(3) +s=group_template_declaration() { return s;} +| s=group_declaration() { return s;} +} + +QCString process_declarative_part() :{QCString s,s1;} +{ + ( s1=process_declarative_item(){s+=s1;} )* { return s;} +} + +void process_statement() : {QCString s,s1,s2;Token *tok=0;} +{ +[ s=identifier() <COLON_T> ] +[ <POSTPONED_T> ] + { + currP=VhdlDocGen::PROCESS; + current->startLine=getLine(); + current->bodyLine=getLine(); + } + <PROCESS_T> + //try{ + [ <LPAREN_T> (tok=<ALL_T> | s1=sensitivity_list()) <RPAREN_T> ] [ <IS_T> ] + s2=process_declarative_part() + { + if (s2.data()) + FlowChart::addFlowChart(FlowChart::VARIABLE_NO,s2.data(),0); + FlowChart::addFlowChart(FlowChart::BEGIN_NO,"BEGIN",0); + } + <BEGIN_T> + process_statement_part() + <END_T> [ <POSTPONED_T> ] + // }catch(...){error_skipto(PROCESS_T);} + <PROCESS_T> [ identifier() ] <SEMI_T> + { + if(s.isEmpty()) + currName=VhdlDocGen::getProcessNumber(); + else + currName=s; + + current->name=currName; + tempEntry=current; + current->endBodyLine=getLine(); + currP=0; + if(tok) + s1=tok->image.data(); + createFunction(currName,VhdlDocGen::PROCESS,s1.data()); + createFlow(); + currName=""; + newEntry(); +} +} + +void process_statement_part() : {} +{ + (sequential_statement())* +} + +QCString qualified_expression() : {QCString s,s1;} +{ + s1=identifier() <APOSTROPHE_T> {s=s1+"'";} + ( + LOOKAHEAD(aggregate()) + s1=aggregate(){s+=s1;} + | <LPAREN_T> s1=expression() <RPAREN_T>{s+="(";s+=s1;s+=")";} + ) + {return s;} +} + +QCString range() : {QCString s,s1,s2;} +{ + LOOKAHEAD( simple_expression() direction() simple_expression()) + s=simple_expression() s1=direction() s2=simple_expression(){return s+" "+s1+" "+s2;} + | + LOOKAHEAD(attribute_name()) + s=attribute_name(){ return s;} +} + +QCString range_constraint() : {QCString s,s1;} +{ +<RANGE_T> s=range(){return " range "+s;} +} + +void record_type_definition() : {} +{ + <RECORD_T> + // try{ + (element_declaration())+ + // }catch(...){error_skipto(END_T);} + <END_T> + <RECORD_T> [ name()] +} + +QCString relation() : {QCString s,s1,s2;} +{ + s=shift_expression() [LOOKAHEAD(1) s1=relation_operator() s2=shift_expression() ] {return s+s1+s2;} +} + +QCString relation_operator() : {} +{ + <LT_T> {return "<";} + |<GT_T> {return ">";} + |<EQU_T> {return "=";} + |<GREATERTHAN_T> {return ">=";} + |<LESSTHAN_T> {return "<=";} + |<NOTEQU_T> {return "/=";} + +} + +QCString report_statement() : {Token *t=0;Token *t1=0;QCString s,s1,s2;} +{ +[ s=identifier() t=<COLON_T> ] + <REPORT_T> s1=expression() + [ t1=<SEVERITY_T> s2=expression() ] <SEMI_T> + { + if(t) s.append(":"); + s1.prepend(" report "); + if(t1) s2.prepend(" severity "); + return s+s1+s2+";"; + } +} + +QCString return_statement() : {QCString s,s1;} +{ +[ s=identifier() <COLON_T> { s+=":";}] <RETURN_T> [ s1=expression() ] <SEMI_T> +{ return s+" return "+s1+";";} +} + +QCString scalar_type_definition() : {QCString s,s1;} +{ + +s=enumeration_type_definition(){ return s;} +| s=range_constraint() [LOOKAHEAD( physical_type_definition()) s1=physical_type_definition()] { s+=" ";s+=s1;return s;} +} + +void secondary_unit() : {} +{ +architecture_body() +| package_body() +} + +QCString secondary_unit_declaration() : {QCString s,s1;} +{ +s=identifier() <EQU_T> s1=physical_literal() <SEMI_T> { return s+"="+s1; } +} + +QCString selected_name() : {QCString s,s1;} +{ + s=identifier() <DOT_T> s1=suffix(){ return s+"."+s1;} +} + +void selected_signal_assignment() : {} +{ + <WITH_T> expression() <SELECT_T> + + target() < LESSTHAN_T> options() selected_waveforms() <SEMI_T> +} + +void selected_waveforms() : {} +{ + waveform() <WHEN_T> choices()(<COMMA_T> waveform() <WHEN_T> choices())* +} + +QCString sensitivity_clause() : {QCString s;} +{ + <ON_T> s=sensitivity_list() + { + s.prepend(" on "); + return s; + } +} + +QCString sensitivity_list() : {QCString s,s1;} +{ + s=name() (<COMMA_T> s1=name(){s+=",";s+=s1;} )* { return s;} +} + +QCString sequence_of_statement() : {QCString s,s1;} +{ + ( LOOKAHEAD(3) s1=sequential_statement() {s+=s1;} )* { return s;} +} + +QCString sequential_statement() :{QCString s;} +{ + LOOKAHEAD( [ identifier() ":" ] target() "<=") + s=signal_assignment_statement(){FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;} + | + LOOKAHEAD(3) + s=assertion_statement(){FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;} + | + LOOKAHEAD(3) + s=report_statement(){FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;} + | + LOOKAHEAD(3) + s=wait_statement(){FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;} + | + LOOKAHEAD( [ identifier() ":" ] target() ":=" ) + s=variable_assignment_statement(){FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;} + | + LOOKAHEAD(3) + s=procedure_call_statement(){ FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s; } + | + LOOKAHEAD(3) + if_statement(){return s;} + | + LOOKAHEAD(3) + case_statement(){return s;} + | + LOOKAHEAD(3) + loop_statement(){return s;} + | + LOOKAHEAD(3) + s=next_statement() {return s;} + | + LOOKAHEAD(3) + s=exit_statement(){return s;} + | + LOOKAHEAD(3) + s=return_statement(){FlowChart::addFlowChart(FlowChart::RETURN_NO,s.data(),0);return s;} + | + s=null_statement(){FlowChart::addFlowChart(FlowChart::TEXT_NO,s.data(),0);return s;} +} + +QCString shift_expression() : {QCString s,s1,s2;} +{ + s=simple_expression() [ s1=shift_operator() s2=simple_expression() ] { return s+s1+s2;} +} +QCString shift_operator() : {} +{ + <SLL_T> { return "sll";} + | <SRL_T> { return "srl";} + | <SLA_T> { return "sla";} + | <SRA_T> { return "sra";} + | <ROL_T> { return "rol";} + | <ROR_T> { return "ror";} +} + +QCString sign() : {} +{ + <PLUS_T> { return "+";} + | <MINUS_T> { return "-";} +} + +QCString signal_assignment_statement() : {QCString s,s1,s2,s3;} +{ + + LOOKAHEAD(conditional_signal_assignment_wave()) + conditional_signal_assignment_wave(){ return ""; } +| + LOOKAHEAD(selected_signal_assignment_wave()) + selected_signal_assignment_wave() { return ""; } + | + [LOOKAHEAD(2) s=identifier() <COLON_T> {s+=":";} ] +s1=target() <LESSTHAN_T> +[ s2=delay_mechanism() ] +s3=waveform() <SEMI_T> +{ + return s+s1+"<="+s2+s3+";"; +} + +} + +void semi() : {} +{ +<SEMI_T> +} + +void signal_declaration() : { Token* tok=0;QCString s,s1,s2,s3,s4;} +{ +<SIGNAL_T> s=identifier_list() <COLON_T> s1=subtype_indication() [ s2=signal_kind() ] [ tok=<VARASSIGN_T> s3=expression() ] <SEMI_T> + { + if(tok) + s3.prepend(":="); + s4=s1+s2+s3; + addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::SIGNAL,0,s4.data(),Public); + } +} +QCString signal_kind() : {} +{ + <REGISTER_T> { return "register";} + | <BUS_T> { return "bus";} +} + +QCString signal_list() : {QCString s,s1;} +{ + s=name() (<COMMA_T> s1=name() { s+=",";s+=s1;})* +| <OTHER_T> { return "other";} +| <ALL_T> { return "all";} +} + +QCString signature() : {QCString s,s1,s2;} +{ +<LBRACKET_T> + [ s=name() (<COMMA_T> s1=name() {s+=",";s+=s1; })* ] + [ <RETURN_T> s1=name() {s+="return ";s+=s1;}] + <RBRACKET_T> + { s1="["+s+"]";return s1;} + } + +QCString simple_expression(): {QCString s,s1,s2;} +{ +[ s=sign() ] s1=term() {s+=s1;} ( LOOKAHEAD(adding_operator() term()) s1=adding_operator() s2=term() {s+=s1;s+=s2;})* { return s;} +} + +void simple_name() : {} +{ +name() +} + +QCString slice_name() : {QCString s,s1;} +{ + s=identifier() <LPAREN_T> s1=discrete_range() <RPAREN_T> {return s+"("+s1+")";} +} + +QCString string_literal() : {Token *tok;} +{ +tok=<STRINGLITERAL> {return tok->image.c_str();} +} + + void subprogram_body() : {QCString s;} +{ +//subprogram_specification() +<IS_T> + //try{ + s=subprogram_declarative_part() + { + if (s.data()) + { + FlowChart::addFlowChart(FlowChart::VARIABLE_NO,s,0); + } + FlowChart::addFlowChart(FlowChart::BEGIN_NO,"BEGIN",0); + } + // }catch(...){error_skipto(BEGIN_T);} +<BEGIN_T> +subprogram_statement_part() +<END_T> [ subprogram_kind() ] [ designator() ] <SEMI_T> + { + tempEntry->endBodyLine=getLine(END_T); + createFlow(); + currP=0; + } +} + +void subprogram_declaration() : {} +{ +LOOKAHEAD(subprogram_instantiation_declaration()) +subprogram_instantiation_declaration() +| +subprogram_specification()subprogram_1(){currP=0;} +} + +void subprogram_1() : {} +{ + + subprogram_body() + | <SEMI_T> +} + +QCString subprogram_declarative_item() : {QCString s;} +{ +subprogram_declaration(){ return "";} +|s=type_declaration(){ return s;} + | subprogram_body(){ return "";} +| s=subtype_declaration(){ return s;} +| s=constant_declaration(){ return s;} +| s=variable_declaration(){ return s;} +| s=file_declaration(){ return s;} +| s=alias_declaration(){ return s;} +| +LOOKAHEAD(attribute_declaration()) +s=attribute_declaration(){ return s;} +| s=attribute_specification(){ return s;} +| s=use_clause(){ return s;} +| +LOOKAHEAD(3) +s=group_template_declaration(){ return s;} +| s=group_declaration() { return s;} +} + +QCString subprogram_declarative_part() : {QCString s,s1;} +{ + (s1=subprogram_declarative_item(){s+=s1;})* { return s;} +} + +void subprogram_kind() : {} +{ + <FUNCTION_T> + |<PROCEDURE_T> +} + +void subprogram_specification() : {QCString s;Token *tok=0;Token *t;} +{ + <PROCEDURE_T> s=designator() + { + currP=VhdlDocGen::PROCEDURE; + createFunction(s.data(),currP,0); + tempEntry=current; + current->startLine=getLine(PROCEDURE_T); + current->bodyLine=getLine(PROCEDURE_T); + + } [LOOKAHEAD(1) <LPAREN_T> { param_sec=PARAM_SEC; } interface_list() { param_sec=0; }<RPAREN_T> ] + [LOOKAHEAD(2) gen_interface_list()] + [ LOOKAHEAD(2) gen_assoc_list()] + param() + { newEntry(); } +| + [ (tok=<PURE_T> | tok=<IMPURE_T>) ] t=<FUNCTION_T> s=designator() + { + currP=VhdlDocGen::FUNCTION; + if(tok) + createFunction(tok->image.c_str(),currP,s.data()); + else + createFunction(0,currP,s.data()); + tempEntry=current; + current->startLine=getLine(FUNCTION_T); + current->bodyLine=getLine(FUNCTION_T); + } + [{ param_sec=PARAM_SEC; } <LPAREN_T> formal_parameter_list() <RPAREN_T> { param_sec=0; }] + <RETURN_T> s=type_mark() + { + tempEntry=current; + current->type=s; + newEntry(); + } +} + +void subprogram_statement_part() : {} +{ + (sequential_statement())* +} + +QCString subtype_declaration() : {QCString s,s1;} +{ +<SUBTYPE_T> s=identifier() <IS_T> s1=subtype_indication() <SEMI_T> + { + addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::SUBTYPE,0,s1.data(),Public); + return " subtype "+s+" is "+s1+";"; + } +} + +QCString subtype_indication() : {QCString s,s1,s2;} +{ + s=name() + [LOOKAHEAD (name()) s1=name()] [LOOKAHEAD(constraint() ) s2=constraint()] + {return s+" "+s1+" "+s2;} +} + +QCString suffix() : {QCString s;} +{ +LOOKAHEAD(name()) +s=name() { return s;} +| s=character_literal() { return s;} +| s=operator_symbol(){ return s;} +| <ALL_T> {return " all ";} +} + +QCString target() : {QCString s;} +{ + s=name(){ return s;} +| s=aggregate() { return s;} +} + +QCString term() : {QCString s,s1,s2;} +{ + s=factor() ( LOOKAHEAD(2) s1=multiplying_operation() s2=factor(){s+=s1;s+=s2;} )* { return s;} +} + +QCString timeout_clause() : {QCString s;} +{ +<FOR_T> s=expression() +{ + return " for "+s; +} +} + +QCString type_conversion() : {QCString s,s1;} +{ + s=name() <LPAREN_T> s1=expression() <RPAREN_T> { return s+"("+s1+")";} +} + +QCString type_declaration() : {QCString s;} +{ +LOOKAHEAD(3) +s=full_type_declaration(){ return s;} +| s=incomplete_type_declaration(){ return s;} +} + +QCString type_definition() : {QCString s;} +{ +//try{ +s=scalar_type_definition(){ return s;} +| s=composite_type_definition(){ return s;} +| s=access_type_definition(){ return s;} +| s=file_type_definition(){ return s;} +| + LOOKAHEAD(2) + protected_type_body() { return ""; } +| protected_type_declaration() { return ""; } +//}catch(...){error_skipto(SEMI_T); return "";} +} + +QCString type_mark() : {QCString s; } +{ + s=name() { return s;} +} + +QCString unconstraint_array_definition() : {QCString s,s1,s2,s3;} +{ +<ARRAY_T> <LPAREN_T> s=index_subtype_definition() ( <COMMA_T> s1=index_subtype_definition(){s3+=",";s3+=s1;})* <RPAREN_T> + <OF_T> s2=subtype_indication() {return "array("+s+s3+") of "+s2;} +} + + QCString use_clause() : {QCString s,s1;} +{ + <USE_T> s=selected_name()(<COMMA_T> s1=selected_name(){s+=",";s+=s1;})* <SEMI_T> + { + QStringList ql1=QStringList::split(",",s,FALSE); + for (uint j=0;j<ql1.count();j++) + { + QStringList ql=QStringList::split(".",ql1[j],FALSE); + QCString it=ql[1].utf8(); + if ( parse_sec==0 && Config_getBool("SHOW_INCLUDE_FILES") ) + { + VhdlParser::addVhdlType(it.data(),getLine(),Entry::VARIABLE_SEC,VhdlDocGen::USE,it.data(),"_use_",Public); + } + } + s1="use "+s; + return s1; + } +} + +QCString variable_assignment_statement() : {QCString s,s1,s2;} +{ +[LOOKAHEAD(2) s=identifier() <COLON_T> {s+=":";}] + s1=target() <VARASSIGN_T> s2=expression() <SEMI_T> + {return s+s1+":="+s2+";";} + | + selected_variable_assignment() { return ""; } +} + +QCString variable_declaration() : {Token *tok=0;Token *t1=0;QCString s,s1,s2;} +{ +[ tok=<SHARED_T> ] <VARIABLE_T> s=identifier_list() <COLON_T> s1=subtype_indication() +[ t1=<VARASSIGN_T> s2=expression() ] <SEMI_T> + +{ + int spec; + if(t1) + s2.prepend(":="); + QCString val=" variable "+s+":"+s1+s2+";"; + QCString it=s1; + if(tok != 0) + { + it.prepend(" shared "); + val.prepend(" shared"); + spec=VhdlDocGen::SHAREDVARIABLE; + } + else + spec=VhdlDocGen::SHAREDVARIABLE; + + if(t1){ + it+=":="; + it+=s2; + } + addVhdlType(s.data(),getLine(),Entry::VARIABLE_SEC,spec,0,it.data(),Public); + return val; + } + +} + +QCString wait_statement() : {QCString s,s1,s2,s3;Token *t=0;} +{ +[ s=identifier() t=<COLON_T> ] <WAIT_T> [ s1=sensitivity_clause() ] [ s2=condition_clause() ] [ s3=timeout_clause() ] <SEMI_T> +{ + if(t) s.append(":"); + return s+" wait "+s1+s2+s3+";"; +} +} + +QCString waveform() : {QCString s,s1;} +{ +s=waveform_element() (LOOKAHEAD(1) <COMMA_T> s1=waveform_element(){s+=","; s+=s1;})* { return s;} +| +<UNAFFECTED_T> { return " unaffected ";} + +} + +QCString waveform_element() : {QCString s,s1;} +{ + s=expression() [ <AFTER_T> s1=expression(){ s1.prepend(" after ");} ] + { return s+s1;} +//<NULL_T> [ <AFTER_T> expression() ] +} + +// ----------------------------------------------------------------- +// VHDL 2002 +// ----------------------------------------------------------------- + +QCString protected_type_body() :{ } +{ + // try{ + <PROTECTED_T> <BODY_T> + protected_type_body_declarative_part() + + //}catch(...){error_skipto(END_T);} + <END_T><PROTECTED_T> <BODY_T> [identifier()] {return "";} +} + +void protected_type_body_declarative_item() : { } + { + subprogram_declaration() + | subprogram_body() + | type_declaration() + | subtype_declaration() + | constant_declaration() + | variable_declaration() + | file_declaration() + | alias_declaration() + | + LOOKAHEAD( attribute_declaration()) + attribute_declaration() + | attribute_specification() + | use_clause() + | LOOKAHEAD(3) + group_template_declaration() + | group_declaration() + +} + +void protected_type_body_declarative_part() :{ } +{ + ( protected_type_body_declarative_item ())* +} + + +QCString protected_type_declaration() : { } + { + <PROTECTED_T> + try{ + protected_type_declarative_part() + }catch(...){error_skipto(END_T);} + <END_T><PROTECTED_T> [ identifier() ] { return "";} + } + + +void protected_type_declarative_item(): { } +{ + subprogram_specification() + | attribute_specification() + | use_clause() +} + +void protected_type_declarative_part() : {} +{ + (protected_type_declarative_item ()<SEMI_T>)* +} + +// ----------------------------------------------------------------- +// VHDL 2008 +// ----------------------------------------------------------------- + +QCString context_ref() : {QCString s;} +{ + <CONTEXT_T> s=identifier_list() <SEMI_T> + { + return "context "+s ; + } +} + +void context_declaration(): {QCString s,s1;} +{ + <CONTEXT_T> s=identifier() <IS_T> { parse_sec=CONTEXT_SEC; } (s1=libustcont_stats())* <END_T> [ <CONTEXT_T> ][identifier()] <SEMI_T> + { + parse_sec=0; + addVhdlType(s.data(),getLine(LIBRARY_T),Entry::VARIABLE_SEC,VhdlDocGen::LIBRARY,"context",s1.data(),Public); + } +} + +QCString libustcont_stats(): {QCString s;} +{ + s=use_clause() { return s;} + | s=library_clause() { return s;} + | s=context_ref() { return s;} +} + + void package_instantiation_declaration() : {QCString s,s1,s2;} + { + <PACKAGE_T> s=identifier() <IS_T> <NEW_T> s1=name() s2=signature() [gen_assoc_list()] <SEMI_T> + { + QCString q=" is new "+s1+s2; + addVhdlType(s.data(),getLine(PACKAGE_T),Entry::VARIABLE_SEC,VhdlDocGen::INSTANTIATION,"package",q.data(),Public); + } +} + +QCString interface_package_declaration(): {QCString s,s1;} +{ + <PACKAGE_T> s=identifier() <IS_T> <NEW_T> s1=name() [gen_assoc_list()] + { + current->name=s; + return "package "+s+" is new "+s1; + } +} + +QCString subprogram_instantiation_declaration():{QCString s,s1,s2;} +{ + <FUNCTION_T> s=identifier() <IS_T> <NEW_T> s1=name() s2=signature() [gen_assoc_list()] <SEMI_T> + { + QCString q= " is new "+s1+s2; + addVhdlType(s.data(),getLine(FUNCTION_T),Entry::VARIABLE_SEC,VhdlDocGen::INSTANTIATION,"function ",q.data(),Public); + return q; + } +} + + +void gen_assoc_list():{} +{ + <GENERIC_T> <MAP_T> <LPAREN_T> association_list()<RPAREN_T> +} + +void gen_interface_list() : {} +{ + <GENERIC_T><LPAREN_T> + { + //int u=s_str.iLine; + parse_sec=GEN_SEC; + } + interface_list() + { + // QCString vo=$3; + parse_sec=0; + } + <RPAREN_T> +} + +void case_scheme (): {} +{ + <CASE_T> expression() <GENERATE_T> when_stats() [LOOKAHEAD(3) ttend()] <END_T> + <GENERATE_T> generate_statement_body() <SEMI_T> +} + +void when_stats() : {} +{ + ( + <WHEN_T> [LOOKAHEAD(2) label() <COLON_T>] choices() <ARROW_T> generate_statement_body() + )+ +} + +void ttend(): {} +{ + <END_T> [identifier()] <SEMI_T> + } + + +void generate_statement_body() : {} +{ + <BEGIN_T> generate_statement_body() +} + +void generate_statement_body1() : {} +{ + LOOKAHEAD(block_declarative_item()<BEGIN_T> ) + (block_declarative_item() )* <BEGIN_T> (concurrent_statement())* + | (concurrent_statement())* +} + +QCString external_name(): {QCString s,s1,s2;} +{ + <SLSL_T> s=sig_stat() s1=external_pathname() <COLON_T> s2=subtype_indication() <RSRS_T> + { + QCString t="<<"+s; + QCString t1=s1+":"+s2+">>"; + return s+s1; + } +} + +QCString sig_stat(): {Token *t;} +{ + t=<CONSTANT_T> { return t->image.data(); } + | t=<SIGNAL_T> { return t->image.data(); } + | t=<VARIABLE_T> { return t->image.data(); } + +} + +QCString external_pathname(): {QCString s;} +{ + s=absolute_pathname() { return s;} + | s=relative_pathname() { return s;} + | s=package_path_name() { return s;} + } + +QCString absolute_pathname(): {QCString s,s1;} +{ + LOOKAHEAD(<DOT_T> pathname_element_list()) + <DOT_T> s=pathname_element_list() s1=identifier() { return "."+s+s1;} +| <DOT_T> s=identifier (){ return "."+s;} +} + +QCString relative_pathname():{QCString s,s1,s2;} +{ + s=neg_list() [LOOKAHEAD( pathname_element_list()) s1=pathname_element_list() ] s2=identifier() { return s+s1+s2;} +} + +QCString neg_list(): {QCString s;} +{ + (<NEG_T> <DOT_T>{s+="^.";})+ {return s; } +} + +QCString pathname_element ():{QCString s,s1;} +{ + s=identifier() [<LPAREN_T> s1=expression() <RPAREN_T>] + { + if(!s1.isEmpty()) + return s+"("+s1+")"; + + return s; + } + } + +QCString pathname_element_list():{QCString s,s1,s2;} +{ + ( s=pathname_element() <DOT_T> ) {s+=".";} (LOOKAHEAD(pathname_element() <DOT_T>) s1=pathname_element() <DOT_T> {s2+=s1;s2+="."; })* + { return s+s2; } +} + +QCString package_path_name():{QCString s;} +{ + <AT_T> s=name() { return "@"+s; } +} + +void conditional_signal_assignment_wave(): {} +{ + LOOKAHEAD(conditional_force_assignment()) + conditional_force_assignment() + |conditional_waveform_assignment() +} + +void conditional_waveform_assignment():{} +{ + target() <LESSTHAN_T> [LOOKAHEAD(1) delay_mechanism() ] waveform_element() <WHEN_T> expression() [else_wave_list()] <SEMI_T> + } + +void else_wave_list(): {} +{ +<ELSE_T> expression() [ <WHEN_T> expression()] +} + +void conditional_force_assignment(): {} +{ + target() <LESSTHAN_T> <FORCE_T> [inout_stat()] expression() <WHEN_T> [expression() else_stat()] <SEMI_T> +} + +void selected_signal_assignment_wave() : {} +{ + LOOKAHEAD(selected_force_assignment() ) + selected_force_assignment() +| selected_waveform_assignment() +} + +void selected_variable_assignment():{} +{ + <WITH_T> expression() <SELECT_T> [<Q_T>] select_name() <VARASSIGN_T> sel_var_list() // { $$=""; } +} + +void select_name(): {} +{ + LOOKAHEAD(aggregate()) + aggregate() + | name() + +} + +void selected_waveform_assignment():{} +{ + <WITH_T> expression() <SELECT_T> [<Q_T>] + target() <LESSTHAN_T> [delay_mechanism()] sel_wave_list() +} + +void selected_force_assignment():{} +{ +<WITH_T> expression() <SELECT_T> [<Q_T>] target() <LESSTHAN_T> <FORCE_T> + [inout_stat()] sel_var_list() +} + +void sel_var_list(): {} +{ + (expression() <WHEN_T> choices() (<COMMA_T>|<SEMI_T>))(LOOKAHEAD(expression() <WHEN_T>) expression() <WHEN_T> choices() (<COMMA_T>|<SEMI_T>))* + +} + + +void sel_wave_list() : {} +{ + waveform_element() <WHEN_T> choices() (LOOKAHEAD(1) <COMMA_T> sel_wave_list())* <SEMI_T> + // | sel_wave_list_1() +} + +void inout_stat(): {} +{ + <IN_T> + | <OUT_T> + } + +void else_stat(): {} +{ + (<ELSE_T> expression() [LOOKAHEAD(1) <WHEN_T> expression()])+ +} + + + +QCString interface_subprogram_declaration(): {QCString s;} +{ + s=iproc() { return s;} + | s=ifunc() { return s; } +} + +QCString iproc(): {QCString s,s1;} + { + <PROCEDURE_T> s=identifier() s1=param() + { + current->name=s; + return "procedure "+s+s1; + } + } + +QCString ifunc():{QCString s,s1,s2,s3;Token *t=0;Token *t1=0;Token *t2=0;} +{ + + [t=<PURE_T> | t=<IMPURE_T> ] <FUNCTION_T> s=name() s1=param() <RETURN_T> s2=name() [t1=<IS_T> (s3=identifier() | t2=<BOX_T>)] + { + QCString q; + if(t) q=t->image.data(); + if(t2) s3="<>"; + if (!s3.isEmpty()) + { + s3.prepend(" is "); + } + current->name=s; + if (parse_sec==GEN_SEC) + { + QCString ss=q+" function "+s1+" return "+s2+s3; + int a=getLine(FUNCTION_T); + int b=getLine(PROCEDURE_T); + + if (a>b) b=a; + addVhdlType(current->name.data(),b,Entry::VARIABLE_SEC,VhdlDocGen::GENERIC,ss.data(),0,Public); + } + currP=0;return ""; + } + + } + + +QCString param(): {QCString s,s1;Token *tok=0;} +{ +[ tok=<PARAMETER_T> ] { param_sec=PARAM_SEC; } + [ <LPAREN_T> s1=interface_list() <RPAREN_T>] + { + if(tok) + { + s = tok->image.data(); + param_sec=0; + } + return s+"("+s1+")"; + } + + } + + // ----------------------------------------------------------------- + // needed for inline (function/process/procedure) parsing + +void parseInline() : {} +{ + process_statement() + | subprogram_declaration() + } diff --git a/vhdlparser/vhdlparser.patch b/vhdlparser/vhdlparser.patch new file mode 100644 index 0000000..37cca10 --- /dev/null +++ b/vhdlparser/vhdlparser.patch @@ -0,0 +1,10 @@ +--- VhdlParser.h 2014-07-27 14:26:18.000000000 +0200 ++++ VhdlParser.h.new 2014-07-27 14:23:22.000000000 +0200 +@@ -6,6 +6,7 @@ + #include "TokenManager.h" + #include "VhdlParserTokenManager.h" + #include "VhdlParser.h" ++#include "vhdljjparser.h" + + #include "VhdlParserConstants.h" + #include "ErrorHandler.h" diff --git a/vhdlparser/vhdlparser.pro.in b/vhdlparser/vhdlparser.pro.in new file mode 100644 index 0000000..0232fd5 --- /dev/null +++ b/vhdlparser/vhdlparser.pro.in @@ -0,0 +1,33 @@ +TEMPLATE = lib +CONFIG = warn_on staticlib $extraopts +HEADERS = CharStream.h \ + ErrorHandler.h \ + JavaCC.h \ + ParseException.h \ + TokenManager.h \ + Token.h \ + vhdlstring.h \ + VhdlParser.h \ + VhdlParserConstants.h \ + VhdlParserTokenManager.h \ + TokenMgrError.h \ + VhdlParserIF.h \ + VhdlParserErrorHandler.hpp + +SOURCES = CharStream.cc \ + ParseException.cc \ + Token.cc \ + TokenMgrError.cc \ + VhdlParser.cc \ + VhdlParserTokenManager.cc \ + VhdlParserIF.cpp + +INCLUDEPATH = . ../src ../qtools generated_src/doxygen +#TMAKE_CXXFLAGS += -DQT_NO_CODECS -DQ T_LITE_UNICODE + +#must enable -fexceptions because we have try catch blocks in VhdlParser.cc +TMAKE_CXXFLAGS +=-w -fexceptions -DQT_LITE_UNICODE +win32:TMAKE_CXXFLAGS += -fexceptions -DQT_NODLL +win32-g++:TMAKE_CXXFLAGS += -fexceptions -D__CYGWIN__ -DALL_STATIC +OBJECTS_DIR = ../objects/vhdlparser +DESTDIR = ../lib diff --git a/vhdlparser/vhdlstring.h b/vhdlparser/vhdlstring.h new file mode 100644 index 0000000..ec13907 --- /dev/null +++ b/vhdlparser/vhdlstring.h @@ -0,0 +1,101 @@ +#ifndef VHDLSTRING_H +#define VHDLSTRING_H + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +/** @brief Minimal string class with std::string like behaviour that fulfills the JavaCC + * string requirements. + */ +class VhdlString +{ + public: + VhdlString() + { + init(); + } + VhdlString(const VhdlString &other) + { + m_str = (char*)malloc(other.m_len+1); + memcpy(m_str,other.m_str,other.m_len); + m_len = other.m_len; + m_str[m_len]=0; + } + VhdlString &operator=(const VhdlString &other) + { + if (this!=&other) + { + free(m_str); + m_str = (char*)malloc(other.m_len+1); + memcpy(m_str,other.m_str,other.m_len); + m_len = other.m_len; + m_str[m_len]=0; + } + return *this; + } + VhdlString(const char *s) + { + m_len = strlen(s); + m_str=(char*)malloc(m_len+1); + memcpy(m_str,s,m_len+1); + } + VhdlString(const char *s,int size) + { + m_str = (char*)malloc(size+1); + memcpy(m_str,s,size); + m_str[size]=0; + m_len=size; + } + ~VhdlString() + { + delete[] m_str; + } + VhdlString& append(const char *s,int size) + { + int oldlen = m_len; + m_len+=size+1; + if (m_len) + { + m_str = (char*)realloc(m_str,m_len); + memcpy(m_str+oldlen,s,m_len-oldlen-1); + m_str[m_len-1]=0; + } + return *this; + } + VhdlString& append(const char *s) + { + return append(s,strlen(s)); + } + VhdlString& append(const VhdlString &other) + { + return append(other.m_str,other.m_len); + } + VhdlString substr(int pos=0,int len=-1) + { + return VhdlString(m_str?m_str+pos:0,len==-1?m_len-pos:m_len); + } + int copy(char *s,int len,int pos=0) const + { + if (len==0) return 0; + if (pos>=m_len) { s[0]=0; return 0; } + int r=m_len<pos+len ? m_len-pos : len; + memcpy(s,m_str+pos,r); + return r; + } + const char *c_str() const { return m_str; } + const char *data() const { return m_str; } + int size() const { return m_len; } + int length() const { return m_len; } + char & operator[](int i) { return m_str[i]; } + const char &operator[](int i) const { return m_str[i]; } + void clear() { free(m_str); init(); } + VhdlString operator+=(char c) { char s[2]; s[0]=c; s[1]=0; return append(s); } + + private: + void init() { m_str=(char*)calloc(1,1); m_len=0; } + char *m_str; + int m_len; +}; + +#endif diff --git a/winbuild/Config.rules b/winbuild/Config.rules index 040fc65..788497d 100644 --- a/winbuild/Config.rules +++ b/winbuild/Config.rules @@ -7,7 +7,7 @@ <CustomBuildRule Name="Config" DisplayName="Config" - CommandLine="python $(ProjectDir)..\src\configgen.py -cpp [AllOptions] [AdditionalOptions] [inputs] > $(IntDir)/$(InputName)options.cpp" + CommandLine="python "$(ProjectDir)..\src\configgen.py" -cpp [AllOptions] [AdditionalOptions] [inputs] > $(IntDir)/$(InputName)options.cpp" Outputs="$(IntDir)/$(InputName)options.cpp" FileExtensions="*.xml" AdditionalDependencies="$(ProjectDir)..\src\configgen.py" @@ -18,7 +18,7 @@ <CustomBuildRule Name="Config_dw" DisplayName="Config" - CommandLine="python $(ProjectDir)..\src\configgen.py -wiz [AllOptions] [AdditionalOptions] [inputs] > $(IntDir)/$(InputName)doc.cpp" + CommandLine="python "$(ProjectDir)..\src\configgen.py" -wiz [AllOptions] [AdditionalOptions] [inputs] > $(IntDir)/$(InputName)doc.cpp" Outputs="$(IntDir)/$(InputName)doc.cpp" FileExtensions="*.xml" AdditionalDependencies="$(ProjectDir)..\src\configgen.py" diff --git a/winbuild/Doxygen.vcproj b/winbuild/Doxygen.vcproj index 3b6ba8e..882e514 100644 --- a/winbuild/Doxygen.vcproj +++ b/winbuild/Doxygen.vcproj @@ -95,7 +95,7 @@ Name="VCCLCompilerTool"
AdditionalOptions="/Zm200 "
Optimization="0"
- AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,$(IntDir),."
+ AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,..\vhdlparser,$(IntDir),."
PreprocessorDefinitions="_CONSOLE;WIN32;_DEBUG; _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;LIBICONV_STATIC;CHARSET_STATIC"
MinimalRebuild="true"
BasicRuntimeChecks="3"
@@ -127,7 +127,7 @@ SuppressStartupBanner="true"
AdditionalLibraryDirectories="Debug"
GenerateManifest="false"
- IgnoreDefaultLibraryNames="libcmtd.lib"
+ IgnoreDefaultLibraryNames="libcmtd.lib libcpmtd.lib libcmt.lib"
GenerateDebugInformation="true"
ProgramDatabaseFile=".\Debug\doxygen\$(TargetName).pdb"
SubSystem="1"
@@ -217,7 +217,7 @@ Name="VCCLCompilerTool"
AdditionalOptions="/Zm200 /bigobj"
Optimization="0"
- AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,$(IntDir),."
+ AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,..\vhdlparser,$(IntDir),."
PreprocessorDefinitions="_CONSOLE;WIN32;_DEBUG; _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;LIBICONV_STATIC;CHARSET_STATIC"
MinimalRebuild="true"
BasicRuntimeChecks="3"
@@ -340,7 +340,7 @@ InlineFunctionExpansion="2"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,$(IntDir),."
+ AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,..\vhdlparser,$(IntDir),."
PreprocessorDefinitions="WIN32;_CINDEX_LIB_;_CINDEX_LIB_;NDEBUG;_CONSOLE; _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;LIBICONV_STATIC;CHARSET_STATIC"
StringPooling="true"
RuntimeLibrary="0"
@@ -463,7 +463,7 @@ InlineFunctionExpansion="2"
OmitFramePointers="true"
WholeProgramOptimization="true"
- AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,$(IntDir),."
+ AdditionalIncludeDirectories="..\src,..\qtools,..\libpng,..\libmd5,..\vhdlparser,$(IntDir),."
PreprocessorDefinitions="WIN32;_CINDEX_LIB_;_CINDEX_LIB_;NDEBUG;_CONSOLE; _CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;LIBICONV_STATIC;CHARSET_STATIC"
StringPooling="true"
RuntimeLibrary="0"
@@ -543,6 +543,10 @@ >
</File>
<File
+ RelativePath="..\vhdlparser\CharStream.cc"
+ >
+ </File>
+ <File
RelativePath="..\src\cite.cpp"
>
</File>
@@ -683,6 +687,10 @@ >
</File>
<File
+ RelativePath="..\src\fileparser.cpp"
+ >
+ </File>
+ <File
RelativePath="..\src\formula.cpp"
>
</File>
@@ -827,10 +835,18 @@ >
</File>
<File
+ RelativePath="..\vhdlparser\ParseException.cc"
+ >
+ </File>
+ <File
RelativePath="..\src\perlmodgen.cpp"
>
</File>
<File
+ RelativePath="..\src\plantuml.cpp"
+ >
+ </File>
+ <File
RelativePath="..\src\portable.cpp"
>
</File>
@@ -911,6 +927,14 @@ >
</File>
<File
+ RelativePath="..\vhdlparser\Token.cc"
+ >
+ </File>
+ <File
+ RelativePath="..\vhdlparser\TokenMgrError.cc"
+ >
+ </File>
+ <File
RelativePath="..\src\tooltip.cpp"
>
</File>
@@ -927,11 +951,19 @@ >
</File>
<File
- RelativePath="$(IntDir)\vhdlparser.cpp"
+ RelativePath="..\src\vhdljjparser.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\vhdlparser\VhdlParser.cc"
>
</File>
<File
- RelativePath="$(IntDir)\vhdlparser.h"
+ RelativePath="..\vhdlparser\VhdlParserIF.cpp"
+ >
+ </File>
+ <File
+ RelativePath="..\vhdlparser\VhdlParserTokenManager.cc"
>
</File>
<File
@@ -956,7 +988,7 @@ <Tool
Name="VCCustomBuildTool"
Description="Running bison on constexp.y"
- CommandLine="bison -l -d -p ce_parseexpYY $(InputPath) -o $(IntDir)\ce_parse.c
bison -l -p constexpYY $(InputPath) -o $(IntDir)\ce_parse.cpp
del $(IntDir)\ce_parse.c
"
+ CommandLine="bison -l -d -p ce_parseexpYY "$(InputPath)" -o $(IntDir)\ce_parse.c
bison -l -p constexpYY "$(InputPath)" -o $(IntDir)\ce_parse.cpp
del $(IntDir)\ce_parse.c
"
Outputs="$(IntDir)\ce_parse.cpp"
/>
</FileConfiguration>
@@ -966,7 +998,7 @@ <Tool
Name="VCCustomBuildTool"
Description="Running bison on constexp.y"
- CommandLine="bison -l -d -p ce_parseexpYY $(InputPath) -o $(IntDir)\ce_parse.c
bison -l -p constexpYY $(InputPath) -o $(IntDir)\ce_parse.cpp
del $(IntDir)\ce_parse.c
"
+ CommandLine="bison -l -d -p ce_parseexpYY "$(InputPath)" -o $(IntDir)\ce_parse.c
bison -l -p constexpYY "$(InputPath)" -o $(IntDir)\ce_parse.cpp
del $(IntDir)\ce_parse.c
"
Outputs="$(IntDir)\ce_parse.cpp"
/>
</FileConfiguration>
@@ -976,7 +1008,7 @@ <Tool
Name="VCCustomBuildTool"
Description="Running bison on constexp.y"
- CommandLine="bison -l -d -p ce_parseexpYY $(InputPath) -o $(IntDir)\ce_parse.c
bison -l -p constexpYY $(InputPath) -o $(IntDir)\ce_parse.cpp
del $(IntDir)\ce_parse.c
"
+ CommandLine="bison -l -d -p ce_parseexpYY "$(InputPath)" -o $(IntDir)\ce_parse.c
bison -l -p constexpYY "$(InputPath)" -o $(IntDir)\ce_parse.cpp
del $(IntDir)\ce_parse.c
"
Outputs="$(IntDir)\ce_parse.cpp"
/>
</FileConfiguration>
@@ -986,55 +1018,11 @@ <Tool
Name="VCCustomBuildTool"
Description="Running bison on constexp.y"
- CommandLine="bison -l -d -p ce_parseexpYY $(InputPath) -o $(IntDir)\ce_parse.c
bison -l -p constexpYY $(InputPath) -o $(IntDir)\ce_parse.cpp
del $(IntDir)\ce_parse.c
"
+ CommandLine="bison -l -d -p ce_parseexpYY "$(InputPath)" -o $(IntDir)\ce_parse.c
bison -l -p constexpYY "$(InputPath)" -o $(IntDir)\ce_parse.cpp
del $(IntDir)\ce_parse.c
"
Outputs="$(IntDir)\ce_parse.cpp"
/>
</FileConfiguration>
</File>
- <File
- RelativePath="..\src\vhdlparser.y"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description="Running bison on vhdlparser.y"
- CommandLine="bison -l -d -p vhdlscannerYY $(InputPath) -o $(IntDir)\vhdlparser.c
bison -l -p vhdlscannerYY $(InputPath) -o $(IntDir)\vhdlparser.cpp
del $(IntDir)\vhdlparser.c
"
- Outputs="$(IntDir)\vhdlparser.cpp"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description="Running bison on vhdlparser.y"
- CommandLine="bison -l -d -p vhdlscannerYY $(InputPath) -o $(IntDir)\vhdlparser.c
bison -l -p vhdlscannerYY $(InputPath) -o $(IntDir)\vhdlparser.cpp
del $(IntDir)\vhdlparser.c
"
- Outputs="$(IntDir)\vhdlparser.cpp"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description="Running bison on vhdlparser.y"
- CommandLine="bison -l -d -p vhdlscannerYY $(InputPath) -o $(IntDir)\vhdlparser.c
bison -l -p vhdlscannerYY $(InputPath) -o $(IntDir)\vhdlparser.cpp
del $(IntDir)\vhdlparser.c
"
- Outputs="$(IntDir)\vhdlparser.cpp"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="VCCustomBuildTool"
- Description="Running bison on vhdlparser.y"
- CommandLine="bison -l -d -p vhdlscannerYY $(InputPath) -o $(IntDir)\vhdlparser.c
bison -l -p vhdlscannerYY $(InputPath) -o $(IntDir)\vhdlparser.cpp
del $(IntDir)\vhdlparser.c
"
- Outputs="$(IntDir)\vhdlparser.cpp"
- />
- </FileConfiguration>
- </File>
</Filter>
<Filter
Name="Lex Files"
@@ -1232,42 +1220,6 @@ />
</FileConfiguration>
</File>
- <File
- RelativePath="..\src\vhdlscanner.l"
- >
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="Lex"
- Case="true"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Debug|x64"
- >
- <Tool
- Name="Lex"
- Case="true"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="Lex"
- Case="true"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|x64"
- >
- <Tool
- Name="Lex"
- Case="true"
- />
- </FileConfiguration>
- </File>
</Filter>
<Filter
Name="Python Files"
@@ -2263,6 +2215,10 @@ >
</File>
<File
+ RelativePath="..\vhdlparser\CharStream.h"
+ >
+ </File>
+ <File
RelativePath="..\src\cite.h"
>
</File>
@@ -2415,6 +2371,10 @@ >
</File>
<File
+ RelativePath="..\vhdlparser\ErrorHandler.h"
+ >
+ </File>
+ <File
RelativePath="..\src\example.h"
>
</File>
@@ -2431,6 +2391,10 @@ >
</File>
<File
+ RelativePath="..\src\fileparser.h"
+ >
+ </File>
+ <File
RelativePath="$(IntDir)\footer_html.h"
>
</File>
@@ -2507,6 +2471,10 @@ >
</File>
<File
+ RelativePath="..\vhdlparser\JavaCC.h"
+ >
+ </File>
+ <File
RelativePath="$(IntDir)\jquery_fx_js.h"
>
</File>
@@ -2639,6 +2607,10 @@ >
</File>
<File
+ RelativePath="..\vhdlparser\ParseException.h"
+ >
+ </File>
+ <File
RelativePath="..\src\parserintf.h"
>
</File>
@@ -2647,6 +2619,10 @@ >
</File>
<File
+ RelativePath="..\src\plantuml.h"
+ >
+ </File>
+ <File
RelativePath="..\src\portable.h"
>
</File>
@@ -2755,6 +2731,18 @@ >
</File>
<File
+ RelativePath="..\vhdlparser\Token.h"
+ >
+ </File>
+ <File
+ RelativePath="..\vhdlparser\TokenManager.h"
+ >
+ </File>
+ <File
+ RelativePath="..\vhdlparser\TokenMgrError.h"
+ >
+ </File>
+ <File
RelativePath="..\src\tooltip.h"
>
</File>
@@ -2959,11 +2947,31 @@ >
</File>
<File
- RelativePath="$(IntDir)\vhdlscanner.cpp"
+ RelativePath="..\src\vhdljjparser.h"
+ >
+ </File>
+ <File
+ RelativePath="..\vhdlparser\vhdlparser.h"
+ >
+ </File>
+ <File
+ RelativePath="..\vhdlparser\VhdlParserConstants.h"
+ >
+ </File>
+ <File
+ RelativePath="..\vhdlparser\VhdlParserErrorHandler.hpp"
+ >
+ </File>
+ <File
+ RelativePath="..\vhdlparser\VhdlParserIF.h"
+ >
+ </File>
+ <File
+ RelativePath="..\vhdlparser\VhdlParserTokenManager.h"
>
</File>
<File
- RelativePath="..\src\vhdlscanner.h"
+ RelativePath="..\vhdlparser\vhdlstring.h"
>
</File>
<File
diff --git a/winbuild/Gen_head.rules b/winbuild/Gen_head.rules index 9f1e13d..c2e7550 100644 --- a/winbuild/Gen_head.rules +++ b/winbuild/Gen_head.rules @@ -7,7 +7,7 @@ <CustomBuildRule Name="Gen_head" DisplayName="Gen_head" - CommandLine="python $(ProjectDir)..\src\to_c_cmd.py [AllOptions] [AdditionalOptions] [inputs] < $(InputPath) > $(IntDir)/$(InputName)$(InputExt).h" + CommandLine="python "$(ProjectDir)..\src\to_c_cmd.py" [AllOptions] [AdditionalOptions] [inputs] < "$(InputPath)" > $(IntDir)/$(InputName)$(InputExt).h" Outputs="$(IntDir)/$(InputName)$(InputExt).h" FileExtensions=".*" AdditionalDependencies="$(ProjectDir)..\src\to_c_cmd.py" diff --git a/winbuild/Languages.rules b/winbuild/Languages.rules index 0d57a05..8ff018a 100755 --- a/winbuild/Languages.rules +++ b/winbuild/Languages.rules @@ -6,8 +6,8 @@ <Rules> <CustomBuildRule Name="Languages" - DisplayName="Settings" - CommandLine="python $(InputPath) [AllOptions] [AdditionalOptions] > $(IntDir)/$(InputName).h" + DisplayName="Languages" + CommandLine="python "$(InputPath)" [AllOptions] [AdditionalOptions] > $(IntDir)/$(InputName).h" Outputs="$(IntDir)/$(InputName).h" FileExtensions="*.py" AdditionalDependencies="" diff --git a/winbuild/Lex.rules b/winbuild/Lex.rules index 85b5e18..52df322 100644 --- a/winbuild/Lex.rules +++ b/winbuild/Lex.rules @@ -7,7 +7,7 @@ <CustomBuildRule Name="Lex" DisplayName="Lex" - CommandLine="flex [AllOptions] -t -P$(InputName)YY [AdditionalOptions] [inputs] | python $(ProjectDir)..\src\increasebuffer.py > $(IntDir)/$(InputName).cpp" + CommandLine="flex [AllOptions] -t -P$(InputName)YY [AdditionalOptions] [inputs] | python "$(ProjectDir)..\src\increasebuffer.py" > $(IntDir)/$(InputName).cpp" Outputs="$(IntDir)/$(InputName).cpp" FileExtensions="*.l" AdditionalDependencies="$(ProjectDir)..\src\increasebuffer.py" diff --git a/winbuild/Settings.rules b/winbuild/Settings.rules index 283cd49..29e7266 100644 --- a/winbuild/Settings.rules +++ b/winbuild/Settings.rules @@ -7,7 +7,7 @@ <CustomBuildRule Name="Settings" DisplayName="Settings" - CommandLine="python $(InputPath) [AllOptions] [AdditionalOptions] $(IntDir)" + CommandLine="python "$(InputPath)" [AllOptions] [AdditionalOptions] $(IntDir)" Outputs="$(IntDir)/$(InputName).h" FileExtensions="*.py" AdditionalDependencies="$(ProjectDir)..\configure" diff --git a/winbuild/Unistd.rules b/winbuild/Unistd.rules index 0f4ce02..bd25661 100755 --- a/winbuild/Unistd.rules +++ b/winbuild/Unistd.rules @@ -7,7 +7,7 @@ <CustomBuildRule Name="Unistd" DisplayName="Unistd" - CommandLine="python $(InputPath) [AllOptions] [AdditionalOptions] $(IntDir)" + CommandLine="python "$(InputPath)" [AllOptions] [AdditionalOptions] $(IntDir)" Outputs="$(IntDir)/$(InputName).h" FileExtensions="*.py" ExecutionDescription="Executing Unistd ..." diff --git a/winbuild/Version.rules b/winbuild/Version.rules index 43faeb1..3dfdf04 100644 --- a/winbuild/Version.rules +++ b/winbuild/Version.rules @@ -7,7 +7,7 @@ <CustomBuildRule Name="Version" DisplayName="Version" - CommandLine="python $(InputPath) $(IntDir)" + CommandLine="python "$(InputPath)" $(IntDir)" Outputs="$(IntDir)\$(InputName).cpp" FileExtensions="*.py" AdditionalDependencies="$(ProjectDir)..\configure" diff --git a/winbuild/moc.rules b/winbuild/moc.rules index a8242f5..efe0f7f 100644 --- a/winbuild/moc.rules +++ b/winbuild/moc.rules @@ -7,7 +7,7 @@ <CustomBuildRule Name="moc" DisplayName="Moc" - CommandLine="$(QTDIR)/bin/moc.exe $(InputPath) -o moc_$(InputName).cpp" + CommandLine="$(QTDIR)/bin/moc.exe "$(InputPath)" -o moc_$(InputName).cpp" Outputs="moc_$(InputName).cpp" AdditionalDependencies="$(QTDIR)/bin/moc.exe" FileExtensions="*.h" diff --git a/winbuild/pack_the_distribution_for_windows.py b/winbuild/pack_the_distribution_for_windows.py index a1b6c19..dc2c3d9 100644 --- a/winbuild/pack_the_distribution_for_windows.py +++ b/winbuild/pack_the_distribution_for_windows.py @@ -1,4 +1,4 @@ -#! python2
+#!python2
from __future__ import print_function
@@ -92,16 +92,18 @@ def copyBinaries(dist_dir, subdir): # Source file should exist.
sdir, fname = getThisScriptPathAndName()
src = os.path.normpath(os.path.join(sdir, '..', 'bin', subdir, 'doxygen.exe'))
- assert os.path.isfile(src)
-
- # Destination directory must not exist. It must be created first.
- dst_dir = os.path.normpath(os.path.join(dist_dir, 'bin', subdir))
- assert not os.path.isdir(dst_dir)
- os.makedirs(dst_dir)
-
- # Copy the file.
- print("Copying '{}'".format(src))
- shutil.copy2(src, dst_dir)
+ if os.path.isfile(src):
+ # Destination directory must not exist. It must be created first.
+ dst_dir = os.path.normpath(os.path.join(dist_dir, 'bin', subdir))
+ assert not os.path.isdir(dst_dir)
+ os.makedirs(dst_dir)
+
+ # Copy the file.
+ print("Copying '{}'".format(src))
+ shutil.copy2(src, dst_dir)
+ else:
+ print("The binary '" + src + "'")
+ print('was not found. It will not be present in the distribution.')
def getBinariesZipBareName():
|