B
    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 || d  d S )N
)r   write)r   msgargskwargsr
   r
   r   debugB   s    zSlyLogger.debugc             O   s   | 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 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  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  || 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__)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   rightr   N c             C   s   || _ t|| _|| _|| _|| _|| _|| _t| j| _g | _	t
t}x:t| jD ],\}	}
||
 |	 |
| j	krT| j	|
 qTW i }xT| 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   rF   r6   rE   
precedencerG   rH   rI   Zsymmapr&   r#   mkeyindicesr1   r
   r
   r   r      s.    

zProduction.__init__c             C   sF   | j rd| jd| j f }n| j d}| jd rB|d| j 7 }|S )Nz%s -> %s z -> <empty>r8   z  [precedence=%s, level=%d])rE   r6   r5   rJ   )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*   rE   )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)rE   )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*   rE   LRItem	Prodnameslr_after
IndexErrorKeyError	lr_before)r   r&   pr
   r
   r   lr_item   s    
zProduction.lr_item)rA   NrC   r   )r   r   r   reducedr   r   r   r+   rZ   r'   rb   r
   r
   r
   r   r@      s   
#r@   c               @   s$   e Zd Zdd Zdd Zdd ZdS )r[   c             C   sZ   |j | _ t|j| _|j| _|| _i | _| j|d t| j| _t| j| _|j	| _	d S )Nr4   )
r6   rL   rE   rF   lr_index
lookaheadsinsertrD   r*   rK   )r   ra   r&   r
   r
   r   r   $  s    zLRItem.__init__c             C   s.   | j rd| jd| j f }n| j d}|S )Nz%s -> %srW   z -> <empty>)rE   r6   r5   )r   r#   r
   r
   r   r   /  s    zLRItem.__str__c             C   s   d|  dS )NzLRItem(rX   r
   )r   r
   r
   r   r   6  s    zLRItem.__repr__N)r   r   r   r   r   r   r
   r
   r
   r   r[   #  s   r[   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 )leftrB   nonassoczAssociativity of z- must be one of 'left','right', or 'nonassoc')rl   AssertionErrorrr   rj   )r   rv   assoclevelr
   r
   r   set_precedence  s    
zGrammar.set_precedenceNrC   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|	}
|
sNt| d| d|	n| j|	 |dd = nt|| 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 | | n&|| jkr.g | j|< | j| | qW t||||
|||}| j| || j	|< y| 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 %%preczB: Syntax error. %prec can only appear at the end of a grammar rulez(: Nothing known about the precedence of )rB   r   z%s -> %sz: Duplicate rule z. zPrevious definition at )rn   rj   rM   r*   rr   getrt   addri   rm   rH   rI   rl   ro   rN   r@   r\   r_   )r   prodnamesymsrG   rH   rI   r&   r#   cZprecnameZprodprecmaprT   Zpnumbertra   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| d || _d S )Nr8   zstart symbol z
 undefinedr   zS')rl   r6   ro   rj   r@   rN   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  |  x.j| g D ]}x|jD ]} | q2W q&W d S )N)r   r\   r   rE   )r#   ra   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   rE   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 D ]R\}}xH|D ]@}x |jD ]}|| shd}P qhW d}|r\|| sd||< d}P q\W qNW |s>P q>W g }	x@| D ]4\}}
|
s|| jkr|| j kr|dkrq|	| qW |	S )NTz$endFr   )rn   ro   r\   rO   rE   rN   )r   Z
terminatesr   r&   some_changeZplra   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|||f qW qW |S )Nr   )rl   rE   r\   rn   rN   )r   resultra   r#   r
   r
   r   undefined_symbolsP  s    zGrammar.undefined_symbolsc             C   s6   g }x,| j  D ]\}}|dkr|s|| qW |S )Nr   )rn   rO   rN   )r   Z
unused_tokr#   r(   r
   r
   r   unused_terminalsa  s
    zGrammar.unused_terminalsc             C   s<   g }x2| j  D ]$\}}|s| j| d }|| qW |S )Nr   )ro   rO   r\   rN   )r   Zunused_prodr#   r(   ra   r
   r
   r   unused_rulesp  s    zGrammar.unused_rulesc             C   sD   g }x:| j D ]0}|| jks|| jks||| j | d f qW |S )Nr   )rr   rn   rt   rN   )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|| qW |rLq
