@@ -3,12 +3,12 @@ class RegexTree:
3
3
4
4
5
5
class CharClass :
6
- def __init__ (self , chars_list : list [ str ] , min_len : int , max_len : int | None ):
6
+ def __init__ (self , charset : str , min_len : int , max_len : int | None ):
7
7
self ._index = 0
8
- self ._chars : str = '' . join ( sorted ( set ( '' . join ( chars_list ))))
8
+ self ._charset = charset
9
9
self ._min_len = min_len
10
10
self ._max_len = max_len
11
- self ._base = len (self . _chars )
11
+ self ._base = len (charset )
12
12
self .done = self ._base == 0 or self ._max_len == 0
13
13
self .current : list [str ] = self ._first ()
14
14
@@ -18,7 +18,7 @@ def _first(self) -> list[str]:
18
18
19
19
if self ._base == 1 and self ._max_len is not None :
20
20
self .done = True
21
- result = [self ._chars *
21
+ result = [self ._charset *
22
22
i for i in range (self ._min_len , self ._max_len + 1 )]
23
23
return result
24
24
@@ -27,7 +27,7 @@ def _first(self) -> list[str]:
27
27
28
28
result = ['' ]
29
29
for _ in range (self ._min_len ):
30
- result = [pfx + sfx for pfx in self ._chars for sfx in result ]
30
+ result = [pfx + sfx for pfx in self ._charset for sfx in result ]
31
31
32
32
self ._last = result
33
33
return result
@@ -39,7 +39,7 @@ def next(self) -> list[str]:
39
39
if self ._max_len is not None and self ._index + self ._min_len == self ._max_len :
40
40
self .done = True
41
41
42
- result = [pfx + sfx for pfx in self ._last for sfx in self ._chars ]
42
+ result = [pfx + sfx for pfx in self ._last for sfx in self ._charset ]
43
43
self .current .extend (result )
44
44
self ._last = result
45
45
return result
@@ -118,26 +118,18 @@ def next(self) -> set[str]:
118
118
self ._index = index
119
119
result : list [tuple [str , dict [RegexTree , str ]]] = []
120
120
121
- if isinstance (self ._elements [0 ], CharClass ):
121
+ if isinstance (self ._elements [0 ], RegexTree ) and len ( self . _elements [ 0 ]. references ):
122
122
for string in self ._elements [0 ].next () if index == 0 else self ._elements [0 ].current :
123
- result .append ((string , {}))
123
+ result .append ((string , {self . _elements [ 0 ]: string }))
124
124
else :
125
125
for string in self ._elements [0 ].next () if index == 0 else self ._elements [0 ].current :
126
- result .append ((string , {self . _elements [ 0 ]: string }))
126
+ result .append ((string , {}))
127
127
128
128
done = self ._elements [0 ].done
129
129
130
130
for i , element in enumerate (self ._elements [1 :], start = 1 ):
131
131
temp = []
132
- if isinstance (element , CharClass ):
133
- for sfx in element .next () if i == index else element .current :
134
- for pfx in result :
135
- temp .append ((pfx [0 ] + sfx , pfx [1 ]))
136
- elif isinstance (element , RegexTree ):
137
- for sfx in element .next () if i == index else element .current :
138
- for pfx in result :
139
- temp .append ((pfx [0 ] + sfx , {** pfx [1 ], element : sfx }))
140
- else :
132
+ if isinstance (element , BackReference ):
141
133
if i == index :
142
134
element .next ()
143
135
for pfx in result :
@@ -146,6 +138,14 @@ def next(self) -> set[str]:
146
138
for sfx in element .current [reference ]:
147
139
temp .append (
148
140
(pfx [0 ] + sfx , pfx [1 ]))
141
+ elif isinstance (element , RegexTree ) and len (element .references ):
142
+ for sfx in element .next () if i == index else element .current :
143
+ for pfx in result :
144
+ temp .append ((pfx [0 ] + sfx , {** pfx [1 ], element : sfx }))
145
+ else :
146
+ for sfx in element .next () if i == index else element .current :
147
+ for pfx in result :
148
+ temp .append ((pfx [0 ] + sfx , pfx [1 ]))
149
149
result = temp
150
150
done = done and element .done
151
151
@@ -204,33 +204,34 @@ def _first(self) -> set[str]:
204
204
205
205
result : list [tuple [str , dict [RegexTree , str ]]] = []
206
206
207
- if isinstance (self ._elements [0 ], CharClass ):
207
+ if isinstance (self ._elements [0 ], RegexTree ) and len ( self . _elements [ 0 ]. references ):
208
208
for char in self ._elements [0 ].current :
209
- result .append ((char , {}))
209
+ result .append ((char , {self . _elements [ 0 ]: char }))
210
210
else :
211
211
for char in self ._elements [0 ].current :
212
- result .append ((char , {self . _elements [ 0 ]: char }))
212
+ result .append ((char , {}))
213
213
214
214
done = self ._elements [0 ].done
215
215
216
216
for element in self ._elements [1 :]:
217
217
temp : list [tuple [str , dict [RegexTree , str ]]] = []
218
218
done = done and element .done
219
- if isinstance (element , CharClass ):
220
- for pfx in result :
221
- for sfx in element .current :
222
- temp .append ((pfx [0 ] + sfx , pfx [1 ]))
223
- elif isinstance (element , RegexTree ):
224
- for pfx in result :
225
- for sfx in element .current :
226
- temp .append ((pfx [0 ] + sfx , {** pfx [1 ], element : sfx }))
227
- else :
219
+ if isinstance (element , BackReference ):
228
220
for pfx in result :
229
221
reference = pfx [1 ][element .reference ]
230
222
assert reference is not None
231
223
for sfx in element .current [reference ]:
232
224
temp .append (
233
225
(pfx [0 ] + sfx , pfx [1 ]))
226
+ elif isinstance (element , RegexTree ) and len (element .references ):
227
+ for pfx in result :
228
+ for sfx in element .current :
229
+ temp .append ((pfx [0 ] + sfx , {** pfx [1 ], element : sfx }))
230
+ else :
231
+ for pfx in result :
232
+ for sfx in element .current :
233
+ temp .append ((pfx [0 ] + sfx , pfx [1 ]))
234
+
234
235
result = temp
235
236
236
237
self .done = done
0 commit comments