B
    v9aª%  ã               @   s.   d dl Z d dlmZmZ G dd„ dejƒZdS )é    N)ÚgrammarÚtokenc               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú	Converterc             C   s    |   |¡ |  |¡ |  ¡  d S )N)Úparse_graminit_hÚparse_graminit_cÚ
finish_off)ÚselfZ
graminit_hZ
graminit_c© r	   ú/usr/lib/python3.7/conv.pyÚrun/   s    

zConverter.runc       	   
   C   sÂ   yt |ƒ}W n2 tk
r> } ztd||f ƒ dS d }~X Y nX i | _i | _d}xl|D ]d}|d7 }t d|¡}|s’| ¡ r’td||| ¡ f ƒ qV| ¡ \}}t	|ƒ}|| j|< || j|< qVW dS )NzCan't open %s: %sFr   é   z^#define\s+(\w+)\s+(\d+)$z%s(%s): can't parse %sT)
ÚopenÚOSErrorÚprintZsymbol2numberZnumber2symbolÚreÚmatchÚstripÚgroupsÚint)	r   ÚfilenameÚfÚerrÚlinenoÚlineÚmoÚsymbolÚnumberr	   r	   r
   r   5   s&    

zConverter.parse_graminit_hc       !   
   C   sÞ  yt |ƒ}W n2 tk
r> } ztd||f ƒ dS d }~X Y nX d}|d t|ƒ }}|d t|ƒ }}|d t|ƒ }}i }g }x‚| d¡rx¼| d¡rNt d|¡}ttt	| 
¡ ƒƒ\}	}
}g }xRt|ƒD ]F}|d t|ƒ }}t d|¡}ttt	| 
¡ ƒƒ\}}| ||f¡ qÒW |d t|ƒ }}|||	|
f< |d t|ƒ }}q”W t d|¡}ttt	| 
¡ ƒƒ\}}g }x^t|ƒD ]R}|d t|ƒ }}t d	|¡}ttt	| 
¡ ƒƒ\}}	}
||	|
f }| |¡ q€W | |¡ |d t|ƒ }}|d t|ƒ }}q†W || _i }t d
|¡}t	| d¡ƒ}xòt|ƒD ]æ}|d t|ƒ }}t d|¡}| d¡}ttt	| dddd¡ƒƒ\}}}}|| }|d t|ƒ }}t d|¡}i }t| d¡ƒ}xPt|ƒD ]D\}}t|ƒ}x0tdƒD ]$}|d|> @ ràd||d | < qàW qÆW ||f||< q6W |d t|ƒ }}|| _g }|d t|ƒ }}t d|¡}t	| d¡ƒ}xjt|ƒD ]^}|d t|ƒ }}t d|¡}| 
¡ \}}t	|ƒ}|dkr¸d }nt|ƒ}| ||f¡ qrW |d t|ƒ }}|| _|d t|ƒ }}|d t|ƒ }}t d|¡}t	| d¡ƒ}|d t|ƒ }}|d t|ƒ }}t d|¡}t	| d¡ƒ}|d t|ƒ }}t d|¡}t	| d¡ƒ} | | _|d t|ƒ }}y|d t|ƒ }}W n tk
rØ   Y nX d S )NzCan't open %s: %sFr   r   zstatic arc z)static arc arcs_(\d+)_(\d+)\[(\d+)\] = {$z\s+{(\d+), (\d+)},$z'static state states_(\d+)\[(\d+)\] = {$z\s+{(\d+), arcs_(\d+)_(\d+)},$zstatic dfa dfas\[(\d+)\] = {$z0\s+{(\d+), "(\w+)", (\d+), (\d+), states_(\d+),$é   é   é   é   z\s+("(?:\\\d\d\d)*")},$é   z!static label labels\[(\d+)\] = {$z\s+{(\d+), (0|"\w+")},$Ú0z
\s+(\d+),$z\s+{(\d+), labels},$z	\s+(\d+)$)r   r   r   ÚnextÚ
startswithr   r   ÚlistÚmapr   r   ÚrangeÚappendÚstatesÚgroupÚevalÚ	enumerateÚordÚdfasÚlabelsÚstartÚStopIteration)!r   r   r   r   r   r   Zallarcsr)   r   ÚnÚmÚkZarcsÚ_ÚiÚjÚsÚtÚstater.   Zndfasr   r   ÚxÚyÚzÚfirstZ	rawbitsetÚcZbyter/   Znlabelsr0   r	   r	   r
   r   T   sº    

"
zConverter.parse_graminit_cc             C   s\   i | _ i | _xJt| jƒD ]<\}\}}|tjkrB|d k	rB|| j |< q|d kr|| j|< qW d S )N)ÚkeywordsÚtokensr,   r/   r   ÚNAME)r   ZilabelÚtypeÚvaluer	   r	   r
   r   ù   s    zConverter.finish_offN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r	   r	   r	   r
   r   $   s
    &r   )r   Zpgen2r   r   ZGrammarr   r	   r	   r	   r
   Ú<module>   s   