K i~E&ddlmZGddeZy))c_astceZdZdZd^dZdZdZdZdZdZ dZ d Z d Z d Z d Zid ddddddddddddddddddddddd d!d d"d#d$d#d%d&d'd&d(d&iZd)Zd*Zd+Zd,Zd^d-Zd.Zd/Zd0Zd1Zd2Zd3Zd4Zd5Zd6Zd7Zd8Zd9Z d:Z!d;Z"d<Z#d=Z$d>Z%d?Z&d@Z'dAZ(dBZ)dCZ*dDZ+dEZ,dFZ-dGZ.dHZ/dIZ0dJZ1dKZ2dLZ3dMZ4dNZ5dOZ6dPZ7dQZ8dRZ9dSZ:dTZ;dUZgdXfdYZ?dZZ@d[ZAd\ZBy])_ 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 d|_||_y)z Constructs C-code generator reduce_parentheses: if True, eliminates needless parentheses on binary operators N) indent_levelreduce_parentheses)selfr s [/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/pycparser/c_generator.py__init__zCGenerator.__init__s"4c d|jzSN )r)r s r _make_indentzCGenerator._make_indentsT&&&&r cnd|jjz}t|||j|S)Nvisit_) __class____name__getattr generic_visit)r nodemethods r visitzCGenerator.visits2DNN3338wtVT%7%78>>r cZ|ydjfd|jDS)Nc3FK|]\}}j|ywNr).0c_namecr s r z+CGenerator.generic_visit..'sJYVQ4::a=Js!)joinchildren)r rs` r rzCGenerator.generic_visit#s& <77J$--/JJ Jr c|jSr)valuer ns r visit_ConstantzCGenerator.visit_Constant)s wwr c|jSrnamer(s r visit_IDzCGenerator.visit_ID,s vv r cFd}|jr|d|jzz }|S)Nz#pragmar)string)r r)rets r visit_PragmazCGenerator.visit_Pragma/s% 88 3> !C r c|j|j}|dz|j|jzdzS)N[])_parenthesize_unless_simpler-r subscript)r r)arrrefs r visit_ArrayRefzCGenerator.visit_ArrayRef5s711!&&9|djj55;;r c|j|j}||jz|j|jzSr)r6r-typerfield)r r)srefs r visit_StructRefzCGenerator.visit_StructRef9s6//7aff}tzz!''222r c|j|j}|dz|j|jzdzS)N())r6r-rargs)r r)frefs r visit_FuncCallzCGenerator.visit_FuncCall=s7//7czDJJqvv..44r c|jdk(rd|j|jzS|j|j}|jdk(rd|zS|jdk(rd|zS|j|S)Nsizeofz sizeof(%s)zp++z%s++zp--z%s--)oprexprr6)r r)operands r visit_UnaryOpzCGenerator.visit_UnaryOpAsw 448  $**QVV"44 466qvv>Gttu}''''!"w//r z||rz&&r|^&z==z!=>z>=>z<<+-* /%cjjfd}jjfd}|djd|S)Ncj|xs]jxrOt|tjxr3j |j j j k\ Sr_is_simple_noder isinstancerBinaryOpprecedence_maprGdr)r s r z+CGenerator.visit_BinaryOp..ksf4//2M--M*Q2OM))!$$/43F3Fqtt3LLNr cj|xs]jxrOt|tjxr3j |j j j kD Srr_rds r rfz+CGenerator.visit_BinaryOp..wsf4//2L--L*Q2OL))!$$/$2E2Eadd2KKMr r)_parenthesize_ifleftrightrG)r r)lval_strrval_strs`` r visit_BinaryOpzCGenerator.visit_BinaryOp_sV(( FF NO(( GG MN &qttX66r c|j|jd}|j|jd|jd|S)Nc6t|tjSr)rar Assignment)r)s r rfz-CGenerator.visit_Assignment..sjE4D4D&Er r)rhrvaluerlvaluerG)r r)rls r visit_AssignmentzCGenerator.visit_Assignment|s=((HHEG"ZZ1144BBr c8dj|jSr)r$namesr(s r visit_IdentifierTypezCGenerator.visit_IdentifierTypesxx  r ct|tjrd|j|zdzSt|tjtj frd|j|zdzS|j|S)N{}r@rA)rarInitListrExprListCompoundr(s r _visit_exprzCGenerator._visit_exprse a (A&, , ENNENN; <A&, ,::a= r c|r |jn|j|}|jr!|d|j|jzz }|jr!|d|j |jzz }|S)Nz :  = )r-_generate_declbitsizerinitr})r r)no_typess r visit_DeclzCGenerator.visit_DeclshAFF4#6#6q#9 99a54::aii#888a 66 ))!&&11 1Ar cj|jd}t|jdkDr-|ddjfd|jddDzz }|S)Nrr, c3DK|]}j|dyw)T)rN)rr declr s r r#z,CGenerator.visit_DeclList..s&"=(,#'//$/"E"=s )rdeclslenr$r r)rs` r visit_DeclListzCGenerator.visit_DeclListsa JJqwwqz " qww.s!GA$**Q-!G )rrrbody param_declsr$)r r)rrknrdeclss` r visit_FuncDefzCGenerator.visit_FuncDefszz!&&!zz!&&! ==zz!G!GGH$;)E1D84? ?$;%, ,r cd}|jD]z}t|tjr||j |z }2t|tj r||j |dzz }d||j |dzz }||S)Nrrr)extrarFuncDefrPragma)r r)rrs r visit_FileASTzCGenerator.visit_FileASTs} 55 -C#u}}-TZZ_$C.TZZ_t++TZZ_u,,  -r cjdz}xjdz c_|jr'|djfd|jDz }xjdzc_|jdzz }|S)N{ rLrc3@K|]}j|ywr_generate_stmt)r stmtr s r r#z,CGenerator.visit_Compound..sMt,,T2Mrz} )rr block_itemsr$rs` r visit_CompoundzCGenerator.visit_Compoundsy    % ' Q == Mq}}MM MA Q T   5 ((r cd|j|jzdz|j|jzdzS)Nr@z){ry)rr;rr(s r visit_CompoundLiteralz CGenerator.visit_CompoundLiterals6TZZ''$.AFF1CCcIIr cy)N;r(s r visit_EmptyStatementzCGenerator.visit_EmptyStatementsr cLdjfd|jDS)Nrc3@K|]}j|ywrr)r paramr s r r#z-CGenerator.visit_ParamList..sAuE*Ar)r$paramsr(s` r visit_ParamListzCGenerator.visit_ParamListsyyAAAAr cjd}|jr!|d|j|jzz }|dzS)Nreturnrr)rHrrs r visit_ReturnzCGenerator.visit_Returns2  661djj00013wr cy)Nzbreak;rr(s r visit_BreakzCGenerator.visit_Breaksr cy)Nz continue;rr(s r visit_ContinuezCGenerator.visit_Continuesr cd|j|jzdz}|d|j|jzdzz }|d|j|jzdzz }|S)Nr@z) ? z) : rA)r}condiftrueiffalsers r visit_TernaryOpzCGenerator.visit_TernaryOpsk 4##AFF+ +f 4 S4##AHH- - 66 S4##AII. . 44r c,d}|jr||j|jz }|dz }||j|jdz }|jr6||j dzz }||j|jdz }|S)Nzif () T add_indentzelse )rrrrrrrs r visit_IfzCGenerator.visit_Ifs  661 166**1 U  T d ;; 99 ""$x/ /A $$QYY4$@ @Ar cpd}|jr||j|jz }|dz }|jr!|d|j|jzz }|dz }|jr!|d|j|jzz }|dz }||j |j dz }|S)Nzfor (rrrTr)rrrnextrrrs r visit_ForzCGenerator.visit_For s  661 166**1 S 661djj0001 S 661djj0001 U  T D 99r cd}|jr||j|jz }|dz }||j|jdz }|S)Nwhile (rTr)rrrrrs r visit_WhilezCGenerator.visit_WhilesP  661 166**1 U  T D 99r cd}||j|jdz }||jdzz }|jr||j |jz }|dz }|S)Nzdo Trrz);)rrrrrrs r visit_DoWhilezCGenerator.visit_DoWhilesh  T D 99 T   9 ,, 661 166**1 T r cd}||j|jz }|jr#|dz }||j|jz }|dz }|S)Nz_Static_assert(,rA)rrmessagers r visit_StaticAssertzCGenerator.visit_StaticAssert$sS  TZZ  99 HA AII& &A Sr cd|j|jzdz}||j|jdz }|S)Nzswitch (rTr)rrrrrs r visit_SwitchzCGenerator.visit_Switch-sA AFF+ +e 3 T D 99r cd|j|jzdz}|jD]}||j|dz }|S)Nzcase : Tr)rrHstmtsrr r)rrs r visit_CasezCGenerator.visit_Case2sP djj( (5 0GG s$vv~ 3 3AFF ;;;r c&d|jzdzS)Nzgoto rr,r(s r visit_GotozCGenerator.visit_GotoAs#%%r cy)Nz...rr(s r visit_EllipsisParamzCGenerator.visit_EllipsisParamDsr c&|j|dS)Nstructrr(s r visit_StructzCGenerator.visit_StructGs//8< !>hh.dAHH4H4HG 44M 3J!&&,B '   IA ""$ $A    "  JA w' 'A    "  ""$s* *Ar c8djfd|DS)Nrc3@K|]}j|ywrrrs r r#z9CGenerator._generate_struct_union_body..sETt**40Err$r rs` r rz&CGenerator._generate_struct_union_body~swwEWEEEr cDdjfd|DdddzS)Nrc3@K|]}j|ywrr)r r'r s r r#z1CGenerator._generate_enum_body..s>Utzz%(>rrrrs` r rzCGenerator._generate_enum_bodys$ww>g>>sCdJJr ct|}|r|xjdz c_|j}|r|xjdzc_|tjtj tj tjtjtjtjtjtjtjtjtjtj f vr||j#|zdzS|tj$fvr|j#|S|tj&fvr||j#|zS||j#|zdzS)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. rLrr)r;rrrDeclrpCastUnaryOprb TernaryOpFuncCallArrayRef StructRefConstantrTypedefr{rr|If)r r)rtyprs r rzCGenerator._generate_stmts 1g t((A-(""$ t((A-(  E,,ejj%--5==   DJJqM)E1 1 U^^% % ::a= UXXK DJJqM) )DJJqM)D0 0r cTd}|jrdj|jdz}|jr!|dj|jdzz }|jr$||j |jddzz }||j |j z }|S)z& Generation from a Decl node. rrr)funcspecr$ralignrrr;rs r rzCGenerator._generate_decls  ::388AJJ/#5q 99a388AII.44a 77AAGGAJ/#55A T  ((r Tct|}|tjk(rd}|jr!|dj |jdzz }||j |jz }|j r|r |j nd}t|D]d\}}t|tjr|dk7r(t||dz tjrd|zdz}|dz }|jr!|dj |jdzz }||j |jdzz }t|tjrS|dk7r(t||dz tjrd|zdz}|d|j |jzdzz }t|tjs+|jr)d dj |j|rd|znd}`d |z}g|r|d|zz }|S|tjk(r|j!|jS|tj"k(r|j%|j| S|tj&k(rdj |j(dzS|tjtjtjfvr"|j%|j||gz| S|j |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. rrrrr@rAr4r5z* rYr)r;rTypeDeclqualsr$rdeclname enumeratera ArrayDeclPtrDecl dim_qualsdimFuncDeclrBr#rTypenamerIdentifierTyperu) r r) modifiersrr-rnstrimodifiers r rzCGenerator._generate_types 1g %.. AwwSXXagg.44 AFF# #A!" 1::2D )3 * 8h8Q"9QU#3U]]C#&:#3DCKD)));); .sd6J6J16M2Mr )rhr(s` r r6z&CGenerator._parenthesize_unless_simples$$Q(MNNr ct|tjtjtjtj tj fS)z~ Returns True for nodes that are "simple" - i.e. nodes that always have higher precedence than operators. )rarr*rr(r)r'r(s r r`zCGenerator._is_simple_nodes9!ennehh#oou~~?@ @r N)F)Cr __module__ __qualname____doc__r rrrr*r.r2r9r>rDrJrcrmrsrvr}rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr rrrrrrrrrrhr6r`rr r rr s. 5'?K  <35 0  a  a  Q  Q  Q  a q  Q a a "&q  a q  Q Q  Q Q Q N7:C !! B+ + @> - JB      <&=+<&;;;0FK1<+-d3!jO @r rN)rrobjectrrr r rJsj@j@r