U
    ԅZg                  
   @   sl  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rhd 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-/ Z0e0sXqhe1e-j2e0 qFd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   &lib/python3.8/site-packages/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   t_CPP_STRING7   s    r   c                 C   s   | j  j| jd7  _| S )z(L)?\'([^\\\n]|(\\(.|\n)))*?\'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   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>|       ztrigraph.<locals>.<lambda>)_trigraph_patsub)inputr   r   r   trigraph{   s    r7   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)selfr9   r
   r:   r;   r   r   r   __init__   s    
zMacro.__init__)NF)__name__
__module____qualname__r?   r   r   r   r   r8      s   r8   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time	localtimedefinestrftimeparser)r>   r   Ztmr   r   r   r?      s    zPreprocessor.__init__c                 C   s0   g }| j | | j  }|s q,|| q|S N)r   r6   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   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	}|D ]:}| j | | j  }|rz|j|krNtd|  qNd 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   ##r   r'   r(   ,.z,Unable to lex '%s' required for preprocessor)r   r6   rO   r
   rU   r   t_IDint	t_INTEGERt_INTEGER_TYPEt_STRINGZt_SPACEZ	t_NEWLINEt_WS)r>   rS   charscr   r   r   rH      sD    









zPreprocessor.lexprobec                 C   s   | j | d S rN   )rF   rP   )r>   rF   r   r   r   add_path  s    zPreprocessor.add_pathc                 c   s   | j  }dd | D }tt|D ]T}|d }|| dr(|t|k r(|| d d ||  ||< d||< |d7 }q4q(d|}|| d|_g }|	 }|sq|
| |j| jkrd|jkr|V  g }q|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joinr6   r	   rO   rP   r   rb   r
   )r>   r6   rD   linesijZcurrent_linerS   r   r   r   group_lines  s*    



zPreprocessor.group_linesc                 C   st   d}|t |k r*|| j| jkr*|d7 }q|d |= t |d }|dkrb|| j| jkrb|d8 }q@||d d = |S r   )rn   r   rb   )r>   rR   rr   r   r   r   
tokenstrip:  s    


zPreprocessor.tokenstripc           	      C   s  g }g }g }d}t |}d}||k r>|| j| jkr>|d7 }q||k rd|| jdkrd||d  n | | j|d jd dg g fS |d7 }||k r`|| }|jdkr|| |d7 }n|jdkr|d8 }|dkr|r|| | || |d ||fS || nD|jdkrL|dkrL|| | ||d  g }n
|| |d7 }q| | j|d jd dg g fS )	Nr   r   r'   zMissing '(' in macro argumentsr(   r[   r.   zMissing ')' in macro arguments)	rn   r   rb   r
   rP   rY   r=   r	   ru   )	r>   Z	tokenlistargs	positionsZcurrent_argZnestingZtokenlenrr   r   r   r   r   collect_argsV  sD    









zPreprocessor.collect_argsc                 C   s$  g |_ g |_g |_d}|t|jk r|j| j| jkrt|j| j|jkrt|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 = |d8 }qn^|d t|jk r`|j|d  jdkr`|j d||f |j|d = 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|j jdd	 d
d d S )Nr   r   r   rZ   rd   er[   c                 S   s   | d S )N   r   )ri   r   r   r   r2     r3   z,Preprocessor.macro_prescan.<locals>.<lambda>T)keyreverse)patch	str_patchvar_comma_patchrn   r
   r   r]   r:   indexcopyra   rP   r;   r<   sort)r>   macrorr   argnumr   r   r   macro_prescan  sD    ( *(
zPreprocessor.macro_prescanc           
      C   s   dd |j D }i }|jD ]X\}}||krRdddd || D  dd||< t|| ||< || || _ qd}|jr|d	 s|jD ]}d ||< d
}qi }|jD ]^\}	}}|	dkr|| |||d < q|	dkr||kr| || ||< || |||d < q|rdd |D }|S )Nc                 S   s   g | ]}t  |qS r   r   rh   Z_xr   r   r   rj     s     z2Preprocessor.macro_expand_args.<locals>.<listcomp>z"%s"rk   c                 S   s   g | ]
}|j qS r   r
   rg   r   r   r   rj     s     r   z\\Fr.   Trd   r   ry   c                 S   s   g | ]}|r|qS r   r   rh   Z_ir   r   r   rj     s      )	r
   r~   rp   replacer   r;   r   r}   expand_macros)
r>   r   rv   repZstr_expansionr   rr   Zcomma_patchexpandedZptyper   r   r   macro_expand_args  s.    (
zPreprocessor.macro_expand_argsc                 C   s  |d kri }d}|t |k r|| }|j| jkr|j| jkr|j|krd||j< | j|j }|js| dd |jD |}|D ]}|j|_q||||d < |t |7 }n|d }|t |k r|| j| jkr|d7 }q|t |k r|| jdkr| 	||d  \}	}
}|j
sbt |
t |jkrb| | j|jd|jt |jf  ||	 }q|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
rZt |
t |jd kr|
g  nD|||t |jd   ||	 d  |
t |jd < |
t |jd = | ||
}| ||}|D ]}|j|_qv|||||	 < |t |7 }n|d7 }||j= qn"|jdkr| j|_| |j|_|d7 }q|S )Nr   Tc                 S   s   g | ]}t  |qS r   r   r   r   r   r   rj     s     z.Preprocessor.expand_macros.<locals>.<listcomp>r   r'   zMacro %s requires %d argumentsrz   z(Macro %s must have at least %d argumentsz'Macro %s must have at least %d argumentZ__LINE__)rn   r   r]   r
   rE   r:   r   r	   rb   rx   r;   rY   r=   rP   r   r_   r`   )r>   rR   r   rr   r   mexry   rs   tokcountrv   rw   r   rr   r   r   r     s^    


