3

�j\�5�@s"ddlZddlZddlmZmZdgZGdd�de�ZdZej	Z
Gdd�de�ZGd	d
�d
�Z
Gdd�d�ZGd
d�de�ZGdd�de�Zdd�ZGdd�de�ZGdd�de�Zdd�Zdd�ZGdd�de�ZGdd�de�Zdd �ZGd!d"�d"e�ZGd#d$�d$e�ZGd%d�ded&�ZdS)'�N)�OrderedDict�defaultdict�Parserc@seZdZdZdS)�	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(sr�c@s4eZdZdd�Zdd�ZeZdd�Zdd�ZeZd	S)
�	SlyLoggercCs
||_dS)N)�f)�selfrr
r
r�__init__?szSlyLogger.__init__cOs|jj||d�dS)N�
)r�write)r�msg�args�kwargsr
r
r�debugBszSlyLogger.debugcOs|jjd||d�dS)Nz	WARNING: r)rr)rrrrr
r
r�warningGszSlyLogger.warningcOs|jjd||d�dS)NzERROR: r)rr)rrrrr
r
r�errorJszSlyLogger.errorN)	rrrrr�inforrZcriticalr
r
r
rr
>sr
c@seZdZdd�Zdd�ZdS)�
YaccSymbolcCs|jS)N)�type)rr
r
r�__str__ZszYaccSymbol.__str__cCst|�S)N)�str)rr
r
r�__repr__]szYaccSymbol.__repr__N)rrrrrr
r
r
rrYsrcsbeZdZdZddd�Zdd�Zd	d
�Zdd�Zed
d��Z	edd��Z
dd�Z�fdd�Z�Z
S)�YaccProduction�_slice�_namemap�_stackNcCs||_i|_||_dS)N)r r!r")r�s�stackr
r
rrjszYaccProduction.__init__cCs$|dkr|j|jS|j|jSdS)Nr)r �valuer")r�nr
r
r�__getitem__oszYaccProduction.__getitem__cCs&|dkr||j|_n||j|_dS)Nr)r r%r")rr&�vr
r
r�__setitem__uszYaccProduction.__setitem__cCs
t|j�S)N)�lenr )rr
r
r�__len__{szYaccProduction.__len__cCs<x.|jD]$}t|t�rqt|dd�}|r|SqWtd��dS)N�linenozNo line number found)r �
isinstancer�getattr�AttributeError)r�tokr,r
r
rr,~s
zYaccProduction.linenocCs@x2|jD](}t|t�rqt|dd�}|dk	r|SqWtd��dS)N�indexzNo index attribute found)r r-rr.r/)rr0r1r
r
rr1�s
zYaccProduction.indexcCsJ||jkr|j|j|jSddj|j�d}td|�d|�d���dS)N�{z, �}z
No symbol z. Must be one of �.)r!r r%�joinr/)r�nameZnamesetr
r
r�__getattr__�s
zYaccProduction.__getattr__cs2|dd�dkr t�j||�ntd|����dS)N��_z&Can't reassign the value of attribute )�super�__setattr__r/)rr6r%)�	__class__r
rr;�szYaccProduction.__setattr__)r r!r")N)rrr�	__slots__rr'r)r+�propertyr,r1r7r;�
__classcell__r
r
)r<rrhs


rc@sJeZdZdZddd�Zdd�Zd	d
�Zdd�Zd
d�Zdd�Z	dd�Z
dS)�
Productionr�rightN�cCs�||_t|�|_||_||_||_||_||_t|j�|_g|_	t
t�}x:t|j�D],\}	}
||
j
|	�|
|j	krT|j	j
|
�qTWi}xT|j�D]H\}}
t|
�dkr�|
d||<q�x$t|
�D]\}	}|||t|	�<q�Wq�W||_g|_d|_dS)Nr8r)r6�tuple�prod�number�func�file�line�precr*�usymsr�list�	enumerate�append�itemsr�namemap�lr_items�lr_next)rrEr6rD�
precedencerFrGrHZsymmapr&r#�m�key�indicesr1r
r
rr�s.

