
    XhL8                     H   d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	 ddl
mZ ddl
mZmZ dd	lmZmZ dd
lmZ  G d d      Z G d d      Zd Z G d d      Z G d de      Z G d de      Zd Zdee   fdZ G d d      Zd Z G d d      Zd Zd Z  G d  d!      Z!y")#zLProvides functions for the automatic building and shaping of the parse-tree.    )List   )GrammarErrorConfigurationError)Token)Tree)Transformer_InPlace)_vargs_meta_vargs_meta_inline)partialwraps)productc                       e Zd Zd Zd Zy)ExpandSingleChildc                     || _         y N)node_builder)selfr   s     K/var/www/html/myenv/lib/python3.12/site-packages/lark/parse_tree_builder.py__init__zExpandSingleChild.__init__   s
    (    c                 J    t        |      dk(  r|d   S | j                  |      S )Nr   r   )lenr   )r   childrens     r   __call__zExpandSingleChild.__call__   s)    x=AA;$$X..r   N__name__
__module____qualname__r   r    r   r   r   r      s    )/r   r   c                        e Zd ZddZd Zd Zy)PropagatePositionsNc                      || _         || _        y r   )r   node_filter)r   r   r$   s      r   r   zPropagatePositions.__init__   s    (&r   c                    | j                  |      }t        |t              r|j                  }| j	                  |      }|t        |d      s[t        |d|j                        |_        t        |d|j                        |_        t        |d|j                        |_	        d|_
        t        |d|j                        |_        t        |d|j                        |_        t        |d|j                        |_        | j	                  t        |            }|t        |d      s[t        |d|j                        |_        t        |d|j                         |_        t        |d	|j"                        |_        d|_
        t        |d|j                        |_        t        |d|j                         |_        t        |d	|j"                        |_        |S )
Nlinecontainer_linecontainer_columncontainer_start_posFend_linecontainer_end_linecontainer_end_columncontainer_end_pos)r   
isinstancer   meta_pp_get_metahasattrgetattrr&   column	start_posemptyr'   r(   r)   reversedr*   
end_columnend_posr+   r,   r-   )r   r   resres_meta
first_meta	last_metas         r   r   zPropagatePositions.__call__!   s   )c4  xxH**84J%x0$+J8H*//$ZHM&-j:LjN_N_&`HO)0=RT^ThTh)iH&%*HN*1*>NPZP_P_*`',3J@RT^TeTe,f)/6zCXZdZnZn/o,))(8*<=I$x4(/	;OQZQcQc(dH%*1)=SU^UiUi*jH''.y:MyO`O`'aH$%*HN.5iAUW`WiWi.j+07	CY[d[o[o0p--4Y@SU^UfUf-g*
r   c                    |D ]  }| j                   | j                  |      s!t        |t              r%|j                  j                  rH|j                  c S t        |t
              r|c S t        |d      sw|j                         c S  y )N__lark_meta__)r$   r.   r   r/   r5   r   r1   r>   )r   r   cs      r   r0   zPropagatePositions._pp_get_metaG   sq     		)A+D4D4DQ4G!T"vv||66MAu%O,((		)r   r   )r   r   r   r   r   r0   r    r   r   r"   r"      s    '$L
)r   r"   c                 t    t        |       rt        t        |       S | du rt        S | du ry t        d| z        )N)r$   TFz*Invalid option for propagate_positions: %r)callabler   r"   r   )options    r   make_propagate_positionsrC   S   s@    )v>>	4!!	5
IFR
SSr   c                       e Zd Zd Zd Zy)ChildFilterc                 .    || _         || _        || _        y r   )r   
to_includeappend_none)r   rG   rH   r   s       r   r   zChildFilter.__init___   s    ($&r   c                     g }| j                   D ]:  \  }}}|r	|d g|z  z  }|r|||   j                  z  }'|j                  ||          < | j                  r|d g| j                  z  z  }| j	                  |      S r   rG   r   appendrH   r   r   r   filteredi	to_expandadd_nones         r   r   zChildFilter.__call__d   s    &*oo 	-"Ay(TFX--HQK000,	- !1!111H  **r   Nr   r    r   r   rE   rE   ^   s    '
+r   rE   c                       e Zd ZdZd Zy)ChildFilterLALR`Optimized childfilter for LALR (assumes no duplication in parse tree, so it's safe to change it)c                    g }| j                   D ]L  \  }}}|r	|d g|z  z  }|r%|r|||   j                  z  })||   j                  }9|j                  ||          N | j                  r|d g| j                  z  z  }| j	                  |      S r   rJ   rL   s         r   r   zChildFilterLALR.__call__x   s    &*oo 		-"Ay(TFX-- 4 44H'{33H,		- !1!111H  **r   N)r   r   r   __doc__r   r    r   r   rR   rR   u   s
    j+r   rR   c                       e Zd ZdZd Zd Zy)ChildFilterLALR_NoPlaceholdersrS   c                      || _         || _        y r   )r   rG   )r   rG   r   s      r   r   z'ChildFilterLALR_NoPlaceholders.__init__       ($r   c                     g }| j                   D ]@  \  }}|r%|r|||   j                  z  }||   j                  }-|j                  ||          B | j                  |      S r   )rG   r   rK   r   )r   r   rM   rN   rO   s        r   r   z'ChildFilterLALR_NoPlaceholders.__call__   sj     OO 	-LAy 4 44H'{33H,	-   **r   Nr   r   r   rU   r   r   r    r   r   rW   rW      s    f%
+r   rW   c                 V    | j                    xr | j                  j                  d      S )N_)is_termname
startswith)syms    r   _should_expandrb      s"    {{?7sxx22377r   _empty_indicesc                    |r|j                  d      t        |       k(  sJ dj                  d |D              }|j                  d      D cg c]  }t        |       }}t        |      t        |       dz   k(  s$J |t        |       f       dgt        |       dz   z  }g }d}t	        |       D ]G  \  }	}
|||	   z  }|s|
j
                  r|
j                  r)|j                  |	t        |
      |f       d}I ||t        |          z  }|s)t        |      t        |       k  st        d |D              rK|s|rt        |rt        ||      S t        ||      S t        t        |D 	cg c]
  \  }	}}|	|f c}}}	      S y c c}w c c}}}	w )NF c              3   D   K   | ]  }t        t        |              y wr   )strint).0bs     r   	<genexpr>z,maybe_create_child_filter.<locals>.<genexpr>   s     8ACAK8s    0r   r   c              3   (   K   | ]
  \  }}}|  y wr   r    )ri   rN   rO   r]   s       r   rk   z,maybe_create_child_filter.<locals>.<genexpr>   s     @l~qR[\]@ls   )countr   joinsplit	enumerater^   
filter_outrK   rb   anyr   rE   rR   rW   )	expansionkeep_all_tokens	ambiguousrc   sonesempty_indicesrG   nones_to_addrN   ra   xr]   s                r   maybe_create_child_filterr|      s   ##E*c)n<<<GG888/0wws|<tT<<=!S^A%55Vs9~7VV5s9~a/0JLI& 3a((3;;3>>q."5|DEL	 M#i.11LZ3y>9S@lak@l=lY);*Vbcc*Vbcc 9PZ;[;[uq1QF;[\\ >m =( <\s   F 'Fc                       e Zd ZdZd Zd Zy)AmbiguousExpandera  Deal with the case where we're expanding children ('_rule') into a parent but the children
       are ambiguous. i.e. (parent->_ambig->_expand_this_rule). In this case, make the parent itself
       ambiguous with as many copies as there are ambiguous children, and then copy the ambiguous children
       into the right parents in the right places, essentially shifting the ambiguity up the tree.c                 .    || _         || _        || _        y r   )r   
tree_classrO   )r   rO   r   r   s       r   r   zAmbiguousExpander.__init__   s    ($"r   c                    d }g }t        |      D ]>  \  }} ||      s|| j                  v r|j                  |       |j                  d       @ |s| j	                  |      S t        |      D cg c]  \  }}||v r|j
                  n|f }}}| j                  dt        | D cg c]  }| j	                  t        |             c}      S c c}}w c c}w )Nc                 <    t        | d      xr | j                  dk(  S )Ndata_ambigr1   r   )ts    r   _is_ambig_treez2AmbiguousExpander.__call__.<locals>._is_ambig_tree   s    1f%<!&&H*<<r   r   )	rq   rO   rK   expand_kids_by_datar   r   r   r   list)r   r   r   rv   rN   childexpandfs           r   r   zAmbiguousExpander.__call__   s    	= 	!(+ 	4HAue$&$$Q'))(3	4 $$X..QZ[cQdeXQAN%..@eexgW]N^)_$*;*;DG*D)_`` f)_s   3C)!C
Nr[   r    r   r   r~   r~      s    f#
ar   r~   c                     t        |      D cg c],  \  }}|s#|j                  r|j                  st        |      r|. }}}|rt	        t
        ||       S y c c}}w r   )rq   r^   rr   rb   r   r~   )r   rt   ru   rN   ra   rO   s         r   maybe_create_ambiguous_expanderr      s`    !*9!5 ivq##ckkcnnSabeSf  iI i()Z@@ is   1Ac                       e Zd ZdZd Zd Zy)AmbiguousIntermediateExpanderaq  
    Propagate ambiguous intermediate nodes and their derivations up to the
    current rule.

    In general, converts

    rule
      _iambig
        _inter
          someChildren1
          ...
        _inter
          someChildren2
          ...
      someChildren3
      ...

    to

    _ambig
      rule
        someChildren1
        ...
        someChildren3
        ...
      rule
        someChildren2
        ...
        someChildren3
        ...
      rule
        childrenFromNestedIambigs
        ...
        someChildren3
        ...
      ...

    propagating up any nested '_iambig' nodes along the way.
    c                      || _         || _        y r   )r   r   )r   r   r   s      r   r   z&AmbiguousIntermediateExpander.__init__  rY   r   c                      d  fd |      }|r:|D cg c]  } j                  |j                         }} j                  d|      S  j                  |      S c c}w )Nc                 <    t        | d      xr | j                  dk(  S )Nr   _iambigr   )r   s    r   _is_iambig_treez?AmbiguousIntermediateExpander.__call__.<locals>._is_iambig_tree  s    5&)EejjI.EEr   c                 .   | r | d         r| d   }g }|j                   D ]n  } |j                         }|r%|D ]  }|xj                   | dd z  c_          ||z  }<	j                  d|j                   | dd z         }|j                  |       p |S yy)a  
            Recursively flatten the derivations of the parent of an '_iambig'
            node. Returns a list of '_inter' nodes guaranteed not
            to contain any nested '_iambig' nodes, or None if children does
            not contain an '_iambig' node.
            r   r   N_inter)r   r   rK   )
