
    Ng                         d Z ddlmZ ddlZddlmZ dZej        s	 e n# e	$ r e
ZY nw xY we Z G d de          Z G d	 d
e          Z G d de          ZdS )z=
Python Lexical Analyser

Classes for building NFAs and DFAs
    )absolute_importN   )TransitionMapic                   <    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	S )
Machinez1A collection of Nodes representing an NFA or DFA.c                 0    g | _         i | _        d| _        d S )Nr   )statesinitial_statesnext_state_numberselfs    P/var/www/html/ai-engine/env/lib/python3.11/site-packages/Cython/Plex/Machines.py__init__zMachine.__init__   s     !"    c                 B    | j         D ]}|                                 d S N)r	   destroyr   states     r   __del__zMachine.__del__   s,    [ 	 	EMMOOOO	 	r   c                     t                      }| j        }|dz   | _        ||_        | 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"   sA    FF"!"Q1r   c                 Z    |                                  }|                     ||           |S r   )r   make_initial_stater   namer   s      r   new_initial_statezMachine.new_initial_state+   s,      e,,,r   c                     || j         |<   d S r   r
   r    s      r   r   zMachine.make_initial_state0       $)D!!!r   c                     | j         |         S r   r$   r   r!   s     r   get_initial_statezMachine.get_initial_state3       "4((r   c                 <   |                     d           | j        `|                     d           t          | j                                                  D ]$\  }}|                     d||j        fz             %| j        D ]}|                    |           d S )NzPlex.Machine:
   Initial states:
z      '%s': %d
)writer
   sorteditemsr   r	   dump)r   filer!   r   r   s        r   r/   zMachine.dump6   s    

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

-u|0DDEEEE 	 	AFF4LLLL	 	r   N)__name__
__module____qualname____doc__r   r   r   r"   r   r(   r/    r   r   r   r      s        ;;# # #
      
