o
    bi,                  	   @   s  U d dl Z d dlZd dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZ d dlZd dlZd dlZedZejed< ee  eej e Z edZ!dFded	e
e d
e
e defddZ"dedee#ef dedefddZ$edddZ%G dd dZ&G dd de&Z'zd dl(Z(dZ)W n e*y   dZ)Y nw ej+dkrd dl,m-Z. d dl/m0Z1 nd dl.Z.d dl1Z1e2dZ3de#deee4e4f e	e4 f fddZ5d Z6e6d! Z7d"e#d#ee# de8fd$d%Z9d"e#de8fd&d'Z:d"e#de8fd(d)Z;d*ee! de	e! fd+d,Z<G d-d. d.e&Z=d/d0 Z>zd dl?Z?dZ@W n e*y-   dZ@Y nw G d1d2 d2ZAG d3d4 d4eBZCded5edefd6d7ZDd8ed9edefd:d;ZEd<d= ZFd
ede
e' defd>d?ZGd@e4dAe4de	ee4e4f  fdBdCZHG dDdE dEee! ZIdS )G    N)product)deque)CallableIteratorListOptionalTupleTypeTypeVarUnionDictAnySequenceIterableAbstractSetlarkloggerTseqkeyvaluereturnc              	   C   sh   i }| D ]-}|d ur||n|}|d ur||n|}z	||  | W q ty1   |g||< Y qw |S N)appendKeyError)r   r   r   ditemkv r   >/home/ubuntu/.local/lib/python3.10/site-packages/lark/utils.pyclassify   s   r!   data	namespacememoc                    sx   t | tr+d| v r| d  }||  S d| v r | d  S  fdd|  D S t | tr: fdd| D S | S )N__type__@c                    s   i | ]\}}|t | qS r   _deserialize).0r   r   r$   r#   r   r    
<dictcomp>*       z _deserialize.<locals>.<dictcomp>c                    s   g | ]}t | qS r   r'   )r)   r   r*   r   r    
<listcomp>,   s    z _deserialize.<locals>.<listcomp>)
isinstancedictdeserializeitemslist)r"   r#   r$   class_r   r*   r    r(   #   s   

r(   _T	Serialize)boundc                	   @   sl   e Zd ZdZdedefddZddeeef fddZ	e
d	ee d
eeef deeef defddZdS )r5   al  Safe-ish serialization interface that doesn't rely on Pickle

    Attributes:
        __serialize_fields__ (List[str]): Fields (aka attributes) to serialize.
        __serialize_namespace__ (list): List of classes that deserialization is allowed to instantiate.
                                        Should include all field types that aren't builtin types.
    types_to_memoizer   c                 C   s   t |}| || fS r   )SerializeMemoizer	serialize)selfr7   r$   r   r   r    memo_serialize;   s   zSerialize.memo_serializeNc                    sd    r  rd jiS td} fdd|D }tj|d< tdr0|  |S )Nr&   __serialize_fields__c                    s   i | ]}|t t| qS r   )
_serializegetattr)r)   fr$   r:   r   r    r+   D   r,   z'Serialize.serialize.<locals>.<dictcomp>r%   r=   )in_typesmemoizedgetr>   type__name__hasattrr=   )r:   r$   fieldsresr   r@   r    r9   ?   s   

zSerialize.serializeclsr"   r$   c                 C   s   t | dg }dd |D }t | d}d|v r||d  S | | }|D ]"}zt||t|| || W q# tyE } ztd| |d }~ww t|drO|  |S )N__serialize_namespace__c                 S   s   i | ]}|j |qS r   )rE   )r)   cr   r   r    r+   M       z)Serialize.deserialize.<locals>.<dictcomp>r<   r&   zCannot find key for classr(   )r>   __new__setattrr(   r   rF   )rI   r"   r$   r#   rG   instr?   er   r   r    r0   J   s    


