MimIR
0.5-dev
MimIR is my Intermediate Representation
Toggle main menu visibility
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
13
namespace
automaton
{
14
class
NFANode
{
15
public
:
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
55
private
:
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
63
extern
template
class
AutomatonBase<NFANode>;
64
65
using
NFASet
= std::set<const NFANode*, NFANode::Lt>;
66
67
class
NFA
:
public
AutomatonBase<NFANode>
{
68
public
:
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
automaton.h
automaton::AutomatonBase< NFANode >::AutomatonBase
AutomatonBase()=default
automaton::NFANode
Definition
nfa.h:14
automaton::NFANode::for_transitions
void for_transitions(std::invocable< const NFANode * > auto f, std::uint16_t c) const
Definition
nfa.h:27
automaton::NFANode::print
void print(std::ostream &os) const
Definition
nfa.cpp:22
automaton::NFANode::is_erroring
bool is_erroring() const noexcept
Definition
nfa.h:47
automaton::NFANode::NFANode
NFANode(int id)
Definition
nfa.h:20
automaton::NFANode::set_erroring
void set_erroring(bool erroring) noexcept
Definition
nfa.h:48
automaton::NFANode::is_accepting
bool is_accepting() const
Definition
nfa.h:41
automaton::NFANode::id
constexpr int id() const noexcept
Definition
nfa.h:23
automaton::NFANode::for_transitions
void for_transitions(std::invocable< std::uint16_t, const NFANode * > auto f) const
Definition
nfa.h:34
automaton::NFANode::set_accepting
void set_accepting(bool accepting)
Definition
nfa.h:42
automaton::NFANode::get_transitions
std::vector< const NFANode * > get_transitions(std::uint16_t c) const
Definition
nfa.cpp:11
automaton::NFANode::add_transition
void add_transition(const NFANode *to, std::uint16_t c)
Definition
nfa.cpp:9
automaton::NFA::operator=
NFA & operator=(const NFA &)=delete
automaton::NFA::SpecialTransitons
SpecialTransitons
Definition
nfa.h:73
automaton::NFA::EPSILON
@ EPSILON
Definition
nfa.h:74
automaton::NFA::NFA
NFA(const NFA &)=delete
automaton::NFA::NFA
NFA()=default
automaton
Definition
automaton.h:15
automaton::NFASet
std::set< const NFANode *, NFANode::Lt > NFASet
Definition
nfa.h:65
automaton::NFANode::Lt
Definition
nfa.h:16
automaton::NFANode::Lt::operator()
constexpr bool operator()(const NFANode *n, const NFANode *m) const noexcept
Definition
nfa.h:17
include
automaton
nfa.h
Generated by
1.18.0