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__ÚinteregularÚFSMÚ__annotations__Ústrr   Úint© r   r   úR/home/ubuntu/vllm_env/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   Úparse_patternÚ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-   ÚstateÚfsmÚsymbolÚ
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   Ú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   r0   r   r'   Úby_transitionr   Úappendr   Újoin)r*   Úallowed_charactersÚ	state_mapÚ
symbol_idxÚsymbolsr4   r   r   r   Úget_allowed_characters7   s   üz"RegexParser.get_allowed_charactersc                 C   s   | j S r    )r   r8   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>r:   c                    s   g | ]}|ˆ vr|‘qS r   r   rE   ©Únot_anything_else_charactersr   r   rH   N   rI   )r   Úsetr   r'   Úkeysr=   r   )r*   rD   r   rJ   r   r&   K   s    þzRegexParser._update_alphabetÚ
new_configc                 C   s   t j | |¡ |  |j¡ d S r    )r
   r   Úfsetr&   r'   )r*   rN   r   r   r   r   P   s   zRegexParser.config)r   r   r   Ú__doc__r(   r/   r   r   r   r   r   r   r   r"   r6   Úboolr9   rB   r   rC   r&   r
   r   ÚsetterÚ__classcell__r   r   r+   r   r      s   
 ,r   )Útypingr   r   r   r   r   r   Úinteregular.fsmr   Úcharacterlevelparserr
   r   r   r   r   r   r   Ú<module>   s
    