diff --git a/alib2data/src/grammar/GrammarToStringComposer.cpp b/alib2data/src/grammar/GrammarToStringComposer.cpp index 6a3f8247751ba2a97dd81c9c90fe777cbca6ee5a..00a616575821e46f316115ac92cd37a501ff2c5b 100644 --- a/alib2data/src/grammar/GrammarToStringComposer.cpp +++ b/alib2data/src/grammar/GrammarToStringComposer.cpp @@ -1,11 +1,14 @@ #include "GrammarToStringComposer.h" #include "../alphabet/SymbolToStringComposer.h" #include <sstream> +#include "ContextFree/CNF.h" namespace grammar { std::string GrammarToStringComposer::compose(const GrammarBase& grammar) const { - + std::stringstream out; + grammar.Accept((void*) &out, *this); + return out.str(); } std::string GrammarToStringComposer::compose(const Grammar& grammar) const { @@ -50,8 +53,56 @@ std::string GrammarToStringComposer::compose(const EpsilonFreeCFG& grammar) cons } std::string GrammarToStringComposer::compose(const CNF& grammar) const { - // TODO - return "todo"; + alphabet::SymbolToStringComposer sscomp; + std::stringstream ss; + bool first; + + ss << "(CNF," << std::endl; + + ss << "{"; + first = false; + for(const auto& symbol : grammar.getNonterminalAlphabet() ) { + if(first) + ss << ", "; + else + first = true; + ss << sscomp.compose(symbol); + } + ss << "}," << std::endl; + ss << "{"; + first = false; + for(const auto& symbol : grammar.getTerminalAlphabet() ) { + if(first) + ss << ", "; + else + first = true; + ss << sscomp.compose(symbol); + } + ss << "}," << std::endl; + ss << "{ "; + first = false; + for(const auto& rule : grammar.getRawRules() ) { + if(first) + ss << ", " << std::endl << " "; + else + first = true; + ss << sscomp.compose(rule.first); + ss << " -> "; + bool innerFirst = false; + for(const auto& rhs : rule.second) { + if(innerFirst) + ss << " | "; + else + innerFirst = true; + for(const auto& symbol : rhs) + ss << sscomp.compose(symbol) << " "; + } + } + ss << "}," << std::endl; + ss << sscomp.compose(grammar.getInitialSymbol()) << std::endl; + ss << ")" << std::endl; + + return std::move(ss).str(); } std::string GrammarToStringComposer::compose(const GNF& grammar) const {