o
    JAf6  ã                   @   sd   d dl mZmZmZ G dd„ dejƒZG dd„ deƒZG dd„ deƒZG dd	„ d	eƒZ	ddd„Z
dS )é   )ÚgrammarÚtokenÚtokenizec                   @   s   e Zd ZdS )ÚPgenGrammarN)Ú__name__Ú
__module__Ú__qualname__© r	   r	   ú)/usr/lib/python3.10/lib2to3/pgen2/pgen.pyr      s    r   c                   @   s    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d„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd&d d!„Zd"d#„ Zd$d%„ ZdS )'ÚParserGeneratorNc                 C   sp   d }|d u rt |dd}|j}|| _|| _t |j¡| _|  ¡  |  	¡ \| _
| _|d ur/|ƒ  i | _|  ¡  d S )Nzutf-8)Úencoding)ÚopenÚcloseÚfilenameÚstreamr   Úgenerate_tokensÚreadlineÚ	generatorÚgettokenÚparseÚdfasÚstartsymbolÚfirstÚaddfirstsets)Úselfr   r   Zclose_streamr	   r	   r
   Ú__init__   s   zParserGenerator.__init__c              	   C   s  t ƒ }t| j ¡ ƒ}| ¡  | | j¡ | d| j¡ |D ]}dt|j	ƒ }||j	|< ||j
|< q|D ]P}| j| }g }|D ]0}g }t|j ¡ ƒD ]\}	}
| |  ||	¡| |
¡f¡ qI|jri| d| |¡f¡ | |¡ q>|j |¡ ||  ||¡f|j|j	| < q3|j	| j |_|S )Né    é   )r   Úlistr   ÚkeysÚsortÚremover   ÚinsertÚlenÚsymbol2numberZnumber2symbolÚsortedÚarcsÚitemsÚappendÚ
make_labelÚindexÚisfinalÚstatesÚ
make_firstÚstart)r   ÚcÚnamesÚnameÚiÚdfar,   Ústater&   ÚlabelÚnextr	   r	   r
   Úmake_grammar   s.   

zParserGenerator.make_grammarc                 C   s4   | j | }i }t|ƒD ]}|  ||¡}d||< q|S ©Nr   )r   r%   r)   )r   r/   r1   Zrawfirstr   r5   Úilabelr	   r	   r
   r-   4   s   

zParserGenerator.make_firstc                 C   sR  t |jƒ}|d  ¡ r]||jv r,||jv r|j| S |j |j| d f¡ ||j|< |S tt|d ƒ}t|t	ƒs;J |ƒ‚|tj
v sDJ |ƒ‚||jv rN|j| S |j |d f¡ ||j|< |S |d dv sgJ |ƒ‚t|ƒ}|d  ¡ r‹||jv r{|j| S |j tj|f¡ ||j|< |S tj| }||jv rš|j| S |j |d f¡ ||j|< |S )Nr   )ú"ú')r#   ÚlabelsÚisalphar$   Zsymbol2labelr(   Úgetattrr   Ú
isinstanceÚintÚtok_nameÚtokensÚevalÚkeywordsÚNAMEr   Zopmap)r   r/   r5   r9   ZitokenÚvaluer	   r	   r
   r)   =   s<   














zParserGenerator.make_labelc                 C   s8   t | j ¡ ƒ}| ¡  |D ]}|| jvr|  |¡ qd S ©N)r   r   r   r    r   Ú	calcfirst)r   r0   r1   r	   r	   r
   r   k   s   

