o
    ԅZg                  
   @   sh  d dl mZ d dlZejjdk reefZneZeZ	dZ
dZdd ZdZd	Zd
Zdd ZeZdZdd Zdd Zdd Zdd Zdd Zd dlZd dlZd dlZd dlZedZdddddddd d!d"	Zd#d$ Z G d%d& d&e!Z"G d'd( d(e!Z#e$d)krd dl%m&Z& e&& Z'd dlZe(ej)d* Z*e*+ Z,e#e'Z-e-.e,ej)d*  	 e-/ Z0e0sdS e1e-j2e0 qdS )+    )
generatorsN   )
ZCPP_IDCPP_INTEGERZ	CPP_FLOATZ
CPP_STRINGZCPP_CHARCPP_WSZCPP_COMMENT1ZCPP_COMMENT2Z	CPP_POUNDZ
CPP_DPOUNDz+-*/%|&~^<>=!?()[]{}.,;:\'"c                 C      | j  j| jd7  _| S )z\s+
lexerlinenovaluecountt r   )/usr/lib/python3/dist-packages/ply/cpp.pyt_CPP_WS!      r   z\#z\#\#z[A-Za-z_][\w_]*c                 C   s   | S )zA(((((0x)|(0X))[0-9a-fA-F]+)|(\d+))([uU][lL]|[lL][uU]|[uU]|[lL])?)r   r   r   r   r   r   -   s   r   z?((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?c                 C   r   )z\"([^\\\n]|(\\(.|\n)))*?\"r   r   r   r   r   r   t_CPP_STRING7   r   r   c                 C   r   )z(L)?\'([^\\\n]|(\\(.|\n)))*?\'r   r   r   r   r   r   
t_CPP_CHAR=   r   r   c                 C   s>   | j d}| j j|7  _d| _|rd| | _ | S d| _ | S )z(/\*(.|\n)*?\*/)r   r    )r   r   r	   r
   type)r   Zncrr   r   r   t_CPP_COMMENT1C   s   r   c                 C   s   d| _ d| _| S )z(//.*?(\n|$))r   r   )r   r   r   r   r   r   t_CPP_COMMENT2L   s   r   c                 C   s(   | j d | _| j d | _ | jd | S Nr      )r   r   r	   skipr   r   r   r   t_errorR   s   r   z\?\?[=/\'\(\)\!<>\-]#\^[]|{}~)	=/'()!<>-c                 C   s   t dd | S )Nc                 S   s   t |  d  S N)_trigraph_repgroup)gr   r   r   <lambda>|   s    ztrigraph.<locals>.<lambda>)_trigraph_patsub)inputr   r   r   trigraph{      r8   c                   @   s   e Zd ZdddZdS )MacroNFc                 C   s0   || _ || _|| _|| _|r|d | _d | _d S r/   )namer   arglistvariadicvarargsource)selfr;   r   r<   r=   r   r   r   __init__   s   

zMacro.__init__)NF)__name__
__module____qualname__rA   r   r   r   r   r:      s    r:   c                   @   s   e 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d Z
dd Zdd Zd&ddZdd Zd&ddZdd Zdd Zd d! Zdi fd"d#Zd$d% ZdS )'PreprocessorNc                 C   sl   |d u rt j}|| _i | _g | _g | _|   t }| dt	d|  | dt	d|  d | _
d S )Nz__DATE__ "%s"z%b %d %Yz__TIME__ "%s"z%H:%M:%S)lexr	   macrospath	temp_pathlexprobetime	localtimedefinestrftimeparser)r@   r	   Ztmr   r   r   rA      s   
zPreprocessor.__init__c                 C   s0   g }| j | 	 | j  }|s|S || q	N)r	   r7   tokenappend)r@   texttokenstokr   r   r   tokenize   s   

zPreprocessor.tokenizec                 C   s   t d|||f  d S )Nz%s:%d %s)print)r@   filelinemsgr   r   r   error   s   zPreprocessor.errorc                 C   sv  | j d | j  }|r|jdkrtd n|j| _| j d | j  }|r/t|jdkr4td n
|j| _t|j| _	| j d | j  }|rP|jdkrUtd n|j| _
| j d | j  }|rk|jdkrod | _n|j| _| j d	 | j  }|r|jd	krd | _td
 n|j| _| j| jf| _g d}|D ]}| j | | j  }|r|j|krtd|  qd S )NZ