zProduction.__init__cCsF|jrd|jdj|j�f}n|j�d�}|jdrB|d|j7}|S)Nz%s -> %s� z -> <empty>r8z  [precedence=%s, level=%d])rDr6r5rI)rr#r
r
rr�s
zProduction.__str__cCsd|�d�S)NzProduction(�)r
)rr
r
rr�szProduction.__repr__cCs
t|j�S)N)r*rD)rr
r
rr+�szProduction.__len__cCstd��dS)NZUsedr8)�RuntimeError)rr
r
r�__nonzero__�szProduction.__nonzero__cCs
|j|S)N)rD)rr1r
r
rr'�szProduction.__getitem__cCs�|t|j�krdSt||�}yt|j|d|_Wnttfk
rRg|_YnXy|j|d|_Wntk
r�d|_YnX|S)Nr8)r*rD�LRItem�	Prodnames�lr_after�
IndexError�KeyError�	lr_before)rr&�pr
r
r�lr_item�s
zProduction.lr_item�rAr)rbNrBr)rrr�reducedrrrr+rYr'rar
r
r
rr@�s
#r@c@s$eZdZdd�Zdd�Zdd�ZdS)rZcCsZ|j|_t|j�|_|j|_||_i|_|jj|d�t|j�|_t|j�|_|j	|_	dS)Nr4)
r6rKrDrE�lr_index�
lookaheads�insertrCr*rJ)rr`r&r
r
rr$szLRItem.__init__cCs.|jrd|jdj|j�f}n|j�d�}|S)Nz%s -> %srVz -> <empty>)rDr6r5)rr#r
r
rr/szLRItem.__str__cCsd|�d�S)NzLRItem(rWr
)rr
r
rr6szLRItem.__repr__N)rrrrrrr
r
r
rrZ#srZcCs:t|�d}x(|dkr4|||kr*||S|d8}qWdS)Nr8r)r*)Zsymbols�	terminals�ir
r
r�rightmost_terminal>s
ric@seZdZdS)�GrammarErrorN)rrrr
r
r
rrjNsrjc@s�eZdZdd�Zdd�Zdd�Zdd�Zd&dd
�Zd'dd�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zd(d d!�Zd"d#�Zd$d%�Zd	S))�GrammarcCsfdg|_i|_i|_i|_x|D]}g|j|<q Wg|jd<i|_i|_i|_i|_t�|_	d|_
dS)Nr)�Productionsr[�Prodmap�	Terminals�Nonterminals�First�Follow�
Precedence�set�UsedPrecedence�Start)rrg�termr
r
rrRs

zGrammar.__init__cCs
t|j�S)N)r*rl)rr
r
rr+vszGrammar.__len__cCs
|j|S)N)rl)rr1r
r
rr'yszGrammar.__getitem__cCsV|jdgkstd��||jkr,td|����|dkrDtd|�d���||f|j|<dS)	Nz2Must call set_precedence() before add_production()z*Precedence already specified for terminal �leftrA�nonassoczAssociativity of z- must be one of 'left','right', or 'nonassoc')rwrArx)rl�AssertionErrorrrrj)rrv�assoc�levelr
r
r�set_precedence�s
zGrammar.set_precedenceNrBrcCs�||jkr$t|�d|�d|�d���|dkrFt|�d|�d|�d���x�t|�D]z\}}|ddkrP|d|dkrP|dd�}t|�dkr�t|�d|�d	|�d
|�d���||jkr�g|j|<|||<qPqPWd|k�rf|ddkr�t|�d|�d
���|ddk�rt|�d|�d���|d}	|jj|	�}
|
�sNt|�d|�d|	����n|jj|	�|dd�=nt||j�}	|jj|	d�}
d||f}||j	k�r�|j	|}t|�d|�d|�d�d|j
�d|j����t|j�}
||j
k�r�g|j
|<xR|D]J}||jk�r|j|j|
�n&||j
k�r.g|j
|<|j
|j|
��q�Wt|
|||
|||�}|jj|�||j	|<y|j|j|�Wn"tk
�r�|g|j|<YnXdS)N�:z: Illegal rule name z. Already defined as a tokenrz. error is a reserved wordrz'"r8z: 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 rAz%s -> %sz: Duplicate rule z. zPrevious definition at ���rr���rr�)rAr)rnrjrLr*rr�getrt�addrirmrGrHrlrorMr@r[r^)r�prodname�symsrFrGrHr&r#�cZprecnameZprodprec�maprSZpnumber�tr`r
r
r�add_production�s^
 








