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