o w[e4@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#?abcdfeghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_u|ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞz Fz'"\" rTz();<>|&z~-./*?=) isinstancestrrinstreaminfilesysstdinposixeof commenters wordchars whitespacewhitespace_splitquotesescape escapedquotesstaterpushbacklinenodebugtoken filestacksource_punctuation_chars_pushback_chars maketransdictfromkeys translate)selfrrrpunctuation_charstr//usr/lib/python3.10/shlex.py__init__sL zshlex.__init__cCs|jSN)r&r,r/r/r0r-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/r0 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$r6rrr!r"r4)r, newstreamnewfiler/r/r0 push_sourceNs zshlex.push_sourcecCsD|j|j\|_|_|_|jrtd|j|jfd|_dS)zPop the input source stack.zshlex: popping to %s, line %drN) rcloser$popleftrr!r"r4rr3r/r/r0 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) r r=r"r4r5 read_tokenr% sourcehookr; get_tokenrr$r>)r,r7rawspecr:r9r/r/r0rAes4        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)NFrTr 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)rGrHz%shlex: I see whitespace in word statez&shlex: I see punctuation in word statezshlex: raw token=zshlex: raw token=EOF)r-r'poprreadr!r"r4rr#rrrreadlinerrrr ValueErrorrappendr r6r5)r,quoted escapedstatenextcharresultr/r/r0r?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,r:r/r/r0r@s  zshlex.sourcehookcCs(|dur|j}|dur|j}d||fS)zrAr?r@rYrZr\r/r/r/r0rs" /      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.rF) stacklevel)rTr )warningswarnDeprecationWarningrrrlist)scommentsrrclexr/r/r0r1s rcCsddd|DS)z3Return a shell-escaped string from *split_command*.rcss|]}t|VqdSr2)r).0argr/r/r0 @szjoin..)r) split_commandr/r/r0r>srz[^\w@%+=:,./-]cCs,|sdSt|dur |Sd|dddS)z1Return a shell-escaped version of the string *s*.z''N'z'"'"') _find_unsafereplace)rgr/r/r0rEs  rcCs$ |}|s dStdt|q)NrzToken: )rAr4r5)lexerttr/r/r0 _print_tokensQs rs__main__r)FT)r`rTrer collectionsrior__all__rrrcompileASCIIsearchrorrsr]lenargvfnrXfr/r/r/r0s.        "