identifierz"Couldn't determine identifier typeZ12345i90  zCouldn't determine integer typez
"filename"zCouldn't determine string typez  r   z%Couldn't determine token for newlines)	r,   r-   r   ##r   r)   r*   ,.z,Unable to lex '%s' required for preprocessor)r	   r7   rQ   r   rW   r   t_IDint	t_INTEGERt_INTEGER_TYPEt_STRINGZt_SPACEZ	t_NEWLINEt_WS)r@   rU   charscr   r   r   rJ      sH   









zPreprocessor.lexprobec                 C   s   | j | d S rP   )rH   rR   )r@   rH   r   r   r   add_path  r9   zPreprocessor.add_pathc                 c   s   | j  }dd | D }tt|D ]6}|d }|| drK|t|k rK|| d d ||  ||< d||< |d7 }|| drK|t|k s(qd|}|| d|_g }	 |	 }|scn|
| |j| jv rxd|jv rx|V  g }q\|r|V  d S d S )Nc                 S   s   g | ]}|  qS r   )rstrip.0xr   r   r   
<listcomp>      z,Preprocessor.group_lines.<locals>.<listcomp>r   r   r0    r   )r	   Zclone
splitlinesxrangelenendswithjoinr7   r
   rQ   rR   r   rd   r   )r@   r7   rF   linesijZcurrent_linerU   r   r   r   group_lines  s6   



	
zPreprocessor.group_linesc                 C   s   d}|t |k r"|| j| jv r"|d7 }|t |k r"|| j| jv s|d |= t |d }|dkrI|| j| jv rI|d8 }|dkrI|| j| jv s9||d d = |S r   )rq   r   rd   )r@   rT   ru   r   r   r   
tokenstrip:  s   
zPreprocessor.tokenstripc           	      C   s  g }g }g }d}t |}d}||k r*|| j| jv r*|d7 }||k r*|| j| jv s||k r=|| jdkr=||d  n| | j|d jd dg g fS |d7 }||k r|| }|jdkrh|| |d7 }nI|jdkr|d8 }|dkr|r|| | || |d ||fS || n |jdkr|dkr|| | ||d  g }n|| |d7 }||k sU| | j|d jd dg g fS )	Nr   r   r)   zMissing '(' in macro argumentsr*   r]   r0   zMissing ')' in macro arguments)	rq   r   rd   r   rR   r[   r?   r
   rx   )	r@   Z	tokenlistargs	positionsZcurrent_argZnestingZtokenlenru   r   r   r   r   collect_argsV  sH   