zGrammar.add_productioncCsX|s|jdj}||jkr*td|�d���tdd|g�|jd<|j|jd�||_dS)Nr8z
start symbol z
 undefinedrzS')rlr6rorjr@rMru)r�startr
r
r�	set_start�s
zGrammar.set_startcs>���fdd��t����jdjd��fdd��jD�S)NcsJ|�krdS�j|�x.�jj|g�D]}x|jD]}�|�q2Wq&WdS)N)r�r[r�rD)r#r`�r)�mark_reachable_from�	reachablerr
rr��s
z5Grammar.find_unreachable.<locals>.mark_reachable_fromrcsg|]}|�kr|�qSr
r
)�.0r#)r�r
r�
<listcomp>sz,Grammar.find_unreachable.<locals>.<listcomp>)rsrlrDro)rr
)r�r�rr�find_unreachable�szGrammar.find_unreachablecCs�i}x|jD]}d||<qWd|d<x|jD]}d||<q,Wxpd}x`|jj�D]R\}}xH|D]@}x |jD]}||shd}PqhWd}|r\||s�d||<d}Pq\WqNW|s>Pq>Wg}	x@|j�D]4\}}
|
s�||jkr�||jkr�|dkr�q�|	j|�q�W|	S)NTz$endFr)rnror[rNrDrM)rZ
terminatesr�r&�some_changeZplr`r#Zp_terminates�infinitervr
r
r�infinite_cycless:

zGrammar.infinite_cyclescCsXg}xN|jD]D}|sqx8|jD].}||jkr||jkr|dkr|j||f�qWqW|S)Nr)rlrDr[rnrM)r�resultr`r#r
r
r�undefined_symbolsPszGrammar.undefined_symbolscCs8g}x.|jj�D] \}}|dkr|r|j|�qW|S)Nr)rnrNrM)rZ
unused_tokr#r(r
r
r�unused_terminalsas
zGrammar.unused_terminalscCs<g}x2|jj�D]$\}}|s|j|d}|j|�qW|S)Nr)rorNr[rM)rZunused_prodr#r(r`r
r
r�unused_rulespszGrammar.unused_rulescCsDg}x:|jD]0}||jkp"||jks|j||j|df�qW|S)Nr)rrrnrtrM)rZunusedZtermnamer
r
r�unused_precedence�s
zGrammar.unused_precedencecCs`g}xV|D]D}d}x2|j|D]$}|dkr0d}q||kr|j|�qW|rLq
Pq
W|jd�|S)NFz<empty>T)rprM)rZbetar��xZx_produces_emptyrr
r
r�_first�s

zGrammar._firstcCs�|jr|jSx|jD]}|g|j|<qWdg|jd<x|jD]}g|j|<q<Wxjd}xZ|jD]P}xJ|j|D]<}x6|j|j�D]&}||j|kr~|j|j|�d}q~WqlWq\W|sPPqPW|jS)Nz$endFT)rprnror[r�rDrM)rr�r&r�r`rr
r
r�
compute_first�s$zGrammar.compute_firstc
CsV|jr|jS|js|j�x|jD]}g|j|<q"W|sD|jdj}dg|j|<�x�d}x�|jdd�D]�}x�t|j�D]�\}}||jkrx|j|j|dd��}d}xB|D]:}	|	dkr�|	|j|kr�|j|j	|	�d}|	dkr�d}q�W|�s|t
|j�dkrxx:|j|jD]*}	|	|j|k�r|j|j	|	�d}�qWqxWqhW|sTPqTW|jS)Nr8z$endFz<empty>T)rqrpr�rorlr6rLrDr�rMr*)
rr��k�didaddr`rh�BZfstZhasemptyrr
r
r�compute_follow�s<

zGrammar.compute_followcCs�x�|jD]�}|}d}g}x�|t|�kr,d}ntt||�}y|j|j|d|_Wnttfk
rng|_YnXy|j|d|_Wntk
r�d|_YnX||_	|s�P|j
|�|}|d7}qW||_qWdS)Nrr8)rlr*rZr[rDr\r]r^r_rQrMrP)rr`ZlastlrirhrPZlrir
r
r�
build_lritemss.

