o
    Þý°jµP  ã                   @   s2   d dl mZmZmZ ddlmZ G dd„ dƒZdS )é    )ÚCallableÚListÚOptionalé   )Úc_astc                	   @   s²  e Zd ZU dZeed< eed< d©deddfdd„Zdefd	d
„Z	de
jdefdd„Zdee
j defdd„Zde
jdefdd„Zde
jdefdd„Zde
jdefdd„Zde
jdefdd„Zde
jdefdd„Zde
jdefdd„Zde
jdefdd„Zi dd “d!d"“d#d$“d%d&“d'd(“d)d*“d+d*“d,d-“d.d-“d/d-“d0d-“d1d2“d3d2“d4d5“d6d5“d7d8“d9d8“d:d8i¥Zde
jdefd;d<„Zde
j defd=d>„Z!de
j"defd?d@„Z#de
jdefdAdB„Z$d©de
j%dCedefdDdE„Z&de
j'defdFdG„Z(de
j)defdHdI„Z*de
j+defdJdK„Z,de
j-defdLdM„Z.de
j/defdNdO„Z0de
j1defdPdQ„Z2de
j3defdRdS„Z4de
j5defdTdU„Z6de
j7defdVdW„Z8de
j9defdXdY„Z:de
j;defdZd[„Z<de
j=defd\d]„Z>de
j?defd^d_„Z@de
jAdefd`da„ZBde
jCdefdbdc„ZDde
jEdefddde„ZFde
jGdefdfdg„ZHde
jIdefdhdi„ZJde
jKdefdjdk„ZLde
jMdefdldm„ZNde
jOdefdndo„ZPde
jQdefdpdq„ZRde
jSdefdrds„ZTde
jUdefdtdu„ZVde
jWdefdvdw„ZXde
jYdefdxdy„ZZde
j[defdzd{„Z\de
j]defd|d}„Z^de
j_defd~d„Z`de
jadefd€d�„Zbde
jcdefd‚dƒ„Zdde
jedefd„d…„Zfde
jgdefd†d‡„Zhde
jidefdˆd‰„Zjde
jkdefdŠd‹„Zlde
jmdefdŒd�„Znde
jodefdŽd�„Zpde
jae
jeB e
j1B d�edefd‘d’„Zqd“ere
j defd”d•„Zsd“ere
j5 defd–d—„Ztd©de
jd˜edefd™dš„Zude
j%defd›dœ„Zvg d�fde
jdžere
j dŸedefd d¡„Zwde
jd¢exe
jgef defd£d¤„Zyde
jdefd¥d¦„Zzde
jdefd§d¨„Z{dS )ªÚ
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.
    Úindent_levelÚreduce_parenthesesFÚreturnNc                 C   s   d| _ || _dS )zŠConstructs C-code generator

        reduce_parentheses:
            if True, eliminates needless parentheses on binary operators
        r   N)r   r	   )Úselfr	   © r   úˆ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/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"   ó   
zCGenerator._make_indentÚnodec                 C   s   d|j j }t| || jƒ|ƒS )NÚvisit_)Ú	__class__Ú__name__ÚgetattrÚgeneric_visit)r   r   Úmethodr   r   r   Úvisit%   s   zCGenerator.visitc                    s(   |d u rdS d  ‡ fdd„| ¡ D ƒ¡S )NÚ c                 3   s   � | ]
\}}ˆ   |¡V  qd S ©N©r   )Ú.0Úc_nameÚcr   r   r   Ú	<genexpr>-   s   € z+CGenerator.generic_visit.<locals>.<genexpr>)ÚjoinÚchildren)r   r   r   r   r   r   )   s   zCGenerator.generic_visitÚnc                 C   ó   |j S r   )Úvalue©r   r%   r   r   r   Úvisit_Constant/   ó   zCGenerator.visit_Constantc                 C   r&   r   ©Únamer(   r   r   r   Úvisit_ID2   r*   zCGenerator.visit_IDc                 C   s   d}|j r|d|j  7 }|S )Nz#pragmar   )Ústring)r   r%   Úretr   r   r   Úvisit_Pragma5   s   zCGenerator.visit_Pragmac                 C   s$   |   |j¡}|d |  |j¡ d S )Nú[ú])Ú_parenthesize_unless_simpler,   r   Ú	subscript)r   r%   Úarrrefr   r   r   Úvisit_ArrayRef;   s   zCGenerator.visit_ArrayRefc                 C   s"   |   |j¡}||j |  |j¡ S r   )r3   r,   Útyper   Úfield)r   r%   Úsrefr   r   r   Úvisit_StructRef?   s   zCGenerator.visit_StructRefc                 C   s6   |   |j¡}|jd ur|  |j¡nd}|d | d S )Nr   ú(ú))r3   r,   Úargsr   )r   r%   Úfrefr=   r   r   r   Úvisit_FuncCallC   s   zCGenerator.visit_FuncCallc                 C   sz   |j  dkr d|  |j¡› d�S  dkr! |  |j¡}|› d�S dkr/|  |j¡}|› d�S 	 |  |j¡}|j › |› �S )NÚsizeofzsizeof(r<   zp++z++zp--z--)Úopr   Úexprr3   )r   r%   Úoperandr   r   r   Úvisit_UnaryOpH   s   



