B
    CrX[              
   @   sb  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r^d 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)  x"e+- Z.e.sLP e/e+j0e. q<W dS )*    N   )
ZCPP_IDCPP_INTEGERZ	CPP_FLOATZ
CPP_STRINGZCPP_CHARCPP_WSZCPP_COMMENT1ZCPP_COMMENT2Z	CPP_POUNDZ
CPP_DPOUNDz+-*/%|&~^<>=!?()[]{}.,;:\'"c             C   s   | j  j| jd7  _| S )z\s+
)lexerlinenovaluecount)t r   0lib/python3.7/site-packages/pycparser/ply/cpp.pyt_CPP_WS   s    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   s   | j  j| jd7  _| S )z\"([^\\\n]|(\\(.|\n)))*?\"r   )r   r   r   r	   )r
   r   r   r   t_CPP_STRING5   s    r   c             C   s   | j  j| jd7  _| S )z(L)?\'([^\\\n]|(\\(.|\n)))*?\'r   )r   r   r   r	   )r
   r   r   r   
t_CPP_CHAR;   s    r   c             C   s8   | j d}| j j|7  _d| _|r.d| nd| _ | S )z(/\*(.|\n)*?\*/)r   r    )r   r	   r   r   type)r
   Zncrr   r   r   t_CPP_COMMENT1A   s
     r   c             C   s   d| _ d| _| S )z(//.*?(\n|$))r   r   )r   r   )r
   r   r   r   t_CPP_COMMENT2J   s     r   c             C   s(   | j d | _| j d | _ | jd | S )Nr      )r   r   r   skip)r
   r   r   r   t_errorP   s    r   z\?\?[=/\'\(\)\!<>\-]#\^[]|{}~)	=/'()!<>-c             C   s   t dd | S )Nc             S   s   t |  d  S )N)_trigraph_repgroup)gr   r   r   <lambda>z   s    ztrigraph.<locals>.<lambda>)_trigraph_patsub)inputr   r   r   trigraphy   s    r1   c               @   s   e Zd ZdddZdS )MacroNFc             C   s0   || _ || _|| _|| _|r&|d | _d | _d S )Nr)   )namer   arglistvariadicvarargsource)selfr3   r   r4   r5   r   r   r   __init__   s    
zMacro.__init__)NF)__name__
__module____qualname__r9   r   r   r   r   r2      s   r2   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 k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timeZ	localtimedefineZstrftimeparser)r8   r   Ztmr   r   r   r9      s    zPreprocessor.__init__c             C   s4   g }| j | x| j  }|s"P || qW |S )N)r   r0   tokenappend)r8   texttokenstokr   r   r   tokenize   s    
 zPreprocessor.tokenizec             C   s   t d|||f  d S )Nz%s:%d %s)print)r8   filelinemsgr   r   r   error   s    zPreprocessor.errorc          	   C   s  | j d | j  }|r$|jdkr.td n|j| _| j d | j  }|r^t|jdkrhtd n|j| _t|j| _	| j d | j  }|r|jdkrtd n|j| _
| j d | j  }|r|jdkrd | _n|j| _| j d	 | j  }|r|jd	krd | _td
 n|j| _| j| jf| _dddddddddg	}xB|D ]:}| j | | j  }|r||j|krPtd|  qPW d 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 newlinesr&   r'   r   z##r   r#   r$   ,.z,Unable to lex '%s' required for preprocessor)r   r0   rF   r   rL   r   t_IDint	t_INTEGERt_INTEGER_TYPEt_STRINGZt_SPACEZ	t_NEWLINEt_WS)r8   rJ   charscr   r   r   rB      sD    










