1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
U
L±dlEã@s ddlmZGdd„deƒZdS)é)Úc_astc@s6eZdZdZdŒdd„Zdd„Zdd„Zd    d
„Zd d „Zd d„Z    dd„Z
dd„Z dd„Z dd„Z dd„Zdddddddddddd d d!d!d"d"d"d#œZd$d%„Zd&d'„Zd(d)„Zd*d+„Zdd,d-„Zd.d/„Zd0d1„Zd2d3„Zd4d5„Zd6d7„Zd8d9„Zd:d;„Zd<d=„Zd>d?„Zd@dA„ZdBdC„ZdDdE„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<dŽd~d„Z=d€d„Z>gd‚fdƒd„„Z?d…d†„Z@d‡dˆ„ZAd‰dŠ„ZBd‹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.
    FcCsd|_||_dS)z“ Constructs C-code generator
 
            reduce_parentheses:
                if True, eliminates needless parentheses on binary operators
        éN)Ú indent_levelÚreduce_parentheses)Úselfr©rúLd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\pycparser/c_generator.pyÚ__init__szCGenerator.__init__cCs
d|jS©Nú )r©rrrr    Ú _make_indentszCGenerator._make_indentcCsd|jj}t|||jƒ|ƒS)NZvisit_)Ú    __class__Ú__name__ÚgetattrÚ generic_visit)rÚnodeÚmethodrrr    Úvisits zCGenerator.visitcs,|dkr dSd ‡fdd„| ¡Dƒ¡SdS)NÚc3s|]\}}ˆ |¡VqdS©N©r)Ú.0Zc_nameÚcr rr    Ú    <genexpr>'sz+CGenerator.generic_visit.<locals>.<genexpr>)ÚjoinÚchildren)rrrr r    r#szCGenerator.generic_visitcCs|jSr)Úvalue©rÚnrrr    Úvisit_Constant)szCGenerator.visit_ConstantcCs|jSr©Únamerrrr    Úvisit_ID,szCGenerator.visit_IDcCsd}|jr|d|j7}|S)Nz#pragmar )Ústring)rr Úretrrr    Ú visit_Pragma/szCGenerator.visit_PragmacCs$| |j¡}|d| |j¡dS)Nú[ú])Ú_parenthesize_unless_simpler#rZ    subscript)rr Zarrrefrrr    Úvisit_ArrayRef5s zCGenerator.visit_ArrayRefcCs"| |j¡}||j| |j¡Sr)r*r#ÚtyperÚfield)rr Zsrefrrr    Úvisit_StructRef9s zCGenerator.visit_StructRefcCs$| |j¡}|d| |j¡dS)Nú(ú))r*r#rÚargs)rr Zfrefrrr    Úvisit_FuncCall=s zCGenerator.visit_FuncCallcCs\|jdkrd| |j¡S| |j¡}|jdkr8d|S|jdkrJd|Sd|j|fSdS)NÚsizeofz
sizeof(%s)zp++z%s++zp--z%s--z%s%s)ÚoprÚexprr*)rr Zoperandrrr    Ú visit_UnaryOpAs
 
 
zCGenerator.visit_UnaryOprréééééééé    )z||z&&ú|ú^ú&z==z!=ú>z>=ú<z<=z>>z<<ú+ú-Ú*ú/ú%cs@ˆ ˆj‡‡fdd„¡}ˆ ˆj‡‡fdd„¡}d|ˆj|fS)Ncs6ˆ |¡p2ˆjo2t|tjƒo2ˆj|jˆjˆjk Sr©Ú_is_simple_noderÚ
isinstancerÚBinaryOpÚprecedence_mapr4©Úd©r rrr    Ú<lambda>ks
þz+CGenerator.visit_BinaryOp.<locals>.<lambda>cs6ˆ |¡p2ˆjo2t|tjƒo2ˆj|jˆjˆjk SrrIrNrPrr    rQws
þú%s %s %s)Ú_parenthesize_ifÚleftÚrightr4)rr Zlval_strÚrval_strrrPr    Úvisit_BinaryOp_s
 þ  þzCGenerator.visit_BinaryOpcCs*| |jdd„¡}d| |j¡|j|fS)NcSs t|tjƒSr)rKrÚ
