3 rãÆWõ‚ã @slddlmZddlZejjdkr*eefZneZeZ d3Z dZ dd„Z dZ dZdZdd„ZeZdZdd„Zdd„Zdd„Zdd„Zdd„ZddlZddlZddlZddlZejd ƒZd!d"d#d$d%d&d'd(d)d*œ Zd+d,„Z Gd-d.„d.e!ƒZ"Gd/d0„d0e!ƒZ#e$d1k�rhddl%j&Z&e&j&ƒZ'ddlZe(ej)d2ƒZ*e*j+ƒZ,e#e'ƒZ-e-j.e,ej)d2ƒx"e-j/ƒZ0e0�sVPe1e-j2e0ƒ�qFWdS)4é)Ú generatorsNéÚCPP_IDÚ CPP_INTEGERÚ CPP_FLOATÚ CPP_STRINGÚCPP_CHARÚCPP_WSÚ CPP_COMMENT1Ú CPP_COMMENT2Ú CPP_POUNDÚ CPP_DPOUNDz+-*/%|&~^<>=!?()[]{}.,;:\'"cCs|jj|jjdƒ7_|S)z\s+Ú )ÚlexerÚlinenoÚvalueÚcount)Út©rú/usr/lib/python3.6/cpp.pyÚt_CPP_WS!srz\#z\#\#z[A-Za-z_][\w_]*cCs|S)zA(((((0x)|(0X))[0-9a-fA-F]+)|(\d+))([uU][lL]|[lL][uU]|[uU]|[lL])?)r)rrrrr-sz?((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?cCs|jj|jjdƒ7_|S)z\"([^\\\n]|(\\(.|\n)))*?\"r)rrrr)rrrrÚ t_CPP_STRING7srcCs|jj|jjdƒ7_|S)z(L)?\'([^\\\n]|(\\(.|\n)))*?\'r)rrrr)rrrrÚ t_CPP_CHAR=srcCs8|jjdƒ}|jj|7_d|_|r.d|nd|_|S)z(/\*(.|\n)*?\*/)rr ú )rrrrÚtype)rZncrrrrÚt_CPP_COMMENT1Cs  rcCsd|_d|_dS)z (//.*?(\n|$))r rN)rr)rrrrÚt_CPP_COMMENT2LsrcCs(|jd|_|jd|_|jjdƒ|S)Nré)rrrÚskip)rrrrÚt_errorQs   rz\?\?[=/\'\(\)\!<>\-]ú#ú\ú^ú[ú]ú|ú{ú}ú~) ú=ú/ú'ú(ú)ú!ú<ú>ú-cCstjdd„|ƒS)NcSst|jƒdS)Nréÿÿÿÿ)Ú _trigraph_repÚgroup)ÚgrrrÚ{sztrigraph..)Ú _trigraph_patÚsub)ÚinputrrrÚtrigraphzsr:c@seZdZddd„ZdS)ÚMacroNFcCs0||_||_||_||_|r&|d|_d|_dS)Nrr2)ÚnamerÚarglistÚvariadicÚvarargÚsource)Úselfr<rr=r>rrrÚ__init__Žs zMacro.__init__)NF)Ú__name__Ú __module__Ú __qualname__rBrrrrr;�sr;c@s¨eZdZd&dd„Zdd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dd„Z d'dd„Z dd„Zd(dd„Zdd„Zdd„Zd d!„Zdifd"d#„Zd$d%„ZdS))Ú PreprocessorNcCsl|dkrtj}||_i|_g|_g|_|jƒtjƒ}|jdtj d|ƒƒ|jdtj d|ƒƒd|_ dS)Nz __DATE__ "%s"z%b %d %Yz __TIME__ "%s"z%H:%M:%S) ÚlexrÚmacrosÚpathÚ temp_pathÚlexprobeÚtimeZ localtimeÚdefineZstrftimeÚparser)rArZtmrrrrBŸszPreprocessor.__init__cCs4g}|jj|ƒx|jjƒ}|s"P|j|ƒqW|S)N)rr9ÚtokenÚappend)rAÚtextÚtokensÚtokrrrÚtokenizeµs  zPreprocessor.tokenizecCstd|||fƒdS)Nz%s:%d %s)Úprint)rAÚfileÚlineÚmsgrrrÚerrorÄszPreprocessor.errorc Csž|jjdƒ|jjƒ}| s&|jdkr0tdƒn|j|_|jjdƒ|jjƒ}| sbt|jƒdkrltdƒn|j|_t|jƒ|_ |jjdƒ|jjƒ}| s¦|jdkr°tdƒn|j|_ |jjdƒ|jjƒ}| sÞ|jdkræd|_ n|j|_ |jjd ƒ|jjƒ}| �s|jd k�r(d|_ td ƒn|j|_ |j |j f|_ d d d ddddddg }xD|D]<}|jj|ƒ|jjƒ}| �sˆ|j|k�rZtd|ƒ�qZWdS)NZ identifierz"Couldn't determine identifier typeZ12345i90zCouldn't determine integer typez "filename"zCouldn't determine string typez rz%Couldn't determine token for newlinesr/r0r z##r!r,r-ú,Ú.z,Unable to lex '%s' required for preprocessor)rr9rOrrUrÚt_IDÚintÚ t_INTEGERÚt_INTEGER_TYPEÚt_STRINGZt_SPACEZ t_NEWLINEÚt_WS)rArSÚcharsÚcrrrrKÐsD                  zPreprocessor.lexprobecCs|jj|ƒdS)N)rIrP)rArIrrrÚadd_path szPreprocessor.add_pathccsð|jjƒ}dd„|jƒDƒ}xhtt|ƒƒD]X}|d}xJ||jdƒr€|t|ƒkr€||dd…||||<d||<|d7}q8Wq*Wdj|ƒ}|j|ƒd|_g}x<|j ƒ}|s´P|j |ƒ|j |j kr¦d|j kr¦|Vg}q¦W|rì|VdS)NcSsg|] }|jƒ‘qSr)Úrstrip)Ú.0Úxrrrú sz,Preprocessor.group_lines..rr!Úrr2)rZcloneÚ splitlinesÚxrangeÚlenÚendswithÚjoinr9rrOrPrrar)rAr9rGÚlinesÚiÚjZ current_linerSrrrÚ group_liness,    zPreprocessor.group_linescCs|d}x(|t|ƒkr,||j|jkr,|d7}qW|d|…=t|ƒd}x$|dkrh||j|jkrh|d8}qFW||dd…=|S)Nrr)rlrra)rArRrprrrÚ tokenstrip9s    zPreprocessor.tokenstripc Csˆg}g}g}d}t|ƒ}d}x$||kr@||j|jkr@|d7}qW||krh||jdkrh|j|dƒn |j|j|djdƒdggfS|d7}xÖ||k�rf||}|jdkrÂ|j|ƒ|d7}nš|jdk�r|d8}|dk�r |rþ|j|j|ƒƒ|j|ƒ|d||fS|j|ƒnD|jdk�rR|dk�rR|j|j|ƒƒ|j|dƒg}n |j|ƒ|d7}q’W|j|j|djdƒdggfS) Nrrr,zMissing '(' in macro argumentsr-rZzMissing ')' in macro argumentsr2) rlrrarrPrYr@rrs) rAZ tokenlistÚargsÚ positionsZ current_argZnestingZtokenlenrprrrrÚ collect_argsUsD            zPreprocessor.collect_argscCsg|_g|_g|_d}�xè|t|jƒk�r|j|j|jkoL|j|j|jk�rh|jj|j|jƒ}|dkrÈ|j|djdkrÈt j |j|ƒ|j|<|j |j|_|j|d=|jj ||dfƒqnž|dkoâ|j|djdk�r |jj d||dfƒ|j|d=qnZ|dt|jƒk�rT|j|djdk�rT|jj d||fƒ|d7}qn|jj d||fƒnŽ|j|jdk�rö|j �rö|dk�rö|j|djdk�rö|dt|jƒk�rö|j|dj|jk�rö|j|dj|j k�rö|jj |dƒ|d7}qW|jjdd „d d �dS) Nrrr z##rcÚerZcSs|dS)Nér)rgrrrr6«sz,Preprocessor.macro_prescan..T)ÚkeyÚreverse)ÚpatchÚ str_patchÚvar_comma_patchrlrrr\r=ÚindexÚcopyr`rPr>r?Úsort)rAÚmacrorpÚargnumrrrÚ macro_prescanŠs:&  *(, zPreprocessor.macro_prescanc Cs0dd„|jDƒ}i}xb|jD]X\}}||krTddjdd„||Dƒƒjddƒ||<tj||ƒ||<||||_qWd}|jr¨|d r¨x|jD]}d||<d }q”Wi}xj|jD]`\} }}| d krÜ|||||d …<q´| d kr´||k�r|j||ƒ||<|||||d …<q´W|�r,d d„|Dƒ}|S)NcSsg|]}tj|ƒ‘qSr)r)rfÚ_xrrrrh·sz2Preprocessor.macro_expand_args..z"%s"ricSsg|] }|j‘qSr)r)rfrgrrrrh¾sr!z\\FrTrcrwcSsg|] }|r|‘qSrr)rfÚ_irrrrhÚsr2) rr|rnÚreplacerr>r}r{Ú expand_macros) rAr�rtÚrepZ str_expansionr‚rpZ comma_patchÚexpandedZptyperrrÚmacro_expand_argsµs.(  zPreprocessor.macro_expand_argscCsâ|dkr i}d}�xÊ|t|ƒk�rÜ||}|j|jk�rÒ|j|jkoL|j|k�r°d||j<|j|j}|jsº|jdd„|jDƒ|ƒ}x|D] }|j|_qŠW||||d…<|t|ƒ7}�nê|d}x(|t|ƒkrê||j|jkrê|d7}qÄW||jdk�r¤|j ||d…ƒ\} } } |j �r`t| ƒt|jƒk�r`|j |j |jd|jt|jƒfƒ|| }�nD|j �rèt| ƒt|jƒdk�rèt|jƒdk�r¸|j |j |jd |jt|jƒdfƒn&|j |j |jd |jt|jƒdfƒ|| }n¼|j �rXt| ƒt|jƒdk�r| j gƒnD||| t|jƒd|| d…| t|jƒd<| t|jƒd…=|j|| ƒ} |j| |ƒ} x| D]} |j| _�qvW| |||| …<|t| ƒ7}||j=qn"|jd k�rÒ|j|_|j|jƒ|_|d7}qW|S) NrTcSsg|]}tj|ƒ‘qSr)r)rfr„rrrrhõsz.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\rrHr=r‡rrarvr>rYr@rPrŠr^r_)rArRr‰rprÚmZexrwrqÚtokcountrtrurˆÚrrrrr‡çs\     "  (&  4      zPreprocessor.expand_macrosc Cs^d}�x|t|ƒk�r"||j|jko2||jdk�r|d}d}d}x¢|t|ƒkrè||j|jkrp|d7}qHnn||j|jkr¢||j|jkr–d}nd}|sÞPn<||jdkr¶d}n(||jd krÈPn|j|j||jd ƒ|d7}qHW|j ||_|j |ƒ||_||d|d…=|d7}qW|j |ƒ}x´t |ƒD]¨\}}|j|jk�rzt j |ƒ||<|j ||_|j dƒ||_nd|j|j k�r8t j |ƒ||<t||jƒ||_x2||jdd k�rÜ||jdd…||_�q¬W�q8Wd jd d„|Dƒƒ}|jddƒ}|jddƒ}|jddƒ}y t|ƒ}Wn0tk �rX|j|j|djdƒd}YnX|S)NrZdefinedrFZ0LZ1Lr,Tr-zMalformed defined()Z0123456789abcdefABCDEFricSsg|]}t|jƒ‘qSr)Ústrr)rfrgrrrrhTsz)Preprocessor.evalexpr..z&&z and z||z or r.z not zCouldn't evaluate expressionr2r2)rlrr\rrarHrYr@rr^r_r‡Ú enumeraterrŽrnr†ÚevalÚ Exception)rArRrprqZ needparenÚresultrÚexprrrrÚevalexpr)s^      $     zPreprocessor.evalexprccs´t|ƒ}|j|ƒ}|sd}|jd|ƒ||_g}d}d}g}�xN|D�]D} x"t| ƒD]\} } | j|jkrVPqVW| jdk�r~x,| D]$} | j|jkr‚d| jkr‚|j| ƒq‚W|j | | dd…ƒ} | râ| dj} |j | dd…ƒ}nd} g}| d k�r(|�r|x|j |ƒD] } | V�qWg}|j|ƒ�qŒ| d k�r’|�r|x|j |ƒD] } | V�qDWg}|j d }x|j |ƒD] } | V�qnW||j d <||_�qŒ| d k�rÐ|�r|x|j |ƒD] } | V�q®Wg}|j |ƒ�qŒ| d k�r|j||fƒ|�r||dj|j k�r d}d}nd}�qŒ| dk�rT|j||fƒ|�r||dj|j k�rLd}d}nd}�qŒ| dk�r’|j||fƒ|�r||j|ƒ}|�sŒd}d}nd}nê| dk�rô|�rÜ|dd�rò|�r¼d}n|�sò|j|ƒ}|�ròd}d}n|j|j| djdƒnˆ| dk�rF|�r.|dd�rD|�rd}n|�sDd}d}n|j|j| djdƒn6| dk�rŒ|�rd|jƒ\}}n|j|j| djdƒnqF|rF|j| ƒqFWx|j |ƒD] } | V�qœWg}dS)Nriz __FILE__ "%s"TFr rrrrMÚincludeZ__FILE__ÚundefZifdefZifndefÚifÚelifzMisplaced #elifÚelsezMisplaced #elseZendifzMisplaced #endifr2r2)r:rrrMr@r�rrarrPrsr‡rHr•r–r”rYrÚpopÚextend)rAr9r@rroÚchunkÚenableZ iftriggerZifstackrgrprSZ dirtokensr<rtZoldfiler’rrrÚparsegendsÄ                        zPreprocessor.parsegenc cs’|sdS|rî|djdkr4|dj|jkr4|j|ƒ}|djdkr¬d}x4|t|ƒkrn||jdkrdP|d7}qHWtdƒdSdjdd„|d|…Dƒƒ}|jdg|j}nB|dj|jkrâ|djdd …}|jdg|j}n td ƒdSxž|D]Š}t jj||ƒ}y`t |d ƒj ƒ}t jj |ƒ}|�r6|jj d|ƒx|j||ƒD] } | V�qDW|�rb|jd=PWqôtk �r|YqôXqôWtd |ƒdS) Nrr/rr0zMalformed #include <...>ricSsg|] }|j‘qSr)r)rfrgrrrrhùsz(Preprocessor.include..zMalformed #include statementr�zCouldn't find '%s'r2)rrr`r‡rlrUrnrIrJÚosÚopenÚreadÚdirnameÚinsertržÚIOError) rArRrpÚfilenamerIÚpZinameÚdataZdnamerSrrrr•çsF      zPreprocessor.includec Csºt|tƒr|j|ƒ}|}�y||d}t|ƒdkr:|d}nd}|s^t|jgƒ}||j|j<�n6|j|jkr”t|j|j |dd…ƒƒ}||j|j<�n|jdk�rŒ|j |dd…ƒ\}}}d} �xÔ|D]æ} | rÖt dƒPdj dd „| Dƒƒ} | d k�r d } |j | d_d | d_d } | dd…=qÄnb| dd…d k�r‚| dj|j k�r‚d } | dd…=| djdd…d krÄ| djdd…| d_qÄt| ƒdk�s | dj|j krÄt dƒPqÄW|j |d|d…ƒ} d} x�| t| ƒk�rX| dt| ƒk�rL| | j|jk�r| | djdk�r| | =�qÊn0| | jdk�rL| | dj|jk�rL| | d=| d7} �qÊWt|j| dd „|Dƒ| ƒ}|j|ƒ||j|j<nt dƒWntk �r´t dƒYnXdS)Nrrrxr,Fz0No more arguments may follow a variadic argumentricSsg|]}t|jƒ‘qSr)rŽr)rfr…rrrrh2sz'Preprocessor.define..z...TZ __VA_ARGS__rzInvalid macro argumentz##cSsg|]}|dj‘qS)r)r)rfrgrrrrhPszBad macro definitionéýÿÿÿr¨r¨)Ú isinstanceÚ STRING_TYPESrTrlr;rrHrrarsrvrUrnr\rƒÚ LookupError)rArRZlinetokr<Zmtyper‹rŒrtrur>ÚaZastrZmvaluerprrrrMsl            $ &&   zPreprocessor.definec Cs0|dj}y |j|=Wntk r*YnXdS)Nr)rrHr«)rArRÚidrrrr–^s   zPreprocessor.undefcCs||_|j||ƒ|_dS)N)ÚignoreržrN)rAr9r@r®rrrÚparsejszPreprocessor.parsec CsDy$xt|jƒ}|j|jkr|SqWWntk r>d|_dSXdS)N)ÚnextrNrr®Ú StopIteration)rArSrrrrOss  zPreprocessor.token)N)N)N)rCrDrErBrTrYrKrdrrrsrvrƒrŠr‡r”ržr•rMr–r¯rOrrrrrFžs&  < !5+2 B; 1F  rFÚ__main__r) rrrrrr r r r r )3Z __future__rÚsysÚ version_infoÚmajorrŽZunicoderªÚrangerkrRÚliteralsrZ t_CPP_POUNDZ t_CPP_DPOUNDZt_CPP_IDrZ t_CPP_INTEGERZ t_CPP_FLOATrrrrrÚrerrLZos.pathrŸÚcompiler7r3r:Úobjectr;rFrCZply.lexrGrr ÚargvÚfr¡r9r¦r¯rOrSrUr@rrrrÚ sl     c