o
    V۷i/                     @   s  d Z ddlmZ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mZmZmZ ddlmZ ddlmZmZmZmZmZ dd	lmZmZ dd
lmZ G dd dZedZ edZ!edZ"G dd dee" Z#G dd de#d Z$G dd de#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.
    )DictSetIteratorTupleListTypeVarGeneric)defaultdict   )classifyclassify_boolbfsfzset
Enumeratorlogger)GrammarError   )GrammarAnalyzerTerminal
LR0ItemSetRulePtrState)RuleSymbol)
ParserConfc                   @   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    P/home/ubuntu/vllm_env/lib/python3.10/site-packages/lark/parsers/lalr_analysis.py__init__   s   
zAction.__init__c                 C      | 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ReduceStateTc                   @   sb   e Zd ZU eeeeef f ed< eeef ed< eeef ed< dd Zdd Z	e
dd	 Zd
S )ParseTableBasestatesstart_states
end_statesc                 C   s   || _ || _|| _d S r   )r0   r1   r2   )r   r0   r1   r2   r    r    r!   r"   '   s   
zParseTableBase.__init__c                    s6   t   fdd| j D } || j| jdS )Nc                    *   i | ]\}}| fd d|  D qS )c                    s:   i | ]\}\}} ||tu rd | fnd|fqS )r   r   )getr-   	serialize.0tokenactionargmemotokensr    r!   
<dictcomp>0       
*z7ParseTableBase.serialize.<locals>.<dictcomp>.<dictcomp>itemsr7   stateactionsr;   r    r!   r>   /       z,ParseTableBase.serialize.<locals>.<dictcomp>)r=   r0   r1   r2   )r   r0   rA   reversedr1   r2   )r   r<   r0   r    r;   r!   r5   ,   s   zParseTableBase.serializec                    s8   |d  fdd|d   D }| ||d |d S )Nr=   c                    r3   )c                    s:   i | ]\}\}}| |d krt t| fnt|fqS )r   )r-   r   deserializer,   r6   r;   r    r!   r>   @   r?   z9ParseTableBase.deserialize.<locals>.<dictcomp>.<dictcomp>r@   rB   r;   r    r!   r>   ?   rE   z.ParseTableBase.deserialize.<locals>.<dictcomp>r0   r1   r2   r@   )clsdatar<   r0   r    r;   r!   rG   <   s
   
zParseTableBase.deserializeN)r)   r*   r+   r   r.   r'   r   __annotations__r"   r5   classmethodrG   r    r    r    r!   r/   "   s   
 r/   c                   @   s   e Zd ZdZdS )
ParseTablezoParse-table whose key is State, i.e. set[RulePtr]

    Slower than IntParseTable, but useful for debugging
    N)r)   r*   r+   __doc__r    r    r    r!   rL   F   s    rL   r   c                   @   s"   e Zd ZdZedefddZdS )IntParseTablez3Parse-table whose key is int. Best for performance.parse_tablec                    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    )r7   isr    r    r!   r>   T       z1IntParseTable.from_ParseTable.<locals>.<dictcomp>c                    s6   i | ]\}}||d  t u r|d   |d  fn|qS )r   r   )r,   r7   kvstate_to_idxr    r!   r>   X   s    *c                       i | ]	\}}| | qS r    r    r7   startrQ   rV   r    r!   r>   ]       c                    rX   r    r    rY   rV   r    r!   r>   ^   r[   )listr0   	enumeraterA   r1   r2   )rH   rO   enum
int_statesrQ   lar1   r2   r    rV   r!   from_ParseTableQ   s   

zIntParseTable.from_ParseTableN)r)   r*   r+   rM   rK   rL   ra   r    r    r    r!   rN   N   s    rN   c              	   C   sB   i }g }t | d}| D ]}|| dkrt|||| ||| q|S Nr   )dictfromkeystraverse)XRGFSNxr    r    r!   digraphj   s   rm   c              	   C   s   | |  t|}||| < ||  || < ||  D ];}|| dkr)t||||||| ||  }	|	dks3J || }
|
dks=J |
dkrI|
|	k rI|
|| < ||  ||  q||  |krq||  }	 | }d||< |||< || krpd S q^d S )Nr   T)appendlenre   updatepop)rl   rj   rk   rf   rg   rh   ri   dyn_xn_yf_xzr    r    r!   re   {   s0   
re   c                   @   s  e Zd ZU ee ed< eeeef  ed< e	eeef eeee
f  f ed< e	eeef eeeef  f ed< e	eeef eeeef  f ed< e	eeef ee f ed< dded	ed
efddZdddZdd Zdd Zdd ZdddZdd ZdS )LALR_Analyzerlr0_itemsetsnonterminal_transitionslookbackincludesreadsdirectly_readsFparser_confdebugstrictc                 C   sB   t | ||| g | _tt| _tt| _tt| _tt| _d S r   )	r   r"   r{   r	   setr   r~   r}   r|   )r   r   r   r   r    r    r!   r"      s   


zLALR_Analyzer.__init__returnNc                    sB   t  _i  dtdtt f fdd}tj |D ]}qd S )NrC   r   c           	      3   s    t | jdd \}}t|dd }| D ]D\ }t fdd|D }|d }|d u rRt|}|D ]}|jsH|jj	sH|
|jjO }q5t||}||< || j < |V  qj|  d S )Nc                 S   r#   r   )is_satisfiedrpr    r    r!   <lambda>       z@LALR_Analyzer.compute_lr0_states.<locals>.step.<locals>.<lambda>c                 S   r#   r   )nextr   r    r    r!   r      r   c                    s   h | ]}|  qS r    )advance)r7   r   symr    r!   	<setcomp>   rR   zALALR_Analyzer.compute_lr0_states.<locals>.step.<locals>.<setcomp>)r   closurer   rA   r   r4   r   r   r   is_termexpand_rulelr0_rules_by_originr   transitionsrz   add)	rC   _unsatrs   rpskernel	new_stater   r   cacher   r   r!   step   s"   

