o
    i                     @   s   d Z ddlmZmZ ddlmZmZmZmZm	Z	 ddl
mZmZmZmZ ddlmZ ddlmZmZmZmZ ddlmZ G d	d
 d
Zee ZG dd dZdd Zdd ZG dd dZdS )z*Provides for superficial grammar analysis.    )Counterdefaultdict)ListDictIterator	FrozenSetSet   )bfsfzsetclassify
OrderedSet)GrammarError)RuleTerminalNonTerminalSymbol)
ParserConfc                   @   s   e Zd ZU dZeed< eed< dedefddZdd Ze	de
fd	d
Zde
dd fddZe	defddZdefddZdefddZdS )RulePtr)ruleindexr   r   c                 C   s0   t |tsJ |t|jksJ || _|| _d S N)
isinstancer   len	expansionr   r   )selfr   r    r   Z/home/ubuntu/veenaModal/venv/lib/python3.10/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      g | ]}|j qS r   name.0xr   r   r   
<listcomp>       z$RulePtr.__repr__.<locals>.<listcomp>c                 S   r   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__returnc                 C   s   | j j| j S r   )r   r   r   r   r   r   r   next   s   zRulePtr.nextsymc                 C   s    | j |ksJ t| j| jd S )N   )r/   r   r   r   )r   r0   r   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&   t |tstS | j|jko| j|jkS r   )r   r   NotImplementedr   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   __annotations__intr   r,   propertyr   r/   r2   boolr3   r6   r8   r   r   r   r   r      s   
 r   c                   @   sV   e Zd ZU dZeed< eed< eed f ed< eeee	 f ed< dd Z
dd	 Zd
S )
LR0ItemSet)kernelclosuretransitions
lookaheadsrB   rC   rD   rE   c                 C   s(   t || _t || _i | _tt| _d S r   )r   rB   rC   rD   r   setrE   )r   rB   rC   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%   C   s    z'LR0ItemSet.__repr__.<locals>.<listcomp>)r)   rB   rC   r.   r   r   r   r,   B   s   0zLR0ItemSet.__repr__N)r9   r:   r;   r<   Stater=   r   r   r   r   r   r,   r   r   r   r   rA   4   s   
 rA   c                 C   s(   |r| |krdS t | }| |O } | |kS )NF)rF   )set1set2copyr   r   r   
update_setF   s
   rN   c           
      C   s  dd | D dd | D B }t  }i }i }|D ]}|jr|hnt  ||< t  ||< qd}|rid}| D ]4}t |j|krDt||jhrDd}t|jD ]\}}t |jd| |kret||j || rdd}qI q2|s.d}|rd}| D ]V}t|jD ]N\}}|t|jd kst |j|d d |krt|| ||j rd}t|d t|jD ]}	t |j|d |	 |krt|| ||j|	  rd}qqxqq|sm|||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   r0   r   r   r   	<setcomp>R       z!calculate_sets.<locals>.<setcomp>c                 S   s   h | ]}|j qS r   r(   )r#   r   r   r   r   rO   R   r&   TFNr1   )rF   is_termr   rN   r(   	enumerater   range)
rulessymbolsNULLABLEFIRSTFOLLOWr0   changedr   ijr   r   r   calculate_setsN   sN   ,
r]   c                   @   s<   e Zd ZddededefddZdded	ee fd
dZ	dS )GrammarAnalyzerFparser_confdebugstrictc                    s\  | _ | _dd |jD }|jt|  }t|dd  _t|tt	|krBdd t
| D }tddd	d
 |D  |D ]}|jD ]}|jsY| jv sYtd| qIqD fdd| D  _dd | D  _dd |jD }	|jt|	  }
t|
tt	|
ksJ 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      | j S r   rQ   rI   r   r   r   <lambda>       z*GrammarAnalyzer.__init__.<locals>.<lambda>c                 S   s   g | ]
\}}|d kr|qS )r1   r   )r#   itemcountr   r   r   r%      rP   z,GrammarAnalyzer.__init__.<locals>.<listcomp>zRules defined twice: %srG   c                 s   s    | ]}t |V  qd S r   )str)r#   r[   r   r   r   	<genexpr>   s    z+GrammarAnalyzer.__init__.<locals>.<genexpr>zUsing an undefined rule: %sc                    s   i | ]\}}|  |jqS r   )expand_ruler(   r#   rd   	root_ruler.   r   r   re      s    c                 S   s(   i | ]\}}|t t|t|jhqS r   )r   r   r   r   ro   r   r   r   re      s    c                 S   s&   i | ]}|t td | t|gqS )rb   )r   r   rc   r   r   r   re      s    c                 S   rf   r   rQ   rg   r   r   r   rh      ri   c              	      s0   i | ]\}}|t t|d g |j jqS )r   )rA   r   rn   r(   lr0_rules_by_originro   r.   r   r   re      s    $)r`   ra   rd   rU   listvaluesr   rules_by_originr   rF   r   itemsr   r)   r   rR   start_states
end_statesrq   lr0_start_statesr]   rX   rY   rW   )r   r_   r`   ra   
root_rulesrU   
duplicatesrI   r0   lr0_root_rules	lr0_rulesr   r.   r   r      s@   


zGrammarAnalyzer.__init__Nsource_ruler-   c                    sJ   du r| j tt   dtdtt f fdd}t|g|D ]}q  S )z4Returns all init_ptrs accessible by rule (recursive)Nr   r-   c                 3   s\    | j rJ | |  D ]}t|d} | |jr+|j}|j s+t|ts(J |V  qd S )Nr   )rR   r   addr   r/   r   r   )r   rI   init_ptrnew_r	init_ptrsrt   r   r   _expand_rule   s   

z1GrammarAnalyzer.expand_rule.<locals>._expand_rule)rt   r   r   r   r   r
   )r   r}   rt   r   _r   r   r   rn      s   
zGrammarAnalyzer.expand_rule)FFr   )
r9   r:   r;   r   r@   r   r   r   r   rn   r   r   r   r   r^      s    'r^   N)__doc__collectionsr   r   typingr   r   r   r   r   utilsr
   r   r   r   
exceptionsr   grammarr   r   r   r   commonr   r   rJ   rA   rN   r]   r^   r   r   r   r   <module>   s    %>