
2ik                @   s  d  d l  Z  d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l Z d Z d Z	 d Z
 d Z d Z d Z d Z d Z d	 Z d  Z e j d  d k  r e Z n e Z e j Z Gd
 d   d e  Z Gd d   d e  Z Gd d   d e  Z d d   Z d d   Z d a d a  d a! d Z" d d   Z# d d   Z$ d d   Z% d d   Z& Gd d   d  Z' Gd d    d   Z( Gd! d"   d"  Z) e  j* d#  Z+ Gd$ d%   d% e  Z, Gd& d'   d' e  Z- Gd( d)   d) e  Z. d* d+   Z/ Gd, d-   d- e  Z0 Gd. d/   d/ e  Z1 Gd0 d1   d1 e  Z2 Gd2 d3   d3 e  Z3 d4 d5   Z4 d6 d7   Z5 Gd8 d9   d9 e  Z6 Gd: d;   d; e3  Z7 d< d=   Z8 d> d?   Z9 Gd@ dA   dA e  Z: d e
 d e d d d d e d d d d dB dC  Z; d S)D    Nz3.10Tz
parser.outparsetabLALR   F(   c               @   sL   e  Z d  Z d d   Z d d   Z e Z d d   Z d d   Z e Z d	 S)
	PlyLoggerc             C   s   | |  _  d  S)N)f)selfr    r	   ../pycparser/ply/yacc.py__init__n   s    zPlyLogger.__init__c             O   s   |  j  j | | d  d  S)N
)r   write)r   msgargskwargsr	   r	   r
   debugq   s    zPlyLogger.debugc             O   s    |  j  j d | | d  d  S)Nz	WARNING: r   )r   r   )r   r   r   r   r	   r	   r
   warningv   s    zPlyLogger.warningc             O   s    |  j  j d | | d  d  S)NzERROR: r   )r   r   )r   r   r   r   r	   r	   r
   errory   s    zPlyLogger.errorN)	__name__
__module____qualname__r   r   infor   r   Zcriticalr	   r	   r	   r
   r   m   s   r   c               @   s(   e  Z d  Z d d   Z d d   Z d S)
NullLoggerc             C   s   |  S)Nr	   )r   namer	   r	   r
   __getattribute__   s    zNullLogger.__getattribute__c             O   s   |  S)Nr	   )r   r   r   r	   r	   r
   __call__   s    zNullLogger.__call__N)r   r   r   r   r   r	   r	   r	   r
   r      s   r   c               @   s   e  Z d  Z d S)	YaccErrorN)r   r   r   r	   r	   r	   r
   r      s   r   c             C   sp   t  |   } d | k r$ t  |  } t |  t k rJ | d  t  d } d t |   j t |   | f } | S)Nr   z ...z<%s @ 0x%x> (%s))reprlenresultlimittyper   id)rrepr_strresultr	   r	   r
   format_result   s    "r%   c             C   s[   t  |   } d | k r$ t  |  } t |  d k  r: | Sd t |   j t |   f Sd  S)Nr      z<%s @ 0x%x>)r   r   r    r   r!   )r"   r#   r	   r	   r
   format_stack_entry   s    r'   a  PLY: Don't use global functions errok(), token(), and restart() in p_error().
Instead, invoke the methods on the associated parser instance:

    def p_error(p):
        ...
        # Use parser.errok(), parser.token(), parser.restart()
        ...

    parser = yacc.yacc()
c               C   s   t  j t  t   S)N)warningswarn_warnmsg_errokr	   r	   r	   r
   errok   s    r,   c               C   s   t  j t  t   S)N)r(   r)   r*   _restartr	   r	   r	   r
   restart   s    r.   c               C   s   t  j t  t   S)N)r(   r)   r*   _tokenr	   r	   r	   r
   token   s    r0   c             C   sM   | j  a | j a | j a |  |  } y b b b Wn t k
 rH Yn X| S)N)r,   r+   r0   r/   r.   r-   	NameError)	errorfuncr0   parserr"   r	   r	   r
   call_errorfunc   s    			r4   c               @   s(   e  Z d  Z d d   Z d d   Z d S)
YaccSymbolc             C   s   |  j  S)N)r    )r   r	   r	   r
   __str__   s    zYaccSymbol.__str__c             C   s
   t  |   S)N)str)r   r	   r	   r
   __repr__   s    zYaccSymbol.__repr__N)r   r   r   r6   r8   r	   r	   r	   r
   r5      s   r5   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 S)YaccProductionNc             C   s(   | |  _  | |  _ d  |  _ d  |  _ d  S)N)slicestacklexerr3   )r   sr;   r	   r	   r
   r      s    			zYaccProduction.__init__c             C   sS   t  | t  r' d d   |  j | D S| d k rA |  j | j S|  j | j Sd  S)Nc             S   s   g  |  ] } | j   q Sr	   )value).0r=   r	   r	   r
   
<listcomp>   s   	 z.YaccProduction.__getitem__.<locals>.<listcomp>r   )
isinstancer:   r>   r;   )r   nr	   r	   r
   __getitem__   s
    zYaccProduction.__getitem__c             C   s   | |  j  | _ d  S)N)r:   r>   )r   rB   vr	   r	   r
   __setitem__   s    zYaccProduction.__setitem__c             C   s   d d   |  j  | |  D S)Nc             S   s   g  |  ] } | j   q Sr	   )r>   )r?   r=   r	   r	   r
   r@      s   	 z/YaccProduction.__getslice__.<locals>.<listcomp>)r:   )r   ijr	   r	   r
   __getslice__   s    zYaccProduction.__getslice__c             C   s   t  |  j  S)N)r   r:   )r   r	   r	   r
   __len__   s    zYaccProduction.__len__c             C   s   t  |  j | d d  S)Nlinenor   )getattrr:   )r   rB   r	   r	   r
   rJ     s    zYaccProduction.linenoc             C   s   | |  j  | _ d  S)N)r:   rJ   )r   rB   rJ   r	   r	   r
   
set_lineno  s    zYaccProduction.set_linenoc             C   s<   t  |  j | d d  } t  |  j | d |  } | | f S)NrJ   r   	endlineno)rK   r:   )r   rB   	startlineZendliner	   r	   r
   linespan  s    zYaccProduction.linespanc             C   s   t  |  j | d d  S)Nlexposr   )rK   r:   )r   rB   r	   r	   r
   rP     s    zYaccProduction.lexposc             C   s<   t  |  j | d d  } t  |  j | d |  } | | f S)NrP   r   	endlexpos)rK   r:   )r   rB   startposendposr	   r	   r
   lexspan  s    zYaccProduction.lexspanc             C   s
   t   d  S)N)SyntaxError)r   r	   r	   r
   r     s    zYaccProduction.error)r   r   r   r   rC   rE   rH   rI   rJ   rL   rO   rP   rT   r   r	   r	   r	   r
   r9      s   r9   c               @   s   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d d d d d d  Z d d d d d d d  Z	 d d d d d d d  Z
 d d d d d d d  Z d S)LRParserc             C   sD   | j  |  _ | j |  _ | j |  _ | |  _ |  j   d |  _ d  S)NT)	lr_productionsproductions	lr_actionactionlr_gotogotor2   set_defaulted_stateserrorok)r   ZlrtabZerrorfr	   r	   r
   r     s    	
zLRParser.__init__c             C   s   d |  _  d  S)NT)r^   )r   r	   r	   r
   r,   &  s    zLRParser.errokc             C   sV   |  j  d  d   =|  j d  d   =t   } d | _ |  j j |  |  j  j d  d  S)Nz$endr   )