€þzParserGenerator.addfirstsetsc              	   C   sþ   | j | }d | j|< |d }i }i }|j ¡ D ]<\}}|| j v rI|| jv r5| j| }|d u r4td| ƒ‚n
|  |¡ | j| }| |¡ |||< qd||< |di||< qi }	| ¡ D ]\}}
|
D ]}||	v rrtd||||	| f ƒ‚||	|< q`qZ|| j|< d S )Nr   zrecursion for rule %rr   zArule %s is ambiguous; %s is in the first sets of %s as well as %s)r   r   r&   r'   Ú
ValueErrorrH   Úupdate)r   r1   r3   r4   ZtotalsetZoverlapcheckr5   r6   ÚfsetZinverseZitsfirstÚsymbolr	   r	   r
   rH   s   s8   




ÿ



þ
ûzParserGenerator.calcfirstc           	      C   s´   i }d }| j tjkrV| j tjkr|  ¡  | j tjks|  tj¡}|  tjd¡ |  ¡ \}}|  tj¡ |  	||¡}t
|ƒ}|  |¡ t
|ƒ}|||< |d u rP|}| j tjks
||fS )Nú:)Útyper   Ú	ENDMARKERÚNEWLINEr   ÚexpectrE   ÚOPÚ	parse_rhsÚmake_dfar#   Úsimplify_dfa)	r   r   r   r1   ÚaÚzr3   ZoldlenZnewlenr	   r	   r
   r   ‘   s&   ÿ
ïzParserGenerator.parsec              	      sÚ   t |tƒsJ ‚t |tƒsJ ‚‡ fdd„}‡ fdd„‰ t||ƒ|ƒg}|D ]F}i }|jD ]}|jD ]\}}	|d urAˆ |	| |i ¡ƒ q0q+t| ¡ ƒD ] \}}
|D ]	}|j|
krX nqOt|
|ƒ}| |¡ | 	||¡ qIq$|S )Nc                    s   i }ˆ | |ƒ |S rG   r	   )r4   Úbase©Ú
addclosurer	   r
   Úclosure°   s   
z)ParserGenerator.make_dfa.<locals>.closurec                    sH   t | tƒsJ ‚| |v rd S d|| < | jD ]\}}|d u r!ˆ ||ƒ qd S r8   )r?   ÚNFAStater&   )r4   rX   r5   r6   rY   r	   r
   rZ   ´   s   
€þz,ParserGenerator.make_dfa.<locals>.addclosure)
r?   r\   ÚDFAStateÚnfasetr&   Ú
setdefaultr%   r'   r(   Úaddarc)r   r.   Úfinishr[   r,   r4   r&   Znfastater5   r6   r^   Ústr	   rY   r
   rT   ©   s.   
€þ
ÿ

ùzParserGenerator.make_dfac           
      C   sš   t d|ƒ |g}t|ƒD ]>\}}t d|||u rdpdƒ |jD ]*\}}||v r-| |¡}	n	t|ƒ}	| |¡ |d u rAt d|	 ƒ qt d||	f ƒ qqd S )NzDump of NFA forú  Stateú(final)Ú z	    -> %dú    %s -> %d)ÚprintÚ	enumerater&   r*   r#   r(   )
r   r1   r.   ra   Ztodor2   r4   r5   r6   Újr	   r	   r
   Údump_nfaÍ   s   

÷þzParserGenerator.dump_nfac                 C   sd   t d|ƒ t|ƒD ]&\}}t d||jrdpdƒ t|j ¡ ƒD ]\}}t d|| |¡f ƒ qq	d S )NzDump of DFA forrc   rd   re   rf   )rg   rh   r+   r%   r&   r'   r*   )r   r1   r3   r2   r4   r5   r6   r	   r	   r
   Údump_dfaÝ   s   
ÿþzParserGenerator.dump_dfac                 C   sv   d}|r9d}t |ƒD ]*\}}t|d t|ƒƒD ]}|| }||kr3||= |D ]}| ||¡ q&d} nqq
|sd S d S )NTFr   )rh   Úranger#   Ú
unifystate)r   r3   Zchangesr2   Zstate_iri   Zstate_jr4   r	   r	   r
   rU   ä   s   ú€ûzParserGenerator.simplify_dfac                 C   s‚   |   ¡ \}}| jdkr||fS tƒ }tƒ }| |¡ | |¡ | jdkr=|  ¡  |   ¡ \}}| |¡ | |¡ | jdks$||fS )Nú|)Ú	parse_altrF   r\   r`   r   )r   rV   rW   ZaaÚzzr	   r	   r
   rS   ù   s   






üzParserGenerator.parse_rhsc                 C   sf   |   ¡ \}}| jdv s| jtjtjfv r/|   ¡ \}}| |¡ |}| jdv s| jtjtjfv s||fS )N)ú(ú[)Ú
parse_itemrF   rN   r   rE   ÚSTRINGr`   )r   rV   Úbr/   Údr	   r	   r
   ro   
  s   


üzParserGenerator.parse_altc                 C   sŠ   | j dkr|  ¡  |  ¡ \}}|  tjd¡ | |¡ ||fS |  ¡ \}}| j }|dvr0||fS |  ¡  | |¡ |dkrA||fS ||fS )Nrr   ú])ú+Ú*rx   )rF   r   rS   rQ   r   rR   r`   Ú
parse_atom)r   rV   rW   rF   r	   r	   r
   rs     s   


