74 lines
1.8 KiB
C++
74 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include <map>
|
|
#include <vector>
|
|
#include <set>
|
|
#include <memory>
|
|
|
|
namespace NFA {
|
|
class NFAGraph {
|
|
public:
|
|
class Vertex {
|
|
public:
|
|
Vertex(NFAGraph* owner);
|
|
|
|
bool IsFinal() const;
|
|
bool IsStart() const;
|
|
size_t GetNumber() const;
|
|
|
|
const std::map<char, std::set<size_t>>& GetTransitions() const;
|
|
const std::map<char, std::set<size_t>>& GetBackTransitions() const;
|
|
|
|
void AddEdge(char, size_t);
|
|
void RemoveEdge(char, size_t);
|
|
void SetOwner(NFAGraph* owner);
|
|
void SetFinal(bool status);
|
|
void SetStart(bool status);
|
|
private:
|
|
NFAGraph* owner_;
|
|
std::map<char, std::set<size_t>> transitions_;
|
|
std::map<char, std::set<size_t>> back_transitions_;
|
|
|
|
size_t number_;
|
|
bool is_final_ = false;
|
|
bool is_start_ = false;
|
|
|
|
friend class NFAGraph;
|
|
};
|
|
|
|
NFAGraph() = default;
|
|
NFAGraph(const NFAGraph&) = delete;
|
|
NFAGraph(NFAGraph&&);
|
|
|
|
NFAGraph& operator=(const NFAGraph&) = delete;
|
|
NFAGraph& operator=(NFAGraph&&);
|
|
|
|
size_t AddNewVertex();
|
|
void AddFinalVertex(size_t number);
|
|
void AddStartVertex(size_t number);
|
|
|
|
void RemoveVertex(size_t number);
|
|
void RemoveFinalVertex(size_t number);
|
|
void RemoveStartVertex(size_t number);
|
|
|
|
void Composition(NFAGraph&&,
|
|
std::vector<size_t> start_vertexes,
|
|
std::vector<size_t> final_vertexes);
|
|
|
|
Vertex& GetVertex(size_t number);
|
|
bool NotExistVertex(size_t number);
|
|
|
|
size_t GetCountVertexes() const;
|
|
const std::vector<size_t>& GetFinalVertexes() const;
|
|
const std::vector<size_t>& GetStartVertexes() const;
|
|
|
|
void Print() const;
|
|
void CreateDotFile(const std::string& filename) const;
|
|
private:
|
|
size_t count_vertexes_ = 0;
|
|
std::map<size_t, Vertex> vertexes_;
|
|
std::vector<size_t> final_vertexes_;
|
|
std::vector<size_t> start_vertexes_;
|
|
};
|
|
}
|