î
\á[\Ô5  ã               @   sŠ   d  d l  m Z m Z m Z Gd d „  d e j ƒ Z Gd d „  d e ƒ Z Gd d „  d e ƒ Z Gd 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.4/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   s    d  } | d  k r* t  | ƒ } | j } n  | |  _ | |  _ t j | j ƒ |  _ |  j ƒ  |  j	 ƒ  \ |  _
 |  _ | d  k	 r‰ | ƒ  n  i  |  _ |  j ƒ  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 ƒ  ƒ } | j ƒ  | j |  j ƒ | j d |  j ƒ x; | D]3 } d t | j	 ƒ } | | j	 | <| | j
 | <qR Wxë | D]ã } |  j | } g  } x‘ | D]‰ } g  } xE | j j ƒ  D]4 \ }	 }
 | j |  j | |	 ƒ | j |
 ƒ f ƒ qÌ W| j r,| j d | j | ƒ f ƒ n  | j | ƒ q° W| j j | ƒ | |  j | | ƒ f | j | j	 | <q W| j	 |  j | _ | S)Né    é   )r   Úlistr   ÚkeysÚsortÚremover   ÚinsertÚlenÚsymbol2numberZnumber2symbolÚ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   sD   |  j  | } i  } x* | D]" } |  j | | ƒ } d | | <q W| S)Nr   )r   r'   )r   r-   r/   Zrawfirstr   r3   Úilabelr	   r	   r
   r+   4   s    zParserGenerator.make_firstc             C   sÖ  t  | j ƒ } | d j ƒ  r| | j k ry | | j k rH | j | S| j j | j | d  f ƒ | | j | <| SqÒt t | d  ƒ } t | t	 ƒ s¦ t
 | ƒ ‚ | t j k sÁ t
 | ƒ ‚ | | j k rÛ | j | S| j j | d  f ƒ | | j | <| SnÍ | d d k s!t
 | ƒ ‚ t | ƒ } | d j ƒ  r„| | j k rW| j | S| j j t j | f ƒ | | j | <| SnN t j | } | | j k r«| j | S| j j | d  f ƒ | | j | <| Sd  S)Nr   ú"ú')r7   r8   )r"   ZlabelsÚisalphar#   Zsymbol2labelr&   Úgetattrr   Ú
isinstanceÚintÚAssertionErrorÚtok_nameÚtokensÚevalÚkeywordsÚNAMEr   Zopmap)r   r-   r3   r6   ZitokenÚvaluer	   r	   r
   r'   =   s<    zParserGenerator.make_labelc             C   sS   t  |  j j ƒ  ƒ } | j ƒ  x- | D]% } | |  j k r& |  j | ƒ q& q& Wd  S)N)r   r   r   r   r   Ú	calcfirst)r   r.   r/   r	   r	   r
   r   k   s
    
zParserGenerator.addfirstsetsc          	   C   sj  |  j  | } d  |  j | <| d } i  } i  } x¹ | j j ƒ  D]¨ \ } } | |  j  k rÍ | |  j k r™ |  j | } | d  k r³ t d | ƒ ‚ q³ n |  j | ƒ |  j | } | j | ƒ | | | <q@ d | | <i d | 6| | <q@ Wi  }	 xd | j ƒ  D]V \ } }
 xG |
 D]? } | |	 k rGt d | | | |	 | f ƒ ‚ n  | |	 | <qWqÿ W| |  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   r/   r1   r2   ZtotalsetZoverlapcheckr3   r4   ÚfsetZinverseZitsfirstZsymbolr	   r	   r
   rD   s   s2    

zParserGenerator.calcfirstc       	      C   sï   i  } d  } xÖ |  j  t j k rä x  |  j  t j k rC |  j ƒ  q$ W|  j t j ƒ } |  j t j d ƒ |  j ƒ  \ } } |  j t j ƒ |  j	 | | ƒ } t
 | ƒ } |  j | ƒ t
 | ƒ } | | | <| d  k r | } q q W| | f S)Nú:)Útyper   Ú	ENDMARKERÚNEWLINEr   ÚexpectrB   ÚOPÚ	parse_rhsÚmake_dfar"   Úsimplify_dfa)	r   r   r   r/   ÚaÚzr1   ZoldlenZnewlenr	   r	   r
   r   ‘   s"    
