3
j\5                @   s"  d dl Z d dlZd dlmZmZ dgZG dd deZdZe j	Z
G dd deZG d	d
 d
ZG dd dZG dd deZG dd deZdd ZG dd deZG dd deZdd Zdd ZG dd deZG dd deZdd  ZG d!d" d"eZG d#d$ d$eZG d%d ded&ZdS )'    N)OrderedDictdefaultdictParserc               @   s   e Zd ZdZdS )	YaccErrorz9
    Exception raised for yacc-related build errors.
    N)__name__
__module____qualname____doc__ r
   r
   >/u1/h0/jkinne/public_html/cs420-s2019/code/sly-0.4/sly/yacc.pyr   (   s   r      c               @   s4   e Zd Zdd Zdd ZeZdd Zdd ZeZd	S )
	SlyLoggerc             C   s
   || _ d S )N)f)selfr   r
   r
   r   __init__?   s    zSlyLogger.__init__c             O   s   | j j|| d  d S )N
)r   write)r   msgargskwargsr
   r
   r   debugB   s    zSlyLogger.debugc             O   s   | j jd||  d  d S )Nz	WARNING: r   )r   r   )r   r   r   r   r
   r
   r   warningG   s    zSlyLogger.warningc             O   s   | j jd||  d  d S )NzERROR: r   )r   r   )r   r   r   r   r
   r
   r   errorJ   s    zSlyLogger.errorN)	r   r   r   r   r   infor   r   Zcriticalr
   r
   r
   r   r   >   s   r   c               @   s   e Zd Zdd Zdd ZdS )
YaccSymbolc             C   s   | j S )N)type)r   r
   r
   r   __str__Z   s    zYaccSymbol.__str__c             C   s   t | S )N)str)r   r
   r
   r   __repr__]   s    zYaccSymbol.__repr__N)r   r   r   r   r   r
   r
   r
   r   r   Y   s   r   c                   sb   e Zd ZdZdddZdd Zd	d
 Zdd Zedd Z	edd Z
dd Z fddZ  ZS )YaccProduction_slice_namemap_stackNc             C   s   || _ i | _|| _d S )N)r    r!   r"   )r   sstackr
   r
   r   r   j   s    zYaccProduction.__init__c             C   s$   |dkr| j | jS | j| jS d S )Nr   )r    valuer"   )r   nr
   r
   r   __getitem__o   s    zYaccProduction.__getitem__c             C   s&   |dkr|| j | _n|| j| _d S )Nr   )r    r%   r"   )r   r&   vr
   r
   r   __setitem__u   s    zYaccProduction.__setitem__c             C   s
   t | jS )N)lenr    )r   r
   r
   r   __len__{   s    zYaccProduction.__len__c             C   s<   x.| j D ]$}t|trqt|dd }|r|S qW tdd S )NlinenozNo line number found)r    
isinstancer   getattrAttributeError)r   tokr,   r
   r
   r   r,   ~   s    
zYaccProduction.linenoc             C   s@   x2| j D ](}t|trqt|dd }|d k	r|S qW tdd S )NindexzNo index attribute found)r    r-   r   r.   r/   )r   r0   r1   r
   r
   r   r1      s    
zYaccProduction.indexc             C   sJ   || j kr| j| j |  jS ddj| j  d }td| d| dd S )N{z, }z
No symbol z. Must be one of .)r!   r    r%   joinr/   )r   nameZnamesetr
   r
   r   __getattr__   s    
zYaccProduction.__getattr__c                s2   |d d dkr t  j|| ntd|d S )N   _z&Can't reassign the value of attribute )super__setattr__r/   )r   r6   r%   )	__class__r
   r   r;      s    zYaccProduction.__setattr__)r    r!   r"   )N)r   r   r   	__slots__r   r'   r)   r+   propertyr,   r1   r7   r;   __classcell__r
   r
   )r<   r   r   h   s   


r   c               @   sJ   e Zd 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S )
Productionr   rightN c             C   s   || _ t|| _|| _|| _|| _|| _|| _t| j| _g | _	t
t}x:t| jD ],\}	}
||
 j|	 |
| j	krT| j	j|
 qTW i }xT|j D ]H\}}t|dkr|d ||< qx$t|D ]\}	}|||t|	 < qW qW || _g | _d | _d S )Nr8   r   )r6   tupleprodnumberfuncfilelineprecr*   usymsr   list	enumerateappenditemsr   namemaplr_itemslr_next)r   rE   r6   rD   
