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