o
    iCb                     @   s,  U d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	m
Z
 eddG dd dZG d	d
 d
ZdZe
edf ed< i Zeeef ed< eD ],Zedrneedkrned  rneeedd  edd   < qHeee < qHdZdZdZdZdZdZde d e d Zde Zee e Zee e Z dZ!dZ"dZ#dZ$d Z%d!Z&d"Z'd#e$ d$ e% d$ e& d% Z(d&Z)d'e( d Z*d(e* d( Z+d)e+ Z,d*e+ Z-d+e+ Z.d,e+ Z/d(e* d- Z0d.e* d/ e* d0 Z1d.e* d1 e' d2 Z2d3e) d Z3d4e3 d5 Z4d)e4 Z5d*e4 Z6d+e4 Z7d,e4 Z8d4e3 d6 e' e3 d5 Z9d7Z:d8Z;d9e; d e: d: e: d; Z<d<Z=d=e d> e d? e d@ Z>dAe dA e d$ e> d e= dB Z?G dCdD dDeZ@eddEG dFdG dGZAeAdHe"e@jBdIeAdJe#e@jBdIeAdKe9e@jBdLeAdMe5e@jCdeAdNe6e@jCdeAdOe7e@jCdeAdPe8e@jCdeAdQe4e@jCdeAdRe?e@jCdeAdSe<e@jCdeAdTee@jCdeAdUe e@jCdeAdVe!e@jBdWeAdXee@jCdeAdYee@jCdeAdZe0e@jCdeAd[e+e@jCdeAd\e,e@jCdeAd]e-e@jCdeAd^e.e@jCdeAd_e/e@jCdeAd`e1e@jBdaeAdbe2e@jBdeAdcee@jDdgZEeeA edd< i ZFeee
e@e	e f f ede< g ZGee edf< eED ]ZHeHjIeHjJfeFeHjK< eGLdgeHjK dheHjM d q)e Nd$OeGZPe jQe edi< eddEG djdk dkZRg eRdldmeRdndoeRdpdqeRdrdseRdtdueRdvdweRdxdyeRdzd{eRd|d}eRd~deRddeRddeRddeRddeRddeRddeRddeRddeRddeRddeRddeRddeRddeRddeRddeRdd6eRddeRddeRdd$eRddeRddeRddeRddeRddeRddheRddeRddAeRddeRddeRddeRddeRddeRddeRddeRddeRddZSeeR ed< i ZTeeeeR f ed< eSD ]ZUeTVeUjWd  g LeU q[eTX D ]ZYeYjZddƄ ddǍ qoe NdȡZ[e jQe ed< e NdʡZ\e jQe ed< dS )    N)	dataclass)Enum)CallableDictListOptionalTupleT)slotsc                   @   s.   e Zd ZU eed< eed< eed< eed< dS )_TokentypevaluelinenocolumnN)__name__
__module____qualname__str__annotations__int r   r   K/home/kim/smarthome/.venv/lib/python3.10/site-packages/pycparser/c_lexer.pyr
      s
   
 r
   c                
   @   s   e Zd ZdZdeeeegdf deg df deg df deegef ddf
dd	Zd#dededdfddZ	d$ddZ
edefddZdee fddZdee fddZdedededefddZdededdfddZd$dd Zdee fd!d"ZdS )%CLexera  A standalone lexer for C.

    Parameters for construction:
        error_func:
            Called with (msg, line, column) on lexing errors.
        on_lbrace_func:
            Called when an LBRACE token is produced (used for scope tracking).
        on_rbrace_func:
            Called when an RBRACE token is produced (used for scope tracking).
        type_lookup_func:
            Called with an identifier name; expected to return True if it is
            a typedef name and should be tokenized as TYPEID.

    Call input(text) to initialize lexing, and then keep calling token() to
    get the next token, until it returns None (at end of input).
    