precedencerF   rG   rH   Zsymmapr&   r#   mkeyindicesr1   r
   r
   r   r      s.    

zProduction.__init__c             C   sF   | j rd| jdj| j f }n| j d}| jd rB|d| j 7 }|S )Nz%s -> %s z -> <empty>r8   z  [precedence=%s, level=%d])rD   r6   r5   rI   )r   r#   r
   r
   r   r      s    
zProduction.__str__c             C   s   d|  dS )NzProduction()r
   )r   r
   r
   r   r      s    zProduction.__repr__c             C   s
   t | jS )N)r*   rD   )r   r
   r
   r   r+      s    zProduction.__len__c             C   s   t ddS )NZUsedr8   )RuntimeError)r   r
   r
   r   __nonzero__   s    zProduction.__nonzero__c             C   s
   | j | S )N)rD   )r   r1   r
   r
   r   r'      s    zProduction.__getitem__c             C   s   |t | jkrd S t| |}yt|j|d   |_W n ttfk
rR   g |_Y nX y|j|d  |_W n tk
r   d |_Y nX |S )Nr8   )r*   rD   LRItem	Prodnameslr_after
IndexErrorKeyError	lr_before)r   r&   pr
   r
   r   lr_item   s    
zProduction.lr_itemrA   r   )rb   NrB   r   )r   r   r   reducedr   r   r   r+   rY   r'   ra   r
   r
   r
   r   r@      s   
#r@   c               @   s$   e Zd Zdd Zdd Zdd ZdS )rZ   c             C   sZ   |j | _ t|j| _|j| _|| _i | _| jj|d t| j| _t| j| _|j	| _	d S )Nr4   )
r6   rK   rD   rE   lr_index
lookaheadsinsertrC   r*   rJ   )r   r`   r&   r
   r
   r   r   $  s    zLRItem.__init__c             C   s.   | j rd| jdj| j f }n| j d}|S )Nz%s -> %srV   z -> <empty>)rD   r6   r5   )r   r#   r
   r
   r   r   /  s    zLRItem.__str__c             C   s   d|  dS )NzLRItem(rW   r
   )r   r
   r
   r   r   6  s    zLRItem.__repr__N)r   r   r   r   r   r   r
   r
   r
   r   rZ   #  s   rZ   c             C   s:   t | d }x(|dkr4| | |kr*| | S |d8 }qW d S )Nr8   r   )r*   )Zsymbols	terminalsir
   r
   r   rightmost_terminal>  s    
ri   c               @   s   e Zd ZdS )GrammarErrorN)r   r   r   r
   r
   r
   r   rj   N  s   rj   c               @   s   e Zd Zdd Zdd Zdd Zdd Z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$d% Zd	S ))Grammarc             C   sf   d g| _ i | _i | _i | _x|D ]}g | j|< q W g | jd< i | _i | _i | _i | _t | _	d | _
d S )Nr   )Productionsr[   Prodmap	TerminalsNonterminalsFirstFollow
PrecedencesetUsedPrecedenceStart)r   rg   termr
   r
   r   r   R  s    

zGrammar.__init__c             C   s
   t | jS )N)r*   rl   )r   r
   r
   r   r+   v  s    zGrammar.__len__c             C   s
   | j | S )N)rl   )r   r1   r
   r
   r   r'   y  s    zGrammar.__getitem__c             C   sV   | j d gkstd|| jkr,td||dkrDtd|d||f| j|< d S )	Nz2Must call set_precedence() before add_production()z*Precedence already specified for terminal leftrA   nonassoczAssociativity of z- must be one of 'left','right', or 'nonassoc')rw   rA   rx   )rl   AssertionErrorrr   rj   )r   rv   assoclevelr
   r
   r   set_precedence  s    
zGrammar.set_precedenceNrB   r   c             C   s  || j kr$t| d| d|d|dkrFt| d| d|dxt|D ]z\}}|d dkrP|d |d krP|dd }t|dkrt| d| d	| d
|d|| j krg | j |< |||< qPqPW d|krf|d dkrt| d| d|d dkrt| d| d|d }	| jj|	}
|
sNt| d| d|	n| jj|	 |dd = nt|| j }	| jj|	d}
d||f }|| j	kr| j	| }t| d| d| dd|j
 d|j  t| j}|| jkrg | j|< xR|D ]J}|| j kr| j | j| n&|| jkr.g | j|< | j| j| qW t||||
|||}| jj| || j	|< y| j| j| W n" tk
r   |g| j|< Y nX d S )N:z: Illegal rule name z. Already defined as a tokenr   z. error is a reserved wordr   z'"r8   z: Literal token z	 in rule z may only be a single characterz%precz&: Syntax error. Nothing follows %%prec   zB: Syntax error. %prec can only appear at the end of a grammar rulez(: Nothing known about the precedence of rA   z%s -> %sz: Duplicate rule z. zPrevious definition at r   r   r   r   )rA   r   )rn   rj   rL   r*   rr   getrt   addri   rm   rG   rH   rl   ro   rM   r@   r[   r^   )r   prodnamesymsrF   rG   rH   r&   r#   cZprecnameZprodprecmaprS   Zpnumbertr`   r
   r
   r   add_production  s^    
 








