@@ -3,12 +3,12 @@ class RegexTree:
33
44
55class 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 ):
77 self ._index = 0
8- self ._chars : str = '' . join ( sorted ( set ( '' . join ( chars_list ))))
8+ self ._charset = charset
99 self ._min_len = min_len
1010 self ._max_len = max_len
11- self ._base = len (self . _chars )
11+ self ._base = len (charset )
1212 self .done = self ._base == 0 or self ._max_len == 0
1313 self .current : list [str ] = self ._first ()
1414
@@ -18,7 +18,7 @@ def _first(self) -> list[str]:
1818
1919 if self ._base == 1 and self ._max_len is not None :
2020 self .done = True
21- result = [self ._chars *
21+ result = [self ._charset *
2222 i for i in range (self ._min_len , self ._max_len + 1 )]
2323 return result
2424
@@ -27,7 +27,7 @@ def _first(self) -> list[str]:
2727
2828 result = ['' ]
2929 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 ]
3131
3232 self ._last = result
3333 return result
@@ -39,7 +39,7 @@ def next(self) -> list[str]:
3939 if self ._max_len is not None and self ._index + self ._min_len == self ._max_len :
4040 self .done = True
4141
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 ]
4343 self .current .extend (result )
4444 self ._last = result
4545 return result
@@ -118,26 +118,18 @@ def next(self) -> set[str]:
118118 self ._index = index
119119 result : list [tuple [str , dict [RegexTree , str ]]] = []
120120
121- if isinstance (self ._elements [0 ], CharClass ):
121+ if isinstance (self ._elements [0 ], RegexTree ) and len ( self . _elements [ 0 ]. references ):
122122 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 }))
124124 else :
125125 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 , {}))
127127
128128 done = self ._elements [0 ].done
129129
130130 for i , element in enumerate (self ._elements [1 :], start = 1 ):
131131 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 ):
141133 if i == index :
142134 element .next ()
143135 for pfx in result :
@@ -146,6 +138,14 @@ def next(self) -> set[str]:
146138 for sfx in element .current [reference ]:
147139 temp .append (
148140 (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 ]))
149149 result = temp
150150 done = done and element .done
151151
@@ -204,33 +204,34 @@ def _first(self) -> set[str]:
204204
205205 result : list [tuple [str , dict [RegexTree , str ]]] = []
206206
207- if isinstance (self ._elements [0 ], CharClass ):
207+ if isinstance (self ._elements [0 ], RegexTree ) and len ( self . _elements [ 0 ]. references ):
208208 for char in self ._elements [0 ].current :
209- result .append ((char , {}))
209+ result .append ((char , {self . _elements [ 0 ]: char }))
210210 else :
211211 for char in self ._elements [0 ].current :
212- result .append ((char , {self . _elements [ 0 ]: char }))
212+ result .append ((char , {}))
213213
214214 done = self ._elements [0 ].done
215215
216216 for element in self ._elements [1 :]:
217217 temp : list [tuple [str , dict [RegexTree , str ]]] = []
218218 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 ):
228220 for pfx in result :
229221 reference = pfx [1 ][element .reference ]
230222 assert reference is not None
231223 for sfx in element .current [reference ]:
232224 temp .append (
233225 (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+
234235 result = temp
235236
236237 self .done = done
0 commit comments