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