diff --git a/include/DFA/DFAGraph.hpp b/include/DFA/DFAGraph.hpp index d410e9a..606a166 100644 --- a/include/DFA/DFAGraph.hpp +++ b/include/DFA/DFAGraph.hpp @@ -45,7 +45,7 @@ class DFAGraph { size_t AddNewVertex(); void AddFinalVertex(size_t number); - void AddStartVertex(size_t number); + void SetStartVertex(size_t number); void RemoveVertex(size_t number); void RemoveFinalVertex(size_t number); @@ -56,7 +56,7 @@ class DFAGraph { size_t GetCountVertexes() const; const std::vector& GetFinalVertexes() const; - const std::vector& GetStartVertexes() const; + size_t GetStartVertex() const; void Print() const; bool Accepted(const std::string&) const; @@ -65,6 +65,6 @@ class DFAGraph { size_t count_vertexes_ = 0; std::map vertexes_; std::vector final_vertexes_; - std::vector start_vertexes_; + size_t start_vertex_ = -1; }; } diff --git a/include/converters/NFAToDFA.hpp b/include/converters/NFAToDFA.hpp index 4dd51eb..66eb908 100644 --- a/include/converters/NFAToDFA.hpp +++ b/include/converters/NFAToDFA.hpp @@ -6,7 +6,7 @@ namespace converters { using namespace NFA; using namespace DFA; NFAGraph AddAllEpsilonTransitions(NFAGraph&&); -NFAGraph AddAllPossibleStartFinal(NFAGraph&&); +NFAGraph AddAllPossibleFinalVertexes(NFAGraph&&); NFAGraph DeleteEpsilonTransitions(NFAGraph&&); NFAGraph DeleteTransitionsByOneLetter(NFAGraph&&); DFAGraph NFAGraphToDFAGraph(NFAGraph&&); diff --git a/src/DFA/DFAGraph.cpp b/src/DFA/DFAGraph.cpp index ad280b7..f6f2388 100644 --- a/src/DFA/DFAGraph.cpp +++ b/src/DFA/DFAGraph.cpp @@ -8,7 +8,8 @@ DFAGraph::DFAGraph(DFAGraph&& another) { std::swap(count_vertexes_, another.count_vertexes_); std::swap(vertexes_, another.vertexes_); std::swap(final_vertexes_, another.final_vertexes_); - std::swap(start_vertexes_, another.start_vertexes_); + // TODO + // std::swap(start_vertexes_, another.start_vertexes_); for (auto& i: vertexes_) i.second.owner_ = this; @@ -20,7 +21,8 @@ DFAGraph& DFAGraph::operator=(DFAGraph&& another) { std::swap(count_vertexes_, another.count_vertexes_); std::swap(vertexes_, another.vertexes_); std::swap(final_vertexes_, another.final_vertexes_); - std::swap(start_vertexes_, another.start_vertexes_); + // TODO + // std::swap(start_vertexes_, another.start_vertexes_); for (auto& i: vertexes_) i.second.owner_ = this; @@ -41,10 +43,10 @@ void DFAGraph::AddFinalVertex(size_t number) { } } -void DFAGraph::AddStartVertex(size_t number) { +void DFAGraph::SetStartVertex(size_t number) { if (!GetVertex(number).is_start_) { GetVertex(number).is_start_ = true; - start_vertexes_.push_back(number); + start_vertex_ = number; } } @@ -67,13 +69,8 @@ void DFAGraph::RemoveFinalVertex(size_t number) { } void DFAGraph::RemoveStartVertex(size_t number) { - for (size_t i = 0; i < start_vertexes_.size(); ++i) { - if (start_vertexes_[i] == number) { - GetVertex(number).is_start_ = false; - std::swap(start_vertexes_[i], start_vertexes_.back()); - start_vertexes_.pop_back(); - break; - } + if (start_vertex_ == number) { + start_vertex_ = -1; } } @@ -95,8 +92,8 @@ const std::vector& DFAGraph::GetFinalVertexes() const { return final_vertexes_; } -const std::vector& DFAGraph::GetStartVertexes() const { - return start_vertexes_; +size_t DFAGraph::GetStartVertex() const { + return start_vertex_; } void DFAGraph::Print() const { @@ -114,7 +111,7 @@ void DFAGraph::Print() const { } bool DFAGraph::Accepted(const std::string& str) const { - size_t current = vertexes_.at(start_vertexes_[0]).GetNumber(); + size_t current = start_vertex_; for (auto i: str) { if (vertexes_.at(current).GetTransitions().count(i)) { current = vertexes_.at(vertexes_.at(current).GetTransitions().at(i)).GetNumber(); diff --git a/src/DFA/DFAGraphVertex.cpp b/src/DFA/DFAGraphVertex.cpp index b1602c8..ddad254 100644 --- a/src/DFA/DFAGraphVertex.cpp +++ b/src/DFA/DFAGraphVertex.cpp @@ -50,7 +50,7 @@ void Vertex::SetFinal(bool status) { void Vertex::SetStart(bool status) { if (status != is_start_) { if (status) - owner_->AddStartVertex(number_); + owner_->SetStartVertex(number_); else owner_->RemoveStartVertex(number_); } diff --git a/src/converters/NFAToDFA.cpp b/src/converters/NFAToDFA.cpp index fe24976..843fc06 100644 --- a/src/converters/NFAToDFA.cpp +++ b/src/converters/NFAToDFA.cpp @@ -32,7 +32,7 @@ NFAGraph AddAllEpsilonTransitions(NFAGraph&& nfa_graph) { return std::move(nfa_graph); } -NFAGraph AddAllPossibleStartFinal(NFAGraph&& nfa_graph) { +NFAGraph AddAllPossibleFinalVertexes(NFAGraph&& nfa_graph) { if (nfa_graph.GetStartVertexes().size() != 1) { size_t start_vertex = nfa_graph.AddNewVertex(); for (auto v: nfa_graph.GetStartVertexes()) { @@ -146,8 +146,7 @@ NFAGraph DeleteTransitionsByOneLetter(NFAGraph&& nfa_graph) { } DFAGraph NFAGraphToDFAGraph(NFAGraph&& nfa_graph) { - nfa_graph = AddAllEpsilonTransitions(std::move(nfa_graph)); - nfa_graph = DeleteTransitionsByOneLetter(DeleteEpsilonTransitions(AddAllPossibleStartFinal( + nfa_graph = DeleteTransitionsByOneLetter(DeleteEpsilonTransitions(AddAllPossibleFinalVertexes( AddAllEpsilonTransitions(std::move(nfa_graph))))); const int n = nfa_graph.GetCountVertexes(); @@ -157,12 +156,18 @@ DFAGraph NFAGraphToDFAGraph(NFAGraph&& nfa_graph) { if (nfa_graph.NotExistVertex(i)) continue; number_vertex_in_DFA[i] = result.AddNewVertex(); } + bool exists_start_vertex = false; for (int i = 0; i < n; ++i) { if (nfa_graph.NotExistVertex(i)) continue; if (nfa_graph.GetVertex(i).IsFinal()) result.GetVertex(number_vertex_in_DFA[i]).SetFinal(true); - if (nfa_graph.GetVertex(i).IsStart()) + if (nfa_graph.GetVertex(i).IsStart()) { + if (exists_start_vertex) { + throw std::runtime_error("I can't delete starts vertex"); + } result.GetVertex(number_vertex_in_DFA[i]).SetStart(true); + exists_start_vertex = true; + } const auto& transitions = nfa_graph.GetVertex(i).GetTransitions(); for (const auto& t: transitions) { @@ -170,6 +175,9 @@ DFAGraph NFAGraphToDFAGraph(NFAGraph&& nfa_graph) { result.GetVertex(number_vertex_in_DFA[i]).AddEdge(t.first, *t.second.begin()); } } + if (!exists_start_vertex) { + throw std::runtime_error("I can't find start vertex"); + } return result; } }