U տVX @sFddlmZdZdZddZdZdZdZd d ZeZ d Z d d Z ddZ ddZ ddZddZddlZddlZddlZddlZedZddddddddd d! Zd"d#ZGd$d%d%eZGd&d'd'eZed(krBddlmZeZddl Z e!e j"d)Z#e#$Z%eeZ&e&'e%e j"d)e&(Z)e)s2qBe*e&j+e)q dS)*) generators) ZCPP_ID CPP_INTEGERZ CPP_FLOATZ CPP_STRINGZCPP_CHARCPP_WSZ CPP_COMMENT1Z CPP_COMMENT2Z CPP_POUNDZ CPP_DPOUNDz+-*/%|&~^<>=!?()[]{}.,;:\'"cCs|jj|jd7_|S)z\s+ lexerlinenovaluecounttr /cpp.pyt_CPP_WSsrz\#z\#\#z[A-Za-z_][\w_]*cCs|S)zA(((((0x)|(0X))[0-9a-fA-F]+)|(\d+))([uU][lL]|[lL][uU]|[uU]|[lL])?)r r r r rr$srz?((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?cCs|jj|jd7_|S)z\"([^\\\n]|(\\(.|\n)))*?\"rrr r r r t_CPP_STRING.srcCs|jj|jd7_|S)z(L)?\'([^\\\n]|(\\(.|\n)))*?\'rrr r r r t_CPP_CHAR4srcCs8|jd}|jj|7_d|_|r.d|nd|_|S)z(/\*(.|\n)*?\*/)rr )r r rrtype)r Zncrr r rt_CPP_COMMENT1:s  rcCsd|_d|_dS)z (//.*?(\n|$))rrN)rr r r r rt_CPP_COMMENT2CsrcCs(|jd|_|jd|_|jd|SNr)r rrskipr r r rt_errorHs   rNz\?\?[=/\'\(\)\!<>\-]#\^[]|{}~) =/'()!<>-cCstdd|S)NcSst|dSN) _trigraph_repgroup)gr r rrztrigraph..) _trigraph_patsub)inputr r rtrigraphqsr6c@seZdZdddZdS)MacroNFcCs0||_||_||_||_|r&|d|_d|_dSr,)namer arglistvariadicvarargsource)selfr8r r9r:r r r__init__s zMacro.__init__)NF)__name__ __module__ __qualname__r>r r r rr7sr7c@seZdZd&ddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ d'ddZ ddZd(ddZddZddZd d!Zdifd"d#Zd$d%ZdS)) PreprocessorNcCsl|dkrtj}||_i|_g|_g|_|t}|dt d||dt d|d|_ dS)Nz __DATE__ "%s"z%b %d %Yz __TIME__ "%s"z%H:%M:%S) lexrmacrospath temp_pathlexprobetime localtimedefinestrftimeparser)r=rZtmr r rr>szPreprocessor.__init__cCs0g}|j||j}|s q,||q|SN)rr5tokenappend)r=texttokenstokr r rtokenizes   zPreprocessor.tokenizecCstd|||fdS)Nz%s:%d %s)print)r=filelinemsgr r rerrorszPreprocessor.errorc Cs|jd|j}|r$|jdkr.tdn|j|_|jd|j}|r^t|jdkrhtdn|j|_t|j|_ |jd|j}|r|jdkrtdn|j|_ |jd|j}|r|jdkrd|_ n|j|_ |jd |j}|r|jd krd|_ td n|j|_ |j |j f|_ d d d ddddddg }|D]:}|j||j}|rz|j|krNtd|qNdS)NZ identifierz"Couldn't determine identifier typeZ12345i90zCouldn't determine integer typez "filename"zCouldn't determine string typez rz%Couldn't determine token for newlinesr)r*r##rr&r',.z,Unable to lex '%s' required for preprocessor)rr5rNr rTrt_IDint t_INTEGERt_INTEGER_TYPEt_STRINGZt_SPACEZ t_NEWLINEt_WS)r=rRcharscr r rrGsD                 zPreprocessor.lexprobecCs|j|dSrM)rErO)r=rEr r radd_pathszPreprocessor.add_pathccs|j}dd|D}tt|D]T}|d}||dr(|t|kr(||dd||||<d||<|d7}q4q(d|}||d|_g}| }|sq| ||j |j krd|j kr|Vg}q|r|VdS)NcSsg|] }|qSr )rstrip.0xr r r sz,Preprocessor.group_lines..rrr-r)rZclone splitlinesZxrangelenendswithjoinr5rrNrOrrar )r=r5rClinesijZ current_linerRr r r group_liness*     zPreprocessor.group_linescCstd}|t|kr*||j|jkr*|d7}q|d|=t|d}|dkrb||j|jkrb|d8}q@||dd=|Sr)rlrra)r=rQrpr r r tokenstrip0s    zPreprocessor.tokenstripc Csg}g}g}d}t|}d}||kr>||j|jkr>|d7}q||krd||jdkrd||dn ||j|djddggfS|d7}||kr`||}|jdkr|||d7}n|jdkr|d8}|dkr|r||||||d||fS||nD|jdkrL|dkrL|||||dg}n |||d7}q||j|djddggfS) Nrrr&zMissing '(' in macro argumentsr'rZr-zMissing ')' in macro arguments) rlrrar rOrXr<rrs) r=Z tokenlistargs positionsZ current_argZnestingZtokenlenrpr r r r collect_argsLsD            zPreprocessor.collect_argscCsg|_g|_g|_d}|t|jkr|j|j|jkrh|j|j|jkrh|j|j|j}|dkr|j|djdkrt |j||j|<|j |j|_|j|d=|j ||dfqn|dkr |j|djdkr |j d||df|j|d=qnZ|dt|jkrT|j|djdkrT|j d||f|d7}qn|j d||fn|j|jdkr|j r|dkr|j|djdkr|dt|jkr|j|dj|jkr|j|dj|j kr|j |d|d7}q|jjdd d d dS) NrrrrYrcerZcSs|dS)Nr )rhr r rr1r2z,Preprocessor.macro_prescan..T)keyreverse)patch str_patchvar_comma_patchrlr rr\r9indexcopyr`rOr:r;sort)r=macrorpargnumr r r macro_prescansB(   *( zPreprocessor.macro_prescanc Cs dd|jD}i}|jD]X\}}||krRdddd||Ddd||<t||||<||||_qd}|jr|d s|jD]}d||<d }qi}|jD]^\} }}| d kr|||||d <q| d kr||kr|||||<|||||d <q|rdd|D}|S)NcSsg|]}t|qSr rrgZ_xr r rrisz2Preprocessor.macro_expand_args..z"%s"rjcSsg|] }|jqSr r rfr r rrisrz\\Fr-TrcrrwcSsg|] }|r|qSr r rgZ_ir r rris) r r|rnreplacerr:r}r{ expand_macros) r=rrtrepZ str_expansionrrpZ comma_patchexpandedZptyper r rmacro_expand_argss.( zPreprocessor.macro_expand_argscCs|dkr i}d}|t|kr||}|j|jkr|j|jkr|j|krd||j<|j|j}|js|dd|jD|}|D] }|j|_q||||d<|t|7}n|d}|t|kr||j|jkr|d7}q||jdkr| ||d\} } } |j sTt| t|jkrT| |j |jd|jt|jf|| }n@|j rt| t|jdkrt|jdkr| |j |jd |jt|jdfn&| |j |jd |jt|jdf|| }n|j rLt| t|jdkr| gnD||| t|jd|| d| t|jd<| t|jd=||| } || |} | D]} |j| _qh| |||| <|t| 7}||j=qn"|jd kr|j|_||j|_|d7}q|S) NrTcSsg|]}t|qSr rrr r rrisz.Preprocessor.expand_macros..rr&zMacro %s requires %d argumentsrxz(Macro %s must have at least %d argumentsz'Macro %s must have at least %d argumentZ__LINE__)rlrr\r rDr9rrrarvr:rXr<rOrr^r_)r=rQrrpr mZexrwrqtokcountrtrurrr r rrs\    "  (&  4      zPreprocessor.expand_macroscCsNd}|t|kr||j|jkr||jdkr|d}d}d}|t|kr||j|jkrl|d7}qDnn||j|jkr||j|jkrd}nd}|sqn<||jdkrd}n(||jd krqn||j||jd |d7}qD|j ||_| |||_||d|d=|d7}q| |}t |D]\}}|j|jkrpt |||<|j ||_| d||_n`|j|j kr.t |||<t||j||_||jd d kr.||jdd ||_qq.d dd|D}|dd}|dd}|dd}z t|}Wn0tk rH||j|djdd}YnX|S)NrZdefinedrFZ0LZ1Lr&Tr'zMalformed defined()r-Z0123456789abcdefABCDEFrjcSsg|]}t|jqSr strr rfr r rriKsz)Preprocessor.evalexpr..z&&z and z||z or r(z not zCouldn't evaluate expression)rlrr\r rarDrXr<rr^r_r enumeraterrrnrevalZ StandardError)r=rQrprqZ needparenresultr exprr r revalexpr s^"            zPreprocessor.evalexprccst|}||}|sd}|d|||_g}d}d}g}|D],} t| D]\} } | j|jkrPqjqP| jdkrb| D]$} | j|jkrzd| jkrz|| qz| | | dd} | r| dj} | | dd}nd} g}| d kr|r`| |D] } | Vqg}||qp| d krz|r`| |D] } | Vq2g}|j d }| |D] } | VqX||j d <||_qp| d kr|r`| |D] } | Vqg}| |qp| d kr|||f|r`|dj|j krd}d}nd}qp| dkr8|||f|r`|dj|j kr0d}d}nd}qp| dkrv|||f|r`||}|spd}d}nd}n| dkr|r|ddr|rd}n|s||}|rd}d}n||j| djdn| dkr*|r|ddr(|rd}n|s(d}d}n||j| djdn6| dkrp|rH|\}}n||j| djdnqB|rB|| qB| |D] } | Vq|g}dS)Nrjz __FILE__ "%s"TFrrrrrJincludeZ__FILE__undefZifdefZifndefifelifr-zMisplaced #elifelsezMisplaced #elseZendifzMisplaced #endif)r6rrrJr<rrrar rOrsrrDrrrrXrpopextend)r=r5r<r rochunkZenableZ iftriggerZifstackrhrprRZ dirtokensr8rtZoldfilerr r rparsegen[s                         zPreprocessor.parsegenc cs|sdS|r|djdkr4|dj|jkr4||}|djdkrd}|t|krl||jdkrbqx|d7}qFtddSddd|d|D}|jdg|j}nB|dj|jkr|djdd }|jdg|j}n td dS|D]}t j||}zbt |d  }t j |}|r0|j d||||D] } | Vq<|rX|jd=WqWqtk rxYqXqtd |dS) Nrr)rr*zMalformed #include <...>rjcSsg|] }|jqSr rrfr r rrisz(Preprocessor.include..r-zMalformed #include statementrzCouldn't find '%s')r rr`rrlrTrnrErFosopenreaddirnameinsertrIOError) r=rQrpfilenamerEpZinamedataZdnamerRr r rrsF      zPreprocessor.includecCst|ttfr||}|}zz|d}t|dkr>|d}nd}|sbt|jg}||j|j<n4|j|j krt|j| |dd}||j|j<n|jdkr| |dd\}}}d} |D]} | rt dqd dd | D} | d kr$d } |j| d_d | d_d } | dd=qnb| d dd kr| dj|jkrd } | dd=| djd dd kr| djdd | d_qt| dks| dj|jkrt dqq| |d|d} d} | t| kr\| dt| krP| | j|j kr | | djdkr | | =qn0| | jdkrP| | dj|j krP| | d=| d7} qt|j| dd |D| }||||j|j<nt dWntk rt dYnXdS)Nrrrxr&Fz0No more arguments may follow a variadic argumentrjcSsg|]}t|jqSr rrr r rri)sz'Preprocessor.define..z...TZ __VA_ARGS__zInvalid macro argumentrYcSsg|]}|djqS)rrrfr r rriGszBad macro definition) isinstancerZunicoderSrlr7r rDrrarsrvrTrnr\r LookupError)r=rQZlinetokr8Zmtyperrrtrur:aZastrZmvaluerpr r rrJsl          $ &&    zPreprocessor.definecCs0|dj}z |j|=Wntk r*YnXdS)Nr)r rDr)r=rQidr r rrUs   zPreprocessor.undefcCs||_||||_dSrM)ignorerrL)r=r5r<rr r rparseaszPreprocessor.parsecCsDz"t|j}|j|jkr|WSqWntk r>d|_YdSXdSrM)nextrLrr StopIteration)r=rRr r rrNjs  zPreprocessor.token)N)N)N)r?r@rAr>rSrXrGrdrrrsrvrrrrrrrJrrrNr r r rrBs&  < !5+2 B; 1F  rB__main__r),Z __future__rrQliteralsrZ t_CPP_POUNDZ t_CPP_DPOUNDZt_CPP_IDrZ t_CPP_INTEGERZ t_CPP_FLOATrrrrrrerrHZos.pathrcompiler3r.r6objectr7rBr?Zply.lexrCrsysrargvfrr5rrrNrRrTr<r r r r sb    c