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