o
    V۷is                     @   s   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	d
 ZG dd dZdd Zdd Zdd Zdd Zdd Zdd ZG dd dZG dd dZdS )z"Tree matcher based on Lark grammar    N)defaultdict   )TreeToken)
ParserConf)earley)RuleTerminalNonTerminalc                 C   s   | j o| jS N)is_term
filter_out)t r   G/home/ubuntu/vllm_env/lib/python3.10/site-packages/lark/tree_matcher.pyis_discarded_terminal   s   r   c                   @      e Zd Zdd Zdd ZdS )_MakeTreeMatchc                 C   s   || _ || _d S r   )name	expansion)selfr   r   r   r   r   __init__   s   
z_MakeTreeMatch.__init__c                 C   s"   t | j|}d|j_| j|j_|S )NT)r   r   meta
match_treer   orig_expansion)r   argsr   r   r   r   __call__   s   
z_MakeTreeMatch.__call__N)__name__
__module____qualname__r   r   r   r   r   r   r      s    r   c                 C   sX   i }| D ]!}||}||v r!||}||| }||kr |||< q|||< qt | S r   )listvalues)seq	group_keycmp_keyditemkeyv1v2r   r   r   _best_from_group   s   
r*   c                 C   s(   t | dd dd } | jdd d | S )Nc                 S   s   | S r   r   rr   r   r   <lambda>+   s    z(_best_rules_from_group.<locals>.<lambda>c                 S   s   t | j S r   lenr   r+   r   r   r   r-   +   s    c                 S   s
   t | jS r   r.   r+   r   r   r   r-   ,   s   
 )r'   )r*   sort)rulesr   r   r   _best_rules_from_group*   s   r2   c                 C   sF   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   _argsr   r   r   _match0   s   


r:   c                 C   s   t | |t| j|dS )Nalias)r   r   r   )originr   old_expansionr   r   r   make_recons_rule9      r?   c                 C   s   t | t|jg|gS r   )r?   r	   r   )r=   r7   r   r   r   make_recons_rule_to_term=   r@   rA   c                 C   s4   t d|  \}}|odd |dD }||fS )zJParse rule names that may contain a template syntax (like rule{a, b, ...})z(\w+)(?:{(.+)})?c                 S   s   g | ]}|  qS r   )strip).0ar   r   r   
<listcomp>D       z"parse_rulename.<locals>.<listcomp>,)rematchgroupssplit)sr   args_strr   r   r   r   r4   A   s   r4   c                   @   r   )ChildrenLexerc                 C   s
   || _ d S r   children)r   rP   r   r   r   r   J   s   
zChildrenLexer.__init__c                 C   s   | j S r   rO   )r   parser_stater   r   r   lexM   s   zChildrenLexer.lexN)r   r   r   r   rR   r   r   r   r   rN   I   s    rN   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	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                 C   sh   |j jrJ |j|j jt \| _}}tt| _	t| 
|| _| j  t| j| _|| _i | _d S r   )optionsmaybe_placeholdersgrammarcompilestartsettokensr   r    rules_for_root_build_recons_rulesr1   reverser2   parser_parser_cache)r   r^   r1   _extrar   r   r   r   Y   s   


zTreeMatcher.__init__c                 #   sp   dd |D t t |D ]}|jr |j |j qdd |D } fdd|D t }|D ]f}fdd|jD }||jgkrK|jdu rKq3|jrSt|jn|j}t|||j}|v rt	|dkr| j
|j | |j|vrt||V  ||j q3|jd	s|v r|V  q3| j
|j | q3  D ]\}}	|	D ]
}
t|t|
V  qt||V  qdS )
z>Convert tree-parsing/construction rules to tree-matching rulesc                 S   s   h | ]	}|j jr|jqS r   )rT   expand1r=   rC   r,   r   r   r   	<setcomp>l   s    z2TreeMatcher._build_recons_rules.<locals>.<setcomp>c                 S   s   h | ]}|j qS r   )r=   rb   r   r   r   rc   s   s    c                    s,   h | ]}|j d s|v s| v r|qS )_)r   
startswithrC   sym)aliasesexpand1sr   r   rc   t   s    
c                    s*   g | ]}t |s| v r|nt|jqS r   )r   r	   r   rf   )nonterminalsr   r   rE   y   s    z3TreeMatcher._build_recons_rules.<locals>.<listcomp>Nr   rd   )r   r    r<   r=   appendrY   r   r
   r?   r/   r[   r   rA   addre   items)r   r1   r,   
rule_namesseen
recons_exprg   ruler=   rule_aliasesr<   r   )rh   ri   rj   r   r\   j   s@   

zTreeMatcher._build_recons_rulesc           
   	   C   s   |rt |\}}|j|ksJ n|j}z| j| }W n1 tyK   | jt| j|  }dd |D }t|||g}tj	| j
j|tdd}|| j|< Y nw |t|j|}	|	j|ks\J |	S )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.
        c                 S   s   i | ]}||j qS r   r;   )rC   rq   r   r   r   
<dictcomp>   rF   z*TreeMatcher.match_tree.<locals>.<dictcomp>T)resolve_ambiguity)r4   r5   r_   KeyErrorr1   r2   r[   r   r   Parserr^   
lexer_confr:   parserN   rP   )
r   treerulenamer   r9   r^   r1   	callbacksconfunreduced_treer   r   r   r      s    
zTreeMatcher.match_treeN)r   r   r   __doc__r   r\   r   r   r   r   r   rS   P   s
    *rS   )r~   rH   collectionsr    r   r   commonr   parsersr   rV   r   r	   r
   r   r   r*   r2   r:   r?   rA   r4   rN   rS   r   r   r   r   <module>   s"    	