
    x
h8                         d dl mZmZmZmZ d dlZd dlZd dlmZ dZ	e	rd dl
Z
 G d de      Z e       Z G d de      Zd Zd	 Zy)
    )absolute_importdivisionprint_functionunicode_literalsNFc                       e Zd ZdZd Zy)
MultiTokenzdObject used to monkeypatch ply.lex so that we can return multiple
    tokens from one lex operation.c                 :    |d   j                   | _         || _        y )Nr   )typetokens)selfr   s     Y/var/www/html/lionshead-backend/venv/lib/python3.12/site-packages/stone/frontend/lexer.py__init__zMultiToken.__init__   s    1INN	    N)__name__
__module____qualname____doc__r    r   r   r   r      s    &r   r   c                   `   e Zd ZdZdZd Zd Zd Zd ZdZ	e	dz  Z	e	d	z  Z	e	d
z  Z	e	dz  Z	e	dz  Z	e	dz  Z	e	dz  Z	dZ
dZdZdZdZdZdZdZdZdZg dZddddddd d!d"d#d$d%d&Ze	 eej/                               z  Z	d' Zd( Zd) Zd* Zd+ Zd, Zd- Zd. Zd/ Z d0 Z!d1 Z"d2 Z#d3 Z$d4 Z%d5 Z&d6 Z'd7Z(d8 Z)y9):Lexerz'
    Lexer. Tokenizes stone files.
    ))WSIGNORE	inclusivec                 ~    d | _         d | _        d | _        t        j                  d      | _        d | _        g | _        y )Nzstone.stone.lexer)lextokens_queue
cur_indentlogging	getLogger_logger
last_tokenerrors)r   s    r   r   zLexer.__init__"   s9     (()<=r   c                     t        j                   dd| i|| _         g | _        d| _        | j                   j                  |dz          y)z
        Required by ply.yacc for this to quack (duck typing) like a ply lexer.

        :param str file_data: Contents of the file to lex.
        moduler   
Nr   )r   r   r   input)r   	file_datakwargss      r   r%   zLexer.input,   sB     771$1&1 	y4'(r   c                    | j                   r,| j                   j                  d      | _        | j                  S | j                  j	                         }t        |t              rQ| j                   j                  |j                         | j                   j                  d      | _        | j                  S || j                  dkD  r	| j                  ri| j                  j                  dvrQt        dd| j                  j                  | j                  j                        }| j                   j                  |       | j                  }t        dd| j                  j                  | j                  j                        }| j                   j                  |g|z         d| _	        | j                   j                  d      | _        | j                  S || _        | j                  S )zf
        Returns the next LexToken. Returns None when all tokens have been
        exhausted.
        r   )NEWLINELINEr)   r$   DEDENT	)r   popr    r   token
isinstancer   extendr   r   r
   _create_tokenlinenolexposappend)r   rnewline_tokendedent_countdedent_tokens        r   r.   zLexer.token9   ss    "//33A6DO, )  A!Z(!!((2"&"3"3"7"7":"  91!4 OO008KK(5%tTXX__dhhoo)O))00?#'??L#0 $$JL%%,,l^l-JK&'DO&*&7&7&;&;A&>DO  '(DOr   c                     | j                  |       	 | j                         }|sy| j                  j                  d|       0)z;Logs all tokens for human inspection. Useful for debugging.zToken %rN)r%   r.   r   debug)r   datar.   s      r   testz
Lexer.testX   s;    

4JJLELLz51	 r   )IDKEYWORDPATHDOT)r+   INDENTr)   )COMMAEQLPARRPAR)BOOLEANFLOATINTEGERNULLSTRING)LBRACKETRBRACKET)LBRACERBRACECOLON)Q)ATz\.z\[z\]=,z\?z\{z\}z\:@)alias
annotationannotation_typeattrsby
deprecateddocexampleerrorextendsimport	namespacepatchroutestructunionunion_closed
ANNOTATIONANNOTATION_TYPEATTRS
DEPRECATEDBYEXTENDSIMPORTPATCHROUTESTRUCTUNIONUNION_CLOSED)rV   rW   rX   rZ   rY   r^   r_   ra   rb   rc   rd   re   c                 <    |j                   j                  d       |S )z\(r   )lexer
push_stater   r.   s     r   t_LPARzLexer.t_LPAR   s    z*r   c                 :    |j                   j                          |S )z\))rs   	pop_stateru   s     r   t_RPARzLexer.t_RPAR   s    r   c                 .    |j                   dk(  |_         |S )z\btrue\b|\bfalse\btrue)valueru   s     r   t_ANY_BOOLEANzLexer.t_ANY_BOOLEAN   s    {{f,r   c                     t         |_        |S )z\bnull\b)	NullTokenr|   ru   s     r   
t_ANY_NULLzLexer.t_ANY_NULL   s    r   c                     |j                   | j                  v rJ|j                   dk(  r| j                  r|S | j                  j	                  |j                   d      |_        |S |S )z[a-zA-Z_][a-zA-Z0-9_-]*rW   r>   )r|   KEYWORDSr   RESERVEDgetr
   ru   s     r   t_ANY_IDzLexer.t_ANY_ID   sR    ;;$--'00doo **5;;	BEJLLr   c                     |S )z\/[/a-zA-Z0-9_-]*r   ru   s     r   
t_ANY_PATHzLexer.t_ANY_PATH   s    r   c                 :    t        |j                        |_        |S )z-?\d+(\.\d*(e-?\d+)?|e-?\d+))floatr|   ru   s     r   t_ANY_FLOATzLexer.t_ANY_FLOAT   s    EKK(r   c                 :    t        |j                        |_        |S )z-?\d+)intr|   ru   s     r   t_ANY_INTEGERzLexer.t_ANY_INTEGER   s    %++&r   c                    d}|j                   xj                  |j                  j                  d      z  c_        |j                  dd }d}t	        dt        |            D ]-  }||   }|r|dk(  rd}n|dk(  rd}||z  }d}!|d	k(  rd})||z  }/ d
t        | j                        z  }|j                         D cg c]  }|j                  |dd       }	}dj                  |	      |_        |S c c}w )z\"([^\\"]|(\\.))*\"r   r$       ntr,   \ )rs   r2   r|   countrangelen_indent_level_to_spaces_countr   
splitlinesreplacejoin)
r   r   escapedsnew_stricindentation_strlinelines_without_indentations
             r   t_ANY_STRINGzLexer.t_ANY_STRING  s   	!''----GGAbMq#a&!A!A8A#XA19GqLG "  =doo NN  **,%., LL"a0, 	" %. ))56	%.s   ;C/c           	      @   |j                   xj                  |j                  j                  d      z  c_        |j                  dz
  }|dk\  r|j                   j
                  |   dk(  }| xr |j                   j
                  |   dk7  }|s|rt        dd|j                  |j                  t        |j                        z   dz
        }|j                   |_         | j                  |      }|r|S |r"|r|j                  j                  d|       |S |S |dz  }|dk\  ryy)[#][^\n]*\n+r$   r   r   r   r)   N)rs   r2   r|   r   r3   lexdatar1   r   !_create_tokens_for_next_line_dentr   insert)r   r.   r   is_full_line_commentis_partial_line_commentr6   dent_tokenss          r   t_INITIAL_commentzLexer.t_INITIAL_comment%  s   ekk//55
 LL11f#(;;#6#6q#9T#A +?'? (E',{{':':1'='D $#'> -iLL%,,U[[1A"AA"E!G&+kk#"DD!#'&&,"#**11!]C**,,FA) 1fr   c           	      .   |j                   xj                  |j                  j                  d      z  c_        t	        dd|j                  |j
                  t        |j                        z   dz
        }|j                   |_         | j                  |       y)r   r$   r)   r   N)rs   r2   r|   r   r1   r3   r   _check_for_indent)r   r.   r6   s      r   t_WSIGNORE_commentzLexer.t_WSIGNORE_commentC  sn    ekk//55%iLL%,,U[[)99A=?#kk}-r   c                     |j                   xj                  |j                  j                  d      z  c_        | j	                  |      }|r|j
                  j                  d|       |S |S )\n+r$   r   )rs   r2   r|   r   r   r   r   )r   r6   r   s      r   t_INITIAL_NEWLINEzLexer.t_INITIAL_NEWLINEL  s_    ""m&9&9&?&?&EE"<<]K%%a7  r   c                     |j                   xj                  |j                  j                  d      z  c_        | j	                  |       y)r   r$   N)rs   r2   r|   r   r   )r   r6   s     r   t_WSIGNORE_NEWLINEzLexer.t_WSIGNORE_NEWLINEV  s8    ""m&9&9&?&?&EE"}-r   c           	         | j                  |      }||dk(  ry|dkD  rdnd}t        |d|j                  dz   |j                  t	        |j
                        z         }|gt        |      z  }| xj                  |z  c_        t        |      S )z
        Starting from a newline token that isn't followed by another newline
        token, returns any indent or dedent tokens that immediately follow.
        If indentation doesn't change, returns None.
        Nr   rA   r+   r,   r   )	_get_next_line_indent_deltar1   r2   r3   r   r|   absr   r   )r   r6   indent_delta	dent_type
dent_tokenr   s         r   r   z'Lexer._create_tokens_for_next_line_dent[  s     77F<1#4  ,q 0Hh	"t]11A5  3}':':#;;=
 L 11<'&!!r   c                     | j                  |      }||dk(  ry| j                  j                  d|j                  j                  f       y)zw
        Checks that the line following a newline is indented, otherwise a
        parsing error is generated.
        Nr   z-Line continuation must increment indent by 1.)r   r!   r4   rs   r2   )r   r6   r   s      r   r   zLexer._check_for_indentp  sO    
 77F<1#4 KK@$$++-.r   c                 P   |j                   dk(  sJ d       |j                  t        |j                        z   }|t        |j                  j
                        k(  ry|j                  j
                  |d j                  t        j                  d      d   }|sy|j                         }t        |      }|dk(  ry|d   dk(  ryt        |      |z
  }|dz  dkD  r2| j                  j                  d|j                  j                  f       y|t        | j                        z
  }|dz  S )	aX  
        Returns the change in indentation. The return units are in
        indentations rather than spaces/tabs.

        If the next line's indent isn't relevant (e.g. it's a comment),
        returns None. Since the return value might be 0, the caller should
        explicitly check the return type, rather than rely on truthiness.
        r)   z3Can only search for a dent starting from a newline.Nr   r   #   zIndent is not divisible by 4.)r
   r3   r   r|   rs   r   splitoslineseplstripr!   r4   r2   r   r   )r   r6   next_line_posr   lstripped_linelstripped_line_lengthindentr   s           r   r   z!Lexer._get_next_line_indent_delta  s$    !!Y. 	BA	B.%,,s=3F3F/GGC 3 3 ; ;<<""**=>:@@QOPQR #N 3 A%!#T22A:>KK0-2E2E2L2LMO =doo NNq  r   z 	c                 h   | j                   j                  d|j                  d   |j                  j                         | j
                  j                  dt        |j                  d         j                  d      z  |j                  j                  f       |j                  j                  d       y )NzIllegal character %r at line %dr   zIllegal character %s.ur   )
r   r:   r|   rs   r2   r!   r4   reprr   skipru   s     r   t_ANY_errorzLexer.t_ANY_error  s    < ;;q>5;;+=+=	?$tEKKN';'B'B3'GG[[!	" 	r   N)*r   r   r   r   statesr   r%   r.   r<   r   t_DOT
t_LBRACKET
t_RBRACKETt_EQt_COMMAt_Qt_LBRACEt_RBRACEt_COLONt_ATr   r   tuplevaluesrv   ry   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   t_ignorer   r   r   r   r   r      s~   F)>2F   F   F   F   F   F   F
   F
 EJJDG
CHHGDH* #,"&H eHOO%&&F


$
H<.!.
"*.#!L Hr   r   c                 f    t        j                         }| |_        ||_        ||_        ||_        |S )z
    Helper for creating ply.lex.LexToken objects. Unfortunately, LexToken
    does not have a constructor defined to make settings these values easy.
    )r   LexTokenr
   r|   r2   r3   )
token_typer|   r2   r3   r.   s        r   r1   r1     s0    
 LLNEEJEKELELLr   c                     | dz  S )Nr   r   )r   s    r   r   r     s    A:r   )
__future__r   r   r   r   r   r   ply.lexr   _MYPYtypingobjectr   r   r   r1   r   r   r   r   <module>r      sM    R R  	   H	UF Up
r   