a
    d3                     @   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   Z/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/lark/tree_matcher.pyis_discarded_terminal   s    r   c                   @   s   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 ]B}||}||v rB||}||| }||krJ|||< q|||< qt | S r   )listvalues)seqZ	group_keyZcmp_keyditemkeyZv1Z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>+       z(_best_rules_from_group.<locals>.<lambda>c                 S   s   t | j S r   lenr   r#   r   r   r   r%   +   r&   c                 S   s
   t | jS r   r'   r#   r   r   r   r%   ,   r&   )r!   )r"   sort)rulesr   r   r   _best_rules_from_group*   s    r+   c                 C   sN   t |tr"t| j\}}|j|kS t |tr:| t|jkS dsJJ | |fd S NF)
isinstancer   parse_rulenamer   datar   r	   type)termtokenr   _argsr   r   r   _match0   s    


r4   c                 C   s   t | |t| j|dS )Nalias)r   r   r   )originr   Zold_expansionr   r   r   make_recons_rule9   s    r8   c                 C   s   t | t|jg|gS r   )r8   r	   r   )r7   r1   r   r   r   make_recons_rule_to_term=   s    r9   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   r&   z"parse_rulename.<locals>.<listcomp>,)rematchgroupssplit)sr   args_strr   r   r   r   r.   A   s    r.   c                   @   s   e Zd Zdd Zdd ZdS )ChildrenLexerc                 C   s
   || _ d S r   children)r   rG   r   r   r   r   J   s    zChildrenLexer.__init__c                 C   s   | j S r   rF   )r   Zparser_stater   r   r   lexM   s    zChildrenLexer.lexN)r   r   r   r   rH   r   r   r   r   rE   I   s   rE   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`)

    Initiialize with an instance of Lark.
    c                 C   sl   |j jdks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   rS   r*   Z_extrar   r   r   r   Y   s    

zTreeMatcher.__init__c                 #   s|  dd |D t t |D ]}|jr |j |j qdd |D } fdd|D t }|D ]}fdd|jD }||jgkr|jdu rqd|jrt|jn|j}t|||j}|v rt	|dkr| j
|j | |j|vr:t||V  ||j qd|jd	s |v r(|V  qd| j
|j | qd  D ]2\}}	|	D ]}
t|t|
V  qPt||V  qDdS )
z>Convert tree-parsing/construction rules to tree-matching rulesc                 S   s   h | ]}|j jr|jqS r   )rJ   Zexpand1r7   r;   r$   r   r   r   	<setcomp>l   r&   z2TreeMatcher._build_recons_rules.<locals>.<setcomp>c                 S   s   h | ]
}|j qS r   )r7   rU   r   r   r   rV   s   r&   c                    s,   h | ]$}|j d s$|v s$| v r|qS )_)r   
startswithr;   sym)aliasesexpand1sr   r   rV   t   s   c                    s*   g | ]"}t |s| v r|nt|jqS r   )r   r	   r   rY   )nonterminalsr   r   r=   y   s   
z3TreeMatcher._build_recons_rules.<locals>.<listcomp>Nr   rW   )r   r   r6   r7   appendrN   r   r
   r8   r(   rP   r   r9   addrX   items)r   r*   r$   Z
rule_namesseenZ
recons_exprZ   ruler7   Zrule_aliasesr6   r   )r[   r\   r]   r   rQ   j   s8    
zTreeMatcher._build_recons_rulesc           
   	   C   s   |r t |\}}|j|ks&J n|j}z| j| }W nb ty   | jt| j|  }dd |D }t|||g}tj	| j
j|tdd}|| j|< Y n0 |t|j|}	|	j|ksJ |	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   r5   )r;   rb   r   r   r   
<dictcomp>   r&   z*TreeMatcher.match_tree.<locals>.<dictcomp>T)Zresolve_ambiguity)r.   r/   rT   KeyErrorr*   r+   rP   r   r   ParserrS   Z
lexer_confr4   parserE   rG   )
r   treeZrulenamer   r3   rS   r*   	callbacksconfZunreduced_treer   r   r   r      s    zTreeMatcher.match_treeN)r   r   r   __doc__r   rQ   r   r   r   r   r   rI   P   s   *rI   )rj   r?   collectionsr    r   r   commonr   parsersr   rK   r   r	   r
   r   r   r"   r+   r4   r8   r9   r.   rE   rI   r   r   r   r   <module>   s    	