B
    q\              
   @   sn  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rjd 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-/ Z0e0sXP e1e-j2e0 qHW d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   s   | j  j| jd7  _| S )z\s+
)lexerlinenovaluecount)t r   5lib/python3.7/site-packages/astropy/extern/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_STRING7   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_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   skip)r   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{   s    r2   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)selfr4   r	   r5   r6   r   r   r   __init__   s    
zMacro.__init__)NF)__name__
__module____qualname__r:   r   r   r   r   r3      s   r3   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)r9   r   Ztmr   r   r   r:      s    zPreprocessor.__init__c             C   s4   g }| j | x| j  }|s"P || qW |S )N)r   r1   tokenappend)r9   texttokenstokr   r   r   tokenize   s    
 zPreprocessor.tokenizec             C   s   t d|||f  d S )Nz%s:%d %s)print)r9   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   r1   rG   r	   rM   r   t_IDint	t_INTEGERt_INTEGER_TYPEt_STRINGZt_SPACEZ	t_NEWLINEt_WS)r9   rK   charscr   r   r   rC      sD    










zPreprocessor.lexprobec             C   s   | j | d S )N)rA   rH   )r9   rA   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joinr1   r   rG   rH   r   rY   r	   )r9   r1   r?   linesijZcurrent_linerK   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   )rd   r   rY   )r9   rJ   rh   r   r   r   
tokenstrip:  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%   rR   r*   zMissing ')' in macro arguments)	rd   r   rY   r	   rH   rQ   r8   r   rk   )	r9   Z	tokenlistargs	positionsZcurrent_argZnestingZtokenlenrh   r   r   r   r   collect_argsV  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##r[   erR   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_patchrd   r	   r   rT   r5   indexcopyrX   rH   r6   r7   sort)r9   macrorh   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   )rw   )r^   _xr   r   r   r`     s    z2Preprocessor.macro_expand_args.<locals>.<listcomp>z"%s"ra   c             S   s   g | ]
}|j qS r   )r	   )r^   r_   r   r   r   r`     s    r   z\\Fr*   Tr[   r   ro   c             S   s   g | ]}|r|qS r   r   )r^   _ir   r   r   r`     s    )	r	   rt   rf   replacerw   r6   ru   rs   expand_macros)
r9   ry   rl   repZstr_expansionrz   rh   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   )rw   )r^   r|   r   r   r   r`     s    z.Preprocessor.expand_macros.<locals>.<listcomp>r   r$   zMacro %s requires %d argumentsrp   z(Macro %s must have at least %d argumentsz'Macro %s must have at least %d argumentZ__LINE__)rd   r   rT   r	   r@   r5   r   r   rY   rn   r6   rQ   r8   rH   r   rV   rW   )r9   rJ   r   rh   r   mexro   ri   tokcountrl   rm   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0123456789abcdefABCDEFra   c             S   s   g | ]}t |jqS r   )strr	   )r^   r_   r   r   r   r`   U  s    z)Preprocessor.evalexpr.<locals>.<listcomp>z&&z and z||z or r&   z not zCouldn't evaluate expression)rd   r   rT   r	   rY   r@   rQ   r8   r   rV   rW   r   	enumeraterw   r   rf   r~   eval	Exception)r9   rJ   rh   ri   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 )Nra   z__FILE__ "%s"TFr   r   r   r   rE   includeZ__FILE__undefZifdefZifndefifelifr*   zMisplaced #elifelsezMisplaced #elseZendifzMisplaced #endif)r2   rj   rE   r8   r   r   rY   r	   rH   rk   r   r@   r   r   r   rQ   r   popextend)r9   r1   r8   r   rg   chunkenableZ	iftriggerZifstackr_   rh   rK   Z	dirtokensr4   rl   Zoldfiler   r   r   r   parsegene  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 <...>ra   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   rX   r   rd   rM   rf   rA   rB   osopenreaddirnameinsertr   IOError)
r9   rJ   rh   filenamerA   pZinamedataZdnamerK   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   rp   r$   Fz0No more arguments may follow a variadic argumentra   c             S   s   g | ]}t |jqS r   )r   r	   )r^   r}   r   r   r   r`   3  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`   Q  s    zBad macro definition)
isinstanceSTRING_TYPESrL   rd   r3   r	   r@   r   rY   rk   rn   rM   rf   rT   r{   LookupError)r9   rJ   Zlinetokr4   Zmtyper   r   rl   rm   r6   aZastrZmvaluerh   r   r   r   rE     sl    





$
&&

zPreprocessor.definec             C   s0   |d j }y| j|= W n tk
r*   Y nX d S )Nr   )r	   r@   r   )r9   rJ   idr   r   r   r   _  s
    
zPreprocessor.undefc             C   s   || _ | ||| _d S )N)ignorer   rF   )r9   r1   r8   r   r   r   r   parsek  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)nextrF   r   r   StopIteration)r9   rK   r   r   r   rG   t  s    
 zPreprocessor.token)N)N)N)r;   r<   r=   r:   rL   rQ   rC   r\   rj   rk   rn   r{   r   r   r   r   r   rE   r   r   rG   r   r   r   r   r>      s&   
<!5+2
B;
 1F	r>   __main__r   )3Z
__future__r   sysversion_infomajorr   Zunicoder   rangerc   rJ   literalsr   Zt_CPP_POUNDZt_CPP_DPOUNDZt_CPP_IDr   Zt_CPP_INTEGERZt_CPP_FLOATr   r   r   r   r   rerw   rD   os.pathr   compiler/   r+   r2   objectr3   r>   r;   Zply.lexr?   r   r   argvfr   r1   r   r   rG   rK   rM   r8   r   r   r   r   <module>
   sl   
	
     c
 