o
    0 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)Zis_termZ
filter_out)t r   ]/home/app/PaddleOCR-VL-test/.venv_paddleocr/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   Z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)seqZ	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   r.   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   


r6   c                 C   s   t | |t| j|dS )Nalias)r   r   r   )originr   Zold_expansionr   r   r   make_recons_rule9      r:   c                 C   s   t | t|jg|gS r   )r:   r	   r   )r9   r3   r   r   r   make_recons_rule_to_term=   r;   r<   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   r0   A   s   r0   c                   @   r   )ChildrenLexerc                 C   s
   || _ d S r   children)r   rK   r   r   r   r   J   s   
zChildrenLexer.__init__c                 C   s   | j S r   rJ   )r   Zparser_stater   r   r   lexM   s   zChildrenLexer.lexN)r   r   r   r   rL   r   r   r   r   rI   I   s    rI   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   )optionsZmaybe_placeholdersgrammarcompilestartsettokensr   r   rules_for_root_build_recons_rulesr-   reverser.   parser_parser_cache)r   rW   r-   _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   )rN   Zexpand1r9   r>   r(   r   r   r   	<setcomp>l   s    z2TreeMatcher._build_recons_rules.<locals>.<setcomp>c                 S   s   h | ]}|j qS r   )r9   rZ   r   r   r   r[   s   s    c                    s,   h | ]}|j d s|v s| v r|qS )_)r   
startswithr>   sym)aliasesexpand1sr   r   r[   t   s    
c                    s*   g | ]}t |s| v r|nt|jqS r   )r   r	   r   r^   )nonterminalsr   r   r@   y   s    z3TreeMatcher._build_recons_rules.<locals>.<listcomp>Nr   r\   )r   r   r8   r9   appendrR   r   r
   r:   r+   rT   r   r<   addr]   items)r   r-   r(   Z
rule_namesseenZ
recons_expr_   ruler9   Zrule_aliasesr8   r   )r`   ra   rb   r   rU   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   r7   )r>   rg   r   r   r   
<dictcomp>   rA   z*TreeMatcher.match_tree.<locals>.<dictcomp>T)Zresolve_ambiguity)r0   r1   rX   KeyErrorr-   r.   rT   r   r   ParserrW   Z
lexer_confr6   parserI   rK   )
r   treeZrulenamer   r5   rW   r-   	callbacksconfZunreduced_treer   r   r   r      s    
zTreeMatcher.match_treeN)r   r   r   __doc__r   rU   r   r   r   r   r   rM   P   s
    *rM   )ro   rC   collectionsr    r   r   commonr   parsersr   rO   r   r	   r
   r   r   r&   r.   r6   r:   r<   r0   rI   rM   r   r   r   r   <module>   s"    	