zCGenerator.visit_UnaryOpz||r   z&&r   ú|é   ú^é   ú&é   z==é   z!=ú>é   z>=ú<z<=z>>é   z<<ú+é   ú-Ú*é	   ú/ú%c                    sF   ˆ  ˆ j‡ ‡fdd„¡}ˆ  ˆ j‡ ‡fdd„¡}|› dˆ j› d|› �S )Nc                    s6   ˆ  | ¡pˆjot| tjƒoˆj| j ˆjˆ j k S r   ©Ú_is_simple_noder	   Ú
isinstancer   ÚBinaryOpÚprecedence_maprA   ©Úd©r%   r   r   r   Ú<lambda>|   ó   

ÿüz+CGenerator.visit_BinaryOp.<locals>.<lambda>c                    s6   ˆ  | ¡pˆjot| tjƒoˆj| j ˆjˆ j k S r   rW   r\   r^   r   r   r_   Œ   r`   r   )Ú_parenthesize_ifÚleftÚrightrA   )r   r%   Úlval_strÚrval_strr   r^   r   Úvisit_BinaryOpp   s   
þþ	zCGenerator.visit_BinaryOpc                 C   s0   |   |jdd„ ¡}|  |j¡› d|j› d|› �S )Nc                 S   s   t | tjƒS r   )rY   r   Ú
Assignment)r%   r   r   r   r_   —   ó    z-CGenerator.visit_Assignment.<locals>.<lambda>r   )ra   Úrvaluer   ÚlvaluerA   )r   r%   re   r   r   r   Úvisit_Assignment•   s   
ÿzCGenerator.visit_Assignmentc                 C   s   d  |j¡S r   )r#   Únamesr(   r   r   r   Úvisit_IdentifierType›   ó   zCGenerator.visit_IdentifierTypec                 C   sn   | t jd˜ r  d|  |¡ d S   t jd˜ r n  t jd˜ r$ n  n
 d|  |¡ d S 	 |  |¡S )Nr   Ú{Ú}r;   r<   )r   ÚInitListr   ÚExprListÚCompoundr(   r   r   r   Ú_visit_exprž   s   ÿ*
zCGenerator._visit_exprÚno_typec                 C   sL   |r|j n|  |¡}|jr|d|  |j¡ 7 }|jr$|d|  |j¡ 7 }|S )Nz : ú = )r,   Ú_generate_declÚbitsizer   Úinitrt   )r   r%   ru   Úsr   r   r   Ú
visit_Decl§   s   zCGenerator.visit_Declc                    sL   ˆ   |jd ¡}t|jƒdkr$|dd ‡ fdd„|jdd … D ƒ¡ 7 }|S )Nr   r   ú, c                 3   s   � | ]
}ˆ j |d d�V  qdS )T)ru   N)r{   ©r   Údeclr   r   r   r"   µ   s   € 
ÿz,CGenerator.visit_DeclList.<locals>.<genexpr>)r   ÚdeclsÚlenr#   ©r   r%   rz   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_typer7   r�   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   )r„   Úto_typer3   rB   r�   r   r   r   Ú
visit_CastÁ   s   zCGenerator.visit_Castc                 C   ó*   g }|j D ]
}| |  |¡¡ qd |¡S ©Nr|   ©ÚexprsÚappendrt   r#   ©r   r%   Úvisited_subexprsrB   r   r   r   Úvisit_ExprListÅ   ó   

zCGenerator.visit_ExprListc                 C   rŠ   r‹   rŒ   r�   r   r   r   Úvisit_InitListË   r’   zCGenerator.visit_InitListc                 C   ó   | j |dd�S )NÚenumr+   ©Ú_generate_struct_union_enumr(   r   r   r   Ú
visit_EnumÑ   ó   zCGenerator.visit_Enumc                 C   s   d  |  |j¡¡S )Nz_Alignas({}))Úformatr   Ú	alignmentr(   r   r   r   Úvisit_AlignasÔ   s   zCGenerator.visit_Alignasc                 C   s8   |j sdj|  ¡ |jd�S dj|  ¡ |j|  |j ¡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                    sf   ˆ   |j¡}dˆ _ˆ   |j¡}|jr+d ‡ fdd„|jD ƒ¡}|d | d | d S |d | d S )Nr   ú;
c                 3   ó   � | ]}ˆ   |¡V  qd S r   r   )r   Úpr   r   r   r"   é   ó   € z+CGenerator.visit_FuncDef.<locals>.<genexpr>Ú
)r   r~   r   ÚbodyÚparam_declsr#   )r   r%   r~   r¤   Úknrdeclsr   r   r   Úvisit_FuncDefä   s   zCGenerator.visit_FuncDefc                 C   sn   d}|j D ]/}| tjd˜ r  ||  |¡7 }n tjd˜ r) ||  |¡d 7 }n 	 ||  |¡d 7 }q|S )Nr   r   r£   rŸ   )Úextr   ÚFuncDefr   ÚPragma)r   r%   rz   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ú{
rF   r   c                 3   r    r   ©Ú_generate_stmt)r   Ústmtr   r   r   r"   þ   r¢   z,CGenerator.visit_Compound.<locals>.<genexpr>z}
)r   r   Úblock_itemsr#   r�   r   r   r   Úvisit_Compoundú   s   zCGenerator.visit_Compoundc                 C   s$   d|   |j¡ d |   |j¡ d S )Nr;   z){rp   )r   r7   ry   r(   r   r   r   Úvisit_CompoundLiteral  s   $z CGenerator.visit_CompoundLiteralc                 C   ó   dS )Nú;r   r(   r   r   r   Úvisit_EmptyStatement  ó   zCGenerator.visit_EmptyStatementc                    s   d  ‡ fdd„|jD ƒ¡S )Nr|   c                 3   r    r   r   )r   Úparamr   r   r   r"   
  r¢   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 )Nr
   r   r´   )rB   r   r�   r   r   r   Úvisit_Return  s   zCGenerator.visit_Returnc                 C   r³   )Nzbreak;r   r(   r   r   r   Úvisit_Break  r¶   zCGenerator.visit_Breakc                 C   r³   )Nz	continue;r   r(   r   r   r   Úvisit_Continue  r¶   zCGenerator.visit_Continuec                 C   sH   d|   |j¡ d }|d|   |j¡ d 7 }|d|   |j¡ d 7 }|S )Nr;   z) ? z) : r<   )rt   ÚcondÚiftrueÚiffalser�   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r0||  ¡ d 7 }|| j|jdd�7 }|S )Nzif (ú)
T©Ú
add_indentzelse
)r½   r   r®   r¾   r¿   r   r�   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Â   )ry   r   r½   Únextr®   r¯   r�   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¯   r�   r   r   r   Úvisit_While7  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   r�   r   r   r   Úvisit_DoWhile?  s   zCGenerator.visit_DoWhilec                 C   s>   d}||   |j¡7 }|jr|d7 }||   |j¡7 }|d7 }|S )Nz_Static_assert(ú,r<   )r   r½   Úmessager�   r   r   r   Úvisit_StaticAssertH  s   zCGenerator.visit_StaticAssertc                 C   s,   d|   |j¡ d }|| j|jdd�7 }|S )Nzswitch (rÁ   TrÂ   )r   r½   r®   r¯   r�   r   r   r   Úvisit_SwitchQ  s   zCGenerator.visit_Switchc                 C   s6   d|   |j¡ d }|jD ]}|| j|dd�7 }q|S )Nzcase ú:
TrÂ   )r   rB   Ústmtsr®   ©r   r%   rz   r¯   r   r   r   Ú
visit_CaseV  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_Default\  s   
zCGenerator.visit_Defaultc                 C   s   |j d |  |j¡ S )NrÎ   )r,   r®   r¯   r(   r   r   r   Úvisit_Labelb  s   zCGenerator.visit_Labelc                 C   s   d|j  d S )Nzgoto r´   r+   r(   r   r   r   Ú
visit_Gotoe  r™   zCGenerator.visit_Gotoc                 C   r³   )Nz...r   r(   r   r   r   Úvisit_EllipsisParamh  r¶   zCGenerator.visit_EllipsisParamc                 C   ó   |   |d¡S )NÚstructr–   r(   r   r   r   Úvisit_Structk  rn   zCGenerator.visit_Structc                 C   s   |   |j¡S r   )r„   r7   r(   r   r   r   Úvisit_Typenamen  rn   zCGenerator.visit_Typenamec                 C   rÖ   )NÚunionr–   r(   r   r   r   Úvisit_Unionq  rn   zCGenerator.visit_Unionc                 C   sZ   d}|j D ]}t|tjƒr|d|j  7 }q|d|  |¡ d 7 }q|d|  |j¡ 7 }|S )Nr   Ú.r1   r2   rv   )r,   rY   r   ÚIDr   rt   rB   )r   r%   rz   r,   r   r   r   Úvisit_NamedInitializert  s   
z!CGenerator.visit_NamedInitializerc                 C   s
   |   |¡S r   ©r„   r(   r   r   r   Úvisit_FuncDecl~  r   zCGenerator.visit_FuncDeclc                 C   r”   ©NFr†   rß   r(   r   r   r   Úvisit_ArrayDecl�  r™   zCGenerator.visit_ArrayDeclc                 C   r”   rá   rß   r(   r   r   r   Úvisit_TypeDecl„  r™   zCGenerator.visit_TypeDeclc                 C   r”   rá   rß   r(   r   r   r   Úvisit_PtrDecl‡  r™   zCGenerator.visit_PtrDeclr,   c                 C   sÖ   |dv rt |tjtjfƒsJ ‚|j}| j}n|dksJ ‚t |tjƒs$J ‚|jdu r+dn|jj}| j	}|d |j
p9d }|duri|d7 }||  ¡ 7 }|  jd7  _|d7 }|||ƒ7 }|  jd8  _||  ¡ d	 7 }|S )
zlGenerates code for structs, unions, and enums. name should be
        'struct', 'union', or 'enum'.
        )r×   rÚ   r•   Nr   r   r£   rF   r¬   rp   )rY   r   ÚStructÚUnionr   Ú_generate_struct_union_bodyÚEnumÚvaluesÚenumeratorsÚ_generate_enum_bodyr,   r   r   )r   r%   r,   ÚmembersÚbody_functionrz   r   r   r   r—   Š  s$   z&CGenerator._generate_struct_union_enumrì   c                    s   d  ‡ fdd„|D ƒ¡S )Nr   c                 3   r    r   r­   r}   r   r   r   r"   §  r¢   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   r    r   r   )r   r'   r   r   r   r"   «  r¢   z1CGenerator._generate_enum_body.<locals>.<genexpr>éþÿÿÿr£   rî   rï   r   r   r   rë   ©  s   $zCGenerator._generate_enum_bodyrÃ   c                 C   s€  |r	|  j d7  _ |  ¡ }|r|  j d8  _ |  tjd˜ r  no  tjd˜ r) nf  tjd˜ r2 n]  tjd˜ r; nT  tjd˜ rD nK  tjd˜ rM nB  tj	d˜ rV n9  tj
d˜ r_ n0  tjd˜ rh n'  tjd˜ rq n  tjd˜ rz n  tjd˜ rƒ n  tjd˜ rŒ n  n  ||  |¡ d S  tjd˜ r§  |  |¡S  tjd˜ rµ ||  |¡ 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.
        rF   r   rŸ   r£   )r   r   r   ÚDeclrg   ÚCastÚUnaryOprZ   Ú	TernaryOpÚFuncCallÚArrayRefÚ	StructRefÚConstantrÝ   ÚTypedefrr   r   rs   ÚIf)r   r%   rÃ   r�   r   r   r   r®   ­  s8   
ûÿzCGenerator._generate_stmtc                 C   sf   d}|j rd |j ¡d }|jr|d |j¡d 7 }|jr)||  |jd ¡d 7 }||  |j¡7 }|S )zGeneration from a Decl node.r   r   r   )Úfuncspecr#   rƒ   Úalignr   r„   r7   r�   r   r   r   rw   ×  s   zCGenerator._generate_declTÚ	modifiersr‡   c                 C   sz  | t jd˜ r×  d}|jr|d |j¡d 7 }||  |j¡7 }|jr(|r(|jnd}t|ƒD ]ž\}}| t jd˜ rr  |dkrOt	||d  t j
ƒrOd| d }|d7 }|jr`|d |j¡d 7 }|jd	urm||  |j¡7 }|d
7 }nZ  t jd˜ r¥  |dkr�t	||d  t j
ƒr�d| d }|jd	urš|  |j¡nd}|d| d 7 }n' t j
d˜ rË |jrÆd |j¡}	|r¼d|› �nd}
d|	› |
› �}nd| }n q.|rÕ|d| 7 }|S   t jd˜ ræ  |  |j¡S   t jd˜ r÷  | j|j|d�S   t jd˜ �r	  d |j¡d S   t jd˜ �r n  t j
d˜ �r n  t jd˜ �r' n  n | j|j||g |d�S 	 |  |¡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<   r1   Nr2   z* rS   r†   )r   ÚTypeDeclÚqualsr#   r   r7   ÚdeclnameÚ	enumerateÚ	ArrayDeclrY   ÚPtrDeclÚ	dim_qualsÚdimÚFuncDeclr=   rñ   rw   ÚTypenamer„   ÚIdentifierTyperl   )r   r%   rý   r‡   rz   ÚnstrÚiÚmodifierr=   rÿ   Úsuffixr   r   r   r„   ã  sn   