zGrammar.add_productionc             C   sX   |s| j d j}|| jkr*td| dtdd|g| j d< | j| jd || _d S )Nr8   zstart symbol z
 undefinedr   zS')rl   r6   ro   rj   r@   rM   ru   )r   startr
   r
   r   	set_start  s    
zGrammar.set_startc                s>    fdd t   jd jd  fddjD S )Nc                sJ   | krd S j |  x.jj| g D ]}x|jD ]} | q2W q&W d S )N)r   r[   r   rD   )r#   r`   r)mark_reachable_from	reachabler   r
   r   r     s    
z5Grammar.find_unreachable.<locals>.mark_reachable_fromr   c                s   g | ]}| kr|qS r
   r
   ).0r#   )r   r
   r   
<listcomp>  s    z,Grammar.find_unreachable.<locals>.<listcomp>)rs   rl   rD   ro   )r   r
   )r   r   r   r   find_unreachable  s    zGrammar.find_unreachablec             C   s   i }x| j D ]}d||< qW d|d< x| jD ]}d||< q,W xpd}x`| jj D ]R\}}xH|D ]@}x |jD ]}|| shd}P qhW d}|r\|| sd||< d}P q\W qNW |s>P q>W g }	x@|j D ]4\}}
|
s|| jkr|| j kr|dkrq|	j| qW |	S )NTz$endFr   )rn   ro   r[   rN   rD   rM   )r   Z
terminatesr   r&   some_changeZplr`   r#   Zp_terminatesinfiniterv   r
   r
   r   infinite_cycles  s:    

zGrammar.infinite_cyclesc             C   sX   g }xN| j D ]D}|sqx8|jD ].}|| jkr|| jkr|dkr|j||f qW qW |S )Nr   )rl   rD   r[   rn   rM   )r   resultr`   r#   r
   r
   r   undefined_symbolsP  s    zGrammar.undefined_symbolsc             C   s8   g }x.| j j D ] \}}|dkr| r|j| qW |S )Nr   )rn   rN   rM   )r   Z
unused_tokr#   r(   r
   r
   r   unused_terminalsa  s
    zGrammar.unused_terminalsc             C   s<   g }x2| j j D ]$\}}|s| j| d }|j| qW |S )Nr   )ro   rN   r[   rM   )r   Zunused_prodr#   r(   r`   r
   r
   r   unused_rulesp  s    zGrammar.unused_rulesc             C   sD   g }x:| j D ]0}|| jkp"|| jks|j|| j | d f qW |S )Nr   )rr   rn   rt   rM   )r   ZunusedZtermnamer
   r
   r   unused_precedence  s
    zGrammar.unused_precedencec             C   s`   g }xV|D ]D}d}x2| j | D ]$}|dkr0d}q||kr|j| qW |rLq
P q
W |jd |S )NFz<empty>T)rp   rM   )r   Zbetar   xZx_produces_emptyr   r
   r
   r   _first  s    

zGrammar._firstc             C   s   | j r| j S x| jD ]}|g| j |< qW dg| j d< x| jD ]}g | j |< q<W xjd}xZ| jD ]P}xJ| j| D ]<}x6| j|jD ]&}|| j | kr~| j | j| d}q~W qlW q\W |sPP qPW | j S )Nz$endFT)rp   rn   ro   r[   r   rD   rM   )r   r   r&   r   r`   r   r
   r
   r   compute_first  s$    zGrammar.compute_firstc       
      C   sV  | j r| j S | js| j  x| jD ]}g | j |< q"W |sD| jd j}dg| j |<  xd}x| jdd  D ]}xt|jD ]\}}|| jkrx| j|j|d d  }d}xB|D ]:}	|	dkr|	| j | kr| j | j	|	 d}|	dkrd}qW |s|t
