From e84b6654719e77dd4cbe7098ec01fed10f3edf97 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Sun, 31 Aug 2014 16:03:55 +0200 Subject: [PATCH] use to string composers --- aconvert2/src/DotConverter.cpp | 146 +++++++++++++++++++++++++-------- 1 file changed, 112 insertions(+), 34 deletions(-) diff --git a/aconvert2/src/DotConverter.cpp b/aconvert2/src/DotConverter.cpp index 2122f1f334..a8fb8fd21d 100644 --- a/aconvert2/src/DotConverter.cpp +++ b/aconvert2/src/DotConverter.cpp @@ -19,6 +19,11 @@ #include <exception/AlibException.h> +#include <alphabet/SymbolToStringComposer.h> +#include <regexp/RegExpToStringComposer.h> +#include <string/StringToStringComposer.h> +#include <label/LabelToStringComposer.h> + #include <set> #include <map> #include <list> @@ -30,11 +35,13 @@ void DotConverter::convert(const automaton::Automaton& a, std::ostream& out) { a.getData().Accept((void*) &out, DotConverter::instance); } -void DotConverter::convert(const automaton::UnknownAutomaton& a, std::ostream& out) { - // TODO +void DotConverter::convert(const automaton::UnknownAutomaton&, std::ostream&) { + throw exception::AlibException("Unknown automaton is not convertible to dot."); } void DotConverter::convert(const automaton::EpsilonNFA& a, std::ostream& out) { + label::LabelToStringComposer composer; + out << "digraph automaton {\n"; out << "rankdir=LR;\n"; int cnt = 1; @@ -47,13 +54,13 @@ void DotConverter::convert(const automaton::EpsilonNFA& a, std::ostream& out) { //Print final states for (const automaton::State& state : a.getFinalStates()) { - out << "node [shape = doublecircle, label=\"" << state.getName() << "\"]; " << states.find(state)->second << ";\n"; + out << "node [shape = doublecircle, label=\"" << composer.compose(state.getName()) << "\"]; " << states.find(state)->second << ";\n"; } //Print nonfinal states for (const auto& state : states) { if (!a.getFinalStates().count(state.first)) { - out << "node [shape = circle, label=\"" << state.first.getName() << "\" ]; " << state.second << ";\n"; + out << "node [shape = circle, label=\"" << composer.compose(state.first.getName()) << "\" ]; " << state.second << ";\n"; } } @@ -68,6 +75,8 @@ void DotConverter::convert(const automaton::EpsilonNFA& a, std::ostream& out) { } void DotConverter::convert(const automaton::NFA& a, std::ostream& out) { + label::LabelToStringComposer composer; + out << "digraph automaton {\n"; out << "rankdir=LR;\n"; int cnt = 1; @@ -80,13 +89,13 @@ void DotConverter::convert(const automaton::NFA& a, std::ostream& out) { //Print final states for (const automaton::State& state : a.getFinalStates()) { - out << "node [shape = doublecircle, label=\"" << state.getName() << "\"]; " << states.find(state)->second << ";\n"; + out << "node [shape = doublecircle, label=\"" << composer.compose(state.getName()) << "\"]; " << states.find(state)->second << ";\n"; } //Print nonfinal states for (const auto& state : states) { if (!a.getFinalStates().count(state.first)) { - out << "node [shape = circle, label=\"" << state.first.getName() << "\" ]; " << state.second << ";\n"; + out << "node [shape = circle, label=\"" << composer.compose(state.first.getName()) << "\" ]; " << state.second << ";\n"; } } @@ -101,6 +110,8 @@ void DotConverter::convert(const automaton::NFA& a, std::ostream& out) { } void DotConverter::convert(const automaton::DFA& a, std::ostream& out) { + label::LabelToStringComposer composer; + out << "digraph automaton {\n"; out << "rankdir=LR;\n"; int cnt = 1; @@ -113,13 +124,13 @@ void DotConverter::convert(const automaton::DFA& a, std::ostream& out) { //Print final states for (const automaton::State& state : a.getFinalStates()) { - out << "node [shape = doublecircle, label=\"" << state.getName() << "\"]; " << states.find(state)->second << ";\n"; + out << "node [shape = doublecircle, label=\"" << composer.compose(state.getName()) << "\"]; " << states.find(state)->second << ";\n"; } //Print nonfinal states for (const auto& state : states) { if (!a.getFinalStates().count(state.first)) { - out << "node [shape = circle, label=\"" << state.first.getName() << "\" ]; " << state.second << ";\n"; + out << "node [shape = circle, label=\"" << composer.compose(state.first.getName()) << "\" ]; " << state.second << ";\n"; } } @@ -132,6 +143,8 @@ void DotConverter::convert(const automaton::DFA& a, std::ostream& out) { } void DotConverter::convert(const automaton::ExtendedNFA& a, std::ostream& out) { + label::LabelToStringComposer composer; + out << "digraph automaton {\n"; out << "rankdir=LR;\n"; int cnt = 1; @@ -144,13 +157,13 @@ void DotConverter::convert(const automaton::ExtendedNFA& a, std::ostream& out) { //Print final states for (const automaton::State& state : a.getFinalStates()) { - out << "node [shape = doublecircle, label=\"" << state.getName() << "\"]; " << states.find(state)->second << ";\n"; + out << "node [shape = doublecircle, label=\"" << composer.compose(state.getName()) << "\"]; " << states.find(state)->second << ";\n"; } //Print nonfinal states for (const auto& state : states) { if (!a.getFinalStates().count(state.first)) { - out << "node [shape = circle, label=\"" << state.first.getName() << "\" ]; " << state.second << ";\n"; + out << "node [shape = circle, label=\"" << composer.compose(state.first.getName()) << "\" ]; " << state.second << ";\n"; } } @@ -165,6 +178,8 @@ void DotConverter::convert(const automaton::ExtendedNFA& a, std::ostream& out) { } void DotConverter::convert(const automaton::CompactNFA& a, std::ostream& out) { + label::LabelToStringComposer composer; + out << "digraph automaton {\n"; out << "rankdir=LR;\n"; int cnt = 1; @@ -177,13 +192,13 @@ void DotConverter::convert(const automaton::CompactNFA& a, std::ostream& out) { //Print final states for (const automaton::State& state : a.getFinalStates()) { - out << "node [shape = doublecircle, label=\"" << state.getName() << "\"]; " << states.find(state)->second << ";\n"; + out << "node [shape = doublecircle, label=\"" << composer.compose(state.getName()) << "\"]; " << states.find(state)->second << ";\n"; } //Print nonfinal states for (const auto& state : states) { if (!a.getFinalStates().count(state.first)) { - out << "node [shape = circle, label=\"" << state.first.getName() << "\" ]; " << state.second << ";\n"; + out << "node [shape = circle, label=\"" << composer.compose(state.first.getName()) << "\" ]; " << state.second << ";\n"; } } @@ -198,6 +213,8 @@ void DotConverter::convert(const automaton::CompactNFA& a, std::ostream& out) { } void DotConverter::convert(const automaton::NPDA& a, std::ostream& out) { + label::LabelToStringComposer composer; + out << "digraph automaton {\n"; out << "rankdir=LR;\n"; int cnt = 1; @@ -210,13 +227,13 @@ void DotConverter::convert(const automaton::NPDA& a, std::ostream& out) { //Print final states for (const automaton::State& state : a.getFinalStates()) { - out << "node [shape = doublecircle, label=\"" << state.getName() << "\"]; " << states.find(state)->second << ";\n"; + out << "node [shape = doublecircle, label=\"" << composer.compose(state.getName()) << "\"]; " << states.find(state)->second << ";\n"; } //Print nonfinal states for (const auto& state : states) { if (!a.getFinalStates().count(state.first)) { - out << "node [shape = circle, label=\"" << state.first.getName() << "\" ]; " << state.second << ";\n"; + out << "node [shape = circle, label=\"" << composer.compose(state.first.getName()) << "\" ]; " << state.second << ";\n"; } } @@ -231,6 +248,8 @@ void DotConverter::convert(const automaton::NPDA& a, std::ostream& out) { } void DotConverter::convert(const automaton::SinglePopNPDA& a, std::ostream& out) { + label::LabelToStringComposer composer; + out << "digraph automaton {\n"; out << "rankdir=LR;\n"; int cnt = 1; @@ -243,13 +262,13 @@ void DotConverter::convert(const automaton::SinglePopNPDA& a, std::ostream& out) //Print final states for (const automaton::State& state : a.getFinalStates()) { - out << "node [shape = doublecircle, label=\"" << state.getName() << "\"]; " << states.find(state)->second << ";\n"; + out << "node [shape = doublecircle, label=\"" << composer.compose(state.getName()) << "\"]; " << states.find(state)->second << ";\n"; } //Print nonfinal states for (const auto& state : states) { if (!a.getFinalStates().count(state.first)) { - out << "node [shape = circle, label=\"" << state.first.getName() << "\" ]; " << state.second << ";\n"; + out << "node [shape = circle, label=\"" << composer.compose(state.first.getName()) << "\" ]; " << state.second << ";\n"; } } @@ -264,6 +283,8 @@ void DotConverter::convert(const automaton::SinglePopNPDA& a, std::ostream& out) } void DotConverter::convert(const automaton::OneTapeDTM& a, std::ostream& out) { + label::LabelToStringComposer composer; + out << "digraph automaton {\n"; out << "rankdir=LR;\n"; int cnt = 1; @@ -276,13 +297,13 @@ void DotConverter::convert(const automaton::OneTapeDTM& a, std::ostream& out) { //Print final states for (const automaton::State& state : a.getFinalStates()) { - out << "node [shape = doublecircle, label=\"" << state.getName() << "\"]; " << states.find(state)->second << ";\n"; + out << "node [shape = doublecircle, label=\"" << composer.compose(state.getName()) << "\"]; " << states.find(state)->second << ";\n"; } //Print nonfinal states for (const auto& state : states) { if (!a.getFinalStates().count(state.first)) { - out << "node [shape = circle, label=\"" << state.first.getName() << "\" ]; " << state.second << ";\n"; + out << "node [shape = circle, label=\"" << composer.compose(state.first.getName()) << "\" ]; " << state.second << ";\n"; } } @@ -303,7 +324,8 @@ void DotConverter::transitions(const automaton::EpsilonNFA& fsm, const std::map< if (transition.first.second.is<string::Epsilon>()) { symbol = "ε"; } else { - symbol = (std::string) transition.first.second.get<alphabet::Symbol>(); + alphabet::SymbolToStringComposer composer; + symbol = composer.compose(std::get<1>(transition.first).get<alphabet::Symbol>()); } for(const automaton::State& to : transition.second) { @@ -313,7 +335,7 @@ void DotConverter::transitions(const automaton::EpsilonNFA& fsm, const std::map< if (mapit == transitions.end()) { transitions.insert(std::make_pair(key, symbol)); } else { - mapit->second += "," + symbol; + mapit->second += ", " + symbol; } } } @@ -330,7 +352,8 @@ void DotConverter::transitions(const automaton::NFA& fsm, const std::map<automat //put transitions from automaton to "transitions" for (const auto& transition : fsm.getTransitions()) { - std::string symbol = (std::string) transition.first.second; + alphabet::SymbolToStringComposer composer; + std::string symbol = composer.compose(transition.first.second); for(const automaton::State& to : transition.second) { std::pair<int, int> key(states.find(transition.first.first)->second, states.find(to)->second); @@ -339,7 +362,7 @@ void DotConverter::transitions(const automaton::NFA& fsm, const std::map<automat if (mapit == transitions.end()) { transitions.insert(std::make_pair(key, symbol)); } else { - mapit->second += "," + symbol; + mapit->second += ", " + symbol; } } } @@ -356,7 +379,8 @@ void DotConverter::transitions(const automaton::DFA& fsm, const std::map<automat //put transitions from automaton to "transitions" for (const auto& transition : fsm.getTransitions()) { - std::string symbol = (std::string) transition.first.second; + alphabet::SymbolToStringComposer composer; + std::string symbol = composer.compose(transition.first.second); std::pair<int, int> key(states.find(transition.first.first)->second, states.find(transition.second)->second); std::map<std::pair<int, int>, std::string>::iterator mapit = transitions.find(key); @@ -364,7 +388,7 @@ void DotConverter::transitions(const automaton::DFA& fsm, const std::map<automat if (mapit == transitions.end()) { transitions.insert(std::make_pair(key, symbol)); } else { - mapit->second += "," + symbol; + mapit->second += ", " + symbol; } } @@ -376,11 +400,57 @@ void DotConverter::transitions(const automaton::DFA& fsm, const std::map<automat } void DotConverter::transitions(const automaton::ExtendedNFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out) { - // TODO + std::map<std::pair<int, int>, std::string> transitions; + + //put transitions from automaton to "transitions" + for (const auto& transition : fsm.getTransitions()) { + regexp::RegExpToStringComposer composer; + std::string symbol = composer.compose(transition.first.second); + + for(const automaton::State& to : transition.second) { + std::pair<int, int> key(states.find(transition.first.first)->second, states.find(to)->second); + std::map<std::pair<int, int>, std::string>::iterator mapit = transitions.find(key); + + if (mapit == transitions.end()) { + transitions.insert(std::make_pair(key, symbol)); + } else { + mapit->second += ", " + symbol; + } + } + } + + //print the map + for (const std::pair<std::pair<int, int>, std::string> transition : transitions) { + out << transition.first.first << " -> " << transition.first.second; + out << "[label=\"" << transition.second << "\"]\n"; + } } void DotConverter::transitions(const automaton::CompactNFA& fsm, const std::map<automaton::State, int>& states, std::ostream& out) { - // TODO + std::map<std::pair<int, int>, std::string> transitions; + + //put transitions from automaton to "transitions" + for (const auto& transition : fsm.getTransitions()) { + string::StringToStringComposer composer; + std::string symbol = composer.compose(string::String { transition.first.second } ); + + for(const automaton::State& to : transition.second) { + std::pair<int, int> key(states.find(transition.first.first)->second, states.find(to)->second); + std::map<std::pair<int, int>, std::string>::iterator mapit = transitions.find(key); + + if (mapit == transitions.end()) { + transitions.insert(std::make_pair(key, symbol)); + } else { + mapit->second += ", " + symbol; + } + } + } + + //print the map + for (const std::pair<std::pair<int, int>, std::string> transition : transitions) { + out << transition.first.first << " -> " << transition.first.second; + out << "[label=\"" << transition.second << "\"]\n"; + } } void DotConverter::transitions(const automaton::NPDA& pda, const std::map<automaton::State, int>& states, std::ostream& out) { @@ -393,7 +463,8 @@ void DotConverter::transitions(const automaton::NPDA& pda, const std::map<automa if (std::get<1>(transition.first).is<string::Epsilon>()) { symbol = "ε"; } else { - symbol = std::get<1>(transition.first).get<alphabet::Symbol>(); + alphabet::SymbolToStringComposer composer; + symbol = composer.compose(std::get<1>(transition.first).get<alphabet::Symbol>()); } symbol += " |"; @@ -403,7 +474,8 @@ void DotConverter::transitions(const automaton::NPDA& pda, const std::map<automa symbol += " ε"; } else { for (alphabet::Symbol symb : std::get<2>(transition.first)) { - symbol += " " + (std::string) symb; + alphabet::SymbolToStringComposer composer; + symbol += " " + composer.compose(symb); } } @@ -416,7 +488,8 @@ void DotConverter::transitions(const automaton::NPDA& pda, const std::map<automa symbol += " ε"; } else { for (alphabet::Symbol symb : to.second) { - symbol += " " + (std::string) symb; + alphabet::SymbolToStringComposer composer; + symbol += " " + composer.compose(symb); } } @@ -450,13 +523,15 @@ void DotConverter::transitions(const automaton::SinglePopNPDA& pda, const std::m if (std::get<1>(transition.first).is<string::Epsilon>()) { symbol = "ε"; } else { - symbol = std::get<1>(transition.first).get<alphabet::Symbol>(); + alphabet::SymbolToStringComposer composer; + symbol = composer.compose(std::get<1>(transition.first).get<alphabet::Symbol>()); } symbol += " |"; //Pop part - symbol += " " + (std::string) std::get<2>(transition.first); + alphabet::SymbolToStringComposer composer; + symbol += " " + composer.compose(std::get<2>(transition.first)); symbol += " ->"; @@ -466,7 +541,8 @@ void DotConverter::transitions(const automaton::SinglePopNPDA& pda, const std::m symbol += " ε"; } else { for (alphabet::Symbol symb : to.second) { - symbol += " " + (std::string) symb; + alphabet::SymbolToStringComposer composer; + symbol += " " + composer.compose(symb); } } @@ -493,13 +569,15 @@ void DotConverter::transitions(const automaton::SinglePopNPDA& pda, const std::m void DotConverter::transitions(const automaton::OneTapeDTM& tm, const std::map<automaton::State, int>& states, std::ostream& out) { std::map<std::pair<int, int>, std::string> transitions; for (const auto& transition : tm.getTransitions()) { + alphabet::SymbolToStringComposer composer; + std::string symbol; //input symbol symbol = "("; - symbol += transition.first.second; + symbol += composer.compose(transition.first.second); symbol += ", "; - symbol += std::get<1>(transition.second); + symbol += composer.compose(std::get<1>(transition.second)); symbol += " "; switch(std::get<2>(transition.second)) { case automaton::Shift::LEFT: -- GitLab