1
- use std:: collections:: { HashMap , HashSet } ;
2
- use std:: hash:: Hash ;
1
+ use std:: collections:: { BTreeMap , BTreeSet } ;
3
2
4
3
use crate :: nfa:: NFA ;
5
4
5
+ #[ derive( Debug , PartialEq ) ]
6
6
pub ( crate ) struct DFA < S , E > {
7
7
initial : S ,
8
- transitions : HashMap < S , HashMap < E , S > > ,
9
- finals : HashSet < S > ,
8
+ transitions : BTreeMap < S , BTreeMap < E , S > > ,
9
+ finals : BTreeSet < S > ,
10
10
}
11
11
12
12
impl < S , E > DFA < S , E >
13
13
where
14
- S : Copy + Eq + Hash ,
15
- E : Copy + Eq + Hash
14
+ S : Copy + Ord ,
15
+ E : Copy + Ord
16
16
{
17
17
fn new ( initial : S ) -> Self {
18
18
Self {
19
19
initial,
20
- transitions : map ! [ initial => HashMap :: new( ) ] ,
21
- finals : HashSet :: new ( ) ,
20
+ transitions : map ! [ initial => BTreeMap :: new( ) ] ,
21
+ finals : BTreeSet :: new ( ) ,
22
22
}
23
23
}
24
24
25
25
fn insert ( & mut self , state : S ) {
26
26
if !self . transitions . contains_key ( & state) {
27
- self . transitions . insert ( state, HashMap :: new ( ) ) ;
27
+ self . transitions . insert ( state, BTreeMap :: new ( ) ) ;
28
28
}
29
29
}
30
30
31
31
fn insert_transition ( & mut self , start : S , event : E , end : S ) {
32
32
if !self . transitions . contains_key ( & start) {
33
- self . transitions . insert ( start, HashMap :: new ( ) ) ;
33
+ self . transitions . insert ( start, BTreeMap :: new ( ) ) ;
34
34
}
35
35
if !self . transitions . contains_key ( & end) {
36
- self . transitions . insert ( end, HashMap :: new ( ) ) ;
36
+ self . transitions . insert ( end, BTreeMap :: new ( ) ) ;
37
37
}
38
38
self . transitions . get_mut ( & start) . unwrap ( ) . insert ( event, end) ;
39
39
}
40
40
41
41
fn insert_final ( & mut self , state : S ) {
42
42
if !self . transitions . contains_key ( & state) {
43
- self . transitions . insert ( state, HashMap :: new ( ) ) ;
43
+ self . transitions . insert ( state, BTreeMap :: new ( ) ) ;
44
44
}
45
45
self . finals . insert ( state) ;
46
46
}
47
47
}
48
48
49
- impl < S , E > Extend < ( S , HashMap < E , S > ) > for DFA < S , E >
49
+ impl < S , E > Extend < ( S , BTreeMap < E , S > ) > for DFA < S , E >
50
50
where
51
- S : Copy + Eq + Hash ,
52
- E : Copy + Eq + Hash
51
+ S : Copy + Ord ,
52
+ E : Copy + Ord
53
53
{
54
- fn extend < T : IntoIterator < Item = ( S , HashMap < E , S > ) > > ( & mut self , iter : T ) {
54
+ fn extend < T : IntoIterator < Item = ( S , BTreeMap < E , S > ) > > ( & mut self , iter : T ) {
55
55
for ( start, transitions) in iter. into_iter ( ) {
56
56
for ( event, end) in transitions. into_iter ( ) {
57
57
self . insert_transition ( start, event, end) ;
@@ -60,12 +60,160 @@ where
60
60
}
61
61
}
62
62
63
- impl < S , E > From < NFA < S , E > > for DFA < S , E >
63
+ impl < S , E > From < NFA < S , E > > for DFA < BTreeSet < S > , E >
64
64
where
65
- S : Eq + Hash ,
66
- E : Eq + Hash
65
+ S : Clone + Ord ,
66
+ E : Clone + Ord
67
67
{
68
- fn from ( _nfa : NFA < S , E > ) -> DFA < S , E > {
69
- panic ! ( "Not implemented" )
68
+ fn from ( nfa : NFA < S , E > ) -> DFA < BTreeSet < S > , E > {
69
+ let mut start_sets = vec ! [ set![ nfa. initial( ) . clone( ) ] ] ;
70
+ let mut transitions = BTreeMap :: new ( ) ;
71
+ let mut finals = BTreeSet :: new ( ) ;
72
+ while let Some ( start_set) = start_sets. pop ( ) {
73
+ transitions. insert ( start_set. clone ( ) , BTreeMap :: new ( ) ) ;
74
+ for start in & start_set {
75
+ for ( event, end_set) in nfa. get ( & start) . unwrap ( ) . clone ( ) {
76
+ if !transitions. contains_key ( & end_set) {
77
+ start_sets. push ( end_set. clone ( ) ) ;
78
+ }
79
+ transitions. get_mut ( & start_set) . unwrap ( ) . insert ( event, end_set) ;
80
+ }
81
+ if nfa. is_final ( & start) {
82
+ finals. insert ( start_set. clone ( ) ) ;
83
+ }
84
+ }
85
+ }
86
+ DFA {
87
+ initial : set ! [ nfa. initial( ) . clone( ) ] ,
88
+ transitions,
89
+ finals
90
+ }
91
+ }
92
+ }
93
+
94
+ #[ cfg( test) ]
95
+ mod tests {
96
+ use crate :: nfa:: ENFA ;
97
+ use crate :: dfa:: DFA ;
98
+ use crate :: re:: RE ;
99
+
100
+ #[ test]
101
+ fn test_1 ( ) {
102
+ let expected = DFA {
103
+ initial : set ! [ 0u128 ] ,
104
+ transitions : map ! [
105
+ set![ 0u128 ] => map![
106
+ None => set![ 1u128 ]
107
+ ] ,
108
+ set![ 1u128 ] => map![ ]
109
+ ] ,
110
+ finals : set ! [ set![ 1u128 ] ] ,
111
+ } ;
112
+ let actual = DFA :: from ( ENFA :: from ( RE :: Epsilon ) ) ;
113
+ assert_eq ! ( expected, actual) ;
114
+ }
115
+
116
+ #[ test]
117
+ fn test_2 ( ) {
118
+ let expected = DFA {
119
+ initial : set ! [ 0u128 ] ,
120
+ transitions : map ! [
121
+ set![ 0u128 ] => map![
122
+ Some ( 'A' ) => set![ 1u128 ]
123
+ ] ,
124
+ set![ 1u128 ] => map![ ]
125
+ ] ,
126
+ finals : set ! [ set![ 1u128 ] ] ,
127
+ } ;
128
+ let actual = DFA :: from ( ENFA :: from ( RE :: Symbol { symbol : 'A' } ) ) ;
129
+ assert_eq ! ( expected, actual) ;
130
+ }
131
+
132
+ #[ test]
133
+ fn test_3 ( ) {
134
+ let expected = DFA {
135
+ initial : set ! [ 0u128 ] ,
136
+ transitions : map ! [
137
+ set![ 0u128 ] => map![
138
+ None => set![ 2u128 , 4u128 ]
139
+ ] ,
140
+ set![ 2u128 , 4u128 ] => map![
141
+ None => set![ 3u128 ] ,
142
+ Some ( 'A' ) => set![ 5u128 ]
143
+ ] ,
144
+ set![ 3u128 ] => map![
145
+ None => set![ 1u128 ]
146
+ ] ,
147
+ set![ 5u128 ] => map![
148
+ None => set![ 1u128 ]
149
+ ] ,
150
+ set![ 1u128 ] => map![ ]
151
+ ] ,
152
+ finals : set ! [ set![ 1u128 ] ] ,
153
+ } ;
154
+ let actual = DFA :: from ( ENFA :: from ( RE :: Alternation {
155
+ res : vec ! [
156
+ RE :: Epsilon ,
157
+ RE :: Symbol { symbol: 'A' } ,
158
+ ] ,
159
+ } ) ) ;
160
+ assert_eq ! ( expected, actual) ;
161
+ }
162
+
163
+ #[ test]
164
+ fn test_4 ( ) {
165
+ let expected = DFA {
166
+ initial : set ! [ 0u128 ] ,
167
+ transitions : map ! [
168
+ set![ 0u128 ] => map![
169
+ None => set![ 2u128 ]
170
+ ] ,
171
+ set![ 2u128 ] => map![
172
+ Some ( 'A' ) => set![ 3u128 ]
173
+ ] ,
174
+ set![ 3u128 ] => map![
175
+ None => set![ 4u128 ]
176
+ ] ,
177
+ set![ 4u128 ] => map![
178
+ None => set![ 5u128 ]
179
+ ] ,
180
+ set![ 5u128 ] => map![
181
+ None => set![ 1u128 ]
182
+ ] ,
183
+ set![ 1u128 ] => map![ ]
184
+ ] ,
185
+ finals : set ! [ set![ 1u128 ] ] ,
186
+ } ;
187
+ let actual = DFA :: from ( ENFA :: from ( RE :: Concatenation {
188
+ res : vec ! [
189
+ RE :: Symbol { symbol: 'A' } ,
190
+ RE :: Epsilon ,
191
+ ] ,
192
+ } ) ) ;
193
+ assert_eq ! ( expected, actual) ;
194
+ }
195
+
196
+ #[ test]
197
+ fn test_5 ( ) {
198
+ let expected = DFA {
199
+ initial : set ! [ 0u128 ] ,
200
+ transitions : map ! [
201
+ set![ 0u128 ] => map![
202
+ None => set![ 2u128 , 1u128 ]
203
+ ] ,
204
+ set![ 2u128 , 1u128 ] => map![
205
+ Some ( 'A' ) => set![ 3u128 ]
206
+ ] ,
207
+ set![ 3u128 ] => map![
208
+ None => set![ 2u128 , 1u128 ]
209
+ ]
210
+ ] ,
211
+ finals : set ! [ set![ 2u128 , 1u128 ] ] ,
212
+ } ;
213
+ let actual = DFA :: from ( ENFA :: from ( RE :: Repetition {
214
+ re : Box :: new ( RE :: Symbol { symbol : 'A' } ) ,
215
+ } ) ) ;
216
+ assert_eq ! ( expected, actual) ;
70
217
}
218
+
71
219
}
0 commit comments