File indexing completed on 2024-04-14 04:31:33

0001 /* This file is part of kdev-pg-qt
0002    Copyright (C) 2005 Roberto Raggi <roberto@kdevelop.org>
0003    Copyright (C) 2006 Jakob Petsovits <jpetso@gmx.at>
0004    Copyright (C) 2006 Alexander Dymo <adymo@kdevelop.org>
0005 
0006    This library is free software; you can redistribute it and/or
0007    modify it under the terms of the GNU Library General Public
0008    License as published by the Free Software Foundation; either
0009    version 2 of the License, or (at your option) any later version.
0010 
0011    This library is distributed in the hope that it will be useful,
0012    but WITHOUT ANY WARRANTY; without even the implied warranty of
0013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0014    Library General Public License for more details.
0015 
0016    You should have received a copy of the GNU Library General Public License
0017    along with this library; see the file COPYING.LIB.  If not, write to
0018    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
0019    Boston, MA 02110-1301, USA.
0020 */
0021 
0022 #ifndef KDEV_PG_CHECKER_H
0023 #define KDEV_PG_CHECKER_H
0024 
0025 #include "kdev-pg.h"
0026 #include "kdev-pg-default-visitor.h"
0027 
0028 /**
0029  * @file
0030  * Checks for conflicts and some errors.
0031  * TODO: split conflict-computation and conflict-message-printing
0032  */
0033 
0034 namespace KDevPG
0035 {
0036 
0037 class EmptyFirstChecker: protected DefaultVisitor
0038 {
0039 public:
0040   void operator()(Model::Node *node);
0041 
0042 protected:
0043   void visitNonTerminal(Model::NonTerminalItem *node) override;
0044   void visitInlinedNonTerminal(Model::InlinedNonTerminalItem *node) override;
0045   void visitSymbol(Model::SymbolItem *node) override;
0046 };
0047 
0048 class EmptyOperatorChecker: protected DefaultVisitor
0049 {
0050 public:
0051   void operator()(Model::Node *node);
0052 
0053 protected:
0054   void visitOperator(Model::OperatorItem *node) override;
0055 };
0056 
0057 class FirstFirstConflictChecker: protected DefaultVisitor
0058 {
0059 public:
0060   void operator()(Model::Node *node);
0061 
0062 protected:
0063   void check(Model::Node *left, Model::Node *right);
0064 
0065   void visitEvolve(Model::EvolveItem *node) override;
0066   void visitAlternative(Model::AlternativeItem *node) override;
0067   void visitInlinedNonTerminal(Model::InlinedNonTerminalItem *node) override;
0068 
0069 private:
0070   Model::SymbolItem *mSymbol;
0071   Model::Node *mCheckedNode;
0072 };
0073 
0074 class FirstFollowConflictChecker: protected DefaultVisitor
0075 {
0076 public:
0077   void operator()(Model::Node *node);
0078 
0079 protected:
0080   void check(Model::Node *node, Model::Node *sym = nullptr);
0081 
0082   void visitAlternative(Model::AlternativeItem *node) override;
0083   void visitCons(Model::ConsItem *node) override;
0084   void visitPlus(Model::PlusItem *node) override;
0085   void visitStar(Model::StarItem *node) override;
0086   void visitInlinedNonTerminal(Model::InlinedNonTerminalItem *node) override;
0087 
0088 private:
0089   Model::SymbolItem *mSymbol;
0090 };
0091 
0092 class FollowDepChecker
0093 {
0094 public:
0095   FollowDepChecker(Model::Node *terminal): mTerminal(terminal) {}
0096   void check(Model::Node *n);
0097 
0098 private:
0099   Model::Node *mTerminal;
0100   World::NodeSet mVisited;
0101 };
0102 
0103 class UndefinedSymbolChecker: protected DefaultVisitor
0104 {
0105 public:
0106   void operator()(Model::Node *node);
0107 
0108 protected:
0109   void visitSymbol(Model::SymbolItem *node) override;
0110   void visitVariableDeclaration(Model::VariableDeclarationItem *node) override;
0111   void visitInlinedNonTerminal(Model::InlinedNonTerminalItem *node) override;
0112 
0113 private:
0114   Model::SymbolItem *mSymbol;
0115 };
0116 
0117 class UndefinedTokenChecker: protected DefaultVisitor
0118 {
0119 public:
0120   void operator()(Model::Node *node);
0121 
0122 protected:
0123   void visitTerminal(Model::TerminalItem *node) override;
0124   void visitInlinedNonTerminal(Model::InlinedNonTerminalItem *node) override;
0125 
0126 private:
0127   Model::SymbolItem *mSymbol;
0128 };
0129 
0130 class ProblemSummaryPrinter
0131 {
0132 public:
0133   void operator()();
0134 
0135   static void reportFirstFirstConflict();
0136   static void reportFirstFollowConflict();
0137   static void reportError();
0138 
0139 private:
0140   static int mFirstFirstConflictCount;
0141   static int mFirstFollowConflictCount;
0142   static int mErrorCount;
0143 };
0144 
0145 }
0146 
0147 #endif // KDEV_PG_CHECKER_H
0148 
0149 // kate: space-indent on; indent-width 2; tab-width 2; show-tabs on;