statestacksymstackr5   r    append)r   symr	   r	   r
   r.   )  s    		zLRParser.restartc             C   sr   i  |  _  xb |  j j   D]Q \ } } t | j    } t |  d k r | d d k  r | d |  j  | <q Wd  S)N   r   )defaulted_statesrZ   itemslistvaluesr   )r   stateactionsZrulesr	   r	   r
   r]   9  s
    	"zLRParser.set_defaulted_statesc             C   s   i  |  _  d  S)N)rd   )r   r	   r	   r
   disable_defaulted_states@  s    z!LRParser.disable_defaulted_statesNFc             C   s   | s t  rC t | t  r* t t j  } |  j | | | | |  S| rb |  j | | | | |  S|  j | | | | |  Sd  S)N)		yaccdevelrA   intr   sysstderr
parsedebugparseoptparseopt_notrack)r   inputr<   r   tracking	tokenfuncr	   r	   r
   parseC  s    zLRParser.parsec              C   s  d  } g  } |  j  } |  j }	 |  j }
 |  j } t d   } d } | j d  | sn d d l m } | j } | | _ |  | _	 | d  k	 r | j
 |  | d  k r | j } n | } | |  _ g  } | |  _ g  } | |  _ | | _ d  } | j d  t   } d | _ | j |  d } x| j d  | j d |  | | k r| s| sc|   } n | j   } | st   } d | _ | j } | | j |  } n | | } | j d | |  | j d	 d
 d j d d   | D d d    t |  f j    | d  k	 r| d k rk| j |  | } | j d |  | j |  d  } | r"| d 8} q"| d k  r|
 | } | j } | j } t   } | | _ d  | _ | r
| j d | j d d j d d   | | d   D  d |	 | d% | |  n% | j d | j g  |	 | d& |  | r| | d d   } | | d <| r| d } | j | _ | j | _ | d' } t | d | j  | _ t | d | j  | _ | | _  y| | | d   =| |  _! | j" |  | | d   =| j d t# | d   | j |  |	 | d( | } | j |  Wq"t$ k
 r| j |  | j% | d d)   | j   | d* } d | _ d | _ | } t& } d |  _' Yq"Xq"n | r| j | _ | j | _ | g } | | _  y` | |  _! | j" |  | j d t# | d   | j |  |	 | d+ | } | j |  Wq"t$ k
 r| j |  | j   | d, } d | _ d | _ | } t& } d |  _' Yq"Xq"| d k r| d- } t | d d   } | j d t# |   | j d  | S| d  k r| j( d d
 d j d d   | D d d    t |  f j    | d k s[|  j' rdt& } d |  _' | } | j d k rd  } |  j) r| rt* | d  r| | _ | |  _! t+ |  j) | |   } |  j' ra| } d  } q"qj| rMt* | d  r| j } n d } | r3t, j- j. d  | | j f  qat, j- j. d! | j  qjt, j- j. d"  d  Sn t& } t |  d k r| j d k rd  } d  } d } | d  d   =q"| j d k rd  S| j d k r| d. } | j d k r'| rt | d | j  | _ t | d# | j  | _ d  } q"t   } d | _ t* | d  r[| j | _ | _ t* | d#  r}| j | _ | _ | | _ | j |  | } q"| j   } | r| j | _ | j | _ | j   | d/ } q"t/ d$   q"Wd  S)0Nr   zPLY: PARSE DEBUG STARTrc   )lexz$end zState  : %sz#Defaulted state %s: Reduce using %dzStack  : %sz%s . %s c             S   s   g  |  ] } | j   q Sr	   )r    )r?   xxr	   r	   r
   r@     s   	 z'LRParser.parsedebug.<locals>.<listcomp>z Action : Shift and goto state %sz3Action : Reduce rule [%s] with %s and goto state %d[,c             S   s   g  |  ] } t  | j   q Sr	   )r'   r>   )r?   Z_vr	   r	   r
   r@     s   	 ]rM   rQ   zResult : %sr   Fr>   zDone   : Returning %szPLY: PARSE DEBUG ENDzError  : %sc             S   s   g  |  ] } | j   q Sr	   )r    )r?   ry   r	   r	   r
   r@   B  s   	 r<   rJ   z(yacc: Syntax error at line %d, token=%s
zyacc: Syntax error, token=%sz yacc: Parse error in input. EOF
rP   zyacc: internal parser error!!!
r}   r}   r}   r}   r}   r}   r}   r}   r}   r}   )0rZ   r\   rX   rd   r9   r   rw   rv   r<   r3   rr   r0   r_   r`   r;   ra   r5   r    r   popgetjoinr7   lstripr   r   r>   rJ   rP   rK   rM   rQ   r:   rh   callabler%   rU   extenderror_countr^   r   r2   hasattrr4   rm   rn   r   RuntimeError) r   rr   r<   r   rs   rt   	lookaheadlookaheadstackri   r\   prodrd   pslice
errorcountrv   	get_tokenr_   r`   errtokenrb   rh   ltypetppnameplentargt1rB   r$   tokrJ   r	   r	   r
   ro   \  s~   																
	=
					,


		

					

		
	=					 !
				

zLRParser.parsedebugc              C   s@  d  } g  } |  j  } |  j }	 |  j }
 |  j } t d   } d } | sa d d l m } | j } | | _ |  | _ | d  k	 r | j	 |  | d  k r | j
 } n | } | |  _
 g  } | |  _ g  } | |  _ | | _ d  } | j d  t   } d | _ | j |  d } x'| | k r|| s]| s9|   } n | j   } | s]t   } d | _ | j } | | j |  } n
 | | } | d  k	 r| d k r| j |  | } | j |  d  } | r| d 8} q| d k  r]|
 | } | j } | j } t   } | | _ d  | _ | r| | d d   } | | d <| r| d } | j | _ | j | _ | d } t | d | j  | _ t | d | j  | _ | | _ yb | | d   =| |  _ | j |  | | d   =| j |  |	 | d | } | j |  Wqt k
 r| j |  | j | d d   | j   | d } d | _ d | _ | } t  } d |  _! YqXqn | r| j | _ | j | _ | g } | | _ yF | |  _ | j |  | j |  |	 | d | } | j |  Wqt k
 rY| j |  | j   | d } d | _ d | _ | } t  } d |  _! YqXq| d k r| d } t | d	 d   } | S| d  k r,| d k s|  j! rt  } d |  _! | } | j d k rd  } |  j" r5| rt# | d
  r| | _ | |  _ t$ |  j" | |   } |  j! r| } d  } qq| rt# | d  rV| j } n d } | rt% j& j' d | | j f  qt% j& j' d | j  qt% j& j' d  d  Sn t  } t |  d k r| j d k rd  } d  } d } | d  d   =q| j d k rd  S| j d k r| d } | j d k rv| rmt | d | j  | _ t | d | j  | _ d  } qt   } d | _ t# | d  r| j | _ | _ t# | d  r| j | _ | _ | | _ | j |  | } q| j   } | r| j | _ | j | _ | j   | d } qt( d   qWd  S)Nr   rc   )rv   z$endrM   rQ   r   Fr>   r<   rJ   z(yacc: Syntax error at line %d, token=%s
zyacc: Syntax error, token=%sz yacc: Parse error in input. EOF
rP   zyacc: internal parser error!!!
r}   r}   r}   r}   r}   r}   r}   r}   r}   ))rZ   r\   rX   rd   r9   rw   rv   r<   r3   rr   r0   r_   r`   r;   ra   r5   r    r~   r   r   r   r>   rJ   rP   rK   rM   rQ   r:   rh   r   rU   r   r   r^   r2   r   r4   rm   rn   r   r   ) r   rr   r<   r   rs   rt   r   r   ri   r\   r   rd   r   r   rv   r   r_   r`   r   rb   rh   r   r   r   r   r   r   r   rB   r$   r   rJ   r	   r	   r
   rp     sX   																

					


		

					

		
					 !
				

