2021-09-27 20:13:02 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <map>
|
|
|
|
#include <vector>
|
2021-10-03 13:42:51 +00:00
|
|
|
#include <set>
|
2021-09-27 20:13:02 +00:00
|
|
|
#include <memory>
|
|
|
|
|
|
|
|
namespace NFA {
|
|
|
|
class NFATree {
|
|
|
|
public:
|
|
|
|
class Vertex {
|
|
|
|
public:
|
2021-10-05 12:01:30 +00:00
|
|
|
Vertex(NFATree* owner);
|
2021-09-27 20:13:02 +00:00
|
|
|
|
|
|
|
bool IsFinal() const;
|
|
|
|
bool IsStart() const;
|
2021-10-03 13:42:51 +00:00
|
|
|
size_t GetNumber() const;
|
2021-09-27 20:13:02 +00:00
|
|
|
|
2021-10-05 12:01:30 +00:00
|
|
|
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(NFATree* owner);
|
|
|
|
void SetFinal(bool status);
|
|
|
|
void SetStart(bool status);
|
2021-09-27 20:13:02 +00:00
|
|
|
private:
|
2021-10-05 12:01:30 +00:00
|
|
|
NFATree* owner_;
|
|
|
|
std::map<char, std::set<size_t>> transitions_;
|
|
|
|
std::map<char, std::set<size_t>> back_transitions_;
|
2021-10-03 13:42:51 +00:00
|
|
|
|
|
|
|
size_t number_;
|
2021-09-27 20:13:02 +00:00
|
|
|
bool is_final_ = false;
|
|
|
|
bool is_start_ = false;
|
2021-10-03 13:42:51 +00:00
|
|
|
|
|
|
|
friend class NFATree;
|
2021-09-27 20:13:02 +00:00
|
|
|
};
|
|
|
|
|
2021-10-03 13:42:51 +00:00
|
|
|
NFATree() = default;
|
|
|
|
NFATree(const NFATree&) = delete;
|
2021-10-05 12:01:30 +00:00
|
|
|
NFATree(NFATree&&);
|
2021-10-03 13:42:51 +00:00
|
|
|
|
|
|
|
NFATree& operator=(const NFATree&) = delete;
|
2021-10-05 12:01:30 +00:00
|
|
|
NFATree& operator=(NFATree&&);
|
2021-10-03 13:42:51 +00:00
|
|
|
|
|
|
|
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(NFATree&&,
|
|
|
|
std::vector<size_t> start_vertexes,
|
|
|
|
std::vector<size_t> final_vertexes);
|
|
|
|
|
|
|
|
std::shared_ptr<Vertex> GetVertex(size_t number);
|
|
|
|
size_t GetCountVertexes() const;
|
|
|
|
const std::vector<size_t>& GetFinalVertexes() const;
|
|
|
|
const std::vector<size_t>& GetStartVertexes() const;
|
2021-09-27 20:13:02 +00:00
|
|
|
|
2021-10-03 13:42:51 +00:00
|
|
|
void Print() const;
|
2021-09-27 20:13:02 +00:00
|
|
|
private:
|
2021-10-03 13:42:51 +00:00
|
|
|
size_t count_vertexes_ = 0;
|
|
|
|
std::map<size_t, std::shared_ptr<Vertex>> vertexes_;
|
|
|
|
std::vector<size_t> final_vertexes_;
|
|
|
|
std::vector<size_t> start_vertexes_;
|
2021-09-27 20:13:02 +00:00
|
|
|
};
|
|
|
|
}
|