diff options
author | Roland Reichwein <mail@reichwein.it> | 2020-02-16 16:33:19 +0100 |
---|---|---|
committer | Roland Reichwein <mail@reichwein.it> | 2020-02-16 16:33:19 +0100 |
commit | 2f4118526972f7f3d5147342bc65909fcc82b6c7 (patch) | |
tree | 3514b840da299d7203ce1bbcbf81d36be1108260 /cppbnf.cpp | |
parent | 0aaa6440a23e1dedf4a907fa46f979ea9d248e99 (diff) |
clang++-9, integrate cppbnf
Diffstat (limited to 'cppbnf.cpp')
-rwxr-xr-x | cppbnf.cpp | 51 |
1 files changed, 28 insertions, 23 deletions
@@ -21,7 +21,7 @@ namespace { return result; } - std::unordered_map<std::string, std::unordered_set<std::string>> reverseBNF(const T_BNF& bnf) + std::unordered_map<std::string, std::unordered_set<std::string>> reverseBNF(const BNF& bnf) { std::unordered_map<std::string, std::unordered_set<std::string>> result; for (const auto& [symbol, lists] : bnf) { @@ -39,12 +39,12 @@ namespace { return result; } - bool isTerminal(const std::string& symbol, const T_BNF& bnf) + bool isTerminal(const std::string& symbol, const BNF& bnf) { return bnf.find(symbol) == bnf.end(); } - size_t numberOfStartSymbols(const T_BNF& bnf) + size_t numberOfStartSymbols(const BNF& bnf) { // exactly 1 start symbol std::vector<std::string> startSymbols; @@ -64,7 +64,7 @@ namespace { return startSymbols.size(); } - bool symbolsValid(const T_BNF& bnf) + bool symbolsValid(const BNF& bnf) { for (const auto& [symbol, lists] : bnf) { if (boost::contains(symbol, " ")) { @@ -74,14 +74,19 @@ namespace { for (const auto& list : lists) { for (const auto& i : list) { - if (i.size() == 1 && !isTerminal(i, bnf)) { - std::cerr << "Warning: Non-Terminal symbol " << i << " in " << symbol << " is too long." << std::endl; - return false; - } - if (boost::contains(i, " ")) { - std::cerr << "Warning: Symbol " << i << " in " << symbol << " contains space." << std::endl; - return false; + if (!isTerminal(i, bnf)) { + // every non-terminal symbol must be longer that 1 char + if (i.size() == 1) { + std::cerr << "Warning: Non-Terminal symbol " << i << " in " << symbol << " is too short." << std::endl; + return false; + } + + // non-terminal symbols must not contain space + if (boost::contains(i, " ")) { + std::cerr << "Warning: Symbol " << i << " in " << symbol << " contains space." << std::endl; + return false; + } } } } @@ -92,11 +97,11 @@ namespace { // returns 1 if exactly one start symbol and // all nodes size > 1, except terminal symbols - bool valid(const T_BNF& bnf) { + bool valid(const BNF& bnf) { return numberOfStartSymbols(bnf) == 1 && symbolsValid(bnf); } - bool validLex(const T_BNF& bnf) { + bool validLex(const BNF& bnf) { // all terminal symbols exactly one character for (const auto& [symbol, lists] : bnf) { @@ -174,7 +179,7 @@ namespace { } } - T_BNF& normalizeBNF(T_BNF& bnf) + BNF& normalizeBNF(BNF& bnf) { // resolve OPTIONAL symbols for (auto& [symbol, lists] : bnf) { @@ -184,7 +189,7 @@ namespace { return bnf; } - T_BNF& normalizeLexBNF(T_BNF& bnf) + BNF& normalizeLexBNF(BNF& bnf) { normalizeBNF(bnf); @@ -206,9 +211,9 @@ namespace { } // namespace -T_BNF GetCppBNFLex() +BNF GetCppBNFLex() { - T_BNF bnf{ + BNF bnf{ // [gram.lex] {"hex-quad", {{"hexadecimal-digit", "hexadecimal-digit", "hexadecimal-digit", "hexadecimal-digit"}}}, @@ -520,9 +525,9 @@ T_BNF GetCppBNFLex() return normalizeLexBNF(bnf); } -T_BNF GetCppBNFGram() +BNF GetCppBNFGram() { - T_BNF bnf{ + BNF bnf{ // [gram.key] {"typedef-name", {{"identifier"}, {"simple-template-id"}}}, @@ -1919,15 +1924,15 @@ T_BNF GetCppBNFGram() return normalizeBNF(bnf); } -TEST(Lex, Test2) { - auto bnf = GetCppBNFLex(); +TEST(CppBnf, LexicalBnf) { + auto bnf = SubBNF(GetCppBNFLex(), "preprocessing-token"); EXPECT_TRUE(valid(bnf)); EXPECT_TRUE(validLex(bnf)); } -TEST(Gram, Test3) { - auto bnf = GetCppBNFGram(); +TEST(CppBnf, GrammarBnf) { + auto bnf = SubBNF(GetCppBNFGram(), "translation-unit"); EXPECT_TRUE(valid(bnf)); } |