ó
 ¯ñUc           @@  sk   d  d l  m Z y d  d l m Z Wn! e k
 rG d  d l m Z n Xd e f d „  ƒ  YZ d „  Z d S(   i    (   t   absolute_import(   t   maxsize(   t   maxintt   TransitionMapc           B@  s¶   e  Z d  Z d Z d Z d d d „ Z e d „ Z e d „ Z	 d d „ Z
 e d „ Z e Z e e d „ Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z RS(   sW  
    A TransitionMap maps an input event to a set of states.
    An input event is one of: a range of character codes,
    the empty string (representing an epsilon move), or one
    of the special symbols BOL, EOL, EOF.

    For characters, this implementation compactly represents
    the map by means of a list:

      [code_0, states_0, code_1, states_1, code_2, states_2,
        ..., code_n-1, states_n-1, code_n]

    where |code_i| is a character code, and |states_i| is a
    set of states corresponding to characters with codes |c|
    in the range |code_i| <= |c| <= |code_i+1|.

    The following invariants hold:
      n >= 1
      code_0 == -maxint
      code_n == maxint
      code_i < code_i+1 for i in 0..n-1
      states_0 == states_n-1

    Mappings for the special events '', BOL, EOL, EOF are
    kept separately in a dictionary.
    c         C@  s>   | s t  i  t  g } n  | s( i  } n  | |  _ | |  _ d  S(   N(   R   t   mapt   special(   t   selfR   R   (    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyt   __init__.   s    		c   	      C@  sŽ   t  | ƒ | k rw | \ } } |  j | ƒ } |  j | ƒ } |  j } xB | | k  rs d | | d | <| d 7} qH Wn d |  j | ƒ | <d S(   s;   
        Add transition to |new_state| on |event|.
        i   i   N(   t   typet   splitR   t   get_special(	   R   t   eventt	   new_statet	   TupleTypet   code0t   code1t   it   jR   (    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyt   add7   s    	c   	      C@  s”   t  | ƒ | k rz | \ } } |  j | ƒ } |  j | ƒ } |  j } xH | | k  rv | | d j | ƒ | d 7} qH Wn |  j | ƒ j | ƒ d S(   sH   
        Add transitions to the states in |new_set| on |event|.
        i   i   N(   R   R	   R   t   updateR
   (	   R   R   t   new_setR   R   R   R   R   R   (    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyt   add_setG   s    	c         C@  s   |  j  j d | ƒ S(   s:   
        Return the mapping for epsilon, or None.
        t    (   R   t   get(   R   t   none(    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyt   get_epsilonW   s    c         C@  sæ   g  } |  j  } | d } d } | | ƒ d } | d } xd | | k  rŸ | | d } | | d }	 | sp | rŒ | j | |	 f | f ƒ n  |	 } | d 7} q< Wx9 |  j j ƒ  D]( \ }
 } | r° | j |
 | f ƒ q° q° Wt | ƒ S(   s€   
        Return the mapping as an iterable of ((code1, code2), state_set) and
        (special_event, state_set) pairs.
        i   i    i   (   R   t   appendR   t   itemst   iter(   R   t   lent   resultR   t   else_setR   t   nR   t   setR   R   (    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyt	   iteritems^   s"    	

c         C@  s´   |  j  } | | ƒ d } | | k r) | Sd } xE | | d k rv | | d d @} | | | k  rm | } q2 | } q2 W| | | k r‹ | S| | | d j ƒ  g | | | +| Sd S(   s»   
        Search the list for the position of the split point for |code|,
        inserting a new split point if necessary. Returns index |i| such
        that |code| == |map[i]|.
        i   i    i   i   Niþÿÿÿ(   R   t   copy(   R   t   codeR   R   R   t   hit   lot   mid(    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyR	   z   s    		
!c         C@  s8   |  j  } | j | d ƒ } | s4 i  } | | | <n  | S(   sS   
        Get state set for special event, adding a new entry if necessary.
        N(   R   R   t   None(   R   R   R   R!   (    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyR
   ™   s    	c   
      C@  s	  g  } |  j  } t | ƒ } d } x˜ | | k  r» | | } | t k rP d } n! | t k re d } n t | ƒ } | j | ƒ | d 7} | | k  r® | j t | | ƒ ƒ n  | d 7} q$ Wi  } x- |  j j ƒ  D] \ } }	 t |	 ƒ | | <qÒ Wd d j | ƒ | f S(   Ni    s   -inft   infi   s   [%s]+%st   ,(	   R   R   R   t   strR   t   state_set_strR   R   t   join(
   R   t   map_strsR   R    R   R$   t   code_strt   special_strsR   R!   (    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyt   __str__¦   s,    	
		
c         C@  s2   |  j  d |  j  d k  s. |  GHd s. t ‚ n  d S(   s   Check data structure integrity.iýÿÿÿiÿÿÿÿi    N(   R   t   AssertionError(   R   (    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyt   checkÂ   s    c         C@  sµ   |  j  } d } t | ƒ d } xD | | k  re |  j | | | | d | | d | ƒ | d 7} q" WxH |  j j ƒ  D]7 \ } } | rv | s— d } n  |  j | | | ƒ qv qv Wd  S(   Ni    i   i   t   empty(   R   R   t
   dump_rangeR   R   t
   dump_trans(   R   t   fileR   R   R    R   R!   (    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyt   dumpÈ   s    	*	c         C@  sÆ   | rÂ | t  k r> | t  k r( d } q¬ d |  j | ƒ } nn | t  k rd d |  j | d ƒ } nH | | d k r† |  j | ƒ } n& d |  j | ƒ |  j | d ƒ f } |  j | | | ƒ n  d  S(   Nt   anys   < %ss   > %si   s   %s..%s(   R   t	   dump_charR6   (   R   R   R   R!   R7   t   k(    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyR5   Õ   s    	c         C@  s8   d | k o d k n r, t  t | ƒ ƒ Sd | Sd  S(   Ni    iÿ   s   chr(%d)(   t   reprt   chr(   R   R$   (    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyR:   å   s    c         C@  s$   | j  d | |  j | ƒ f ƒ d  S(   Ns         %s --> %s
(   t   writet   dump_set(   R   t   keyR!   R7   (    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyR6   ë   s    c         C@  s
   t  | ƒ S(   N(   R,   (   R   R!   (    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyR?   î   s    N(   t   __name__t
   __module__t   __doc__R(   R   R   R   t   tupleR   R   R   R   R"   R   R   R	   R
   R1   R3   R8   R5   R:   R6   R?   (    (    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyR      s$   
							c         C@  s+   d d j  g  |  D] } d | j ^ q ƒ S(   Ns   [%s]R*   s   S%d(   R-   t   number(   R!   t   state(    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyR,   ú   s    N(	   t
   __future__R    t   sysR   R   t   ImportErrort   objectR   R,   (    (    (    sg   /home/psgendb/BIRCHDEV/lib-linux-x86_64/python/lib64/python2.7/site-packages/Cython/Plex/Transitions.pyt   <module>   s   ë