File indexing completed on 2024-04-21 04:36:15

0001 /* This file is part of kdev-pg-qt
0002    Copyright (C) 2005 Roberto Raggi <roberto@kdevelop.org>
0003    Copyright (C) 2010 Jonathan Schmidt-Dominé <devel@the-user.org>
0004 
0005    This library is free software; you can redistribute it and/or
0006    modify it under the terms of the GNU Library General Public
0007    License as published by the Free Software Foundation; either
0008    version 2 of the License, or (at your option) any later version.
0009 
0010    This library is distributed in the hope that it will be useful,
0011    but WITHOUT ANY WARRANTY; without even the implied warranty of
0012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0013    Library General Public License for more details.
0014 
0015    You should have received a copy of the GNU Library General Public License
0016    along with this library; see the file COPYING.LIB.  If not, write to
0017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0018    Boston, MA 02110-1301, USA.
0019 */
0020 
0021 #ifndef KDEV_PG_FIRST_H
0022 #define KDEV_PG_FIRST_H
0023 
0024 #include "kdev-pg.h"
0025 #include "kdev-pg-bnf-visitor.h"
0026 
0027 #include <QSet>
0028 
0029 namespace KDevPG
0030 {
0031 
0032 /**
0033  * Adds first-sets for terminals and zeros.
0034  */
0035 void initializeFirst ();
0036 
0037 /**
0038  * Recursively merge first-sets.
0039  */
0040 class NextFirst: protected BnfVisitor
0041 {
0042 public:
0043   NextFirst(bool &changed);
0044 
0045   void operator ()(Model::Node *node);
0046 
0047 protected:
0048   bool blockZeroMerge(bool block);
0049   void merge(Model::Node *__dest, Model::Node *__source, int K = 1);
0050 
0051   void visitNode(Model::Node *node) override;
0052   void visitAlternative(Model::AlternativeItem *node) override;
0053   void visitCons(Model::ConsItem *node) override;
0054   
0055   void copy(Model::Node *from, Model::Node *to) override { merge(to, from); }
0056 
0057 private:
0058   bool mMergeZeroBlocked;
0059   bool &mChanged;
0060   QSet<Model::Node*> mVisited;
0061 };
0062 
0063 /**
0064  * This method computes the first-set for all symbols.
0065  * The algorithm: The function starts with InitializeFirst. As long as possible NextFirst will merge first-sets.
0066  */
0067 void computeFirst();
0068 
0069 }
0070 
0071 #endif // KDEV_PG_FIRST_H