11from ..automata .rangeset import RangeSet , WORD_RANGESET , NONWORD_RANGESET
22from ..parser .ast import AstNode , AstCharacterSet , AstConcatenation , AstUnion , AstEmpty , AstIteration , \
3- AstBoundaryAssertion
3+ AstBoundaryAssertion , AstGroup
44from ..automata .nfa import NFA , Transition , TransitionPredicate
55from ..parser .tokens import BoundaryAssertionSemantic
66
@@ -30,22 +30,24 @@ def convert(self, node: AstNode) -> NFA:
3030 return self .convert_AstConcatenation (node )
3131 case AstBoundaryAssertion ():
3232 return self .covert_AstBoundaryAssertion (node )
33+ case AstGroup ():
34+ return self .convert_AstGroup (node )
3335 case _:
3436 raise NotImplementedError (f"Cannot convert node { node !r} " )
3537
3638 def convert_AstEmpty (self , _ : AstEmpty ) -> NFA :
3739 return NFA (
3840 states = [0 ],
3941 initial_state = 0 ,
40- final_states = [ 0 ] ,
42+ final_states = { 0 } ,
4143 transitions = {}
4244 )
4345
4446 def convert_AstCharacter (self , node : AstCharacterSet ) -> NFA :
4547 return NFA (
4648 states = [0 , 1 ],
4749 initial_state = 0 ,
48- final_states = [ 1 ] ,
50+ final_states = { 1 } ,
4951 transitions = {0 : {Transition (predicates = (TransitionPredicate (next = node .rs ),), label = node .label ): {1 }}}
5052 )
5153
@@ -55,7 +57,7 @@ def convert_AstIteration(self, node: AstIteration) -> NFA:
5557
5658 for x in nfa .final_states :
5759 nfa .transitions .setdefault (x , {}).setdefault (Transition .make_trivial_epsilon (), set ()).add (nfa .initial_state )
58- nfa .final_states = list ( sorted ( nfa .trivial_epsilon_closure (set (nfa .final_states )) ))
60+ nfa .final_states = nfa .trivial_epsilon_closure (set (nfa .final_states ))
5961 return nfa
6062
6163 def convert_AstUnion (self , node : AstUnion ) -> NFA :
@@ -66,7 +68,7 @@ def convert_AstUnion(self, node: AstUnion) -> NFA:
6668
6769 nfa = nfa_u .copy ()
6870 nfa .states += nfa_v .states
69- nfa .final_states + = nfa_v .final_states
71+ nfa .final_states | = nfa_v .final_states
7072 nfa .transitions .update (nfa_v .transitions )
7173 new_initial_state = max (nfa .states ) + 1
7274 nfa .states .append (new_initial_state )
@@ -144,6 +146,21 @@ def covert_AstBoundaryAssertion(self, node: AstBoundaryAssertion) -> NFA:
144146 return NFA (
145147 states = [0 , 1 ],
146148 initial_state = 0 ,
147- final_states = [ 1 ] ,
149+ final_states = { 1 } ,
148150 transitions = {0 : {transition : {1 }}}
149151 )
152+
153+ def convert_AstGroup (self , node : AstGroup ) -> NFA :
154+ nfa_u = self .convert (node .u ).renumber_states (1 )
155+
156+ start_state = 0
157+ final_state = max (nfa_u .states ) + 1
158+
159+ nfa = nfa_u .copy ()
160+ nfa .initial_state = start_state
161+ nfa .states += [start_state , final_state ]
162+ nfa .final_states = {final_state }
163+ nfa .transitions [start_state ] = {Transition .make_begin_group (node .number ): {nfa_u .initial_state }}
164+ for s in nfa_u .final_states :
165+ nfa .transitions .setdefault (s , {}).setdefault (Transition .make_end_group (node .number ), set ()).add (final_state )
166+ return nfa
0 commit comments