zParserGenerator.parsec                sD  t  | t ƒ s t ‚ t  | t ƒ s* t ‚ ‡  f d d †  } ‡  f d d †  ‰  t | | ƒ | ƒ g } x× | D]Ï } i  } xS | j D]H } x? | j D]4 \ } }	 | d  k	 r“ ˆ  |	 | j | i  ƒ ƒ q“ q“ Wqƒ Wxj | j ƒ  D]\ \ } }
 x= | D] } | j |
 k rï Pqï qï Wt |
 | ƒ } | j | ƒ | j	 | | ƒ qÜ Wqm W| S)Nc                s   i  } ˆ  |  | ƒ | S)Nr	   )r2   Úbase)Ú
addclosurer	   r
   Úclosure°   s    z)ParserGenerator.make_dfa.<locals>.closurec                si   t  |  t ƒ s t ‚ |  | k r% d  Sd | |  <x3 |  j D]( \ } } | d  k r9 ˆ  | | ƒ q9 q9 Wd  S)Nr   )r;   ÚNFAStater=   r$   )r2   rS   r3   r4   )rT   r	   r
   rT   ´   s    
z,ParserGenerator.make_dfa.<locals>.addclosure)
r;   rV   r=   ÚDFAStateÚnfasetr$   Ú
setdefaultr%   r&   Úaddarc)r   r,   ÚfinishrU   r*   r2   r$   Znfastater3   r4   rX   Ústr	   )rT   r
   rO   ©   s&    $zParserGenerator.make_dfac       
      C   sÛ   t  d | ƒ | g } x¾ t | ƒ D]° \ } } t  d | | | k rJ d pM d ƒ x | j D]t \ } } | | k r… | j | ƒ }	 n t | ƒ }	 | j | ƒ | d  k r» t  d |	 ƒ q[ t  d | |	 f ƒ q[ Wq# Wd  S)NzDump of NFA forz  Statez(final)Ú z	    -> %dz    %s -> %d)ÚprintÚ	enumerater$   r(   r"   r&   )
r   r/   r,   r[   Ztodor0   r2   r3   r4   Újr	   r	   r
   Údump_nfaÍ   s    	"zParserGenerator.dump_nfac             C   sŠ   t  d | ƒ xv t | ƒ D]h \ } } t  d | | j r> d pA d ƒ x: | j j ƒ  D]) \ } } t  d | | j | ƒ f ƒ qU Wq Wd  S)NzDump of DFA forz  Statez(final)r]   z    %s -> %d)r^   r_   r)   r$   r%   r(   )r   r/   r1   r0   r2   r3   r4   r	   r	   r
   Údump_dfaÝ   s
    zParserGenerator.dump_dfac             C   s¦   d } x™ | r¡ d } x† t  | ƒ D]x \ } } xi t | d t | ƒ ƒ D]N } | | } | | k rH | | =x | D] } | j | | ƒ qr Wd } PqH qH Wq" Wq	 Wd  S)NTFr   )r_   Úranger"   Ú