Assignment)r rrr    rQóz-CGenerator.visit_Assignment.<locals>.<lambda>rR)rSZrvaluerZlvaluer4)rr rVrrr    Úvisit_Assignment|s
þzCGenerator.visit_AssignmentcCs d |j¡Sr )rÚnamesrrrr    Úvisit_IdentifierType‚szCGenerator.visit_IdentifierTypecCsJt|tjƒrd| |¡dSt|tjƒr<d| |¡dS| |¡SdS)NÚ{Ú}r/r0)rKrZInitListrÚExprListrrrr    Ú _visit_expr…s
  zCGenerator._visit_exprcCsL|r
|jn| |¡}|jr.|d| |j¡7}|jrH|d| |j¡7}|S)Nz : ú = )r#Ú_generate_declZbitsizerÚinitr`)rr Úno_typeÚsrrr    Ú
visit_Decls zCGenerator.visit_DeclcsLˆ |jd¡}t|jƒdkrH|dd ‡fdd„|jdd…Dƒ¡7}|S)Nrrú, c3s|]}ˆj|ddVqdS)T)rdN)rf©rÚdeclr rr    ršsÿz,CGenerator.visit_DeclList.<locals>.<genexpr>)rÚdeclsÚlenr©rr rerr r    Úvisit_DeclList—s  ÿ zCGenerator.visit_DeclListcCs2d}|jr|d |j¡d7}|| |j¡7}|S)Nrr )ÚstoragerÚ_generate_typer,rlrrr    Ú visit_Typedefžs
zCGenerator.visit_TypedefcCs,d|j|jddd}|d| |j¡S)Nr/F©Ú emit_declnamer0r )roZto_typer*r5rlrrr    Ú
visit_Cast¤szCGenerator.visit_CastcCs*g}|jD]}| | |¡¡q
d |¡S©Nrg©ÚexprsÚappendr`r©rr Zvisited_subexprsr5rrr    Úvisit_ExprList¨s
zCGenerator.visit_ExprListcCs*g}|jD]}| | |¡¡q
d |¡Srtrurxrrr    Úvisit_InitList®s
zCGenerator.visit_InitListcCs|j|ddS)NÚenumr"©Ú_generate_struct_union_enumrrrr    Ú
visit_Enum´szCGenerator.visit_EnumcCsd | |j¡¡S)Nz _Alignas({}))ÚformatrÚ    alignmentrrrr    Ú visit_Alignas·szCGenerator.visit_AlignascCs<|jsdj| ¡|jdSdj| ¡|j| |j¡dSdS)Nz{indent}{name},
)Úindentr#z{indent}{name} = {value},
)r‚r#r)rrrr#rrrrr    Úvisit_Enumeratorºsþ
ýzCGenerator.visit_Enumeratorcsjˆ |j¡}dˆ_ˆ |j¡}|jrVd ‡fdd„|jDƒ¡}|d|d|dS|d|dSdS)Nrú;
c3s|]}ˆ |¡VqdSrr)rÚpr rr    rÌsz+CGenerator.visit_FuncDef.<locals>.<genexpr>Ú
)rrirÚbodyZ param_declsr)rr rir‡Zknrdeclsrr r    Ú visit_FuncDefÇs  zCGenerator.visit_FuncDefcCsbd}|jD]R}t|tjƒr*|| |¡7}q
t|tjƒrJ|| |¡d7}q
|| |¡d7}q
|S)Nrr†r„)ÚextrKrZFuncDefrZPragma)rr rer‰rrr    Ú visit_FileASTÑs
  zCGenerator.visit_FileASTcs`ˆ ¡d}ˆjd7_|jr>|d ‡fdd„|jDƒ¡7}ˆjd8_|ˆ ¡d7}|S)Nú{
r7rc3s|]}ˆ |¡VqdSr©Ú_generate_stmt)rÚstmtr rr    ràsz,CGenerator.visit_Compound.<locals>.<genexpr>z}
)rrZ block_itemsrrlrr r    Úvisit_CompoundÜs zCGenerator.visit_CompoundcCs$d| |j¡d| |j¡dS)Nr/z){r^)rr,rcrrrr    Úvisit_CompoundLiteralåsz CGenerator.visit_CompoundLiteralcCsdS)Nú;rrrrr    Úvisit_EmptyStatementészCGenerator.visit_EmptyStatementcsd ‡fdd„|jDƒ¡S)Nrgc3s|]}ˆ |¡VqdSrr)rÚparamr rr    rísz-CGenerator.visit_ParamList.<locals>.<genexpr>)rÚparamsrrr r    Úvisit_ParamListìszCGenerator.visit_ParamListcCs&d}|jr|d| |j¡7}|dS)NÚreturnr r‘)r5rrlrrr    Ú visit_ReturnïszCGenerator.visit_ReturncCsdS)Nzbreak;rrrrr    Ú visit_BreakôszCGenerator.visit_BreakcCsdS)Nz    continue;rrrrr    Úvisit_Continue÷szCGenerator.visit_ContinuecCsHd| |j¡d}|d| |j¡d7}|d| |j¡d7}|S)Nr/z) ? z) : r0)r`ÚcondÚiftrueÚiffalserlrrr    Úvisit_TernaryOpúszCGenerator.visit_TernaryOpcCsdd}|jr|| |j¡7}|d7}||j|jdd7}|jr`|| ¡d7}||j|jdd7}|S)Nzif (ú)
T©Ú
add_indentzelse
)ršrrr›rœrrlrrr    Úvisit_IfszCGenerator.visit_IfcCs~d}|jr|| |j¡7}|d7}|jr<|d| |j¡7}|d7}|jr^|d| |j¡7}|d7}||j|jdd7}|S)Nzfor (r‘r ržTrŸ)rcrršÚnextrrŽrlrrr    Ú    visit_For
szCGenerator.visit_ForcCs:d}|jr|| |j¡7}|d7}||j|jdd7}|S)Núwhile (ržTrŸ)ršrrrŽrlrrr    Ú visit_Whiles zCGenerator.visit_WhilecCsJd}||j|jdd7}|| ¡d7}|jr>|| |j¡7}|d7}|S)Nzdo
TrŸr¤z);)rrŽrršrrlrrr    Ú visit_DoWhileszCGenerator.visit_DoWhilecCs>d}|| |j¡7}|jr2|d7}|| |j¡7}|d7}|S)Nz_Static_assert(ú,r0)rršÚmessagerlrrr    Úvisit_StaticAssert$szCGenerator.visit_StaticAssertcCs,d| |j¡d}||j|jdd7}|S)Nzswitch (ržTrŸ)rršrrŽrlrrr    Ú visit_Switch-szCGenerator.visit_SwitchcCs6d| |j¡d}|jD]}||j|dd7}q|S)Nzcase ú:
TrŸ)rr5Ústmtsr©rr rerŽrrr    Ú
visit_Case2s
zCGenerator.visit_CasecCs&d}|jD]}||j|dd7}q
|S)Nz    default:
TrŸ)r¬rr­rrr    Ú visit_Default8s
zCGenerator.visit_DefaultcCs|jd| |j¡S)Nr«)r#rrŽrrrr    Ú visit_Label>szCGenerator.visit_LabelcCsd|jdS)Nzgoto r‘r"rrrr    Ú
visit_GotoAszCGenerator.visit_GotocCsdS)Nz...rrrrr    Úvisit_EllipsisParamDszCGenerator.visit_EllipsisParamcCs | |d¡S)NÚstructr|rrrr    Ú visit_StructGszCGenerator.visit_StructcCs | |j¡Sr)ror,rrrr    Úvisit_TypenameJszCGenerator.visit_TypenamecCs | |d¡S)NÚunionr|rrrr    Ú visit_UnionMszCGenerator.visit_UnioncCsZd}|jD]6}t|tjƒr*|d|j7}q
|d| |¡d7}q
|d| |j¡7}|S)NrÚ.r(r)ra)r#rKrÚIDrr`r5)rr rer#rrr    Úvisit_NamedInitializerPs
 z!CGenerator.visit_NamedInitializercCs
