509318396
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
g¨wU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   ú!/usr/lib/python3.6/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j ‡ fdd„|jƒ D ƒƒS d S )NÚ c             3   s   | ]\}}ˆ j |ƒV  qd S )N)r   )Ú.0Zc_nameÚc)r   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 )N)Úvalue)r   Únr   r   r   Úvisit_Constant%   s    zCGenerator.visit_Constantc             C   s   |j S )N)Úname)r   r   r   r   r   Úvisit_ID(   s    zCGenerator.visit_IDc             C   s$   | j |jƒ}|d | j|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 | j|jƒ S )N)r   r   Útyper   Zfield)r   r   Zsrefr   r   r   Úvisit_StructRef/   s    zCGenerator.visit_StructRefc             C   s$   | j |jƒ}|d | j|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ƒ}|jdkrd| S |jdkr0d| S |jdkrJd| j|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 |j‡ fdd„ƒ}ˆ j |j‡ fdd„ƒ}d||j|f S )Nc                s   ˆ j | ƒ S )N)Ú_is_simple_node)Úd)r   r   r   Ú<lambda>F   s    z+CGenerator.visit_BinaryOp.<locals>.<lambda>c                s   ˆ j | ƒ S )N)r*   )r+   )r   r   r   r,   H   s    z%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 |jdd„ ƒ}d| j|jƒ|j|f S )Nc             S   s   t | tjƒS )N)Ú
isinstancer   Ú
Assignment)r   r   r   r   r,   N   s    z-CGenerator.visit_Assignment.<locals>.<lambda>z%s %s %s)r-   Zrvaluer   Zlvaluer(   )r   r   r0   r   r   r   Úvisit_AssignmentK   s    
zCGenerator.visit_Assignmentc             C   s   dj |jƒS )Nr
   )r   Únames)r   r   r   r   r   Úvisit_IdentifierTypeQ   s    zCGenerator.visit_IdentifierTypec             C   sJ   t |tjƒrd| j|ƒ d S t |tjƒr<d| j|ƒ d S | j|ƒS d S )Nú{ú}r#   r$   )r2   r   ZInitListr   ÚExprList)r   r   r   r   r   Ú_visit_exprT   s
    zCGenerator._visit_exprFc             C   sL   |r
|j n| j|ƒ}|jr.|d| j|jƒ 7 }|jrH|d| j|jƒ 7 }|S )Nz : z = )r   Ú_generate_declZbitsizer   Úinitr:   )r   r   Úno_typeÚsr   r   r   Ú
visit_Decl\   s     zCGenerator.visit_Declc                sL   ˆ j |jd ƒ}t|jƒdkrH|ddj‡ fdd„|jdd … D ƒƒ 7 }|S )Nr   r   z, c             3   s   | ]}ˆ j |d d�V  qdS )T)r=   N)r?   )r   Údecl)r   r   r   r   i   s   z,CGenerator.visit_DeclList.<locals>.<genexpr>)r   ÚdeclsÚlenr   )r   r   r>   r   )r   r   Úvisit_DeclListf   s
    zCGenerator.visit_DeclListc             C   s2   d}|j r|dj|j ƒd 7 }|| j|jƒ7 }|S )Nr   r
   )Ústorager   Ú_generate_typer!   )r   r   r>   r   r   r   Úvisit_Typedefm   s
     zCGenerator.visit_Typedefc             C   s(   d| j |jƒ d }|d | j|jƒ S )Nr#   r$   r
   )rE   Zto_typer   r'   )r   r   r>   r   r   r   Ú