error_funcNon_lbrace_funcon_rbrace_functype_lookup_funcreturnc                 C   s$   || _ || _|| _|| _|   d S N)r   r   r   r   _init_state)selfr   r   r   r   r   r   r   __init__)   s
   zCLexer.__init__ textfilenamec                 C   s   |    || _|| _dS )zInitialize the lexer to the given input text.

        filename is an optional name identifying the file from which the input
        comes. The lexer can modify it if #line directives are encountered.
        N)r   _lexdata	_filename)r   r"   r#   r   r   r   input6   s   
zCLexer.inputc                 C   s(   d| _ d| _d| _d| _d | _d| _d S )Nr!   r      )r$   r%   _pos_line_start_pending_tok_linenor   r   r   r   r   @   s   
zCLexer._init_statec                 C   s   | j S r   )r%   r,   r   r   r   r#   H   s   zCLexer.filenamec                 C   sd  | j }t|}| jd ur| j}d | _|S | j|k r|| j   dkr#n dkr(n n
  |  jd7  _nu dkrL |  jd7  _|  jd7  _| j| _n]dkrt|| jd rd|  jd7  _|   qt	|| jd r|  jd7  _| 
 }t|dkr|d | _t|dkr|d S q| dd| j}|  jd7  _|S 	 |   }r|S q| j|k sd S d S )N 	r'   
#r   ZPPHASH)r$   lenr*   r(   r+   r)   _line_patternmatch_handle_ppline_pragma_pattern_handle_pppragma_make_token_match_token)r   r"   ntoktoksr   r   r   tokenL   sF   




zCLexer.tokenc                 C   s  | j }| j}d}t|| }r/|j}|dusJ ||}t|}t| \}}	|||||	f}t	||  }
r_|
D ]$}|
|j|r^t|j}|du sR||d kr\||j|jtjdf} nq:|du r{dt||  }	| |	| |  jd7  _dS |\}}}}}	|tjkr|dkrd| }	|	dusJ | |	| |  jtd|7  _dS |tjkrt	|d}|dkr| |rd}| |||}|  j|7  _|jd	kr|   |S |jd
kr|   |S )zMatch one token at the current position.

        Returns a Token on success, or None if no token could be matched and
        an error was reported. This method always advances _pos by the matched
        length, or by 1 on error/no-match.
        Nr   zIllegal character r'   BAD_CHAR_CONSTzInvalid char constant IDZTYPEIDLBRACERBRACE)r$   r(   _regex_masterr3   	lastgroupgroupr1   _regex_actions_fixed_tokens_by_firstget
startswithliteraltok_type_RegexActionTOKENrepr_errorERRORmaxr>   _keyword_mapr   r7   r   r   r   )r   r"   posbestmrI   r   lengthactionmsgZbucketentryr:   r   r   r   r8      s`   






zCLexer._match_tokenrI   r   rQ   c                 C   s"   || j  d }t||| j|}|S )a#  Create a Token at an absolute input position.

        Expects tok_type/value and the absolute byte offset pos in the current
        input. Does not advance lexer state; callers manage _pos themselves.
        Returns a Token with lineno/column computed from current line tracking.
        r'   )r)   r
   r+   )r   rI   r   rQ   r   r:   r   r   r   r7      s   zCLexer._make_tokenrV   c                 C   s"   || j  d }| || j| d S Nr'   )r)   r   r+   )r   rV   rQ   r   r   r   r   rM      s   zCLexer._errorc           	         s   j }t|}|djdkr||j  dt d fdd}|   dr7d7 d	tt d
tt dd ffdd}dtdtdd ffdd}|  krf|d d  d S   dkrs|d d S t	t
 d  }|s|d d S |d}t|7 |  kr||d  d S   dkr|d d S t	t d  }|s|d d S |ddd}t|d7 	 |  krnt	t
 d  }|s|d d S t|d7 q||| d S )Nr/   r   r   c                      s@   k r  dv rd7 k r  dv s
