o
    Èó·iµ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   ú[C:\Users\psant\Downloads\PAF backend\school\venv\Lib\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   )Ú.0Z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   Z	subscript)r   r$   Zarrrefr   r   r   Úvisit_ArrayRef;   s   zCGenerator.visit_ArrayRefc                 C   s"   |   |j¡}||j |  |j¡ S r   )r2   r+   Útyper   Úfield)r   r$   Zsrefr   r   r   Úvisit_StructRef?   s   zCGenerator.visit_StructRefc                 C   s6   |   |j¡}|jd ur|  |j¡nd}|d | d S )Nr   ú(ú))r2   r+   Úargsr   )r   r$   Zfrefr9   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(r8   zp++z++zp--z--)Úopr   Úexprr2   )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_mapr<   ©Ú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   rR   rW   rY   r   r   rZ   Œ   r[   r   )Ú_parenthesize_ifÚleftÚrightr<   )r   r$   Zlval_strÚrval_strr   rY   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   )rT   r   Ú
Assignment)r$   r   r   r   rZ   —   ó    z-CGenerator.visit_Assignment.<locals>.<lambda>r   )r\   Zrvaluer   Zlvaluer<   )r   r$   r_   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   Ú{Ú}r7   r8   )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_declZbitsizer   Úinitrl   )r   r$   rm   Ú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)rm   N)rr   ©r   Údeclr   r   r   r!   µ   s   € 
ÿz,CGenerator.visit_DeclList.<locals>.<genexpr>)r   ÚdeclsÚlenr"   ©r   r$   rq   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_typer4   rx   r   r   r   Úvisit_Typedefº   s
   zCGenerator.visit_Typedefc                 C   s,   d| j |jdd� d }|d |  |j¡ S )Nr7   F©Úemit_declnamer8   r   )r{   Zto_typer2   r=   rx   r   r   r   Ú
visit_CastÁ   s   zCGenerator.visit_Castc                 C   ó*   g }|j D ]
}| |  |¡¡ qd |¡S ©Nrs   ©ÚexprsÚappendrl   r"   ©r   r$   Zvisited_subexprsr=   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   ru   r   ÚbodyZparam_declsr"   )r   r$   ru   r™   Zknrdeclsr   r   r   Úvisit_FuncDefä   s   zCGenerator.visit_FuncDefc                 C   sn   d}|j D ]/}| tjd˜ r  ||  |¡7 }q tjd˜ r) ||  |¡d 7 }q 	 ||  |¡d 7 }q|S )Nr   r   r˜   r”   )Úextr   ÚFuncDefr   ÚPragma)r   r$   rq   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ú{
rA   r   c                 3   r•   r   ©Ú_generate_stmt)r   Ústmtr   r   r   r!   þ   r—   z,CGenerator.visit_Compound.<locals>.<genexpr>z}
)r   r   Zblock_itemsr"   rx   r   r   r   Úvisit_Compoundú   s   zCGenerator.visit_Compoundc                 C   s$   d|   |j¡ d |   |j¡ d S )Nr7   z){rh   )r   r4   rp   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 )Nrs   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¦   )r=   r   rx   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 )Nr7   z) ? z) : r8   )rl   ÚcondÚiftrueÚiffalserx   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   rx   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´   )rp   r   r¯   Únextr¡   r¢   rx   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¢   rx   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   rx   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(ú,r8   )r   r¯   Úmessagerx   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¢   rx   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   r=   Ústmtsr¡   ©r   r$   rq   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  rf   zCGenerator.visit_Structc                 C   s   |   |j¡S r   )r{   r4   r'   r   r   r   Úvisit_Typenamen  rf   zCGenerator.visit_Typenamec                 C   rÈ   )NÚunionr‹   r'   r   r   r   Úvisit_Unionq  rf   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   Ú.r0   r1   rn   )r+   rT   r   ÚIDr   rl   r=   )r   r$   rq   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˜   rA   rŸ   rh   )rT   r   ÚStructÚUnionrv   Ú_generate_struct_union_bodyÚEnumÚvaluesZenumeratorsÚ_generate_enum_bodyr+   r   r   )r   r$   r+   ÚmembersZbody_functionrq   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    rt   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.
        rA   r   r”   r˜   N)r   r   r   ÚDeclra   ÚCastÚUnaryOprU   Ú	TernaryOpÚFuncCallÚArrayRefÚ	StructRefÚConstantrÏ   ÚTypedefrj   r   rk   Ú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   N)Zfuncspecr"   rz   Zalignr   r{   r4   rx   r   r   r   ro   ×  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 }q.  t jd˜ r¥  |dkr�t	||d  t j
ƒr�d| d }|jd	urš|  |j¡nd}|d| d 7 }q. t j
d˜ rË |jrÆd |j¡}	|r¼d|› �nd}
d|	› |
› �}q.d| }q. 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   r7   r8   r0   Nr1   z* rN   r}   )r   ÚTypeDeclÚqualsr"   r   r4   ZdeclnameÚ	enumerateÚ	ArrayDeclrT   ÚPtrDeclZ	dim_qualsZdimÚFuncDeclr9   rá   ro   ÚTypenamer{   ÚIdentifierTyperd   )r   r$   rë   r~   rq   ZnstrÚiÚmodifierr9   rí   Úsuffixr   r   r   r{   ã  sl   

ø	ÿýø	úØ)ÿÿÿ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.
        r7   r8   N)rl   )r   r$   r÷   rq   r   r   r   r\   &  s   
zCGenerator._parenthesize_ifc                    s   ˆ   |‡ fdd„¡S )z$Common use case for _parenthesize_ifc                    s   ˆ   | ¡ S r   )rS   rW   r   r   r   rZ   4  rb   z8CGenerator._parenthesize_unless_simple.<locals>.<lambda>N)r\   r'   r   r   r   r2   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.
        N)rT   r   rè   rÏ   ræ   rç   rå   r'   r   r   r   rS   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�   r/   ræ   r3   rç   r6   rå   r:   rã   r?   rV   rU   r`   ra   rc   ró   re   rl   rá   rr   ZDeclListry   ré   r|   râ   r   rj   r†   ri   rˆ   rÚ   r�   ZAlignasr‘   Z
Enumeratorr“   rœ   rš   ZFileASTrž   rk   r£   ZCompoundLiteralr¤   ZEmptyStatementr§   Z	ParamListr«   ÚReturnr¬   ÚBreakr­   ÚContinuer®   rä   r²   rê   r¶   ÚForr¸   ÚWhilerº   ZDoWhiler»   ZStaticAssertr¾   ZSwitchr¿   ZCaserÃ   ZDefaultrÄ   ZLabelrÅ   ZGotorÆ   ZEllipsisParamrÇ   r×   rÊ   rò   rË   rØ   rÍ   ZNamedInitializerrÐ   rñ   rÒ   rï   rÔ   rì   rÕ   rð   rÖ   rŒ   r   rÙ   rÜ   r¡   ro   r{   r   r\   r2   rS   r   r   r   r   r      sú   
 ýüûúùø	÷
öõôóòñðïîíì%	
			
ÿÿ
þ*üþýü
ûCÿÿ
þr   N)Útypingr   r   r   r   r   r   r   r   r   r   Ú<module>   s   