zLRParser.parseoptc             C   sl  d  } g  } |  j  } |  j }	 |  j }
 |  j } t d   } d } | sa d d l m } | j } | | _ |  | _ | d  k	 r | j	 |  | d  k r | j
 } n | } | |  _
 g  } | |  _ g  } | |  _ | | _ d  } | j d  t   } d | _ | j |  d } xS| | k r|| s]| s9|   } n | j   } | s]t   } d | _ | j } | | j |  } n
 | | } | d  k	 r	| d k r| j |  | } | j |  d  } | r| d 8} q| d k  r|
 | } | j } | j } t   } | | _ d  | _ | r%| | d d   } | | d <| | _ yb | | d   =| |  _ | j |  | | d   =| j |  |	 | d | } | j |  Wqt k
 r| j |  | j | d d   | j   | d } d | _ d | _ | } t } d |  _ YqXqn | g } | | _ yF | |  _ | j |  | j |  |	 | d | } | j |  Wqt k
 r| j |  | j   | d } d | _ d | _ | } t } d |  _ YqXq| d k r	| d } t | d d   } | S| d  k rX| d k s*|  j r3t } d |  _ | } | j d k rTd  } |  j r| r|t | d  r|| | _ | |  _ t  |  j | |   } |  j r0| } d  } qq9| rt | d	  r| j! } n d } | rt" j# j$ d
 | | j f  q0t" j# j$ d | j  q9t" j# j$ d  d  Sn t } t |  d k r|| j d k r|d  } d  } d } | d  d   =q| j d k rd  S| j d k r5| d } | j d k rd  } qt   } d | _ t | d	  r| j! | _! | _% t | d  r| j& | _& | _' | | _ | j |  | } q| j   } | j   | d } qt( d   qWd  S)Nr   rc   )rv   z$endr   Fr>   r<   rJ   z(yacc: Syntax error at line %d, token=%s
zyacc: Syntax error, token=%sz yacc: Parse error in input. EOF
rP   zyacc: internal parser error!!!
r}   r}   r}   r}   r}   r}   r}   r}   ))rZ   r\   rX   rd   r9   rw   rv   r<   r3   rr   r0   r_   r`   r;   ra   r5   r    r~   r   r   r   r>   r:   rh   r   rU   r   r   r^   rK   r2   r   r4   rJ   rm   rn   r   rM   rP   rQ   r   )r   rr   r<   r   rs   rt   r   r   ri   r\   r   rd   r   r   rv   r   r_   r`   r   rb   rh   r   r   r   r   r   r   rB   r$   r   rJ   r	   r	   r
   rq     s8   																

					
		

					

		
					 !
				

zLRParser.parseopt_notrack)r   r   r   r   r,   r.   r]   rj   ru   ro   rp   rq   r	   r	   r	   r
   rV     s    \ 3rV   z^[a-zA-Z0-9_-]+$c               @   s   e  Z d  Z d Z d d d 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 S)
Productionr   rightNrw   c       	      C   s   | |  _  t |  |  _ | |  _ | |  _ d  |  _ | |  _ | |  _ | |  _ t	 |  j  |  _	 g  |  _
 x0 |  j D]% } | |  j
 k rs |  j
 j |  qs Wg  |  _ d  |  _ |  j r d |  j  d j |  j  f |  _ n d |  j  |  _ d  S)Nz%s -> %srx   z%s -> <empty>)r   tupler   numberfuncr   filelineprecr   usymsra   lr_itemslr_nextr   r7   )	r   r   r   r   
precedencer   r   r   r=   r	   r	   r
   r     s$    											%zProduction.__init__c             C   s   |  j  S)N)r7   )r   r	   r	   r
   r6   =  s    zProduction.__str__c             C   s   d t  |   d S)NzProduction())r7   )r   r	   r	   r
   r8   @  s    zProduction.__repr__c             C   s   t  |  j  S)N)r   r   )r   r	   r	   r
   rI   C  s    zProduction.__len__c             C   s   d S)Nrc   r	   )r   r	   r	   r
   __nonzero__F  s    zProduction.__nonzero__c             C   s   |  j  | S)N)r   )r   indexr	   r	   r
   rC   I  s    zProduction.__getitem__c             C   s   | t  |  j  k r d  St |  |  } y t | j | d | _ Wn! t t f k
 rg g  | _ Yn Xy | j | d | _ Wn t k
 r d  | _ Yn X| S)Nrc   )r   r   LRItem	Prodnameslr_after
IndexErrorKeyError	lr_before)r   rB   r   r	   r	   r
   lr_itemM  s    zProduction.lr_itemc             C   s   |  j  r | |  j  |  _ d  S)N)r   r   )r   pdictr	   r	   r
   bind]  s    	zProduction.bind)r   r   )r   r   r   reducedr   r6   r8   rI   r   rC   r   r   r	   r	   r	   r
   r     s   r   c               @   s@   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 S)
MiniProductionc             C   sC   | |  _  | |  _ | |  _ d  |  _ | |  _ | |  _ | |  _ d  S)N)r   r   r   r   r   r   r7   )r   r7   r   r   r   r   r   r	   r	   r
   r   f  s    						zMiniProduction.__init__c             C   s   |  j  S)N)r7   )r   r	   r	   r
   r6   o  s    zMiniProduction.__str__c             C   s   d |  j  S)NzMiniProduction(%s))r7   )r   r	   r	   r
   r8   r  s    zMiniProduction.__repr__c             C   s   |  j  r | |  j  |  _ d  S)N)r   r   )r   r   r	   r	   r
   r   v  s    	zMiniProduction.bindN)r   r   r   r   r6   r8   r   r	   r	   r	   r
   r   e  s   	r   c               @   s4   e  Z d  Z d d   Z d d   Z d d   Z d S)r   c             C   s   | j  |  _  t | j  |  _ | j |  _ | |  _ i  |  _ |  j j | d  t |  j  |  _ t |  j  |  _ | j	 |  _	 d  S)N.)
r   rf   r   r   lr_index
lookaheadsinsertr   r   r   )r   r   rB   r	   r	   r
   r     s    		zLRItem.__init__c             C   s<   |  j  r+ d |  j d j |  j   f } n d |  j } | S)Nz%s -> %srx   z%s -> <empty>)r   r   r   )r   r=   r	   r	   r
   r6     s    	"zLRItem.__str__c             C   s   d t  |   d S)NzLRItem(r   )r7   )r   r	   r	   r
   r8     s    zLRItem.__repr__N)r   r   r   r   r6   r8   r	   r	   r	   r
   r     s   r   c             C   sI   t  |   d } x2 | d k rD |  | | k r7 |  | S| d 8} q Wd  S)Nrc   r   )r   )Zsymbols	terminalsrF   r	   r	   r
   rightmost_terminal  s    r   c               @   s   e  Z d  Z d S)GrammarErrorN)r   r   r   r	   r	   r	   r
   r     s   r   c               @   s   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
 d d 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  d!  Z d" d#   Z d	 S)$Grammarc             C   s   d  g |  _  i  |  _ i  |  _ i  |  _ x | D] } g  |  j | <q. Wg  |  j d <i  |  _ i  |  _ i  |  _ i  |  _ t   |  _	 d  |  _
 d  S)Nr   )Productionsr   Prodmap	TerminalsNonterminalsFirstFollow