|jd krxx:| j |j D ]*}	|	| j | kr| j | j	|	 d}qW qxW qhW |sTP qTW | j S )Nr8   z$endFz<empty>T)rq   rp   r   ro   rl   r6   rL   rD   r   rM   r*   )
r   r   kdidaddr`   rh   BZfstZhasemptyr   r
   r
   r   compute_follow  s<    

zGrammar.compute_followc             C   s   x| j D ]}|}d}g }x|t|kr,d }ntt||}y| j|j|d   |_W n ttfk
rn   g |_Y nX y|j|d  |_W n tk
r   d |_Y nX ||_	|sP |j
| |}|d7 }qW ||_qW d S )Nr   r8   )rl   r*   rZ   r[   rD   r\   r]   r^   r_   rQ   rM   rP   )r   r`   Zlastlrirh   rP   Zlrir
   r
   r   build_lritems  s.    

zGrammar.build_lritemsc             C   s  g }|j d x.t| jD ] \}}|j d|dd|  qW | j }|rr|j d x|D ]}|j d|  qZW |j d x:t| jD ],}|j d|djd	d
 | j| D f  qW |j d x:t| jD ],}|j d|djdd
 | j| D f  qW |j d dj|S )Nz	Grammar:
zRule z<5drV   z
Unused terminals:
z    z*
Terminals, with rules where they appear:
z
%-20s : %sc             s   s   | ]}t |V  qd S )N)r   )r   r#   r
   r
   r   	<genexpr>C  s    z"Grammar.__str__.<locals>.<genexpr>z-
Nonterminals, with rules where they appear:
c             s   s   | ]}t |V  qd S )N)r   )r   r#   r
   r
   r   r   G  s    rB   r   )rM   rL   rl   r   sortedrn   r5   ro   )r   outr&   r`   r   rv   Znontermr
   r
   r   r   5  s"    



,
,
zGrammar.__str__)NrB   r   )N)N)r   r   r   r   r+   r'   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   rk   Q  s"   $
K
@#%
;!rk   c          	   C   sT   i }x| D ]}d||< q
W g }i }x,| D ]$}|| dkr(t ||||| || q(W |S )Nr   )traverse)XRFPNr   r$   Fr
   r
   r   digraphd  s    

r   c          	   C   s  |j |  t|}||| < || || < || }xr|D ]j}	||	 dkrXt|	|||||| t||  ||	 || < x.|j|	g D ]}
|
||  kr|||  j |
 q|W q4W ||  |krt||d < ||  ||d < |j }x2|| krt||d < ||  ||d < |j }qW d S )Nr   r8   r   r   r   r   )rM   r*   r   minr   MAXINTpop)r   r   r$   r   r   r   r   drelyaelementr
   r
   r   r   o  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 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 ) LRTablec             C   s   || _ i | _i | _|j| _i | _i | _d| _t | _	d| _
d| _g | _g | _g | _| j j  | j j  | j j  | j  i | _xH| jj D ]:\}}t|j }t|dkr|d dk r|d | j|< qW d S )Nr   r8   )grammar	lr_actionlr_gotorl   Zlr_productionslr_goto_cachelr0_cidhash
_add_countr   state_descriptionsZsr_conflictZrr_conflictZ	conflictssr_conflictsrr_conflictsr   r   r   lr_parse_tabledefaulted_statesrN   rK   valuesr*   )r   r   stateactionsrulesr
   r
   r   r     s,    



zLRTable.__init__c             C   sz   |  j d7  _ |d d  }d}xV|rtd}xH|D ]@}x:|jD ]0}t|dd| j krRq:|j|j | j |_d}q:W q.W q W |S )Nr8   TF	lr0_addedr   )r   r\   r.   rM   rQ   r   )r   IJr   jr   r
   r
   r   lr0_closure  s    
zLRTable.lr0_closurec       	      C   s   | j jt||f}|r|S | j j|}|s:i }|| j |< g }xP|D ]H}|j}|rD|j|krD|jt|}|s~i }||t|< |j| |}qDW |jd}|s|r| j|}||d< n||d< || j t||f< |S )Nz$end)r   r   idrQ   r_   rM   r   )	r   r   r   gr#   Zgsr`   r&   s1r
   r
   r   lr0_goto  s2    