z.LALR_Analyzer.compute_lr0_states.<locals>.step)r   rz   r   r   r   lr0_start_statesvalues)r   r   r   r    r   r!   compute_lr0_states   s   z LALR_Analyzer.compute_lr0_statesc                 C   s  | j  D ]%}t|jdksJ |jD ]}|jdksJ ttdg| j||jf< qq| j	D ]^}t }|j
D ]U}|jr<q6|j}|| jvrEq6||v rJq6|| ||f}| j| | j| }| j| }|j| }	|	j
D ]}
|
jrqqk|
j}|| jvr~|| || jv r||	|f qkq6q.d S )Nr   r   z$END)r   r   rp   r   indexr   r   r   r   rz   r   r   r   r   r{   ro   r~   r   NULLABLE)r   rootr   rC   seenrQ   ntdrr
next_staterp2s2r    r    r!   compute_reads_relations   sD   











z%LALR_Analyzer.compute_reads_relationsc                 C   s  | j D ]}|\}}g }| j| }|jD ]g}|jj|krq|}t|jt|jjD ]5}|jj| }	||	f}
|j	|	 }|
| j
vr?q(t|d t|jjD ]}|jj| | jvrW nqJ||
 q(|jdkrz|jD ]}|j|jkry|jry|||jf qfq|D ]
}
| j|
 | q}qd S )Nr   r   )r{   r|   r   ruleoriginranger   rp   	expansionr   r~   r   ro   r   r   r}   )r   r   rC   nonterminalr}   r|   r   state2rP   rQ   nt2jr   r    r    r!   compute_includes_lookback   s:   







z'LALR_Analyzer.compute_includes_lookbackc                 C   sf   t | j| j| j}t | j| j|}| j D ]\}}|D ]\}}|| D ]
}|j| | q$qqd S r   )	rm   r{   r~   r   r}   r|   rA   
lookaheadsr   )r   	read_setsfollow_setsr   	lookbacksrC   r   rQ   r    r    r!   compute_lookaheads  s   z LALR_Analyzer.compute_lookaheadsc                 C   s@  i }g }| j D ]}dd |j D }|j D ]q\}}t|dkrQdd |D }|jdd dd	 |d d
 \}}	|d |	d krH|d h}n	||||f q|\}
||v r| jrdtd|j	 d| j
rutd|j	 td|
 qt
d|j	 t
d|
 qt|
f||< qdd | D ||< q|rg }|D ]*\}}}d|ddd |D f }| j
r|dddd |jD  7 }|| qtd|dd | D }i }|D ]#}|D ]}| jD ]}|jjj	d| kr|jr||vsJ |||< qqqdd | j D }t|||}| j
r|| _d S t|| _d S )Nc                 S   s   i | ]
\}}|t |jfqS r    )r,   r   )r7   r`   r   r    r    r!   r>     s    z6LALR_Analyzer.compute_lalr1_states.<locals>.<dictcomp>r   c                 S   s   g | ]
}|j jp	d |fqS )r   )optionspriorityr7   r   r    r    r!   
<listcomp>  s    z6LALR_Analyzer.compute_lalr1_states.<locals>.<listcomp>c                 S   s   | d S rb   r    )r   r    r    r!   r     s    z4LALR_Analyzer.compute_lalr1_states.<locals>.<lambda>T)keyreverser
   r   z#Shift/Reduce conflict for terminal z. [strict-mode]
 z;Shift/Reduce conflict for terminal %s: (resolving as shift)z * %sc                 S      i | ]\}}|j |qS r    r   rS   r    r    r!   r>   )      z=Reduce/Reduce collision in %s between the following rules: %s c                 S      g | ]}d t | qS )z
	- r&   r   r    r    r!   r   .  r   z+
    collision occurred in state: {%s
    }c                 S   r   )z
	r&   )r7   rl   r    r    r!   r   0  r   z

c                 S   r   r    r   rS   r    r    r!   r>   4  r   z$root_c                 S   s   i | ]\}}||j qS r    r   )r7   rZ   rC   r    r    r!   r>   ?  r   )rz   r   rA   r   rp   sortro   r   r   r   r   r   warningr-   joinr   r   r   r   r   rL   rO   rN   ra   )r   mreduce_reduceitemsetrD   r`   rulespbestsecond_bestr   msgsmsgr0   r2   rC   r   rZ   r1   _parse_tabler    r    r!   compute_lalr1_states  sd   


z"LALR_Analyzer.compute_lalr1_statesc                 C   s,   |    |   |   |   |   d S r   )r   r   r   r   r   r$   r    r    r!   compute_lalrG  s
   zLALR_Analyzer.compute_lalr)FF)r   N)r)   r*   r+   r   r   rJ   r   r   r   r   r   r   boolr"   r   r   r   r   r   r   r    r    r    r!   ry      s   
 $$$
	#
	<ry   N)*rM   typingr   r   r   r   r   r   r   collectionsr	   utilsr   r   r   r   r   r   
exceptionsr   grammar_analysisr   r   r   r   r   grammarr   r   commonr   r   r,   r-   r.   r/   rL   intrN   rm   re   ry   r    r    r    r!   <module>   s$    $ $