zGrammar.build_lritemscCsg}|jd�x.t|j�D] \}}|jd|d�d|���qW|j�}|rr|jd�x|D]}|jd|���qZW|jd�x:t|j�D],}|jd|djd	d
�|j|D��f�q�W|jd�x:t|j�D],}|jd|djdd
�|j|D��f�q�W|jd
�dj|�S)Nz	Grammar:
zRule z<5drVz
Unused terminals:
z    z*
Terminals, with rules where they appear:
z
%-20s : %scss|]}t|�VqdS)N)r)r�r#r
r
r�	<genexpr>Csz"Grammar.__str__.<locals>.<genexpr>z-
Nonterminals, with rules where they appear:
css|]}t|�VqdS)N)r)r�r#r
r
rr�GsrBr)rMrLrlr��sortedrnr5ro)r�outr&r`r�rvZnontermr
r
rr5s"



,
,
zGrammar.__str__)NrBr)N)N)rrrrr+r'r|r�r�r�r�r�r�r�r�r�r�r�r�rr
r
r
rrkQs"$
K
@#%
;!rkc	CsTi}x|D]}d||<q
Wg}i}x,|D]$}||dkr(t|||||||�q(W|S)Nr)�traverse)�X�R�FP�Nr�r$�Fr
r
r�digraphds

r�c	Cs|j|�t|�}|||<||�||<||�}xr|D]j}	||	dkrXt|	||||||�t||||	�||<x.|j|	g�D]}
|
||kr|||j|
�q|Wq4W|||k�rt||d<||||d<|j�}x2||k�rt||d<||||d<|j�}q�WdS)Nrr8rrrr)rMr*r��minr��MAXINT�pop)r�r�r$r�r�r�r��d�rel�y�a�elementr
r
rr�os(

r�c@seZdZdS)�	LALRErrorN)rrrr
r
r
rr��sr�c@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�ZdS) �LRTablecCs�||_i|_i|_|j|_i|_i|_d|_t�|_	d|_
d|_g|_g|_
g|_|jj�|jj�|jj�|j�i|_xH|jj�D]:\}}t|j��}t|�dkr�|ddkr�|d|j|<q�WdS)Nrr8)�grammar�	lr_action�lr_gotorlZlr_productions�
lr_goto_cache�lr0_cidhash�
_add_countr�state_descriptionsZsr_conflictZrr_conflictZ	conflicts�sr_conflicts�rr_conflictsr�r�r��lr_parse_table�defaulted_statesrNrK�valuesr*)rr��state�actions�rulesr
r
rr�s,



zLRTable.__init__cCsz|jd7_|dd�}d}xV|rtd}xH|D]@}x:|jD]0}t|dd�|jkrRq:|j|j�|j|_d}q:Wq.Wq W|S)Nr8TF�	lr0_addedr)r�r\r.rMrQr�)r�I�Jr��jr�r
r
r�lr0_closure�s
zLRTable.lr0_closurec	Cs�|jjt|�|f�}|r|S|jj|�}|s:i}||j|<g}xP|D]H}|j}|rD|j|krD|jt|��}|s~i}||t|�<|j|�|}qDW|jd�}|s�|r�|j|�}||d<n||d<||jt|�|f<|S)Nz$end)r�r��idrQr_rMr�)	rr�r��gr#Zgsr`r&�s1r
r
r�lr0_goto�s2





zLRTable.lr0_gotoc	Cs�|j|jjdjg�g}d}x"|D]}||jt|�<|d7}q"Wd}x�|t|�kr�||}|d7}i}x$|D]}x|jD]}d||<qxWqlWxJ|D]B}|j||�}|s�t|�|jkr�q�t|�|jt|�<|j	|�q�WqFW|S)Nrr8)
r�r�rlrQr�r�r*rJr�rM)	r�Crhr�Zasyms�iir#r�r�r
r
r�	lr0_items�s(


zLRTable.lr0_itemscCs�t�}d}xrxV|jjdd�D]B}|jdkr:|j|j�qx$|jD]}||krBPqBW|j|j�qWt|�|krrPt|�}qW|S)Nrr8)rsr�rlr*r�r6rD)r�nullableZnum_nullabler`r�r
r
r�compute_nullable_nonterminals/s
z%LRTable.compute_nullable_nonterminalscCsrg}xht|�D]\\}}xR|D]J}|j|jdkr||j|jdf}|d|jjkr||kr|j|�qWqW|S)Nr8)rLrdr*rDr�rorM)rr��transZstatenor�r`r�r
r
r�find_nonterminal_transitionsLs
z$LRTable.find_nonterminal_transitionscCs�i}|\}}g}|j|||�}xJ|D]B}	|	j|	jdkr&|	j|	jd}
|
|jjkr&|
|kr&|j|
�q&W|dkr�||jjdjdkr�|jd�|S)Nr8rz$end)r�rdr*rDr�rnrMrl)rr�r�r�Zdr_setr�r�Ztermsr�r`r�r
r
r�dr_relation`s