zLRTable.lr0_gotoc       	      C   s   | j | jjd jgg}d}x"|D ]}|| jt|< |d7 }q"W d}x|t|k r|| }|d7 }i }x$|D ]}x|jD ]}d ||< qxW qlW xJ|D ]B}| j||}| st|| jkrqt|| jt|< |j	| qW qFW |S )Nr   r8   )
r   r   rl   rQ   r   r   r*   rJ   r   rM   )	r   Crh   r   Zasymsiir#   r   r   r
   r
   r   	lr0_items  s(    


zLRTable.lr0_itemsc             C   s   t  }d}xrxV| jjdd  D ]B}|jdkr:|j|j qx$|jD ]}||krBP qBW |j|j qW t||krrP t|}qW |S )Nr   r8   )rs   r   rl   r*   r   r6   rD   )r   nullableZnum_nullabler`   r   r
   r
   r   compute_nullable_nonterminals/  s    
z%LRTable.compute_nullable_nonterminalsc             C   sr   g }xht |D ]\\}}xR|D ]J}|j|jd k r||j|jd  f}|d | jjkr||kr|j| qW qW |S )Nr8   )rL   rd   r*   rD   r   ro   rM   )r   r   transZstatenor   r`   r   r
   r
   r   find_nonterminal_transitionsL  s    
z$LRTable.find_nonterminal_transitionsc             C   s   i }|\}}g }| j || |}xJ|D ]B}	|	j|	jd k r&|	j|	jd  }
|
| jjkr&|
|kr&|j|
 q&W |dkr|| jjd jd kr|jd |S )Nr8   r   z$end)r   rd   r*   rD   r   rn   rM   rl   )r   r   r   r   Zdr_setr   r   Ztermsr   r`   r   r
   r
   r   dr_relation`  s    

zLRTable.dr_relationc             C   sv   g }|\}}| j || |}| jjt|d}xB|D ]:}	|	j|	jd k r4|	j|	jd  }
|
|kr4|j||
f q4W |S )Nr8   r   )r   r   r   r   rd   r*   rD   rM   )r   r   r   emptyr   r   r   r   r   r`   r   r
   r
   r   reads_relationy  s    
zLRTable.reads_relationc             C   s  i }i }i }x|D ]}d||< qW x|D ]\}}	g }
g }xR|| D ]D}|j |	krZqH|j}|}x||jd k r
|d }|j| }||f|kr|d }xH||jk r|j| | jjkrP |j| |krP |d }qW |j||f | j|| |}| jj	t
|d}qfW x|| D ]t}|j |j kr,q|j|jkr>qd}xD||jk rx|j| |j|d  krlP |d }qDW |
j||f qW qHW x2|D ]*}||krg ||< || j||	f qW |
|||	f< q*W ||fS )Nr8   r   r   )r6   rd   r*   rD   r   rn   rM   r   r   r   r   )r   r   r   r   ZlookdictZincludedictZdtransr   r   r   ZlookbZincludesr`   rd   r   Zlir   r   rh   r
   r
   r   compute_lookback_includes  sX    




z!LRTable.compute_lookback_includesc                s0    fdd} fdd}t |||}|S )Nc                s   j  | S )N)r   )r   )r   r   r   r
   r   <lambda>  s    z+LRTable.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LRTable.compute_read_setsc                s(   fdd} fdd}t |||}|S )Nc                s    |  S )Nr
   )r   )readsetsr
   r   r     s    z-LRTable.compute_follow_sets.<locals>.<lambda>c                s    j | g S )N)r   )r   )inclsetsr
   r   r     s    )r   )r   r   r   r   r   r   r   r
   )r   r   r   compute_follow_sets
  s    zLRTable.compute_follow_setsc       	      C   sx   xr|j  D ]f\}}x\|D ]T\}}||jkr4g |j|< |j|g }x*|D ]"}||j| krF|j| j| qFW qW q