P q
W |d |S )NFz<empty>T)rp   rN   )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D ]&}|| j | kr~| j | | d}q~W qlW q\W |sPP qPW | j S )Nz$endFT)rp   rn   ro   r\   r   rE   rN   )r   r   r&   r   ra   r   r
   r
   r   compute_first  s$    zGrammar.compute_firstc       
      C   sV  | j r| j S | js|   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|d d  }d}xB|D ]:}	|	dkr|	| j | kr| j | 	|	 d}|	dkrd}qW |s|t
|jd krxx:| j |j D ]*}	|	| j | kr| j | 	|	 d}qW qxW qhW |sTP qTW | j S )Nr8   z$endFz<empty>T)rq   rp   r   ro   rl   r6   rM   rE   r   rN   r*   )
r   r   kdidaddra   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 |
| |}|d7 }qW ||_qW d S )Nr   r8   )rl   r*   r[   r\   rE   r]   r^   r_   r`   rR   rN   rQ   )r   ra   Zlastlrirh   rQ   Zlrir
   r
   r   build_lritems  s.    

zGrammar.build_lritemsc          
   C   s  g }| d x.t| jD ] \}}| d|dd|  qW |  }|rr| d x|D ]}| d|  qZW | d x:t| jD ],}| d|dd	d
 | j| D f  qW | d x:t| jD ],}| d|ddd
 | j| D f  qW | d d|S )Nz	Grammar:
zRule z<5drW   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    rC   r   )rN   rM   rl   r   sortedrn   r5   ro   )r   outr&   ra   r   rv   Znontermr
   r
   r   r   5  s"    



,
,
zGrammar.__str__)NrC   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  | |  t|}||| < || || < || }xr|D ]j}	||	 dkrXt|	|||||| t||  ||	 || < x.||	g D ]}
|
||  kr|||   |
 q|W q4W ||  |krt||d < ||  ||d < | }x2|| krt||d < ||  ||d < | }qW d S )Nr   r~   )rN   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   |   i | _xH| j D ]:\}}t| }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_statesrO   rL   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 |_d}q:W q.W q W |S )Nr8   TF	lr0_addedr   )r   r]   r.   rN   rR   r   )r   IJr   jr   r
   r
   r   lr0_closure  s    
zLRTable.lr0_closurec       	      C   s   | j t||f}|r|S | j |}|s:i }|| j |< g }xP|D ]H}|j}|rD|j|krD|t|}|s~i }||t|< || |}qDW |d}|s|r| |}||d< n||d< || j t||f< |S )Nz$end)r   r   idrR   r`   rN   r   )	r   r   r   gr#   Zgsra   r&   s1r
   r
   r   lr0_goto  s2    





zLRTable.lr0_gotoc       	      C   s   |  | 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 xH|D ]@}| ||}|rt|| jkrqt|| jt|< |	| qW qFW |S )Nr   r8   )
r   r   rl   rR   r   r   r*   rK   r   rN   )	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 qx$|jD ]}||krBP qBW ||j qW t||krrP t|}qW |S )Nr   r8   )rs   r   rl   r*   r   r6   rE   )r   nullableZnum_nullablera   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|| qW qW |S )Nr8   )rM   rd   r*   rE   r   ro   rN   )r   r   transZstatenor   ra   r   r
   r
   r   find_nonterminal_transitionsL  s    
