U e5d 4ã @sÒdZddlZddlZddlZddlmZddlmZddddgZGd d„dƒZ dd d„Z d d„Z e  dej ¡jZdd„Zdd„ZedkrÎeejƒdkr¢ee ƒƒn,ejdZeeƒ�Zee eeƒƒW5QRXdS)ú8A lexical analyzer class for simple shell-like syntaxes.éN)Údeque)ÚStringIOÚshlexÚsplitÚquoteÚjoinc@sreZdZdZddd„Zedd„ƒZdd „Zdd d „Zd d „Z dd„Z dd„Z dd„Z ddd„Z dd„Zdd„ZdS)rrNFcCst|tƒrt|ƒ}|dk r(||_||_ntj|_d|_||_|rHd|_nd|_d|_ d|_ |jrn|j d7_ d|_ d|_ d|_ d|_d |_d |_tƒ|_d |_d |_d|_tƒ|_d|_|sÄd}n |d krÐd}||_|�rtƒ|_|j d7_ |j  t |¡¡}|j  |¡|_ dS)NÚú#Z?abcdfeghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_u|ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿÀÃ�ÂÃÄÅÆÇÈÉÊËÌÃ�ÃŽÃ�Ã�ÑÒÓÔÕÖØÙÚÛÜÃ�Þz Fz'"ú\ú"ú érTz();<>|&z~-./*?=)Ú isinstanceÚstrrÚinstreamÚinfileÚsysÚstdinÚposixÚeofÚ commentersÚ wordcharsÚ whitespaceÚwhitespace_splitÚquotesÚescapeÚ escapedquotesÚstaterÚpushbackÚlinenoÚdebugÚtokenÚ filestackÚsourceÚ_punctuation_charsÚ_pushback_charsÚ maketransÚdictÚfromkeysÚ translate)ÚselfrrrÚpunctuation_charsÚt©r.ú/usr/lib64/python3.8/shlex.pyÚ__init__sJ zshlex.__init__cCs|jS©N)r%©r+r.r.r/r,Dszshlex.punctuation_charscCs*|jdkrtdt|ƒƒ|j |¡dS)z:Push a token onto the stack popped by the get_token methodrzshlex: pushing token N)r!ÚprintÚreprrÚ appendleft)r+Útokr.r.r/Ú push_tokenHs zshlex.push_tokencCspt|tƒrt|ƒ}|j |j|j|jf¡||_||_d|_|jrl|dk r\t d|jfƒnt d|jfƒdS)z9Push an input source onto the lexer's input source stack.rNzshlex: pushing to file %szshlex: pushing to stream %s) rrrr#r5rrr r!r3)r+Ú newstreamÚnewfiler.r.r/Ú push_sourceNs zshlex.push_sourcecCsD|j ¡|j ¡\|_|_|_|jr:td|j|jfƒd|_dS)zPop the input source stack.zshlex: popping to %s, line %dr N) rÚcloser#Úpopleftrr r!r3rr2r.r.r/Ú pop_source\s  ÿzshlex.pop_sourcecCsÔ|jr.|j ¡}|jdkr*tdt|ƒƒ|S| ¡}|jdk rz||jkrz| | ¡¡}|rp|\}}| ||¡|  ¡}q@||j kr¢|j s�|j S|  ¡|  ¡}qz|jdkrÐ||j krÈtdt|ƒƒntdƒ|S)zBGet a token from the input stream (or from stack if it's nonempty)rzshlex: popping token Nz shlex: token=zshlex: token=EOF) rr<r!r3r4Ú read_tokenr$Ú sourcehookr:Ú get_tokenrr#r=)r+r6ÚrawÚspecr9r8r.r.r/r@es.          zshlex.get_tokencCsÜd}d}|jr |jr |j ¡}n |j d¡}|dkrB|jd7_|jdkr^td|j|fƒ|jdkrtd|_ �q„q|jdk�rš|s’d|_�q„�q‚||j krÈ|jdkr®td ƒ|j s¾|j r|r�q„nqnÐ||j krì|j  ¡|jd7_n¬|j �r ||jk�r d }||_nŒ||jk�r&||_ d |_nr||jk�r@||_ d |_nX||jk�rb|j �sZ||_ ||_n6|j�rx||_ d |_n ||_ |j �s„|j r|r�q„nqq|j|jk�rDd }|�sÎ|jdk�rÆtd ƒtdƒ‚||jk�r|j �sü|j |7_ d|_�q„nd |_n>|j �r4||jk�r4|j|jk�r4|j}||_n|j |7_ q|j|jk�r¼|�st|jdk�rltdƒtdƒ‚||jk�r¦||jk�r¦||k�r¦|j |j7_ |j |7_ ||_q|jdkr|�sØd|_�q„q||j k�r|jdk�røtdƒd|_|j �s„|j r|r�q„nqq||j k�rh|j  ¡|jd7_|j �r‚d|_|j �s„|j r|r�q„nqq|jd k�r´||jk�r�|j |7_ n"||j k�r¨|j |¡d|_�q„q|j �rÐ||jk�rÐ||_q|j �rð||jk�rðd }||_q||jk�s||jk�s|j�r,||jk�r,|j |7_ q|j�rB|j |¡n |j |¡|jdk�rbtdƒd|_|j �s„|j r|r�q„qqq|j }d|_ |j �r¬|�s¬|dk�r¬d}|jdk�rØ|�rÐtdt|ƒƒntdƒ|S)NFr rÚ éz&shlex: in state %r I see character: %rr éz+shlex: I see whitespace in whitespace stateÚaÚcTz shlex: I see EOF in quotes statezNo closing quotationz shlex: I see EOF in escape statezNo escaped character)rFrGz%shlex: I see whitespace in word statez&shlex: I see punctuation in word statezshlex: raw token=zshlex: raw token=EOF)r,r&ÚpoprÚreadr r!r3rr"rrrÚreadlinerrrrÚ ValueErrorrÚappendrr5r4)r+ZquotedZ escapedstateZnextcharÚresultr.r.r/r>…s     ÿ           ÿ  ÿÿ         ÿþ   zshlex.read_tokencCsV|ddkr|dd…}t|jtƒrHtj |¡sHtj tj |j¡|¡}|t|dƒfS)z(Hook called on a filename to be sourced.rr réÿÿÿÿÚr) rrrÚosÚpathÚisabsrÚdirnameÚopen)r+r9r.r.r/r?s   zshlex.sourcehookcCs(|dkr|j}|dkr|j}d||fS)zr?rUrVrXr.r.r.r/rs ÿ /     FTcCs$t||d�}d|_|sd|_t|ƒS)z-Split the string *s* using shell-like syntax.)rTr )rrrÚlist)ÚsZcommentsrZlexr.r.r/r1s  cCsd dd„|Dƒ¡S)z3Return a shell-escaped string from *split_command*.r css|]}t|ƒVqdSr1)r)Ú.0Úargr.r.r/Ú <szjoin..)r)Z split_commandr.r.r/r:sz[^\w@%+=:,./-]cCs,|sdSt|ƒdkr|Sd| dd¡dS)z1Return a shell-escaped version of the string *s*.z''Nú'z'"'"')Ú _find_unsafeÚreplace)r_r.r.r/rAs  cCs$| ¡}|sq tdt|ƒƒqdS)NzToken: )r@r3r4)ZlexerZttr.r.r/Ú _print_tokensMsrfÚ__main__r)FT)r\rPÚrerÚ collectionsrÚiorÚ__all__rrrÚcompileÚASCIIÚsearchrdrrfrYÚlenÚargvÚfnrTÚfr.r.r.r/Ús(