zLRTable.dr_relationcCsvg}|\}}|j|||�}|jjt|�d�}xB|D]:}	|	j|	jdkr4|	j|	jd}
|
|kr4|j||
f�q4W|S)Nr8r)r�r�r�r�rdr*rDrM)rr�r��emptyr�r�r�r�r�r`r�r
r
r�reads_relationys
zLRTable.reads_relationcCs�i}i}i}x|D]}d||<qW�x�|D�]�\}}	g}
g}�xR||D�]D}|j|	krZqH|j}
|}x�|
|jdk�r
|
d}
|j|
}||f|kr�|
d}xH||jkr�|j||jjkr�P|j||kr�P|d}q�W|j||f�|j|||�}|jj	t
|�d�}qfWx�||D]t}|j|jk�r,�q|j|jk�r>�qd}xD||jk�rx|j||j|dk�rlP|d}�qDW|
j||f��qWqHWx2|D]*}||k�r�g||<||j||	f��q�W|
|||	f<q*W||fS)Nr8rr)r6rdr*rDr�rnrMr�r�r�r�)rr�r�r�ZlookdictZincludedictZdtransr�r�r�ZlookbZincludesr`rdr�Zlir�r�rhr
r
r�compute_lookback_includes�sX




z!LRTable.compute_lookback_includescs0���fdd�}���fdd�}t|||�}|S)Ncs�j�|��S)N)r�)r�)r�r�rr
r�<lambda>�sz+LRTable.compute_read_sets.<locals>.<lambda>cs�j�|��S)N)r�)r�)r�r�rr
rr��s)r�)rr��ntransr�r�r�r�r
)r�r�rr�compute_read_sets�szLRTable.compute_read_setscs(�fdd�}�fdd�}t|||�}|S)Ncs�|S)Nr
)r�)�readsetsr
rr�sz-LRTable.compute_follow_sets.<locals>.<lambda>cs�j|g�S)N)r�)r�)�inclsetsr
rr�s)r�)rr�r�r�r�r�r�r
)r�r�r�compute_follow_sets
szLRTable.compute_follow_setsc	Csxxr|j�D]f\}}x\|D]T\}}||jkr4g|j|<|j|g�}x*|D]"}||j|krF|j|j|�qFWqWq
WdS)N)rNrer�rM)	rZ	lookbacksZ	followsetr�Zlbr�r`rr�r
r
r�add_lookaheadss


zLRTable.add_lookaheadscCsP|j�}|j|�}|j|||�}|j|||�\}}|j|||�}|j||�dS)N)r�r�r�r�r�r�)rr�r�r�r�ZlookdZincludedZ
followsetsr
r
r�add_lalr_lookaheads.s
zLRTable.add_lalr_lookaheadsc#Cs�|jj}|jj}|j}|j}i}|j�}|j|��x�t|�D�]�\}}g}	g}
i}i}i}
|	jd|�d��x$|D]}|	jd|j	�d|���qtW�x|D�]}|j
|jdk�r�|jdkr�d|d<||d<�q�|j
|}�x�|D�]}|
j||d	|j	�d
|�d�f�|j|�}|dk	�r�|dk�r|j|d�\}}||j	j\}}||k�sf||k�r�|d
k�r�|j	||<|||<|�r�|�r�|	jd|�d��|jj||df�||j	jd7_nH||k�r�|dk�r�d||<n*|�s�|	jd|�d��|jj||df�n�|dk�r�||}||j	}|j|jk�r�|j	||<|||<||}}||j	jd7_||j	jd8_n
||}}|jj|||f�|	jd|||j	||f�ntd|����q�|j	||<|||<||j	jd7_q�Wq�|j}|j|d}||jjkr�|j||�}|jjt|�d�}|dkr�|
j||d|��f�|j|�}|dk	�r�|dk�r�||k�r�td|�����q�|dk�r�|||j	j\}}|j|d �\}}||k�s�||k�r2|dk�r2|||j	jd8_|||<|||<|�s�|	jd|�d��|jj||df�nR||k�rP|dk�rPd||<n4|�r�|�r�|	jd|�d��|jj||df�ntd|����q�|||<|||<q�Wi}xP|
D]H\}}}||k�r�|||k�r�|	jd|d�d|���d|||f<�q�W|	jd�i}x6|D].} x&| jD]}!|!|jjk�r d||!<�q W�qWxV|D]N}"|j||"�}|jjt|�d!�}|dk�rL||
|"<|	jd|"d�d|����qLW|||<|||<|
||<dj|	�|j|<q>WdS)"Nz
state rz    (z) r8zS'rz$endzreduce using rule z (rWrArwz  ! shift/reduce conflict for z resolved as reduce�reducerxz resolved as shiftZshiftz=  ! reduce/reduce conflict for %s resolved using rule %d (%s)zUnknown conflict in state zshift and go to state zShift/shift conflict in state z    z<15srVrBz<30sz shift and go to state )rArr)rArr)r�rlrrr�r�r�r�rLrMrEr*rdr6rer�rIr�rcrHr�r�rDrnr�r�r�rJror5r�)#rrlrr�goto�actionZactionpr��str��descripZactlistZ	st_actionZ
st_actionpZst_gotor`Zlaheadsr�r�ZsprecZslevelZrprecZrlevelZoldpZppZchosenpZrejectprhr�r�Z	_actprintrSZnkeysr�r#r&r
r
rr�Fs�



 



















