a
    d                     @   s   d Z ddlmZ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 ddlmZ ddlmZmZmZ dd	lmZmZmZ dd
lmZmZ ddlmZ dd ZG dd deZG dd deZdS )z3Reconstruct text from a tree, based on Lark grammar    )ListDictUnionCallableIterableOptionalN   )Lark)Tree	ParseTree)Transformer_InPlace)Token
PatternStrTerminalDef)TerminalNonTerminalSymbol)TreeMatcheris_discarded_terminal)is_id_continuec                 C   s(   zt | }W dS  ty"   Y dS 0 d S )NFT)nextStopIteration)i_ r   Y/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/lark/reconstruct.pyis_iter_empty   s
    r   c                   @   sp   e Zd ZU dZeeef ed< eeee	gef f ed< eeef eeee	gef f ddddZ
dd	 ZdS )
WriteTokensTransformerzTInserts discarded tokens into their correct place, according to the rules of grammartokens	term_subsN)r   r   returnc                 C   s   || _ || _d S N)r   r   )selfr   r   r   r   r   __init__   s    zWriteTokensTransformer.__init__c           
   	   C   s
  t |ddst||S t|}g }|jD ]}t|rz| j|j |}W n> ty   | j|j }t	|j
tsztd| |j
j}Y n0 || q(t|}	t	|	tr||	7 }q(t	|	trt|	j|ksJ |	nt|	j|ksJ ||	f||	 q(t|sJ |S )N
match_treeFz,Reconstructing regexps not supported yet: %s)getattrr
   iterZorig_expansionr   r   nameKeyErrorr   
isinstancepatternr   NotImplementedErrorvalueappendr   listr   r   typer   datar   )
r"   r0   childrenmetaZ	iter_argsZto_writesymvtxr   r   r   __default__!   s.    




z"WriteTokensTransformer.__default__)__name__
__module____qualname____doc__r   strr   __annotations__r   r   r#   r7   r   r   r   r   r      s
   
,r   c                   @   sx   e Zd ZU dZeed< deeee	e
ege	f f  ddddZdd Zdeee
ee	 gee	 f  ee	d
ddZdS )Reconstructora  
    A Reconstructor that will, given a full parse Tree, generate source code.

    Note:
        The reconstructor cannot generate values from regexps. If you need to produce discarded
        regexes, such as newlines, use `term_subs` and provide default values for them.

    Paramters:
        parser: a Lark instance
        term_subs: a dictionary of [Terminal name as str] to [output text as str]
    write_tokensN)parserr   r    c                 C   s,   t | | tdd | jD |p"i | _d S )Nc                 S   s   i | ]}|j |qS r   )r'   ).0r5   r   r   r   
<dictcomp>S       z*Reconstructor.__init__.<locals>.<dictcomp>)r   r#   r   r   r?   )r"   r@   r   r   r   r   r#   P   s    zReconstructor.__init__c                 c   sJ   |  ||j}| j|}|D ]&}t|tr>| |E d H  q|V  qd S r!   )r$   r0   r?   Z	transformr)   r
   _reconstruct)r"   treeZunreduced_treeresitemr   r   r   rD   U   s    
zReconstructor._reconstructT)rE   postprocinsert_spacesr    c                 C   sn   |  |}|r||}g }d}|D ]@}|rT|rT|rTt|d rTt|d rT|d || |}q"d|S )N r    )rD   r   r-   join)r"   rE   rH   rI   r6   yZ	prev_itemrG   r   r   r   reconstruct`   s    
$

zReconstructor.reconstruct)N)NT)r8   r9   r:   r;   r   r=   r	   r   r   r<   r   r   r#   rD   r   r   boolrO   r   r   r   r   r>   A   s
   
*r>   ) r;   typingr   r   r   r   r   r   unicodedataZlarkr	   rE   r
   r   Zvisitorsr   lexerr   r   r   Zgrammarr   r   r   Ztree_matcherr   r   utilsr   r   r   r>   r   r   r   r   <module>   s    *