B

�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|j�||d�dS)N�
)r�write)r�msg�args�kwargsr
r
r�debugBszSlyLogger.debugcOs|j�d||d�dS)Nz	WARNING: r)rr)rrrrr
r
r�warningGszSlyLogger.warningcOs|j�d||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�Zdd�Zd	d
�Zedd��Z	ed
d��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|jSdd�|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��||�ntd|����dS)N��_z&Can't reassign the value of attribute )�super�__setattr__r/)rr6r%)�	__class__r
rr;�szYaccProduction.__setattr__)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��rightrN�cCs�||_t|�|_||_||_||_||_||_t|j�|_g|_	t
t�}x:t|j�D],\}	}
||
�
|	�|
|j	krT|j	�
|
�qTWi}xT|��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)rrFr6rE�
precedencerGrHrIZsymmapr&r#�m�key�indicesr1r
r
rr�s.

zProduction.__init__cCsF|jrd|jd�|j�f}n|j�d�}|jdrB|d|j7}|S)Nz%s -> %s� z -> <empty>r8z  [precedence=%s, level=%d])rEr6r5rJ)rr#r
r
rr�s
zProduction.__str__cCsd|�d�S)NzProduction(�)r
)rr
r
rr�szProduction.__repr__cCs
t|j�S)N)r*rE)rr
r
rr+�szProduction.__len__cCstd��dS)NZUsedr8)�RuntimeError)rr
r
r�__nonzero__�szProduction.__nonzero__cCs
|j|S)N)rE)rr1r
r
rr'�szProduction.__getitem__c	Cs�|t|j�krdSt||�}yt|j|d|_Wnttfk
rRg|_YnXy|j|d|_Wntk
r�d|_YnX|S)Nr8)r*rE�LRItem�	Prodnames�lr_after�
IndexError�KeyError�	lr_before)rr&�pr
r
r�lr_item�s
zProduction.lr_item)rANrCr)rrr�reducedrrrr+rZr'rbr
r
r
rr@�s
#r@c@s$eZdZdd�Zdd�Zdd�ZdS)r[cCsZ|j|_t|j�|_|j|_||_i|_|j�|d�t|j�|_t|j�|_|j	|_	dS)Nr4)
r6rLrErF�lr_index�
lookaheads�insertrDr*rK)rrar&r
r
rr$szLRItem.__init__cCs.|jrd|jd�|j�f}n|j�d�}|S)Nz%s -> %srWz -> <empty>)rEr6r5)rr#r
r
rr/szLRItem.__str__cCsd|�d�S)NzLRItem(rXr
)rr
r
rr6szLRItem.__repr__N)rrrrrrr
r
r
rr[#sr[cCs: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 )�leftrB�nonassoczAssociativity of z- must be one of 'left','right', or 'nonassoc')rl�AssertionErrorrrrj)rrv�assoc�levelr
r
r�set_precedence�s
zGrammar.set_precedenceNrCrc
Cs�||jkr$t|�d|�d|�d���|dkrFt|�d|�d|�d���x�t|�D]z\}}|ddkrP|d|dkrP|d	d�}t|�d	kr�t|�d|�d
|�d|�d���||jkr�g|j|<|||<qPqPWd
|k�rf|dd
kr�t|�d|�d���|dd
k�rt|�d|�d���|d}	|j�|	�}
|
�sNt|�d|�d|	����n|j�|	�|dd�=nt||j�}	|j�|	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|�|
�n&||j
k�r.g|j
|<|j
|�|
��q�Wt|
|||
|||�}|j�|�||j	|<y|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 )rBrz%s -> %sz: Duplicate rule z. zPrevious definition at )rnrjrMr*rr�getrt�addrirmrHrIrlrorNr@r\r_)r�prodname�symsrGrHrIr&r#�cZprecnameZprodprec�maprTZpnumber�trar
r
r�add_production�s^
 








zGrammar.add_productioncCsX|s|jdj}||jkr*td|�d���tdd|g�|jd<|j|�d�||_dS)Nr8z
start symbol z
 undefinedrzS')rlr6rorjr@rNru)r�startr
