MimIR
0.4-dev
MimIR is my Intermediate Representation
Toggle main menu visibility
Loading...
Searching...
No Matches
dfa.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
9
#include "
automaton/automaton.h
"
10
11
namespace
automaton
{
12
13
class
DFANode
{
14
public
:
15
struct
Lt
{
16
constexpr
bool
operator()
(
const
DFANode
* n,
const
DFANode
* m)
const
noexcept
{
return
n->id() < m->id(); }
17
};
18
19
DFANode
(
int
id
)
20
: id_(
id
) {}
21
22
constexpr
int
id
() const noexcept {
return
id_; }
23
void
add_transition
(
const
DFANode
* to, std::uint16_t c);
24
const
DFANode
*
get_transition
(std::uint16_t c)
const
;
25
26
// F: void(const DFANode*)
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()) f(it->second);
31
}
32
33
// F: void(std::uint16_t, const DFANode*)
34
template
<
class
F>
35
void
for_transitions
(F&& f)
const
{
36
if
(erroring_)
return
;
37
for
(
auto
& [c, to] : transitions_)
38
f(c, to);
39
}
40
41
bool
is_accepting
() const noexcept {
return
accepting_; }
42
void
set_accepting
(
bool
accepting)
noexcept
{
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
friend
std::ostream&
operator<<
(std::ostream& os,
const
DFANode
& node);
54
55
private
:
56
int
id_;
57
// ordered map keeps for_transitions() iteration in char order - and hence deterministic
58
std::map<std::uint16_t, const DFANode*> transitions_;
59
bool
accepting_ =
false
;
60
bool
erroring_ =
false
;
61
};
62
63
extern
template
class
AutomatonBase<DFANode>;
64
65
class
DFA
:
public
AutomatonBase<DFANode>
{
66
public
:
67
DFA
() =
default
;
68
DFA
(
const
DFA
&) =
delete
;
69
DFA
&
operator=
(
const
DFA
&) =
delete
;
70
71
enum
SpecialTransitons
: std::uint16_t {};
72
};
73
74
template
<
class
To>
75
using
DFAMap
= std::map<const DFANode*, To, DFANode::Lt>;
76
using
DFASet
= std::set<const DFANode*, DFANode::Lt>;
77
78
}
// namespace automaton
automaton.h
automaton::AutomatonBase< DFANode >::AutomatonBase
AutomatonBase()=default
automaton::DFANode
Definition
dfa.h:13
automaton::DFANode::set_erroring
void set_erroring(bool erroring) noexcept
Definition
dfa.h:48
automaton::DFANode::DFANode
DFANode(int id)
Definition
dfa.h:19
automaton::DFANode::for_transitions
void for_transitions(F &&f) const
Definition
dfa.h:35
automaton::DFANode::is_accepting
bool is_accepting() const noexcept
Definition
dfa.h:41
automaton::DFANode::get_transition
const DFANode * get_transition(std::uint16_t c) const
Definition
dfa.cpp:11
automaton::DFANode::add_transition
void add_transition(const DFANode *to, std::uint16_t c)
Definition
dfa.cpp:9
automaton::DFANode::id
constexpr int id() const noexcept
Definition
dfa.h:22
automaton::DFANode::is_erroring
bool is_erroring() const noexcept
Definition
dfa.h:47
automaton::DFANode::set_accepting
void set_accepting(bool accepting) noexcept
Definition
dfa.h:42
automaton::DFANode::for_transitions
void for_transitions(F &&f, std::uint16_t c) const
Definition
dfa.h:28
automaton::DFA::SpecialTransitons
SpecialTransitons
Definition
dfa.h:71
automaton::DFA::operator=
DFA & operator=(const DFA &)=delete
automaton::DFA::DFA
DFA()=default
automaton::DFA::DFA
DFA(const DFA &)=delete
automaton
Definition
automaton.h:12
automaton::DFASet
std::set< const DFANode *, DFANode::Lt > DFASet
Definition
dfa.h:76
automaton::operator<<
std::ostream & operator<<(std::ostream &os, const DFANode &node)
Definition
dfa.cpp:19
automaton::DFAMap
std::map< const DFANode *, To, DFANode::Lt > DFAMap
Definition
dfa.h:75
automaton::DFANode::Lt
Definition
dfa.h:15
automaton::DFANode::Lt::operator()
constexpr bool operator()(const DFANode *n, const DFANode *m) const noexcept
Definition
dfa.h:16
include
automaton
dfa.h
Generated by
1.18.0