a d4@sdZddlZddlZddlZddlmZddlmZgdZGdddZ dd d Z d d Z e dej jZddZddZedkreejdkree n@ejdZeeZee eeWdn1s0YdS)8A lexical analyzer class for simple shell-like syntaxes.N)deque)StringIO)shlexsplitquotejoinc@sreZdZdZdddZeddZdd Zdd d Zd d Z ddZ ddZ ddZ dddZ ddZddZdS)rrNFcCst|trt|}|dur(||_||_ntj|_d|_||_|rHd|_nd|_d|_ d|_ |jrn|j d7_ d|_ d|_ d|_ d|_d |_d |_t|_d |_d |_d|_t|_d|_|sd}n |d urd}||_|rt|_|j d7_ |j t|}|j ||_ dS)N#?abcdfeghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_u|ßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞz Fz'"\" rTz();<>|&z~-./*?=) isinstancestrrinstreaminfilesysstdinposixeof commenters wordchars whitespacewhitespace_splitquotesescape escapedquotesstaterpushbacklinenodebugtoken filestacksource_punctuation_chars_pushback_chars maketransdictfromkeys translate)selfrrrpunctuation_charstr//usr/lib64/python3.9/shlex.py__init__sJ zshlex.__init__cCs|jSN)r&r,r/r/r0r-Dszshlex.punctuation_charscCs*|jdkrtdt||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_tokencCspt|trt|}|j|j|j|jf||_||_d|_|jrl|dur\t d|jfnt d|jfdS)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\|_|_|_|jr:td|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}|jdkr*tdt||S|}|jdurz||jkrz||}|rp|\}}|||| }q@||j kr|j s|j S| | }qz|jdkr||j krtdt|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) r r=r"r4r5 read_tokenr% sourcehookr; get_tokenrr$r>)r,r7rawspecr:r9r/r/r0rAes.          zshlex.get_tokencCsd}d}|jr |jr |j}n |jd}|dkrB|jd7_|jdkr^td|j|f|jdurtd|_ qq|jdkr|sd|_qq||j vr|jdkrtd |j s|j r|rqnqn||j vr|j |jd7_n|j r ||jvr d }||_n||jvr&||_ d |_nr||jvr@||_ d |_nX||jvrb|j sZ||_ ||_n6|jrx||_ d |_n ||_ |j s|j r|rqnqq|j|jvrDd }|s|jdkrtd td||jkr|j s|j |7_ d|_qnd |_n>|j r4||jvr4|j|jvr4|j}||_n|j |7_ q|j|jvr|st|jdkrltdtd||jvr||jkr||kr|j |j7_ |j |7_ ||_q|jdvr|sd|_qq||j vr|jdkrtdd|_|j s|j r|rqnqq||j vrh|j |jd7_|j rd|_|j s|j r|rqnqq|jd kr||jvr|j |7_ n"||j vr|j|d|_qq|j r||jvr||_q|j r||jvrd }||_q||jvs||jvs|jr,||jvr,|j |7_ q|jrB|j|n |j||jdkrbtdd|_|j s|j r|rqqqq|j }d|_ |j r|s|dkrd}|jdkr|rtdt|ntd|S)NFrr z&shlex: in state %r I see character: %rr z+shlex: I see whitespace in whitespace stateacTz 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|jtrHtj|sHtjtj|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|dur ddl}|jdtddt||d}d|_|s@zjoin..)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$|}|sq tdt|qdS)NzToken: )rAr4r5)lexerttr/r/r0 _print_tokensQsrt__main__r)FT)r`rTrer collectionsrior__all__rrrcompileASCIIsearchrprrtr]lenargvfnrXfr/r/r/r0s(