W d S )N)rN   re   r   rM   )	r   Z	lookbacksZ	followsetr   Zlbr   r`   r   r   r
   r
   r   add_lookaheads  s    


zLRTable.add_lookaheadsc             C   sP   | j  }| j|}| j|||}| j|||\}}| j|||}| j|| d S )N)r   r   r   r   r   r   )r   r   r   r   r   ZlookdZincludedZ
followsetsr
   r
   r   add_lalr_lookaheads.  s    
zLRTable.add_lalr_lookaheadsc       #      C   s  | j j}| j j}| j}| j}i }| j }| j| xt|D ]\}}g }	g }
i }i }i }|	jd| d x$|D ]}|	jd|j	 d|  qtW x|D ]}|j
|jd kr|jdkrd|d< ||d< q|j| }x|D ]}|
j||d	|j	 d
| df |j|}|d k	r|dkr|j|d\}}||j	 j\}}||k sf||kr|dkr|j	 ||< |||< | r| r|	jd| d | jj||df ||j	  jd7  _nH||kr|dkrd ||< n*|s|	jd| d | jj||df n|dk r||  }||j	 }|j|jkr|j	 ||< |||< || }}||j	  jd7  _||j	  jd8  _n
|| }}| jj|||f |	jd||| j	|| f  ntd| q|j	 ||< |||< ||j	  jd7  _qW q|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rtd| q|dk r||| j	 j\}}|j|d \}}||ks||kr2|dkr2||| j	  jd8  _|||< |||< |s|	jd| d | jj||df nR||krP|dkrPd ||< n4| r| r|	jd| d | jj||df ntd| q|||< |||< qW i }xP|
D ]H\}}}||kr||| kr|	jd|dd|  d|||f< qW |	jd i }x6|D ].} x&| jD ]}!|!| j jkr d ||!< q W qW xV|D ]N}"| j||"}| jjt|d!}|dkrL|||"< |	jd|"dd|  qLW |||< |||< |||< dj|	| j|< q>W d S )"Nz
state r   z    (z) r8   zS'r   z$endzreduce using rule z (rW   rA   rw   z  ! shift/reduce conflict for z resolved as reducereducerx   z resolved as shiftZshiftz=  ! reduce/reduce conflict for %s resolved using rule %d (%s)zUnknown conflict in state zshift and go to state zShift/shift conflict in state z    z<15srV   rB   z<30sz shift and go to state )rA   r   r   )rA   r   r   )r   rl   rr   r   r   r   r   rL   rM   rE   r*   rd   r6   re   r   rI   r   rc   rH   r   r   rD   rn   r   r   r   rJ   ro   r5   r   )#r   rl   rr   gotoactionZactionpr   str   descripZactlistZ	st_actionZ
st_actionpZst_gotor`   Zlaheadsr   r   ZsprecZslevelZrprecZrlevelZoldpZppZchosenpZrejectprh   r   r   Z	_actprintrS   Znkeysr   r#   r&   r
   r
   r   r   F  s    



 



















zLRTable.lr_parse_tablec       
      C   s6  g }x| j j D ]}|j| qW | js0| jr,|jd x0| jD ]&\}}}|jd| d| d|  qBW t }xp| jD ]f\}}}|t|t|f|krqz|jd| d|  |jd| d|  |j|t|t|f qzW t }	x@| jD ]6\}}}|j r||	kr|jd	| d
 |	j| qW dj	|S )Nz
Conflicts:
zshift/reduce conflict for z
 in state z resolved as z reduce/reduce conflict in state z resolved using rule zrejected rule (z) in state zRule (z) is never reducedr   )
r   r   rM   r   r   rs   r   r   rc   r5   )
r   r   r   r   r0   Z
resolutionZalready_reportedruleZrejectedZwarned_neverr
   r
   r   r     s(    
 zLRTable.__str__N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   r     s    )#8+P %r   c          	   C   s   g }x| r| j }tj| }|jj}|jj}xt| jt|t	| j d ddD ]j\}}|j
 }|dd dgks|dd dgkr|j| |||d |dd  f qN|j| ||||f qNW t| dd } qW |S )Nr8   r   r~   r}   z::=	next_funcr   )r   inspectZunwrap__code__co_filenameco_firstlinenozipr   ranger*   splitrM   r.   )rF   r   r   Z	unwrappedfilenamer,   r   r   r
   r
   r   _collect_grammar_rules  s    
,$"r   c                   s,   e Zd ZdZ fddZ fddZ  ZS )ParserMetaDictzR
    Dictionary that allows decorated grammar rule functions to be overloaded
    c                sX   || krFt |rFt|drF| | |_t|jdsFtd| d| dt j|| d S )Nr   zRedefinition of z. Perhaps an earlier z is missing @_)callablehasattrr   rj   r:   r)   )r   rT   r%   )r<   r
   r   r)     s
    
zParserMetaDict.__setitem__c                s8   || kr(|j  r(|d d dkr(|j S t j|S d S )Nr8   r9   )isupperupperr:   r'   )r   rT   )r<   r
   r   r'   "  s     zParserMetaDict.__getitem__)r   r   r   r	   r)   r'   r?   r
   r
   )r<   r   r     s   r   c                   s(   e Zd Zedd Z fddZ  ZS )
