
    AeP                         d dl mZ d dlZddlmZ 	 d dlmZ 	 e e Z G d de      Z G d	 d
e      Z G d de      Zy# e$ r	 d dlmZ Y 5w xY w# e	$ r e
ZY ?w xY w)    )absolute_importN   )TransitionMap)maxsize)maxintc                   F    e Zd ZdZdZdZdZd Zd Zd Z	d Z
d Zd	 Zd
 Zy)Machinez1A collection of Nodes representing an NFA or DFA.Nr   c                      g | _         i | _        y N)statesinitial_statesselfs    4lib/python3.12/site-packages/Cython/Plex/Machines.py__init__zMachine.__init__"   s         c                 F    | j                   D ]  }|j                           y r   )r   destroyr   states     r   __del__zMachine.__del__&   s    [[ 	EMMO	r   c                     t               }| j                  }|dz   | _        ||_        | j                  j	                  |       |S )z-Add a new state to the machine and return it.r   )Nodenext_state_numbernumberr   append)r   sns      r   	new_statezMachine.new_state+   s>    F""!"Q1r   c                 J    | j                         }| j                  ||       |S r   )r   make_initial_stater   namer   s      r   new_initial_statezMachine.new_initial_state4   s#     e,r   c                 "    || j                   |<   y r   r   r"   s      r   r!   zMachine.make_initial_state9       $)D!r   c                      | j                   |   S r   r&   r   r#   s     r   get_initial_statezMachine.get_initial_state<       ""4((r   c                 :   |j                  d       | j                  \|j                  d       t        | j                  j                               D ]%  \  }}|j                  d||j                  fz         ' | j
                  D ]  }|j                  |        y )NzPlex.Machine:
   Initial states:
z      '%s': %d
)writer   sorteditemsr   r   dump)r   filer#   r   r   s        r   r1   zMachine.dump?   s    

$%*JJ-.!'(;(;(A(A(C!D Fu

-u||0DDEF 	AFF4L	r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r$   r!   r*   r1    r   r   r	   r	      s8    ;FN!

*)r   r	   c                   f    e Zd ZdZdZdZdZdZdZd Z	d Z
d Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zy)r   zA state of an NFA or DFA.Nr   c                 8    t               | _        t        | _        y r   )r   transitionsLOWEST_PRIORITYaction_priorityr   s    r   r   zNode.__init__Q   s     )?.r   c                 .    d | _         d | _        d | _        y r   )r:   actionepsilon_closurer   s    r   r   zNode.destroyX   s    #r   c                 <    | j                   j                  ||       y r   )r:   add)r   eventr   s      r   add_transitionzNode.add_transition^   s    UI.r   c                 (    | j                  d|       y)z5Add an epsilon-move from this state to another state. N)rC   r   s     r   link_tozNode.link_toa   s    B&r   c                 @    || j                   kD  r|| _        || _         yy)zMake this an accepting state with the given action. If
        there is already an action, choose the action with highest
        priority.N)r<   r>   )r   r>   prioritys      r   
set_actionzNode.set_actione   s&     d*** DK#+D  +r   c                     | j                   S r   r>   r   s    r   
get_actionzNode.get_actionm   s    {{r   c                     | j                   S r   )r<   r   s    r   get_action_priorityzNode.get_action_priorityp   s    ###r   c                     | j                   d uS r   rK   r   s    r   is_acceptingzNode.is_acceptings   s    {{$&&r   c                      d| j                   z  S )NzState %dr   r   s    r   __str__zNode.__str__v   s    DKK''r   c                     |j                  d| j                  z         | j                  j                  |       | j                  }| j
                  }||j                  d||fz         y y )N   State %d:
z      %s [priority %d]
)r.   r   r:   r1   r>   r<   )r   r2   r>   rH   s       r   r1   z	Node.dumpy   sd    

