3 g¨wU5ã@s ddlmZGdd„deƒZdS)é)Úc_astc@s¸eZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdldd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Zd7d8„Zd9d:„Zd;d<„Z d=d>„Z!d?d@„Z"dAdB„Z#dCdD„Z$dEdF„Z%dGdH„Z&dIdJ„Z'dKdL„Z(dMdN„Z)dOdP„Z*dQdR„Z+dSdT„Z,dUdV„Z-dWdX„Z.dYdZ„Z/d[d\„Z0d]d^„Z1dmd_d`„Z2dadb„Z3gfdcdd„Z4dedf„Z5dgdh„Z6didj„Z7dkS)nÚ 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. cCs d|_dS)Né)Ú indent_level)Úself©rú!/usr/lib/python3.6/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 dSdj‡fdd„|jƒDƒƒSdS)NÚc3s|]\}}ˆj|ƒVqdS)N)r)Ú.0Zc_nameÚc)rrrú #sz+CGenerator.generic_visit..)ÚjoinZchildren)rrr)rrrszCGenerator.generic_visitcCs|jS)N)Úvalue)rÚnrrrÚvisit_Constant%szCGenerator.visit_ConstantcCs|jS)N)Úname)rrrrrÚvisit_ID(szCGenerator.visit_IDcCs$|j|jƒ}|d|j|jƒdS)Nú[ú])Ú_parenthesize_unless_simplerrZ subscript)rrZarrrefrrrÚvisit_ArrayRef+s zCGenerator.visit_ArrayRefcCs"|j|jƒ}||j|j|jƒS)N)rrÚtyperZfield)rrZsrefrrrÚvisit_StructRef/s zCGenerator.visit_StructRefcCs$|j|jƒ}|d|j|jƒdS)Nú(ú))rrrÚargs)rrZfrefrrrÚvisit_FuncCall3s zCGenerator.visit_FuncCallcCs\|j|jƒ}|jdkrd|S|jdkr0d|S|jdkrJd|j|jƒSd|j|fSdS)Nzp++z%s++zp--z%s--Zsizeofz sizeof(%s)z%s%s)rÚexprÚopr)rrZoperandrrrÚ visit_UnaryOp7s    zCGenerator.visit_UnaryOpcs<ˆj|j‡fdd„ƒ}ˆj|j‡fdd„ƒ}d||j|fS)Ncs ˆj|ƒ S)N)Ú_is_simple_node)Úd)rrrÚFsz+CGenerator.visit_BinaryOp..cs ˆj|ƒ S)N)r*)r+)rrrr,Hsz%s %s %s)Ú_parenthesize_ifÚleftÚrightr()rrZlval_strÚrval_strr)rrÚvisit_BinaryOpDs zCGenerator.visit_BinaryOpcCs*|j|jdd„ƒ}d|j|jƒ|j|fS)NcSs t|tjƒS)N)Ú isinstancerÚ Assignment)rrrrr,Nsz-CGenerator.visit_Assignment..z%s %s %s)r-ZrvaluerZlvaluer()rrr0rrrÚvisit_AssignmentKs zCGenerator.visit_AssignmentcCs dj|jƒS)Nr )rÚnames)rrrrrÚvisit_IdentifierTypeQszCGenerator.visit_IdentifierTypecCsJt|tjƒrd|j|ƒdSt|tjƒr.)rÚdeclsÚlenr)rrr>r)rrÚvisit_DeclListfs zCGenerator.visit_DeclListcCs2d}|jr|dj|jƒd7}||j|jƒ7}|S)Nrr )ÚstoragerÚ_generate_typer!)rrr>rrrÚ visit_Typedefms zCGenerator.visit_TypedefcCs(d|j|jƒd}|d|j|jƒS)Nr#r$r )rEZto_typerr')rrr>rrrÚ visit_CastsszCGenerator.visit_CastcCs.g}x|jD]}|j|j|ƒƒq Wdj|ƒS)Nz, )ÚexprsÚappendr:r)rrÚvisited_subexprsr'rrrÚvisit_ExprListws zCGenerator.visit_ExprListcCs.g}x|jD]}|j|j|ƒƒq Wdj|ƒS)Nz, )rHrIr:r)rrrJr'rrrÚvisit_InitList}s zCGenerator.visit_InitListcCsŒd}|jr|d|j7}|jrˆ|d7}xXt|jjƒD]H\}}||j7}|jr`|d|j|jƒ7}|t|jjƒdkr4|d7}q4W|d7}|S)NÚenumr z {z = rz, r8)rÚvaluesÚ enumerateZ enumeratorsrrrB)rrr>ÚiZ enumeratorrrrÚ visit_Enumƒs  zCGenerator.visit_Enumcsjˆj|jƒ}dˆ_ˆj|jƒ}|jrVdj‡fdd„|jDƒƒ}|d|d|dS|d|dSdS)Nrz; c3s|]}ˆj|ƒVqdS)N)r)rÚp)rrrr–sz+CGenerator.visit_FuncDef..Ú )rr@rÚbodyZ param_declsr)rrr@rTZknrdeclsr)rrÚ visit_FuncDef‘s  zCGenerator.visit_FuncDefcCsFd}x<|jD]2}t|tjƒr,||j|ƒ7}q ||j|ƒd7}q W|S)Nrz; )Úextr2rZFuncDefr)rrr>rVrrrÚ visit_FileAST›s   zCGenerator.visit_FileASTcs`ˆjƒd}ˆjd7_|jr>|dj‡fdd„|jDƒƒ7}ˆjd8_|ˆjƒd7}|S)Nz{ érc3s|]}ˆj|ƒVqdS)N)Ú_generate_stmt)rÚstmt)rrrr¨sz,CGenerator.visit_Compound..z} )r rZ block_itemsr)rrr>r)rrÚvisit_Compound¤s zCGenerator.visit_CompoundcCsdS)Nú;r)rrrrrÚvisit_EmptyStatement­szCGenerator.visit_EmptyStatementcsdj‡fdd„|jDƒƒS)Nz, c3s|]}ˆj|ƒVqdS)N)r)rZparam)rrrr±sz-CGenerator.visit_ParamList..)rZparams)rrr)rrÚvisit_ParamList°szCGenerator.visit_ParamListcCs&d}|jr|d|j|jƒ7}|dS)NÚreturnr r\)r'r)rrr>rrrÚ visit_Return³szCGenerator.visit_ReturncCsdS)Nzbreak;r)rrrrrÚ visit_Break¸szCGenerator.visit_BreakcCsdS)Nz continue;r)rrrrrÚvisit_Continue»szCGenerator.visit_ContinuecCs8|j|jƒd}||j|jƒd7}||j|jƒ7}|S)Nz ? z : )r:ÚcondÚiftrueÚiffalse)rrr>rrrÚvisit_TernaryOp¾szCGenerator.visit_TernaryOpcCsdd}|jr||j|jƒ7}|d7}||j|jdd�7}|jr`||jƒd7}||j|jdd�7}|S)Nzif (z) T)Ú add_indentzelse )rcrrYrdrer )rrr>rrrÚvisit_IfÄszCGenerator.visit_IfcCs~d}|jr||j|jƒ7}|d7}|jr<|d|j|jƒ7}|d7}|jr^|d|j|jƒ7}|d7}||j|jdd�7}|S)Nzfor (r\r z) T)rg)r<rrcÚnextrYrZ)rrr>rrrÚ visit_ForÎszCGenerator.visit_ForcCs:d}|jr||j|jƒ7}|d7}||j|jdd�7}|S)Nzwhile (z) T)rg)rcrrYrZ)rrr>rrrÚ visit_WhileÙs zCGenerator.visit_WhilecCsJd}||j|jdd�7}||jƒd7}|jr>||j|jƒ7}|d7}|S)Nzdo T)rgzwhile (z);)rYrZr rcr)rrr>rrrÚ visit_DoWhileàszCGenerator.visit_DoWhilecCs,d|j|jƒd}||j|jdd�7}|S)Nzswitch (z) T)rg)rrcrYrZ)rrr>rrrÚ visit_SwitchèszCGenerator.visit_SwitchcCs:d|j|jƒd}x |jD]}||j|dd�7}qW|S)Nzcase z: T)rg)rr'ÚstmtsrY)rrr>rZrrrÚ visit_Caseís zCGenerator.visit_CasecCs*d}x |jD]}||j|dd�7}q W|S)Nz default: T)rg)rnrY)rrr>rZrrrÚ visit_Defaultós zCGenerator.visit_DefaultcCs|jd|j|jƒS)Nz: )rrYrZ)rrrrrÚ visit_LabelùszCGenerator.visit_LabelcCsd|jdS)Nzgoto r\)r)rrrrrÚ visit_GotoüszCGenerator.visit_GotocCsdS)Nz...r)rrrrrÚvisit_EllipsisParamÿszCGenerator.visit_EllipsisParamcCs |j|dƒS)NÚstruct)Ú_generate_struct_union)rrrrrÚ visit_StructszCGenerator.visit_StructcCs |j|jƒS)N)rEr!)rrrrrÚvisit_TypenameszCGenerator.visit_TypenamecCs |j|dƒS)NÚunion)ru)rrrrrÚ visit_UnionszCGenerator.visit_UnioncCsfd}xH|jD]>}t|tjƒr,|d|j7}q t|tjƒr |d|jd7}q W|d|j|jƒ7}|S)NrÚ.rrz = )rr2rÚIDÚConstantrrr')rrr>rrrrÚvisit_NamedInitializer s   z!CGenerator.visit_NamedInitializercCs |j|ƒS)N)rE)rrrrrÚvisit_FuncDeclszCGenerator.visit_FuncDeclcCs‚|d|jpd}|jr~|d7}||jƒ7}|jd7_|d7}x|jD]}||j|ƒ7}qJW|jd8_||jƒd7}|S)ze Generates code for structs and unions. name should be either 'struct' or union. r rrSrXz{ r8)rrAr rrY)rrrr>r@rrrrus  z!CGenerator._generate_struct_unioncCs®t|ƒ}|r|jd7_|jƒ}|r4|jd8_|tjtjtjtjtjtj tj tj tj tj tjtjtjf kr‚||j|ƒdS|tjfkr˜|j|ƒS||j|ƒ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. rXz; rSN)r!rr rÚDeclr3ZCastZUnaryOpZBinaryOpZ TernaryOpÚFuncCallÚArrayRefÚ StructRefr|r{ZTypedefr9rZCompound)rrrgÚtypÚindentrrrrY(s   zCGenerator._generate_stmtcCsHd}|jrdj|jƒd}|jr4|dj|jƒd7}||j|jƒ7}|S)z& Generation from a Decl node. rr )ZfuncspecrrDrEr!)rrr>rrrr;DszCGenerator._generate_declcCsÒt|ƒ}|tjk�rNd}|jr2|dj|jƒd7}||j|jƒ7}|jrN|jnd}xät|ƒD]Ø\}}t|tj ƒr²|dkr˜t||dtj ƒr˜d|d}|d|j|j ƒd7}q\t|tj ƒ�r|dkrèt||dtj ƒrèd|d}|d|j|j ƒd7}q\t|tj ƒr\|j�r,d dj|jƒ|f}q\d |}q\W|�rJ|d|7}|S|tjk�rf|j|jƒS|tjk�r~|j|jƒS|tjk�ršdj|jƒdS|tj tj tj fk�rÄ|j|j||gƒS|j|ƒ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#r$rrz* %s %sÚ*N)r!rZTypeDeclZqualsrrZdeclnamerOr2Z ArrayDeclZPtrDeclZdimZFuncDeclr%rr;ZTypenamerEZIdentifierTyper5)rrZ modifiersrƒr>ZnstrrPZmodifierrrrrEMs@            zCGenerator._generate_typecCs&|j|ƒ}||ƒrd|dS|SdS)z‘ Visits 'n' and returns its string representation, parenthesized if the condition function applied to the node returns True. r#r$N)r:)rrZ conditionr>rrrr-{s  zCGenerator._parenthesize_ifcsˆj|‡fdd„ƒS)z. Common use case for _parenthesize_if cs ˆj|ƒ S)N)r*)r+)rrrr,ˆsz8CGenerator._parenthesize_unless_simple..)r-)rrr)rrr…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. )r2rr|r{r�r‚r€)rrrrrr*ŠszCGenerator._is_simple_nodeN)F)F)8r Ú __module__Ú __qualname__Ú__doc__r r rrrrr r"r&r)r1r4r6r:r?rCrFrGrKrLrQrUrWr[r]r^r`rarbrfrhrjrkrlrmrorprqrrrsrvrwryr}r~rurYr;rEr-rr*rrrrr sj          . rN)rrÚobjectrrrrrÚ s