" (&
4
zPreprocessor.expand_macrosc                 C   sN  d}|t |k r|| j| jkr|| jdkr|d }d}d}|t |k r|| j| jkrl|d7 }qDnn|| j| jkr|| j| jkrd}nd}|sqn<|| jdkrd}n(|| jd	krqn| | j|| jd
 |d7 }qD| j	|| _| 
||| _||d |d = |d7 }q| |}t|D ]\}}|j| jkrpt|||< | j	|| _| 
d|| _n`|j| j	kr.t|||< t|| j|| _|| jd dkr.|| jd d || _qq.ddd |D }|dd}|dd}|dd}zt|}W n0 tk
rH   | | j|d jd d}Y nX |S )Nr   Zdefinedr   FZ0LZ1Lr'   Tr(   zMalformed defined()r.   Z0123456789abcdefABCDEFrk   c                 S   s   g | ]}t |jqS r   strr
   rg   r   r   r   rj   \  s     z)Preprocessor.evalexpr.<locals>.<listcomp>z&&z and z||z or r)   z not zCouldn't evaluate expression)rn   r   r]   r
   rb   rE   rY   r=   r	   r_   r`   r   	enumerater   r   rp   r   eval	Exception)r>   rR   rr   rs   Z	needparenresultr   exprr   r   r   evalexpr1  s^    " 


 
