File indexing completed on 2024-04-28 08:27:19
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;