PrecedencesetUsedPrecedenceStart)r   r   termr	   r	   r
   r     s    							zGrammar.__init__c             C   s   t  |  j  S)N)r   r   )r   r	   r	   r
   rI     s    zGrammar.__len__c             C   s   |  j  | S)N)r   )r   r   r	   r	   r
   rC     s    zGrammar.__getitem__c             C   sl   |  j  d  g k s t d   | |  j k r= t d |   | d k rU t d   | | f |  j | <d  S)Nz2Must call set_precedence() before add_production()z,Precedence already specified for terminal %rleftr   nonassocz:Associativity must be one of 'left','right', or 'nonassoc')r   r   r   )r   AssertionErrorr   r   )r   r   assoclevelr	   r	   r
   set_precedence  s    zGrammar.set_precedenceNrw   r   c             C   s  | |  j  k r( t d | | | f   | d k rM t d | | | f   t j |  su t d | | | f   x t |  D] \ } } | d d k ryg t |  } t |  d k r t d | | | | f   | |  j  k r g  |  j  | <| | | <w Wn t k
 rYn Xt j |  r | d	 k r t d
 | | | | f   q Wd	 | k r| d d	 k rt d | | f   | d d	 k rt d | | f   | d }	 |  j j	 |	  }
 |
 st d | | |	 f   n |  j
 j |	  | d d   =n' t | |  j   }	 |  j j	 |	 d  }
 d | | f } | |  j k r|  j | } t d | | | f d | j | j f   t |  j  } | |  j k rg  |  j | <xd | D]\ } | |  j  k r|  j  | j |  q| |  j k rg  |  j | <|  j | j |  qWt | | | |
 | | |  } |  j j |  | |  j | <y |  j | j |  Wn" t k
 r| g |  j | <Yn Xd  S)Nz7%s:%d: Illegal rule name %r. Already defined as a tokenr   z5%s:%d: Illegal rule name %r. error is a reserved wordz%s:%d: Illegal rule name %rr   z'"rc   zA%s:%d: Literal token %s in rule %r may only be a single characterz%precz!%s:%d: Illegal name %r in rule %rz+%s:%d: Syntax error. Nothing follows %%prec   zH%s:%d: Syntax error. %%prec can only appear at the end of a grammar rulez/%s:%d: Nothing known about the precedence of %rr   z%s -> %sz%s:%d: Duplicate rule %s. zPrevious definition at %s:%dr}   r}   r   )r   r   )r   r   _is_identifiermatch	enumerateevalr   rU   r   r   r   addr   r   r   r   r   r   ra   r   r   r   )r   prodnamesymsr   r   r   rB   r=   cZprecnameZprodprecmapmZpnumberr   r   r	   r	   r
   add_production  sp    
 
zGrammar.add_productionc             C   sr   | s |  j  d j } | |  j k r5 t d |   t d d | g  |  j  d <|  j | j d  | |  _ d  S)Nrc   zstart symbol %s undefinedr   zS')r   r   r   r   r   ra   r   )r   startr	   r	   r
   	set_starta  s    zGrammar.set_startc                sS       f d d     t        j d j d   f d d    j D S)Nc                s_   |   k r d  S j  |   x;  j j |  g   D]$ } x | j D] }   |  qC Wq3 Wd  S)N)r   r   r   r   )r=   r   r"   )mark_reachable_from	reachabler   r	   r
   r   t  s    z5Grammar.find_unreachable.<locals>.mark_reachable_fromr   c                s"   g  |  ] } |   k r |  q Sr	   r	   )r?   r=   )r   r	   r
   r@   ~  s   	 z,Grammar.find_unreachable.<locals>.<listcomp>)r   r   r   r   )r   r	   )r   r   r   r
   find_unreachableq  s    	zGrammar.find_unreachablec             C   sD  i  } x |  j  D] } d | | <q Wd | d <x |  j D] } d | | <q8 Wx d } xz |  j j   D]i \ } } xZ | D]R } x( | j D] } | | s d } Pq Wd } | rx | | s d | | <d } Pqx Wqe W| sO PqO Wg  }	 xZ | j   D]L \ } }
 |
 s | |  j k r/| |  j  k r/| d k r/q |	 j |  q W|	 S)NTz$endFr   )r   r   r   re   r   ra   )r   Z
terminatesr   rB   some_changeZplr   r=   Zp_terminatesinfiniter   r	   r	   r
   infinite_cycles  s:    



	*zGrammar.infinite_cyclesc             C   sx   g  } xk |  j  D]` } | s q xN | j D]C } | |  j k r) | |  j k r) | d k r) | j | | f  q) Wq W| S)Nr   )r   r   r   r   ra   )r   r$   r   r=   r	   r	   r
   undefined_symbols  s    *zGrammar.undefined_symbolsc             C   sJ   g  } x= |  j  j   D], \ } } | d k r | r | j |  q W| S)Nr   )r   re   ra   )r   Z
unused_tokr=   rD   r	   r	   r
   unused_terminals  s
    zGrammar.unused_terminalsc             C   sN   g  } xA |  j  j   D]0 \ } } | s |  j | d } | j |  q W| S)Nr   )r   re   r   ra   )r   Zunused_prodr=   rD   r   r	   r	   r
   unused_rules  s    zGrammar.unused_rulesc             C   sZ   g  } xM |  j  D]B } | |  j k p1 | |  j k s | j | |  j  | d f  q W| S)Nr   )r   r   r   ra   )r   ZunusedZtermnamer	   r	   r
   unused_precedence  s
    "zGrammar.unused_precedencec             C   s~   g  } xq | D]\ } d } xC |  j  | D]4 } | d k rB d } q' | | k r' | j |  q' W| rh q Pq W| j d  | S)NFz<empty>T)r   ra   )r   Zbetar$   xZx_produces_emptyr   r	   r	   r
   _first	  s    	zGrammar._firstc             C   s   |  j  r |  j  Sx! |  j D] } | g |  j  | <q Wd g |  j  d <x |  j D] } g  |  j  | <qN Wx d } xs |  j D]h } x_ |  j | D]P } xG |  j | j  D]3 } | |  j  | k r |  j  | j |  d } q Wq Wqx W| sh Pqh W|  j  S)Nz$endFT)r   r   r   r   r   r   ra   )r   r   rB   r   r   r   r	   r	   r
   compute_first,  s$    	zGrammar.compute_firstc       
      C   s  |  j  r |  j  S|  j s# |  j   x |  j D] } g  |  j  | <q- W| sZ |  j d j } d g |  j  | <xGd } x3|  j d d   D]} xt | j  D]\ } } | |  j k r |  j | j | d d    } d } xY | D]Q }	 |	 d k r$|	 |  j  | k r$|  j  | j	 |	  d } |	 d k r d } q W| sY| t
 | j  d k r xE |  j  | j D]3 }	 |	 |  j  | k rj|  j  | j	 |	  d } qjWq Wq W| sm Pqm W|  j  S)Nrc   z$endFz<empty>T)r   r   r   r   r   r   r   r   r   ra   r   )
r   r   kdidaddr   rF   BZfstZhasemptyr   r	   r	   r
   compute_followQ  s<    		
 
zGrammar.compute_followc             C   s
  x|  j  D] } | } d } g  } x | t |  k r@ d  } n t | |  } y |  j | j | d | _ Wn! t t f k
 r g  | _ Yn Xy | j | d | _ Wn t k
 r d  | _ Yn X| | _	 | s P| j
 |  | } | d 7} q% W| | _ q
 Wd  S)Nr   rc   )r   r   r   r   r   r   r   r   r   r   ra   r   )r   r   ZlastlrirF   r   Zlrir	   r	   r
   build_lritems  s.    		zGrammar.build_lritems)r   r   r   r   rI   rC   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r	   r	   r
   r     s    $T@#%;r   c               @   s   e  Z d  Z d S)VersionErrorN)r   r   r   r	   r	   r	   r
   r     s   r   c               @   s@   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 S)
LRTablec             C   s(   d  |  _  d  |  _ d  |  _ d  |  _ d  S)N)rY   r[   rW   	lr_method)r   r	   r	   r
   r     s    			zLRTable.__init__c             C   s   t  | t j  r | } n t d |  t j | } | j t k rQ t d   | j	 |  _
 | j |  _ g  |  _ x' | j D] } |  j j t |    q| W| j |  _ | j S)Nz	import %sz&yacc table file version is out of date)rA   types
ModuleTypeexecrm   modulesZ_tabversion__tabversion__r   Z
_lr_actionrY   Z_lr_gotor[   rW   Z_lr_productionsra   r   Z
_lr_methodr   Z_lr_signature)r   moduler   r   r	   r	   r
   
read_table  s    		zLRTable.read_tablec             C   s  y d d  l  } Wn t k
 r0 d d  l } Yn Xt j j |  sI t  t | d  } | j |  } | t k r t	 d   | j |  |  _
 | j |  } | j |  |  _ | j |  |  _ | j |  } g  |  _ x$ | D] } |  j j t |    q W| j   | S)Nr   rbz&yacc table file version is out of date)cPickleImportErrorpickleospathexistsopenloadr   r   r   rY   r[   rW   ra   r   close)r   filenamer   Zin_fZ
tabversion	signaturerX   r   r	   r	   r
   read_pickle  s(    	
zLRTable.read_picklec             C   s%   x |  j  D] } | j |  q
 Wd  S)N)rW   r   )r   r   r   r	   r	   r
   bind_callables  s    zLRTable.bind_callablesN)r   r   r   r   r   r   r  r	   r	   r	   r
   r     s   r   c          	   C   sn   i  } x |  D] } d | | <q Wg  } i  } x: |  D]2 } | | d k r4 t  | | | | |  | |  q4 W| S)Nr   )traverse)XRFPNr   r;   Fr	   r	   r
   digraph  s     r  c          	   C   sT  | j  |   t |  } | | |  <| |   | |  <| |   } x | D] }	 | |	 d k rx t |	 | | | | | |  t | |  | |	  | |  <x; | j |	 g   D]' }
 |
 | |  k r | |  j  |
  q WqF W| |  | k rPt | | d <| |  | | d <| j   } x< | |  k rOt | | d <| |  | | d <| j   } qWd  S)Nr   rc   r}   r}   r}   r}   )ra   r   r  minr   MAXINTr~   )r   r  r;   r  r  r  r  drelyaelementr	   r	   r
   r    s(    
r  c               @   s   e  Z d  Z d S)	LALRErrorN)r   r   r   r	   r	   r	   r
   r  )  s   r  c               @   s   e  Z d  Z d 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 d  d!  Z d d" d#  Z d S)$LRGeneratedTabler   Nc             C   s   | d k r t  d |   | |  _ | |  _ | s= t   } | |  _ i  |  _ i  |  _ | j |  _ i  |  _	 i  |  _
 d |  _ d |  _ d |  _ g  |  _ g  |  _ g  |  _ |  j j   |  j j   |  j j   |  j   d  S)NSLRr   zUnsupported method %sr   )r  r   )r  grammarr   r   logrY   r[   r   rW   lr_goto_cachelr0_cidhash
_add_countZsr_conflictZrr_conflictZ	conflictssr_conflictsrr_conflictsr   r   r   lr_parse_table)r   r  methodr  r	   r	   r
   r   4  s,    														zLRGeneratedTable.__init__c             C   s   |  j  d 7_  | d  d   } d } xu | r d } xb | D]Z } xQ | j D]F } t | d d  |  j  k ro qK | j | j  |  j  | _ d } qK Wq; Wq( W| S)Nrc   TF	lr0_addedr   )r  r   rK   ra   r   r  )r   IJr   rG   r   r	   r	   r
   lr0_closureY  s    	zLRGeneratedTable.lr0_closurec       	      C   s*  |  j  j t |  | f  } | r( | S|  j  j |  } | sS i  } | |  j  | <g  } xp | D]h } | j } | r` | j | k r` | j t |   } | s i  } | | t |  <| j |  | } q` W| j d  } | s| r|  j |  } | | d <n
 | | d <| |  j  t |  | f <| S)Nz$end)r  r   r!   r   r   ra   r  )	r   r  r   gr=   Zgsr   rB   s1r	   r	   r
   lr0_gotos  s2    	