zPreprocessor.lexprobec             C   s   | j | d S )N)r@   rG   )r8   r@   r   r   r   add_path  s    zPreprocessor.add_pathc             c   s   | j  }dd | D }xhtt|D ]X}|d }xJ|| dr|t|k r|| d d ||  ||< d||< |d7 }q8W q*W d|}|| d|_g }x<|	 }|sP |
| |j| jkrd|jkr|V  g }qW |r|V  d S )Nc             S   s   g | ]}|  qS r   )rstrip).0xr   r   r   
<listcomp>  s    z,Preprocessor.group_lines.<locals>.<listcomp>r   r   r)    r   )r   Zclone
splitlinesxrangelenendswithjoinr0   r   rF   rG   r   rX   r   )r8   r0   r>   linesijZcurrent_linerJ   r   r   r   group_lines  s,    



zPreprocessor.group_linesc             C   s|   d}x(|t |k r,|| j| jkr,|d7 }qW |d |= t |d }x$|dkrh|| j| jkrh|d8 }qFW ||d d = |S )Nr   r   )rc   r   rX   )r8   rI   rg   r   r   r   
tokenstrip8  s    
zPreprocessor.tokenstripc       	      C   s  g }g }g }d}t |}d}x$||k r@|| j| jkr@|d7 }qW ||k rh|| jdkrh||d  n | | j|d jd dg g fS |d7 }x||k rf|| }|jdkr|| |d7 }n|jdkr|d8 }|dkr|r|| | || |d ||fS || nD|jdkrR|dkrR|| | ||d  g }n
|| |d7 }qW | | j|d jd dg g fS )	Nr   r   r#   zMissing '(' in macro argumentsr$   rQ   r)   zMissing ')' in macro arguments)	rc   r   rX   r   rG   rP   r7   r   rj   )	r8   Z	tokenlistargs	positionsZcurrent_argZnestingZtokenlenrg   r
   r   r   r   collect_argsT  sD    






zPreprocessor.collect_argsc             C   s  g |_ g |_g |_d}x|t|jk r|j| j| jkrl|j| j|jkrl|j|j| j}|dkr|j|d  jdkrt		|j| |j|< | j
|j| _|j|d = |j||d f qn|dkr|j|d  jdkr|j d||d f |j|d = qnZ|d t|jk rX|j|d  jdkrX|j d||f |d7 }qn|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 }qW |j jdd	 d
d d S )Nr   r   r   z##rZ   erQ   c             S   s   | d S )N   r   )r^   r   r   r   r-     s    z,Preprocessor.macro_prescan.<locals>.<lambda>T)keyreverse)patch	str_patchvar_comma_patchrc   r   r   rS   r4   indexcopyrW   rG   r5   r6   sort)r8   macrorg   argnumr   r   r   macro_prescan  s:    ( *(,zPreprocessor.macro_prescanc       
      C   s,  dd |j D }i }xb|jD ]X\}}||krTdddd || D  dd||< t|| ||< || || _ qW d}|jr|d	 sx|jD ]}d ||< d
}qW i }xh|jD ]^\}	}}|	dkr|| |||d < q|	dkr||kr| || ||< || |||d < qW |r(dd |D }|S )Nc             S   s   g | ]}t  |qS r   )rv   )r]   _xr   r   r   r_     s    z2Preprocessor.macro_expand_args.<locals>.<listcomp>z"%s"r`   c             S   s   g | ]
}|j qS r   )r   )r]   r^   r   r   r   r_     s    r   z\\Fr)   TrZ   r   rn   c             S   s   g | ]}|r|qS r   r   )r]   _ir   r   r   r_     s    )	r   rs   re   replacerv   r5   rt   rr   expand_macros)
r8   rx   rk   repZstr_expansionry   rg   Zcomma_patchexpandedZptyper   r   r   macro_expand_args  s.    (zPreprocessor.macro_expand_argsc             C   s  |d kri }d}x|t |k r|| }|j| jkr|j| jkr|j|krd||j< | j|j }|js| dd |jD |}x|D ]}|j|_qW ||||d < |t |7 }n|d }x(|t |k r|| j| jkr|d7 }qW || jdkr| 	||d  \}	}
}|j
s`t |
t |jkr`| | j|jd|jt |jf  ||	 }nD|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  ||	 }n|j
rXt |
t |jd kr|
g  nD|||t |jd   ||	 d  |
t |jd < |
t |jd = | ||
}| ||}x|D ]}|j|_qvW |||||	 < |t |7 }||j= qn"|jdkr| j|_| |j|_|d7 }qW |S )Nr   Tc             S   s   g | ]}t  |qS r   )rv   )r]   r{   r   r   r   r_     s    z.Preprocessor.expand_macros.<locals>.<listcomp>r   r#   zMacro %s requires %d argumentsro   z(Macro %s must have at least %d argumentsz'Macro %s must have at least %d argumentZ__LINE__)rc   r   rS   r   r?   r4   r~   r   rX   rm   r5   rP   r7   rG   r   rU   rV   )r8   rI   r   rg   r
   mexrn   rh   tokcountrk   rl   r   rr   r   r   r~     s\    

" (&
4
zPreprocessor.expand_macrosc             C   s`  d}x|t |k r$|| j| jkr|| jdkr|d }d}d}x|t |k r|| j| jkrr|d7 }qJnn|| j| jkr|| j| jkrd}nd}|sP n<|| jdkrd}n(|| jd	krP n| | j|| jd
 |d7 }qJW | j	|| _| 