ø	
ÿýø	
ú€Ø)ÿÿÿBÿ
zCGenerator._generate_typeÚ	conditionc                 C   s"   |   |¡}||ƒrd| d S |S )zŒVisits 'n' and returns its string representation, parenthesized
        if the condition function applied to the node returns True.
        r;   r<   )rt   )r   r%   r  rz   r   r   r   ra   &  s   
zCGenerator._parenthesize_ifc                    s   ˆ   |‡ fdd„¡S )z$Common use case for _parenthesize_ifc                    s   ˆ   | ¡ S r   )rX   r\   r   r   r   r_   4  rh   z8CGenerator._parenthesize_unless_simple.<locals>.<lambda>)ra   r(   r   r   r   r3   2  s   z&CGenerator._parenthesize_unless_simplec                 C   s   t |tjtjtjtjtjfƒS )zyReturns True for nodes that are "simple" - i.e. nodes that always
        have higher precedence than operators.
        )rY   r   rø   rÝ   rö   r÷   rõ   r(   r   r   r   rX   6  s   þzCGenerator._is_simple_node)F)|r   Ú
__module__Ú__qualname__Ú__doc__ÚintÚ__annotations__Úboolr   Ústrr   r   ÚNoder   r   r   rø   r)   rÝ   r-   rª   r0   rö   r6   r÷   r:   rõ   r?   ró   rD   r[   rZ   rf   rg   rk   r  rm   rt   rñ   r{   ÚDeclListr‚   rù   r…   rò   r‰   rr   r‘   rq   r“   rè   r˜   ÚAlignasrœ   Ú
Enumeratorrž   r©   r§   ÚFileASTr«   rs   r±   ÚCompoundLiteralr²   ÚEmptyStatementrµ   Ú	ParamListr¹   ÚReturnrº   ÚBreakr»   ÚContinuer¼   rô   rÀ   rú   rÄ   ÚForrÆ   ÚWhilerÈ   ÚDoWhilerÉ   ÚStaticAssertrÌ   ÚSwitchrÍ   ÚCaserÑ   ÚDefaultrÒ   ÚLabelrÓ   ÚGotorÔ   ÚEllipsisParamrÕ   rå   rØ   r  rÙ   ræ   rÛ   ÚNamedInitializerrÞ   r  rà   r  râ   rþ   rã   r  rä   r—   r   rç   rë   r®   rw   r„   r   ra   r3   rX   r   r   r   r   r      sú   
 ýüûúùø	÷
öõôóòñðïîíì%	
			
ÿÿ
þ*üþýü
ûCÿÿ
þr   N)Útypingr   r   r   r   r   r   r   r   r   r   Ú<module>   s   