unifystate)r   r1   Zchangesr0   Zstate_ir`   Zstate_jr2   r	   r	   r
   rP   ä   s    	 
zParserGenerator.simplify_dfac             C   s±   |  j  ƒ  \ } } |  j d k r+ | | f St ƒ  } t ƒ  } | j | ƒ | j | ƒ xI |  j d k r¢ |  j ƒ  |  j  ƒ  \ } } | j | ƒ | j | ƒ qZ W| | f Sd  S)Nú|)Ú	parse_altrC   rV   rZ   r   )r   rQ   rR   ZaaZzzr	   r	   r
   rN   ù   s    
		
zParserGenerator.parse_rhsc             C   sr   |  j  ƒ  \ } } xS |  j d k s? |  j t j t j f k rg |  j  ƒ  \ } } | j | ƒ | } q W| | f S)Nú(ú[)rg   rh   )Ú
parse_itemrC   rI   r   rB   ÚSTRINGrZ   )r   rQ   Úbr-   Údr	   r	   r
   rf   
  s    
zParserGenerator.parse_altc             C   sÁ   |  j  d k rU |  j ƒ  |  j ƒ  \ } } |  j t j d ƒ | j | ƒ | | f S|  j ƒ  \ } } |  j  } | d k r† | | f S|  j ƒ  | j | ƒ | d k r³ | | f S| | f Sd  S)Nrh   ú]ú+Ú*)rn   ro   )rC   r   rN   rL   r   rM   rZ   Ú
parse_atom)r   rQ   rR   rC   r	   r	   r
   ri     s    

	


zParserGenerator.parse_itemc             C   s¹   |  j  d k rH |  j ƒ  |  j ƒ  \ } } |  j t j d ƒ | | f S|  j t j t j f k rœ t	 ƒ  } t	 ƒ  } | j
 | |  j  ƒ |  j ƒ  | | f S|  j d |  j |  j  ƒ d  S)Nrg   ú)z+expected (...) or NAME or STRING, got %s/%s)rC   r   rN   rL   r   rM   rI   rB   rj   rV   rZ   Úraise_error)r   rQ   rR   r	   r	   r
   rp   (  s    

		

	zParserGenerator.parse_atomc             C   sc   |  j  | k s* | d  k	 rL |  j | k rL |  j d | | |  j  |  j ƒ n  |  j } |  j ƒ  | S)Nzexpected %s/%s, got %s/%s)rI   rC   rr   r   )r   rI   rC   r	   r	   r
   rL   9  s    *		
zParserGenerator.expectc             C   si   t  |  j ƒ } x/ | d t j t j f k r@ t  |  j ƒ } q W| \ |  _ |  _ |  _ |  _ |  _	 d  S)Nr   )
r4   r   r   ÚCOMMENTÚNLrI   rC   ZbeginÚendÚline)r   Útupr	   r	   r
   r   A  s    zParserGenerator.gettokenc             G   sz   | rG y | | } WqG d j  | g t t t | ƒ ƒ ƒ } YqG Xn  t | |  j |  j d |  j d |  j f ƒ ‚ d  S)Nú r   r   )Újoinr   ÚmapÚstrÚSyntaxErrorr   ru   rv   )r   ÚmsgÚargsr	   r	   r
   rr   H  s    -zParserGenerator.raise_error)r   r   r   r   r5   r+   r'   r   rD   r   rO   ra   rb   rP   rN   rf   ri   rp   rL   r   rr   r	   r	   r	   r
   r   
   s$   	.$
r   c               @   s+   e  Z d  Z d d „  Z d d d „ Z d S)rV   c             C   s   g  |  _  d  S)N)r$   )r   r	   r	   r
   r   S  s    zNFAState.__init__Nc             C   sP   | d  k s! t  | t ƒ s! t ‚ t  | t ƒ s6 t ‚ |  j j | | f ƒ d  S)N)r;   r{   r=   rV   r$   r&   )r   r4   r3   r	   r	   r
   rZ   V  s    !zNFAState.addarc)r   r   r   r   rZ   r	   r	   r	   r
   rV   Q  s   rV   c               @   sF   e  Z d  Z d d „  Z d d „  Z d d „  Z d d „  Z d	 Z d	 S)
rW   c             C   sp   t  | t ƒ s t ‚ t  t t | ƒ ƒ t ƒ s6 t ‚ t  | t ƒ sK t ‚ | |  _ | | k |  _ i  |  _ d  S)N)	r;   Údictr=   r4   ÚiterrV   rX   r)   r$   )r   rX   Úfinalr	   r	   r
   r   ]  s    !	zDFAState.__init__c             C   sP   t  | t ƒ s t ‚ | |  j k s* t ‚ t  | t ƒ s? t ‚ | |  j | <d  S)N)r;   r{   r=   r$   rW   )r   r4   r3   r	   r	   r
   rZ   e  s    zDFAState.addarcc             C   s@   x9 |  j  j ƒ  D]( \ } } | | k r | |  j  | <q q Wd  S)N)r$   r%   )r   ÚoldÚnewr3   r4   r	   r	   r
   rd   k  s    zDFAState.unifystatec             C   s   t  | t ƒ s t ‚ |  j | j k r+ d St |  j ƒ t | j ƒ k rM d Sx9 |  j j ƒ  D]( \ } } | | j j | ƒ k	 r] d Sq] Wd S)NFT)r;   rW   r=   r)   r"   r$   r%   Úget)r   Úotherr3   r4   r	   r	   r
   Ú__eq__p  s    zDFAState.__eq__N)r   r   r   r   rZ   rd   r†   Ú__hash__r	   r	   r	   r
   rW   [  s
   rW   zGrammar.txtc             C   s   t  |  ƒ } | j ƒ  S)N)r   r5   )r   Úpr	   r	   r
   Úgenerate_grammar€  s    r‰   N)r]   r   r   r   ZGrammarr   Úobjectr   rV   rW   r‰   r	   r	   r	   r
   Ú<module>   s   ÿ H
%