2021-10-05 12:01:30 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <map>
|
|
|
|
#include <vector>
|
|
|
|
#include <set>
|
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
namespace DFA {
|
|
|
|
class DFAGraph {
|
|
|
|
public:
|
|
|
|
class Vertex {
|
|
|
|
public:
|
|
|
|
Vertex(DFAGraph* owner);
|
|
|
|
|
|
|
|
bool IsFinal() const;
|
|
|
|
bool IsStart() const;
|
|
|
|
size_t GetNumber() const;
|
|
|
|
|
|
|
|
const std::map<char, size_t>& GetTransitions() const;
|
|
|
|
const std::map<char, size_t>& GetBackTransitions() const;
|
|
|
|
|
|
|
|
void AddEdge(char, size_t);
|
|
|
|
void RemoveEdge(char);
|
|
|
|
void SetOwner(DFAGraph* owner);
|
|
|
|
void SetFinal(bool status);
|
|
|
|
void SetStart(bool status);
|
|
|
|
private:
|
|
|
|
DFAGraph* owner_;
|
|
|
|
std::map<char, size_t> transitions_;
|
|
|
|
std::map<char, size_t> back_transitions_;
|
|
|
|
|
|
|
|
size_t number_;
|
|
|
|
bool is_final_ = false;
|
|
|
|
bool is_start_ = false;
|
|
|
|
|
|
|
|
friend class DFAGraph;
|
|
|
|
};
|
|
|
|
|
|
|
|
DFAGraph() = default;
|
|
|
|
DFAGraph(const DFAGraph&) = delete;
|
2021-10-05 14:03:03 +00:00
|
|
|
DFAGraph(DFAGraph&&);
|
2021-10-05 12:01:30 +00:00
|
|
|
|
|
|
|
DFAGraph& operator=(const DFAGraph&) = delete;
|
2021-10-05 14:03:03 +00:00
|
|
|
DFAGraph& operator=(DFAGraph&&);
|
2021-10-05 12:01:30 +00:00
|
|
|
|
|
|
|
size_t AddNewVertex();
|
|
|
|
void AddFinalVertex(size_t number);
|
2021-10-10 21:32:47 +00:00
|
|
|
void SetStartVertex(size_t number);
|
2021-10-05 12:01:30 +00:00
|
|
|
|
|
|
|
void RemoveVertex(size_t number);
|
|
|
|
void RemoveFinalVertex(size_t number);
|
|
|
|
void RemoveStartVertex(size_t number);
|
|
|
|
|
2021-10-10 18:08:13 +00:00
|
|
|
Vertex& GetVertex(size_t number);
|
|
|
|
bool NotExistVertex(size_t number);
|
2021-10-05 12:01:30 +00:00
|
|
|
|
|
|
|
size_t GetCountVertexes() const;
|
|
|
|
const std::vector<size_t>& GetFinalVertexes() const;
|
2021-10-10 21:32:47 +00:00
|
|
|
size_t GetStartVertex() const;
|
2021-10-05 12:01:30 +00:00
|
|
|
|
|
|
|
void Print() const;
|
|
|
|
bool Accepted(const std::string&) const;
|
2021-10-05 17:41:05 +00:00
|
|
|
void CreateDotFile(const std::string& filename) const;
|
2021-10-05 12:01:30 +00:00
|
|
|
private:
|
|
|
|
size_t count_vertexes_ = 0;
|
2021-10-10 18:08:13 +00:00
|
|
|
std::map<size_t, Vertex> vertexes_;
|
2021-10-05 12:01:30 +00:00
|
|
|
std::vector<size_t> final_vertexes_;
|
2021-10-10 21:32:47 +00:00
|
|
|
size_t start_vertex_ = -1;
|
2021-10-05 12:01:30 +00:00
|
|
|
};
|
|
|
|
}
|