a
    5¹DfP  ã                   @   sª   d dl mZ d dlZddlmZ zd dlmZ W n eyN   d dlmZ Y n0 ze W n e	yn   e
ZY n0 e ZG dd„ deƒZG d	d
„ d
eƒZG dd„ deƒZdS )é    )Úabsolute_importNé   )ÚTransitionMap)Úmaxsize)Úmaxintc                   @   sT   e Zd ZdZdZdZdZdd„ Zdd„ Zdd	„ Z	d
d„ Z
dd„ Zdd„ Zdd„ ZdS )ÚMachinez1A collection of Nodes representing an NFA or DFA.Nr   c                 C   s   g | _ i | _d S ©N)ÚstatesÚinitial_states©Úself© r   úa/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/Cython/Plex/Machines.pyÚ__init__"   s    zMachine.__init__c                 C   s   | j D ]}| ¡  qd S r   )r	   Údestroy©r   Ústater   r   r   Ú__del__&   s    
zMachine.__del__c                 C   s,   t ƒ }| j}|d | _||_| j |¡ |S )z-Add a new state to the machine and return it.r   )ÚNodeÚnext_state_numberÚnumberr	   Úappend)r   ÚsÚnr   r   r   Ú	new_state+   s    
zMachine.new_statec                 C   s   |   ¡ }|  ||¡ |S r   )r   Úmake_initial_state©r   Únamer   r   r   r   Únew_initial_state4   s    zMachine.new_initial_statec                 C   s   || j |< d S r   ©r
   r   r   r   r   r   9   s    zMachine.make_initial_statec                 C   s
   | j | S r   r   ©r   r   r   r   r   Úget_initial_state<   s    zMachine.get_initial_statec                 C   sd   |  d¡ | jd urJ|  d¡ t| j ¡ ƒD ]\}}|  d||jf ¡ q,| jD ]}| |¡ qPd S )NzPlex.Machine:
ú   Initial states:
z      '%s': %d
)Úwriter
   ÚsortedÚitemsr   r	   Údump)r   Úfiler   r   r   r   r   r   r&   ?   s    



zMachine.dump)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   r
   r   r   r   r   r   r!   r&   r   r   r   r   r      s   	r   c                   @   s|   e Zd ZdZdZdZdZdZdZdd„ Z	dd„ Z
dd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )r   zA state of an NFA or DFA.Nr   c                 C   s   t ƒ | _t| _d S r   )r   ÚtransitionsÚLOWEST_PRIORITYÚaction_priorityr   r   r   r   r   Q   s    zNode.__init__c                 C   s   d | _ d | _d | _d S r   )r,   ÚactionÚepsilon_closurer   r   r   r   r   X   s    zNode.destroyc                 C   s   | j  ||¡ d S r   )r,   Úadd)r   Úeventr   r   r   r   Úadd_transition^   s    zNode.add_transitionc                 C   s   |   d|¡ dS )z5Add an epsilon-move from this state to another state.Ú N)r3   r   r   r   r   Úlink_toa   s    zNode.link_toc                 C   s   || j kr|| _|| _ dS )z‹Make 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/   Úpriorityr   r   r   Ú
set_actione   s    
zNode.set_actionc                 C   s   | j S r   ©r/   r   r   r   r   Ú
get_actionm   s    zNode.get_actionc                 C   s   | j S r   )r.   r   r   r   r   Úget_action_priorityp   s    zNode.get_action_priorityc                 C   s
   | j d uS r   r8   r   r   r   r   Úis_acceptings   s    zNode.is_acceptingc                 C   s
   d| j  S )NzState %d©r   r   r   r   r   Ú__str__v   s    zNode.__str__c                 C   sF   |  d| j ¡ | j |¡ | j}| j}|d urB|  d||f ¡ d S )Nú   State %d:
z      %s [priority %d]
)r#   r   r,   r&   r/   r.   )r   r'   r/   r6   r   r   r   r&   y   s    z	Node.dumpc                 C   s   | j |j k S r   r<   )r   Úotherr   r   r   Ú__lt__…   s    zNode.__lt__)r(   r)   r*   r+   r,   r/   r.   r   r0   r   r   r3   r5   r7   r9   r:   r;   r=   r&   r@   r   r   r   r   r   I   s"   r   c                   @   s’   e Zd ZdZdZdZdZddddddœZdd„ Zdd„ Z	dd	d
„Z
dd„ Zefdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚFastMachinezd
    FastMachine is a deterministic machine represented in a way that
    allows fast scanning.
    Nr   )r4   ÚbolÚeolÚeofÚelsec                 C   s   i | _ g | _d S r   )r
   r	   r   r   r   r   r   –   s    zFastMachine.__init__c                 C   s   | j D ]}| ¡  qd S r   )r	   Úclearr   r   r   r   r   š   s    
