
    ۏDjD                     b    d Z ddlZddlmZ dZe Z G d d      Z G d d	      Z G d
 d      Zy)z=
Python Lexical Analyser

Classes for building NFAs and DFAs
    N   )TransitionMapic                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
Machinez1A collection of Nodes representing an NFA or DFA.c                 .    g | _         i | _        d| _        y )Nr   )statesinitial_statesnext_state_numberselfs    XC:\Crop_Prediction\Backend\crop-ai-system\venv\Lib\site-packages\Cython/Plex/Machines.py__init__zMachine.__init__   s     !"    c                 F    | j                   D ]  }|j                           y N)r   destroyr   states     r   __del__zMachine.__del__   s    [[ 	EMMO	r   c                     t               }| j                  }|dz   | _        ||_        | j                  j	                  |       |S )z-Add a new state to the machine and return it.r   )Noder
   numberr   append)r   sns      r   	new_statezMachine.new_state   s>    F#55!"Q1r   c                 J    | j                         }| j                  ||       |S r   )r   make_initial_stater   namer   s      r   new_initial_statezMachine.new_initial_state#   s#     e,r   c                 "    || j                   |<   y r   r	   r   s      r   r   zMachine.make_initial_state(       $)D!r   c                      | j                   |   S r   r#   r   r    s     r   get_initial_statezMachine.get_initial_state+       ""4((r   c                 :   |j                  d       | j                  \|j                  d       t        | j                  j                               D ]%  \  }}|j                  d||j                  fz         ' | j
                  D ]  }|j                  |        y )NzPlex.Machine:
   Initial states:
z      '%s': %d
)writer	   sorteditemsr   r   dump)r   filer    r   r   s        r   r.   zMachine.dump.   s    

$%*JJ-.!'(;(;(A(A(C!D Fu

-u||0DDEF 	AFF4L	r   N)__name__
__module____qualname____doc__r   r   r   r!   r   r'   r.    r   r   r   r      s(    ;#

*)r   r   c                   X    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zy)r   zA state of an NFA or DFA.c                 b    t               | _        t        | _        d | _        d| _        d | _        y )Nr   )r   transitionsLOWEST_PRIORITYaction_priorityactionr   epsilon_closurer   s    r   r   zNode.__init__;   s,     )?.#r   c                 .    d | _         d | _        d | _        y r   )r7   r:   r;   r   s    r   r   zNode.destroyD   s    #r   c                 <    | j                   j                  ||       y r   )r7   add)r   eventr   s      r   add_transitionzNode.add_transitionI   s    UI.r   c                 (    | j                  d|       y)z5Add an epsilon-move from this state to another state. N)r@   r   s     r   link_tozNode.link_toL   s    B&r   c                 @    || j                   kD  r|| _        || _         yy)zMake this an accepting state with the given action. If
        there is already an action, choose the action with highest
        priority.N)r9   r:   )r   r:   prioritys      r   
set_actionzNode.set_actionP   s&     d*** DK#+D  +r   c                     | j                   S r   r:   r   s    r   
get_actionzNode.get_actionX   s    {{r   c                     | j                   S r   )r9   r   s    r   get_action_priorityzNode.get_action_priority[   s    ###r   c                     | j                   d uS r   rH   r   s    r   is_acceptingzNode.is_accepting^   s    {{$&&r   c                      d| j                   z  S )NzState %dr   r   s    r   __str__zNode.__str__a   s    DKK''r   c                     |j                  d| j                  z         | j                  j                  |       | j                  }| j
                  }||j                  d||fz         y y )N   State %d:
z      %s [priority %d]
)r+   r   r7   r.   r:   r9   )r   r/   r:   rE   s       r   r.   z	Node.dumpd   sd    

#dkk12 	d#''JJ1VX4FFG r   c                 4    | j                   |j                   k  S r   rO   )r   others     r   __lt__zNode.__lt__p   s    {{U\\))r   c                 &    t        |       t        z  S r   )idmaxintr   s    r   __hash__zNode.__hash__s   s    $x&  r   N)r0   r1   r2   r3   r   r   r@   rC   rF   rI   rK   rM   rP   r.   rU   rY   r4   r   r   r   r   8   sB    #$$
/',$'(
H*!r   r   c                       e Zd ZdZd Zd ZddZd Zefde	de
j                  fd	Zd
 Zd Zd Zd ZdedefdZdefdZdefdZy)FastMachinezd
    FastMachine is a deterministic machine represented in a way that
    allows fast scanning.
    c                 H    i | _         g | _        d| _        d d d d d d| _        y )Nr   )rB   boleoleofelse)r	   r   next_numbernew_state_templater   s    r   r   zFastMachine.__init__}   s.     T$tT#