r
r�	set_start�s
zGrammar.set_startcs>���fdd��t����jdjd��fdd��jD�S)NcsJ|�krdS��|�x.�j�|g�D]}x|jD]}�|�q2Wq&WdS)N)r�r\r�rE)r#ra�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>)rsrlrEro)rr
)r�r�rr�find_unreachable�szGrammar.find_unreachablecCs�i}x|jD]}d||<qWd|d<x|jD]}d||<q,Wxpd}x`|j��D]R\}}xH|D]@}x |jD]}||shd}PqhWd}|r\||s�d||<d}Pq\WqNW|s>Pq>Wg}	x@|��D]4\}}
|
s�||jkr�||jkr�|dkr�q�|	�|�q�W|	S)NTz$endFr)rnror\rOrErN)rZ
terminatesr�r&�some_changeZplrar#Zp_terminates�infinitervr
r
r�infinite_cycless:

zGrammar.infinite_cyclescCsXg}xN|jD]D}|sqx8|jD].}||jkr||jkr|dkr|�||f�qWqW|S)Nr)rlrEr\rnrN)r�resultrar#r
r
r�undefined_symbolsPszGrammar.undefined_symbolscCs6g}x,|j��D]\}}|dkr|s|�|�qW|S)Nr)rnrOrN)rZ
unused_tokr#r(r
r
r�unused_terminalsas
zGrammar.unused_terminalscCs<g}x2|j��D]$\}}|s|j|d}|�|�qW|S)Nr)rorOr\rN)rZunused_prodr#r(rar
r
r�unused_rulespszGrammar.unused_rulescCsDg}x:|jD]0}||jks||jks|�||j|df�qW|S)Nr)rrrnrtrN)rZunusedZtermnamer
r
r�unused_precedence�s
zGrammar.unused_precedencecCs`g}xV|D]D}d}x2|j|D]$}|dkr0d}q||kr|�|�qW|rLq
Pq
W|�d�|S)NFz<empty>T)rprN)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�D]&}||j|kr~|j|�|�d}q~WqlWq\W|sPPqPW|jS)Nz$endFT)rprnror\r�rErN)rr�r&r�rarr
r
r�
compute_first�s$zGrammar.compute_firstc
CsV|jr|jS|js|��x|jD]}g|j|<q"W|sD|jdj}dg|j|<�x�d}x�|jdd�D]�}x�t|j�D]�\}}||jkrx|�|j|dd��}d}xB|D]:}	|	dkr�|	|j|kr�|j|�	|	�d}|	dkr�d}q�W|�s|t
|j�dkrxx:|j|jD]*}	|	|j|k�r|j|�	|	�d}�qWqxWqhW|sTPqTW|jS)Nr8z$endFz<empty>T)rqrpr�rorlr6rMrEr�rNr*)
rr��k�didaddrarh�BZfstZhasemptyrr
r
r�compute_follow�s<

zGrammar.compute_followc
Cs�x�|jD]�}|}d}g}x�|t|�kr,d}ntt||�}y|j|j|d|_Wnttfk
rng|_YnXy|j|d|_Wntk
r�d|_YnX||_	|s�P|�
|�|}|d7}qW||_qWdS)Nrr8)rlr*r[r\rEr]r^r_r`rRrNrQ)rraZlastlrirhrQZlrir
r
r�
build_lritemss.

zGrammar.build_lritemsc
Csg}|�d�x.t|j�D] \}}|�d|d�d|���qW|��}|rr|�d�x|D]}|�d|���qZW|�d�x:t|j�D],}|�d|d�d	d
�|j|D��f�q�W|�d�x:t|j�D],}|�d|d�dd
�|j|D��f�q�W|�d
�d�|�S)Nz	Grammar:
zRule z<5drWz
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�GsrCr)rNrMrlr��sortedrnr5ro)r�outr&rar�rvZnontermr
r
rr5s"



,
,
zGrammar.__str__)NrCr)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|�|�t|�}|||<||�||<||�}xr|D]j}	||	dkrXt|	||||||�t||||	�||<x.|�|	g�D]}
|
||kr|||�|
�q|Wq4W|||k�rt||d<||||d<|��}x2||k�rt||d<||||d<|��}q�WdS)Nrr~)rNr*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|_|j��|j��|j��|��i|_xH|j��D]:\}}t|���}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_statesrOrL�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|_d}q:Wq.Wq W|S)Nr8TF�	lr0_addedr)r�r]r.rNrRr�)r�I�Jr��jr�r
r
r�lr0_closure�s
zLRTable.lr0_closurec	Cs�|j�t|�|f�}|r|S|j�|�}|s:i}||j|<g}xP|D]H}|j}|rD|j|krD|�t|��}|s~i}||t|�<|�|�|}qDW|�d�}|s�|r�|�|�}||d<n||d<||jt|�|f<|S)Nz$end)r�r��idrRr`rNr�)	rr�r��gr#Zgsrar&�s1r
r
r�lr0_goto�s2





