
    ^hv                         S r SSK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  SSKJr  SS	KJr  SS
KJrJrJr  S r " S S5      rS rS\\   S\\   4S jrS rS rS rS r " S S5      r " S S5      rg)z"Tree matcher based on Lark grammar    N)ListDict)defaultdict   )TreeTokenLark)
ParserConf)ConfigurationError)earley)RuleTerminalNonTerminalc                 @    U R                   =(       a    U R                  $ N)is_term
filter_out)ts    K/home/james-whalen/.local/lib/python3.13/site-packages/lark/tree_matcher.pyis_discarded_terminalr      s    99%%    c                        \ rS rSrS rS rSrg)_MakeTreeMatch   c                     Xl         X l        g r   )name	expansion)selfr   r   s      r   __init___MakeTreeMatch.__init__   s    	"r   c                     [        U R                  U5      nSUR                  l        U R                  UR                  l        U$ )NT)r   r   meta
match_treer   orig_expansion)r   argsr   s      r   __call___MakeTreeMatch.__call__   s3    D!  $r   )r   r   N)__name__
__module____qualname____firstlineno__r   r&   __static_attributes__ r   r   r   r      s    #r   r   c                     0 nU  H3  nU" U5      nXS;   a  U" U5      nU" X5   5      nXv:  a  XCU'   M-  M/  XCU'   M5     [        UR                  5       5      $ r   )listvalues)seq	group_keycmp_keyditemkeyv1v2s           r   _best_from_groupr9      s`    
Ao8BBw#  cF  
r   rulesreturnc                 D    [        U S S 5      n U R                  S S9  U $ )Nc                     U $ r   r-   rs    r   <lambda>(_best_rules_from_group.<locals>.<lambda>-   s    ar   c                 .    [        U R                  5      * $ r   lenr   r>   s    r   r@   rA   -   s    C<L;Lr   c                 ,    [        U R                  5      $ r   rC   r>   s    r   r@   rA   .   s    S-r   )r6   )r9   sort)r:   s    r   _best_rules_from_grouprG   ,   s%    UK1LME	JJ-J.Lr   c                     [        U[        5      (       a&  [        U R                  5      u  p#UR                  U:H  $ [        U[
        5      (       a  U [        UR                  5      :H  $  X45       er   )
isinstancer   parse_rulenamer   datar   r   type)termtokenr   _argss       r   _matchrP   2   s[    %$TYY/zzT!!	E5	!	!x

+++4-5r   c                 >    [        X[        U R                  U5      S9$ )N)alias)r   r   r   )originr   old_expansions      r   make_recons_rulerU   ;   s    ])STTr   c                 F    [        U [        UR                  5      /U/5      $ r   )rU   r   r   )rS   rM   s     r   make_recons_rule_to_termrW   ?   s    FXdii%8$9D6BBr   c                     [         R                  " SU 5      R                  5       u  pU=(       a/    UR                  S5       Vs/ s H  o3R	                  5       PM     snnX4$ s  snf )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   rJ   rJ   C   sT    XX115<<>ND@HNN3,?@,?q,?@D: As   A#c                        \ rS rSrS rS rSrg)ChildrenLexerK   c                     Xl         g r   children)r   rg   s     r   r   ChildrenLexer.__init__L   s     r   c                     U R                   $ r   rf   )r   parser_states     r   lexChildrenLexer.lexO   s    }}r   rf   N)r(   r)   r*   r+   r   rk   r,   r-   r   r   rc   rc   K   s    !r   rc   c                       \ rS rSr% Sr\\\\   4   \	S'   \\   \	S'   \
\	S'   S\
4S jrS\\   4S jrS\S	\S
\4S jrSrg)TreeMatcherR   zMatch 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.
rules_for_rootr:   parserc                     UR                   R                  (       a   eUR                   R                  (       a  UR                   R                  R                  (       a~  [	        US5      (       d,  [        UR                   R                  (       a  S5      eS5      eUR                  R                  UR                   R                  [        5       5      u  U l        p#O/[        UR                  5      U l        [        UR                  5      n[        [        5      U l        [        U R#                  U5      5      U l        U R                  R%                  5         ['        U R                  5      U l        Xl        0 U l        g )NgrammarzGSource grammar not available from cached parser, use cache_grammar=TruezSource grammar not available!)optionsmaybe_placeholderspostlexalways_accepthasattrr   cachers   compilestartsettokensr/   	terminalsr:   r   rp   _build_recons_rulesreverserG   rq   _parser_cache)r   rq   r:   _extras       r   r   TreeMatcher.__init__^   s   >>4444>>!!fnn&<&<&J&J69--(,2NN,@,@ *s g gFeg g)/)?)?@T@TVYV[)\&DKv//0DK&E)$/$2259:


 ,DJJ7
79r   c              #     #    U Vs1 s H+  o"R                   R                  (       d  M  UR                  iM-     nn[        [        5      nU H=  nUR
                  (       d  M  XBR                     R                  UR
                  5        M?     U Vs1 s H  o"R                  iM     nnU Vs1 s H1  nUR                  R                  S5      (       d  Xc;   d  Xd;   d  M/  UiM3     nn[        5       nU GH  nUR                   Vs/ s H1  n[        U5      (       a  M  Xg;   a  UO[        UR                  5      PM3     n	nXR                  /:X  a  UR
                  c  Mk  UR
                  (       a  [        UR
                  5      OUR                  n[        XiUR                  5      n
Xc;   au  [        U	5      S:w  af  U R                   UR                     R                  U
5        UR                  U;  a+  [#        Xf5      v   UR%                  UR                  5        GM*  GM-  UR                  R                  S5      (       d  Xc;   a  U
v   GMY  U R                   UR                     R                  U
5        GM     UR'                  5        H2  u  pU H  n[#        U[        U5      5      v   M     [#        X5      v   M4     gs  snf s  snf s  snf s  snf 7f)z>Convert tree-parsing/construction rules to tree-matching rules_Nr   )rt   expand1rS   r   r/   rR   appendr   
startswithr|   r   r   r   r   rU   rD   rp   rW   additems)r   r:   r?   expand1saliases
rule_namessymnonterminalsseen
recons_exprulerS   rule_aliasesrR   s                 r   r   TreeMatcher._build_recons_rulesw   s5    &+Aeyy/@/@HAHHeAd#Awww!((1  )..1hh
.'1 Zz88..s33s#. z Z uA%&[[T%0c8Mc8R M!4#(388:LL%0  T hhZ'AGGO*+''+agg&qxxC#CQ[[AD3z?a#7##CHH-44T:884'23<<HHSXX& ( 88&&s++sJ''188>+ . %,MMO F%.v{57IJJ &*6:: %4G B /Z
TsK   KJ?J?%K"/KK&K,.K	K	$ KK K<FKtreerulenamer;   c                 <   U(       a   [        U5      u  p4UR                  U:X  d   eOUR                  n U R                  U   nUR                  [        UR                   5      U5      n
U
R                  U:X  d   eU
$ ! [         a    U R                  [        U R                  U   5      -   nU Vs0 s H  owUR                  _M     Os  snf nn[        XhU/5      n	[        R                  " U R                  R                  U	[        SS9nXPR                  U'    Nf = f)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 to match the tree recursively.
T)resolve_ambiguity)rJ   rK   r   KeyErrorr:   rG   rp   rR   r
   r   Parserrq   
lexer_confrP   parserc   rg   )r   r   r   r   rO   rq   r:   r   	callbacksconfunreduced_trees              r   r#   TreeMatcher.match_tree   s     (2KD99$$$yyH		2''1F  &||M$--,H(S""h...  	2JJ!78K8KH8U!VVE 7<<edtzz)e<I<e
;D]]4;;#9#94[_`F+1x(	2s   A= =3D0CADD)r   rq   r:   rp   r}   N)r(   r)   r*   r+   __doc__r   strr   r   __annotations__r	   r   r   r   r#   r,   r-   r   r   rn   rn   R   sb     d4j)):L:t :2(;d (;T&t &s &t &r   rn   )r   rZ   typingr   r   collectionsr    r   r   r	   commonr
   
exceptionsr   parsersr   rs   r   r   r   r   r   r9   rG   rP   rU   rW   rJ   rc   rn   r-   r   r   <module>r      s    ( 	  #    *  0 0&	 	$t* d  UC u ur   