3
"LXP                 @   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   d/home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python3.6/site-packages/Cython/Plex/Machines.py__init__"   s    zMachine.__init__c             C   s   x| j D ]}|j  qW d S )N)r   destroy)r
   stater   r   r   __del__&   s    zMachine.__del__c             C   s,   t  }| j}|d | _||_| j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   | j  }| j|| |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   |j d | jd k	rN|j d x.t| jj D ]\}}|j d||jf  q.W x| jD ]}|j| 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 j|| d S )N)r%   add)r
   eventr   r   r   r   add_transition^   s    zNode.add_transitionc             C   s   | j 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 )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(   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   |j d| j  | jj| | j}| j}|d k	rB|j 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 ]}|j  qW d S )N)r   clear)r
   r   r   r   r   r      s    zFastMachine.__del__c             C   s:   | j }|d | _ | jj }||d< ||d< | j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   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   |j d |j d x4t| jj D ]"\}}|j dt||d f  q$W x| jD ]}| j|| 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@   |j d|d   | j|| |d }|d k	r<|j d|  d S )Nz   State %d:
r   r(   z	      %s
)r   dump_transitions)r
   r   r    r(   r   r   r   rH      s
    zFastMachine.dump_statec             C   s.  i }i }xh|j  D ]\\}}t|dkrZ|jt|d }|d krNg }||t|< |j| qt|dkr|||< qW i }x4| jD ]*}|jt|d }	|	r~| j|	}
|||
< q~W |j }|j  x4|D ],}
| j	|
}||
 }|j
d||d f  qW x6d	D ].}|j|d }| r|j
d||d f   qW d S )
Nr      z      %s --> State %d
r   r8   r9   r:   r;   )r8   r9   r:   r;   )r   lengetidr   r   chars_to_rangeskeyssortranges_to_stringr   )r
   r   r    chars_leading_to_statespecial_to_statecr   charsranges_to_state	char_listrangesranges_listkeyr   r   r   rI      s6    



zFastMachine.dump_transitionsc             C   s   |j   d}t|}g }xl||k rt|| }|}|d7 }x0||k rjt|| |d krj|d7 }|d7 }q<W |jt|t|f qW t|S )Nr   r   )rP   rK   ordr   chrrB   )r
   rW   ir   r@   c1c2r   r   r   rN      s    
zFastMachine.chars_to_rangesc             C   s   dj t| j|S )N,)joinmaprange_to_string)r
   
range_listr   r   r   rQ      s    zFastMachine.ranges_to_stringc             C   s0   |\}}||krt |S dt |t |f S d S )Nz%s..%s)rG   )r
   range_tupler^   r_   r   r   r   rc      s    zFastMachine.range_to_string)N)r!   r"   r#   r$   r	   r   r=   r>   r   r   r   r   r   rF   r   r   rH   rI   rN   rQ   rc   r   r   r   r   r7      s"   
	
r7   )
__future__r   sysTransitionsr   r   r   ImportErrorrC   	NameErrorr\   r&   objectr   r   r7   r   r   r   r   <module>	   s   
-@