o inh2@sJdZddlZddlZddlmZddlmZddlmZGdddZ dS)8A lexical analyzer class for simple shell-like syntaxes.N)deque)StringIO)Optionalc@sjeZdZdZdddZddZddd Zd d Zd d ZddZ ddZ dddZ ddZ ddZ e ZdS)shlexrNFcCs t|tr t|}|dur||_||_ntj|_d|_||_|r$d|_nd|_d|_ d|_ d|_ d|_ d|_ d|_d|_d |_t|_d |_d |_d|_t|_d|_|sXd}n|d ur^d }||_|r~t|_|j d7_ |j t|}|j ||_ d|_d|_dS)N#?abcdfeghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_z Fz'"\" rTz();<>|&z~-./*?=) isinstancestrrinstreaminfilesysstdinposixeof commenters wordchars whitespacewhitespace_splitquotesescape escapedquotesstaterpushbacklinenodebugtoken filestacksourcepunctuation_chars_pushback_chars maketransdictfromkeys translatelast_wordbreak_pos wordbreaks)selfrrrr$tr.F/usr/local/lib/python3.10/dist-packages/argcomplete/packages/_shlex.py__init__sJ  zshlex.__init__cCs*|jdkr tdt||j|dS)z:Push a token onto the stack popped by the get_token methodr zshlex: pushing token N)r printreprr appendleft)r,tokr.r.r/ push_tokenJs 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.r Nzshlex: pushing to file %szshlex: pushing to stream %s) rrrr"r3rrrr r1)r, newstreamnewfiler.r.r/ push_sourcePs zshlex.push_sourcecCsD|j|j\|_|_|_|jrtd|j|jfd|_dS)zPop the input source stack.zshlex: popping to %s, line %dr N) rcloser"popleftrrr r1rr,r.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)r zshlex: popping token Nz shlex: token=zshlex: token=EOF) rr:r r1r2 read_tokenr# sourcehookr8 get_tokenrr"r<)r,r4rawspecr7r6r.r.r/r?gs4        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 |_||jvrt|j d|_n||_ |j s|j r|rАnyq|j|jvr%d}|s|jd krtd td||jkr|j s|j |7_ d|_nKd |_nE|j r||jvr|j|jvr|j}||_n,|j |7_ n#|j|jvra|s=|jd kr9tdtd||jvrV||jkrV||krV|j |j7_ |j |7_ ||_n|jdvrH|snd|_n||j vr|jd kr~tdd|_|j s|j r|rnq||j vr|j |jd7_|j rd|_|j s|j r|rnqn|j r||jvr||_n|j r||jvrd }||_nu|jd kr||jvr|j |7_ na||j vr|j|d|_nR||jvs||jvs|jr|j |7_ ||jvrt|j d|_n+|jr(|j|n|j||jd kr8tdd|_|j sF|j rG|rGnqq|j }d|_ |j r]|s]|dkr]d}|jdkrs|rotdt|ntd|jdkr|d|_|S)NFr Tr  z&shlex: in state %r I see character: %rrz+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)rErFz%shlex: I see whitespace in word statez&shlex: I see punctuation in word statezshlex: raw token=zshlex: raw token=EOF)r$r%poprreadrr r1rr!rrrreadlinerrrrr+lenr* ValueErrorrappendrr3r2)r,quoted escapedstatenextcharresultr.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 r r) rrrospathisabsjoindirnameopen)r,r7r.r.r/r>s  zshlex.sourcehookcCs(|dur|j}|dur|j}d||fS)zrYr[r]nextr.r.r.r/rs 3   r) rarSr collectionsriortypingrrr.r.r.r/s