ParserMetac             O   s   t  }dd }||d< |S )Nc                s   | f|  fdd}|S )Nc                s    t | dg  d d d | _| S )Nr   r8   r   )r.   r   )rF   )r   r
   r   decorate.  s    z3ParserMeta.__prepare__.<locals>._.<locals>.decorater
   )r   extrar   r
   )r   r   r9   ,  s    
z!ParserMeta.__prepare__.<locals>._r9   )r   )metar   r   r   r9   r
   r
   r   __prepare__)  s    zParserMeta.__prepare__c                s.   |d= t  j| |||}|jt|j  |S )Nr9   )r:   __new___buildrK   rN   )r   clsnamebases
attributescls)r<   r
   r   r   5  s    zParserMeta.__new__)r   r   r   classmethodr   r   r?   r
   r
   )r<   r   r   (  s   r   c               @   s   e Zd ZeejZdZedd Z	edd Z
edd Zedd	 Zed
d Zedd Zedd Zdd Zdd Zdd Zdd ZdS )r   Nc             C   sN   t | ds| jjd dS | js0| jjd dS d| jkrJ| jjd dS dS )NtokenszNo token list is definedFztokens is emptyr   z.Illegal token name 'error'. Is a reserved wordT)r   logr   r  )r   r
   r
   r   Z__validate_tokensB  s    