||| _||d |d = |d7 }qW | |}xt|D ]\}}|j| jkr|t|||< | j	|| _| 
d|| _nd|j| j	kr:t|||< t|| j|| _x2|| jd dkr|| jd d || _qW q:W ddd |D }|dd}|dd}|dd}yt|}W n0 tk
rZ   | | j|d jd d}Y nX |S )Nr   Zdefinedr   FZ0LZ1Lr#   Tr$   zMalformed defined()r)   Z0123456789abcdefABCDEFr`   c             S   s   g | ]}t |jqS r   )strr   )r]   r^   r   r   r   r_   S  s    z)Preprocessor.evalexpr.<locals>.<listcomp>z&&z and z||z or r%   z not zCouldn't evaluate expression)rc   r   rS   r   rX   r?   rP   r7   r   rU   rV   r~   	enumeraterv   r   re   r}   eval	Exception)r8   rI   rg   rh   Z	needparenresultr
   exprr   r   r   evalexpr(  s^    " 
$
zPreprocessor.evalexprc             c   s  t |}| |}|sd}| d|  || _g }d}d}g }xN|D ]D}	x"t|	D ]\}
}|j| jkrVP qVW |jdkr~x,|	D ]$}|j| jkrd|jkr|| qW | 	|	|
d d  }|r|d j}| 	|dd  }nd}g }|d	kr(|r|x| 
|D ]}|V  qW g }| | q|d
kr|r|x| 
|D ]}|V  qDW g }| jd }x| |D ]}|V  qnW || jd< || _q|dkr|r|x| 
|D ]}|V  qW g }| | q|dkr|||f |r||d j| jkr
d}d}nd}q|dkrT|||f |r||d j| jkrLd}d}nd}q|dkr|||f |r|| |}|sd}d}nd}n|dkr|r|d d r|rd}n|s| |}|rd}d}n| | j|d jd n|dkrF|r.|d d rD|rd}n|sDd}d}n| | j|d jd n6|dkr|rd| \}}n| | j|d jd n qF|rF||	 qFW x| 
|D ]}|V  qW g }d S )Nr`   z__FILE__ "%s"TFr   r   r   r   rD   includeZ__FILE__undefZifdefZifndefifelifr)   zMisplaced #elifelsezMisplaced #elseZendifzMisplaced #endif)r1   ri   rD   r7   r   r   rX   r   rG   rj   r~   r?   r   r   r   rP   r   popextend)r8   r0   r7   r
   rf   chunkenableZ	iftriggerZifstackr^   rg   rJ   Z	dirtokensr3   rk   Zoldfiler   r   r   r   parsegenc  s    
 















zPreprocessor.parsegenc       
   	   c   s  |sd S |r|d j dkr4|d j| jkr4| |}|d j dkrd}x4|t|k rn|| j dkrdP |d7 }qHW td d S ddd |d| D }| jdg | j }nB|d j| jkr|d j dd	 }| jdg | j }ntd
 d S x|D ]}t	j||}y`t
