MimIR 0.1
MimIR is my Intermediate Representation
Loading...
Searching...
No Matches
nfa.h
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4
5#include <vector>
6
7#include <absl/container/flat_hash_map.h>
8
10
11namespace automaton {
12class NFANode {
13public:
14 NFANode(int id)
15 : id_(id) {}
16
17 constexpr int id() const noexcept { return id_; }
18 void add_transition(const NFANode* to, std::uint16_t c);
19 std::vector<const NFANode*> get_transitions(std::uint16_t c) const;
20
21 // F: void(const NFANode*)
22 template<class F> void for_transitions(F&& f, std::uint16_t c) const {
23 if (erroring_) return;
24 if (auto it = transitions_.find(c); it != transitions_.end())
25 for (const auto& to : it->second) std::forward<F>(f)(to);
26 }
27
28 // F: void(std::uint16_t, const NFANode*)
29 template<class F> void for_transitions(F&& f) const {
30 if (erroring_) return;
31 for (auto& [c, tos] : transitions_)
32 for (const auto& to : tos) std::forward<F>(f)(c, to);
33 }
34
35 bool is_accepting() const { return accepting_; }
36 void set_accepting(bool accepting) {
37 assert(!(accepting && erroring_) && "state cannot be accepting and erroring");
38 accepting_ = accepting;
39 }
40
41 bool is_erroring() const noexcept { return erroring_; }
42 void set_erroring(bool erroring) noexcept {
43 assert(!(accepting_ && erroring) && "state cannot be accepting and erroring");
44 erroring_ = erroring;
45 }
46
47 friend std::ostream& operator<<(std::ostream& os, const NFANode& node);
48
49private:
50 int id_;
51 absl::flat_hash_map<std::uint16_t, std::vector<const NFANode*>> transitions_;
52 bool accepting_ = false;
53 bool erroring_ = false;
54};
55
56extern template class AutomatonBase<NFANode>;
57
59public:
60 NFA() = default;
61 NFA(const NFA&) = delete;
62 NFA& operator=(const NFA&) = delete;
63
64 enum SpecialTransitons : std::uint16_t {
65 EPSILON = 0x8001,
66 };
67};
68
69} // namespace automaton
bool is_erroring() const noexcept
Definition nfa.h:41
NFANode(int id)
Definition nfa.h:14
void set_erroring(bool erroring) noexcept
Definition nfa.h:42
bool is_accepting() const
Definition nfa.h:35
void for_transitions(F &&f) const
Definition nfa.h:29
constexpr int id() const noexcept
Definition nfa.h:17
friend std::ostream & operator<<(std::ostream &os, const NFANode &node)
Definition nfa.cpp:25
void set_accepting(bool accepting)
Definition nfa.h:36
void for_transitions(F &&f, std::uint16_t c) const
Definition nfa.h:22
std::vector< const NFANode * > get_transitions(std::uint16_t c) const
Definition nfa.cpp:14
void add_transition(const NFANode *to, std::uint16_t c)
Definition nfa.cpp:7
NFA & operator=(const NFA &)=delete
SpecialTransitons
Definition nfa.h:64
NFA(const NFA &)=delete
NFA()=default