MimIR
0.4-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 <cstdint>
5
6
#include <map>
7
#include <set>
8
#include <vector>
9
10
#include "
automaton/automaton.h
"
11
12
namespace
automaton
{
13
class
NFANode
{
14
public
:
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
58
private
:
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
66
extern
template
class
AutomatonBase<NFANode>;
67
68
using
NFASet
= std::set<const NFANode*, NFANode::Lt>;
69
70
class
NFA
:
public
AutomatonBase<NFANode>
{
71
public
:
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
automaton.h
automaton::AutomatonBase< NFANode >::AutomatonBase
AutomatonBase()=default
automaton::NFANode
Definition
nfa.h:13
automaton::NFANode::is_erroring
bool is_erroring() const noexcept
Definition
nfa.h:50
automaton::NFANode::NFANode
NFANode(int id)
Definition
nfa.h:19
automaton::NFANode::set_erroring
void set_erroring(bool erroring) noexcept
Definition
nfa.h:51
automaton::NFANode::is_accepting
bool is_accepting() const
Definition
nfa.h:44
automaton::NFANode::for_transitions
void for_transitions(F &&f) const
Definition
nfa.h:37
automaton::NFANode::id
constexpr int id() const noexcept
Definition
nfa.h:22
automaton::NFANode::set_accepting
void set_accepting(bool accepting)
Definition
nfa.h:45
automaton::NFANode::for_transitions
void for_transitions(F &&f, std::uint16_t c) const
Definition
nfa.h:28
automaton::NFANode::get_transitions
std::vector< const NFANode * > get_transitions(std::uint16_t c) const
Definition
nfa.cpp:16
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:76
automaton::NFA::EPSILON
@ EPSILON
Definition
nfa.h:77
automaton::NFA::NFA
NFA(const NFA &)=delete
automaton::NFA::NFA
NFA()=default
automaton
Definition
automaton.h:12
automaton::operator<<
std::ostream & operator<<(std::ostream &os, const DFANode &node)
Definition
dfa.cpp:19
automaton::NFASet
std::set< const NFANode *, NFANode::Lt > NFASet
Definition
nfa.h:68
automaton::NFANode::Lt
Definition
nfa.h:15
automaton::NFANode::Lt::operator()
constexpr bool operator()(const NFANode *n, const NFANode *m) const noexcept
Definition
nfa.h:16
include
automaton
nfa.h
Generated by
1.18.0