|d }t	j|}|r6| jd| x| ||D ]}	|	V  qDW |rb| jd= P W q tk
r|   Y qX qW td|  d S )Nr   r&   r   r'   zMalformed #include <...>r`   c             S   s   g | ]
}|j qS r   )r   )r]   r^   r   r   r   r_     s    z(Preprocessor.include.<locals>.<listcomp>r)   zMalformed #include statementr   zCouldn't find '%s')r   r   rW   r~   rc   rL   re   r@   rA   osopenreaddirnameinsertr   IOError)
r8   rI   rg   filenamer@   pZinamedataZdnamerJ   r   r   r   r     sF    


zPreprocessor.includec             C   s  t |tr| |}|}y||d }t|dkr:|d }nd }|s^t|jg }|| j|j< n6|j| jkrt|j| 	|dd  }|| j|j< n |jdkr| 
|dd  \}}}d}	x|D ]}
|	rtd P ddd	 |
D }|d
kr d}	| j|
d _d|
d _d}	|
dd = qnb|dd  d
kr|
d j| jkrd}	|
dd = |
d jdd  d
kr|
d jd d |
d _qt|
dks|
d j| jkrtd P qW | 	|d| d  }d}x|t|k rX|d t|k rL|| j| jkr||d  jdkr||= qn0|| jdkrL||d  j| jkrL||d = |d7 }qW t|j|dd	 |D |	}| | || j|j< ntd W n tk
r   td Y nX d S )Nr   r   ro   r#   Fz0No more arguments may follow a variadic argumentr`   c             S   s   g | ]}t |jqS r   )r   r   )r]   r|   r   r   r   r_   1  s    z'Preprocessor.define.<locals>.<listcomp>z...TZ__VA_ARGS__zInvalid macro argumentz##c             S   s   g | ]}|d  j qS )r   )r   )r]   r^   r   r   r   r_   O  s    zBad macro definition)
isinstanceSTRING_TYPESrK   rc   r2   r   r?   r   rX   rj   rm   rL   re   rS   rz   LookupError)r8   rI   Zlinetokr3   Zmtyper   r   rk   rl   r5   aZastrZmvaluerg   r   r   r   rD     sl    





$
&&

zPreprocessor.definec             C   s0   |d j }y| j|= W n tk
r*   Y nX d S )Nr   )r   r?   r   )r8   rI   idr   r   r   r   ]  s
    
zPreprocessor.undefc             C   s   || _ | ||| _d S )N)ignorer   rE   )r8   r0   r7   r   r   r   r   parsei  s    zPreprocessor.parsec             C   sD   y$xt | j}|j| jkr|S qW W n tk
r>   d | _d S X d S )N)nextrE   r   r   StopIteration)r8   rJ   r   r   r   rF   r  s    
 zPreprocessor.token)N)N)N)r:   r;   r<   r9   rK   rP   rB   r[   ri   rj   rm   rz   r   r~   r   r   r   rD   r   r   rF   r   r   r   r   r=      s&   
<!5+2
B;
 1F	r=   __main__r   )1sysversion_infomajorr   Zunicoder   rangerb   rI   literalsr   Zt_CPP_POUNDZt_CPP_DPOUNDZt_CPP_IDr   Zt_CPP_INTEGERZt_CPP_FLOATr   r   r   r   r   rerv   rC   os.pathr   compiler.   r*   r1   objectr2   r=   r:   Zply.lexr>   r   r   argvfr   r0   r   r   rF   rJ   rL   r7   r   r   r   r   <module>
   sj   
	
     c
 