o
    &[h                     @   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   I/var/www/vscode/pina/lib/python3.10/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 )zMake 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,   chars_leading_to_statespecial_to_statecr   charsranges_to_state	char_listrangeskeyr   r   r   r^      s:   


zFastMachine.dump_transitions)ri   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
   ri   rl   r   rU   rm   rn   r   r   r   rb      s   zFastMachine.chars_to_rangesc                 C   s   d t| j|S )N,)joinmaprange_to_string)r
   
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
   range_tuplerm   rn   r   r   r   ru      s   zFastMachine.range_to_stringr   )r-   r.   r/   r0   r   r   r   r   cythonlocalsintdictrJ   r[   r%   r+   r]   r^   list
Py_ssize_tlongrb   rc   ru   r   r   r   r   rL      s     
	

rL   )r0   
__future__r   rx   Transitionsr   rJ   compiledrZ   	NameErrorrq   r2   objectr   r   rL   r   r   r   r   <module>   s   )@