zLRGeneratedTable.lr0_gotoc       	      C   s*  |  j  |  j j d j g  g } d } x+ | D]# } | |  j t |  <| d 7} q/ Wd } x | t |  k  r%| | } | d 7} i  } x, | D]$ } x | j D] } d  | | <q Wq Wxe | D]] } |  j | |  } | s t |  |  j k r q t |  |  j t |  <| j	 |  q Wq_ W| S)Nr   rc   )
r  r  r   r   r  r!   r   r   r"  ra   )	r   CrF   r  Zasymsiir=   r   r   r	   r	   r
   	lr0_items  s(    "

zLRGeneratedTable.lr0_itemsc             C   s   t    } d } x xq |  j j d d   D]Y } | j d k rQ | j | j  q) x. | j D] } | | k r[ Pq[ W| j | j  q) Wt |  | k r Pt |  } q W| S)Nr   rc   )r   r  r   r   r   r   r   )r   nullableZnum_nullabler   r   r	   r	   r
   compute_nullable_nonterminals  s    	z.LRGeneratedTable.compute_nullable_nonterminalsc             C   s   g  } x t  |  D]| \ } } xm | D]e } | j | j d k  r& | | j | j d f } | d |  j j k r& | | k r& | j |  q& Wq W| S)Nrc   )r   r   r   r   r  r   ra   )r   r#  transZstatenorh   r   r   r	   r	   r
   find_nonterminal_transitions  s    z-LRGeneratedTable.find_nonterminal_transitionsc             C   s   i  } | \ } } g  } |  j  | | |  } xc | D][ }	 |	 j |	 j d k  r5 |	 j |	 j d }
 |
 |  j j k r5 |
 | k r5 | j |
  q5 W| d k r | |  j j d j d k r | j d  | S)Nrc   r   z$end)r"  r   r   r   r  r   ra   r   )r   r#  r(  r&  Zdr_setrh   r  termsr   r   r  r	   r	   r
   dr_relation  s    )zLRGeneratedTable.dr_relationc             C   s   g  } | \ } } |  j  | | |  } |  j j t |  d  } xW | D]O }	 |	 j |	 j d k  rJ |	 j |	 j d }
 |
 | k rJ | j | |
 f  qJ W| S)Nrc   r}   )r"  r  r   r!   r   r   r   ra   )r   r#  r(  emptyr  rh   r  r   rG   r   r  r	   r	   r
   reads_relation	  s    zLRGeneratedTable.reads_relationc             C   sT  i  } i  } i  } x | D] } d | | <q Wx| D]\ } }	 g  }
 g  } x| | D]} | j  |	 k ro qW | j } | } x | | j d k  r\| d } | j | } | | f | k r(| d } x^ | | j k  r| j | |  j j k r P| j | | k rP| d } q W| j | | f  |  j | | |  } |  j j	 t
 |  d  } q Wx | | D] } | j  | j  k rqh| j | j k rqhd } xO | | j k  r| j | | j | d k rP| d } qW|
 j | | f  qhWqW Wx; | D]3 } | | k rg  | | <| | j | |	 f  qW|
 | | |	 f <q4 W| | f S)Nrc   r   r}   )r   r   r   r   r  r   ra   r"  r  r   r!   )r   r#  r(  r&  ZlookdictZincludedictZdtransr   rh   r  ZlookbZincludesr   r   rG   Zlir   r"   rF   r	   r	   r
   compute_lookback_includesC	  sX    	


z*LRGeneratedTable.compute_lookback_includesc                sF       f d d   }     f d d   } t  | | |  } | S)Nc                s    j    |    S)N)r+  )r   )r#  r&  r   r	   r
   <lambda>	  s    z4LRGeneratedTable.compute_read_sets.<locals>.<lambda>c                s    j    |    S)N)r-  )r   )r#  r&  r   r	   r
   r/  	  s    )r  )r   r#  ntransr&  r  r  r  r	   )r#  r&  r   r
   compute_read_sets	  s    z"LRGeneratedTable.compute_read_setsc                s:    f d d   }   f d d   } t  | | |  } | S)Nc                s     |  S)Nr	   )r   )readsetsr	   r
   r/  	  s    z6LRGeneratedTable.compute_follow_sets.<locals>.<lambda>c                s     j  |  g   S)N)r   )r   )inclsetsr	   r
   r/  	  s    )r  )r   r0  r2  r3  r  r  r  r	   )r3  r2  r
   compute_follow_sets	  s    z$LRGeneratedTable.compute_follow_setsc       	      C   s   x | j    D] \ } } xz | D]r \ } } | | j k rH g  | j | <| j | g   } x5 | D]- } | | j | k ra | j | j |  qa Wq  Wq Wd  S)N)re   r   r   ra   )	r   Z	lookbacksZ	followsetr(  Zlbrh   r   r   r  r	   r	   r
   add_lookaheads	  s    zLRGeneratedTable.add_lookaheadsc             C   st   |  j    } |  j |  } |  j | | |  } |  j | | |  \ } } |  j | | |  } |  j | |  d  S)N)r'  r)  r1  r.  r4  r5  )r   r#  r&  r(  r2  ZlookdZincludedZ
