diff options
author | Roland Reichwein <mail@reichwein.it> | 2020-03-30 18:33:01 +0200 |
---|---|---|
committer | Roland Reichwein <mail@reichwein.it> | 2020-03-30 18:33:01 +0200 |
commit | 79fbc8bf495770e4a8b7c66c46acf07f4e47e568 (patch) | |
tree | 174c0f3c194013c39a73f6a50ed8866784388c07 /bnf.cpp | |
parent | 2eb2383387d16fc919c07e1a6b9211406576b893 (diff) |
Speed up compile
Diffstat (limited to 'bnf.cpp')
-rw-r--r-- | bnf.cpp | 64 |
1 files changed, 58 insertions, 6 deletions
@@ -1,8 +1,8 @@ #include "bnf.h" -std::unordered_map<std::string, std::set<std::string>> Reverse(BNF bnf) +std::unordered_map<std::string, std::unordered_set<std::string>> Reverse(const BNF& bnf) { - std::unordered_map<std::string, std::set<std::string>> result; + std::unordered_map<std::string, std::unordered_set<std::string>> result; for (const auto& [from, to] : bnf) { for (const auto& list : to) { @@ -11,7 +11,7 @@ std::unordered_map<std::string, std::set<std::string>> Reverse(BNF bnf) if (i != result.end()) // already present i->second.insert(from); else // new element - result.emplace(element, std::set{from}); + result.emplace(element, std::unordered_set{from}); } } } @@ -19,9 +19,9 @@ std::unordered_map<std::string, std::set<std::string>> Reverse(BNF bnf) return result; } -std::unordered_map<std::string, std::set<std::string>> reverseFirst(BNF bnf) +std::unordered_map<std::string, std::unordered_set<std::string>> reverseFirst(const BNF& bnf) { - std::unordered_map<std::string, std::set<std::string>> result; + std::unordered_map<std::string, std::unordered_set<std::string>> result; for (const auto& [from, to] : bnf) { for (const auto& list : to) { @@ -31,7 +31,7 @@ std::unordered_map<std::string, std::set<std::string>> reverseFirst(BNF bnf) if (i != result.end()) // already present i->second.insert(from); else // new element - result.emplace(element, std::set{from}); + result.emplace(element, std::unordered_set{from}); } } } @@ -73,3 +73,55 @@ bool isTerminal(const BNF& bnf, const std::string& symbol) return bnf.find(symbol) == bnf.end(); } +std::unordered_set<std::string> getTerminals(const BNF& bnf) +{ + std::unordered_set<std::string> result; + + for (const auto& [from, to] : bnf) { + for (const auto& list : to) { + for (const auto& element : list) { + if (isTerminal(bnf, element)) + result.insert(element); + } + } + } + + return result; +} + +std::unordered_set<std::pair<std::string, size_t>, PairHash> getEmptyPositions(const BNF& bnf) +{ + std::unordered_set<std::pair<std::string, size_t>, PairHash> result; + + for (const auto& [from, to] : bnf) { + for (size_t i = 0; i < to.size(); i++) { + const auto& list{to[i]}; + if (list.size() == 0) + result.insert({from, i}); + } + } + + return result; +} + +std::unordered_map<std::string, std::unordered_set<std::pair<std::string, index_t>, PairHash>> reversePosFirst(const BNF& bnf) +{ + std::unordered_map<std::string, std::unordered_set<std::pair<std::string, index_t>, PairHash>> result; + + for (const auto& [from, to] : bnf) { + for (size_t i = 0; i < to.size(); i++) { + const auto& list{to[i]}; + if (list.size() > 0) { + const auto& element{list[0]}; + auto it{result.find(element)}; + if (it != result.end()) // already present + it->second.insert({from, i}); + else // new element + result.emplace(element, std::unordered_set<std::pair<std::string, index_t>, PairHash>{{from, i}}); + } + } + } + + return result; +} + |