zPreprocessor.collect_argsc                 C   s  g |_ g |_g |_d}|t|jk r|j| j| jkr|j| j|jv r|j|j| j}|dkr_|j|d  jdkr_t		|j| |j|< | j
|j| _|j|d = |j||d f q|dkr|j|d  jdkr|j d||d f |j|d = |d8 }q|d t|jk r|j|d  jdkr|j d||f |j|d = q|j d||f n@|j| jdkr|jr|dkr|j|d  jdkr|d t|jk r|j|d  j| jkr|j|d  j|jkr|j|d  |d7 }|t|jk s|j jdd	 d
d d S )Nr   r   r   r\   rf   er]   c                 S   s   | d S )N   r   )rk   r   r   r   r4     s    z,Preprocessor.macro_prescan.<locals>.<lambda>T)keyreverse)patch	str_patchvar_comma_patchrq   r   r   r_   r<   indexcopyrc   rR   r=   r>   sort)r@   macroru   argnumr   r   r   macro_prescan  sF   $&"zPreprocessor.macro_prescanc           
      C   s  dd |j D }i }|jD ],\}}||vr)dddd || D  dd||< t|| ||< || || _ qd}|jrO|d	 sO|jD ]}d ||< d
}qFi }|jD ]/\}	}}|	dkrh|| |||d < qT|	dkr||vry| || ||< || |||d < qT|rdd |D }|S )Nc                 S      g | ]}t  |qS r   r   rj   Z_xr   r   r   rl         z2Preprocessor.macro_expand_args.<locals>.<listcomp>z"%s"rn   c                 S      g | ]}|j qS r   r   ri   r   r   r   rl         r   z\\Fr0   Trf   r   r|   c                 S   s   g | ]}|r|qS r   r   rj   Z_ir   r   r   rl     rm   )	r   r   rs   replacer   r=   r   r   expand_macros)
r@   r   ry   repZstr_expansionr   ru   Zcomma_patchexpandedZptyper   r   r   macro_expand_args  s0   (
zPreprocessor.macro_expand_argsc                 C   s  |d u ri }d}|t |k r}|| }|j| jkrs|j| jv rb|j|vrbd||j< | j|j }|jsZ| dd |jD |}|D ]}|j|_qC||||d < |t |7 }n|d }|t |k r~|| j| jv r~|d7 }|t |k r~|| j| jv sl|t |k rY|| jdkrY| 	||d  \}	}
}|j
st |
t |jkr| | j|jd|jt |jf  ||	 }n|j
rt |
t |jd k rt |jdkr| | j|jd	|jt |jd f  n| | j|jd
|jt |jd f  ||	 }na|j
r4t |
t |jd kr|
g  n"|||t |jd   ||	 d  |
t |jd < |
t |jd = | ||
}| ||}|D ]}|j|_qB|||||	 < |t |7 }n|d7 }||j= q|jdkrs| j|_| |j|_|d7 }|t |k s|S )Nr   Tc                 S   r   r   r   r   r   r   r   rl     r   z.Preprocessor.expand_macros.<locals>.<listcomp>r   r)   zMacro %s requires %d argumentsr}   z(Macro %s must have at least %d argumentsz'Macro %s must have at least %d argumentZ__LINE__)rq   r   r_   r   rG   r<   r   r
   rd   r{   r=   r[   r?   rR   r   ra   rb   )r@   rT   r   ru   r   mexr|   rv   tokcountry   rz   r   rr   r   r   r     sb   

"
(&
4;zPreprocessor.expand_macrosc                 C   s\  d}|t |k r|| j| jkr|| jdkr|d }d}d}|t |k rr|| j| jv r2|d7 }q|| j| jkrK|| j| jv rEd}nd}|sJn(n|| jdkrUd}n|| jd	kr]n| | j|| jd
 |d7 }|t |k s%| j	|| _| 
||| _||d |d = |d7 }|t |k s| |}t|D ]U\}}|j| jkrt|||< | j	|| _| 
d|| _q|j| j	krt|||< t|| j|| _|| jd dvr|| jd d || _|| jd dvsqddd |D }|dd}|dd}|dd}zt|}W |S  ty-   | | j|d jd d}Y |S w )Nr   Zdefinedr   FZ0LZ1Lr)   Tr*   zMalformed defined()r0   Z0123456789abcdefABCDEFrn   c                 S      g | ]}t |jqS r   strr   ri   r   r   r   rl   \  r   z)Preprocessor.evalexpr.<locals>.<listcomp>z&&z and z||z or r+   z not zCouldn't evaluate expression)rq   r   r_   r   rd   rG   r[   r?   r
   ra   rb   r   	enumerater   r   rs   r   eval	Exception)r@   rT   ru   rv   Z	needparenresultr   exprr   r   r   evalexpr1  sh   

zPreprocessor.evalexprc                 c   sv   t |}| |}|sd}| d|  || _g }d}d}g }|D ]}	t|	D ]\}
}|j| jvr5 nq)|jdkr|	D ]}|j| jv rPd|jv rP|| q>| 	|	|
d d  }|rm|d j}| 	|dd  }nd}g }|d	kr|r| 
|D ]}|V  q|g }| | q"|d
kr|r| 
|D ]}|V  qg }| jd }| |D ]}|V  q|| jd< || _q"|dkr|r| 
|D ]}|V  qg }| | q"|dkr|||f |r|d j| jvrd}d}q"d}q"|dkr|||f |r|d j| jv r	d}d}q"d}q"|dkr+|||f |r*| |}|s(d}d}q"d}q"|dkr\|rP|d d rO|r@d}q"|sO| |}|rOd}d}q"| | j|d jd q"|dkr|ry|d d rx|rqd}q"|sxd}d}q"| | j|d jd q"|dkr|r| \}}q"| | j|d jd q"	 q"|r||	 q"| 
|D ]}|V  qg }d S )Nrn   z__FILE__ "%s"TFr   r   r   r   rM   includeZ__FILE__undefZifdefZifndefifelifr0   zMisplaced #elifelsezMisplaced #elseZendifzMisplaced #endif)r8   rw   rM   r?   r   r   rd   r   rR   rx   r   rG   r   r   r   r[   r
   popextend)r@   r7   r?   r   rt   chunkZenableZ	iftriggerZifstackrk   ru   rU   Z	dirtokensr;   ry   Zoldfiler   r   r   r   parsegenl  s   
















