B
    Í‹dP  ã               @   s®   d dl mZ d dlZddlmZ yd dlmZ W n  ek
rP   d dlmZ Y nX ye W n e	k
rr   e
ZY nX 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/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/Cython/Plex/Machines.pyÚ__init__"   s    zMachine.__init__c             C   s   x| j D ]}| ¡  qW d S )N)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 )N)r   Úmake_initial_state)r
   Únamer   r   r   r   Únew_initial_state4   s    zMachine.new_initial_statec             C   s   || j |< d S )N)r	   )r
   r   r   r   r   r   r   9   s    zMachine.make_initial_statec             C   s
   | j | S )N)r	   )r
   r   r   r   r   Úget_initial_state<   s    zMachine.get_initial_statec             C   sl   |  d¡ | jd k	rN|  d¡ x.t| j ¡ ƒD ]\}}|  d||jf ¡ q.W x| jD ]}| |¡ qVW d S )NzPlex.Machine:
z   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 )N)r   ÚtransitionsÚLOWEST_PRIORITYÚaction_priority)r
   r   r   r   r   Q   s    zNode.__init__c             C   s   d | _ d | _d | _d S )N)r%   ÚactionÚepsilon_closure)r
   r   r   r   r   X   s    zNode.destroyc             C   s   | j  ||¡ d S )N)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)r,   )r
   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 )N)r(   )r
   r   r   r   Ú
get_actionm   s    zNode.get_actionc             C   s   | j S )N)r'   )r
   r   r   r   Úget_action_priorityp   s    zNode.get_action_priorityc             C   s
   | j d k	S )N)r(   )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 k	rB|  d||f ¡ d S )Nz   State %d:
z      %s [priority %d]
)r   r   r%   r   r(   r'   )r
   r    r(   r/   r   r   r   r   y   s    z	Node.dumpc             C   s   | j |j k S )N)r   )r
   Úotherr   r   r   Ú__lt__…   s    zNode.__lt__)r!   r"   r#   r$   r%   r(   r'   r   r)   r   r   r,   r.   r0   r1   r2   r3   r4   r   r6   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   )r-   ÚbolÚeolÚeofÚelsec             C   s   i | _ g | _d S )N)r	   r   )r
   r   r   r   r   –   s    zFastMachine.__init__c             C   s   x| j D ]}| ¡  qW d S )N)r   Úclear)r
   r   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 )N)r	   )r
   r   r   r   r   r   r   §   s    zFastMachine.make_initial_statec             C   s`   t |ƒtkrT|\}}|| kr(||d< q\||kr\x*||k rP||t|ƒ< |d7 }q2W n|||< d S )Nr;   r   )ÚtypeÚtupleÚunichr)r
   r   r+   r   r   Zcode0Úcode1r   r   r   Úadd_transitionsª   s    


zFastMachine.add_transitionsc             C   s
   | j | S )N)r	   )r
   r   r   r   r   r   ¶   s    zFastMachine.get_initial_statec             C   sj   |  d¡ |  d¡ x4t| j ¡ ƒD ]"\}}|  dt|ƒ|d f ¡ q$W x| jD ]}|  ||¡ qRW d S )NzPlex.FastMachine:
z   Initial states:
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 k	r<|  d| ¡ d S )Nz   State %d:
r   r(   z	      %s
)r   Údump_transitions)r
   r   r    r(   r   r   r   rG   Á   s
    zFastMachine.dump_statec             C   s*  i }i }xh|  ¡ D ]\\}}t|ƒdkrZ| t|ƒd ¡}|d krNg }||t|ƒ< | |¡ qt|ƒdkr|||< qW i }x4| jD ]*}| t|ƒd ¡}	|	r~|  |	¡}
|||
< q~W | ¡ }| ¡  x4|D ],}
|  	|
¡}||
 }| 
d||d f ¡ qÂW x2dD ]*}| |d ¡}|rø| 
d||d f ¡ qøW d S )Nr   é   z      %s --> State %d
r   )r8   r9   r:   r;   )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   rH   Ë   s6    



zFastMachine.dump_transitionsc             C   sŽ   |  ¡  d}t|ƒ}g }xl||k r„t|| ƒ}|}|d7 }x0||k rjt|| ƒ|d krj|d7 }|d7 }q<W | t|ƒt|ƒf¡ qW t|ƒS )Nr   r   )rO   rJ   Úordr   ÚchrrB   )r
   rS   Úir   r@   Úc1Úc2r   r   r   rM   è   s    
zFastMachine.chars_to_rangesc             C   s   d  t| j|ƒ¡S )Nú,)ÚjoinÚmapÚrange_to_string)r
   Z
range_listr   r   r   rP   ÷   s    zFastMachine.ranges_to_stringc             C   s0   |\}}||krt |ƒS dt |ƒt |ƒf S d S )Nz%s..%s)rF   )r
   Zrange_tuplerY   rZ   r   r   r   r^   ú   s    zFastMachine.range_to_string)N)r!   r"   r#   r$   r	   r   r=   r>   r   r   r   r   r   rE   r   r   rG   rH   rM   rP   r^   r   r   r   r   r7   ‰   s"   
	
r7   )Ú
__future__r   ÚsysZTransitionsr   r   r   ÚImportErrorrC   Ú	NameErrorrW   r&   Úobjectr   r   r7   r   r   r   r   Ú<module>	   s   
-@