diff --git a/src/DFA/DFAGraph.cpp b/src/DFA/DFAGraph.cpp index 4b6c2fc..7ac3538 100644 --- a/src/DFA/DFAGraph.cpp +++ b/src/DFA/DFAGraph.cpp @@ -3,6 +3,7 @@ #include #include +extern std::map names; namespace DFA { DFAGraph::DFAGraph(DFAGraph&& another) { std::swap(count_vertexes_, another.count_vertexes_); @@ -131,14 +132,14 @@ void DFAGraph::CreateDotFile(const std::string& filename) const { for (auto& i: vertexes_) { for (auto& j: i.second.transitions_) { - out << i.first << "->" << j.second << "[label=" << j.first << "]\n"; + out << "\"" << i.first << "\"" << "->\"" << j.second << "\"[label=" << j.first << "]\n"; } if (i.second.IsStart() && i.second.IsFinal()) { - out << " " << i.first << " [shape=star];\n"; + out << " \"" << i.first << "\" [shape=star];\n"; } else if (i.second.IsStart()) { - out << " " << i.first << " [shape=rarrow];\n"; + out << " \"" << i.first << "\" [shape=rarrow];\n"; } else if (i.second.IsFinal()) { - out << " " << i.first << " [shape=Msquare];\n"; + out << " \"" << i.first << "\" [shape=Msquare];\n"; } } diff --git a/src/NFA/NFAGraphVertex.cpp b/src/NFA/NFAGraphVertex.cpp index 32610a9..11da715 100644 --- a/src/NFA/NFAGraphVertex.cpp +++ b/src/NFA/NFAGraphVertex.cpp @@ -26,7 +26,6 @@ const std::map>& Vertex::GetBackTransitions() const { void Vertex::AddEdge(char symbol, size_t number) { transitions_[symbol].insert(number); - owner_->GetVertex(number).back_transitions_[symbol]; owner_->GetVertex(number).back_transitions_[symbol].insert(number_); } diff --git a/src/converters/DFAToFDFA.cpp b/src/converters/DFAToFDFA.cpp index 6b7245d..b5fa277 100644 --- a/src/converters/DFAToFDFA.cpp +++ b/src/converters/DFAToFDFA.cpp @@ -18,7 +18,7 @@ DFAGraph DFAGraphToFDFAGraph(DFAGraph&& graph, const std::vector& alphabet const auto& transitions = graph.GetVertex(i).GetTransitions(); for (const auto& t: transitions) { - result.GetVertex(number_vertex_in_DFA[i]).AddEdge(t.first, t.second); + result.GetVertex(number_vertex_in_DFA[i]).AddEdge(t.first, number_vertex_in_DFA[t.second]); } } diff --git a/src/converters/DFAToMinDFA.cpp b/src/converters/DFAToMinDFA.cpp index af52be9..591e49e 100644 --- a/src/converters/DFAToMinDFA.cpp +++ b/src/converters/DFAToMinDFA.cpp @@ -66,7 +66,6 @@ DFAGraph DFAGraphToMinDFAGraph(DFAGraph&& graph) { } } - /* for (int i = 0; i < n; ++i) { for (int k = 0; k < n; ++k) { for (int j = 0; j < alphabet.size() + 1; ++j) { @@ -76,7 +75,6 @@ DFAGraph DFAGraphToMinDFAGraph(DFAGraph&& graph) { } std::cout << std::endl; } - */ std::vector>& last_layer(table.back()); size_t count_vertex = 0; diff --git a/src/converters/DFAToRegular.cpp b/src/converters/DFAToRegular.cpp index 96741a7..128b4ad 100644 --- a/src/converters/DFAToRegular.cpp +++ b/src/converters/DFAToRegular.cpp @@ -41,8 +41,8 @@ std::string DFAGraphToRegular(DFAGraph&& graph) { const bool print_table = true; - auto PrintTable = [n, &transitions](int i) { - std::ofstream out("ConvertToRegular/" + std::to_string(n - i) + ".dot"); + auto PrintTable = [cnt, &transitions](int i) { + std::ofstream out("ConvertToRegular/" + std::to_string(cnt - i) + ".dot"); out << "digraph G {\n"; for (int j = 0; j < i; ++j) { @@ -158,7 +158,10 @@ std::string DFAGraphToRegular(DFAGraph&& graph) { } if (start_to_end.size()) start_to_end.pop_back(); - + transitions[0][0].clear(); + transitions[1][0].clear(); + transitions[1][0].insert(loop + "(" + start_to_end + ")"); + return loop + "(" + start_to_end + ")"; } } diff --git a/src/converters/NFAToDFA.cpp b/src/converters/NFAToDFA.cpp index 8a86061..d3a76c1 100644 --- a/src/converters/NFAToDFA.cpp +++ b/src/converters/NFAToDFA.cpp @@ -101,7 +101,7 @@ NFAGraph DeleteTransitionsByOneLetter(NFAGraph&& nfa_graph) { number_vertex_in_result_tree[{i}] = result_tree.AddNewVertex(); } - const bool print_table = false; + const bool print_table = true; const size_t length_set = 10; if (print_table) { std::cout << std::setw(length_set) << "vertex" << " | "; @@ -191,7 +191,9 @@ DFAGraph NFAGraphToDFAGraph(NFAGraph&& nfa_graph) { nfa_graph = AddAllEpsilonTransitions(std::move(nfa_graph)); nfa_graph = AddAllPossibleFinalVertexes(std::move(nfa_graph)); nfa_graph = DeleteEpsilonTransitions(std::move(nfa_graph)); + nfa_graph.CreateDotFile("5.dot"); nfa_graph = DeleteTransitionsByOneLetter(std::move(nfa_graph)); + nfa_graph.CreateDotFile("6.dot"); const int n = nfa_graph.GetCountVertexes(); DFAGraph result; diff --git a/src/converters/RegularToNFA.cpp b/src/converters/RegularToNFA.cpp index acae0a6..5fe9c22 100644 --- a/src/converters/RegularToNFA.cpp +++ b/src/converters/RegularToNFA.cpp @@ -44,6 +44,16 @@ NFAGraph RegularToNFA(std::unique_ptr node) { const auto& start_vertexes = result.GetStartVertexes(); const auto& end_vertexes = result.GetFinalVertexes(); + size_t start = result.AddNewVertex(); + for (auto to: start_vertexes) { + result.GetVertex(start).AddEdge(' ', to); + } + auto t = result.GetStartVertexes(); + for (auto to: t) { + result.RemoveStartVertex(to); + } + result.AddStartVertex(start); + if (node->modifier == Node::Modifier::Plus) { for (auto start: start_vertexes) { for (auto end: end_vertexes) { diff --git a/src/main.cpp b/src/main.cpp index b7be29e..c12479e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -63,6 +63,33 @@ std::string GenerateRandomString(std::vector alphabet, size_t len) { } return res; } +std::map names; int main() { + NFAGraph nfa; + for (int i = 0; i < 10; ++i) + nfa.AddNewVertex(); + auto AddEdge = [&](char symbol, int u, int v) { + nfa.GetVertex(u).AddEdge(symbol, v); + }; + + AddEdge('a', 1, 1); + AddEdge('a', 1, 2); + AddEdge('b', 2, 1); + AddEdge('b', 1, 3); + AddEdge('a', 3, 1); + AddEdge('b', 3, 4); + AddEdge('a', 4, 3); + AddEdge('a', 0, 1); + nfa.GetVertex(0).SetStart(true); + nfa.GetVertex(1).SetFinal(true); + + nfa.CreateDotFile("3.dot"); + DFAGraph dfa = NFAGraphToDFAGraph(std::move(nfa)); + dfa = DFAGraphToFDFAGraph(std::move(dfa), {'a', 'b'}); + dfa = InvertFDFAGraph(std::move(dfa)); + dfa.CreateDotFile("1.dot"); + dfa.CreateDotFile("8.dot"); + dfa = DFAGraphToMinDFAGraph(std::move(dfa)); + dfa.CreateDotFile("2.dot"); }