From 2f4118526972f7f3d5147342bc65909fcc82b6c7 Mon Sep 17 00:00:00 2001 From: Roland Reichwein Date: Sun, 16 Feb 2020 16:33:19 +0100 Subject: clang++-9, integrate cppbnf --- bnf.cpp | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) (limited to 'bnf.cpp') diff --git a/bnf.cpp b/bnf.cpp index 1efb459..f240f29 100644 --- a/bnf.cpp +++ b/bnf.cpp @@ -1,6 +1,7 @@ #include "bnf.h" -std::map> Reverse(BNF bnf){ +std::map> Reverse(BNF bnf) +{ std::map> result; for (const auto& [from, to] : bnf) { @@ -18,4 +19,32 @@ std::map> Reverse(BNF bnf){ return result; } +BNF SubBNF(const BNF& bnf, const std::string& top) +{ + BNF result; + + std::vector todo{top}; + + while (!todo.empty()) { + std::string current{todo.back()}; + todo.pop_back(); + + auto it = bnf.find(current); + if (it != bnf.end()) { + // add current value + result[it->first] = it->second; + + // add sub-tree values if not present yet, but available in original bnf + for (auto& variant: it->second) { + for (auto& child: variant) { + if (result.find(child) == result.end() && bnf.find(child) != bnf.end()) { + todo.push_back(child); + } + } + } + } + } + + return result; +} -- cgit v1.2.3