d S d S d S d S )N 	r'   r   r   )lineline_lenrQ   r   r   skip_ws  s   $z&CLexer._handle_ppline.<locals>.skip_wsr[      pp_linepp_filenamec                    sJ   | d u r dj  nt| _|d ur|_ d _j_d S )Nzline number missing in #liner'   )rM   r(   r   r+   r%   r)   )r_   r`   )line_endr\   r   r   r   success  s   

z&CLexer._handle_ppline.<locals>.successrV   offsetc                    s(    | j|   d _j_d S rX   )rM   r(   r)   )rV   rc   )ra   r   r   r   fail  s   
z#CLexer._handle_ppline.<locals>.fail"z$filename before line number in #linezinvalid #line directiveTr   N)r$   r1   findr(   rG   r   r   r   rer3   _decimal_constantrC   _string_literallstriprstrip)	r   r"   r9   r]   rb   rd   rS   r_   r`   r   )r[   ra   r\   rQ   r   r   r4      sf   &









zCLexer._handle_pplinec                 C   s^  | j }t|}| j}||k r"|| dv r"|d7 }||k r"|| dv s||kr+|| _g S |d|s>| d| |d | _g S |}|td7 }| dd|g}||k rf|| dv rf|d7 }||k rf|| dv sX|}||k r|| dkr|d7 }||k r|| dksr||kr|| d||| | ||k r|| dkr|  jd7  _|d7 }|| _|| _|S )NrZ   r'   Zpragmazinvalid #pragma directiveZPPPRAGMAr/   ZPPPRAGMASTR)	r$   r1   r(   rG   rM   r7   appendr+   r)   )r   r"   r9   rQ   Z
pragma_posr;   startr   r   r   r6   K  s>   

zCLexer._handle_pppragma)r!   rf   )r   r   r   __doc__r   r   r   boolr    r&   r   propertyr#   r   r
   r<   r8   r7   rM   r4   r   r6   r   r   r   r   r      s.    