zLRTable.lr_parse_tablec
Cs6g}x|jj�D]}|j|�qW|js0|j�r,|jd�x0|jD]&\}}}|jd|�d|�d|���qBWt�}xp|jD]f\}}}|t|�t|�f|kr�qz|jd|�d|���|jd|�d|���|j|t|�t|�f�qzWt�}	x@|jD]6\}}}|jr�||	kr�|jd	|�d
��|	j|�q�Wdj	|�S)Nz
Conflicts:
zshift/reduce conflict for z
 in state z
 resolved as z reduce/reduce conflict in state z resolved using rule zrejected rule (z) in state zRule (z) is never reducedr)
r�r�rMr�r�rsr�r�rcr5)
rr�r�r�r0Z
resolutionZalready_reported�ruleZrejectedZwarned_neverr
r
rr�s(
 zLRTable.__str__N)rrrrr�r�r�r�r�r�r�r�r�r�r�r�r�rr
r
r
rr��s )#8+P%r�c	Cs�g}x�|r�|j}tj|�}|jj}|jj}x�t|jt|t	|j�ddd��D]j\}}|j
�}|dd�dgks�|dd�dgkr�|j||||d|dd�f�qN|j|||||f�qNWt|dd�}qW|S)Nr8rr~r}z::=�	next_funcr)
r�inspectZunwrap�__code__�co_filename�co_firstlineno�zipr��ranger*�splitrMr.)rFr�r�Z	unwrapped�filenamer,r�r�r
r
r�_collect_grammar_ruless
,$"r�cs,eZdZdZ�fdd�Z�fdd�Z�ZS)�ParserMetaDictzR
    Dictionary that allows decorated grammar rule functions to be overloaded
    csX||krFt|�rFt|d�rF|||_t|jd�sFtd|�d|�d���t�j||�dS)Nr�zRedefinition of z. Perhaps an earlier z is missing @_)�callable�hasattrr�rjr:r))rrTr%)r<r
rr)s

