o
    Ê)i0  ã                   @   sT   d dl mZmZmZmZmZ d dlZd dlmZ ddl	m
Z
mZ G dd„ de
ƒZdS )é    )ÚDictÚHashableÚOptionalÚUnionÚListN©Úanything_elseé   )ÚCharacterLevelParserÚCharacterLevelParserConfigc                       sÌ   e Zd ZU dZdZdZG dd„ dƒZeed< eed< defd	e	e
ef d
ee def‡ fdd„Zde
dd fdd„Z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ejjdefdd„ƒZ‡  ZS )ÚRegexParserznRegexParser is an example CharacterLevelParser that only allows strings that match a given regular expression.éÿÿÿÿéþÿÿÿc                   @   s0   e Zd ZU ejed< eed< eeef ed< dS )zRegexParser._ContextÚpatternÚanything_else_charactersÚstate_character_cacheN)	Ú__name__Ú
__module__Ú__qualname__ÚinteregularZFSMÚ__annotations__Ústrr   Úint© r   r   úh/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/lmformatenforcer/regexparser.pyÚ_Context   s   
 
r   ÚcontextÚcurrent_stateNr   Úconfigc                    st   t ƒ  |¡ t|tƒr%t ¡ | _t |¡ 	¡ | j_
i | j_|  | jj¡ n|| _|tjkr5| jj
j| _d S || _d S ©N)ÚsuperÚ__init__Ú
isinstancer   r   r   r   r   Zparse_patternZto_fsmr   r   Ú_update_alphabetr   ÚalphabetÚUNINITIALIZED_STATEÚinitialr   )Úselfr   r   r   ©Ú	__class__r   r   r!      s   

$zRegexParser.__init__Únew_characterÚreturnc                 C   sŠ   | j tjkr| S | j }| jj}|}t|jv r||jvrt}|j| }z|j| | }t| j| j|ƒW S  t	yD   t| j| jtjƒ Y S w r   )
r   r   ÚINVALID_STATEr   r   r   r$   Úmapr   ÚKeyError)r'   r*   ÚstateZfsmÚsymbolZ
transitionr   r   r   Úadd_character    s   
þzRegexParser.add_characterc                 C   s   | j | jjjv p| j tjkS r   )r   r   r   Zfinalsr   r,   ©r'   r   r   r   Úcan_end4   s   zRegexParser.can_endc                 C   sž   | j | jjjvr
dS | j | jjvrHg }| jjj| j  }|D ] }| jjjj| }|D ]}|tkr7| | jj	¡ q)| |¡ q)qd 
|¡| jj| j < | jj| j  S )NÚ )r   r   r   r-   r   r$   Zby_transitionr   Úappendr   Újoin)r'   Zallowed_charactersZ	state_mapZ
symbol_idxÚsymbolsr0   r   r   r   Úget_allowed_characters7   s   üz"RegexParser.get_allowed_charactersc                 C   s   | j S r   )r   r2   r   r   r   Ú	cache_keyG   s   zRegexParser.cache_keyÚnew_alphabetc                    sF   | j r!tdd„ | j jj ¡ D ƒƒ‰ d ‡ fdd„|D ƒ¡| j _d S d S )Nc                 S   s   g | ]}|t kr|‘qS r   r   ©Ú.0Úcr   r   r   Ú
<listcomp>M   ó    z0RegexParser._update_alphabet.<locals>.<listcomp>r4   c                    s   g | ]}|ˆ vr|‘qS r   r   r;   ©Znot_anything_else_charactersr   r   r>   N   r?   )r   Úsetr   r$   Úkeysr6   r   )r'   r:   r   r@   r   r#   K   s    þzRegexParser._update_alphabetÚ
new_configc                 C   s   t j | |¡ |  |j¡ d S r   )r
   r   Úfsetr#   r$   )r'   rC   r   r   r   r   P   s   zRegexParser.config)r   r   r   Ú__doc__r%   r,   r   r   r   r   r   r   r   r!   r1   Úboolr3   r8   r   r9   r#   r
   r   ÚsetterÚ__classcell__r   r   r(   r   r      s   
 ,r   )Útypingr   r   r   r   r   r   Zinteregular.fsmr   Zcharacterlevelparserr
   r   r   r   r   r   r   Ú<module>   s
    