U q`<@s ddlmZGdddeZdS))c_astc@seZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZddZddZddZddZd}d!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^Z1d_d`Z2dadbZ3dcddZ4dedfZ5dgdhZ6didjZ7dkdlZ8dmdnZ9d~dodpZ:dqdrZ;gdsfdtduZdzd{Z?d|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. cCs d|_dS)N indent_levelselfr #sz+CGenerator.generic_visit..)joinchildren)rrr rr rszCGenerator.generic_visitcCs|jSr)valuernr r r visit_Constant%szCGenerator.visit_ConstantcCs|jSrnamerr r r visit_ID(szCGenerator.visit_IDcCsd}|jr|d|j7}|S)Nz#pragmar )string)rr retr r r visit_Pragma+szCGenerator.visit_PragmacCs$||j}|d||jdS)N[])_parenthesize_unless_simpler#rZ subscript)rr Zarrrefr r r visit_ArrayRef1s zCGenerator.visit_ArrayRefcCs"||j}||j||jSr)r*r#typerfield)rr Zsrefr r r visit_StructRef5s zCGenerator.visit_StructRefcCs$||j}|d||jdS)N())r*r#rargs)rr Zfrefr r r visit_FuncCall9s zCGenerator.visit_FuncCallcCs\||j}|jdkrd|S|jdkr0d|S|jdkrJd||jSd|j|fSdS)Nzp++z%s++zp--z%s--sizeofz sizeof(%s)z%s%s)r*expropr)rr Zoperandr r r visit_UnaryOp=s    zCGenerator.visit_UnaryOpcs<|jfdd}|jfdd}d||j|fS)Ncs | Sr_is_simple_nodedrr r Lz+CGenerator.visit_BinaryOp..cs | Srr7r9rr r r;Nr<%s %s %s)_parenthesize_ifleftrightr5)rr Zlval_strrval_strr rr visit_BinaryOpJs  zCGenerator.visit_BinaryOpcCs*||jdd}d||j|j|fS)NcSs t|tjSr) isinstancer Assignment)r r r r r;Tr<z-CGenerator.visit_Assignment..r=)r>ZrvaluerZlvaluer5)rr rAr r r visit_AssignmentQs zCGenerator.visit_AssignmentcCs d|jSr )rnamesrr r r visit_IdentifierTypeWszCGenerator.visit_IdentifierTypecCsJt|tjrd||dSt|tjr.)rdeclslenrrr rPr rr visit_DeclListls  zCGenerator.visit_DeclListcCs2d}|jr|d|jd7}|||j7}|S)Nrr )storager_generate_typer,rWr r r visit_Typedefss zCGenerator.visit_TypedefcCs,d|j|jddd}|d||jS)Nr/F emit_declnamer0r )rZZto_typer*r4rWr r r visit_CastyszCGenerator.visit_CastcCs*g}|jD]}|||q d|SNrRexprsappendrKrrr Zvisited_subexprsr4r r r visit_ExprList}s zCGenerator.visit_ExprListcCs*g}|jD]}|||q d|Sr_r`rcr r r visit_InitLists zCGenerator.visit_InitListcCs|j|ddS)Nenumr"_generate_struct_union_enumrr r r visit_EnumszCGenerator.visit_EnumcCs<|jsdj||jdSdj||j||jdSdS)Nz{indent}{name}, )indentr#z{indent}{name} = {value}, )rjr#r)rformatrr#rrr r r visit_Enumerators zCGenerator.visit_Enumeratorcsj|j}d_|j}|jrVdfdd|jD}|d|d|dS|d|dSdS)Nr; c3s|]}|VqdSrr)rprr r rsz+CGenerator.visit_FuncDef.. )rrTrbodyZ param_declsr)rr rTrpZknrdeclsr rr visit_FuncDefs  zCGenerator.visit_FuncDefcCsbd}|jD]R}t|tjr*|||7}q t|tjrJ|||d7}q |||d7}q |S)Nrrorm)extrCrZFuncDefrZPragma)rr rPrrr 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_itemsrrWr rr visit_Compounds zCGenerator.visit_CompoundcCs$d||jd||jdS)Nr/z){rI)rr,rNrr r r visit_CompoundLiteralsz CGenerator.visit_CompoundLiteralcCsdS)N;r rr r r visit_EmptyStatementszCGenerator.visit_EmptyStatementcsdfdd|jDS)NrRc3s|]}|VqdSrr)rparamrr r rsz-CGenerator.visit_ParamList..)rparamsrr rr visit_ParamListszCGenerator.visit_ParamListcCs&d}|jr|d||j7}|dS)Nreturnr r{)r4rrWr r r visit_ReturnszCGenerator.visit_ReturncCsdS)Nzbreak;r rr r r visit_BreakszCGenerator.visit_BreakcCsdS)Nz continue;r rr r r visit_ContinueszCGenerator.visit_ContinuecCsHd||jd}|d||jd7}|d||jd7}|S)Nr/z) ? z) : r0)rKcondiftrueiffalserWr r r visit_TernaryOpszCGenerator.visit_TernaryOpcCsdd}|jr|||j7}|d7}||j|jdd7}|jr`||d7}||j|jdd7}|S)Nzif () T add_indentzelse )rrrwrrrrWr r r visit_IfszCGenerator.visit_IfcCs~d}|jr|||j7}|d7}|jr<|d||j7}|d7}|jr^|d||j7}|d7}||j|jdd7}|S)Nzfor (r{r rTr)rNrrnextrwrxrWr r r visit_ForszCGenerator.visit_ForcCs:d}|jr|||j7}|d7}||j|jdd7}|S)Nwhile (rTr)rrrwrxrWr r r visit_Whiles zCGenerator.visit_WhilecCsJd}||j|jdd7}||d7}|jr>|||j7}|d7}|S)Nzdo Trrz);)rwrxrrrrWr r r visit_DoWhileszCGenerator.visit_DoWhilecCs,d||jd}||j|jdd7}|S)Nzswitch (rTr)rrrwrxrWr r r visit_SwitchszCGenerator.visit_SwitchcCs6d||jd}|jD]}||j|dd7}q|S)Nzcase : Tr)rr4stmtsrwrr rPrxr r r visit_Cases zCGenerator.visit_CasecCs&d}|jD]}||j|dd7}q |S)Nz default: Tr)rrwrr r r visit_Defaults zCGenerator.visit_DefaultcCs|jd||jS)Nr)r#rwrxrr r r visit_LabelszCGenerator.visit_LabelcCsd|jdS)Nzgoto r{r"rr r r visit_Goto szCGenerator.visit_GotocCsdS)Nz...r rr r r visit_EllipsisParam szCGenerator.visit_EllipsisParamcCs ||dS)Nstructrgrr r r visit_StructszCGenerator.visit_StructcCs ||jSr)rZr,rr r r visit_TypenameszCGenerator.visit_TypenamecCs ||dS)Nunionrgrr r r visit_UnionszCGenerator.visit_UnioncCsZd}|jD]6}t|tjr*|d|j7}q |d||d7}q |d||j7}|S)Nr.r(r)rL)r#rCrIDrrKr4)rr rPr#r r r visit_NamedInitializers  z!CGenerator.visit_NamedInitializercCs ||SrrZrr r r visit_FuncDecl#szCGenerator.visit_FuncDeclcCs|j|ddSNFr\rrr r r visit_ArrayDecl&szCGenerator.visit_ArrayDeclcCs|j|ddSrrrr r r visit_TypeDecl)szCGenerator.visit_TypeDeclcCs|j|ddSrrrr r r visit_PtrDecl,szCGenerator.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'. )rrrfNr rrorurtrI) rU_generate_struct_union_bodyAssertionErrorvaluesZ enumerators_generate_enum_bodyr#rr)rr r#membersZ body_functionrPr r r rh/s    z&CGenerator._generate_struct_union_enumcsdfdd|DS)Nrc3s|]}|VqdSrrvrSrr r rHsz9CGenerator._generate_struct_union_body..rrrr rr rGsz&CGenerator._generate_struct_union_bodycs$dfdd|DdddS)Nrc3s|]}|VqdSrr)rrrr r rLsz1CGenerator._generate_enum_body..rorrr rr rJszCGenerator._generate_enum_bodycCst|}|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. rurmroN)r,rrrDeclrDZCastZUnaryOpZBinaryOpZ TernaryOpFuncCallArrayRef StructRefConstantrZTypedefrJrZCompound)rr rtyprjr r r rwNs2  zCGenerator._generate_stmtcCsHd}|jrd|jd}|jr4|d|jd7}|||j7}|S)z& Generation from a Decl node. rr )ZfuncspecrrYrZr,rWr r r rMjszCGenerator._generate_declTc Cs t|}|tjkrd}|jr2|d|jd7}|||j7}|jrR|rR|jnd}t|D]\}}t|tj r|dkrt||dtj rd|d}|d7}|j r|d|j d7}|||j d7}q^t|tj r(|dkrt||dtj rd|d}|d||jd7}q^t|tj r^|jr`d d|j|rVd|ndf}q^d |}q^|r||d|7}|S|tjkr||jS|tjkr|j|j|d S|tjkrd|jdS|tj tj tj fkr|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%s*r\N)r,rZTypeDeclZqualsrrZdeclname enumeraterCZ ArrayDeclZPtrDeclZ dim_qualsZdimZFuncDeclr1rrMZTypenamerZZIdentifierTyperF) rr modifiersr]rrPZnstrimodifierr r r rZssV             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)rK)rr conditionrPr r r r>s  zCGenerator._parenthesize_ifcs|fddS)z. Common use case for _parenthesize_if cs | Srr7r9rr r r;r<z8CGenerator._parenthesize_unless_simple..)r>rr 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. )rCrrrrrrrr r r r8szCGenerator._is_simple_nodeN)F)F)@r __module__ __qualname____doc__r rrrr!r$r'r+r.r2r6rBrErGrKrQrXr[r^rdrerirlrqrsryrzr|rrrrrrrrrrrrrrrrrrrrrrrrhrrrwrMrZr>r*r8r r r r r sz           5 rN)rrobjectrr r r r  s