zParserMetaDict.__setitem__cs8||kr(|j�r(|dd�dkr(|j�St�j|�SdS)Nr8r9)�isupper�upperr:r')rrT)r<r
rr'"s zParserMetaDict.__getitem__)rrrr	r)r'r?r
r
)r<rr�sr�cs(eZdZedd��Z�fdd�Z�ZS)�
ParserMetacOst�}dd�}||d<|S)Ncs|f|���fdd�}|S)Ncs t|dg��ddd��|_|S)Nr�r8r)r.r�)rF)r�r
r�decorate.sz3ParserMeta.__prepare__.<locals>._.<locals>.decorater
)r��extrar�r
)r�rr9,s
z!ParserMeta.__prepare__.<locals>._r9)r�)�metarrr�r9r
r
r�__prepare__)szParserMeta.__prepare__cs.|d=t�j||||�}|jt|j���|S)Nr9)r:�__new__�_buildrKrN)r��clsname�bases�
attributes�cls)r<r
rr�5szParserMeta.__new__)rrr�classmethodr�r�r?r
r
)r<rr�(sr�c@s�eZdZeej�ZdZedd��Z	edd��Z
edd��Zedd	��Zed
d��Z
edd
��Zedd��Zdd�Zdd�Zdd�Zdd�ZdS)rNcCsNt|d�s|jjd�dS|js0|jjd�dSd|jkrJ|jjd�dSdS)N�tokenszNo token list is definedFztokens is emptyrz.Illegal token name 'error'. Is a reserved wordT)r��logrr)r�r
r
rZ__validate_tokensBs

