U
    ʹh~E                     @   s    d dl mZ G dd deZdS )   )c_astc                   @   s6  e Zd ZdZdd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dddddddddd d d!d!d"d"d"d#Zd$d% Zd&d' Zd(d) Zd*d+ Zdd,d-Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Zd@dA ZdBdC ZdDdE Z dFdG Z!dHdI Z"dJdK Z#dLdM Z$dNdO Z%dPdQ Z&dRdS Z'dTdU Z(dVdW Z)dXdY Z*dZd[ Z+d\d] Z,d^d_ Z-d`da Z.dbdc Z/ddde Z0dfdg Z1dhdi Z2djdk Z3dldm Z4dndo Z5dpdq Z6drds Z7dtdu Z8dvdw Z9dxdy Z:dzd{ Z;d|d} Z<dd~dZ=dd Z>g dfddZ?dd Z@dd ZAdd ZBdS )
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.
    Fc                 C   s   d| _ || _dS )z Constructs C-code generator

            reduce_parentheses:
                if True, eliminates needless parentheses on binary operators
            N)indent_levelreduce_parentheses)selfr    r   ;./venv/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   d}|j r|d|j  7 }|S )Nz#pragmar   )string)r   r   retr   r   r	   visit_Pragma/   s    zCGenerator.visit_Pragmac                 C   s$   |  |j}|d | |j d S )N[])_parenthesize_unless_simpler"   r   Z	subscript)r   r   Zarrrefr   r   r	   visit_ArrayRef5   s    zCGenerator.visit_ArrayRefc                 C   s"   |  |j}||j | |j S r   )r)   r"   typer   Zfield)r   r   Zsrefr   r   r	   visit_StructRef9   s    zCGenerator.visit_StructRefc                 C   s$   |  |j}|d | |j d S )N())r)   r"   r   args)r   r   Zfrefr   r   r	   visit_FuncCall=   s    zCGenerator.visit_FuncCallc                 C   s\   |j dkrd| |j S | |j}|j dkr8d| S |j dkrJd| S d|j |f S d S )NZsizeofz
sizeof(%s)zp++z%s++zp--z%s--z%s%s)opr   exprr)   )r   r   Zoperandr   r   r	   visit_UnaryOpA   s    


zCGenerator.visit_UnaryOpr   r                        	   )z||z&&|^&z==z!=>z>=<z<=z>>z<<+-*/%c                    s@     j fdd}  j fdd}d| j|f S )Nc                    s6    | p2jo2t| tjo2j| j j j k S r   _is_simple_noder   
isinstancer   BinaryOpprecedence_mapr1   dr   r   r   r	   <lambda>k   s   
z+CGenerator.visit_BinaryOp.<locals>.<lambda>c                    s6    | p2jo2t| tjo2j| j j j k S r   rF   rK   rM   r   r	   rN   w   s   
%s %s %s)_parenthesize_ifleftrightr1   )r   r   Zlval_strrval_strr   rM   r	   visit_BinaryOp_   s    
zCGenerator.visit_BinaryOpc                 C   s*   |  |jdd }d| |j|j|f S )Nc                 S   s   t | tjS r   )rH   r   
Assignment)r   r   r   r	   rN          z-CGenerator.visit_Assignment.<locals>.<lambda>rO   )rP   Zrvaluer   Zlvaluer1   )r   r   rS   r   r   r	   visit_Assignment|   s
    zCGenerator.visit_Assignmentc                 C   s   d |jS r   )r   namesr   r   r   r	   visit_IdentifierType   s    zCGenerator.visit_IdentifierTypec                 C   sP   t |tjrd| | d S t |tjtjfrBd| | d S | |S d S )N{}r-   r.   )rH   r   ZInitListr   ExprListCompoundr   r   r   r	   _visit_expr   s
    zCGenerator._visit_exprc                 C   sL   |r
|j n| |}|jr.|d| |j 7 }|jrH|d| |j 7 }|S )Nz :  = )r"   _generate_declZbitsizer   initr^   )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)rb   N)rd   r   declr   r   r	   r      s   z,CGenerator.visit_DeclList.<locals>.<genexpr>)r   declslenr   r   r   rc   r   r   r	   visit_DeclList   s    zCGenerator.visit_DeclListc                 C   s2   d}|j r|d|j d 7 }|| |j7 }|S )Nr   r   )storager   _generate_typer+   rj   r   r   r	   visit_Typedef   s
     zCGenerator.visit_Typedefc                 C   s,   d| j |jdd d }|d | |j S )Nr-   Femit_declnamer.   r   )rm   Zto_typer)   r2   rj   r   r   r	   