z$LRTable.find_nonterminal_transitionsc             C   s   i }|\}}g }|  || |}xJ|D ]B}	|	j|	jd k r&|	j|	jd  }
|
| jjkr&|
|kr&||
 q&W |dkr|| jjd jd kr|d |S )Nr8   r   z$end)r   rd   r*   rE   r   rn   rN   rl   )r   r   r   r   Zdr_setr   r   Ztermsr   ra   r   r
   r
   r   dr_relation`  s    

zLRTable.dr_relationc             C   sv   g }|\}}|  || |}| jt|d}xB|D ]:}	|	j|	jd k r4|	j|	jd  }
|
|kr4|||
f q4W |S )Nr~   r8   )r   r   r   r   rd   r*   rE   rN   )r   r   r   emptyr   r   r   r   r   ra   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 |||f | || |}| 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 |
||f qW qHW x2|D ]*}||krg ||< || ||	f qW |
|||	f< q*W ||fS )Nr8   r~   r   )r6   rd   r*   rE   r   rn   rN   r   r   r   r   )r   r   r   r   ZlookdictZincludedictZdtransr   r   r   ZlookbZincludesra   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     | S )N)r   )r   )r   r   r   r
   r   <lambda>  s    z+LRTable.compute_read_sets.<locals>.<lambda>c                s     | 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     | 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|  D ]f\}}x\|D ]T\}}||jkr4g |j|< ||g }x*|D ]"}||j| krF|j| | qFW qW q
W d S )N)rO   re   r   rN   )	r   Z	lookbacksZ	followsetr   Zlbr   ra   r   r   r
   r
   r   add_lookaheads  s    


zLRTable.add_lookaheadsc             C   sP   |   }| |}| |||}| |||\}}| |||}| || 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 }|  }| | xt|D ]|\}}g }	g }
i }i }i }|	d| d x$|D ]}|	d|j	 d|  qtW x|D ]}|j
|jd kr|jdkrd|d< ||d< q|j| }x|D ]}|
||d	|j	 d
| df ||}|d k	r|dkr
||d\}}||j	 j\}}||k sf||kr|dkr|j	 ||< |||< |s|s|	d| d | j||df ||j	  jd7  _nH||kr|dkrd ||< n*|s|	d| d | j||df n|dk r||  }||j	 }|j|jkr~|j	 ||< |||< || }}||j	  jd7  _||j	  jd8  _n
|| }}| j|||f |	d||| j	|| f  ntd| q|j	 ||< |||< ||j	  jd7  _qW q|j}|j|d  }|| j jkr| ||}| jt|d}|dkr|
||d| f ||}|d k	r|dkr||krtd| n|dk r|||| j	 j\}}||d\}}||ks||kr,|dkr,||| j	  jd8  _|||< |||< |sz|	d| d | j||df nN||krJ|dkrJd ||< n0|s|s|	d| d | j||df ntd| q|||< |||< qW i }xP|
D ]H\}}}||kr||| kr|	d|dd|  d|||f< qW |	d i }x6|D ].} x&| jD ]}!|!| j jkrd ||!< qW q
W xV|D ]N}"| ||"}| jt|d}|dkrB|||"< |	d|"dd|  qBW |||< |||< |||< d|	| j|< q>W d S ) Nz
state r   z    (z) r8   zS'r   z$endzreduce using rule z (rX   )rB   r   rw   z  ! shift/reduce conflict for z resolved as reducereducerx   z resolved as shiftshiftz=  ! reduce/reduce conflict for %s resolved using rule %d (%s)zUnknown conflict in state r~   zshift and go to state zShift/shift conflict in state rB   z    z<15srW   rC   z<30sz shift and go to state )r   rl   rr   r   r   r   r   rM   rN   rF   r*   rd   r6   re   r   rJ   r   rc   rI   r   r   rE   rn   r   r   r   rK   ro   r5   r   )#r   rl   rr   gotoactionZactionpr   str   descripZactlistZ	st_actionZ
st_actionpZst_gotora   Zlaheadsr   r   ZsprecZslevelZrprecZrlevelZoldpZppZchosenpZrejectprh   r   r   Z	_actprintrT   Znkeysr   r#   r&   r
   r
   r   r   F  s    



 



















zLRTable.lr_parse_tablec       
   	   C   s4  g }x| j  D ]}|| qW | js0| jr*|d x0| jD ]&\}}}|d| d| d|  qBW t }xp| jD ]f\}}}|t|t|f|krqz|d| d|  |d| d|  ||t|t|f qzW t }	x>| jD ]4\}}}|js||	kr|d	| d
 |	| qW d	|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   rN   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}xt| jt|t	| j d ddD ]j\}}|
 }|dd dgks|dd dgkr|| |||d |dd  f qN|| ||||f qNW t| dd } qW |S )Nr8   r   r~      r}   z::=	next_func)r   inspectZunwrap__code__co_filenameco_firstlinenozipr   ranger*   splitrN   r.   )rG   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 || d S )Nr   zRedefinition of z. Perhaps an earlier z is missing @_)callablehasattrr   rj   r:   r)   )r   rU   r%   )r<   r
   r   r)     s
    
zParserMetaDict.__setitem__c                s8   || kr(|  r(|d d dkr(| S t |S d S )Nr8   r9   )isupperupperr:   r'   )r   rU   )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   r~   )r.   r   )rG   )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  | |||}|t|  |S )Nr9   )r:   __new___buildrL   rO   )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d dS | js0| jd dS d| jkrJ| 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d dS xt| jddD ]\}t|ttfsv| jd|d dS t	|d	k r| jd
|d dS t
dd |D s| jd dS |d  | fdd|dd  D  qHW || _dS )NrS   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-   rS   rL   rD   r  r   rM   r*   allextend)r   Zpreclistra   r
   )rz   r{   r   Z__validate_precedenceR  s*    
&zParser.__validate_precedencec             C   s   |   sdS |  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|||| W q& tk
rr } z|| d7 }W dd}~X Y q&X q&W x|D ]\}	}
ylt|
}x^|D ]V\}}}}}y|||||| W q tk
r } z|| d7 }W dd}~X Y qX qW W q~ tk
r$ } z|| d7 }W dd}~X Y q~X q~W y|	t
| dd W n2 tk
rr } z|| d7 }W dd}~X Y nX | }x(|D ] \}}|d|j|j|f 7 }qW | }|rdd| d	 }| jd
t|dkrdnd d| d | }x&|D ]}| jd|j|j|j q W t|dkr<| jd t|dkr\| jdt| t|dkrv| jd t|dkr| jdt| | }x|D ]}| jd| qW t|dkr| }x|D ]}|d| 7 }qW | }x"|D ]\}}|d||f 7 }qW || _|r2t d| dS )z:
        Build the grammar from the grammar rules
        rC   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)rW   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   rH   rI   r   r5   r  r   r*   r   r6   r   r   r   _grammar)r   r   Zgrammar_ruleserrorsr   rv   rz   r{   er6   rG   Zparsed_ruleZpfuncZrulefileZruleliner   r   r   symrE   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d n|dkrP| jd| t|j}|t| ddkr|dkr| jd n|dkr| 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 | ddrd S | |}|  s.td| | |  sHtd| jrt| jd0}|	t
| j |	d |	t
| j W d Q R X | 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d| d|j d qTtjd|j  nt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 d d| _dS )zW
        Force the parser to restart from a fresh state. Clears the statestack
        Nz$endr   )
statestacksymstackr   r   rN   r   )r   r  r
   r
   r   restart  s    zParser.restartc             C   s0  d}g }| j j}| j j}| jj}| j j}td}d}	|| _g  | _}
g  | _	}||_
|   d}x| j|kr|s|st|d}n| }|st }d|_|j}|| j |}n
|| j }|dk	r|dkr|
| || _|| d}|	rd|	d8 }	qd|dk r||   | _}|j}|j}|j|_|r<|| d ng |_t }||_|| |}||krz|fdd |jD }||_|r|| d= |
| d= || ||
d  | | _|
| j qd|dkr|d }t|dd}|S |dkr |	dks| jrPt}	d	| _|jdkr"d}n|}| |}|rD|}d
| _qdn
|sTd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!|_!||_|| |}qd| }|
  |
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~   r%   FTr   r,   r1   zsly: internal parser error!!!
)#r  r   r   r  rl   r   r   r  r   r!  r"   r"  r   nextr   r   r   r   rN   Z
productionr6   r*   rP   r!   r    rG   r%   r.   r  ERROR_COUNTr   r   r,   r1   rY   )r   r  Z	lookaheadZlookaheadstackr   r   rE   r   ZpsliceZ
errorcountr   r!  ZerrtokenZltyper   ra   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@   r[   ri   rj   rk   r   r   r   r   r   dictr   r   r   r   r
   r
   r
   r   <module>"   s<   Ve    
    z