zLRTable.lr0_gotoc	Cs�|�|jjdjg�g}d}x"|D]}||jt|�<|d7}q"Wd}x�|t|�kr�||}|d7}i}x$|D]}x|jD]}d||<qxWqlWxH|D]@}|�||�}|r�t|�|jkr�q�t|�|jt|�<|�	|�q�WqFW|S)Nrr8)
r�r�rlrRr�r�r*rKr�rN)	r�Crhr�Zasyms�iir#r�r�r
r
r�	lr0_items�s(


zLRTable.lr0_itemscCs�t�}d}xrxV|jjdd�D]B}|jdkr:|�|j�qx$|jD]}||krBPqBW|�|j�qWt|�|krrPt|�}qW|S)Nrr8)rsr�rlr*r�r6rE)r�nullableZnum_nullablerar�r
r
r�compute_nullable_nonterminals/s
z%LRTable.compute_nullable_nonterminalscCsrg}xht|�D]\\}}xR|D]J}|j|jdkr||j|jdf}|d|jjkr||kr|�|�qWqW|S)Nr8)rMrdr*rEr�rorN)rr��transZstatenor�rar�r
r
r�find_nonterminal_transitionsLs
z$LRTable.find_nonterminal_transitionscCs�i}|\}}g}|�|||�}xJ|D]B}	|	j|	jdkr&|	j|	jd}
|
|jjkr&|
|kr&|�|
�q&W|dkr�||jjdjdkr�|�d�|S)Nr8rz$end)r�rdr*rEr�rnrNrl)rr�r�r�Zdr_setr�r�Ztermsr�rar�r
r
r�dr_relation`s

zLRTable.dr_relationcCsvg}|\}}|�|||�}|j�t|�d�}xB|D]:}	|	j|	jdkr4|	j|	jd}
|
|kr4|�||
f�q4W|S)Nr~r8)r�r�r�r�rdr*rErN)rr�r��emptyr�r�r�r�r�rar�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|�||f�|�|||�}|j�	t
|�d�}qfWx�||D]t}|j|jk�r,�q|j|jk�r>�qd}xD||jk�rx|j||j|dk�rlP|d}�qDW|
�||f��qWqHWx2|D]*}||k�r�g||<||�||	f��q�W|
|||	f<q*W||fS)Nr8r~r)r6rdr*rEr�rnrNr�r�r�r�)rr�r�r�ZlookdictZincludedictZdtransr�r�r�ZlookbZincludesrardr�Zlir�r�rhr
r
r�compute_lookback_includes�sX




z!LRTable.compute_lookback_includescs0���fdd�}���fdd�}t|||�}|S)Ncs���|��S)N)r�)r�)r�r�rr
r�<lambda>�sz+LRTable.compute_read_sets.<locals>.<lambda>cs���|��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��|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|��D]f\}}x\|D]T\}}||jkr4g|j|<|�|g�}x*|D]"}||j|krF|j|�|�qFWqWq
WdS)N)rOrer�rN)	rZ	lookbacksZ	followsetr�Zlbr�rarr�r
r
r�add_lookaheadss


zLRTable.add_lookaheadscCsP|��}|�|�}|�|||�}|�|||�\}}|�|||�}|�||�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}|��}|�|��x�t|�D�]|\}}g}	g}
i}i}i}
|	�d|�d��x$|D]}|	�d|j	�d|���qtW�x|D�]�}|j
|jdk�r�|jdkr�d|d<||d<�q�|j
|}�x�|D�]}|
�||d	|j	�d
|�d�f�|�|�}|dk	�r�|dk�r
|�|d�\}}||j	j\}}||k�sf||k�r�|d
k�r�|j	||<|||<|�s�|�s�|	�d|�d��|j�||df�||j	jd7_nH||k�r�|dk�r�d||<n*|�s�|	�d|�d��|j�||df�n�|dk�r�||}||j	}|j|jk�r~|j	||<|||<||}}||j	jd7_||j	jd8_n
||}}|j�|||f�|	�d|||j	||f�ntd|����q�|j	||<|||<||j	jd7_q�Wq�|j}|j|d}||jjkr�|�||�}|j�t|�d�}|dkr�|
�||d|��f�|�|�}|dk	�r�|dk�r�||k�r�td|����n�|dk�r||||j	j\}}|�|d�\}}||k�s�||k�r,|dk�r,|||j	jd8_|||<|||<|�sz|	�d|�d��|j�||df�nN||k�rJ|dk�rJd||<n0|�s�|�s�|	�d|�d��|j�||df�ntd|����q�|||<|||<q�Wi}xP|
D]H\}}}||k�r�|||k�r�|	�d|d�d|���d|||f<�q�W|	�d�i}x6|D].} x&| jD]}!|!|jjk�rd||!<�qW�q
WxV|D]N}"|�||"�}|j�t|�d�}|dk�rB||
|"<|	�d|"d�d|����qBW|||<|||<|
||<d�|	�|j|<q>WdS) Nz
state rz    (z) r8zS'rz$endzreduce using rule z (rX)rBrrwz  ! shift/reduce conflict for z resolved as reduce�reducerxz resolved as shift�shiftz=  ! reduce/reduce conflict for %s resolved using rule %d (%s)zUnknown conflict in state r~zshift and go to state zShift/shift conflict in state rBz    z<15srWrCz<30sz shift and go to state )r�rlrrr�r�r�r�rMrNrFr*rdr6rer�rJr�rcrIr�r�rErnr�r�r�rKror5r�)#rrlrr�goto�actionZactionpr��str��descripZactlistZ	st_actionZ
st_actionpZst_gotoraZlaheadsr�r�ZsprecZslevelZrprecZrlevelZoldpZppZchosenpZrejectprhr�r�Z	_actprintrTZnkeysr�r#r&r
r
rr�Fs�



 



















zLRTable.lr_parse_tablec
	Cs4g}x|j��D]}|�|�qW|js0|j�r*|�d�x0|jD]&\}}}|�d|�d|�d|���qBWt�}xp|jD]f\}}}|t|�t|�f|kr�qz|�d|�d|���|�d|�d|���|�|t|�t|�f�qzWt�}	x>|jD]4\}}}|js�||	kr�|�d	|�d
��|	�|�q�Wd�	|�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�rNr�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}t�|�}|jj}|jj}x�t|jt|t	|j�ddd��D]j\}}|�
�}|dd�dgks�|dd�dgkr�|�||||d|dd�f�qN|�|||||f�qNWt|dd�}qW|S)Nr8rr~�r}z::=�	next_func)
r�inspectZunwrap�__code__�co_filename�co_firstlineno�zipr��ranger*�splitrNr.)rGr�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��||�dS)Nr�zRedefinition of z. Perhaps an earlier z is missing @_)�callable�hasattrr�rjr:r))rrUr%)r<r
rr)s

zParserMetaDict.__setitem__cs8||kr(|��r(|dd�dkr(|��St��|�SdS)Nr8r9)�isupper�upperr:r')rrU)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�r~)r.r�)rG)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��||||�}|�t|����|S)Nr9)r:�__new__�_buildrLrO)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|j�d�dS|js0|j�d�dSd|jkrJ|j�d�dSdS)N�tokenszNo token list is definedFztokens is emptyrz.Illegal token name 'error'. Is a reserved wordT)r��logrr)rr
r
rZ__validate_tokensBs

zParser.__validate_tokenscs�t|d�sg|_dSg}t|jttf�s8|j�d�dSx�t|jdd�D]�\�}t|ttf�sv|j�d|�d��dSt	|�d	kr�|j�d
|�d��dSt
dd
�|D��s�|j�d�dS|d�|���fdd
�|dd�D��qHW||_dS)NrSTz"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-rSrLrDrrrMr*�all�extend)rZpreclistrar
)rzr{rZ__validate_precedenceRs*
&zParser.__validate_precedencecCs|��sdS|��sdSdS)zE
        Validate various parts of the grammar specification
        FT)�_Parser__validate_tokens�_Parser__validate_precedence)rr
r
rZ__validate_specificationps
zParser.__validate_specificationcCs6g}d}|std��t|j�}xX|jD]N\}}}y|�|||�Wq&tk
rr}z||�d�7}Wdd}~XYq&Xq&Wx�|D]�\}	}
ylt|
�}x^|D]V\}}
}}}y|�||||
|�Wq�tk
r�}z||�d�7}Wdd}~XYq�Xq�WWq~tk
�r$}z||�d�7}Wdd}~XYq~Xq~Wy|�	t
|dd��Wn2tk
�rr}z||�d�7}Wdd}~XYnX|��}x(|D] \}}|d|j|j
|f7}�q�W|��}|�r�dd�|�d	}|j�d
t|�dk�r�dnd�d
|�d��|��}x&|D]}|j�d|j|j
|j��qWt|�dk�r<|j�d�t|�dk�r\|j�dt|��t|�dk�rv|j�d�t|�dk�r�|j�dt|��|��}x|D]}|j�d|��q�Wt|�dk�r�|��}x|D]}|d|7}�q�W|��}x"|D]\}}|d||f7}�q�W||_|�r2td|��dS)z:
        Build the grammar from the grammar rules
        rCzNo grammar rules are definedrNr�z<%s:%d: Symbol %r used, but not defined as a token or a rule
r2�,r3�Tokenr8z(s)rWz 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�rHrIr�r5rrr*r�r6r�r�r��_grammar)rr�Z
grammar_rules�errorsr�rvrzr{�er6rGZparsed_ruleZpfuncZrulefileZruleliner�r�r��symrEr�Z
unused_strr�Zunreachable�ur��infZunused_precr
r
rZ__build_grammar{sn
$($ ,


zParser.__build_grammarcCs�t|j�}t|j�}|t|dd�krP|dkr:|j�d�n|dkrP|j�d|�t|j�}|t|dd�kr�|dkr�|j�d�n|dkr�|j�d|�||_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�rr*r�r.rrr��_lrtable)rZlrtableZnum_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_rulesc	Cs�t|��dd�rdS|�|�}|��s.td��|�|�|��sHtd��|jr�t|jd��0}|�	t
|j��|�	d�|�	t
|j��WdQRX|j
�d|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�openrrrrrrr)rrr�rr
r
rr��s


z
Parser._buildcCsX|rHt|dd�}|r2tj�d|�d|j�d��qTtj�d|j���ntj�d�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|_|j�|�|j�d�d|_dS)zW
        Force the parser to restart from a fresh state. Clears the statestack
        Nz$endr)�
statestack�symstackrrrNr�)rrr
r
r�restartszParser.restartcCs0d}g}|jj}|jj}|jj}|jj}td�}d}	||_g|_}
g|_	}||_
|��d}�x�|j|kr�|s�|s�t
|d�}n|��}|s�t�}d|_|j}
||j�|
�}n
||j}|dk	�r�|dkr�|
�|�||_|�|�d}|	rd|	d8}	qd|dk�r�|||_}|j}|j}|j|_|�r<||d�ng|_t�}||_|�||�}||k�rz|fdd�|jD��}||_|�r�||d�=|
|d�=|�|�||
d||_|
�|j�qd|dk�r�|d}t|dd�}|S|dk�r |	dk�s|j�rPt}	d	|_|jdk�r"d}n|}|�|�}|�rD|}d
|_qdn
|�sTdSnt}	t|
�dk�r�|jdk�r�d}d|_|dd�=qd|jdk�r�dS|jdk�r|d}|jdk�r�d}qdt�}d|_t|d��r�|j |_ t|d
��r�|j!|_!||_|�|�|}qd|��}|
��|
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~r%FTrr,r1zsly: internal parser error!!!
)#rr�r�rrlr�rrr r!r"r"r��nextr�rrr�rNZ
productionr6r*rPr!r rGr%r.r�ERROR_COUNTrr�r,r1rY)rrZ	lookaheadZlookaheadstackr�r�rEr�ZpsliceZ
errorcountr r!ZerrtokenZltyper�raZpnameZplenrr%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@r[rirjrkr�r�r�r�r��dictr�rr�rr
r
r
r�<module>"s<
Ve
z