zSerialize.deserializer   )rE   
__module____qualname____doc__r   r   r;   r   strr9   classmethodr	   r4   intr0   r   r   r   r    r5   2   s    4c                   @   s   e Zd ZdZdZdeddfddZdedefd	d
Z	de
eef fddZede
eef de
eef de
eef de
eef fddZdS )r8   z<A version of serialize that memoizes objects to reduce space)rB   r7   r   Nc                 C   s   t || _t | _d S r   )tupler7   
EnumeratorrB   )r:   r7   r   r   r    __init__f   s   
zSerializeMemoizer.__init__r   c                 C   s   t || jS r   )r.   r7   )r:   r   r   r   r    rA   j      zSerializeMemoizer.in_typesc                 C   s   t | j d S r   )r=   rB   reversedr:   r   r   r    r9   m      zSerializeMemoizer.serializer"   r#   r$   c                 C   s   t |||S r   r'   )rI   r"   r#   r$   r   r   r    r0   p   s   zSerializeMemoizer.deserialize)rE   rQ   rR   rS   r<   r   rY   r5   boolrA   r   rV   r   r9   rU   rT   r0   r   r   r   r    r8   a   s    @r8   TF)      z\\p{[A-Za-z_]+}exprc                 C   s   t r
ttd| }ntt| rtd| | }zdd t| D W S  t	j
yU   t s2t| t|}ttdt	j}|dd u rMdt|f Y S dt|f Y S w )	NAzD`regex` module must be installed in order to use Unicode categories.c                 S   s   g | ]}t |qS r   )rV   )r)   xr   r   r    r-      rL   z$get_regexp_width.<locals>.<listcomp>MAXWIDTH    r   )
_has_regexresubcateg_patternsearchImportError	sre_parseparsegetwidthsre_constantserror
ValueErrorregexcompiler>   	MAXREPEATmatchrV   )ra   regexp_finalrK   rd   r   r   r    get_regexp_width   s    

rx   )LuLlLtLmLoMnMcPc)NdNls
categoriesc                    s8   t | dkrt fdd| D S | dkpt|  v S )Nrf   c                 3   s    | ]}t | V  qd S r   )_test_unicode_category)r)   charr   r   r    	<genexpr>   s    z)_test_unicode_category.<locals>.<genexpr>_)lenallunicodedatacategory)r   r   r   r   r    r      s   r   c                 C   
   t | tS )z
    Checks if all characters in `s` are alphanumeric characters (Unicode standard, so diacritics, indian vowels, non-latin
    numbers, etc. all pass). Synonymous with a Python `ID_CONTINUE` identifier. See PEP 3131 for details.
    )r   _ID_CONTINUEr   r   r   r    is_id_continue      
r   c                 C   r   )z
    Checks if all characters in `s` are alphabetic characters (Unicode standard, so diacritics, indian vowels, non-latin
    numbers, etc. all pass). Synonymous with a Python `ID_START` identifier. See PEP 3131 for details.
    )r   	_ID_STARTr   r   r   r    is_id_start   r   r   lc                 C   s   t t| S )zGiven a list (l) will removing duplicates from the list,
       preserving the original order of the list. Assumes that
       the list entries are hashable.)r2   r/   fromkeys)r   r   r   r    
dedup_list   s   r   c                   @   sB   e Zd ZdddZdefddZdd Zdeeef fd	d
Z	dS )rX   r   Nc                 C   s
   i | _ d S r   )enumsr\   r   r   r    rY         
zEnumerator.__init__c                 C   s$   || j vrt| j | j |< | j | S r   )r   r   r:   r   r   r   r    rC      s   

zEnumerator.getc                 C   
   t | jS r   )r   r   r\   r   r   r    __len__   r   zEnumerator.__len__c                 C   s.   dd | j  D }t|t| j ksJ |S )Nc                 S   s   i | ]\}}||qS r   r   )r)   r   r   r   r   r    r+          z'Enumerator.reversed.<locals>.<dictcomp>)r   r1   r   )r:   rr   r   r    r[      s   zEnumerator.reversed)r   N)
rE   rQ   rR   rY   rV   rC   r   r   r   r[   r   r   r   r    rX      s
    
rX   c                 C   s0   | sg gS t dd | D sJ | tt|  S )a  
    Accepts a list of alternatives, and enumerates all their possible concatenations.

    Examples:
        >>> combine_alternatives([range(2), [4,5]])
        [[0, 4], [0, 5], [1, 4], [1, 5]]

        >>> combine_alternatives(["abc", "xy", '$'])
        [['a', 'x', '$'], ['a', 'y', '$'], ['b', 'x', '$'], ['b', 'y', '$'], ['c', 'x', '$'], ['c', 'y', '$']]

        >>> combine_alternatives([])
        [[]]
    c                 s   s    | ]}|V  qd S r   r   )r)   r   r   r   r    r      s    z'combine_alternatives.<locals>.<genexpr>)r   r2   r   )listsr   r   r    combine_alternatives   s   r   c                   @   s&   e Zd ZeejjZedddZdS )FSr   c                 K   s6   t rd|v rtj| f|dd|S t| |fi |S )NwT)mode	overwrite)_has_atomicwritesatomicwritesatomic_writeopen)namer   kwargsr   r   r    r      s   zFS.openN)r   )rE   rQ   rR   staticmethodospathexistsr   r   r   r   r    r      s    r   c                   @   s   e Zd Zdd ZdS )fzsetc                 C   s   dd tt|  S )Nz{%s}, )joinmapreprr\   r   r   r    __repr__   s   zfzset.__repr__N)rE   rQ   rR   r   r   r   r   r    r      s    r   predc                    s    g   fdd| D }| fS )Nc                    s"   g | ]}|s  |r|qS r   )r   r)   elemfalse_elemsr   r   r    r-      s   " z!classify_bool.<locals>.<listcomp>r   )r   r   