r   iambig_noderesult
grandchild	collapsedr   new_tree_collapse_iambigr   r   s
          r   r   z@AmbiguousIntermediateExpander.__call__.<locals>._collapse_iambig  s     OHQK8&qk"-"6"6 0J 01D1D EI %. ;E!NNhqrl:N;)+#'??8Z=P=PS[\]\^S_=_#`h/0  9xr   r   )r   r   r   )r   r   r   r?   processed_nodesr   r   s   `    @@r   r   z&AmbiguousIntermediateExpander.__call__  sg    	F	0 %X.	FOPt00<POP??8_==  ** Qs   "A#Nr[   r    r   r   r   r      s    &P%!+r   r   c                 .     t                fd       }|S )Nc                 @    t        j                  |       } |      S r   )r   r   )r   treefuncs     r   r   zinplace_transformer.<locals>.f9  s     DMM8,Dzr   )r   )r   r   s   ` r   inplace_transformerr   8  s     
4[  Hr   c                 l     t         u st        u rt        d      t                fd       }|S )Nz0Meta args not supported for internal transformerc                      | d       S r   r    )r   r   r_   wrappers    r   r   zapply_visit_wrapper.<locals>.fE  s    tT8T22r   )r
   r   NotImplementedErrorr   )r   r_   r   r   s   ``` r   apply_visit_wrapperr   A  s:    +,>!>!"TUU
4[3 3Hr   c                   "    e Zd ZddZd ZddZy)ParseTreeBuilderc                 z    || _         || _        || _        || _        t	        | j                  |            | _        y r   )r   propagate_positionsrv   maybe_placeholdersr   _init_buildersrule_builders)r   rulesr   r   rv   r   s         r   r   zParseTreeBuilder.__init__L  s8    $#6 ""4!$"5"5e"<=r   c              #     K   t        | j                        }|D ]  }|j                  }|j                  }|j                  }t        t        d |xr |j                   xr t        t        |j                  || j                  | j                  r|j                  nd       || j                  xr! t        | j                  |j                  |      | j                  xr t!        t"        | j                        g            }||f  y wr   )rC   r   optionsru   expand1r   filteraliasr   r|   rt   rv   r   ry   r   r   r   r   )r   r   r   ruler   ru   expand_single_childwrapper_chains           r   r   zParseTreeBuilder._init_buildersT  s     6t7O7OP 	&DllG%55O")// $7TZZN=N)$../4>>tx  uL  uL[b[p[p  RV  W#t#B4??TXTbTbds#tZ7+H$//#Z/ " M %%	&s   DDNc                   
 i }t        |dd       

r
fd}n| j                  }| j                  D ]  \  }}|j                  xs. |j                  j
                  xs |j                  j                  }	 t        ||      }t        |dd       }|t        |||      }nt        |t              rt        |      }|D ]
  }	 |	|      } ||v rt        d|d      |||<    |S # t        $ r t        ||      }Y Bw xY w)N__default__c                      | |d       S r   r    )r   r   default_handlers     r   default_callbackz:ParseTreeBuilder.create_callback.<locals>.default_callbackk  s    &tXt<<r   visit_wrapperzRule 'z' already exists)r2   r   r   r   r   template_sourceoriginr_   r   r.   r	   r   AttributeErrorr   r   )r   transformer	callbacksr   r   r   user_callback_namer   r   wr   s             @r   create_callbackz ParseTreeBuilder.create_callbackf  s   	!+}dC=  $#'#5#5 	 D-!%!_t||/K/K!_t{{O_O_BK);<!!_d;&+A/A7KA-@A+A.A # aD y "#GHHIdO'	 *  " B,.@ABs   4AC##C;:C;)FFFr   )r   r   r   r   r   r   r    r   r   r   r   K  s    >&$r   r   N)"rU   typingr   
exceptionsr   r   lexerr   r   r   visitorsr	   r
   r   	functoolsr   r   	itertoolsr   r   r"   rC   rE   rR   rW   rb   boolr|   r~   r   r   r   r   r   r    r   r   <module>r      s    R  8   ) 5 % / /5) 5)nT+ +.+k +,+[ +&8]UYZ^U_ ]8a aBAN+ N+d: :r   