3
h                 @   s   d Z ddlmZ ddlZddlmZ dZejsPye W n e	k
rN   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 )z=
Python Lexical Analyser

Classes for building NFAs and DFAs
    )absolute_importN   )TransitionMap      c               @   sH   e 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.c             C   s   g | _ i | _d| _d S )Nr   )statesinitial_statesnext_state_number)self r   f/var/www/html/CrowdFlow/Picklecon/ble_analysis_env/lib/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   )Noder
   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_state+   s    zMachine.new_initial_statec             C   s   || j |< d S )N)r	   )r   r   r   r   r   r   r   0   s    zMachine.make_initial_statec             C   s
   | j | S )N)r	   )r   r   r   r   r   get_initial_state3   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   6   s    


zMachine.dumpN)__name__
__module____qualname____doc__r   r   r   r   r   r   r   r   r   r   r   r      s   	r   c               @   sp   e 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d ZdS )r   zA state of an NFA or DFA.c             C   s$   t  | _t| _d | _d| _d | _d S )Nr   )r   transitionsLOWEST_PRIORITYaction_priorityactionr   epsilon_closure)r   r   r   r   r   C   s
    zNode.__init__c             C   s   d | _ d | _d | _d S )N)r%   r(   r)   )r   r   r   r   r   L   s    zNode.destroyc             C   s   | j j|| d S )N)r%   add)r   eventr   r   r   r   add_transitionQ   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_toT   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_actionX   s    
zNode.set_actionc             C   s   | j S )N)r(   )r   r   r   r   
get_action`   s    zNode.get_actionc             C   s   | j S )N)r'   )r   r   r   r   get_action_priorityc   s    zNode.get_action_priorityc             C   s
   | j d k	S )N)r(   )r   r   r   r   is_acceptingf   s    zNode.is_acceptingc             C   s
   d| j  S )NzState %d)r   )r   r   r   r   __str__i   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   l   s    z	Node.dumpc             C   s   | j |j k S )N)r   )r   otherr   r   r   __lt__x   s    zNode.__lt__c             C   s   t | t@ S )N)idmaxint)r   r   r   r   __hash__{   s    zNode.__hash__N)r!   r"   r#   r$   r   r   r,   r.   r0   r1   r2   r3   r4   r   r6   r9   r   r   r   r   r   @   s   	r   c               @   s   e Zd ZdZdd Zdd ZdddZd	d
 Zej	ej
ej
ej
edefddZdd Zdd Zdd Zdd Zej	eejejejejd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.
    c             C   s(   i | _ g | _d| _d d d d d d| _d S )Nr   )r-   boleoleofelse)r	   r   next_numbernew_state_template)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__Nc             C   s:   | j }|d | _ | jj }||d< ||d< | jj| |S )Nr   r   r(   )r?   r@   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_state)code0code1r8   r   c             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   r8   rD   rE   r   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   rK      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 x8t|D ],}
| j|
}||
 }|j	d||d f  qW x2d	D ]*}|j|d }|r|j	d||d f  qW d S )
Nr      z      %s --> State %d
r   r;   r<   r=   r>   )r;   r<   r=   r>   )
r   lengetr7   r   r   chars_to_rangesr   ranges_to_stringr   )r   r   r    Zchars_leading_to_stateZspecial_to_statecr   charsZranges_to_state	char_listrangeskeyr   r   r   rL      s2    


zFastMachine.dump_transitions)rT   ir   c1c2c             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   )sortrN   ordr   chrrG   )r   rT   rW   r   rC   rX   rY   r   r   r   rP      s    
zFastMachine.chars_to_rangesc             C   s   dj t| j|S )N,)joinmaprange_to_string)r   Z
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)rJ   )r   Zrange_tuplerX   rY   r   r   r   r`      s    zFastMachine.range_to_string)N)r!   r"   r#   r$   r   r   r   r   cythonlocalsintdictr8   rI   r   r   rK   rL   listZ
Py_ssize_tlongrP   rQ   r`   r   r   r   r   r:      s   
	
$r:   l        i)r$   
__future__r   ra   ZTransitionsr   r8   ZcompiledrH   	NameErrorr\   r&   objectr   r   r:   r   r   r   r   <module>   s   
)@