true_elemsr   r   r    classify_bool   s   r   initialexpandc                 c   s^    t t| }t|}|r-| }|V  ||D ]}||vr(|| || q|sd S d S r   )r   r2   setpopleftaddr   )r   r   open_qvisitednode	next_noder   r   r    bfs  s   

r   c                 c   s8    t t| }|r| }|V  |||7 }|s	dS dS )zVbfs, but doesn't keep track of visited (aka seen), because there can be no repetitionsN)r   r2   r   )r   r   r   r   r   r   r    bfs_all_unique  s   r   c                    sf   t | tr
|  S t | tr fdd| D S t | tr!t| S t | tr1 fdd|  D S | S )Nc                    s   g | ]}t | qS r   r=   r   r$   r   r    r-     r   z_serialize.<locals>.<listcomp>c                    s   i | ]
\}}|t | qS r   r   )r)   r   r   r   r   r    r+      s    z_serialize.<locals>.<dictcomp>)r.   r5   r9   r2   	frozensetr/   r1   )r   r$   r   r   r    r=     s   




r=   n
max_factorc                 C   sz   | dksJ |dksJ | |kr| dfgS t |ddD ]}t| |\}}|| |kr6t||||fg   S qJ d|  )a  
    Splits n up into smaller factors and summands <= max_factor.
    Returns a list of [(a, b), ...]
    so that the following code returns n:

    n = 1
    for a, b in values:
        n = n * a + b

    Currently, we also keep a + b <= max_factor, but that might change
    r      rf   FzFailed to factorize %s)rangedivmodsmall_factors)r   r   ar   br   r   r    r   '  s   
r   c                   @   s   e Zd ZdZddee fddZdedefdd	Z	defd
dZ
dee fddZdefddZdd ZdefddZdd ZdS )
OrderedSetzkA minimal OrderedSet implementation, using a dictionary.

    (relies on the dictionary being ordered)
    r   r1   c                 C   s   t || _d S r   )r/   r   r   )r:   r1   r   r   r    rY   D  r]   zOrderedSet.__init__r   r   c                 C   s
   || j v S r   r   r   r   r   r    __contains__G  r   zOrderedSet.__contains__c                 C   s   d | j |< d S r   r   r   r   r   r    r   J  s   zOrderedSet.addc                 C   r   r   )iterr   r\   r   r   r    __iter__M  r   zOrderedSet.__iter__c                 C   s   | j |= d S r   r   r   r   r   r    removeP  rZ   zOrderedSet.removec                 C   r   r   )r^   r   r\   r   r   r    __bool__S  r   zOrderedSet.__bool__c                 C   r   r   )r   r   r\   r   r   r    r   V  r   zOrderedSet.__len__c                 C   s"   t | j ddtt|  dS )N(r   ))rD   rE   r   r   r   r\   r   r   r    r   Y  s   "zOrderedSet.__repr__N)r   )rE   rQ   rR   rS   r   r   rY   r   r^   r   r   r   r   r   r   rV   r   r   r   r   r   r    r   ?  s    r   )NN)Jr   r   	itertoolsr   collectionsr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   sysrh   logging	getLoggerr   Logger__annotations__
addHandlerStreamHandlersetLevelCRITICALobjectNO_VALUEr   r!   rT   r(   r4   r5   r8   rs   rg   rl   version_info
re._parser_parserrm   re._constants
_constantsrp   rt   rj   rV   rx   r   r   r^   r   r   r   r   rX   r   r   r   r   r   r   r   r   r   r=   r   r   r   r   r   r    <module>   sh   
 <$"/

& 	"