formalang/include/NFA/NFATree.hpp

62 lines
1.4 KiB
C++
Raw Normal View History

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:
Vertex();
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-03 13:42:51 +00:00
std::multimap<char, size_t> transitions;
2021-09-27 20:13:02 +00:00
private:
2021-10-03 13:42:51 +00:00
Vertex(bool is_final, bool is_start);
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;
NFATree(NFATree&&) = default;
NFATree& operator=(const NFATree&) = delete;
NFATree& operator=(NFATree&&) = default;
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
};
}