#dkk12 	d#''JJ1VX4FFG r   c                 4    | j                   |j                   k  S r   rR   )r   others     r   __lt__zNode.__lt__   s    {{U\\))r   )r3   r4   r5   r6   r:   r>   r<   r   r?   r   r   rC   rF   rI   rL   rN   rP   rS   r1   rX   r7   r   r   r   r   I   sV    #KFOFO/$/',$'(
H*r   r   c                   z    e Zd ZdZdZdZdZddddddZd Zd Z	ddZ
d Zefd	Zd
 Zd Zd Zd Zd Zd Zd Zy)FastMachinezd
    FastMachine is a deterministic machine represented in a way that
    allows fast scanning.
    Nr   )rE   boleoleofelsec                      i | _         g | _        y r   )r   r   r   s    r   r   zFastMachine.__init__   s     r   c                 F    | j                   D ]  }|j                           y r   )r   clearr   s     r   r   zFastMachine.__del__   s    [[ 	EKKM	r   c                     | j                   }|dz   | _         | j                  j                         }||d<   ||d<   | j                  j	                  |       |S )Nr   r   r>   )next_numbernew_state_templatecopyr   r   )r   r>   r   results       r   r   zFastMachine.new_state   sX    !!!A:((--/!x!x6"r   c                 "    || j                   |<   y r   r&   r"   s      r   r!   zFastMachine.make_initial_state   r'   r   c                     t        |      t        u r7|\  }}|| k(  r||d<   y ||k7  r ||k  r||t        |      <   |dz  }||k  ry y y |||<   y )Nr^   r   )typetupleunichr)r   r   rB   r   r   code0code1s          r   add_transitionszFastMachine.add_transitions   sh    ;% LE5 )f&em+4E&-(QJE em !
 %E%Lr   c                      | j                   |   S r   r&   r)   s     r   r*   zFastMachine.get_initial_state   r+   r   c                 ,   |j                  d       |j                  d       t        | j                  j                               D ])  \  }}|j                  dt	        |      d|d   d       + | j
                  D ]  }| j                  ||        y )NzPlex.FastMachine:
r-   z      z: r   
)r.   r/   r   r0   reprr   
dump_state)r   r2   r#   r   s       r   r1   zFastMachine.dump   s    

()

)*!$"5"5";";"=> 	IKD%JJ4:uXGH	I[[ 	)EOOE4(	)r   c                     |j                  d|d   z         | j                  ||       |d   }||j                  d|z         y y )NrU   r   r>   z	      %s
)r.   dump_transitions)r   r   r2   r>   s       r   rs   zFastMachine.dump_state   sM    

#eHo56eT*xJJ|f,- r   c                    i }i }|j                         D ]f  \  }}t        |      dk(  r?|j                  t        |      d       }|g }||t        |      <   |j	                  |       St        |      dk  sb|||<   h i }| j
                  D ]6  }|j                  t        |      d       }	|	s!| j                  |	      }
|||
<   8 |j                         }|j                          |D ]1  }
| j                  |
      }||
   }|j                  d||d   fz         3 dD ]0  }|j                  |d       }|s|j                  d||d   fz         2 y )Nr      z      %s --> State %d
r   )r[   r\   r]   r^   )r0   lengetidr   r   chars_to_rangeskeyssortranges_to_stringr.   )r   r   r2   chars_leading_to_statespecial_to_statecr   charsranges_to_state	char_listrangesranges_listkeys                r   ru   zFastMachine.dump_transitions   st   !#kkm 	(FQ1v{.222a5$?=E49*2a51QQ1&' #	( [[ 	0E.222e9dCI--i8*/'		0
 &**,! 	KF''/C#F+EJJ0Cx3IIJ	K 1 	OC$((d3E

4U8_7MMN	Or   c                 Z   |j                          d}t        |      }g }||k  r}t        ||         }|}|dz  }||k  r8t        ||         |dz   k(  r$|dz  }|dz  }||k  rt        ||         |dz   k(  r$|j                  t	        |      t	        |      f       ||k  r}t        |      S )Nr   r   )r}   rx   ordr   chrrj   )r   r   ir   rf   c1c2s          r   r{   zFastMachine.chars_to_ranges   s    	N!eYq\"BBFAa%C	!-a7Qa a%C	!-a7 MM3r7CG,- !e V}r   c                 L    dj                  t        | j                  |            S )N,)joinmaprange_to_string)r   
range_lists     r   r~   zFastMachine.ranges_to_string   s    xxD00*=>>r   c                 ^    |\  }}||k(  rt        |      S t        |      dt        |      S )Nz..)rr   )r   range_tupler   r   s       r   r   zFastMachine.range_to_string   s.    R88O#Bxb22r   r   )r3   r4   r5   r6   r   r   rc   rd   r   r   r   r!   r   rn   r*   r1   rs   ru   r{   r~   r   r7   r   r   rZ   rZ      sp     NFK d4* ?E 
%)).O:?3r   rZ   )
__future__r   sysTransitionsr   r   r   ImportErrorrk   	NameErrorr   r;   objectr	   r   rZ   r7   r   r   <module>r      s{    ' 
 &%
 '*f *Z=*6 =*@v3& v3q  
  Fs"   A  A  AAAA