a
    d*                     @   s   d Z ddlmZ ddlmZmZmZmZmZm	Z	 ddl
mZ ddlmZmZmZ ddlmZ G d	d
 d
ZedZedZG dd dZG dd deZdd Zdd ZG dd deZdS )zThis module builds a LALR(1) transition-table for lalr_parser.py

For now, shift/reduce conflicts are automatically resolved as shifts.
    )defaultdict   )classifyclassify_boolbfsfzset
Enumeratorlogger)GrammarError   )GrammarAnalyzerTerminal
LR0ItemSet)Rulec                   @   s$   e Zd Zdd Zdd Zdd ZdS )Actionc                 C   s
   || _ d S Nname)selfr    r   c/var/www/html/stable-diffusion-webui/venv/lib/python3.9/site-packages/lark/parsers/lalr_analysis.py__init__   s    zAction.__init__c                 C   s   | j S r   r   r   r   r   r   __str__   s    zAction.__str__c                 C   s   t | S r   strr   r   r   r   __repr__   s    zAction.__repr__N)__name__
__module____qualname__r   r   r   r   r   r   r   r      s   r   ShiftReducec                   @   s(   e Zd Zdd Zdd Zedd ZdS )
ParseTablec                 C   s   || _ || _|| _d S r   )statesstart_states
end_states)r   r#   r$   r%   r   r   r   r       s    zParseTable.__init__c                    s<   t  t  } fdd| j D } || j| jdS )Nc                    s*   i | ]"\}}| fd d|  D qS )c                    s:   i | ]2\}\}} ||tu r.d | fnd|fqS )r   r   )getr!   	serialize.0tokenactionargmemotokensr   r   
<dictcomp>*   s   
z3ParseTable.serialize.<locals>.<dictcomp>.<dictcomp>itemsr)   stateactionsr-   r   r   r0   )   s   z(ParseTable.serialize.<locals>.<dictcomp>)r/   r#   r$   r%   )r   r#   r2   reversedr$   r%   )r   r.   rulesr#   r   r-   r   r'   %   s    zParseTable.serializec                    s8   |d  fdd|d   D }| ||d |d S )Nr/   c                    s*   i | ]"\}}| fd d|  D qS )c                    s:   i | ]2\}\}}| |d kr.t t| fnt|fqS )r   )r!   r   deserializer    r(   r-   r   r   r0   :   s   
z5ParseTable.deserialize.<locals>.<dictcomp>.<dictcomp>r1   r3   r-   r   r   r0   9   s   z*ParseTable.deserialize.<locals>.<dictcomp>r#   r$   r%   r1   )clsdatar.   r#   r   r-   r   r8   6   s
    
zParseTable.deserializeN)r   r   r   r   r'   classmethodr8   r   r   r   r   r"      s   r"   c                   @   s   e Zd Zedd ZdS )IntParseTablec                    s   t |j}dd t|D  i }|j D ]*\}} fdd| D }|| | < q* fdd|j D } fdd|j D }| |||S )Nc                 S   s   i | ]\}}||qS r   r   )r)   isr   r   r   r0   F       z1IntParseTable.from_ParseTable.<locals>.<dictcomp>c                    s6   i | ].\}}||d  t u r.|d   |d  fn|qS )r   r   )r    r)   kvZstate_to_idxr   r   r0   J   s   c                    s   i | ]\}}| | qS r   r   r)   startr>   rC   r   r   r0   O   r?   c                    s   i | ]\}}| | qS r   r   rD   rC   r   r   r0   P   r?   )listr#   	enumerater2   r$   r%   )r9   parse_tableenumZ
int_statesr>   lar$   r%   r   rC   r   from_ParseTableC   s    

zIntParseTable.from_ParseTableN)r   r   r   r;   rK   r   r   r   r   r<   A   s   r<   c              	   C   sL   i }g }i }| D ]}d||< q| D ]$}|| dkr"t |||| ||| q"|S Nr   )traverse)XRGFSNxr   r   r   digraph\   s    
rU   c              	   C   s   | |  t|}||| < ||  || < ||  D ]v}|| dkrRt||||||| ||  }	|	dksfJ || }
|
dkszJ |
dkr|
|	k r|
|| < ||  ||  q.||  |kr||  }| }d||< |||< || krqqd S )Nr   )appendlenrM   updatepop)rT   rR   rS   rN   rO   rP   rQ   dyZn_xZn_yZf_xzr   r   r   rM   o   s*    
rM   c                   @   sF   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dS )LALR_AnalyzerFc                 C   s@   t | || g | _tt| _tt| _tt| _tt| _d S r   )	r   r   nonterminal_transitionsr   setdirectly_readsreadsincludeslookback)r   Zparser_confdebugr   r   r   r      s    


