From 640381135cd6941188329cfd8a0a9d90c14e49d2 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Mon, 1 Dec 2014 23:48:27 +0100 Subject: [PATCH] add CNF printing capability --- .../src/grammar/GrammarToStringComposer.cpp | 57 ++++++++++++++++++- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/alib2data/src/grammar/GrammarToStringComposer.cpp b/alib2data/src/grammar/GrammarToStringComposer.cpp index 6a3f824775..00a6165758 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 { -- GitLab