U
    <1_ô5  ã                   @   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.8/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   sl   d }|d krt |ƒ}|j}|| _|| _t |j¡| _|  ¡  |  	¡ \| _
| _|d k	rZ|ƒ  i | _|  ¡  d S ©N)Ú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 ] }| j| }g }|D ]`}g }t|j ¡ ƒD ]$\}	}
| |  ||	¡| |
¡f¡ q’|jrÒ| d| |¡f¡ | |¡ q||j |¡ ||  ||¡f|j|j	| < qf|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   sb  t |jƒ}|d  ¡ r¾||jkrZ||jkr4|j| S |j |j| d f¡ ||j|< |S nbtt|d ƒ}t|t	ƒsxt
|ƒ‚|tjksŠt
|ƒ‚||jkrž|j| S |j |d f¡ ||j|< |S n |d dksÒt
|ƒ‚t|ƒ}|d  ¡ r ||jk rþ|j| S |j tj|f¡ ||j|< |S n>tj| }||jkr@|j| S |j |d f¡ ||j|< |S d S )Nr   )ú"ú')r#   ÚlabelsÚisalphar$   Zsymbol2labelr(   Úgetattrr   Ú
isinstanceÚintÚAssertionErrorÚ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kr|  |¡ qd S r   )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 ]x\}}|| j kr’|| jkrj| j| }|d kr~td| ƒ‚n|  |¡ | j| }| |¡ |||< q.d||< |di||< q.i }	| ¡ D ]:\}}
|
D ],}||	krätd||||	| f ƒ‚||	|< qÀq´|| 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itsfirstZsymbolr	   r	   r
   rH   s   s4    








þzParserGenerator.calcfirstc           	      C   s    i }d }| j tjkr˜| j tjkr*|  ¡  q|  tj¡}|  tjd¡ |  ¡ \}}|  tj¡ |  	||¡}t
|ƒ}|  |¡ t
|ƒ}|||< |d kr|}q||fS )Nú:)Útyper   Ú	ENDMARKERÚNEWLINEr   ÚexpectrF   Ú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t‚t |tƒst‚‡ fdd„}‡ fdd„‰ t||ƒ|ƒg}|D ]Œ}i }|jD ].}|jD ]"\}}	|d k	r`ˆ |	| |i ¡ƒ q`qVt| ¡ ƒD ]@\}}
|D ]}|j|
krž qÆqžt|
|ƒ}| 	|¡ | 
||¡ q’qH|S )Nc                    s   i }ˆ | |ƒ |S r   r	   )r4   Úbase©Ú
addclosurer	   r
   Úclosure°   s    
z)ParserGenerator.make_dfa.<locals>.closurec                    sH   t | tƒst‚| |krd S d|| < | jD ]\}}|d kr(ˆ ||ƒ q(d S r8   )r?   ÚNFAStaterA   r&   )r4   rW   r5   r6   rX   r	   r
   rY   ´   s    z,ParserGenerator.make_dfa.<locals>.addclosure)r?   r[   rA   ÚDFAStateÚnfasetr&   Ú
setdefaultr%   r'   r(   Úaddarc)r   r.   ÚfinishrZ   r,   r4   r&   Znfastater5   r6   r]   Ústr	   rX   r
   rS   ©   s&    



zParserGenerator.make_dfac           
      C   sš   t d|ƒ |g}t|ƒD ]|\}}t d|||kr2dp4dƒ |jD ]T\}}||krZ| |¡}	nt|ƒ}	| |¡ |d kr‚t 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 ]L\}}t d||jr*dp,dƒ t|j ¡ ƒD ]\}}t d|| |¡f ƒ q>qd S )NzDump of DFA forrb   rc   rd   re   )rf   rg   r+   r%   r&   r'   r*   )r   r1   r3   r2   r4   r5   r6   r	   r	   r
   Údump_dfaÝ   s
    
zParserGenerator.dump_dfac                 C   sp   d}|rld}t |ƒD ]T\}}t|d t|ƒƒD ]8}|| }||kr.||= |D ]}| ||¡ qLd} qq.qqd S )NTFr   )rg   Úranger#   Ú
unifystate)r   r3   Zchangesr2   Zstate_irh   Zstate_jr4   r	   r	   r
   rT   ä   s    zParserGenerator.simplify_dfac                 C   s~   |   ¡ \}}| jdkr||fS tƒ }tƒ }| |¡ | |¡ | jdkrr|  ¡  |   ¡ \}}| |¡ | |¡ q>||fS d S )Nú|)Ú	parse_altrG   r[   r_   r   )r   rU   rV   ZaaZzzr	   r	   r
   rR   ù   s    




zParserGenerator.parse_rhsc                 C   sL   |   ¡ \}}| jdks(| jtjtjfkrD|   ¡ \}}| |¡ |}q||fS )N)ú(ú[)Ú
parse_itemrG   rM   r   rF   ÚSTRINGr_   )r   rU   Úbr/   Údr	   r	   r
   rn   
  s    
ÿ
zParserGenerator.parse_altc                 C   sŽ   | j dkr>|  ¡  |  ¡ \}}|  tjd¡ | |¡ ||fS |  ¡ \}}| j }|dkr`||fS |  ¡  | |¡ |dkr‚||fS ||fS d S )Nrp   ú])ú+Ú*rv   )rG   r   rR   rP   r   rQ   r_   Ú
parse_atom)r   rU   rV   rG   r	   r	   r
   rq     s    


