From b2054386014e3604c7a16c6dad0415bf790c06b2 Mon Sep 17 00:00:00 2001 From: IlushaShurupov Date: Sat, 12 Aug 2023 08:27:50 +0300 Subject: [PATCH] CFG remove unused rules --- Containers/public/List.hpp | 1 + Parser/private/CfGrammar.cpp | 11 +++++++++++ Parser/public/CfGrammar.hpp | 8 ++++++++ 3 files changed, 20 insertions(+) diff --git a/Containers/public/List.hpp b/Containers/public/List.hpp index 26ab926..075c45f 100644 --- a/Containers/public/List.hpp +++ b/Containers/public/List.hpp @@ -157,6 +157,7 @@ namespace tp { [[nodiscard]] Node* find(const TypeArg data) const { Node* found = mFirst; for (alni i = 0; data != found->data; i++) { + if (i == length()) return nullptr; if (!found->next) { return nullptr; } diff --git a/Parser/private/CfGrammar.cpp b/Parser/private/CfGrammar.cpp index f23ac40..b2e4b6f 100644 --- a/Parser/private/CfGrammar.cpp +++ b/Parser/private/CfGrammar.cpp @@ -128,11 +128,22 @@ bool CfGrammar::compile() { } } + List remove; for (auto nonTerminal : mNonTerminals) { if (!nonTerminal->val.references.size() && nonTerminal->key != startTerminal) { printf("Non-terminal '%s' is defined but not used\n", nonTerminal->key.read()); + remove.pushBack(nonTerminal->key); } } + for (auto rem : remove) { + auto nonTerminal = &mNonTerminals.get(rem.data()); + for (auto referencing : nonTerminal->referencing) { + referencing->val->references.remove(nonTerminal->rules.first()->data->id); + } + for (auto rule : nonTerminal->rules) { + rules.removeNode(rules.find(*rule.data())); + } + } return true; } \ No newline at end of file diff --git a/Parser/public/CfGrammar.hpp b/Parser/public/CfGrammar.hpp index 391b250..e33db89 100644 --- a/Parser/public/CfGrammar.hpp +++ b/Parser/public/CfGrammar.hpp @@ -12,10 +12,18 @@ namespace tp { String id; bool isTerminal = false; bool isEpsilon = false; + + bool operator==(const Arg& in) const { + return (id == in.id) && (isEpsilon == in.isEpsilon) && (isTerminal == in.isTerminal); + } }; String id; List args; + + bool operator==(const Rule& in) const { + return (id == in.id) && (args == in.args); + } }; struct Sentence {