followsetsr	   r	   r
   add_lalr_lookaheads	  s    z$LRGeneratedTable.add_lalr_lookaheadsc       $   	   C   s  |  j  j } |  j  j } |  j } |  j } |  j } i  } | j d |  j  |  j   } |  j d k rt |  j	 |  d } x`| D]X}	 g  }
 i  } i  } i  } | j d  | j d |  | j d  x$ |	 D] } | j d | j
 |  q W| j d  x|	 D]} | j | j d k r| j d k rFd | d	 <| | d	 <q	|  j d k re| j | } n |  j  j | j } x| D]v} |
 j | | d
 | j
 | f f  | j |  } | d  k	 r| d k r| j | d  \ } } | | j
 j \ } } | | k  s!| | k r| d k r| j
 | | <| | | <| rp| rp| j d |  |  j j | | d f  | | j
 j d 7_ q| | k r| d k rd  | | <q| s| j d |  |  j j | | d f  q| d k  r| | } | | j
 } | j | j k rj| j
 | | <| | | <| | } } | | j
 j d 7_ | | j
 j d 8_ n | | } } |  j j | | | f  | j d | | | j
 | |  qt d |   q| j
 | | <| | | <| | j
 j d 7_ qWq| j } | j | d } | |  j  j k r|  j |	 |  } |  j j t |  d  } | d k r|
 j | | d | f  | j |  } | d  k	 r| d k r| | k rt d |   q	| d k  r| j | d  \ } } | | | j
 j \ } } | | k s#| | k r| d k r| | | j
 j d 8_ | | | <| | | <| s| j d |  |  j j | | d f  q| | k r| d k rd  | | <q| r| r| j d |  |  j j | | d f  q	t d |   q| | | <| | | <qWi  } xV |
 D]N \ } } } | | k r| | | k r| j d | |  d | | | f <qW| j d  d } xn |
 D]f \ } } } | | k r| | | k	 r| | f | k r| j d | |  d } d | | | f <qW| r| j d  i  }  x> |	 D]6 }! x- |! j D]" }" |" |  j  j k r d  |  |" <q WqWxd |  D]\ }# |  j |	 |#  } |  j j t |  d  } | d k rQ| | |# <| j d |# |  qQW| | | <| | | <| | | <| d 7} q Wd  S)NzParsing method: %sr   r   rw   zstate %dz    (%d) %src   zS'z$endzreduce using rule %d (%s)r   r   z3  ! shift/reduce conflict for %s resolved as reducereducer   z2  ! shift/reduce conflict for %s resolved as shiftZshiftz=  ! reduce/reduce conflict for %s resolved using rule %d (%s)zUnknown conflict in state %dzshift and go to state %dz Shift/shift conflict in state %dz    %-15s %sz  ! %-15s [ %s ]z"    %-30s shift and go to state %d)r   r   r}   )r   r   r}   ) r  r   r   r[   rY   r  r   r   r%  r6  r   r   r   r   r   r   ra   r   r   r  r   r   r  r  r   r   r"  r  r!   r   r   r   )$r   r   r   r\   rZ   r  Zactionpr#  str  ZactlistZ	st_actionZ
st_actionpZst_gotor   Zlaheadsr  r"   ZsprecZslevelZrprecZrlevelZoldpZppZchosenpZrejectprF   r   rG   Z	_actprintr   Znot_usedZnkeysr$  r=   rB   r	   r	   r
   r  	  s    			
#$

	
	$






zLRGeneratedTable.lr_parse_tablerw   c             C   s  t  | t j  r t d   | j d  d } t j j | |  d } yPt | d  } | j	 d t j j
 |  t |  j | f  d } | ri  } x |  j j   D]v \ }	 }
 xg |
 j   D]Y \ } } | j |  } | s g  g  f } | | | <| d j |	  | d j |  q Wq W| j	 d  x | j   D] \ } } | j	 d	 |  x# | d D] } | j	 d
 |  qfW| j	 d  x# | d D] } | j	 d
 |  qW| j	 d  q>W| j	 d  | j	 d  n\ | j	 d  x? |  j j   D]. \ } } | j	 d | d | d | f  qW| j	 d  | ri  } x |  j j   D]v \ }	 }
 xg |
 j   D]Y \ } } | j |  } | sg  g  f } | | | <| d j |	  | d j |  qsWqZW| j	 d  x | j   D] \ } } | j	 d	 |  x# | d D] } | j	 d
 |  qW| j	 d  x# | d D] } | j	 d
 |  qIW| j	 d  qW| j	 d  | j	 d  n\ | j	 d  x? |  j j   D]. \ } } | j	 d | d | d | f  qW| j	 d  | j	 d  x |  j D]y } | j rX| j	 d | j | j | j | j t j j
 | j  | j f  q| j	 d t |  | j | j f  qW| j	 d  | j   Wn( t k
 r} z   WYd  d  } ~ Xn Xd  S)Nz"Won't overwrite existing tabmoduler   rc   z.pywzu
# %s
# This file is automatically generated. Do not edit.
_tabversion = %r

_lr_method = %r

_lr_signature = %r
    r   z
_lr_action_items = {z%r:([z%r,z],[z]),z}
z
_lr_action = {}
for _k, _v in _lr_action_items.items():
   for _x,_y in zip(_v[0],_v[1]):
      if not _x in _lr_action:  _lr_action[_x] = {}
      _lr_action[_x][_k] = _y
del _lr_action_items
z
_lr_action = { z(%r,%r):%r,z
_lr_goto_items = {z
_lr_goto = {}
for _k, _v in _lr_goto_items.items():
   for _x, _y in zip(_v[0], _v[1]):
       if not _x in _lr_goto: _lr_goto[_x] = {}
       _lr_goto[_x][_k] = _y
del _lr_goto_items
z
_lr_goto = { z_lr_productions = [
z  (%r,%r,%d,%r,%r,%d),
z  (%r,%r,%d,None,None,None),
z]
r}   )rA   r   r   IOErrorsplitr   r   r   r   r   basenamer   r   rY   re   r   ra   r[   rW   r   r7   r   r   r   r   r   )r   	tabmodule	outputdirr   Zbasemodulenamer   r   Zsmallerre   r=   Zndr   rD   rF   r   r   er	   r	   r
   write_table
  s    &

&

&	)*zLRGeneratedTable.write_tablec             C   sW  y d d  l  } Wn t k
 r0 d d  l } Yn Xt | d  } | j t | t  | j |  j | t  | j | | t  | j |  j | t  | j |  j	 | t  g  } x |  j
 D]z } | j r
| j | j | j | j | j t j j | j  | j f  q | j t |  | j | j d  d  d  f  q W| j | | t  Wd  QRXd  S)Nr   wb)r   r   r   r   dumpr   pickle_protocolr   rY   r[   rW   r   ra   r7   r   r   r   r   r<  r   r   )r   r   r   r   ZoutfZoutpr   r	   r	   r
   pickle_table   s     	@/zLRGeneratedTable.pickle_table)r   r   r   r   r  r"  r%  r'  r)  r+  r-  r.  r1  r4  r5  r6  r  r@  rD  r	   r	   r	   r
   r  3  s    %#8+Pzr  c             C   sD   t  j |   } | j j   } | j | j k r@ | j | j  | S)N)rm   	_getframe	f_globalscopyf_localsupdate)Zlevelsr   Zldictr	   r	   r
   get_caller_module_dictC  s
    rJ  c             C   sT  g  } |  j    } d  } | } x/| D]'} | d 7} | j   } | sJ q% y | d d k r | sy t d | | f   | }	 | d d   }
 nX | d }	 |	 } | d d   }
 | d } | d k r | d k r t d | | f   | j | | |	 |
 f  Wq% t k
 r  Yq% t k
 rKt d	 | | | j   f   Yq% Xq% W| S)
Nrc   r   |z%s:%d: Misplaced '|'r   :z::=z!%s:%d: Syntax error. Expected ':'z%s:%d: Syntax error in rule %r)
splitlinesr;  rU   ra   	Exceptionstrip)docr   r   r  ZpstringsZlastpZdlineZpsr   r   r   Zassignr	   r	   r
   parse_grammarO  s6    


(rQ  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 S) ParserReflectNc             C   sp   | |  _  d  |  _ d  |  _ d  |  _ t   |  _ g  |  _ d |  _ | d  k rc t t	 j
  |  _ n	 | |  _ d  S)NF)r   r   
error_functokensr   r   r  r   r   rm   rn   r  )r   r   r  r	   r	   r
   r   y  s    						zParserReflect.__init__c             C   s6   |  j    |  j   |  j   |  j   |  j   d  S)N)	get_startget_error_func
get_tokensget_precedenceget_pfunctions)r   r	   r	   r
   get_all  s
    



zParserReflect.get_allc             C   sC   |  j    |  j   |  j   |  j   |  j   |  j   |  j S)N)validate_startvalidate_error_funcvalidate_tokensvalidate_precedencevalidate_pfunctionsvalidate_modulesr   )r   r	   r	   r
   validate_all  s    





zParserReflect.validate_allc             C   s   g  } y |  j  r" | j |  j   |  j rQ | j d j d d   |  j D   |  j rs | j d j |  j   x, |  j D]! } | d r} | j | d  q} WWn t t f k
 r Yn Xd j |  S)Nrw   c             S   s   g  |  ] } d  j  |   q S)rw   )r   )r?   r   r	   r	   r
   r@     s   	 z+ParserReflect.signature.<locals>.<listcomp>rx   r   )r   ra   r   r   rT  pfuncs	TypeError
ValueError)r   partsr   r	   r	   r
   r     s    		&	
zParserReflect.signaturec             C   s   t  j d  } x |  j D] } y t j |  \ } } Wn t k
 rO w Yn Xi  } x t |  D] \ } } | d 7} | j |  } | rc | j d  } | j	 |  }	 |	 s | | | <qc t j
 |  }
 |  j j d |
 | | |	  qc Wq Wd  S)Nz\s*def\s+(p_[a-zA-Z_0-9]*)\(rc   z;%s:%d: Function %s redefined. Previously defined on line %d)recompiler   inspectZgetsourcelinesr:  r   r   groupr   getsourcefiler  r   )r   Zfrer   linesZlinenZ	counthashr   r   r   prevr   r	   r	   r
   r`    s$    