AM
br   )-ZAUTOZBREAKZCASEZCHARZCONSTCONTINUEDEFAULTZDODOUBLEELSEZENUMZEXTERNFLOATZFORZGOTOZIFZINLINEINTLONGZREGISTERZOFFSETOFZRESTRICTZRETURNZSHORTZSIGNEDZSIZEOFZSTATICZSTRUCTZSWITCHZTYPEDEFZUNIONZUNSIGNEDZVOIDZVOLATILEZWHILEZ__INT128Z_BOOLZ_COMPLEXZ	_NORETURNZ_THREAD_LOCALZ_STATIC_ASSERTZ_ATOMICZ_ALIGNOFZ_ALIGNASZ_PRAGMA.	_keywordsrP   _r'      z[a-zA-Z_$][0-9a-zA-Z_$]*z0[xX]z[0-9a-fA-F]+z0[bB]z[01]+zD(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?z(0z)|([1-9][0-9]*)z0[0-7]*z0[0-7]*[89]z\/\*z\/\/z,([a-wyzA-Z._~!=&\^\-\\?'"]|x(?![0-9a-fA-F]))z(\d+)(?!\d)z(x[0-9a-fA-F]+)(?![0-9a-fA-F])z#([\\][^a-zA-Z._~^!=&\^\-\\?'"x0-9])z(\\(|z))z(\\[0-9a-zA-Z._~!=&\^\-\\?'"])z
([^'\\\n]|'Lu8uUz{2,4}'z('z*\n)|('z*$)z[^'
]+')|('')|('z	[^'\n]*')z
([^"\\\n]|re   z*"*z([eE][-+]?[0-9]+)z([0-9]*\.[0-9]+)|([0-9]+\.)z((((z
?)|([0-9]+z
))[FfLl]?)z([pP][+-]?[0-9]+)z(((z)?\.z)|(z\.))(z[FfLl]?)c                   @   s   e Zd ZdZdZdZdS )rJ   r   r'   r{   N)r   r   r   rK   r>   rN   r   r   r   r   rJ   2  s    rJ   )frozenc                   @   s2   e Zd ZU eed< eed< eed< ee ed< dS )
_RegexRulerI   regex_patternrU   error_messageN)r   r   r   r   r   rJ   r   r   r   r   r   r   8  s
   
 r   ZUNSUPPORTED_C_STYLE_COMMENTzKComments are not supported, see https://github.com/eliben/pycparser#3using.ZUNSUPPORTED_CXX_STYLE_COMMENTZBAD_STRING_LITERALz#String contains invalid escape codeZWSTRING_LITERALZU8STRING_LITERALZU16STRING_LITERALZU32STRING_LITERALZSTRING_LITERALZHEX_FLOAT_CONSTZFLOAT_CONSTZINT_CONST_HEXZINT_CONST_BINZBAD_CONST_OCTzInvalid octal constantZINT_CONST_OCTZINT_CONST_DECZINT_CONST_CHARZ
CHAR_CONSTZWCHAR_CONSTZU8CHAR_CONSTZU16CHAR_CONSTZU32CHAR_CONSTZUNMATCHED_QUOTEzUnmatched 'r=   r>   _regex_rulesrD   _regex_pattern_partsz(?P<>rA   c                   @   s   e Zd ZU eed< eed< dS )_FixedTokenrI   rH   N)r   r   r   r   r   r   r   r   r   r     s   
 r   ELLIPSISz...ZLSHIFTEQUALz<<=ZRSHIFTEQUALz>>=ZPLUSPLUSz++Z
MINUSMINUSz--ZARROWz->ZLANDz&&ZLORz||ZLSHIFTz<<ZRSHIFTz>>ZLEz<=ZGEz>=ZEQz==ZNEz!=Z
TIMESEQUALz*=ZDIVEQUALz/=ZMODEQUALz%=	PLUSEQUALz+=Z
MINUSEQUALz-=ZANDEQUALz&=ZOREQUALz|=ZXOREQUALz^=ZEQUALS=PLUS+MINUS-ZTIMESZDIVIDE/ZMOD%ORAND&NOT~ZXOR^ZLNOT!LT<GTZCONDOP?ZLPARENZRPARENZLBRACKET[ZRBRACKET]r?   {r@   }COMMA,ZPERIOD.SEMI;COLON:_fixed_tokensrE   c                 C   s
   t | jS r   )r1   rH   )itemr   r   r   <lambda>  s   
 r   )keyreversez([ \t]*line\W)|([ \t]*\d+)r2   z[ \t]*pragma\Wr5   )]rh   dataclassesr   enumr   typingr   r   r   r   r   r
   r   ry   r   r   rP   keywordrG   r1   isalphaupperlowerZ_identifierZ_hex_prefixZ_hex_digitsZ_bin_prefixZ_bin_digitsZ_integer_suffix_optri   Z_octal_constantZ_hex_constantZ_bin_constantZ_bad_octal_constantZ_unsupported_c_style_commentZ_unsupported_cxx_style_commentZ_simple_escapeZ_decimal_escapeZ_hex_escapeZ_bad_escapeZ_escape_sequenceZ _escape_sequence_start_in_stringZ_cconst_charZ_char_constZ_wchar_constZ_u8char_constZ_u16char_constZ_u32char_constZ_multicharacter_constantZ_unmatched_quoteZ_bad_char_constZ_string_charrj   Z_wstring_literalZ_u8string_literalZ_u16string_literalZ_u32string_literalZ_bad_string_literalZ_exponent_partZ_fractional_constantZ_floating_constantZ_binary_exponent_partZ_hex_fractional_constantZ_hex_floating_constantrJ   r   rN   rK   r>   r   rD   r   Z_rulerU   r   rI   rm   r   compilejoinrA   Patternr   r   rE   Z_entry
setdefaultrH   valuesZ_bucketsortr2   r5   r   r   r   r   <module>   s  
  f0"&!		 / 	
 !"#$%&'()*+,-.6