a
    d                     @   s   d dl mZmZ ddlmZmZmZ ddlmZ ddl	m
Z
mZmZ G dd dZG dd	 d	Zd
d Zdd ZG dd dZdS )    )Counterdefaultdict   )bfsfzsetclassify)GrammarError)RuleTerminalNonTerminalc                   @   sP   e Zd ZdZdd Zdd Zedd Zdd	 Zed
d Z	dd Z
dd ZdS )RulePtrruleindexc                 C   s0   t |tsJ |t|jks J || _|| _d S N)
isinstancer	   len	expansionr   r   )selfr   r    r   f/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/lark/parsers/grammar_analysis.py__init__   s    zRulePtr.__init__c                 C   sX   dd | j jd | j D }dd | j j| jd  D }d| j jjd|d|f S )Nc                 S   s   g | ]
}|j qS r   name.0xr   r   r   
<listcomp>       z$RulePtr.__repr__.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r   r   r   r   r   r   r      r   z<%s : %s * %s> )r   r   r   originr   join)r   beforeafterr   r   r   __repr__   s    zRulePtr.__repr__c                 C   s   | j j| j S r   )r   r   r   r   r   r   r   next   s    zRulePtr.nextc                 C   s    | j |ksJ t| j| jd S )N   )r&   r   r   r   )r   symr   r   r   advance   s    zRulePtr.advancec                 C   s   | j t| jjkS r   )r   r   r   r   r%   r   r   r   is_satisfied   s    zRulePtr.is_satisfiedc                 C   s   | j |j ko| j|jkS r   r   )r   otherr   r   r   __eq__"   s    zRulePtr.__eq__c                 C   s   t | j| jfS r   )hashr   r   r%   r   r   r   __hash__$   s    zRulePtr.__hash__N)__name__
__module____qualname__	__slots__r   r$   propertyr&   r)   r*   r,   r.   r   r   r   r   r      s   

r   c                   @   s    e Zd ZdZdd Zdd ZdS )
LR0ItemSet)kernelclosuretransitions
lookaheadsc                 C   s(   t || _t || _i | _tt| _d S r   )r   r5   r6   r7   r   setr8   )r   r5   r6   r   r   r   r   ,   s    

zLR0ItemSet.__init__c                 C   s0   dd dd | jD d dd | jD f S )Nz	{%s | %s}, c                 S   s   g | ]}t |qS r   )repr)r   rr   r   r   r   3   r   z'LR0ItemSet.__repr__.<locals>.<listcomp>)r!   r5   r6   r%   r   r   r   r$   2   s    zLR0ItemSet.__repr__N)r/   r0   r1   r2   r   r$   r   r   r   r   r4   )   s   r4   c                 C   s(   |r| |krdS t | }| |O } | |kS )NF)r9   )Zset1Zset2copyr   r   r   
update_set6   s
    r>   c           
      C   s  dd | D dd | D B }t  }i }i }|D ]$}|jr>|hnt  ||< t  ||< q.d}|rd}| D ]l}t |j|krt||jhrd}t|jD ]<\}}t |jd| |krt||j || rd}q qdqqdqXd}|rd}| D ]}t|jD ]\}}|t|jd ks,t |j|d d |krFt|| ||j rFd}t|d t|jD ]@}	t |j|d |	 |krZt|| ||j|	  rZd}qZqqq|||fS )zhCalculate FOLLOW sets.

    Adapted from: http://lara.epfl.ch/w/cc09:algorithm_for_first_and_follow_setsc                 S   s   h | ]}|j D ]}|qqS r   )r   )r   r   r(   r   r   r   	<setcomp>B   r   z!calculate_sets.<locals>.<setcomp>c                 S   s   h | ]
}|j qS r   r    )r   r   r   r   r   r?   B   r   TFNr'   )r9   is_termr   r>   r    	enumerater   range)
rulessymbolsNULLABLEFIRSTFOLLOWr(   changedr   ijr   r   r   calculate_sets>   s@    
0rL   c                   @   s    e Zd ZdddZdddZdS )	GrammarAnalyzerFc           
         sX  | _ dd |jD }|jt|  }t|dd  _t|tt|kr~dd t	|
 D }tddd	d
 |D  |D ],}|jD ] }|js| jv std| qq fdd|
 D  _dd |
 D  _dd |jD }|jt|  }	t|	tt|	ksJ t|	dd  _ fdd|
 D  _t|\ _ _ _d S )Nc                 S   s,   i | ]$}|t td | t|tdgqS )$root_z$END)r	   r   r
   r   startr   r   r   
<dictcomp>   s   z,GrammarAnalyzer.__init__.<locals>.<dictcomp>c                 S   s   | j S r   r@   r<   r   r   r   <lambda>   r   z*GrammarAnalyzer.__init__.<locals>.<lambda>c                 S   s   g | ]\}}|d kr|qS )r'   r   )r   itemcountr   r   r   r      r   z,GrammarAnalyzer.__init__.<locals>.<listcomp>zRules defined twice: %sr:   c                 s   s   | ]}t |V  qd S r   )str)r   rJ   r   r   r   	<genexpr>   r   z+GrammarAnalyzer.__init__.<locals>.<genexpr>zUsing an undefined rule: %sc                    s   i | ]\}}|  |jqS r   )expand_ruler    r   rP   Z	root_ruler%   r   r   rQ      s   c                 S   s(   i | ] \}}|t t|t|jhqS r   )r   r   r   r   rY   r   r   r   rQ      s   c                 S   s&   i | ]}|t td | t|gqS )rN   )r	   r   rO   r   r   r   rQ      s   c                 S   s   | j S r   r@   rR   r   r   r   rS      r   c              	      s0   i | ](\}}|t t|d g |j jqS )r   )r4   r   rX   r    lr0_rules_by_originrY   r%   r   r   rQ      s   )debugrP   rD   listvaluesr   rules_by_originr   r9   r   itemsr   r!   r   rA   Zstart_statesZ
end_statesrZ   Zlr0_start_statesrL   rG   rH   rF   )
r   Zparser_confr[   Z
root_rulesrD   
duplicatesr<   r(   Zlr0_root_rulesZ	lr0_rulesr   r%   r   r   }   s:    


zGrammarAnalyzer.__init__Nc                    s<   du r| j t   fdd}t|g|D ]}q.t S )z4Returns all init_ptrs accessible by rule (recursive)Nc                 3   sL   | j rJ | |  D ]0}t|d} | |jr|j}|j s|V  qd S )Nr   )rA   r   addr   r&   )r   r<   Zinit_ptrZnew_rZ	init_ptrsr^   r   r   _expand_rule   s    

z1GrammarAnalyzer.expand_rule.<locals>._expand_rule)r^   r9   r   r   )r   Zsource_ruler^   rc   _r   rb   r   rX      s    zGrammarAnalyzer.expand_rule)F)N)r/   r0   r1   r   rX   r   r   r   r   rM   |   s   
&rM   N)collectionsr   r   utilsr   r   r   
exceptionsr   Zgrammarr	   r
   r   r   r4   r>   rL   rM   r   r   r   r   <module>   s   !>