
     7                     F   S SK Jr  SSKJrJr  SSKJr  SSKJr  SSK	J
r
  SSK	JrJr  S SKJrJr  S S	KJr   " S
 S5      r " S S5      rS r " S S5      r " S S\5      r " S S\5      rS rS\\   4S jr " S S5      rS r " S S5      rS rS r " S S 5      r g!)"    )List   )GrammarErrorConfigurationError)Token)Tree)Transformer_InPlace)_vargs_meta_vargs_meta_inline)partialwraps)productc                        \ rS rSrS rS rSrg)ExpandSingleChild   c                     Xl         g Nnode_builder)selfr   s     *lib/third_party/lark/parse_tree_builder.py__init__ExpandSingleChild.__init__   s    (    c                 L    [        U5      S:X  a  US   $ U R                  U5      $ )Nr   r   )lenr   )r   childrens     r   __call__ExpandSingleChild.__call__   s)    x=AA;$$X..r   r   N__name__
__module____qualname____firstlineno__r   r   __static_attributes__ r   r   r   r      s    )/r   r   c                   *    \ rS rSrSS jrS rS rSrg)PropagatePositions   Nc                     Xl         X l        g r   r   node_filter)r   r   r,   s      r   r   PropagatePositions.__init__   s    (&r   c                 ^   U R                  U5      n[        U[        5      (       Ga  UR                  nU R	                  U5      nUb  [        US5      (       d[  [        USUR                  5      Ul        [        USUR                  5      Ul        [        USUR                  5      Ul	        SUl
        [        USUR                  5      Ul        [        USUR                  5      Ul        U R	                  [        U5      5      nUb  [        US5      (       d[  [        USUR                  5      Ul        [        USUR                  5      Ul        [        US	UR                   5      Ul        SUl
        [        USUR                  5      Ul        [        USUR                  5      Ul        U$ )
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emptyr0   r1   reversedr3   
end_columnend_posr4   r5   )r   r   resres_meta
first_meta	last_metas         r   r   PropagatePositions.__call__   s{   )c4   xxH**84J%x00$+J8H*//$ZHM&-j:LjN_N_&`HO)0=RT^ThTh)iH&%*HN*1*>NPZP_P_*`',3J@RT^TeTe,f)))(8*<=I$x44(/	;OQZQcQc(dH%*1)=SU^UiUi*jH''.y:MyO`O`'aH$%*HN.5iAUW`WiWi.j+07	CY[d[o[o0p-
r   c                 X   U H  nU R                   b  U R                  U5      (       d  M(  [        U[        5      (       a+  UR                  R                  (       d  UR                  s  $ Mh  [        U[
        5      (       a  Us  $ [        US5      (       d  M  UR                  5       s  $    g )N__lark_meta__)r,   r7   r   r8   r>   r   r:   rH   )r   r   cs      r   r9   PropagatePositions._pp_get_metaC   s}    A+D4D4DQ4G4G!T""vv||66M $Au%%O,,(( r   r+   r   )r!   r"   r#   r$   r   r   r9   r%   r&   r   r   r(   r(      s    '"H
)r   r(   c                 |    [        U 5      (       a  [        [        U S9$ U SL a  [        $ U SL a  g [        SU -  5      e)N)r,   TFz*Invalid option for propagate_positions: %r)callabler   r(   r   )options    r   make_propagate_positionsrN   O   sC    )v>>	4!!	5
IFR
SSr   c                        \ rS rSrS rS rSrg)ChildFilterZ   c                 (    X0l         Xl        X l        g r   )r   
to_includeappend_none)r   rS   rT   r   s       r   r   ChildFilter.__init__[   s    ($&r   c                    / nU R                    HC  u  p4nU(       a	  US /U-  -  nU(       a  X!U   R                  -  nM0  UR                  X   5        ME     U R                  (       a  US /U R                  -  -  nU R	                  U5      $ r   rS   r   appendrT   r   r   r   filteredi	to_expandadd_nones         r   r   ChildFilter.__call__`   s    &*oo"A(TFX--QK000, '6 !1!111H  **r   )rT   r   rS   Nr    r&   r   r   rP   rP   Z   s    '
+r   rP   c                       \ rS rSrSrS rSrg)ChildFilterLALRq   `Optimized childfilter for LALR (assumes no duplication in parse tree, so it's safe to change it)c                 D   / nU R                    HZ  u  p4nU(       a	  US /U-  -  nU(       a*  U(       a  X!U   R                  -  nM7  X   R                  nMG  UR                  X   5        M\     U R                  (       a  US /U R                  -  -  nU R	                  U5      $ r   rW   rY   s         r   r   ChildFilterLALR.__call__t   s    &*oo"A(TFX-- 4 44H'{33H, '6 !1!111H  **r   r&   N)r!   r"   r#   r$   __doc__r   r%   r&   r   r   r`   r`   q   s
    j+r   r`   c                   $    \ rS rSrSrS rS rSrg)ChildFilterLALR_NoPlaceholders   rb   c                     X l         Xl        g r   r   rS   )r   rS   r   s      r   r   'ChildFilterLALR_NoPlaceholders.__init__       ($r   c                     / nU R                    HI  u  p4U(       a*  U(       a  X!U   R                  -  nM&  X   R                  nM6  UR                  X   5        MK     U R                  U5      $ r   )rS   r   rX   r   )r   r   rZ   r[   r\   s        r   r   'ChildFilterLALR_NoPlaceholders.__call__   s]     OOLA 4 44H'{33H, ,   **r   rj   Nr!   r"   r#   r$   re   r   r   r%   r&   r   r   rg   rg      s    f%
+r   rg   c                 h    U R                   (       + =(       a    U R                  R                  S5      $ )N_)is_termname
startswith)syms    r   _should_expandrv      s"    {{?7sxx22377r   _empty_indicesc                 ~   U(       a  UR                  S5      [        U 5      :X  d   eSR                  S U 5       5      nUR                  S5       Vs/ s H  n[        U5      PM     nn[        U5      [        U 5      S-   :X  d   U[        U 5      45       eOS/[        U 5      S-   -  n/ nSn[	        U 5       HV  u  pXU	   -  nU(       d$  U
R
                  (       a  U
R                  (       a  M7  UR                  U	[        U
5      U45        SnMX     X[        U 5         -  nU(       d/  [        U5      [        U 5      :  d  [        S U 5       5      (       aY  U(       d  U(       a"  [        U(       a  [        Xx5      $ [        Xx5      $ [        [        U V	VVs/ s H	  u  poU4PM     snnn	5      $ g s  snf s  snnn	f )NF c              3   J   #    U  H  n[        [        U5      5      v   M     g 7fr   )strint).0bs     r   	<genexpr>,maybe_create_child_filter.<locals>.<genexpr>   s     8ACAKKs   !#0r   r   c              3   *   #    U  H	  u  po2v   M     g 7fr   r&   )r}   r[   r\   rq   s       r   r   r      s     @lak~q\]aks   )countr   joinsplit	enumeraterr   
filter_outrX   rv   anyr   rP   r`   rg   )	expansionkeep_all_tokens	ambiguousrw   sonesempty_indicesrS   nones_to_addr[   ru   xrq   s                r   maybe_create_child_filterr      sz   ##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&a((3;;3>>>q."5|DEL	 ' #i.11LZ3y>9S@lak@l=l=lY);*cc*cc 9PZ;[PZuq1FPZ;[\\ >m =( <\s   F3F8c                   $    \ rS rSrSrS rS rSrg)AmbiguousExpander   ax  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                 (    X0l         X l        Xl        g r   )r   
tree_classr\   )r   r\   r   r   s       r   r   AmbiguousExpander.__init__   s    ($"r   c                    S n/ n[        U5       HE  u  pEU" U5      (       d  M  X@R                  ;   a  UR                  U5        UR                  S5        MG     U(       d  U R	                  U5      $ [        U5       VVs/ s H  u  pEXC;   a  UR
                  OU4PM     nnnU R                  S[        U6  Vs/ s H  opR	                  [        U5      5      PM     sn5      $ s  snnf s  snf )Nc                 F    [        U S5      =(       a    U R                  S:H  $ )Ndata_ambigr:   r   )ts    r   _is_ambig_tree2AmbiguousExpander.__call__.<locals>._is_ambig_tree   s    1f%<!&&H*<<r   r   )	r   r\   rX   expand_kids_by_datar   r   r   r   list)r   r   r   r   r[   childexpandfs           r   r   AmbiguousExpander.__call__   s    	= 	!(+HAe$$&$$Q'))(3 , $$X..QZ[cQdeQdXQAN%..@QdexgW]N^)_N^*;*;DG*DN^)_`` f)_s     C#9#C)
)r   r\   r   Nro   r&   r   r   r   r      s    f#
ar   r   c                     [        U5       VVs/ s HD  u  p4U(       d6  UR                  (       a  UR                  (       a  M0  [        U5      (       d  MB  UPMF     nnnU(       a  [	        [
        XP5      $ g s  snnf r   )r   rr   r   rv   r   r   )r   r   r   r[   ru   r\   s         r   maybe_create_ambiguous_expanderr      sa    !*9!5 i!5vq#ckkcnn SabeSf !5I i()@@ is   /A5A5A5c                   $    \ rS rSrSrS rS rSrg)AmbiguousIntermediateExpander   a  
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                     X l         Xl        g r   r   r   )r   r   r   s      r   r   &AmbiguousIntermediateExpander.__init__  rl   r   c                    ^ ^^ S mUUU 4S jmT" U5      nU(       a=  U Vs/ s H  nT R                  UR                  5      PM      nnT R                  SU5      $ T R                  U5      $ s  snf )Nc                 F    [        U S5      =(       a    U R                  S:H  $ )Nr   _iambigr   )r   s    r   _is_iambig_tree?AmbiguousIntermediateExpander.__call__.<locals>._is_iambig_tree  s    5&)EejjI.EEr   c                 T  > U (       a  T" U S   5      (       a  U S   n/ nUR                    Hv  nT" UR                   5      nU(       a'  U H  nU=R                   U SS -  sl         M     X$-  nMC  T	R                  SUR                   U SS -   5      nUR                  U5        Mx     U$ gg)z
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   rX   )
r   iambig_noderesult
grandchild	collapsedr   new_tree_collapse_iambigr   r   s
          r   r   @AmbiguousIntermediateExpander.__call__.<locals>._collapse_iambig  s     OHQK88&qk"-"6"6J 01D1D EI %.E!NNhqrl:N &/+#'??8Z=P=PS[\]\^S_=_#`h/ #7  9xr   r   )r   r   r   )r   r   r   rI   processed_nodesr   r   s   `    @@r   r   &AmbiguousIntermediateExpander.__call__  sh    	F	0 %X.	FOPit00<iOP??8_==  ** Qs   %A,r   Nro   r&   r   r   r   r      s    &P%!+r   r   c                 0   ^  [        T 5      U 4S j5       nU$ )Nc                 @   > [        TR                  U 5      nT" U5      $ r   )r   r!   )r   treefuncs     r   r   inplace_transformer.<locals>.f5  s     DMM8,Dzr   )r   )r   r   s   ` r   inplace_transformerr   4  s     
4[  Hr   c                 r   ^ ^^ T[         L d	  T[        L a  [        S5      e[        T 5      U UU4S j5       nU$ )Nz0Meta args not supported for internal transformerc                    > T" TTU S 5      $ r   r&   )r   r   rs   wrappers    r   r   apply_visit_wrapper.<locals>.fA  s    tT8T22r   )r
   r   NotImplementedErrorr   )r   rs   r   r   s   ``` r   apply_visit_wrapperr   =  s:    +,>!>!"TUU
4[3 3Hr   c                   .    \ rS rSrSS jrS rSS jrSrg)	ParseTreeBuilderiG  c                 r    X l         X0l        X@l        XPl        [	        U R                  U5      5      U l        g r   )r   propagate_positionsr   maybe_placeholdersr   _init_buildersrule_builders)r   rulesr   r   r   r   s         r   r   ParseTreeBuilder.__init__H  s0    $#6 ""4!$"5"5e"<=r   c              #   N  #    [        U R                  5      nU GH  nUR                  nUR                  nUR                  n[        [        S U=(       a    UR                  (       + =(       a    [        [        UR                  XPR                  U R                  (       a  UR                  OS 5      UU R                  =(       a!    [        U R                  UR                  U5      U R                  =(       a    [!        ["        U R                  5      /5      5      nX74v   GM     g 7fr   )rN   r   optionsr   expand1r   filteraliasr   r   r   r   r   r   r   r   r   r   )r   r   r   ruler   r   expand_single_childwrapper_chains           r   r   ParseTreeBuilder._init_buildersP  s     6t7O7OPDllG%55O")// $7TZZN=N)$../>>tx  uL  uL[b[p[p  RV  W#t#B4??TXTbTbds#tZ7+H$//#Z/ " M %% s   D#D%Nc                 ,  ^
 0 n[        USS 5      m
T
(       a  U
4S jnOU R                  nU R                   H  u  pEUR                  =(       d3    UR                  R
                  =(       d    UR                  R                  n [        X5      n[        USS 5      nUb  [        XvU5      nO [        U[        5      (       a  [        U5      nU H  n	U	" U5      nM     XB;   a  [        SU< S35      eXrU'   M     U$ ! [         a    [        X65      n NGf = f)N__default__c                    > T" XS 5      $ r   r&   )r   r   default_handlers     r   default_callback:ParseTreeBuilder.create_callback.<locals>.default_callbackg  s    &tt<<r   visit_wrapperzRule 'z' already exists)r;   r   r   r   r   template_sourceoriginrs   r   r7   r	   r   AttributeErrorr   r   )r   transformer	callbacksr   r   r   user_callback_namer   r   wr   s             @r   create_callback ParseTreeBuilder.create_callbackb  s   	!+}dC=  $#'#5#5D!%!_t||/K/K!_t{{O_O_BK<!!_d;&+A7KA-@AA+A.A #aD #  "#GHHdO' $6*  " B,ABs   'C;+ C;;DD)r   r   r   r   r   )FFFr   )r!   r"   r#   r$   r   r   r   r%   r&   r   r   r   r   G  s    >&$r   r   N)!typingr   
exceptionsr   r   lexerr   r   r   visitorsr	   r
   r   	functoolsr   r   	itertoolsr   r   r(   rN   rP   r`   rg   rv   boolr   r   r   r   r   r   r   r&   r   r   <module>r      s     8   ) 5 % / /3) 3)jT+ +.+k +,+[ +&8]UYZ^U_ ]8a aBAN+ N+d: :r   