visit_Casts   s    zCGenerator.visit_Castc             C   s.   g }x|j D ]}|j| j|ƒƒ qW dj|ƒS )Nz, )ÚexprsÚappendr:   r   )r   r   Úvisited_subexprsr'   r   r   r   Úvisit_ExprListw   s    zCGenerator.visit_ExprListc             C   s.   g }x|j D ]}|j| j|ƒƒ qW dj|ƒS )Nz, )rH   rI   r:   r   )r   r   rJ   r'   r   r   r   Úvisit_InitList}   s    zCGenerator.visit_InitListc             C   sŒ   d}|j r|d|j  7 }|jrˆ|d7 }xXt|jjƒD ]H\}}||j 7 }|jr`|d| j|jƒ 7 }|t|jjƒd kr4|d7 }q4W |d7 }|S )NÚenumr
   z {z = r   z, r8   )r   ÚvaluesÚ	enumerateZenumeratorsr   r   rB   )r   r   r>   ÚiZ
enumeratorr   r   r   Ú
visit_Enumƒ   s     
zCGenerator.visit_Enumc                sj   ˆ j |jƒ}dˆ _ˆ j |jƒ}|jrVdj‡ fdd„|jD ƒƒ}|d | d | d S |d | d S d S )Nr   z;
c             3   s   | ]}ˆ j |ƒV  qd S )N)r   )r   Úp)r   r   r   r   –   s    z+CGenerator.visit_FuncDef.<locals>.<genexpr>Ú
)r   r@   r   ÚbodyZparam_declsr   )r   r   r@   rT   Zknrdeclsr   )r   r   Úvisit_FuncDef‘   s    zCGenerator.visit_FuncDefc             C   sF   d}x<|j D ]2}t|tjƒr,|| j|ƒ7 }q|| j|ƒd 7 }qW |S )Nr   z;
)Úextr2   r   ZFuncDefr   )r   r   r>   rV   r   r   r   Úvisit_FileAST›   s    zCGenerator.visit_FileASTc                s`   ˆ j ƒ d }ˆ  jd7  _|jr>|dj‡ fdd„|jD ƒƒ7 }ˆ  jd8  _|ˆ j ƒ d 7 }|S )Nz{
é   r   c             3   s   | ]}ˆ j |ƒV  qd S )N)Ú_generate_stmt)r   Ústmt)r   r   r   r   ¨   s    z,CGenerator.visit_Compound.<locals>.<genexpr>z}
)r   r   Zblock_itemsr   )r   r   r>   r   )r   r   Úvisit_Compound¤   s    zCGenerator.visit_Compoundc             C   s   dS )Nú;r   )r   r   r   r   r   Úvisit_EmptyStatement­   s    zCGenerator.visit_EmptyStatementc                s   dj ‡ fdd„|jD ƒƒS )Nz, c             3   s   | ]}ˆ j |ƒV  qd S )N)r   )r   Zparam)r   r   r   r   ±   s    z-CGenerator.visit_ParamList.<locals>.<genexpr>)r   Zparams)r   r   r   )r   r   Úvisit_ParamList°   s    zCGenerator.visit_ParamListc             C   s&   d}|j r|d| j|j ƒ 7 }|d S )NÚreturnr
   r\   )r'   r   )r   r   r>   r   r   r   Úvisit_Return³   s     zCGenerator.visit_Returnc             C   s   dS )Nzbreak;r   )r   r   r   r   r   Úvisit_Break¸   s    zCGenerator.visit_Breakc             C   s   dS )Nz	continue;r   )r   r   r   r   r   Úvisit_Continue»   s    zCGenerator.visit_Continuec             C   s8   | j |jƒd }|| j |jƒd 7 }|| j |jƒ7 }|S )Nz ? z : )r:   ÚcondÚiftrueÚiffalse)r   r   r>   r   r   r   Úvisit_TernaryOp¾   s    zCGenerator.visit_TernaryOpc             C   sd   d}|j r|| j|j ƒ7 }|d7 }|| j|jdd�7 }|jr`|| jƒ d 7 }|| j|jdd�7 }|S )Nzif (z)
T)Ú
add_indentzelse
)rc   r   rY   rd   re   r   )r   r   r>   r   r   r   Úvisit_IfÄ   s     zCGenerator.visit_Ifc             C   s~   d}|j r|| j|j ƒ7 }|d7 }|jr<|d| j|jƒ 7 }|d7 }|jr^|d| j|jƒ 7 }|d7 }|| j|jdd�7 }|S )Nzfor (r\   r
   z)
