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   Y/home/ubuntu/veenaModal/venv/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
    