o
    'viP                     @   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< dd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$dd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ddZbde
jcdefddZdde
jedefddZfde
jgdefddZhde
jidefddZjde
jkdefddZlde
jmdefddZnde
jodefddZpde
jae
jeB e
j1B dedefddZqdere
j defddZsdere
j5 defddZtdde
jdedefddZude
j%defddZvg dfde
jdere
j dedefddZwde
jdexe
jgef defddZyde
jdefddZzde
jdefddZ{dS )
CGeneratorzUses 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 )zConstructs C-code generator

        reduce_parentheses:
            if True, eliminates needless parentheses on binary operators
        r   N)r   r	   )selfr	    r   T/home/air/biblejyuku/back/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 )zGeneration 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rt	||d  t j
rd| d }|jd	ur| |jnd}|d| d 7 }n' t j
d r |jrd|j}	|rd| 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 )zRecursive 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 )zVisits '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   