o ?Og4@sdZddlZddlZddlZddlmZddlmZgdZGdddZ dd d Z d d Z e dej jZddZddZedkrseejdkrPee dSejdZeeZee eeWddS1slwYdSdS)8A lexical analyzer class for simple shell-like syntaxes.N)deque)StringIO)shlexsplitquotejoinc@sveZdZdZ  dddZeddZdd Zdd d Zd d Z ddZ ddZ ddZ dddZ ddZddZdS)rrNFcCst|tr t|}|dur||_||_ntj|_d|_||_|r$d|_nd|_d|_ d|_ |jr7|j d7_ d|_ d|_ d|_ d|_d |_d |_t|_d |_d |_d|_t|_d|_|sbd}n|d urhd}||_|rt|_|j d7_ |j t|}|j ||_ dSdS)N#Z?abcdfeghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_u|ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞz Fz'"\" rTz();<>|&z~-./*?=) isinstancestrrinstreaminfilesysstdinposixeof commenters wordchars whitespacewhitespace_splitquotesescape escapedquotesstaterpushbacklinenodebugtoken filestacksource_punctuation_chars_pushback_chars maketransdictfromkeys translate)selfrrrpunctuation_charstr.,/opt/alt/python310/lib64/python3.10/shlex.py__init__sL zshlex.__init__cCs|jSN)r%r+r.r.r/r,Dszshlex.punctuation_charscCs*|jdkr tdt||j|dS)z:Push a token onto the stack popped by the get_token methodrzshlex: pushing token N)r!printreprr appendleft)r+tokr.r.r/ push_tokenHs zshlex.push_tokencCsvt|tr t|}|j|j|j|jf||_||_d|_|jr9|dur/t d|jfdSt d|jfdSdS)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+ newstreamnewfiler.r.r/ push_sourceNs zshlex.push_sourcecCsD|j|j\|_|_|_|jrtd|j|jfd|_dS)zPop the input source stack.zshlex: popping to %s, line %dr N) rcloser#popleftrr r!r3rr2r.r.r/ pop_source\s   zshlex.pop_sourcecCs|jr|j}|jdkrtdt||S|}|jdurA||jkrA||}|r8|\}}|||| }||jks%||j krY|j sL|j S| | }||j ksF|jdkrq||j krmtdt||Std|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+r6rawspecr9r8r.r.r/r@es4        zshlex.get_tokencCsd}d} |jr|jr|j}n|jd}|dkr"|jd7_|jdkr0td|j|f|jdur:d|_ n|jdkr|sFd|_n||j vr_|jd krTtd |j s\|j r^|r^nq||j vrr|j |jd7_n|j r||jvrd }||_n||jvr||_ d |_n||jvr||_ d |_n||jvr|j s||_ ||_n|jr||_ d |_n|||_ |j s|j r|rÐnpq|j|jvrd}|s|jd krtd td||jkr|j s|j |7_ d|_nCd |_n=|j r||jvr|j|jvr|j}||_n$|j |7_ n|j|jvrS|s/|jd kr+tdtd||jvrH||jkrH||krH|j |j7_ |j |7_ ||_n|jdvr2|s`d|_n||j vr|jd krptdd|_|j s~|j r|rnq||j vr|j |jd7_|j rd|_|j s|j r|rnqn|jd kr||jvr|j |7_ nw||j vr|j|d|_nh|j r||jvr||_nY|j r||jvrd }||_nI||jvs||jvs|jr||jvr|j |7_ n+|jr|j|n|j||jd kr"tdd|_|j s0|j r1|r1nqq|j }d|_ |j rG|sG|dkrGd}|jdkr^|rZtdt||Std|S)NFr Tr z&shlex: in state %r I see character: %rr z+shlex: I see whitespace in whitespace stateacz 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&poprreadr r!r3rr"rrrreadlinerrrr ValueErrorrappendrr5r4)r+ZquotedZ escapedstateZnextcharresultr.r.r/r>s                                     zshlex.read_tokencCsV|ddkr |dd}t|jtr$tj|s$tjtj|j|}|t|dfS)z(Hook called on a filename to be sourced.rr rr) rrrospathisabsrdirnameopen)r+r9r.r.r/r?s  zshlex.sourcehookcCs(|dur|j}|dur|j}d||fS)zr?rUrVrXr.r.r.r/rs" /      rFTcCsD|durddl}|jdtddt||d}d|_|sd|_t|S) z-Split the string *s* using shell-like syntax.Nrz4Passing None for 's' to shlex.split() is deprecated.rE) stacklevel)rTr )warningswarnDeprecationWarningrrrlist)sZcommentsrr_Zlexr.r.r/r1s rcCsddd|DS)z3Return a shell-escaped string from *split_command*.r css|]}t|VqdSr1)r).0argr.r.r/ @szjoin..)r)Z split_commandr.r.r/r>srz[^\w@%+=:,./-]cCs,|sdSt|dur |Sd|dddS)z1Return a shell-escaped version of the string *s*.z''N'z'"'"') _find_unsafereplace)rcr.r.r/rEs  rcCs$ |}|s dStdt|q)NrzToken: )r@r3r4)ZlexerZttr.r.r/ _print_tokensQs rj__main__r)FT)r\rPrer collectionsrior__all__rrrcompileASCIIsearchrhrrjrYlenargvfnrTfr.r.r.r/s.        "