
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
U
    ӗ_5                     @   s    d dl mZ G dd deZdS )   )c_astc                   @   s  e Zd Z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 Zdd Zdd Zdd Zdd Zdldd Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKdL Z(dMdN Z)dOdP Z*dQdR Z+dSdT Z,dUdV Z-dWdX Z.dYdZ Z/d[d\ Z0d]d^ Z1dmd_d`Z2dadb Z3g fdcddZ4dedf Z5dgdh Z6didj Z7dkS )n
CGeneratorz Uses the same visitor pattern as c_ast.NodeVisitor, but modified to
        return a value from each visit method, using string accumulation in
        generic_visit.
    c                 C   s
   d| _ d S )N    indent_levelself r	   F/opt/alt/python38/lib/python3.8/site-packages/pycparser/c_generator.py__init__   s    zCGenerator.__init__c                 C   s
   d| j  S N r   r   r	   r	   r
   _make_indent   s    zCGenerator._make_indentc                 C   s   d|j j }t| || j|S )NZvisit_)	__class____name__getattrgeneric_visit)r   nodemethodr	   r	   r
   visit   s    zCGenerator.visitc                    s,   |d krdS d  fdd| D S d S )N c                 3   s   | ]\}}  |V  qd S Nr   ).0Zc_namecr   r	   r
   	<genexpr>#   s     z+CGenerator.generic_visit.<locals>.<genexpr>)joinZchildren)r   r   r	   r   r
   r      s    zCGenerator.generic_visitc                 C   s   |j S r   )valuer   nr	   r	   r
   visit_Constant%   s    zCGenerator.visit_Constantc                 C   s   |j S r   namer   r	   r	   r
   visit_ID(   s    zCGenerator.visit_IDc                 C   s$   |  |j}|d | |j d S )N[])_parenthesize_unless_simpler"   r   Z	subscript)r   r   Zarrrefr	   r	   r
   visit_ArrayRef+   s    zCGenerator.visit_ArrayRefc                 C   s"   |  |j}||j | |j S r   )r&   r"   typer   Zfield)r   r   Zsrefr	   r	   r
   visit_StructRef/   s    zCGenerator.visit_StructRefc                 C   s$   |  |j}|d | |j d S )N())r&   r"   r   args)r   r   Zfrefr	   r	   r
   visit_FuncCall3   s    zCGenerator.visit_FuncCallc                 C   s\   |  |j}|jdkrd| S |jdkr0d| S |jdkrJd| |j S d|j|f S d S )Nzp++z%s++zp--z%s--Zsizeofz
sizeof(%s)z%s%s)r&   expropr   )r   r   Zoperandr	   r	   r
   visit_UnaryOp7   s    


zCGenerator.visit_UnaryOpc                    s<     |j fdd}  |j fdd}d||j|f S )Nc                    s     |  S r   _is_simple_nodedr   r	   r
   <lambda>F       z+CGenerator.visit_BinaryOp.<locals>.<lambda>c                    s     |  S r   r1   r3   r   r	   r
   r5   H   r6   %s %s %s)_parenthesize_ifleftrightr/   )r   r   Zlval_strrval_strr	   r   r
   visit_BinaryOpD   s    

zCGenerator.visit_BinaryOpc                 C   s*   |  |jdd }d| |j|j|f S )Nc                 S   s   t | tjS r   )
isinstancer   
Assignment)r   r	   r	   r
   r5   N   r6   z-CGenerator.visit_Assignment.<locals>.<lambda>r7   )r8   Zrvaluer   Zlvaluer/   )r   r   r;   r	   r	   r
   visit_AssignmentK   s
    zCGenerator.visit_Assignmentc                 C   s   d |jS r   )r   namesr   r	   r	   r
   visit_IdentifierTypeQ   s    zCGenerator.visit_IdentifierTypec                 C   sJ   t |tjrd| | d S t |tjr<d| | d S | |S d S )N{}r*   r+   )r=   r   ZInitListr   ExprListr   r	   r	   r
   _visit_exprT   s
    zCGenerator._visit_exprFc                 C   sL   |r
|j n| |}|jr.|d| |j 7 }|jrH|d| |j 7 }|S )N :  = )r"   _generate_declZbitsizer   initrE   )r   r   no_typesr	   r	   r
   
visit_Decl\   s     zCGenerator.visit_Declc                    sL     |jd }t|jdkrH|dd fdd|jdd  D  7 }|S )Nr   r   , c                 3   s   | ]} j |d dV  qdS )T)rJ   N)rL   )r   declr   r	   r
   r   i   s   z,CGenerator.visit_DeclList.<locals>.<genexpr>)r   declslenr   r   r   rK   r	   r   r
   visit_DeclListf   s    zCGenerator.visit_DeclListc                 C   s2   d}|j r|d|j d 7 }|| |j7 }|S )Nr   r   )storager   _generate_typer(   rQ   r	   r	   r
   visit_Typedefm   s
     zCGenerator.visit_Typedefc                 C   s(   d|  |j d }|d | |j S )Nr*   r+   r   )rT   Zto_typer&   r.   rQ   r	   r	   r
   
visit_Casts   s    zCGenerator.visit_Castc                 C   s*   g }|j D ]}|| | q
d|S NrM   ZexprsappendrE   r   r   r   Zvisited_subexprsr.   r	   r	   r
   visit_ExprListw   s    
zCGenerator.visit_ExprListc                 C   s*   g }|j D ]}|| | q
d|S rW   rX   rZ   r	   r	   r
   visit_InitList}   s    
zCGenerator.visit_InitListc                 C   s   d}|j r|d|j  7 }|jr|d7 }t|jjD ]H\}}||j 7 }|jr^|d| |j 7 }|t|jjd kr2|d7 }q2|d7 }|S )Nenumr   z {rG   r   rM   rC   )r"   values	enumerateZenumeratorsr   r   rP   )r   r   rK   iZ
enumeratorr	   r	   r
   
visit_Enum   s     

zCGenerator.visit_Enumc                    sj     |j}d _  |j}|jrVd fdd|jD }|d | d | d S |d | d S d S )Nr   ;
c                 3   s   | ]}  |V  qd S r   r   )r   pr   r	   r
   r      s     z+CGenerator.visit_FuncDef.<locals>.<genexpr>
)r   rN   r   bodyZparam_declsr   )r   r   rN   re   Zknrdeclsr	   r   r
   visit_FuncDef   s    zCGenerator.visit_FuncDefc                 C   sB   d}|j D ]2}t|tjr*|| |7 }q
|| |d 7 }q
|S )Nr   rb   )extr=   r   ZFuncDefr   )r   r   rK   rg   r	   r	   r
   visit_FileAST   s    
zCGenerator.visit_FileASTc                    s`      d }  jd7  _|jr>|d fdd|jD 7 }  jd8  _|   d 7 }|S )N{
   r   c                 3   s   | ]}  |V  qd S r   )_generate_stmt)r   stmtr   r	   r
   r      s     z,CGenerator.visit_Compound.<locals>.<genexpr>z}
)r   r   Zblock_itemsr   rQ   r	   r   r
   visit_Compound   s    zCGenerator.visit_Compoundc                 C   s   dS )N;r	   r   r	   r	   r
   visit_EmptyStatement   s    zCGenerator.visit_EmptyStatementc                    s   d  fdd|jD S )NrM   c                 3   s   | ]}  |V  qd S r   r   )r   Zparamr   r	   r
   r      s     z-CGenerator.visit_ParamList.<locals>.<genexpr>)r   Zparamsr   r	   r   r
   visit_ParamList   s    zCGenerator.visit_ParamListc                 C   s&   d}|j r|d| |j  7 }|d S )Nreturnr   rn   )r.   r   rQ   r	   r	   r
   visit_Return   s     zCGenerator.visit_Returnc                 C   s   dS )Nzbreak;r	   r   r	   r	   r
   visit_Break   s    zCGenerator.visit_Breakc                 C   s   dS )Nz	continue;r	   r   r	   r	   r
   visit_Continue   s    zCGenerator.visit_Continuec                 C   s8   |  |jd }||  |jd 7 }||  |j7 }|S )Nz ? rF   )rE   condiftrueiffalserQ   r	   r	   r
   visit_TernaryOp   s    zCGenerator.visit_TernaryOpc                 C   sd   d}|j r|| |j 7 }|d7 }|| j|jdd7 }|jr`||  d 7 }|| j|jdd7 }|S )Nzif ()
T
add_indentzelse
)ru   r   rk   rv   rw   r   rQ   r	   r	   r
   visit_If   s     zCGenerator.visit_Ifc                 C   s~   d}|j r|| |j 7 }|d7 }|jr<|d| |j 7 }|d7 }|jr^|d| |j 7 }|d7 }|| j|jdd7 }|S )Nzfor (rn   r   ry   Trz   )rI   r   ru   nextrk   rl   rQ   r	   r	   r
   	visit_For   s       zCGenerator.visit_Forc                 C   s:   d}|j r|| |j 7 }|d7 }|| j|jdd7 }|S )Nwhile (ry   Trz   )ru   r   rk   rl   rQ   r	   r	   r
   visit_While   s     zCGenerator.visit_Whilec                 C   sJ   d}|| j |jdd7 }||  d 7 }|jr>|| |j7 }|d7 }|S )Nzdo
Trz   r   z);)rk   rl   r   ru   r   rQ   r	   r	   r
   visit_DoWhile   s     zCGenerator.visit_DoWhilec                 C   s,   d|  |j d }|| j|jdd7 }|S )Nzswitch (ry   Trz   )r   ru   rk   rl   rQ   r	   r	   r
   visit_Switch   s    zCGenerator.visit_Switchc                 C   s6   d|  |j d }|jD ]}|| j|dd7 }q|S )Nzcase :
Trz   )r   r.   stmtsrk   r   r   rK   rl   r	   r	   r
   
visit_Case   s    
zCGenerator.visit_Casec                 C   s&   d}|j D ]}|| j|dd7 }q
|S )Nz	default:
Trz   )r   rk   r   r	   r	   r
   visit_Default   s    
zCGenerator.visit_Defaultc                 C   s   |j d | |j S )Nr   )r"   rk   rl   r   r	   r	   r
   visit_Label   s    zCGenerator.visit_Labelc                 C   s   d|j  d S )Nzgoto rn   r!   r   r	   r	   r
   
visit_Goto   s    zCGenerator.visit_Gotoc                 C   s   dS )Nz...r	   r   r	   r	   r
   visit_EllipsisParam   s    zCGenerator.visit_EllipsisParamc                 C   s   |  |dS )NZstruct_generate_struct_unionr   r	   r	   r
   visit_Struct  s    zCGenerator.visit_Structc                 C   s   |  |jS r   )rT   r(   r   r	   r	   r
   visit_Typename  s    zCGenerator.visit_Typenamec                 C   s   |  |dS )Nunionr   r   r	   r	   r
   visit_Union  s    zCGenerator.visit_Unionc                 C   sb   d}|j D ]>}t|tjr*|d|j  7 }q
t|tjr
|d|j d 7 }q
|d| |j 7 }|S )Nr   .r$   r%   rG   )r"   r=   r   IDConstantr   r   r.   )r   r   rK   r"   r	   r	   r
   visit_NamedInitializer  s    
z!CGenerator.visit_NamedInitializerc                 C   s
   |  |S r   )rT   r   r	   r	   r
   visit_FuncDecl  s    zCGenerator.visit_FuncDeclc                 C   s~   |d |j pd }|jrz|d7 }||  7 }|  jd7  _|d7 }|jD ]}|| |7 }qH|  jd8  _||  d 7 }|S )ze Generates code for structs and unions. name should be either
            'struct' or union.
        r   r   rd   rj   ri   rC   )r"   rO   r   r   rk   )r   r   r"   rK   rN   r	   r	   r
   r     s    
z!CGenerator._generate_struct_unionc                 C   s   t |}|r|  jd7  _|  }|r4|  jd8  _|tjtjtjtjtjtj	tj
tjtjtjtjtjtjfkr|| | d S |tjfkr| |S || | d S dS )z Generation from a statement node. This method exists as a wrapper
            for individual visit_* methods to handle different treatment of
            some statements in this context.
        rj   rb   rd   N)r(   r   r   r   Declr>   ZCastZUnaryOpZBinaryOpZ	TernaryOpFuncCallArrayRef	StructRefr   r   ZTypedefrD   r   ZCompound)r   r   r{   typindentr	   r	   r
   rk   (  s2               
zCGenerator._generate_stmtc                 C   sH   d}|j rd|j d }|jr4|d|jd 7 }|| |j7 }|S )z& Generation from a Decl node.
        r   r   )Zfuncspecr   rS   rT   r(   rQ   r	   r	   r
   rH   D  s      zCGenerator._generate_declc                 C   s  t |}|tjkrHd}|jr2|d|jd 7 }|| |j 7 }|jrN|jnd}t|D ]\}}t|tj	r|dkrt||d  tj
rd| d }|d| |j d 7 }qZt|tjr|dkrt||d  tj
rd| d }|d| |j d 7 }qZt|tj
rZ|jr(d	d|j|f }qZd
| }qZ|rD|d| 7 }|S |tjkr`| |j S |tjkrx| |j S |tjkrd|jd S |tj	tj
tjfkr| |j ||g S | |S dS )z Recursive generation from a type node. n is the type node.
            modifiers collects the PtrDecl, ArrayDecl and FuncDecl modifiers
            encountered on the way down to a TypeDecl, to allow proper
            generation from it.
        r   r   r   r   r*   r+   r$   r%   z* %s %s*N)r(   r   ZTypeDeclZqualsr   r   Zdeclnamer_   r=   Z	ArrayDeclZPtrDeclZdimZFuncDeclr,   r   rH   ZTypenamerT   ZIdentifierTyper@   )r   r   Z	modifiersr   rK   Znstrr`   Zmodifierr	   r	   r
   rT   M  s@     
 zCGenerator._generate_typec                 C   s&   |  |}||rd| d S |S dS )z Visits 'n' and returns its string representation, parenthesized
            if the condition function applied to the node returns True.
        r*   r+   N)rE   )r   r   Z	conditionrK   r	   r	   r
   r8   {  s    
zCGenerator._parenthesize_ifc                    s     | fddS )z. Common use case for _parenthesize_if
        c                    s     |  S r   r1   r3   r   r	   r
   r5     r6   z8CGenerator._parenthesize_unless_simple.<locals>.<lambda>)r8   r   r	   r   r
   r&     s    z&CGenerator._parenthesize_unless_simplec                 C   s   t |tjtjtjtjtjfS )z~ Returns True for nodes that are "simple" - i.e. nodes that always
            have higher precedence than operators.
        )r=   r   r   r   r   r   r   r   r	   r	   r
   r2     s     zCGenerator._is_simple_nodeN)F)F)8r   
__module____qualname____doc__r   r   r   r   r    r#   r'   r)   r-   r0   r<   r?   rA   rE   rL   rR   rU   rV   r[   r\   ra   rf   rh   rm   ro   rp   rr   rs   rt   rx   r|   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rk   rH   rT   r8   r&   r2   r	   r	   r	   r
   r      sj   


		


	.
r   N)r   r   objectr   r	   r	   r	   r
   <module>	   s   