zParser.__validate_tokensc                s   t | dsg | _dS g }t| jttfs8| jjd dS xt| jddD ]\}t|ttfsv| jjd|d dS t	|d	k r| jjd
|d dS t
dd |D s| jjd dS |d  |j fdd|dd  D  qHW || _dS )NrR   Tz"precedence must be a list or tupleFr8   )r   zBad precedence table entry z. Must be a list or tupler~   zMalformed precedence entry z". Must be (assoc, term, ..., term)c             s   s   | ]}t |tV  qd S )N)r-   r   )r   rv   r
   r
   r   r   f  s    z/Parser.__validate_precedence.<locals>.<genexpr>z precedence items must be stringsr   c             3   s   | ]}| fV  qd S )Nr
   )r   rv   )rz   r{   r
   r   r   k  s    )r   _Parser__preclistr-   rR   rK   rC   r  r   rL   r*   allextend)r   Zpreclistr`   r
   )rz   r{   r   Z__validate_precedenceR  s*    
&zParser.__validate_precedencec             C   s   | j  sdS | j sdS dS )zE
        Validate various parts of the grammar specification
        FT)_Parser__validate_tokens_Parser__validate_precedence)r   r
   r
   r   Z__validate_specificationp  s
    zParser.__validate_specificationc             C   s6  g }d}|st dt| j}xX| jD ]N\}}}y|j||| W q& tk
rr } z|| d7 }W Y dd}~X q&X q&W x|D ]\}	}
ylt|
}x^|D ]V\}}}}}y|j||||| W q tk
r } z|| d7 }W Y dd}~X qX qW W q~ tk
r$ } z|| d7 }W Y dd}~X q~X q~W y|j	t
| dd W n2 tk
rr } z|| d7 }W Y dd}~X nX |j }x(|D ] \}}|d|j|j|f 7 }qW |j }|rddj| d	 }| jjd
t|dkrdnd d| d |j }x&|D ]}| jjd|j|j|j q W t|dkr<| jjd t|dkr\| jjdt| t|dkrv| jjd t|dkr| jjdt| |j }x|D ]}| jjd| qW t|dkr|j }x|D ]}|d| 7 }qW |j }x"|D ]\}}|d||f 7 }qW || _|r2t d| dS )z:
        Build the grammar from the grammar rules
        rB   zNo grammar rules are definedr   Nr   z<%s:%d: Symbol %r used, but not defined as a token or a rule
r2   ,r3   Tokenr8   z(s)rV   z defined, but not usedz$%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Symbol %r is unreachabler   z*Infinite recursion detected for symbol %r
z1Precedence rule %r defined for unknown symbol %r
zUnable to build grammar.
)r   rk   r  r  r|   rj   r   r   SyntaxErrorr   r.   r   rG   rH   r   r5   r  r   r*   r   r6   r   r   r   _grammar)r   r   Zgrammar_ruleserrorsr   rv   rz   r{   er6   rF   Zparsed_ruleZpfuncZrulefileZruleliner   r   r   symrD   r   Z
unused_strr   Zunreachableur   infZunused_precr
   r
   r   Z__build_grammar{  sn    
$($ ,


zParser.__build_grammarc             C   s   t | j}t|j}|t| ddkrP|dkr:| jjd n|dkrP| jjd| t|j}|t| ddkr|dkr| jjd n|dkr| jjd| || _d	S )
z>
        Build the LR Parsing tables from the grammar
        Zexpected_shift_reduceNr8   z1 shift/reduce conflictz%d shift/reduce conflictsZexpected_reduce_reducez1 reduce/reduce conflictz%d reduce/reduce conflictsT)	r   r  r*   r   r.   r  r   r   _lrtable)r   ZlrtableZnum_srZnum_rrr
   r
   r   Z__build_lrtables  s    


zParser.__build_lrtablesc             C   s   dd |D }|S )z9
        Collect all of the tagged grammar rules
        c             S   s*   g | ]"\}}t |rt|d r||fqS )r   )r   r   )r   r6   r%   r
   r
   r   r     s    z*Parser.__collect_rules.<locals>.<listcomp>r
   )r   definitionsr   r
   r
   r   Z__collect_rules  s    zParser.__collect_rulesc             C   s   t | jddrd S | j|}| j s.td| j| | j sHtd| jrt| jd0}|j	t
| j |j	d |j	t
| j W d Q R X | jjd| j| j d S )Nr   FzInvalid parser specificationzCan't build parsing tableswr   z%Parser debugging for %s written to %s)varsr   _Parser__collect_rules_Parser__validate_specificationr   _Parser__build_grammar_Parser__build_lrtables	debugfileopenr   r   r  r  r  r   r   )r   r  r   r   r
   r
   r   r     s    


zParser._buildc             C   sX   |rHt |dd}|r2tjjd| d|j d qTtjjd|j  ntjjd dS )	zK
        Default error handling function.  This may be subclassed.
        r,   r   zsly: Syntax error at line z, token=r   zsly: Syntax error, token=zsly: Parse error in input. EOF
N)r.   sysstderrr   r   )r   Ztokenr,   r
   r
   r   r   
  s    zParser.errorc             C   s
   d| _ dS )z(
        Clear the error status
        TN)errorok)r   r
   r
   r   errok  s    zParser.errokc             C   sF   | j dd= | jdd= t }d|_| jj| | j jd d| _dS )zW
        Force the parser to restart from a fresh state. Clears the statestack
        Nz$endr   )
statestacksymstackr   r   rM   r   )r   r  r
   r
   r   restart  s    zParser.restartc             C   s2  d}g }| j j}| j j}| jj}| j j}td}d}	|| _g  | _}
g  | _	}||_
| j  d}x| j|kr|s|st|d}n|j }|st }d|_|j}|| j j|}n
|| j }|dk	r|dk r|
j| || _|j| d}|	rd|	d8 }	qd|dk r||   | _}|j}|j}|j|_|r>|| d ng |_t }||_|j| |}||kr||fdd |jD }||_|r|| d= |
| d= |j| ||
d  | | _|
j| j qd|dkr|d }t|dd}|S |dkr"|	dks| jrRt}	d| _|jdkr$d}n|}| j|}|rF|}d	| _qdn
|sVdS nt}	t|
dkr|jdkrd}d| _|dd= qd|jdkrdS |jd
kr|d }|jd
krd}qdt }d
|_t|dr|j |_ t|dr|j!|_!||_|j| |}qd|j }|
j  |
d | _qdt"dqdW dS )z/
        Parse the given input tokens.
        Nr   z$endr8   c             s   s   | ]}|j V  qd S )N)r%   )r   r#   r
   r
   r   r   n  s    zParser.parse.<locals>.<genexpr>r%   FTr   r,   r1   zsly: internal parser error!!!
r   r   r   r   )#r  r   r   r  rl   r   r   r  r  r   r"   r!  r   nextr   r   r   r   rM   Z
productionr6   r*   rO   r!   r    rF   r%   r.   r  ERROR_COUNTr   r   r,   r1   rX   )r   r  Z	lookaheadZlookaheadstackr   r   rD   r   ZpsliceZ
errorcountr  r   ZerrtokenZltyper   r`   ZpnameZplenr  r%   r&   r   r0   r
   r
   r   parse)  s    
















zParser.parse)r   r   r   r   r  r  r  r  r   r  r  r  r  r  r  r   r   r  r!  r$  r
   r
   r
   r   r   ;  s   
K)	metaclass)r  r   collectionsr   r   __all__	Exceptionr   r#  maxsizer   objectr   r   r   r@   rZ   ri   rj   rk   r   r   r   r   r   dictr   r   r   r   r
   r
   r
   r   <module>"   s<   Ve    
    z