zParserGenerator.parse_itemc                 C   s†   | j dkr|  ¡  |  ¡ \}}|  tjd¡ ||fS | jtjtjfv r8t	ƒ }t	ƒ }| 
|| j ¡ |  ¡  ||fS |  d| j| j ¡ d S )Nrq   ú)z+expected (...) or NAME or STRING, got %s/%s)rF   r   rS   rQ   r   rR   rN   rE   rt   r\   r`   Úraise_error)r   rV   rW   r	   r	   r
   rz   (  s   
ÿzParserGenerator.parse_atomc                 C   sD   | j |ks|d ur| j|kr|  d||| j | j¡ | j}|  ¡  |S )Nzexpected %s/%s, got %s/%s)rN   rF   r|   r   )r   rN   rF   r	   r	   r
   rQ   9  s   ÿzParserGenerator.expectc                 C   sX   t | jƒ}|d tjtjfv rt | jƒ}|d tjtjfv s|\| _| _| _| _| _	d S )Nr   )
r6   r   r   ÚCOMMENTÚNLrN   rF   ZbeginÚendÚline)r   Útupr	   r	   r
   r   A  s
   

ÿzParserGenerator.gettokenc              
   G   sV   |rz|| }W n   d  |gttt|ƒƒ ¡}Y t|| j| jd | jd | jfƒ‚)Nú r   r   )Újoinr   ÚmapÚstrÚSyntaxErrorr   r   r€   )r   ÚmsgÚargsr	   r	   r
   r|   H  s   ÿzParserGenerator.raise_errorrG   )r   r   r   r   r7   r-   r)   r   rH   r   rT   rj   rk   rU   rS   ro   rs   rz   rQ   r   r|   r	   r	   r	   r
   r   
   s&    
	.$

r   c                   @   s   e Zd Zdd„ Zddd„ZdS )r\   c                 C   s
   g | _ d S rG   )r&   )r   r	   r	   r
   r   S  s   
zNFAState.__init__Nc                 C   s8   |d u st |tƒsJ ‚t |tƒsJ ‚| j ||f¡ d S rG   )r?   r…   r\   r&   r(   ©r   r6   r5   r	   r	   r
   r`   V  s   zNFAState.addarcrG   )r   r   r   r   r`   r	   r	   r	   r
   r\   Q  s    r\   c                   @   s0   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	Zd	S )
r]   c                 C   sL   t |tƒsJ ‚t tt|ƒƒtƒsJ ‚t |tƒsJ ‚|| _||v | _i | _d S rG   )r?   Údictr6   Úiterr\   r^   r+   r&   )r   r^   Úfinalr	   r	   r
   r   ]  s   

zDFAState.__init__c                 C   s8   t |tƒsJ ‚|| jvsJ ‚t |tƒsJ ‚|| j|< d S rG   )r?   r…   r&   r]   r‰   r	   r	   r
   r`   e  s   zDFAState.addarcc                 C   s*   | j  ¡ D ]\}}||u r|| j |< qd S rG   )r&   r'   )r   ÚoldÚnewr5   r6   r	   r	   r
   rm   k  s
   
€þzDFAState.unifystatec                 C   sd   t |tƒsJ ‚| j|jkrdS t| jƒt|jƒkrdS | j ¡ D ]\}}||j |¡ur/ dS q dS )NFT)r?   r]   r+   r#   r&   r'   Úget)r   Úotherr5   r6   r	   r	   r
   Ú__eq__p  s   ÿzDFAState.__eq__N)r   r   r   r   r`   rm   r‘   Ú__hash__r	   r	   r	   r
   r]   [  s    r]   úGrammar.txtc                 C   s   t | ƒ}| ¡ S rG   )r   r7   )r   Úpr	   r	   r
   Úgenerate_grammar€  s   r•   N)r“   )re   r   r   r   ZGrammarr   Úobjectr   r\   r]   r•   r	   r	   r	   r
   Ú<module>   s     I
%