zPreprocessor.parsegenc           
   	   c   s   |sd S |r{|d j dkr|d j| jkr| |}|d j dkrZd}|t|k r<|| j dkr2n|d7 }|t|k s*td d S ddd |d| D }| jdg | j }n!|d j| jkru|d j dd	 }| jdg | j }ntd
 d S |D ]>}t	j||}z,t
|d }t	j|}|r| jd| | ||D ]}	|	V  q|r| jd= W  d S  ty   Y q}w td|  d S )Nr   r,   r   r-   zMalformed #include <...>rn   c                 S   r   r   r   ri   r   r   r   rl     r   z(Preprocessor.include.<locals>.<listcomp>r0   zMalformed #include statementr   zCouldn't find '%s')r   r   rc   r   rq   rW   rs   rH   rI   osopenreaddirnameinsertr   IOError)
r@   rT   ru   filenamerH   pZinamedataZdnamerU   r   r   r   r     sL   
zPreprocessor.includec                 C   s  t |tr
| |}|}zC|d }t|dkr|d }nd }|s0t|jg }|| j|j< W d S |j| jv rLt|j| 	|dd  }|| j|j< W d S |jdkrJ| 
|dd  \}}}d}	|D ]p}
|	rltd  nddd	 |
D }|d
krd}	| j|
d _d|
d _d}	|
dd = qb|dd  d
kr|
d j| jkrd}	|
dd = |
d jdd  d
kr|
d jd d |
d _qbt|
dks|
d j| jkrtd  nuqb| 	|d| d  }d}|t|k r)|d t|k r|| j| jv r||d  jdkr||= q|| jdkr||d  j| jv r||d = |d7 }|t|k st|j|dd	 |D |	}| | || j|j< W d S W d S W d S td W d S  ty_   td Y d S w )Nr   r   r}   r)   Fz0No more arguments may follow a variadic argumentrn   c                 S   r   r   r   r   r   r   r   rl   :  r   z'Preprocessor.define.<locals>.<listcomp>z...TZ__VA_ARGS__zInvalid macro argumentr\   c                 S   s   g | ]}|d  j qS )r   r   ri   r   r   r   rl   X  r   zBad macro definition)
isinstanceSTRING_TYPESrV   rq   r:   r   rG   r   rd   rx   r{   rW   rs   r_   r   LookupError)r@   rT   Zlinetokr;   Zmtyper   r   ry   rz   r=   aZastrZmvalueru   r   r   r   rM      sv   




 
&&

zPreprocessor.definec                 C   s.   |d j }z| j|= W d S  ty   Y d S w )Nr   )r   rG   r   )r@   rT   idr   r   r   r   f  s   
zPreprocessor.undefc                 C   s   || _ | ||| _d S rP   )ignorer   rO   )r@   r7   r?   r   r   r   r   parser  s   zPreprocessor.parsec                 C   s<   z	 t | j}|j| jvr|W S q ty   d | _Y d S w rP   )nextrO   r   r   StopIteration)r@   rU   r   r   r   rQ   {  s   
zPreprocessor.tokenrP   )rB   rC   rD   rA   rV   r[   rJ   rg   rw   rx   r{   r   r   r   r   r   r   rM   r   r   rQ   r   r   r   r   rE      s(    
<!5,
2H
; 1F	rE   __main__r   )3Z
__future__r   sysversion_infomajorr   Zunicoder   rangerp   rT   literalsr   Zt_CPP_POUNDZt_CPP_DPOUNDZt_CPP_IDr   Zt_CPP_INTEGERZt_CPP_FLOATr   r   r   r   r   rer   rK   os.pathr   compiler5   r1   r8   objectr:   rE   rB   Zply.lexrF   r	   r   argvfr   r7   r   r   rQ   rU   rW   r?   r   r   r   r   <module>   sr   	
	
     j