From 4511eab66574b8047376a1f612e84e57d2040a95 Mon Sep 17 00:00:00 2001 From: crupest Date: Sat, 11 Sep 2021 16:31:54 +0800 Subject: ... --- src/parse/Grammar.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'src') diff --git a/src/parse/Grammar.cpp b/src/parse/Grammar.cpp index 8d929212..a2dd14d4 100644 --- a/src/parse/Grammar.cpp +++ b/src/parse/Grammar.cpp @@ -35,4 +35,38 @@ Production* Grammar::CreateProduction(String name, Nonterminal* left, return production; } +bool Grammar::RemoveSymbol(Symbol* symbol) { + for (auto production : productions_) { + if (production->GetLeft() == symbol) return false; + for (auto s : production->GetRight()) { + if (s == symbol) return false; + } + } + + auto i = std::find(symbols_.begin(), symbols_.end(), symbol); + + if (i == symbols_.cend()) return false; + + symbols_.erase(i); + + if (auto t = dynamic_cast(symbol)) { + terminals_.erase(std::find(terminals_.begin(), terminals_.end(), t)); + } else if (auto n = dynamic_cast(symbol)) { + nonterminals_.erase( + std::find(nonterminals_.begin(), nonterminals_.end(), n)); + } + + delete symbol; + + return true; +} + +bool Grammar::RemoveProduction(Production* production) { + auto i = std::find(productions_.begin(), productions_.end(), production); + if (i == productions_.cend()) return false; + productions_.erase(i); + delete production; + return true; +} + } // namespace cru::parse -- cgit v1.2.3