
    Xhs                         d 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
 ddlmZmZmZ d	 Z G d
 d      Zd Zd Zd Zd Zd Zd Z G d d      Z G d d      Zy)z"Tree matcher based on Lark grammar    N)defaultdict   )TreeToken)
ParserConf)earley)RuleTerminalNonTerminalc                 6    | j                   xr | j                  S N)is_term
filter_out)ts    E/var/www/html/myenv/lib/python3.12/site-packages/lark/tree_matcher.pyis_discarded_terminalr      s    99%%    c                       e Zd Zd Zd Zy)_MakeTreeMatchc                      || _         || _        y r   )name	expansion)selfr   r   s      r   __init__z_MakeTreeMatch.__init__   s    	"r   c                     t        | j                  |      }d|j                  _        | j                  |j                  _        |S )NT)r   r   meta
match_treer   orig_expansion)r   argsr   s      r   __call__z_MakeTreeMatch.__call__   s3    D!  $r   N)__name__
__module____qualname__r   r     r   r   r   r      s    #r   r   c                     i }| D ]2  } ||      }||v r ||      } |||         }||kD  s(|||<   .|||<   4 t        |j                               S r   )listvalues)seq	group_keycmp_keyditemkeyv1v2s           r   _best_from_groupr0      sh    
A o!8B3BBw#AcF 
r   c                 J    t        | d d       } | j                  d        | S )Nc                     | S r   r$   rs    r   <lambda>z(_best_rules_from_group.<locals>.<lambda>+   s    a r   c                 .    t        | j                         S r   lenr   r3   s    r   r5   z(_best_rules_from_group.<locals>.<lambda>+   s    C<L;L r   c                 ,    t        | j                        S r   r7   r3   s    r   r5   z(_best_rules_from_group.<locals>.<lambda>,   s    S- r   )r-   )r0   sort)ruless    r   _best_rules_from_groupr<   *   s%    UK1LME	JJ-J.Lr   c                     t        |t              r't        | j                        \  }}|j                  |k(  S t        |t
              r| t        |j                        k(  S J | |f       r   )
isinstancer   parse_rulenamer   datar   r
   type)termtokenr   _argss       r   _matchrE   0   sY    %$TYY/ezzT!!	E5	!x

+++4-5r   c                 F    t        | |t        | j                  |            S )N)alias)r	   r   r   )originr   old_expansions      r   make_recons_rulerJ   9   s    	])STTr   c                 F    t        | t        |j                        g|g      S r   )rJ   r
   r   )rH   rB   s     r   make_recons_rule_to_termrL   =   s    FXdii%8$9D6BBr   c                     t        j                  d|       j                         \  }}|xr- |j                  d      D cg c]  }|j	                          c}}||fS c c}w )zJParse rule names that may contain a template syntax (like rule{a, b, ...})z(\w+)(?:{(.+)})?,)rematchgroupssplitstrip)sr   args_strar   s        r   r?   r?   A   sT    XX115<<>ND(@HNN3,?@q@D: As   Ac                       e Zd Zd Zd Zy)ChildrenLexerc                     || _         y r   children)r   r[   s     r   r   zChildrenLexer.__init__J   s	     r   c                     | j                   S r   rZ   )r   parser_states     r   lexzChildrenLexer.lexM   s    }}r   N)r!   r"   r#   r   r^   r$   r   r   rX   rX   I   s    !r   rX   c                   "    e Zd ZdZd Zd Zd Zy)TreeMatcherzMatch the elements of a tree node, based on an ontology
    provided by a Lark grammar.

    Supports templates and inlined rules (`rule{a, b,..}` and `_rule`)

    Initialize with an instance of Lark.
    c                    |j                   j                  rJ |j                  j                  |j                   j                  t                     \  | _        }}t        t              | _	        t        | j                  |            | _        | j                  j                          t        | j                        | _        || _        i | _        y r   )optionsmaybe_placeholdersgrammarcompilestartsettokensr   r&   rules_for_root_build_recons_rulesr;   reverser<   parser_parser_cache)r   rl   r;   _extras       r   r   zTreeMatcher.__init__Y   s    >>4444%+^^%;%;FNN<P<PRURW%X"UF)$/$2259:


 ,DJJ7
r   c              #   ,  K   |D ch c]%  }|j                   j                  s|j                  ' }}t        t              }|D ]7  }|j
                  s||j                     j                  |j
                         9 |D ch c]  }|j                   }}|D ch c]'  }|j                  j                  d      s||v s||v r|) }}t               }|D ]b  }|j                  D cg c](  }t        |      s||v r|nt        |j                        * }	}|	|j                  gk(  r|j
                  ^|j
                  rt        |j
                        n|j                  }t        ||	|j                        }
||v rpt        |	      dk7  rb| j                   |j                     j                  |
       |j                  |vst#        ||       |j%                  |j                         |j                  j                  d      s||v r|
 ;| j                   |j                     j                  |
       e |j'                         D ]1  \  }}|D ]  }t#        |t        |              t#        ||       3 yc c}w c c}w c c}w c c}w w)z>Convert tree-parsing/construction rules to tree-matching rules_Nr   )rb   expand1rH   r   r&   rG   appendr   
startswithrg   r   r   r
   r   rJ   r8   ri   rL   additems)r   r;   r4   expand1saliases
rule_namessymnonterminalsseen
recons_exprulerH   rule_aliasesrG   s                 r   rj   zTreeMatcher._build_recons_rulesj   sQ    &+Aqyy/@/@AHHAAd# 	2Aww!((1	2 )..1ahh.
.'1 Z88..s3sh#QX.  Z Z u 	?A%&[[T!8Mc8R "%!4#(388:LL TJ T ahhZ'AGGO*+''+agg&qxxC#CQ[[ADh3z?a#7##CHH-44T:884'23<<HHSXX&88&&s+shJ''188>+	?. %,MMO 	; FL% K.v{57IJJK*66::	;G B /Z
TsF   JJ J "J.JJJ,J
 J'-JB+J CJc                 0   |rt        |      \  }}|j                  |k(  sJ |j                  }	 | j                  |   }|j                  t        |j                         |      }
|
j                  |k(  sJ |
S # t        $ r | j                  t        | j                  |         z   }|D ci c]  }||j                   nc c}w }}t        |||g      }	t        j                  | j                  j                  |	t        d      }|| j                  |<   Y w xY w)a  Match the elements of `tree` to the symbols of rule `rulename`.

        Parameters:
            tree (Tree): the tree node to match
            rulename (str): The expected full rule name (including template args)

        Returns:
            Tree: an unreduced tree that matches `rulename`

        Raises:
            UnexpectedToken: If no match was found.

        Note:
            It's the callers' responsibility match the tree recursively.
        T)resolve_ambiguity)r?   r@   rm   KeyErrorr;   r<   ri   rG   r   r   Parserrl   
lexer_confrE   parserX   r[   )r   treerulenamer   rD   rl   r;   r}   	callbacksconfunreduced_trees              r   r   zTreeMatcher.match_tree   s
     (2KD%99$$$yyH		2''1F  mDMM&BHM""h...  	2JJ!78K8KH8U!VVE 7<<dtzz)<<I<eY
;D]]4;;#9#94[_`F+1Dx(	2s   A6 62D(B=<ADDN)r!   r"   r#   __doc__r   rj   r   r$   r   r   r`   r`   P   s     "(;T&r   r`   )r   rO   collectionsr    r   r   commonr   parsersr   rd   r	   r
   r   r   r   r0   r<   rE   rJ   rL   r?   rX   r`   r$   r   r   <module>r      sb    ( 	 #    0 0&	 	 UC j jr   