zParserReflect.validate_modulesc             C   s   |  j  j d  |  _ d  S)Nr   )r   r   r   )r   r	   r	   r
   rU    s    zParserReflect.get_startc             C   s5   |  j  d  k	 r1 t |  j  t  s1 |  j j d  d  S)Nz'start' must be a string)r   rA   string_typesr  r   )r   r	   r	   r
   r[    s    zParserReflect.validate_startc             C   s   |  j  j d  |  _ d  S)Np_error)r   r   rS  )r   r	   r	   r
   rV    s    zParserReflect.get_error_funcc             C   s   |  j  r t |  j  t j  r' d } n; t |  j  t j  rE d } n |  j j d  d |  _ d  S|  j  j j } |  j  j j	 } t
 j |  j   } |  j j |  |  j  j j | } | d k r |  j j d | |  d |  _ d  S)Nr   rc   z2'p_error' defined, but is not a function or methodTz$%s:%d: p_error() requires 1 argument)rS  rA   r   FunctionType
MethodTyper  r   __code__co_firstlinenoco_filenamerh  	getmoduler   r   co_argcount)r   ZismethodZelineZefiler   Zargcountr	   r	   r
   r\    s     				z!ParserReflect.validate_error_funcc             C   s   |  j  j d  } | s5 |  j j d  d |  _ d  St | t t f  sg |  j j d  d |  _ d  S| s |  j j d  d |  _ d  S| |  _ d  S)NrT  zNo token list is definedTztokens must be a list or tupleztokens is empty)r   r   r  r   rA   rf   r   rT  )r   rT  r	   r	   r
   rW    s    			zParserReflect.get_tokensc             C   sy   d |  j  k r, |  j j d  d |  _ d  St   } x= |  j  D]2 } | | k rd |  j j d |  | j |  q? Wd  S)Nr   z.Illegal token name 'error'. Is a reserved wordTzToken %r multiply defined)rT  r  r   r   r   r   )r   r   rB   r	   r	   r
   r]    s    		zParserReflect.validate_tokensc             C   s   |  j  j d  |  _ d  S)Nr   )r   r   r   )r   r	   r	   r
   rX    s    zParserReflect.get_precedencec             C   sl  g  } |  j  r_t |  j  t t f  sD |  j j d  d |  _ d  Sxt |  j   D]\ } } t | t t f  s |  j j d  d |  _ d  St |  d k  r |  j j d |  d |  _ d  S| d } t | t  s |  j j d  d |  _ d  Sx^ | d d   D]L } t | t  s=|  j j d	  d |  _ d  S| j	 | | | d f  qWqT W| |  _
 d  S)
Nz"precedence must be a list or tupleTzBad precedence tabler   z?Malformed precedence entry %s. Must be (assoc, term, ..., term)r   z)precedence associativity must be a stringrc   z precedence items must be strings)r   rA   rf   r   r  r   r   r   rm  ra   preclist)r   rv  r   r   r   r   r	   r	   r
   r^    s6    				
		"z!ParserReflect.validate_precedencec             C   s   g  } x |  j  j   D] \ } } | j d  s | d k rA q t | t j t j f  r t | d | j j	  } t
 j |  } | j | | | | j f  q W| j d d d    | |  _ d  S)Np_rn  rr  keyc             S   s&   |  d t  |  d  |  d |  d f S)Nr   rc   r   r   )r7   )Z
p_functionr	   r	   r
   r/  D  s    z.ParserReflect.get_pfunctions.<locals>.<lambda>)r   re   
startswithrA   r   ro  rp  rK   rq  rr  rh  rt  ra   __doc__sortrb  )r   Zp_functionsr   itemr   r   r	   r	   r
   rY  7  s     zParserReflect.get_pfunctionsc             C   s  g  } t  |  j  d k r8 |  j j d  d |  _ d  Sx|  j D]|\ } } } } t j |  } |  j | } t | t j	  r d } n d } | j
 j | k r |  j j d | | | j  d |  _ qB | j
 j | k  r|  j j d | | | j  d |  _ qB | j s-|  j j d | | | j  qB y: t | | |  }	 x! |	 D] }
 | j | |
 f  qIWWnD t k
 r} z$ |  j j t |   d |  _ WYd  d  } ~ Xn X|  j j |  qB Wx>|  j j   D]-\ } } | j d	  rt | t j t j	 f  rq| j d
  rq| j d	  rK| d k rK|  j j d |  t | t j  ro| j
 j d k st | t j	  r| j j
 j d k r| j ryK | j j d  } | d d k r|  j j d | j
 j | j
 j |  Wqt k
 rYqXqW| |  _ d  S)Nr   z+no rules of the form p_rulename are definedTr   rc   z%%s:%d: Rule %r has too many argumentsz#%s:%d: Rule %r requires an argumentzA%s:%d: No documentation string specified in function %r (ignored)rw  Zt_rn  z%r not defined as a functionrx   rL  z9%s:%d: Possible grammar rule %r defined without p_ prefix)r   rb  r  r   rh  rj  r   rA   r   rp  rq  ru  r   rz  r   rQ  ra   rU   r7   r   r   re   ry  ro  __func__r;  rs  rr  r   r  )r   r  r   r   r   rP  r   r   ZreqargsZparsed_gr   r?  rB   rD   r	   r	   r
   r_  L  s\    			*$'		z!ParserReflect.validate_pfunctions)r   r   r   r   rZ  ra  r   r`  rU  r[  rV  r\  rW  r]  rX  r^  rY  r_  r	   r	   r	   r
   rR  x  s   
