o
    €eö  ã                   @   sˆ   d Z ddlmZ ddlZddlmZ dZejs'ze W n e	y&   e
ZY nw 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é   )ÚTransitionMapiÿÿÿ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   úDD:\Projects\ConvertPro\env\Lib\site-packages\Cython/Plex/Machines.pyÚ__init__   ó   
zMachine.__init__c                 C   ó   | j D ]}| ¡  qd S ©N)r   Údestroy©r
   Ústater   r   r   Ú__del__   ó   

ÿzMachine.__del__c                 C   s,   t ƒ }| j}|d | _||_| 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   |   ¡ }|  ||¡ |S r   )r   Úmake_initial_state©r
   Únamer   r   r   r   Únew_initial_state+   s   zMachine.new_initial_statec                 C   ó   || j |< d S r   ©r   r   r   r   r   r   0   ó   zMachine.make_initial_statec                 C   ó
   | j | S r   r!   ©r
   r   r   r   r   Úget_initial_state3   ó   
zMachine.get_initial_statec                 C   sd   |  d¡ | jd ur%|  d¡ t| j ¡ ƒD ]\}}|  d||jf ¡ q| jD ]}| |¡ q(d S )NzPlex.Machine:
ú   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_closurer	   r   r   r   r   C   s
   
zNode.__init__c                 C   s   d | _ d | _d | _d S r   )r1   r4   r5   r	   r   r   r   r   L   r   zNode.destroyc                 C   s   | j  ||¡ d S r   )r1   Úadd)r
   Úeventr   r   r   r   Úadd_transitionQ   ó   zNode.add_transitionc                 C   s   |   d|¡ dS )z5Add an epsilon-move from this state to another state.Ú N)r8   r   r   r   r   Úlink_toT   s   zNode.link_toc                 C   s   || j kr|| _|| _ dS 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)r3   r4   )r
   r4   Úpriorityr   r   r   Ú
set_actionX   s   

þzNode.set_actionc                 C   ó   | j S r   ©r4   r	   r   r   r   Ú
get_action`   ó   zNode.get_actionc                 C   r>   r   )r3   r	   r   r   r   Úget_action_priorityc   rA   zNode.get_action_priorityc                 C   s
   | j d uS r   r?   r	   r   r   r   Úis_acceptingf   r&   zNode.is_acceptingc                 C   s
   d| j  S )NzState %d©r   r	   r   r   r   Ú__str__i   r&   zNode.__str__c                 C   sJ   |  d| j ¡ | j |¡ | j}| j}|d ur#|  d||f ¡ d S d S )Nú   State %d:
z      %s [priority %d]
)r(   r   r1   r+   r4   r3   )r
   r,   r4   r<   r   r   r   r+   l   s   ÿz	Node.dumpc                 C   s   | j |j k S r   rD   )r
   Úotherr   r   r   Ú__lt__x   s   zNode.__lt__c                 C   s   t | ƒt@ S r   )ÚidÚmaxintr	   r   r   r   Ú__hash__{   s   zNode.__hash__N)r-   r.   r/   r0   r   r   r8   r;   r=   r@   rB   rC   rE   r+   rH   rK   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_templater	   r   r   r   r   …   s
   
ÿzFastMachine.__init__c                 C   r   r   )r   Úclearr   r   r   r   r      r   zFastMachine.__del__Nc                 C   s:   | j }|d | _ | j ¡ }||d< ||d< | j |¡ |S )Nr   r   r4   )rQ   rR   Úcopyr   r   )r
   r4   r   Úresultr   r   r   r   ‘   s   

zFastMachine.new_statec                 C   r    r   r!   r   r   r   r   r   š   r"   zFastMachine.make_initial_state)Úcode0Úcode1rJ   r   c                 C   sn   t |ƒtu r1|\}}|| kr||d< d S ||kr-||k r/||t|ƒ< |d7 }||k sd S d S d S |||< d S )NrP   r   )ÚtypeÚtupleÚunichr)r
   r   r7   r   rJ   rV   rW   r   r   r   Úadd_transitions   s   
þÿzFastMachine.add_transitionsc                 C   r#   r   r!   r$   r   r   r   r%   ª   r&   zFastMachine.get_initial_statec                 C   sb   |  d¡ |  d¡ t| j ¡ ƒD ]\}}|  dt|ƒ|d f ¡ q| jD ]}|  ||¡ q&d 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   sD   |  d|d  ¡ |  ||¡ |d }|d ur |  d| ¡ d S d S )NrF   r   r4   z	      %s
)r(   Údump_transitions)r
   r   r,   r4   r   r   r   r]   µ   s   ÿzFastMachine.dump_statec                 C   s  i }i }|  ¡ D ].\}}t|ƒdkr,| t|ƒd ¡}|d u r&g }||t|ƒ< | |¡ qt|ƒdkr6|||< qi }| jD ]}| t|ƒd ¡}	|	rQ|  |	¡}
|||
< q<t|ƒD ]}
|  |
¡}||
 }| 	d||d f ¡ qVdD ]}| |d ¡}|r„| 	d||d f ¡ qod S )Nr   é   z      %s --> State %d
r   )rM   rN   rO   rP   )
r*   ÚlenÚgetrI   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   r^   ¿   s:   €

€
€ýzFastMachine.dump_transitions)rf   Úir   Úc1Úc2c                 C   s¦   |  ¡  d}t|ƒ}g }||k rOt|| ƒ}|}|d7 }||k r@t|| ƒ|d kr@|d7 }|d7 }||k r@t|| ƒ|d ks*| t|ƒt|ƒf¡ ||k st|ƒS )Nr   r   )Úsortr`   Úordr   ÚchrrY   )r
   rf   ri   r   rU   rj   rk   r   r   r   rb   Ú   s   þùzFastMachine.chars_to_rangesc                 C   s   d  t| j|ƒ¡S )Nú,)ÚjoinÚmapÚrange_to_string)r
   Z
range_listr   r   r   rc   ê   r9   zFastMachine.ranges_to_stringc                 C   s,   |\}}||krt |ƒS dt |ƒt |ƒf S )Nz%s..%s)r\   )r
   Zrange_tuplerj   rk   r   r   r   rr   í   s   zFastMachine.range_to_stringr   )r-   r.   r/   r0   r   r   r   r   ÚcythonÚlocalsÚintÚdictrJ   r[   r%   r+   r]   r^   ÚlistZ
Py_ssize_tÚlongrb   rc   rr   r   r   r   r   rL   €   s     
	

rL   )r0   Ú
__future__r   rs   ZTransitionsr   rJ   ÚcompiledrZ   Ú	NameErrorrn   r2   Úobjectr   r   rL   r   r   r   r   Ú<module>   s   ÿ)@