a
    bP                     @   s   d dl mZ d dlZddlmZ zd dlmZ W n eyN   d dlmZ Y n0 ze W n e	yn   e
ZY n0 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/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/Cython/Plex/Machines.py__init__"   s    zMachine.__init__c                 C   s   | j D ]}|  qd S r   )r	   destroyr   stater   r   r   __del__&   s    
zMachine.__del__c                 C   s,   t  }| j}|d | _||_| 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   |   }| || |S r   )r   make_initial_stater   namer   r   r   r   new_initial_state4   s    zMachine.new_initial_statec                 C   s   || j |< d S r   r
   r   r   r   r   r   9   s    zMachine.make_initial_statec                 C   s
   | j | S r   r   r   r   r   r   r   get_initial_state<   s    zMachine.get_initial_statec                 C   sd   | d | jd urJ| d t| j D ]\}}| d||jf  q,| jD ]}|| qPd 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.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 r   )r   transitionsLOWEST_PRIORITYaction_priorityr   r   r   r   r   Q   s    zNode.__init__c                 C   s   d | _ d | _d | _d S r   )r,   actionepsilon_closurer   r   r   r   r   X   s    zNode.destroyc                 C   s   | j || d S r   )r,   add)r   eventr   r   r   r   add_transition^   s    zNode.add_transitionc                 C   s   |  d| dS )z5Add an epsilon-move from this state to another state. N)r3   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 r   r/   r   r   r   r   
get_actionm   s    zNode.get_actionc                 C   s   | j S r   )r.   r   r   r   r   get_action_priorityp   s    zNode.get_action_priorityc                 C   s
   | j d uS r   r8   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   | d| j  | j| | j}| j}|d urB| d||f  d S )N   State %d:
z      %s [priority %d]
)r#   r   r,   r&   r/   r.   )r   r'   r/   r6   r   r   r   r&   y   s    z	Node.dumpc                 C   s   | j |j k S r   r<   )r   otherr   r   r   __lt__   s    zNode.__lt__)r(   r)   r*   r+   r,   r/   r.   r   r0   r   r   r3   r5   r7   r9   r:   r;   r=   r&   r@   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   )r4   boleoleofelsec                 C   s   i | _ g | _d S r   )r
   r	   r   r   r   r   r      s    zFastMachine.__init__c                 C   s   | j D ]}|  qd S r   )r	   clearr   r   r   r   r      s    
zFastMachine.__del__c                 C   s:   | j }|d | _ | j }||d< ||d< | 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 r   r   r   r   r   r   r      s    zFastMachine.make_initial_statec                 C   s\   t |tu rP|\}}|| kr(||d< qX||krX||k rX||t|< |d7 }q0n|||< d S )NrE   r   )typetupleunichr)r   r   r2   r   r   Zcode0code1r   r   r   add_transitions   s    

zFastMachine.add_transitionsc                 C   s
   | j | S r   r   r    r   r   r   r!      s    zFastMachine.get_initial_statec                 C   sb   | d | d t| j D ]"\}}| dt||d f  q"| jD ]}| || qLd 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   s@   | d|d   | || |d }|d ur<| d|  d S )Nr>   r   r/   z	      %s
)r#   dump_transitions)r   r   r'   r/   r   r   r   rQ      s
    zFastMachine.dump_statec                 C   s  i }i }|  D ]\\}}t|dkrX|t|d }|d u rLg }||t|< || qt|dkr|||< qi }| jD ]*}|t|d }	|	rx| |	}
|||
< qx| }|  |D ],}
| 	|
}||
 }|
d||d f  qdD ]*}||d }|r|
d||d f  qd S )Nr      z      %s --> State %d
r   )rB   rC   rD   rE   )r%   lengetidr   r	   chars_to_rangeskeyssortranges_to_stringr#   )r   r   r'   Zchars_leading_to_stateZspecial_to_statecr   charsZranges_to_state	char_listrangesZranges_listkeyr   r   r   rR      s6    




zFastMachine.dump_transitionsc                 C   s   |   d}t|}g }||k r~t|| }|}|d7 }||k rft|| |d krf|d7 }|d7 }q8|t|t|f qt|S )Nr   r   )rY   rT   ordr   chrrL   )r   r]   ir   rJ   c1c2r   r   r   rW      s    
zFastMachine.chars_to_rangesc                 C   s   d t| j|S )N,)joinmaprange_to_string)r   Z
range_listr   r   r   rZ      s    zFastMachine.ranges_to_stringc                 C   s0   |\}}||krt |S dt |t |f S d S )Nz%s..%s)rP   )r   Zrange_tuplerc   rd   r   r   r   rh      s    zFastMachine.range_to_string)N)r(   r)   r*   r+   r
   r	   rG   rH   r   r   r   r   r   rO   r!   r&   rQ   rR   rW   rZ   rh   r   r   r   r   rA      s$   

	
rA   )
__future__r   sysZTransitionsr   r   r   ImportErrorrM   	NameErrorra   r-   objectr   r   rA   r   r   r   r   <module>	   s   
-@