Thorin 1.9.0
The Higher ORder 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 <vector>
6
7#include <absl/container/flat_hash_map.h>
8
10
11namespace automaton {
12
13class DFANode {
14public:
15 DFANode() = default;
16
17 void add_transition(const DFANode* to, std::uint16_t c);
18 const DFANode* get_transition(std::uint16_t c) const;
19
20 // F: void(const DFANode*)
21 template<class F> void for_transitions(F&& f, std::uint16_t c) const {
22 if (erroring_) return;
23 if (auto it = transitions_.find(c); it != transitions_.end()) f(it->second);
24 }
25
26 // F: void(std::uint16_t, const DFANode*)
27 template<class F> void for_transitions(F&& f) const {
28 if (erroring_) return;
29 for (auto& [c, to] : transitions_) f(c, to);
30 }
31
32 bool is_accepting() const noexcept { return accepting_; }
33 void set_accepting(bool accepting) noexcept {
34 assert(!(accepting && erroring_) && "state cannot be accepting and erroring");
35 accepting_ = accepting;
36 }
37
38 bool is_erroring() const noexcept { return erroring_; }
39 void set_erroring(bool erroring) noexcept {
40 assert(!(accepting_ && erroring) && "state cannot be accepting and erroring");
41 erroring_ = erroring;
42 }
43
44 friend std::ostream& operator<<(std::ostream& os, const DFANode& node);
45
46private:
47 absl::flat_hash_map<std::uint16_t, const DFANode*> transitions_;
48 bool accepting_ = false;
49 bool erroring_ = false;
50};
51
52extern template class AutomatonBase<DFANode>;
53
55public:
56 DFA() = default;
57 DFA(const DFA&) = delete;
58 DFA& operator=(const DFA&) = delete;
59
60 enum SpecialTransitons : std::uint16_t {};
61};
62
63template<class To> using DFAMap = absl::flat_hash_map<const DFANode*, To>;
64
65} // namespace automaton
void set_erroring(bool erroring) noexcept
Definition dfa.h:39
friend std::ostream & operator<<(std::ostream &os, const DFANode &node)
Definition dfa.cpp:20
void for_transitions(F &&f) const
Definition dfa.h:27
bool is_accepting() const noexcept
Definition dfa.h:32
const DFANode * get_transition(std::uint16_t c) const
Definition dfa.cpp:12
void add_transition(const DFANode *to, std::uint16_t c)
Definition dfa.cpp:10
bool is_erroring() const noexcept
Definition dfa.h:38
void set_accepting(bool accepting) noexcept
Definition dfa.h:33
void for_transitions(F &&f, std::uint16_t c) const
Definition dfa.h:21
SpecialTransitons
Definition dfa.h:60
DFA & operator=(const DFA &)=delete
DFA()=default
DFA(const DFA &)=delete
absl::flat_hash_map< const DFANode *, To > DFAMap
Definition dfa.h:63