o
    0 i,                  	   @   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AbstractSetZ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   V/home/app/PaddleOCR-VL-test/.venv_paddleocr/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 )r4   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)selfr6   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#   r9   r   r   r*   D   r+   z'Serialize.serialize.<locals>.<dictcomp>r$   r<   )in_typesmemoizedgetr=   type__name__hasattrr<   )r9   r#   fieldsresr   r?   r   r8   ?   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 )NZ__serialize_namespace__c                 S   s   i | ]}|j |qS r   )rD   )r(   cr   r   r   r*   M       z)Serialize.deserialize.<locals>.<dictcomp>r;   r%   zCannot find key for classr'   )r=   __new__setattrr'   r   rE   )rH   r!   r#   r"   rF   instr>   er   r   r   r/   J   s    


zSerialize.deserializer   )rD   
__module____qualname____doc__r   r   r:   r   strr8   classmethodr	   r3   intr/   r   r   r   r   r4   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 )r7   z<A version of serialize that memoizes objects to reduce space)rA   r6   r   Nc                 C   s   t || _t | _d S r   )tupler6   
EnumeratorrA   )r9   r6   r   r   r   __init__f   s   
zSerializeMemoizer.__init__r   c                 C   s   t || jS r   )r-   r6   )r9   r   r   r   r   r@   j      zSerializeMemoizer.in_typesc                 C   s   t | j d S r   )r<   rA   reversedr9   r   r   r   r8   m      zSerializeMemoizer.serializer!   r"   r#   c                 C   s   t |||S r   r&   )rH   r!   r"   r#   r   r   r   r/   p   s   zSerializeMemoizer.deserialize)rD   rO   rP   rQ   r;   r   rW   r4   boolr@   r   rT   r   r8   rS   rR   r/   r   r   r   r   r7   a   s    @r7   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   )rT   )r(   xr   r   r   r,      rJ   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matchrT   )r_   Zregexp_finalrI   rb   r   r   r   get_regexp_width   s    

ru   )ZLuZLlLtZLmZLoZMnZMcZPc)ZNdZNls
categoriesc                    s8   t | dkrt fdd| D S | dkpt|  v S )Nrd   c                 3   s    | ]}t | V  qd S r   )_test_unicode_category)r(   charrx   r   r   	<genexpr>   s    z)_test_unicode_category.<locals>.<genexpr>_)lenallunicodedatacategory)rw   rx   r   r{   r   ry      s   ry   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.
    )ry   _ID_CONTINUErw   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.
    )ry   	_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.)r1   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 )rV   r   Nc                 C   s
   i | _ d S r   )enumsrZ   r   r   r   rW         
zEnumerator.__init__c                 C   s$   || j vrt| j | j |< | j | S r   )r   r~   r9   r   r   r   r   rB      s   

zEnumerator.getc                 C   
   t | jS r   )r~   r   rZ   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   r0   r~   )r9   rr   r   r   rY      s   zEnumerator.reversed)r   N)
rD   rO   rP   rW   rT   rB   r   r   r   rY   r   r   r   r   rV      s
    
rV   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   r1   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atomicwritesZatomic_writeopen)namer   kwargsr   r   r   r      s   zFS.openN)r   )rD   rO   rP   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reprrZ   r   r   r   __repr__   s   zfzset.__repr__N)rD   rO   rP   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Zfalse_elemsr   r   r   r,      s   " z!classify_bool.<locals>.<listcomp>r   )r   r   Z
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   r1   setpopleftaddr   )r   r   open_qvisitednodeZ	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   r1   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-   r4   r8   r1   	frozensetr.   r0   )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      rd   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   r0   c                 C   s   t || _d S r   )r.   r   r   )r9   r0   r   r   r   rW   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   rZ   r   r   r   __iter__M  r   zOrderedSet.__iter__c                 C   s   | j |= d S r   r   r   r   r   r   removeP  rX   zOrderedSet.removec                 C   r   r   )r\   r   rZ   r   r   r   __bool__S  r   zOrderedSet.__bool__c                 C   r   r   )r~   r   rZ   r   r   r   r   V  r   zOrderedSet.__len__c                 C   s"   t | j ddtt|  dS )N(r   ))rC   rD   r   r   r   rZ   r   r   r   r   Y  s   "zOrderedSet.__repr__N)r   )rD   rO   rP   rQ   r   r   rW   r   r\   r   r   r   r   r   r   rT   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   sysrf   logging	getLoggerr   Logger__annotations__
addHandlerStreamHandlersetLevelCRITICALobjectZNO_VALUEr   r    rR   r'   r3   r4   r7   rq   re   rj   version_infoZ
re._parser_parserrk   Zre._constants
_constantsrn   rr   rh   rT   ru   r   r   r\   ry   r   r   r   rV   r   r   r   r   r   r   r   r   r   r<   r   r   r   r   r   r   <module>   sh   
 <$"/

& 	"