T)rg   )r<   r   rc   ÚnextrY   rZ   )r   r   r>   r   r   r   Ú	visit_ForÎ   s       zCGenerator.visit_Forc             C   s:   d}|j r|| j|j ƒ7 }|d7 }|| j|jdd�7 }|S )Nzwhile (z)
T)rg   )rc   r   rY   rZ   )r   r   r>   r   r   r   Úvisit_WhileÙ   s     zCGenerator.visit_Whilec             C   sJ   d}|| j |jdd�7 }|| jƒ d 7 }|jr>|| j|jƒ7 }|d7 }|S )Nzdo
T)rg   zwhile (z);)rY   rZ   r   rc   r   )r   r   r>   r   r   r   Úvisit_DoWhileà   s     zCGenerator.visit_DoWhilec             C   s,   d| j |jƒ d }|| j|jdd�7 }|S )Nzswitch (z)
T)rg   )r   rc   rY   rZ   )r   r   r>   r   r   r   Úvisit_Switchè   s    zCGenerator.visit_Switchc             C   s:   d| j |jƒ d }x |jD ]}|| j|dd�7 }qW |S )Nzcase z:
T)rg   )r   r'   ÚstmtsrY   )r   r   r>   rZ   r   r   r   Ú
visit_Caseí   s    zCGenerator.visit_Casec             C   s*   d}x |j D ]}|| j|dd�7 }qW |S )Nz	default:
T)rg   )rn   rY   )r   r   r>   rZ   r   r   r   Úvisit_Defaultó   s    zCGenerator.visit_Defaultc             C   s   |j d | j|jƒ S )Nz:
)r   rY   rZ   )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   r   Ú
visit_Gotoü   s    zCGenerator.visit_Gotoc             C   s   dS )Nz...r   )r   r   r   r   r   Úvisit_EllipsisParamÿ   s    zCGenerator.visit_EllipsisParamc             C   s   | j |dƒS )NÚstruct)Ú_generate_struct_union)r   r   r   r   r   Úvisit_Struct  s    zCGenerator.visit_Structc             C   s   | j |jƒS )N)rE   r!   )r   r   r   r   r   Úvisit_Typename  s    zCGenerator.visit_Typenamec             C   s   | j |dƒS )NÚunion)ru   )r   r   r   r   r   Úvisit_Union  s    zCGenerator.visit_Unionc             C   sf   d}xH|j D ]>}t|tjƒr,|d|j  7 }qt|tjƒr|d|j d 7 }qW |d| j|jƒ 7 }|S )Nr   Ú.r   r   z = )r   r2   r   ÚIDÚConstantr   r   r'   )r   r   r>   r   r   r   r   Úvisit_NamedInitializer  s    z!CGenerator.visit_NamedInitializerc             C   s
   | j |ƒS )N)rE   )r   r   r   r   r   Úvisit_FuncDecl  s    zCGenerator.visit_FuncDeclc             C   s‚   |d |j pd }|jr~|d7 }|| jƒ 7 }|  jd7  _|d7 }x|jD ]}|| j|ƒ7 }qJW |  jd8  _|| jƒ d 7 }|S )ze Generates code for structs and unions. name should be either
            'struct' or union.
        r
   r   rS   rX   z{
r8   )r   rA   r   r   rY   )r   r   r   r>   r@   r   r   r   ru     s    z!CGenerator._generate_struct_unionc             C   s®   t |ƒ}|r|  jd7  _| jƒ }|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‚|| j|ƒ d S |tjfkr˜| j|ƒS || j|ƒ 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.
        rX   z;
rS   N)r!   r   r   r   ÚDeclr3   ZCastZUnaryOpZBinaryOpZ	TernaryOpÚFuncCallÚArrayRefÚ	StructRefr|   r{   ZTypedefr9   r   ZCompound)r   r   rg   ÚtypÚindentr   r   r   rY   (  s      

zCGenerator._generate_stmtc             C   sH   d}|j rdj|j ƒd }|jr4|dj|jƒd 7 }|| j|jƒ7 }|S )z& Generation from a Decl node.
        r   r
   )Zfuncspecr   rD   rE   r!   )r   r   r>   r   r   r   r;   D  s      zCGenerator._generate_declc             C   sÒ  t |ƒ}|tjk�rNd}|jr2|dj|jƒd 7 }|| j|j ƒ7 }|jrN|jnd}xät|ƒD ]Ø\}}t|tj	ƒr²|dkr˜t||d  tj
ƒr˜d| d }|d| j|jƒ d 7 }q\t|tjƒ�r|dkrèt||d  tj
ƒrèd| d }|d| j|jƒ d 7 }q\t|tj
ƒr\|j�r,d	dj|jƒ|f }q\d
| }q\W |�rJ|d| 7 }|S |tjk�rf| j|j ƒS |tjk�r~| j|j ƒS |tjk�ršdj|jƒd S |tj	tj
tjfk�rÄ| j|j ||g ƒS | j|ƒ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declnamerO   r2   Z	ArrayDeclZPtrDeclZdimZFuncDeclr%   r   r;   ZTypenamerE   ZIdentifierTyper5   )r   r   Z	modifiersrƒ   r>   ZnstrrP   Zmodifierr   r   r   rE   M  s@      zCGenerator._generate_typec             C   s&   | j |ƒ}||ƒ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	conditionr>   r   r   r   r-   {  s    
zCGenerator._parenthesize_ifc                s   ˆ j |‡ fdd„ƒS )z. Common use case for _parenthesize_if
        c                s   ˆ j | ƒ S )N)r*   )r+   )r   r   r   r,   ˆ  s    z8CGenerator._parenthesize_unless_simple.<locals>.<lambda>)r-   )r   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.
        )r2   r   r|   r{   r�   r‚   r€   )r   r   r   r   r   r*   Š  s    zCGenerator._is_simple_nodeN)F)F)8r   Ú
__module__Ú__qualname__Ú__doc__r	   r   r   r   r   r   r    r"   r&   r)   r1   r4   r6   r:   r?   rC   rF   rG   rK   rL   rQ   rU   rW   r[   r]   r^   r`   ra   rb   rf   rh   rj   rk   rl   rm   ro   rp   rq   rr   rs   rv   rw   ry   r}   r~   ru   rY   r;   rE   r-   r   r*   r   r   r   r   r      sj   

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