zParser.__validate_tokenscs�t|d�sg|_dSg}t|jttf�s8|jjd�dSx�t|jdd�D]�\�}t|ttf�sv|jjd|�d��dSt	|�d	kr�|jjd
|�d��dSt
dd
�|D��s�|jjd�dS|d�|j��fdd
�|dd�D��qHW||_dS)NrRTz"precedence must be a list or tupleFr8)r�zBad precedence table entry z. Must be a list or tupler~zMalformed precedence entry z". Must be (assoc, term, ..., term)css|]}t|t�VqdS)N)r-r)r�rvr
r
rr�fsz/Parser.__validate_precedence.<locals>.<genexpr>z precedence items must be stringsrc3s|]}|��fVqdS)Nr
)r�rv)rzr{r
rr�ks)r��_Parser__preclistr-rRrKrCrrrLr*�all�extend)r�Zpreclistr`r
)rzr{rZ__validate_precedenceRs*
&zParser.__validate_precedencecCs|j�sdS|j�sdSdS)zE
        Validate various parts of the grammar specification
        FT)�_Parser__validate_tokens�_Parser__validate_precedence)r�r
r
rZ__validate_specificationps
zParser.__validate_specificationcCs6g}d}|std��t|j�}xX|jD]N\}}}y|j|||�Wq&tk
rr}z||�d�7}WYdd}~Xq&Xq&Wx�|D]�\}	}
ylt|
�}x^|D]V\}}
}}}y|j||||
|�Wq�tk
r�}z||�d�7}WYdd}~Xq�Xq�WWq~tk
�r$}z||�d�7}WYdd}~Xq~Xq~Wy|j	t
|dd��Wn2tk
�rr}z||�d�7}WYdd}~XnX|j�}x(|D] \}}|d|j|j
|f7}�q�W|j�}|�r�ddj|�d	}|jjd
t|�dk�r�dnd�d
|�d��|j�}x&|D]}|jjd|j|j
|j��qWt|�dk�r<|jjd�t|�dk�r\|jjdt|��t|�dk�rv|jjd�t|�dk�r�|jjdt|��|j�}x|D]}|jjd|��q�Wt|�dk�r�|j�}x|D]}|d|7}�q�W|j�}x"|D]\}}|d||f7}�q�W||_|�r2td|��dS)z:
        Build the grammar from the grammar rules
        rBzNo grammar rules are definedrNr�z<%s:%d: Symbol %r used, but not defined as a token or a rule
r2�,r3�Tokenr8z(s)rVz defined, but not usedz$%s:%d: Rule %r defined, but not usedzThere is 1 unused tokenzThere are %d unused tokenszThere is 1 unused rulezThere are %d unused ruleszSymbol %r is unreachablerz*Infinite recursion detected for symbol %r
z1Precedence rule %r defined for unknown symbol %r
zUnable to build grammar.
)rrkrrr|rjr�r��SyntaxErrorr�r.r�rGrHr�r5rrr*r�r6r�r�r��_grammar)r�r�Z
grammar_rules�errorsr�rvrzr{�er6rFZparsed_ruleZpfuncZrulefileZruleliner�r�r��symrDr�Z
unused_strr�Zunreachable�ur��infZunused_precr
r
rZ__build_grammar{sn
$($ ,


zParser.__build_grammarcCs�t|j�}t|j�}|t|dd�krP|dkr:|jjd�n|dkrP|jjd|�t|j�}|t|dd�kr�|dkr�|jjd�n|dkr�|jjd|�||_d	S)
z>
        Build the LR Parsing tables from the grammar
        Zexpected_shift_reduceNr8z1 shift/reduce conflictz%d shift/reduce conflictsZexpected_reduce_reducez1 reduce/reduce conflictz%d reduce/reduce conflictsT)	r�rr*r�r.rrr��_lrtable)r�ZlrtableZnum_srZnum_rrr
r
rZ__build_lrtables�s


zParser.__build_lrtablescCsdd�|D�}|S)z9
        Collect all of the tagged grammar rules
        cSs*g|]"\}}t|�rt|d�r||f�qS)r�)r�r�)r�r6r%r
r
rr��sz*Parser.__collect_rules.<locals>.<listcomp>r
)r��definitionsr�r
r
rZ__collect_rules�szParser.__collect_rulescCs�t|�jdd�rdS|j|�}|j�s.td��|j|�|j�sHtd��|jr�t|jd��0}|j	t
|j��|j	d�|j	t
|j��WdQRX|j
jd|j|j�dS)Nr�FzInvalid parser specificationzCan't build parsing tables�wrz%Parser debugging for %s written to %s)�varsr��_Parser__collect_rules�_Parser__validate_specificationr�_Parser__build_grammar�_Parser__build_lrtables�	debugfile�openrrrrrrr)r�rr�rr
r
rr��s


z
Parser._buildcCsX|rHt|dd�}|r2tjjd|�d|j�d��qTtjjd|j���ntjjd�dS)	zK
        Default error handling function.  This may be subclassed.
        r,rzsly: Syntax error at line z, token=rzsly: Syntax error, token=zsly: Parse error in input. EOF
N)r.�sys�stderrrr)rZtokenr,r
r
rr
szParser.errorcCs
d|_dS)z(
        Clear the error status
        TN)�errorok)rr
r
r�errokszParser.errokcCsF|jdd�=|jdd�=t�}d|_|jj|�|jjd�d|_dS)zW
        Force the parser to restart from a fresh state. Clears the statestack
        Nz$endr)�
statestack�symstackrrrMr�)rrr
r
r�restartszParser.restartcCs2d}g}|jj}|jj}|jj}|jj}td�}d}	||_g|_}
g|_	}||_
|j�d}�x�|j|kr�|s�|s�t
|d�}n|j�}|s�t�}d|_|j}
||jj|
�}n
||j}|dk	�r�|dk�r�|
j|�||_|j|�d}|	rd|	d8}	qd|dk�r�|||_}|j}|j}|j|_|�r>||d�ng|_t�}||_|j||�}||k�r||fdd�|jD��}||_|�r�||d�=|
|d�=|j|�||
d||_|
j|j�qd|dk�r�|d}t|dd�}|S|dk�r"|	dk�s|j�rRt}	d|_|jdk�r$d}n|}|j|�}|�rF|}d	|_qdn
|�sVdSnt}	t|
�dk�r�|jdk�r�d}d|_|dd�=qd|jdk�r�dS|jd
k�r|d}|jd
k�r�d}qdt�}d
|_t|d��r�|j |_ t|d��r�|j!|_!||_|j|�|}qd|j�}|
j�|
d|_qdt"d
��qdWdS)z/
        Parse the given input tokens.
        Nrz$endr8css|]}|jVqdS)N)r%)r�r#r
r
rr�nszParser.parse.<locals>.<genexpr>r%FTrr,r1zsly: internal parser error!!!
rrrr)#rr�r�rrlr�rrrr r"r!r��nextr�rrr�rMZ
productionr6r*rOr!r rFr%r.r�ERROR_COUNTrr�r,r1rX)rrZ	lookaheadZlookaheadstackr�r�rDr�ZpsliceZ
errorcountrr ZerrtokenZltyper�r`ZpnameZplenrr%r&r�r0r
r
r�parse)s�
















zParser.parse)rrrr
rrrrrrrrrrrr�rrr!r$r
r
r
rr;s
K
)�	metaclass)rr��collectionsrr�__all__�	Exceptionrr#�maxsizer��objectr
rrr@rZrirjrkr�r�r�r�r��dictr�rr�rr
r
r
r�<module>"s<
Ve
z