visit_Cast   s    zCGenerator.visit_Castc                 C   s*   g }|j D ]}|| | q
d|S Nre   Zexprsappendr^   r   r   r   Zvisited_subexprsr2   r   r   r	   visit_ExprList   s    
zCGenerator.visit_ExprListc                 C   s*   g }|j D ]}|| | q
d|S rr   rs   ru   r   r   r	   visit_InitList   s    
zCGenerator.visit_InitListc                 C   s   | j |ddS )Nenumr!   _generate_struct_union_enumr   r   r   r	   
visit_Enum   s    zCGenerator.visit_Enumc                 C   s   d | |jS )Nz_Alignas({}))formatr   Z	alignmentr   r   r   r	   visit_Alignas   s    zCGenerator.visit_Alignasc                 C   s<   |j sdj|  |jdS dj|  |j| |j dS d S )Nz{indent}{name},
)indentr"   z{indent}{name} = {value},
)r~   r"   r   )r   r|   r   r"   r   r   r   r   r	   visit_Enumerator   s    
zCGenerator.visit_Enumeratorc                    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   rg   r   bodyZparam_declsr   )r   r   rg   r   Zknrdeclsr   r   r	   visit_FuncDef   s    zCGenerator.visit_FuncDefc                 C   sb   d}|j D ]R}t|tjr*|| |7 }q
t|tjrJ|| |d 7 }q
|| |d 7 }q
|S )Nr   r   r   )extrH   r   ZFuncDefr   ZPragma)r   r   rc   r   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{
r4   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   rj   r   r   r	   visit_Compound   s    zCGenerator.visit_Compoundc                 C   s$   d|  |j d |  |j d S )Nr-   z){r[   )r   r+   ra   r   r   r   r	   visit_CompoundLiteral   s    z CGenerator.visit_CompoundLiteralc                 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 )Nre   c                 3   s   | ]}  |V  qd S r   r   )r   Zparamr   r   r	   r      s     z-CGenerator.visit_ParamList.<locals>.<genexpr>)r   paramsr   r   r   r	   visit_ParamList   s    zCGenerator.visit_ParamListc                 C   s&   d}|j r|d| |j  7 }|d S )Nreturnr   r   )r2   r   rj   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   sH   d|  |j d }|d|  |j d 7 }|d|  |j d 7 }|S )Nr-   z) ? z) : r.   )r^   condiftrueiffalserj   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
)r   r   r   r   r   r   rj   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 (r   r   r   Tr   )ra   r   r   nextr   r   rj   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 (r   Tr   )r   r   r   r   rj   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
Tr   r   z);)r   r   r   r   r   rj   r   r   r	   visit_DoWhile  s     zCGenerator.visit_DoWhilec                 C   s>   d}||  |j7 }|jr2|d7 }||  |j7 }|d7 }|S )Nz_Static_assert(,r.   )r   r   messagerj   r   r   r	   visit_StaticAssert$  s    zCGenerator.visit_StaticAssertc                 C   s,   d|  |j d }|| j|jdd7 }|S )Nzswitch (r   Tr   )r   r   r   r   rj   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 :
Tr   )r   r2   stmtsr   r   r   rc   r   r   r   r	   
visit_Case2  s    
zCGenerator.visit_Casec                 C   s&   d}|j D ]}|| j|dd7 }q
|S )Nz	default:
Tr   )r   r   r   r   r   r	   visit_Default8  s    
zCGenerator.visit_Defaultc                 C   s   |j d | |j S )Nr   )r"   r   r   r   r   r   r	   visit_Label>  s    zCGenerator.visit_Labelc                 C   s   d|j  d S )Nzgoto r   r!   r   r   r   r	   
visit_GotoA  s    zCGenerator.visit_Gotoc                 C   s   dS )Nz...r   r   r   r   r	   visit_EllipsisParamD  s    zCGenerator.visit_EllipsisParamc                 C   s   |  |dS )Nstructry   r   r   r   r	   visit_StructG  s    zCGenerator.visit_Structc                 C   s   |  |jS r   )rm   r+   r   r   r   r	   visit_TypenameJ  s    zCGenerator.visit_Typenamec                 C   s   |  |dS )Nunionry   r   r   r   r	   visit_UnionM  s    zCGenerator.visit_Unionc                 C   sZ   d}|j D ]6}t|tjr*|d|j  7 }q
|d| | d 7 }q
|d| |j 7 }|S )Nr   .r'   r(   r_   )r"   rH   r   IDr   r^   r2   )r   r   rc   r"   r   r   r	   visit_NamedInitializerP  s    
z!CGenerator.visit_NamedInitializerc                 C   s
   |  |S r   rm   r   r   r   r	   visit_FuncDeclZ  s    zCGenerator.visit_FuncDeclc                 C   s   | j |ddS NFro   r   r   r   r   r	   visit_ArrayDecl]  s    zCGenerator.visit_ArrayDeclc                 C   s   | j |ddS r   r   r   r   r   r	   visit_TypeDecl`  s    zCGenerator.visit_TypeDeclc                 C   s   | j |ddS r   r   r   r   r   r	   visit_PtrDeclc  s    zCGenerator.visit_PtrDeclc                 C   s   |dkr|j }| j}n(|dks"t|jdkr0dn|jj}| j}|d |jpLd }|dk	r|d7 }||  7 }|  jd7  _|d7 }|||7 }|  jd8  _||  d	 7 }|S )
zq Generates code for structs, unions, and enums. name should be
            'struct', 'union', or 'enum'.
        )r   r   rx   Nr   r   r   r4   r   r[   )	rh   _generate_struct_union_bodyAssertionErrorvaluesZenumerators_generate_enum_bodyr"   r   r   )r   r   r"   membersZbody_functionrc   r   r   r	   rz   f  s     z&CGenerator._generate_struct_union_enumc                    s   d  fdd|D S )Nr   c                 3   s   | ]}  |V  qd S r   r   rf   r   r   r	   r     s     z9CGenerator._generate_struct_union_body.<locals>.<genexpr>r   r   r   r   r   r	   r   ~  s    z&CGenerator._generate_struct_union_bodyc                    s$   d  fdd|D d d d S )Nr   c                 3   s   | ]}  |V  qd S r   r   )r   r   r   r   r	   r     s     z1CGenerator._generate_enum_body.<locals>.<genexpr>r   r   r   r   r   r	   r     s    zCGenerator._generate_enum_bodyc                 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 |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.
        r4   r   r   N)r+   r   r   r   DeclrU   ZCastZUnaryOprI   Z	TernaryOpFuncCallArrayRef	StructRefConstantr   ZTypedefr\   r   r]   ZIf)r   r   r   typr~   r   r   r	   r     s6               
zCGenerator._generate_stmtc                 C   sf   d}|j rd|j d }|jr4|d|jd 7 }|jrR|| |jd d 7 }|| |j7 }|S )z& Generation from a Decl node.
        r   r   r   )Zfuncspecr   rl   Zalignr   rm   r+   rj   r   r   r	   r`     s       zCGenerator._generate_declTc           	      C   s  t |}|tjkrd}|jr2|d|jd 7 }|| |j 7 }|jrR|rR|jnd}t|D ]\}}t|tj	r|dkrt||d  tj