zPreprocessor.evalexprc                 c   s  t |}| |}|sd}| d|  || _g }d}d}g }|D ],}	t|	D ]\}
}|j| jkrP qjqP|jdkrb|	D ]$}|j| jkrzd|jkrz|| qz| 	|	|
d d  }|r|d j}| 	|dd  }nd}g }|d	kr|r`| 
|D ]
}|V  qg }| | qp|d
krz|r`| 
|D ]}|V  q2g }| jd }| |D ]}|V  qX|| jd< || _qp|dkr|r`| 
|D ]}|V  qg }| | qp|dkr|||f |r`|d j| jkrd}d}nd}qp|dkr8|||f |r`|d j| jkr0d}d}nd}qp|dkrv|||f |r`| |}|spd}d}nd}n|dkr|r|d d r|rd}n|s| |}|rd}d}n| | j|d jd n|dkr*|r|d d r(|rd}n|s(d}d}n| | j|d jd n6|dkrp|rH| \}}n| | j|d jd n qB|rB||	 qB| 
|D ]}|V  q|g }d S )Nrk   z__FILE__ "%s"TFr   r   r   r   rK   includeZ__FILE__undefZifdefZifndefifelifr.   zMisplaced #elifelsezMisplaced #elseZendifzMisplaced #endif)r7   rt   rK   r=   r   r   rb   r
   rP   ru   r   rE   r   r   r   rY   r	   popextend)r>   r6   r=   r   rq   chunkenableZ	iftriggerZifstackri   rr   rS   Z	dirtokensr9   rv   Zoldfiler   r   r   r   parsegenl  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}|t|k rl|| j dkrbqx|d7 }qFt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 |D ]}t	j||}zbt
|d }t	j|}|r0| jd| | ||D ]}	|	V  q<|rX| jd= W  qW q tk
rx   Y qX qtd|  d S )Nr   r*   r   r+   zMalformed #include <...>rk   c                 S   s   g | ]
}|j qS r   r   rg   r   r   r   rj     s     z(Preprocessor.include.<locals>.<listcomp>r.   zMalformed #include statementr   zCouldn't find '%s')r
   r   ra   r   rn   rU   rp   rF   rG   osopenreaddirnameinsertr   IOError)
r>   rR   rr   filenamerF   pZinamedataZdnamerS   r   r   r   r     sF    


zPreprocessor.includec                 C   s  t |tr| |}|}zz|d }t|dkr:|d }nd }|s^t|jg }|| j|j< n4|j| jkrt|j| 	|dd  }|| j|j< n|jdkr| 
|dd  \}}}d}	|D ]}
|	rtd  qd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  qq| 	|d| d  }d}|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 }qt|j|dd	 |D |	}| | || j|j< ntd W n tk
r   td Y nX d S )Nr   r   rz   r'   Fz0No more arguments may follow a variadic argumentrk   c                 S   s   g | ]}t |jqS r   r   r   r   r   r   rj   :  s     z'Preprocessor.define.<locals>.<listcomp>z...TZ__VA_ARGS__zInvalid macro argumentrZ   c                 S   s   g | ]}|d  j qS )r   r   rg   r   r   r   rj   X  s     zBad macro definition)
isinstanceSTRING_TYPESrT   rn   r8   r
   rE   r   rb   ru   rx   rU   rp   r]   r   LookupError)r>   rR   Zlinetokr9   Zmtyper   r   rv   rw   r;   aZastrZmvaluerr   r   r   r   rK      sl    





$
&&

zPreprocessor.definec                 C   s0   |d j }z| j|= W n tk
r*   Y nX d S )Nr   )r
   rE   r   )r>   rR   idr   r   r   r   f  s
    
zPreprocessor.undefc                 C   s   || _ | ||| _d S rN   )ignorer   rM   )r>   r6   r=   r   r   r   r   parser  s    zPreprocessor.parsec                 C   sD   z"t | j}|j| jkr|W S qW n tk
r>   d | _Y d S X d S rN   )nextrM   r   r   StopIteration)r>   rS   r   r   r   rO   {  s    
 zPreprocessor.token)N)N)N)r@   rA   rB   r?   rT   rY   rH   re   rt   ru   rx   r   r   r   r   r   r   rK   r   r   rO   r   r   r   r   rC      s&   
<!5,2
H;
 1F	rC   __main__r   )3Z
__future__r   sysversion_infomajorr   Zunicoder   rangerm   rR   literalsr   Zt_CPP_POUNDZt_CPP_DPOUNDZt_CPP_IDr   Zt_CPP_INTEGERZt_CPP_FLOATr   r   r   r   r   rer   rI   Zos.pathr   compiler4   r/   r7   objectr8   rC   r@   Zply.lexrD   r   r   argvfr   r6   r   r   rO   rS   rU   r=   r   r   r   r   <module>
   sl   
	
     j
 