o
    NiV                     @   sP   d Z ddlZddlmZ dZe ZG dd dZG dd	 d	ZG d
d dZdS )z=
Python Lexical Analyser

Classes for building NFAs and DFAs
    N   )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
   H/home/ubuntu/.local/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   (      zMachine.make_initial_statec                 C   
   | j | S r   r    r	   r   r
   r
   r   get_initial_state+      
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*   .   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   ;   s
   
zNode.__init__c                 C   s   d | _ d | _d | _d S r   )r0   r3   r4   r   r
   r
   r   r   D   r   zNode.destroyc                 C   s   | j || d S r   )r0   add)r	   eventr   r
   r
   r   add_transitionI      zNode.add_transitionc                 C   s   |  d| dS )z5Add an epsilon-move from this state to another state. N)r7   r   r
   r
   r   link_toL   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)r2   r3   )r	   r3   priorityr
   r
   r   
set_actionP   s   

zNode.set_actionc                 C      | j S r   r3   r   r
   r
   r   
get_actionX      zNode.get_actionc                 C   r=   r   )r2   r   r
   r
   r   get_action_priority[   r@   zNode.get_action_priorityc                 C   s
   | j d uS r   r>   r   r
   r
   r   is_accepting^   r%   zNode.is_acceptingc                 C   s
   d| j  S )NzState %dr   r   r
   r
   r   __str__a   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   r0   r*   r3   r2   )r	   r+   r3   r;   r
   r
   r   r*   d   s   z	Node.dumpc                 C   s   | j |j k S r   rC   )r	   otherr
   r
   r   __lt__p   s   zNode.__lt__c                 C   s   t | t@ S r   )idmaxintr   r
   r
   r   __hash__s   s   zNode.__hash__N)r,   r-   r.   r/   r   r   r7   r:   r<   r?   rA   rB   rD   r*   rG   rJ   r
   r
   r
   r   r   8   s    	r   c                   @   s   e Zd ZdZdd Zdd Zd ddZd	d
 Zefde	de
jfddZdd Zdd Zdd Zdd ZdedefddZdefddZdef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   )r9   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   r3   )rP   rQ   copyr   r   )r	   r3   r   resultr
   r
   r   r      s   

zFastMachine.new_statec                 C   r   r   r    r   r
   r
   r   r      r!   zFastMachine.make_initial_stater   rI   c                 C   sb   t |tu r+|\}}|| kr||d< d S ||kr't||D ]
}||t|< qd S d S |||< d S )NrO   )typetuplerangechr)r	   r   r6   r   rI   code0code1coder
   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 )NrE   r   r3   z	      %s
)r'   dump_transitions)r	   r   r+   r3   r
   r
   r   r^      s   zFastMachine.dump_statec                 C   s  i }i }|  D ]-\}}t|dkr+|t|}|d u r%g }||t|< || qt|dkr5|||< qi }| jD ]}|t|}	|	rO| |	}
|||
< q;t|D ]}
| |
}||
 }|	d||d f  qTdD ]}||}|r|	d||d f  qmd S )Nr      z      %s --> State %d
r   )rL   rM   rN   rO   )
r)   lengetrH   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_transitionsrj   returnc                 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   )sortra   ordr   rX   rV   )r	   rj   ir   rT   c1c2r
   r
   r   rc      s   zFastMachine.chars_to_rangesc                 C   s   d t| j|S )N,)joinmaprange_to_string)r	   
range_listr
   r
   r   rd      r8   zFastMachine.ranges_to_stringrange_tuplec                 C   s&   |\}}||krt |S |d|S )Nz..)r]   )r	   rx   rq   rr   r
   r
   r   rv      s   zFastMachine.range_to_stringr   )r,   r-   r.   r/   r   r   r   r   rI   dictcythonintr\   r$   r*   r^   r_   listrV   rc   strrd   rv   r
   r
   r
   r   rK   x   s    
	
rK   )	r/   rz   Transitionsr   rI   r1   r   r   rK   r
   r
   r
   r   <module>   s    )@