
    #hY,                        S r SSKJr  SSKrSSKJrJr  SSKJr  SSK	J
r
  SSKJr  SS	KJrJrJrJrJrJr  SS
KJr  SSKJrJrJr  SSKJrJr  \R:                  " S5      r\r " S S\5      r g)a
  
The Buffer class provides the functionality required by a parser-driven lexer.

Line analysis and caching are done so the parser can freely move with goto(p)
to any position in the parsed text, and still recover accurate information
about source lines and content.
    )annotationsN)repeat	takewhile)Path)Any   )
ParseError)CommentInfoLineIndexInfoLineInfoParserConfigPosLineUndefinedStr)	Tokenizer)contains_sublistextend_listidentity)cached_re_compilematch_to_findz(?m)\s+c                  "  ^  \ rS rSr S;   S<U 4S jjjr\S 5       r\S 5       r\S 5       r\	S 5       r
S rS rS	 rS
 rS rS rS rS rS rS r\S 5       r\R,                  S 5       r\S 5       r\S 5       rS;S jrS;S jrS rS r\S 5       rS rS=S jrS r S r!S r"S>S jr#S  r$S! r%S" r&S# r'S$ r(S% r)S& r*S' r+S( r,S) r-S* r.S+ r/S, r0S?S- jr1S. r2S/ r3S0 r4\S1 5       r5S;S2 jr6S3 r7S4 r8S;S5 jr9S@S6 jr:SAS7 jr;S8 r<S;S9 jr=S:r>U =r?$ )BBuffer&   c               D  > [         TU ]  5         [        R                  " SX S.UD6nX l        [        U5      nU=U l        U l        U R                  UR                  5      U l
        UR                  b  UR                  O0[        U R                  5      =(       d    [        UR                  5      U l        [        UR                  5      U l        SU l        SU l        SU l        / U l        / U l        / U l        / U l        U R/                  5         U R1                  5         g )N)configownerr    )super__init__r   newr   strtextoriginal_textbuild_whitespace_re
whitespacewhitespace_re	nameguardbool	namecharsset_namechar_set_pos_len
_linecount_lines_line_index_line_cache_comment_index_preprocess_postprocess)selfr!   r   settings	__class__s       O/Users/user/Downloads/htwk/venv/lib/python3.13/site-packages/tatsu/buffering.pyr   Buffer.__init__(   s     	!!HHxH4y)--	D&!55f6G6GH + d(()CT&2B2B-C 	
 !!1!12		!#02*,13    c                .    U R                   R                  $ N)r   filenamer4   s    r7   r<   Buffer.filenameE   s    {{###r9   c                .    U R                   R                  $ r;   )r   
ignorecaser=   s    r7   r@   Buffer.ignorecaseI       {{%%%r9   c                .    U R                   R                  $ r;   )r   r$   r=   s    r7   r$   Buffer.whitespaceM   rB   r9   c                    [        U 5      [        L a  [        $ U S;   a  g [        U [        R
                  5      (       a  U $ U (       a  [        U 5      $ g )N>   N )typer   DEFAULT_WHITESPACE_RE
isinstancerePatternr   )r$   s    r7   r#   Buffer.build_whitespace_reQ   sH    
|+((#
BJJ//$Z00r9   c                    U R                  U R                  U R                  5      u  p4X0l        X@l        U R                  U5      U l        g r;   )_preprocess_blockr<   r!   r.   r/   join_block_lines)r4   argskwargslinesindexs        r7   r2   Buffer._preprocess^   s;    --dmmTYYG ))%0	r9   c                    [         R                  " U R                  5      u  pXl        X l        [        U R                  5      U l        g r;   )r   build_line_cacher.   r0   r-   lenr!   r,   )r4   cachecounts      r7   r3   Buffer._postprocessd   s2    //< 		N	r9   c                    U R                  U5      n[        R                  " U[        U5      5      nU R                  " XU40 UD6$ r;   )split_block_linesr   block_indexrW   process_block)r4   nameblockrQ   rR   rS   s         r7   rN   Buffer._preprocess_blockj   s@    &&u-))$E
;!!$u???r9   c                $    UR                  S5      $ )NT)
splitlines)r4   r`   s     r7   r\   Buffer.split_block_lineso   s    %%r9   c                $    SR                  U5      $ )NrF   )join)r4   rR   s     r7   rO   Buffer.join_block_linesr   s    wwu~r9   c                    X#4$ r;   r   )r4   r_   rR   rS   rQ   s        r7   r^   Buffer.process_blocku   s
    |r9   c                    U R                   " XV40 UD6u  p[        U5      [        U	5      :X  d   eXX4& XX4& [        U5      [        U5      :X  d   eU[        U5      -   S-
  $ Nr   )rN   rW   )
r4   rR   rS   ijr_   r`   rQ   blinesbindexs
             r7   includeBuffer.includex   sf    //FvF6{c&k)))a
a
5zSZ'''3v;""r9   c                N    U R                  X5      u  pxU R                  X4XVX5      $ r;   )get_includerp   )	r4   sourcer_   rR   rS   rl   rm   r!   r<   s	            r7   include_fileBuffer.include_file   s'    ))&7||E!??r9   c                   [        U5      R                  5       nUR                  nX2-  n UR                  5        nUR	                  5       U4sS S S 5        $ ! , (       d  f       g = f! [
         a  n[        SU 35      UeS nAff = f)Nzinclude not found: )r   resolveparentopenreadOSErrorr	   )r4   rt   r<   baserp   fes          r7   rs   Buffer.get_include   ss    f%%'}}/	E1vvx(   	E27)<=1D	Es4   A( A	A( 
A%!A( %A( (
B2BBc                   U R                  U R                  5      n[        U R                  5      nU R	                  XVXX45      nU R                  U5      U l        X`l        U R                  5         U R                  XRS-   US-    5      nXx4$ )Nr      )r\   r!   listr/   rp   rO   r3   )	r4   rl   rm   r_   r`   rR   rS   endlinenewtexts	            r7   replace_linesBuffer.replace_lines   s    &&tyy1T%%&,,uQ4?))%0	 ''!eWq[(ABr9   c                    U R                   $ r;   )r+   r=   s    r7   pos
Buffer.pos   s    yyr9   c                &    U R                  U5        g r;   )gotor4   ps     r7   r   r      s    		!r9   c                "    U R                  5       $ r;   )posliner=   s    r7   lineBuffer.line   s    ||~r9   c                "    U R                  5       $ r;   )poscolr=   s    r7   col
Buffer.col   s    {{}r9   c                R    Uc  U R                   nU R                  U   R                  $ r;   )r+   r0   r   r4   r   s     r7   r   Buffer.posline   s'    ;))C$)))r9   c                Z    Uc  U R                   nU R                  U   R                  nX-
  $ r;   )r+   r0   start)r4   r   r   s      r7   r   Buffer.poscol   s.    ;))C  %++{r9   c                4    U R                   U R                  :  $ r;   )r+   r,   r=   s    r7   atendBuffer.atend   s    yyDII%%r9   c                N    U R                  5       =(       d    U R                  S;   $ )Nz
)r   currentr=   s    r7   ateolBuffer.ateol   s    zz|5t||v55r9   c                j    U R                   U R                  :  a  g U R                  U R                      $ r;   )r+   r,   r!   r=   s    r7   r   Buffer.current   s(    99		!yy##r9   c                @    XR                   :  a  g U R                  U   $ r;   )r,   r!   r   s     r7   at	Buffer.at   s    		>yy|r9   c                >    U R                  U R                  U-   5      $ r;   )r   r+   r4   ns     r7   peekBuffer.peek   s    wwtyy1}%%r9   c                    U R                  5       (       a  g U R                  U R                     nU =R                  S-  sl        U$ rk   )r   r!   r+   r4   cs     r7   nextBuffer.next   s4    ::<<IIdii 		Q	r9   c                `    [        S[        [        U R                  5      U5      5      U l        g )Nr   )maxminrW   r!   r+   r   s     r7   r   Buffer.goto   s    3s499~s34	r9   c                @    U R                  U R                  U-   5        g r;   )r   r   r   s     r7   moveBuffer.move   s    		$((Q,r9   c                   U R                   R                  (       a  U R                  (       d  [        / / 5      $ U R	                  U5      nU[        U R                  5      :  a  [        / / 5      $ / nU[        U R                  5      :  a4  U R                  U   R                  nU(       a  / U R                  U   l        / nUS:  a  U R                  U   R                  (       ao  UR                  SU R                  U   R                  5        U(       a  / U R                  U   l        US-  nUS:  a   U R                  U   R                  (       a  Mo  [        XT5      $ Nr   r   )	r   comment_recoveryr1   r
   r   rW   eolinlineinsert)r4   r   clearr   eolcmmcmms         r7   commentsBuffer.comments   s   {{++43F3Fr2&&LLOD''((r2&&s4&&''((+//F-/##A&*1f,,Q/66JJq$--a077802##A&-FA	 1f,,Q/666 3''r9   c                   U(       a  U R                   R                  (       ag  U R                  n[        U R                  U[
        R                  S9  U" U R                  U   5      n[        XA5      (       d  UR                  U5        g g g g )N)default)	r   r   r   r   r1   r
   new_commentr   extend)r4   r   selectorr   previouss        r7   _index_commentsBuffer._index_comments   sv    44		A##Q0G0G   3 3A 67H#  ) 58r9   c                t    U(       d  g U R                  U5      (       a   U R                  U5      (       a  M  g g r;   )_matchre_fastr4   regexs     r7   
_eat_regexBuffer._eat_regex   s/      ''   ''r9   c                    U(       d  / $ [        U5      n[        [        [        [	        U R
                  [        U5      5      5      5      $ r;   )r   r   r   r   mapmatchrer   r   s     r7   _eat_regex_listBuffer._eat_regex_list   s5    I!%(IhDLL&-(HIJJr9   c                8    U R                  U R                  5      $ r;   )r   r%   r=   s    r7   eat_whitespaceBuffer.eat_whitespace  s    t1122r9   c                t    U R                  U R                  R                  5      nU R                  US 5        g )Nc                    U R                   $ r;   )r   xs    r7   <lambda>%Buffer.eat_comments.<locals>.<lambda>  s    r9   )r   r   r   r   r4   r   s     r7   eat_commentsBuffer.eat_comments	  s-    ''(<(<=X'9:r9   c                t    U R                  U R                  R                  5      nU R                  US 5        g )Nc                    U R                   $ r;   )r   r   s    r7   r   )Buffer.eat_eol_comments.<locals>.<lambda>  s    r9   )r   r   eol_commentsr   r   s     r7   eat_eol_commentsBuffer.eat_eol_comments  s,    ''(@(@AX7r9   c                    S nU R                   U:w  aO  U R                   nU R                  5         U R                  5         U R                  5         U R                   U:w  a  MN  g g r;   )r+   r   r   r   r   s     r7   
next_tokenBuffer.next_token  sL    ii1n		A!!#!	 ii1nr9   c                    U R                   nU R                  nX#:  a2  U R                  U   U:w  a  US-  nX#:  a  U R                  U   U:w  a  M  U R                  U5        U R                  $ rk   )r+   r,   r!   r   r   )r4   r   r   les       r7   skip_toBuffer.skip_to  s[    IIYYf1*FA f1*		!xxr9   c                \    U R                  U5        U R                  5         U R                  $ r;   )r   r   r   r   s     r7   	skip_pastBuffer.skip_past!  s    Q		xxr9   c                $    U R                  S5      $ )N
)r   r=   s    r7   skip_to_eolBuffer.skip_to_eol&  s    ||D!!r9   c                b    U R                   =(       a    U R                  U R                   5      S L$ r;   )r%   _scanrer=   s    r7   
scan_spaceBuffer.scan_space)  s)    O4<<0B0B#C4#O	
r9   c                "    U R                  5       $ r;   )r   r=   s    r7   is_spaceBuffer.is_space.  s      r9   c                b    US L=(       a%    UR                  5       =(       d    XR                  ;   $ r;   )isalnumr*   r   s     r7   is_name_charBuffer.is_name_char1  s%    }I!))+"H6H6H1HIr9   c                f  ^  Uc  T R                  5       $ T R                  nT R                  (       a:  T R                  X"[	        U5      -    R                  5       UR                  5       :H  nOT R                  X"[	        U5      -    U:H  nU(       d  g T R                  [	        U5      5        T R                  =(       aZ    U=(       aQ    US   R                  5       =(       a7    T R                  T R                  5      =(       a    [        U 4S jU 5       5      nU(       a  T R                  U5        g U$ )Nr   c              3  F   >#    U  H  nTR                  U5      v   M     g 7fr;   )r  ).0tr4   s     r7   	<genexpr>Buffer.match.<locals>.<genexpr>G  s     8%QD%%a((%s   !)r   r   r@   r!   rW   lowerr   r&   isalphar  r   allr   )r4   tokenr   is_matchpartial_matchs   `    r7   matchBuffer.match4  s    =::<HH??yyE
N399;u{{}LHyyE
N3u<H		#e*NN 99a  "9 !!$,,/9 8%88 	 IIaLr9   c                    U R                  U5      =n(       d  g U R                  [        UR                  5       5      5        g r;   )r   r   rW   group)r4   patternr  s      r7   r   Buffer._matchre_fastO  s0    g...		#ekkm$%r9   c                    U R                  U5      =n(       d  g UR                  5       n[        U5      nU R                  [	        U5      5        U$ r;   )r   r  r   r   rW   )r4   r  r  matchedr  s        r7   r   Buffer.matchreU  sC    g...++-e$		#g,r9   c                d    [        U5      nUR                  U R                  U R                  5      $ r;   )r   r  r!   r   )r4   r  cres      r7   r   Buffer._scanre^  s%    (yyDHH--r9   c                    U R                   $ r;   )r-   r=   s    r7   	linecountBuffer.linecountb  s    r9   c                4   Uc  U R                   n[        U[        U R                  5      S-
  5      nU R                  U   u  p#nX$-   nX-
  nU R                  X% n[        [        U R
                  5      S-
  U5      nU R
                  U   u  p[        XXbXW5      $ )Nr   r   )r+   r   rW   r0   r!   r/   r   )
r4   r   r   r   lengthendr   r!   r   r<   s
             r7   	line_infoBuffer.line_infof  s    ;))C #s4++,q01"..s3Vnkyy# D$$%)40))!,C>>r9   c                    U R                  5       (       a  gU R                  5       nSUR                  S-   UR                  S-   4-  $ )NrF   z~%d:%dr   )r   r!  r   r   )r4   infos     r7   lookahead_posBuffer.lookahead_posx  s<    ::<<~~499q=$((Q,777r9   c                    U R                  5       (       a  gU R                  5       nUR                  UR                  UR                  S-   S-    nU R	                  U5      S   R                  5       nU $ )NrF   r   P   r   )r   r!  r!   r   r\   rstrip)r4   r$  r!   s      r7   	lookaheadBuffer.lookahead~  sc    ::<<~~yy488a<"#45%%d+A.557r9   c                >    Uc  U R                   nU R                  U   $ r;   )r   r.   r   s     r7   get_lineBuffer.get_line  s    9		A{{1~r9   c                ^    Uc  SnUc  [        U R                  5      nU R                  XS-    $ r   )rW   r.   r4   r   r   s      r7   	get_linesBuffer.get_lines  s2    =E;dkk"C{{5'**r9   c                V    Uc  [        U R                  5      nU R                  USU-    $ rk   )rW   r/   r0  s      r7   
line_indexBuffer.line_index  s.    ;d&&'Cq3w//r9   c                J    S[        U 5      R                  U R                  4-  $ )Nz%s@%d)rG   __name__r   r=   s    r7   __repr__Buffer.__repr__  s     $t*--txx888r9   c                    g r;   r   )r4   seens     r7   __json__Buffer.__json__  s    r9   )r1   r,   r0   r/   r-   r.   r*   r+   r   r&   r"   r!   r%   r;   )r   zParserConfig | Noner5   r   )r   )F)r  r    returnz
str | None)NN)r   N)@r7  
__module____qualname____firstlineno__r   propertyr<   r@   r$   staticmethodr#   r2   r3   rN   r\   rO   r^   rp   ru   rs   r   r   setterr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   r  r!  r%  r*  r-  r1  r4  r8  r<  __static_attributes____classcell__)r6   s   @r7   r   r   &   s    6:2GJ : $ $ & & & & 
 
1#@
&#@E    	ZZ     *
&6 $ $

&5 (.
*K3;8"
"

!J6&.  ?$8
+0
9 r9   r   )!__doc__
__future__r   rJ   	itertoolsr   r   pathlibr   typingr   
exceptionsr	   infosr
   r   r   r   r   r   
tokenizingr   utilr   r   r   	util.miscr   r   compilerH   LineIndexEntryr   r   r9   r7   <module>rS     s`    # 	 '   "  " 
 8

:.  uY ur9   