| |¡Sr©rorrrr    Úvisit_FuncDeclZszCGenerator.visit_FuncDeclcCs|j|ddS©NFrqr»rrrr    Úvisit_ArrayDecl]szCGenerator.visit_ArrayDeclcCs|j|ddSr½r»rrrr    Úvisit_TypeDecl`szCGenerator.visit_TypeDeclcCs|j|ddSr½r»rrrr    Ú visit_PtrDeclcszCGenerator.visit_PtrDeclcCs°|dkr|j}|j}n(|dks"t‚|jdkr0dn|jj}|j}|d|jpLd}|dk    r¬|d7}|| ¡7}|jd7_|d7}|||ƒ7}|jd8_|| ¡d    7}|S)
zq Generates code for structs, unions, and enums. name should be
            'struct', 'union', or 'enum'.
        )r³r¶r{Nr rr†r7r‹r^)    rjÚ_generate_struct_union_bodyÚAssertionErrorÚvaluesZ enumeratorsÚ_generate_enum_bodyr#rr)rr r#ÚmembersZ body_functionrerrr    r}fs    z&CGenerator._generate_struct_union_enumcsd ‡fdd„|Dƒ¡S)Nrc3s|]}ˆ |¡VqdSrrŒrhr rr    rsz9CGenerator._generate_struct_union_body.<locals>.<genexpr>©r©rrÅrr r    rÁ~sz&CGenerator._generate_struct_union_bodycs$d ‡fdd„|Dƒ¡dd…dS)Nrc3s|]}ˆ |¡VqdSrr)rrr rr    rƒsz1CGenerator._generate_enum_body.<locals>.<genexpr>éþÿÿÿr†rÆrÇrr r    rāszCGenerator._generate_enum_bodycCsÈt|ƒ}|r|jd7_| ¡}|r4|jd8_|tjtjtjtjtjtj    tj
tj tj tj tjtjtjf kr‚|| |¡dS|tjfkr˜| |¡S|tjfkr²|| |¡S|| |¡dSdS)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.
        r7r„r†N)r,rrrÚDeclrXZCastZUnaryOprLZ    TernaryOpÚFuncCallÚArrayRefÚ    StructRefÚConstantr¹ZTypedefr_rZCompoundZIf)rr r Útypr‚rrr    r…s6ü 
 zCGenerator._generate_stmtcCsfd}|jrd |j¡d}|jr4|d |j¡d7}|jrR|| |jd¡d7}|| |j¡7}|S)z& Generation from a Decl node.
        rr r)ZfuncspecrrnZalignrror,rlrrr    rb£szCGenerator._generate_declTc    Cs t|ƒ}|tjkr€d}|jr2|d |j¡d7}|| |j¡7}|jrR|rR|jnd}t|ƒD]\}}t|tj    ƒrÔ|dkrœt||dtj
ƒrœd|d}|d7}|j r¾|d |j ¡d7}|| |j ¡d7}q^t|tj ƒr(|dkrt||dtj
ƒrd|d}|d| |j¡d7}q^t|tj
ƒr^|jr`d    d |j¡|rVd|ndf}q^d
|}q^|r||d|7}|S|tjkr˜| |j¡S|tjkr´|j|j|d S|tjkrÐd |j¡dS|tj    tj
tj fkrþ|j|j||g|d S| |¡Sd 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.
        rr rrr/r0r(r)z* %s%srFrqN)r,rZTypeDeclZqualsrrZdeclnameÚ    enumeraterKZ    ArrayDeclZPtrDeclZ    dim_qualsZdimZFuncDeclr1rÉrbZTypenameroZIdentifierTyper[)    rr Ú    modifiersrrrÎreZnstrÚiÚmodifierrrr    ro­sV  ÿ 
ÿ   ÿ
     ÿzCGenerator._generate_typecCs&| |¡}||ƒrd|dS|SdS)z‘ Visits 'n' and returns its string representation, parenthesized
            if the condition function applied to the node returns True.
        r/r0N)r`)rr Ú    conditionrerrr    rSâs
 zCGenerator._parenthesize_ifcsˆ |‡fdd„¡S)z. Common use case for _parenthesize_if
        cs ˆ |¡ Sr)rJrNr rr    rQïrYz8CGenerator._parenthesize_unless_simple.<locals>.<lambda>)rSrrr r    r*ìsz&CGenerator._parenthesize_unless_simplecCst|tjtjtjtjtjfƒS)z~ Returns True for nodes that are "simple" - i.e. nodes that always
            have higher precedence than operators.
        )rKrrÍr¹rËrÌrÊrrrr    rJñsÿzCGenerator._is_simple_nodeN)F)F)F)CrÚ
__module__Ú __qualname__Ú__doc__r
rrrr!r$r'r+r.r2r6rMrWrZr\r`rfrmrprsryrzr~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}rÁrÄrrbrorSr*rJrrrr    r s¤
ô
 
 
     
     
 
 
5
rN)rrÚobjectrrrrr    Ú<module>    s