
                             S r SSKJrJrJrJr  SSKJr  SSKJ	r	J
r
  SSKJr  SSKJrJrJr  SSKJrJrJr  SS	KJrJr  SS
KJr  S r " S S\5      r " S S\5      rg)z3Reconstruct text from a tree, based on Lark grammar    )DictCallableIterableOptional   )Lark)Tree	ParseTree)Transformer_InPlace)Token
PatternStrTerminalDef)TerminalNonTerminalSymbol)TreeMatcheris_discarded_terminal)is_id_continuec                 <     [        U 5      ng! [         a     gf = f)NFT)nextStopIteration)i_s     #lib/third_party/lark/reconstruct.pyis_iter_emptyr      s%    G s    
c                       \ rS rSr% Sr\\\4   \S'   \\\	\
/\4   4   \S'   S\\\4   S\\\	\
/\4   4   SS4S jrS rS	rg)
WriteTokensTransformer   zTInserts discarded tokens into their correct place, according to the rules of grammartokens	term_subsreturnNc                     Xl         X l        g N)r   r    )selfr   r    s      r   __init__WriteTokensTransformer.__init__   s    "    c                     [        USS5      (       d  [        X5      $ [        U5      n/ nUR                   H  n[	        U5      (       a3   U R
                  UR                     " U5      nUR                  U5        MF  [        U5      n	[        U	[         5      (       a  XY-  nMl  [        U	["        5      (       a!  [%        U	R&                  5      U:X  d   U	5       eO![)        U	R*                  5      U:X  d   Xi45       eUR                  U	5        M     [-        U5      (       d   eU$ ! [         a`    U R                  UR                     n[        UR                  [        5      (       d  [        SU-  5      eUR                  R                  n GN"f = f)N
match_treeFz,Reconstructing regexps not supported yet: %s)getattrr	   iterorig_expansionr   r    nameKeyErrorr   
isinstancepatternr   NotImplementedErrorvalueappendr   listr   r   typer   datar   )
r$   r6   childrenmeta	iter_argsto_writesymvtxs
             r   __default__"WriteTokensTransformer.__default__    sJ   t\511''N	&&C$S))(sxx05A "Oa&&MH!!U++'/36996*1662c9CC8C9OOA&) ', Y'''''   (CHH-A%aii<<12`cd2dee		A(s   D##A&FF)r    r   )__name__
__module____qualname____firstlineno____doc__r   strr   __annotations__r   r   r%   r?   __static_attributes__ r'   r   r   r      ss    Zk!""C6(C-0011#tC$45 #$sHV\U]_bUbLcGcBd #im #r'   r   c            
           \ rS rSr% Sr\\S'   SS\S\\	\
\\/\
4   4      SS4S jjrS	 rSS
\S\\\\
   /\\
   4      S\S\
4S jjrSrg)Reconstructor@   ay  
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.

Parameters:
    parser: a Lark instance
    term_subs: a dictionary of [Terminal name as str] to [output text as str]
write_tokensNparserr    r!   c                     [         R                  " X5        [        U R                   Vs0 s H  o3R                  U_M     snU=(       d    0 5      U l        g s  snf r#   )r   r%   r   r   r-   rM   )r$   rN   r    r=   s       r   r%   Reconstructor.__init__O   sB    T*2dkk3RkFF1Hk3RT]Tcacd3Rs   Ac              #      #    U R                  XR                  5      nU R                  R                  U5      nU H7  n[	        U[
        5      (       a  U R                  U5       S h  vN   M3  Uv   M9     g  N7fr#   )r)   r6   rM   	transformr/   r	   _reconstruct)r$   treeunreduced_treeresitems        r   rS   Reconstructor._reconstructT   sb     yy9)).9D$%%,,T222
  3s   A%A9'A7(A9rT   postprocinsert_spacesc                 <   U R                  U5      nU(       a  U" U5      n/ nSnU Hb  nU(       aE  U(       a>  U(       a7  [        US   5      (       a$  [        US   5      (       a  UR                  S5        UR                  U5        UnMd     SR                  U5      $ )N r    )rS   r   r3   join)r$   rT   rY   rZ   r>   y	prev_itemrW   s           r   reconstructReconstructor.reconstruct_   s    d#A	DtyQS}8U8UZhimnoipZqZqHHTNI	 
 wwqzr'   )rM   r#   )NT)rA   rB   rC   rD   rE   r   rG   r   r   r   rF   r   r   r%   rS   r
   r   boolrb   rH   rI   r'   r   rK   rK   @   s    
 )(et ec8VHVYMCZ>Z9[0\ efj e
		 XhQTX`adXeGe>f5g   ~B   LO  r'   rK   N)rE   typingr   r   r   r   larkr   rT   r	   r
   visitorsr   lexerr   r   r   grammarr   r   r   tree_matcherr   r   utilsr   r   r   rK   rI   r'   r   <module>rl      sH    9 5 5  ! ) 1 1 2 2 < !'0 'T*K *r'   