zLALR_Analyzer.__init__c                    s4   t  _i   fdd}tj |D ]}q*d S )Nc           	      3   s   t | jdd \}}t|dd }| D ]\ }t fdd|D }|d }|d u rt|}|D ]&}|jsh|jj	sh|
|jjO }qht||}||< || j < |V  q*j|  d S )Nc                 S   s   | j S r   )is_satisfiedrpr   r   r   <lambda>   r?   z@LALR_Analyzer.compute_lr0_states.<locals>.step.<locals>.<lambda>c                 S   s   | j S r   )nextrg   r   r   r   ri      r?   c                    s   h | ]}|  qS r   )Zadvance)r)   rh   symr   r   	<setcomp>   r?   zALALR_Analyzer.compute_lr0_states.<locals>.step.<locals>.<setcomp>)r   closurer   r2   r   r&   r`   rf   rj   Zis_termZexpand_rulelr0_rules_by_originr   transitions
lr0_statesadd)	r4   _Zunsatr[   ZrpskernelZ	new_statern   rh   cacher   rk   r   step   s    

z.LALR_Analyzer.compute_lr0_states.<locals>.step)r`   rq   r   lr0_start_statesvalues)r   rw   rs   r   ru   r   compute_lr0_states   s
    z LALR_Analyzer.compute_lr0_statesc                 C   s  | j  D ]J}t|jdks J |jD ],}|jdks8J ttdg| j||jf< q&q
| j	D ]}t }|j
D ]}|jrxql|j}|| jvrql||v rql|| ||f}| j| | j| }| j| }|j| }	|	j
D ]>}
|
jrq|
j}|| jvr|| || jv r||	|f qqlq\d S )Nr   r   z$END)rx   ry   rX   rt   indexr`   r   ra   rj   rq   rn   rf   ro   rr   r_   rW   rb   rp   NULLABLE)r   rootrh   r4   seenr>   ntZdrr
next_staterp2s2r   r   r   compute_reads_relations   s:    











z%LALR_Analyzer.compute_reads_relationsc                 C   s  | j D ]
}|\}}g }| j| }|jD ]}|jj|kr:q(|}t|jt|jjD ]j}|jj| }	||	f}
|j	|	 }|
| j
vrqRt|d t|jjD ]}|jj| | jvr qRq||
 qR|jdkr(|jD ]&}|j|jkr|jr|||jf qq(|D ]}
| j|
 | qqd S )Nr   r   )r_   rd   rn   ruleoriginranger{   rX   Z	expansionrp   rb   r|   rW   rf   rr   rc   )r   r   r4   Znonterminalrc   rd   rh   Zstate2r=   r>   Znt2jr   r   r   r   compute_includes_lookback   s0    





z'LALR_Analyzer.compute_includes_lookbackc                 C   sf   t | j| j| j}t | j| j|}| j D ]4\}}|D ]&\}}|| D ]}|j| | qHq8q,d S r   )	rU   r_   rb   ra   rc   rd   r2   
lookaheadsrr   )r   Z	read_setsZfollow_setsr   Z	lookbacksr4   r   r>   r   r   r   compute_lookaheads   s    z LALR_Analyzer.compute_lookaheadsc                 C   s4  i }g }| j D ]}i }|j D ]\}}t|jf||< q"|j D ]\}}t|dkrdd |D }|jdd dd |d d \}	}
|	d	 |
d	 kr|	d g}n||||f ||v r| j	rt
d
|j t
dt|d	  qDtt|d	 f||< qDdd | D ||< q|rg }|D ]X\}}}d|ddd |D f }| j	rn|dddd |jD  7 }|| q"td|dd | D }i }|D ]R}|D ]F}| jD ]8}|jjjd| kr|jr||vsJ |||< qqqt|dd | j D |}| j	r$|| _nt|| _d S )Nr   c                 S   s   g | ]}|j jpd |fqS )r   )optionspriorityr)   r   r   r   r   
<listcomp>  r?   z6LALR_Analyzer.compute_lalr1_states.<locals>.<listcomp>c                 S   s   | d S rL   r   )r   r   r   r   ri     r?   z4LALR_Analyzer.compute_lalr1_states.<locals>.<lambda>T)keyreverser   r   z;Shift/Reduce conflict for terminal %s: (resolving as shift)z * %sc                 S   s   i | ]\}}|j |qS r   r   r@   r   r   r   r0     r?   z6LALR_Analyzer.compute_lalr1_states.<locals>.<dictcomp>z=Reduce/Reduce collision in %s between the following rules: %s c                 S   s   g | ]}d t | qS )z
	- r   r   r   r   r   r     r?   z+
    collision occurred in state: {%s
    }c                 S   s   g | ]}d t | qS )z
	r   )r)   rT   r   r   r   r     r?   z

c                 S   s   i | ]\}}|j |qS r   rn   r@   r   r   r   r0     r?   z$root_c                 S   s   i | ]\}}||j qS r   r   )r)   rE   r4   r   r   r   r0   $  r?   )rq   rp   r2   r    rn   r   rX   sortrW   re   r	   warningr   rF   r!   joinr
   rx   r   r   rf   r"   rH   r<   rK   )r   mZreduce_reducer4   r5   rJ   r   r7   pbestZsecond_bestZmsgsmsgr#   r%   rh   rE   Z_parse_tabler   r   r   compute_lalr1_states   sP    
z"LALR_Analyzer.compute_lalr1_statesc                 C   s,   |    |   |   |   |   d S r   )rz   r   r   r   r   r   r   r   r   compute_lalr+  s
    zLALR_Analyzer.compute_lalrN)F)
r   r   r   r   rz   r   r   r   r   r   r   r   r   r   r^      s   
	#	4r^   N)__doc__collectionsr   utilsr   r   r   r   r   r	   
exceptionsr
   Zgrammar_analysisr   r   r   Zgrammarr   r   r    r!   r"   r<   rU   rM   r^   r   r   r   r   <module>   s    "