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   s  t |jƒ}|d  ¡ rK||jv r,||jv r|j| S |j |j| d f¡ ||j|< |S tt|d ƒ}||jv r<|j| S |j |d f¡ ||j|< |S t	|ƒ}|d  ¡ ro||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   ÚtokensÚevalÚkeywordsÚNAMEr   Zopmap)r   r/   r5   r9   ZitokenÚvaluer	   r	   r
   r)   =   s6   














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'   Ú
ValueErrorrD   Úupdate)r   r1   r3   r4   ZtotalsetZoverlapcheckr5   r6   ÚfsetZinverseZitsfirstÚsymbolr	   r	   r
   rD   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   ÚexpectrA   ÚOPÚ	parse_rhsÚmake_dfar#   Úsimplify_dfa)	r   r   r   r1   ÚaÚzr3   ZoldlenZnewlenr	   r	   r
   r   ‘   s&   ÿ
ïzParserGenerator.parsec              	      s¾   ‡ fdd„}‡ fdd„‰ t ||ƒ|ƒg}|D ]F}i }|jD ]}|jD ]\}}	|d ur3ˆ |	| |i ¡ƒ q"qt| ¡ ƒD ] \}}
|D ]	}|j|
krJ nqAt |
|ƒ}| |¡ | ||¡ q;q|S )Nc                    s   i }ˆ | |ƒ |S rC   r	   )r4   Úbase©Ú
addclosurer	   r
   Úclosure°   s   
z)ParserGenerator.make_dfa.<locals>.closurec                    s:   | |v rd S d|| < | j D ]\}}|d u rˆ ||ƒ qd S r8   ©r&   )r4   rT   r5   r6   rU   r	   r
   rV   ´   s   
€þz,ParserGenerator.make_dfa.<locals>.addclosure)ÚDFAStateÚnfasetr&   Ú
setdefaultr%   r'   r(   Úaddarc)r   r.   ÚfinishrW   r,   r4   r&   Znfastater5   r6   rZ   Ústr	   rU   r
   rP   ©   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.   r]   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 forr_   r`   ra   rb   )rc   rd   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   )rd   Úranger#   Ú
unifystate)r   r3   Zchangesr2   Zstate_ire   Zstate_jr4   r	   r	   r
   rQ   ä   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_altrB   ÚNFAStater\   r   )r   rR   rS   ZaaÚzzr	   r	   r
   rO   ù   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_itemrB   rJ   r   rA   ÚSTRINGr\   )r   rR   Úbr/   Údr	   r	   r
   rk   
  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 )Nro   ú])ú+Ú*ru   )rB   r   rO   rM   r   rN   r\   Ú
parse_atom)r   rR   rS   rB   r	   r	   r
   rp     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 )Nrn   ú)z+expected (...) or NAME or STRING, got %s/%s)rB   r   rO   rM   r   rN   rJ   rA   rq   rl   r\   Úraise_error)r   rR   rS   r	   r	   r
   rw   (  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)rJ   rB   ry   r   )r   rJ   rB   r	   r	   r
   rM   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 r:   )
r6   r   r   ÚCOMMENTÚNLrJ   rB   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
   ry   H  s   ÿzParserGenerator.raise_errorrC   )r   r   r   r   r7   r-   r)   r   rD   r   rP   rf   rg   rQ   rO   rk   rp   rw   rM   r   ry   r	   r	   r	   r
   r   
   s&    
	.$

r   c                   @   s   e Zd Zdd„ Zddd„ZdS )rl   c                 C   s
   g | _ d S rC   rX   )r   r	   r	   r
   r   S  s   
zNFAState.__init__Nc                 C   s   | j  ||f¡ d S rC   )r&   r(   ©r   r6   r5   r	   r	   r
   r\   V  s   zNFAState.addarcrC   )r   r   r   r   r\   r	   r	   r	   r
   rl   Q  s    rl   c                   @   s0   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	Zd	S )
rY   c                 C   s   || _ ||v | _i | _d S rC   )rZ   r+   r&   )r   rZ   Úfinalr	   r	   r
   r   ]  s   

zDFAState.__init__c                 C   s   || j |< d S rC   rX   r†   r	   r	   r
   r\   e  s   zDFAState.addarcc                 C   s*   | j  ¡ D ]\}}||u r|| j |< qd S rC   )r&   r'   )r   ÚoldÚnewr5   r6   r	   r	   r
   ri   k  s
   
€þzDFAState.unifystatec                 C   sV   | 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'   Úget)r   Úotherr5   r6   r	   r	   r
   Ú__eq__p  s   ÿzDFAState.__eq__N)r   r   r   r   r\   ri   rŒ   Ú__hash__r	   r	   r	   r
   rY   [  s    rY   úGrammar.txtc                 C   s   t | ƒ}| ¡ S rC   )r   r7   )r   Úpr	   r	   r
   Úgenerate_grammar€  s   r   N)rŽ   )ra   r   r   r   ZGrammarr   Úobjectr   rl   rY   r   r	   r	   r	   r
   Ú<module>   s     I
%