99)
1010from codelimit .common .gsm .Pattern import Pattern
1111from codelimit .common .gsm .operator .Operator import Operator
12- from codelimit .common .gsm .utils import render_automata
12+ from codelimit .common .gsm .utils import render_automata , prune_nested
1313
1414T = TypeVar ("T" )
1515
1616
1717def match (expression : Expression , sequence : list ) -> Pattern | None :
1818 nfa = expression_to_nfa (expression )
1919 dfa = nfa_to_dfa (nfa )
20- pattern = Pattern (0 , dfa )
20+ pattern = Pattern (dfa )
2121 for item in sequence :
2222 next_state = pattern .consume (item )
2323 if not next_state :
@@ -32,7 +32,7 @@ def match(expression: Expression, sequence: list) -> Pattern | None:
3232def starts_with (expression : Expression , sequence : list ) -> Pattern | None :
3333 nfa = expression_to_nfa (expression )
3434 dfa = nfa_to_dfa (nfa )
35- pattern = Pattern (0 , dfa )
35+ pattern = Pattern (dfa )
3636 for item in sequence :
3737 next_state = pattern .consume (item )
3838 if not next_state :
@@ -50,31 +50,29 @@ class FindState:
5050 next_state_patterns : list [Pattern ]
5151
5252
53- def find_all (expression : Expression , sequence : list ) -> list [Pattern ]:
53+ def find_all (expression : Expression , sequence : list , nested : bool = False ) -> list [Pattern ]:
5454 dfa = nfa_to_dfa (expression_to_nfa (expression ))
5555 fs = FindState ([], [], [])
5656 for idx , item in enumerate (sequence ):
57- fs .active_patterns .append (Pattern (idx , dfa ))
57+ fs .active_patterns .append (Pattern (dfa , idx ))
5858 fs .next_state_patterns = []
5959 for pattern in fs .active_patterns :
60- if fs .matches and pattern .start < fs .matches [- 1 ].end :
61- continue
62- if len (pattern .state .transition ) == 0 and pattern .is_accepting ():
63- pattern .end = idx
64- fs .matches .append (pattern )
65- continue
6660 if pattern .consume (item ):
6761 fs .next_state_patterns .append (pattern )
68- else :
69- if pattern .is_accepting ():
70- pattern . end = idx
62+ elif pattern . is_accepting () :
63+ pattern .end = idx
64+ if not fs . matches or fs . matches [ - 1 ]. end < pattern . end :
7165 fs .matches .append (pattern )
7266 fs .active_patterns = fs .next_state_patterns
7367 for pattern in fs .active_patterns :
7468 if pattern .is_accepting ():
7569 pattern .end = len (sequence )
76- fs .matches .append (pattern )
77- return fs .matches
70+ if not fs .matches or fs .matches [- 1 ].end < pattern .end :
71+ fs .matches .append (pattern )
72+ if nested :
73+ return fs .matches
74+ else :
75+ return prune_nested (fs .matches )
7876
7977
8078def nfa_match (expression : Expression , sequence : list ):
0 commit comments