* * *) ) )    r   r   c                   Z    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dS )r   zA state of an NFA or DFA.c                 n    t                      | _        t          | _        d | _        d| _        d | _        d S )Nr   )r   transitionsLOWEST_PRIORITYaction_priorityactionr   epsilon_closurer   s    r   r   zNode.__init__C   s4     )??.#r   c                 0    d | _         d | _        d | _        d S r   )r8   r;   r<   r   s    r   r   zNode.destroyL   s    #r   c                 <    | j                             ||           d S r   )r8   add)r   eventr   s      r   add_transitionzNode.add_transitionQ   s!    UI.....r   c                 2    |                      d|           dS )z5Add an epsilon-move from this state to another state. N)rA   r   s     r   link_tozNode.link_toT   s    B&&&&&r   c                 <    || 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)r:   r;   )r   r;   prioritys      r   
set_actionzNode.set_actionX   s/     d*** DK#+D    +*r   c                     | j         S r   r;   r   s    r   
get_actionzNode.get_action`   s
    {r   c                     | j         S r   )r:   r   s    r   get_action_priorityzNode.get_action_priorityc   s    ##r   c                     | j         d uS r   rI   r   s    r   is_acceptingzNode.is_acceptingf   s    {$&&r   c                     d| j         z  S )NzState %dr   r   s    r   __str__zNode.__str__i   s    DK''r   c                     |                     d| j        z             | j                            |           | j        }| j        }||                     d||fz             d S d S )N   State %d:
z      %s [priority %d]
)r,   r   r8   r/   r;   r:   )r   r0   r;   rF   s       r   r/   z	Node.dumpl   su    

#dk1222 	d###'JJ1VX4FFGGGGG r   c                 "    | j         |j         k     S r   rP   )r   others     r   __lt__zNode.__lt__x   s    {U\))r   c                 0    t          |           t          z  S r   )idmaxintr   s    r   __hash__zNode.__hash__{   s    $xx&  r   N)r1   r2   r3   r4   r   r   rA   rD   rG   rJ   rL   rN   rQ   r/   rV   rZ   r5   r   r   r   r   @   s        ##$ $ $$ $ $
/ / /' ' ', , ,  $ $ $' ' '( ( (
H 
H 
H* * *! ! ! ! !r   r   c                      e Zd ZdZd Zd ZddZd Z ej	        ej
        ej
        ej
        e          efd            Zd	 Zd
 Zd Zd Z ej	        eej        ej        ej        ej                  d             Zd Zd ZdS )FastMachinezd
    FastMachine is a deterministic machine represented in a way that
    allows fast scanning.
    c                 J    i | _         g | _        d| _        d d d d d d| _        d S )Nr   )rC   boleoleofelse)r
   r	   next_numbernew_state_templater   s    r   r   zFastMachine.__init__   s9     T$tT#
 #
r   c                 B    | j         D ]}|                                 d S r   )r	   clearr   s     r   r   zFastMachine.__del__   s,    [ 	 	EKKMMMM	 	r   Nc                     | j         }|dz   | _         | j                                        }||d<   ||d<   | j                            |           |S )Nr   r   r;   )rb   rc   copyr	   r   )r   r;   r   results       r   r   zFastMachine.new_state   sY    !!A:(--//!x!x6"""r   c                     || j         |<   d S r   r$   r    s      r   r   zFastMachine.make_initial_state   r%   r   )code0code1rY   r   c                     t          |          t          u rB|\  }}|| k    r||d<   d S ||k    r%||k     r!||t          |          <   |dz  }||k     d S d S d S |||<   d S )Nra   r   )typetupleunichr)r   r   r@   r   rY   rj   rk   s          r   add_transitionszFastMachine.add_transitions   s    ;;% LE5 )f&emm+4E&--(QJE emmmm !#m %E%LLLr   c                     | j         |         S r   r$   r'   s     r   r(   zFastMachine.get_initial_state   r)   r   c                 P   |                     d           |                     d           t          | j                                                  D ]4\  }}|                     dt	          |          d|d         d           5| j        D ]}|                     ||           d S )NzPlex.FastMachine:
r+   z      z: r   
)r,   r-   r
   r.   reprr	   
dump_state)r   r0   r!   r   s       r   r/   zFastMachine.dump   s    

()))

)***!$"5";";"="=>> 	I 	IKD%JJJ4::::uXGHHHH[ 	) 	)EOOE4((((	) 	)r   c                     |                     d|d         z             |                     ||           |d         }||                     d|z             d S d S )NrS   r   r;   z	      %s
)r,   dump_transitions)r   r   r0   r;   s       r   ru   zFastMachine.dump_state   sh    

#eHo5666eT***xJJ|f,----- r   c                    i }i }|                                 D ]\  }}t          |          dk    rO|                    t          |          d           }|g }||t          |          <   |                    |           gt          |          dk    r|||<   i }| j        D ]A}|                    t          |          d           }	|	r|                     |	          }
|||
<   Bt          |          D ]?}
|                     |
          }||
         }|	                    d||d         fz             @dD ]:}|                    |d           }|r |	                    d||d         fz             ;d S )Nr      z      %s --> State %d
r   )r^   r_   r`   ra   )
r.   lengetrX   r   r	   chars_to_rangesr-   ranges_to_stringr,   )r   r   r0   chars_leading_to_statespecial_to_statecr   charsranges_to_state	char_listrangeskeys               r   rw   zFastMachine.dump_transitions   s   !#kkmm 	( 	(FQ1vv{{.222a55$??=E49*2a551QQ1&' #[ 	0 	0E.222e99dCCI 0--i88*/'_-- 	K 	KF''//C#F+EJJ0Cx3IIJJJJ0 	O 	OC$((d33E O

4U8_7MMNNN	O 	Or   )r   ir   c1c2c                    |                                  d}t          |          }g }||k     rt          ||                   }|}|dz  }||k     rHt          ||                   |dz   k    r,|dz  }|dz  }||k     rt          ||                   |dz   k    ,|                    t	          |          t	          |          f           ||k     t          |          S )Nr   r   )sortrz   ordr   chrrn   )r   r   r   r   rh   r   r   s          r   r|   zFastMachine.chars_to_ranges   s    	NN!eeYq\""BBFAa%%C	!--a77Qa a%%C	!--a77 MM3r77CGG,--- !ee V}}r   c                 R    d                     t          | j        |                    S )N,)joinmaprange_to_string)r   
range_lists     r   r}   zFastMachine.ranges_to_string   s!    xxD0*==>>>r   c                 x    |\  }}||k    rt          |          S t          |          dt          |          S )Nz..)rt   )r   range_tupler   r   s       r   r   zFastMachine.range_to_string   s<    R8888O#Bxxxxb22r   r   )r1   r2   r3   r4   r   r   r   r   cythonlocalsintdictrY   rp   r(   r/   ru   rw   list
Py_ssize_tlongr|   r}   r   r5   r   r   r\   r\      s?        
 
 
     * * * V]6:fjPTUUU>D 
% 
% 
% VU
%) ) )) ) ). . .O O O6 V]TV%6&:KPVP[`f`klll  ml? ? ?3 3 3 3 3r   r\   )r4   
__future__r   r   Transitionsr   rY   compiledro   	NameErrorr   r9   objectr   r   r\   r5   r   r   <module>r      s   
 ' & & & & &  & & & & & &	     '& & & & &f & & &R=! =! =! =! =!6 =! =! =!@r3 r3 r3 r3 r3& r3 r3 r3 r3 r3s     **