zParserGenerator.parse_itemc                 C   s†   | j dkr4|  ¡  |  ¡ \}}|  tjd¡ ||fS | jtjtjfkrpt	ƒ }t	ƒ }| 
|| j ¡ |  ¡  ||fS |  d| j| j ¡ d S )Nro   ú)z+expected (...) or NAME or STRING, got %s/%s)rG   r   rR   rP   r   rQ   rM   rF   rr   r[   r_   Úraise_error)r   rU   rV   r	   r	   r
   rx   (  s    
 ÿzParserGenerator.parse_atomc                 C   sD   | j |ks|d k	r2| j|kr2|  d||| j | j¡ | j}|  ¡  |S )Nzexpected %s/%s, got %s/%s)rM   rG   rz   r   )r   rM   rG   r	   r	   r
   rP   9  s       ÿzParserGenerator.expectc                 C   sF   t | jƒ}|d tjtjfkr*t | jƒ}q
|\| _| _| _| _| _	d S )Nr   )
r6   r   r   ÚCOMMENTÚNLrM   rG   ZbeginÚendÚline)r   Útupr	   r	   r
   r   A  s    
zParserGenerator.gettokenc              
   G   s^   |r8z|| }W n&   d  |gttt|ƒƒ ¡}Y nX t|| j| jd | jd | jfƒ‚d S )Nú r   r   )Újoinr   ÚmapÚstrÚSyntaxErrorr   r}   r~   )r   ÚmsgÚargsr	   r	   r
   rz   H  s      ÿzParserGenerator.raise_error)N)N)r   r   r   r   r7   r-   r)   r   rH   r   rS   ri   rj   rT   rR   rn   rq   rx   rP   r   rz   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 r   )r&   )r   r	   r	   r
   r   S  s    zNFAState.__init__Nc                 C   s8   |d kst |tƒst‚t |tƒs$t‚| j ||f¡ d S r   )r?   rƒ   rA   r[   r&   r(   ©r   r6   r5   r	   r	   r
   r_   V  s    zNFAState.addarc)N)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t‚t tt|ƒƒtƒs$t‚t |tƒs2t‚|| _||k| _i | _d S r   )	r?   ÚdictrA   r6   Úiterr[   r]   r+   r&   )r   r]   Úfinalr	   r	   r
   r   ]  s    
zDFAState.__init__c                 C   s8   t |tƒst‚|| jkst‚t |tƒs*t‚|| j|< d S r   )r?   rƒ   rA   r&   r\   r‡   r	   r	   r
   r_   e  s    zDFAState.addarcc                 C   s*   | j  ¡ D ]\}}||kr
|| j |< q
d S r   )r&   r'   )r   ÚoldÚnewr5   r6   r	   r	   r
   rl   k  s    zDFAState.unifystatec                 C   sd   t |tƒst‚| j|jkrdS t| jƒt|jƒkr6dS | j ¡ D ]\}}||j |¡k	r@ dS q@dS )NFT)r?   r\   rA   r+   r#   r&   r'   Úget)r   Úotherr5   r6   r	   r	   r
   Ú__eq__p  s    zDFAState.__eq__N)r   r   r   r   r_   rl   r   Ú__hash__r	   r	   r	   r
   r\   [  s
   r\   úGrammar.txtc                 C   s   t | ƒ}| ¡ S r   )r   r7   )r   Úpr	   r	   r
   Úgenerate_grammar€  s    r“   N)r‘   )rd   r   r   r   ZGrammarr   Úobjectr   r[   r\   r“   r	   r	   r	   r
   Ú<module>   s     I
%