zFastMachine.__del__c                 C   s:   | j }|d | _ | j ¡ }||d< ||d< | j |¡ |S )Nr   r   r/   )Únext_numberÚnew_state_templateÚcopyr	   r   )r   r/   r   Úresultr   r   r   r   ž   s    

zFastMachine.new_statec                 C   s   || j |< d S r   r   r   r   r   r   r   §   s    zFastMachine.make_initial_statec                 C   s\   t |ƒtu rP|\}}|| kr(||d< qX||krX||k rX||t|ƒ< |d7 }q0n|||< d S )NrE   r   )ÚtypeÚtupleÚunichr)r   r   r2   r   r   Zcode0Úcode1r   r   r   Úadd_transitionsª   s    

zFastMachine.add_transitionsc                 C   s
   | j | S r   r   r    r   r   r   r!   ¶   s    zFastMachine.get_initial_statec                 C   sb   |  d¡ |  d¡ t| j ¡ ƒD ]"\}}|  dt|ƒ|d f ¡ q"| jD ]}|  ||¡ qLd S )NzPlex.FastMachine:
r"   z      %s: %s
r   )r#   r$   r
   r%   Úreprr	   Ú
dump_state)r   r'   r   r   r   r   r   r&   ¹   s    


zFastMachine.dumpc                 C   s@   |  d|d  ¡ |  ||¡ |d }|d ur<|  d| ¡ d S )Nr>   r   r/   z	      %s
)r#   Údump_transitions)r   r   r'   r/   r   r   r   rQ   Á   s
    zFastMachine.dump_statec                 C   s  i }i }|  ¡ D ]\\}}t|ƒdkrX| t|ƒd ¡}|d u rLg }||t|ƒ< | |¡ qt|ƒdkr|||< qi }| jD ]*}| t|ƒd ¡}	|	rx|  |	¡}
|||
< qx| ¡ }| ¡  |D ],}
|  	|
¡}||
 }| 
d||d f ¡ q¸dD ]*}| |d ¡}|rê| 
d||d f ¡ qêd S )Nr   é   z      %s --> State %d
r   )rB   rC   rD   rE   )r%   ÚlenÚgetÚidr   r	   Úchars_to_rangesÚkeysÚsortÚranges_to_stringr#   )r   r   r'   Zchars_leading_to_stateZspecial_to_stateÚcr   ÚcharsZranges_to_stateÚ	char_listÚrangesZranges_listÚkeyr   r   r   rR   Ë   s6    




zFastMachine.dump_transitionsc                 C   s†   |  ¡  d}t|ƒ}g }||k r~t|| ƒ}|}|d7 }||k rft|| ƒ|d krf|d7 }|d7 }q8| t|ƒt|ƒf¡ qt|ƒS )Nr   r   )rY   rT   Úordr   ÚchrrL   )r   r]   Úir   rJ   Úc1Úc2r   r   r   rW   è   s    
zFastMachine.chars_to_rangesc                 C   s   d  t| j|ƒ¡S )Nú,)ÚjoinÚmapÚrange_to_string)r   Z
range_listr   r   r   rZ   ÷   s    zFastMachine.ranges_to_stringc                 C   s0   |\}}||krt |ƒS dt |ƒt |ƒf S d S )Nz%s..%s)rP   )r   Zrange_tuplerc   rd   r   r   r   rh   ú   s    zFastMachine.range_to_string)N)r(   r)   r*   r+   r
   r	   rG   rH   r   r   r   r   r   rO   r!   r&   rQ   rR   rW   rZ   rh   r   r   r   r   rA   ‰   s$   
ÿ
	
rA   )Ú
__future__r   ÚsysZTransitionsr   r   r   ÚImportErrorrM   Ú	NameErrorra   r-   Úobjectr   r   rA   r   r   r   r   Ú<module>	   s   
-@