rR  c       <   O      s  | d  k r t  } | r d } | d  k r9 t t j  }   r   f d d   t    D } t |  } d | k r t j | d j | d <n t d  } |	 d  k rAt	 | t
 j  r | j } nh d | k r | d } nO | j d  } d j | d  d6   } t d	 |  t t j | d d
  } t j j |  }	 | j d  } | rt	 | t  rd | k r| d | } | d  k	 r| | d <t | d | } | j   | j rt d   | j   } y t   } | r| j |  } n | j |  } | s| | k ry3 | j | j  t | | j   } | j! a! | SWn5 t" k
 r} z | j# d |  WYd  d  } ~ Xn XWnI t$ k
 r} z | j# t |   WYd  d  } ~ Xn t% k
 rYn X|
 d  k r]| rTy( t t& t j j |	 |  d   }
 Wq]t' k
 rP} z% | j# d | | f  t(   }
 WYd  d  } ~ Xq]Xn	 t(   }
 |
 j) d t*  d } | j+   rt d   | j  s| j# d  t, | j-  } xi | j. D]^ \ } } } y | j/ | | |  Wqt0 k
 r} z | j# d |  WYd  d  } ~ XqXqWx | j1 D]y \ } } | \ }  }! }" }# y | j2 |" |# | |  |!  Wq&t0 k
 r} z | j d |  d } WYd  d  } ~ Xq&Xq&Wy0 | d  k r| j3 | j4  n | j3 |  Wn> t0 k
 r} z | j t |   d } WYd  d  } ~ Xn X| r&t d   | j5   }$ x6 |$ D]. \ }% }& | j d |& j6 |& j7 |%  d } q9W| j8   }' |' r|
 j) d
  |
 j) d  |
 j) d
  x. |' D]& } | j# d |  |
 j) d |  qW| r5|
 j) d
  |
 j) d  |
 j) d
  x0 t9 | j:  D] \ }( }) |
 j) d |( |)  qW| j;   }* x- |* D]% }& | j# d |& j6 |& j7 |& j<  qHWt= |'  d k r| j# d  t= |'  d k r| j# d t= |'   t= |*  d k r| j# d   t= |*  d k r| j# d! t= |*   | r|
 j) d
  |
 j) d"  |
 j) d
  t> | j?  }+ |+ j@   x> |+ D]6 } |
 j) d# | d$ j d% d   | j? | D   qLW|
 j) d
  |
 j) d&  |
 j) d
  t> | jA  }, |, j@   x> |, D]6 }- |
 j) d# |- d$ j d' d   | jA |- D   qW|
 j) d
  | rz| jB   }. x |. D] }/ | j# d( |/  q-W| jC   }0 x$ |0 D] }1 | j d) |1  d } qZW| jD   }2 x- |2 D]% \ } } | j d* | |  d } qW| rt d   | r| jE d+ |   tF | |  |
  } | r	t= | jG  }3 |3 d k r!	| j# d,  n |3 d k r=	| j# d- |3  t= | jH  }4 |4 d k rh	| j# d.  n |4 d k r	| j# d/ |4  | r| jG s	| jH r|
 j# d
  |
 j# d0  |
 j# d
  x0 | jG D]% \ }5 }6 }7 |
 j# d1 |6 |5 |7  q	WtI   }8 x | jH D] \ }5 }9 }: |5 tJ |9  tJ |:  f |8 k r<
q	
|
 j# d2 |5 |9  |
 j# d3 |: |5  | j# d2 |5 |9  | j# d3 |: |5  |8 jK |5 tJ |9  tJ |:  f  q	
Wg  }; x] | jH D]R \ }5 }9 }: |: jL r
|: |; k r
|
 j# d4 |:  | j# d4 |:  |; jM |:  q
W| rpy | jN | |	 |  Wn< t' k
 ro} z | j# d5 | | f  WYd  d  } ~ Xn X| ry | jO | |  Wn< t' k
 r} z | j# d5 | | f  WYd  d  } ~ Xn X| j | j  t | | j   } | j! a! | S)7Nr   c                s%   g  |  ] } | t    |  f  q Sr	   )rK   )r?   r   )r   r	   r
   r@     s   	 zyacc.<locals>.<listcomp>__file__r   r   r   rc   z	import %srw   __package__r   r  zUnable to build parserz.There was a problem loading the table file: %rr9  zCouldn't open %r. %sz5Created by PLY version %s (http://www.dabeaz.com/ply)Fz no p_error() function is definedz%sTz;%s:%d: Symbol %r used, but not defined as a token or a rulezUnused terminals:zToken %r defined, but not usedz    %sr   zRule %-5d %sz$%s:%d: Rule %r defined, but not usedzThere is 1 unused tokenzThere are %d unused tokenszThere is 1 unused rulezThere are %d unused rulesz'Terminals, with rules where they appearz
%-20s : %srx   c             S   s   g  |  ] } t  |   q Sr	   )r7   )r?   r=   r	   r	   r
   r@   G  s   	 z*Nonterminals, with rules where they appearc             S   s   g  |  ] } t  |   q Sr	   )r7   )r?   r=   r	   r	   r
   r@   O  s   	 zSymbol %r is unreachablez)Infinite recursion detected for symbol %rz0Precedence rule %r defined for unknown symbol %rzGenerating %s tablesz1 shift/reduce conflictz%d shift/reduce conflictsz1 reduce/reduce conflictz%d reduce/reduce conflictsz
Conflicts:z7shift/reduce conflict for %s in state %d resolved as %sz;reduce/reduce conflict in state %d resolved using rule (%s)zrejected rule (%s) in state %dzRule (%s) is never reducedzCouldn't create %r. %sr}   )P
tab_moduler   rm   rn   dirdictr   r~  rJ  rA   r   r   r;  r   r   rK   r   r   dirnamer   r7   rR  rZ  r   r   r   r   r   r   r  r   rV   rS  ru   rN  r   r   r   r   r:  r   r   __version__ra  r   rT  rv  r   r   r  r   r   r   r   r   r   r   r   r   r   r   r   rf   r   r{  r   r   r   r   r   r  r  r  r   r!   r   r   ra   r@  rD  )<r  r   r   r=  r   Zcheck_recursionoptimizeZwrite_tablesZ	debugfiler>  ZdebuglogZerrorlogZ
picklefileZ_itemsr   Zsrcfilere  ZpkgnameZpkgZpinfor   ZlrZread_signaturer3   r?  errorsr  r   r   r   funcnameZgramr   r   r   r   r   rb   r   r   rB   r   r   r*  ZnontermsZnontermZunreachableur   infZunused_precZnum_srZnum_rrrh   r   Z
resolutionZalready_reportedruleZrejectedZwarned_neverr	   )r   r
   yacc  s   

			'%(		'
#
4
4

	!&**	r  )<rf  r   rm   Zos.pathr   rh  base64r(   r  r   Z	yaccdebugZ
debug_filer  Z
default_lrr   rk   r   rC  version_infoZ
basestringrm  r7   maxsizer
  objectr   r   rN  r   r%   r'   r+   r/   r-   r*   r,   r.   r0   r4   r5   r9   rV   rg  r   r   r   r   r   r   r   r   r   r  r  r  r  rJ  rQ  rR  r  r	   r	   r	   r
   <module>>   s~   		

4   H. T
   ) 