U _5@s ddlmZGdddeZdS))c_astc@seZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZdldd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3d4Zd5d6Zd7d8Zd9d:Zd;d<Z d=d>Z!d?d@Z"dAdBZ#dCdDZ$dEdFZ%dGdHZ&dIdJZ'dKdLZ(dMdNZ)dOdPZ*dQdRZ+dSdTZ,dUdVZ-dWdXZ.dYdZZ/d[d\Z0d]d^Z1dmd_d`Z2dadbZ3gfdcddZ4dedfZ5dgdhZ6didjZ7dkS)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_levelselfr /c_generator.py__init__szCGenerator.__init__cCs d|jSN rrr r r _make_indentszCGenerator._make_indentcCsd|jj}t|||j|S)NZvisit_) __class____name__getattr generic_visit)rnodemethodr r r visits zCGenerator.visitcs,|dkr dSdfdd|DSdS)Nc3s|]\}}|VqdSNr).0Zc_namecrr r #sz+CGenerator.generic_visit..)joinZchildren)rrr rr rszCGenerator.generic_visitcCs|jSr)valuernr r r visit_Constant%szCGenerator.visit_ConstantcCs|jSrnamerr r r visit_ID(szCGenerator.visit_IDcCs$||j}|d||jdS)N[])_parenthesize_unless_simpler"rZ subscript)rrZarrrefr r r visit_ArrayRef+s zCGenerator.visit_ArrayRefcCs"||j}||j||jSr)r&r"typerZfield)rrZsrefr r r visit_StructRef/s zCGenerator.visit_StructRefcCs$||j}|d||jdS)N())r&r"rargs)rrZfrefr r r visit_FuncCall3s zCGenerator.visit_FuncCallcCs\||j}|jdkrd|S|jdkr0d|S|jdkrJd||jSd|j|fSdS)Nzp++z%s++zp--z%s--Zsizeofz sizeof(%s)z%s%s)r&expropr)rrZoperandr r r visit_UnaryOp7s    zCGenerator.visit_UnaryOpcs<|jfdd}|jfdd}d||j|fS)Ncs | Sr_is_simple_nodedrr r Fz+CGenerator.visit_BinaryOp..cs | Srr1r3rr r r5Hr6%s %s %s)_parenthesize_ifleftrightr/)rrZlval_strrval_strr rr visit_BinaryOpDs  zCGenerator.visit_BinaryOpcCs*||jdd}d||j|j|fS)NcSs t|tjSr) isinstancer Assignment)rr r r r5Nr6z-CGenerator.visit_Assignment..r7)r8ZrvaluerZlvaluer/)rrr;r r r visit_AssignmentKs zCGenerator.visit_AssignmentcCs d|jSr )rnamesrr r r visit_IdentifierTypeQszCGenerator.visit_IdentifierTypecCsJt|tjrd||dSt|tjr.)rdeclslenrrrrKr rr visit_DeclListfs  zCGenerator.visit_DeclListcCs2d}|jr|d|jd7}|||j7}|S)Nrr )storager_generate_typer(rQr r r visit_Typedefms zCGenerator.visit_TypedefcCs(d||jd}|d||jS)Nr*r+r )rTZto_typer&r.rQr r r visit_CastsszCGenerator.visit_CastcCs*g}|jD]}|||q d|SNrMZexprsappendrErrrZvisited_subexprsr.r r r visit_ExprListws zCGenerator.visit_ExprListcCs*g}|jD]}|||q d|SrWrXrZr r r visit_InitList}s zCGenerator.visit_InitListcCsd}|jr|d|j7}|jr|d7}t|jjD]H\}}||j7}|jr^|d||j7}|t|jjdkr2|d7}q2|d7}|S)Nenumr z {rGrrMrC)r"values enumerateZ enumeratorsrrrP)rrrKiZ enumeratorr r r visit_Enums  zCGenerator.visit_Enumcsj|j}d_|j}|jrVdfdd|jD}|d|d|dS|d|dSdS)Nr; c3s|]}|VqdSrr)rprr r rsz+CGenerator.visit_FuncDef.. )rrNrbodyZ param_declsr)rrrNreZknrdeclsr rr visit_FuncDefs  zCGenerator.visit_FuncDefcCsBd}|jD]2}t|tjr*|||7}q |||d7}q |S)Nrrb)extr=rZFuncDefr)rrrKrgr r r visit_FileASTs   zCGenerator.visit_FileASTcs`d}jd7_|jr>|dfdd|jD7}jd8_|d7}|S)N{ rc3s|]}|VqdSr)_generate_stmt)rstmtrr r rsz,CGenerator.visit_Compound..z} )rrZ block_itemsrrQr rr visit_Compounds zCGenerator.visit_CompoundcCsdS)N;r rr r r visit_EmptyStatementszCGenerator.visit_EmptyStatementcsdfdd|jDS)NrMc3s|]}|VqdSrr)rZparamrr r rsz-CGenerator.visit_ParamList..)rZparamsrr rr visit_ParamListszCGenerator.visit_ParamListcCs&d}|jr|d||j7}|dS)Nreturnr rn)r.rrQr r r visit_ReturnszCGenerator.visit_ReturncCsdS)Nzbreak;r rr r r visit_BreakszCGenerator.visit_BreakcCsdS)Nz continue;r rr r r visit_ContinueszCGenerator.visit_ContinuecCs8||jd}|||jd7}|||j7}|S)Nz ? rF)rEcondiftrueiffalserQr r r visit_TernaryOpszCGenerator.visit_TernaryOpcCsdd}|jr|||j7}|d7}||j|jdd7}|jr`||d7}||j|jdd7}|S)Nzif () T add_indentzelse )rurrkrvrwrrQr r r visit_IfszCGenerator.visit_IfcCs~d}|jr|||j7}|d7}|jr<|d||j7}|d7}|jr^|d||j7}|d7}||j|jdd7}|S)Nzfor (rnr ryTrz)rIrrunextrkrlrQr r r visit_ForszCGenerator.visit_ForcCs:d}|jr|||j7}|d7}||j|jdd7}|S)Nwhile (ryTrz)rurrkrlrQr r r visit_Whiles zCGenerator.visit_WhilecCsJd}||j|jdd7}||d7}|jr>|||j7}|d7}|S)Nzdo Trzrz);)rkrlrrurrQr r r visit_DoWhileszCGenerator.visit_DoWhilecCs,d||jd}||j|jdd7}|S)Nzswitch (ryTrz)rrurkrlrQr r r visit_SwitchszCGenerator.visit_SwitchcCs6d||jd}|jD]}||j|dd7}q|S)Nzcase : Trz)rr.stmtsrkrrrKrlr r r visit_Cases zCGenerator.visit_CasecCs&d}|jD]}||j|dd7}q |S)Nz default: Trz)rrkrr r r visit_Defaults zCGenerator.visit_DefaultcCs|jd||jS)Nr)r"rkrlrr r r visit_LabelszCGenerator.visit_LabelcCsd|jdS)Nzgoto rnr!rr r r visit_GotoszCGenerator.visit_GotocCsdS)Nz...r rr r r visit_EllipsisParamszCGenerator.visit_EllipsisParamcCs ||dS)Nstruct_generate_struct_unionrr r r visit_StructszCGenerator.visit_StructcCs ||jSr)rTr(rr r r visit_TypenameszCGenerator.visit_TypenamecCs ||dS)Nunionrrr r r visit_UnionszCGenerator.visit_UnioncCsbd}|jD]>}t|tjr*|d|j7}q t|tjr |d|jd7}q |d||j7}|S)Nr.r$r%rG)r"r=rIDConstantrrr.)rrrKr"r r r visit_NamedInitializer s   z!CGenerator.visit_NamedInitializercCs ||Sr)rTrr r r visit_FuncDeclszCGenerator.visit_FuncDeclcCs~|d|jpd}|jrz|d7}||7}|jd7_|d7}|jD]}|||7}qH|jd8_||d7}|S)ze Generates code for structs and unions. name should be either 'struct' or union. r rrdrjrirC)r"rOrrrk)rrr"rKrNr r r rs  z!CGenerator._generate_struct_unioncCst|}|r|jd7_|}|r4|jd8_|tjtjtjtjtjtj tj tj tj tj tjtjtjf kr|||dS|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. rjrbrdN)r(rrrDeclr>ZCastZUnaryOpZBinaryOpZ TernaryOpFuncCallArrayRef StructRefrrZTypedefrDrZCompound)rrr{typindentr r r rk(s2  zCGenerator._generate_stmtcCsHd}|jrd|jd}|jr4|d|jd7}|||j7}|S)z& Generation from a Decl node. rr )ZfuncspecrrSrTr(rQr r r rHDszCGenerator._generate_declcCst|}|tjkrHd}|jr2|d|jd7}|||j7}|jrN|jnd}t|D]\}}t|tj r|dkrt||dtj rd|d}|d||j d7}qZt|tj r|dkrt||dtj rd|d}|d||j d7}qZt|tj rZ|jr(d d|j|f}qZd |}qZ|rD|d|7}|S|tjkr`||jS|tjkrx||jS|tjkrd|jdS|tj tj tj fkr||j||gS||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+r$r%z* %s %s*N)r(rZTypeDeclZqualsrrZdeclnamer_r=Z ArrayDeclZPtrDeclZdimZFuncDeclr,rrHZTypenamerTZIdentifierTyper@)rrZ modifiersrrKZnstrr`Zmodifierr r r rTMs@             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*r+N)rE)rrZ conditionrKr r r r8{s  zCGenerator._parenthesize_ifcs|fddS)z. Common use case for _parenthesize_if cs | Srr1r3rr r r5r6z8CGenerator._parenthesize_unless_simple..)r8rr rr r&sz&CGenerator._parenthesize_unless_simplecCst|tjtjtjtjtjfS)z~ Returns True for nodes that are "simple" - i.e. nodes that always have higher precedence than operators. )r=rrrrrrrr r r r2szCGenerator._is_simple_nodeN)F)F)8r __module__ __qualname____doc__r rrrr r#r'r)r-r0r<r?rArErLrRrUrVr[r\rarfrhrmrorprrrsrtrxr|r~rrrrrrrrrrrrrrrkrHrTr8r&r2r r r r r sj          . rN)rrobjectrr r r r  s