r   c                 F    | j                   D ]  }|j                           y r   )r   clearr   s     r   r   zFastMachine.__del__   s    [[ 	EKKM	r   Nc                     | j                   }|dz   | _         | j                  j                         }||d<   ||d<   | j                  j	                  |       |S )Nr   r   r:   )ra   rb   copyr   r   )r   r:   r   results       r   r   zFastMachine.new_state   sX    $($4$4!A:((--/!x!x6"r   c                 "    || j                   |<   y r   r#   r   s      r   r   zFastMachine.make_initial_state   r$   r   r   rX   c                     t        |      t        u r7|\  }}|| k(  r||d<   y ||k7  r t        ||      D ]  }||t        |      <    y y |||<   y )Nr`   )typetuplerangechr)r   r   r?   r   rX   code0code1codes           r   add_transitionszFastMachine.add_transitions   sg    
 ;% LE5 )f&!%/ 1D'0E#d)$1 ! %E%Lr   c                      | j                   |   S r   r#   r&   s     r   r'   zFastMachine.get_initial_state   r(   r   c                 ,   |j                  d       |j                  d       t        | j                  j                               D ])  \  }}|j                  dt	        |      d|d   d       + | j
                  D ]  }| j                  ||        y )NzPlex.FastMachine:
r*   z      z: r   
)r+   r,   r	   r-   reprr   
dump_state)r   r/   r    r   s       r   r.   zFastMachine.dump   s    

()

)*!$"5"5";";"=> 	IKD%JJ4:uXGH	I[[ 	)EOOE4(	)r   c                     |j                  d|d   z         | j                  ||       |d   }||j                  d|z         y y )NrR   r   r:   z	      %s
)r+   dump_transitions)r   r   r/   r:   s       r   rv   zFastMachine.dump_state   sM    

#eHo56eT*xJJ|f,- r   c                 n   i }i }|j                         D ]e  \  }}t        |      dk(  r>|j                  t        |            }|g }||t        |      <   |j	                  |       Rt        |      dk  sa|||<   g i }| j
                  D ]5  }|j                  t        |            }	|	s | j                  |	      }
|||
<   7 t        |      D ]1  }
| j                  |
      }||
   }|j                  d||d   fz         3 dD ]/  }|j                  |      }|s|j                  d||d   fz         1 y )Nr      z      %s --> State %d
r   )r]   r^   r_   r`   )
r-   lengetrW   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keys               r   rx   zFastMachine.dump_transitions   sY   !#kkm 	(FQ1v{.222a59=E49*2a51QQ1&' #	( [[ 	0E.222e9=I--i8*/'		0
 _- 	KF''/C#F+EJJ0Cx3IIJ	K 1 	OC$((-E

4U8_7MMN	Or   r   returnc                 Z   |j                          d}t        |      }g }||k  r}t        ||         }|}|dz  }||k  r8t        ||         |dz   k(  r$|dz  }|dz  }||k  rt        ||         |dz   k(  r$|j                  t	        |      t	        |      f       ||k  r}t        |      S )Nr   r   )sortr{   ordr   rm   rk   )r   r   ir   rg   c1c2s          r   r}   zFastMachine.chars_to_ranges   s      !"9~!eYq\"BBFAa%C	!-a7Qa a%C	!-a7 MM3r7CG,- !e V}r   c                 L    dj                  t        | j                  |            S )N,)joinmaprange_to_string)r   
range_lists     r   r~   zFastMachine.ranges_to_string   s    xxD00*=>>r   range_tuplec                 :    |\  }}||k(  rt        |      S |d|S )Nz..)ru   )r   r   r   r   s       r   r   zFastMachine.range_to_string   s,    R88OV2bV$$r   r   )r0   r1   r2   r3   r   r   r   r   rX   dictcythonintrq   r'   r.   rv   rx   listrk   r}   strr~   r   r4   r   r   r[   r[   x   sy    
* SY %T %VZZ %)).O6 % $?c ?%5 %r   r[   )	r3   r   Transitionsr   rX   r8   r   r   r[   r4   r   r   <module>r      s@     &	'& &R=! =!@v% v%r   