rd| d }|d7 }|jr|d|jd 7 }|| |jd 7 }q^t|tjr(|dkrt||d  tj
rd| d }|d| |j d 7 }q^t|tj
r^|jr`d	d|j|rVd| ndf }q^d
| }q^|r||d| 7 }|S |tjkr| |j S |tjkr| j|j |dS |tjkrd|jd S |tj	tj
tjfkr| j|j ||g |d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%srC   ro   N)r+   r   ZTypeDeclZqualsr   r   Zdeclname	enumeraterH   Z	ArrayDeclZPtrDeclZ	dim_qualsZdimZFuncDeclr/   r   r`   ZTypenamerm   ZIdentifierTyperX   )	r   r   	modifiersrp   r   rc   Znstrimodifierr   r   r	   rm     sV     

 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)r^   )r   r   Z	conditionrc   r   r   r	   rP     s    
zCGenerator._parenthesize_ifc                    s     | fddS )z. Common use case for _parenthesize_if
        c                    s     |  S r   )rG   rK   r   r   r	   rN     rV   z8CGenerator._parenthesize_unless_simple.<locals>.<lambda>)rP   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.
        )rH   r   r   r   r   r   r   r   r   r   r	   rG     s     zCGenerator._is_simple_nodeN)F)F)F)Cr   
__module____qualname____doc__r
   r   r   r   r    r#   r&   r*   r,   r0   r3   rJ   rT   rW   rY   r^   rd   rk   rn   rq   rv   rw   r{   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rz   r   r   r   r`   rm   rP   r)   rG   r   r   r   r	   r      s   
        

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