HEX
Server: LiteSpeed
System: Linux s1049.use1.mysecurecloudhost.com 4.18.0-477.27.2.lve.el8.x86_64 #1 SMP Wed Oct 11 12:32:56 UTC 2023 x86_64
User: xedaptot (3356)
PHP: 8.3.31
Disabled: NONE
Upload Files
File: //opt/saltstack/salt/lib/python3.10/site-packages/pycparser/__pycache__/c_parser.cpython-310.pyc
o

;j�^�@s�ddlmZddlmZmZmZmZmZmZm	Z	m
Z
mZddlm
Z
ddlmZmZddlmZmZeGdd�d��ZGd	d
�d
e�ZGdd�d�Zhd
�Zidd�dd�dd�dd�dd�dd�dd�dd�dd�dd�dd�dd�d d�d!d"�d#d"�d$d%�d&d%�d'd%i�Zhd(�Zd)d*hZhd+�Zhd,�ZeeBeBeBhd-�BZhd.�Zhd/�Z d0d1hZ!hd2�Z"d3hZ#hd4�Z$ee Be!Be"Be#Be$BZ%hd5�Z&Gd6d7�d7�Z'Gd8d9�d9e
�Z(ed:Z)Gd;d<�d<e
�Z*d=S)>�)�	dataclass)	�Any�Dict�List�Literal�NoReturn�Optional�Tuple�	TypedDict�cast�)�c_ast)�CLexer�_Token)�fix_switch_cases�fix_atomic_specifiersc@s@eZdZUdZeed<eed<dZeeed<defdd�Z	dS)	�CoordzkCoordinates of a syntactic element. Consists of:
    - File name
    - Line number
    - Column number
    �file�lineN�column�returncCs,|j�d|j��}|jr|d|j��7}|S)N�:�rrr)�self�text�r�F/opt/saltstack/salt/lib/python3.10/site-packages/pycparser/c_parser.py�__str__'sz
Coord.__str__)
�__name__�
__module__�__qualname__�__doc__�str�__annotations__�intrrrrrrrrs
rc@seZdZdS)�
ParseErrorN)rrr rrrrr%.sr%c@s
eZdZdZdedddddfdedeed	ed
ededed
eddfdd�Z	�d'dededede	j
fdd�Z�d(dede
edefdd�ZdedeeBdBdefdd�Z�d)dd �Z�d)d!d"�Zd#ede
eddfd$d%�Zd#ede
eddfd&d'�Zd#edefd(d)�Zded*ededdfd+d,�Z�d)d-d.�Z�d)d/d0�Zd#edefd1d2�Zd3ed4ede	jfd5d6�Zd3e	je	jBe	j Bd7e!ede	je	jBe	j Bfd8d9�Z"	�d*d:e
d;d<ed=d>d?edd;f
d@dA�Z#	�d*dBd;dCe!dDdEede!e	jfdFdG�Z$dBd;d3e	jdHe
e!e	jdIe	jde	jf
dJdK�Z%dLedefdMdN�Z&�d+dPede
e'fdQdR�Z(�d+dPede
efdSdT�Z)de'fdUdV�Z*dWede
e'fdXdY�Z+dWede'fdZd[�Z,defd\d]�Z-d^eddfd_d`�Z.dae'defdbdc�Z/�d(dae
e'defddde�Z0�d(dae
e'defdfdg�Z1defdhdi�Z2�d*djedefdkdl�Z3de4e
eeffdmdn�Z5	�d,doedpede4e
e	jeffdqdr�Z6de4e
eeffdsdt�Z7defdudv�Z8defdwdx�Z9de
e4e	j ee'ffdydz�Z:de	j
fd{d|�Z;de!e	jfd}d~�Z<de!e	jfdd��Z=de!e	jfd�d��Z>de!e	jfd�d��Z?dBd;d�ede!e	jfd�d��Z@de!e	jfd�d��ZA	�d*d�ede4d;ee
effd�d��ZB�d-d�d��ZCde!efd�d��ZDde	jfd�d��ZEde	jfd�d��ZF	�d.d�e
dDdjede!dDfd�d��ZG�d*djeddDfd�d��ZHde	jfd�d��ZIde!e	jfd�d��ZJde
e!e	jfd�d��ZKde!dDfd�d��ZL�d/d�d��ZMde	jfd�d��ZNde	jfd�d��ZOde	jfd�d��ZPde	jfd�d��ZQde	jfd�d��ZRde	jfd�d��ZSde	jfd�d��ZTd=ed�ede	jfd�d��ZU	�d0d=ed�ede	jfd�d��ZVd3e	jde	jfd�d��ZWd�e	jde	jfd�d��ZX	�d(d�e
e	jde
ede	jfd�d��ZYd�e	jde	jfd�d��ZZde
e	jfd�d„Z[de	j\fd�dĄZ]de	j\fd�dƄZ^de	jfd�dȄZ_dBd;d3e
e	jd�e
ede	jfd�d˄Z`de
e	jfd�d̈́Zade	jfd�dτZbde	j fd�dфZcde
e	jfd�dӄZdde	jfd�dՄZede
e	j\fd�dׄZfde	jfd�dلZgde	je!e	jBfd�dۄZhde	je!e	jBfd�d݄Zide	je!e	jBfd�d߄Zjde!e	jfd�d�Zkde	jfd�d�Zlde	jfd�d�Zmde	jfd�d�Znde	jfd�d�Zode	jfd�d�Zpde	jfd�d�Zqde
e	jfd�d�Zrde	jfd�d�Zsde	jfd�d�Ztde	jfd�d��Zu	�d1d�ed�e
e	jde	jfd�d��Zvde	jfd�d��Zwde	jfd�d��Zxde	jfd��d�Zyde	jf�d�d�Zzde	jf�d�d�Z{de	jf�d�d�Z|de	jf�d�d�Z}de	jf�d	�d
�Z~de	jf�d�d�Zde	jf�d
�d�Z�de	jf�d�d�Z�de	jf�d�d�Z�de	jf�d�d�Z�de	jf�d�d�Z�de	jf�d�d�Z�de!e	jf�d�d�Z�de!e	jf�d�d�Z�de	jf�d�d�Z�def�d�d �Z�de	jf�d!�d"�Z�de!e	jf�d#�d$�Z�de!e	jf�d%�d&�Z�dS(2�CParseraFRecursive-descent C parser.

    Usage:
        parser = CParser()
        ast = parser.parse(text, filename)

    The `lexer` parameter lets you inject a lexer class (defaults to CLexer).
    The parameters after `lexer` are accepted for backward compatibility with
    the old PLY-based parser and are otherwise unused.
    Tzpycparser.lextabzpycparser.yacctabF��lex_optimize�lexer�lextab�
yacc_optimize�yacctab�
yacc_debug�taboutputdirrNcCs4||j|j|j|jd�|_t�g|_t|j�|_dS)N)Z
error_funcZon_lbrace_funcZon_rbrace_funcZtype_lookup_func)	�_lex_error_func�_lex_on_lbrace_func�_lex_on_rbrace_func�_lex_type_lookup_func�clex�dict�_scope_stack�_TokenStream�_tokens)rr(r)r*r+r,r-r.rrr�__init__>s
�
zCParser.__init__r�filename�debugcCsZt�g|_|j�||�t|j�|_|��}|��}|dur+|�d|j	��|�
|��|S)a-Parses C code and returns an AST.

        text:
            A string containing the C source code

        filename:
            Name of the file being parsed (for meaningful
            error messages)

        debug:
            Deprecated debug flag (unused); for backwards compatibility.
        N�before: )r4r5r3�inputr6r7� _parse_translation_unit_or_empty�_peek�_parse_error�value�
_tok_coord)rrr9r:�ast�tokrrr�parseZs
z
CParser.parse�linenorcCst|jj||d�S)Nr)rr3r9)rrErrrr�_coordv�zCParser._coord�msg�coordcCst|�d|����)Nz: )r%)rrHrIrrrr?yrGzCParser._parse_errorcCs|j�t��dS�N)r5�appendr4�rrrr�_push_scope|rGzCParser._push_scopecCs t|j�dks	J�|j��dS)Nr)�lenr5�poprLrrr�
_pop_scopeszCParser._pop_scope�namecCs8|jd�|d�s|�d|�d�|�d|jd|<dS)z9Add a new typedef name (ie a TYPEID) to the current scope���TzTypedef z1 previously declared as non-typedef in this scopeN�r5�getr?�rrQrIrrr�_add_typedef_name�s
�zCParser._add_typedef_namecCs8|jd�|d�r|�d|�d�|�d|jd|<dS)z`Add a new object, function, or enum member name (ie an ID) to the
        current scope
        rRFzNon-typedef z- previously declared as typedef in this scopeNrSrUrrr�_add_identifier�s
�zCParser._add_identifiercCs.t|j�D]}|�|�}|dur|SqdS)z.Is *name* a typedef-name in the current scope?NF)�reversedr5rT)rrQZscopeZin_scoperrr�_is_type_in_scope�s
�zCParser._is_type_in_scopercCs|�||�||��dSrJ)r?rF)rrHrrrrrr/�szCParser._lex_error_funccC�|��dSrJ)rMrLrrrr0��zCParser._lex_on_lbrace_funccCrZrJ)rPrLrrrr1�r[zCParser._lex_on_rbrace_funccCs
|�|�S)z�Looks up types that were previously defined with
        typedef.
        Passed to the lexer for recognizing identifiers that
        are types.
        )rY)rrQrrrr2�s
zCParser._lex_type_lookup_func�decl�modifiercCsh|}|}|jr
|j}|jst|tj�r||_|S|}t|jtj�s+|j}t|jtj�r!|j|_||_|S)z�Tacks a type modifier on a declarator, and returns
        the modified declarator.

        Note: the declarator and modifier may be modified
        )�type�
isinstancer
�TypeDecl)rr\r]Z
modifier_headZ
modifier_tailZ	decl_tailrrr�_type_modify_decl�s��zCParser._type_modify_decl�typenamecCs�|}t|tj�s|j}t|tj�r|j|_|jdd�|_|D]}t|tj�s<t|�dkr5|�	d|j
�q||_|Sq|sYt|jtj�sM|�	d|j
�tjdg|j
d�|_|Stjdd�|D�|d	j
d�|_|S)
z#Fixes a declaration. Modifies decl.Nrz Invalid multiple types specified�Missing type in declarationr$�rIcSsg|]
}|jD]}|�qqSr)�names)�.0�idrQrrr�
<listcomp>$sz/CParser._fix_decl_name_type.<locals>.<listcomp>r)r_r
r`r^�declnamerQ�quals�IdentifierTyperNr?rI�FuncDecl)rr\rb�typ�tnrrr�_fix_decl_name_types,����zCParser._fix_decl_name_type�declspec�	_DeclSpec�newspec�kind�
_DeclSpecKindrKcCsJ|durtgggggd�}n|}|r||�|�|S||�d|�|S)z2See _DeclSpec for the specifier dictionary layout.N��qual�storager^�function�	alignmentr)r4rK�insert)rrprrrsrK�specrrr�_add_declaration_specifier(s
��z"CParser._add_declaration_specifierr{�decls�	_DeclInfo�typedef_namespacecCsnd|dv}g}|d�d�dur�|dddurst|d�dks8t|dd	j�d
ks8|�|dd	jd�sQd}|dD]}t|d�rJ|j}nq>|�d
|�tj|dd	jddd|d|dd	jd�|dd<|dd	=n=t	|ddtj
tjtjtj
f�s�tt|dd�}t	|tj�s�|j}t	|tj�r�|jdur�|dd	jd|_|dd	=|D]�}	|	ddus�J�|r�tjd|d|d|	d|	djd�}
n!tjd|d|d|d|d|	d|	�d�|	�d�|	djd�	}
t	|
jtj
tjtjtj
f��r|
}n|�|
|d�}|�r$|�r|�|j|j�n|�|j|j�tttjtjB|��}|�|�q�|S)z�Builds a list of declarations all sharing the given specifiers.
        If typedef_namespace is true, each declared name is added
        to the "typedef namespace", which also includes objects,
        functions, and enum constants.
        �typedefrwr�bitsizeNr\r^�rRr�?rI�Invalid declarationry�rir^rj�alignrIrv)rQrjrwr^rIrx�init�	rQrjr�rwZfuncspecr^r�r�rI)rTrNrerY�hasattrrIr?r
r`r_�Enum�Struct�Unionrkrrr^ri�Typedef�DeclrorVrQrWrrK)rr{r}rZ
is_typedefZdeclarationsrI�tZdecls_0_tailr\�declarationZ
fixed_declrrr�_build_declarations>s��
��
��

����zCParser._build_declarations�param_decls�bodycCsNd|dvr
|�d|j�|j|t|ddd�gdd�d}tj||||jd	�S)
zBuilds a function definition.r�rwzInvalid typedefN�r\r�r�T�r{r}rr)r\r�r�rI)r?rIr�r4r
ZFuncDef)rr{r\r�r�r�rrr�_build_function_definition�s��
�z"CParser._build_function_definition�tokencCs|dkrtjStjS)z[Given a token (either STRUCT or UNION), selects the
        appropriate AST class.
        �struct)r
r�r�)rr�rrr�_select_struct_union_class�sz"CParser._select_struct_union_classr�kcCs|j�|�S)z:Return the k-th next token without consuming it (1-based).)r7�peek�rr�rrrr>�sz
CParser._peekcCs|�|�}|dur|jSdS)zDReturn the type of the k-th next token, or None if absent (1-based).N)r>r^)rr�rCrrr�
_peek_type�s
zCParser._peek_typecCs*|j��}|dur|�d|jj�dS|S)NzAt end of input)r7�nextr?r3r9�rrCrrr�_advance�s
zCParser._advance�
token_typecCs&|��}|dur|j|kr|��SdS)z�Conditionally consume next token, only if it's of token_type.

        If it is of the expected type, consume and return it.
        Otherwise, leaves the token intact and returns None.
        N)r>r^r��rr�rCrrr�_accept�szCParser._acceptcCs0|��}|j|kr|�d|j��|�|��|S)Nr;)r�r^r?r@rAr�rrr�_expect�s
zCParser._expectcCs
|j��SrJ)r7�markrLrrr�_mark��
z
CParser._markr�cCs|j�|�dSrJ)r7�reset�rr�rrr�_reset��zCParser._resetrCcCs|�|j|j�SrJ)rFrErr�rrrrA�r�zCParser._tok_coordcC�"|p|��}|durdS|jtvS�NF)r>r^�_DECL_STARTr�rrr�_starts_declaration��
zCParser._starts_declarationcCr�r�)r>r^�_STARTS_EXPRESSIONr�rrr�_starts_expression�r�zCParser._starts_expressioncCs(|��}|dur
dS|tvrdS|��S)NFT)r��_STARTS_STATEMENTr��r�tok_typerrr�_starts_statement�szCParser._starts_statement�id_onlycCs4|��}|dur
dS|dvrdS|r|dkS|dvS)NF>�TIMES�LPARENT�ID>r��TYPEID�r�)rr�r�rrr�_starts_declaratorszCParser._starts_declaratorcCs&|��}|��\}}|�|�||fSrJ)r��_scan_declarator_name_infor�)rr�r��	saw_parenrrr�_peek_declarator_name_infos
z"CParser._peek_declarator_name_info�allow_abstract�typeid_paren_as_abstractcCs�|��\}}|dus|r3|dkr3|r3|s+|��}|dur!|�|�n|jj}|�d|�|��}|dfS|dkrI|rA|��}|dfS|��}|dfS|�	�}|dfS)Nr�zInvalid declaratorFT)
r�r>rAr3r9r?�_parse_abstract_declarator_opt� _parse_typeid_noparen_declarator�_parse_typeid_declarator�_parse_id_declarator)rr�r��	name_typer�rCrIr\rrr�_parse_any_declarators&���zCParser._parse_any_declaratorcCsd}|�d�r|��tvr|��|��tvs
|�d�s|��}|dur(d|fS|jdvr6|��|j|fS|jdkr�d}|��|��\}}|rKd}d}	|��}|durZd|fS|jdkrd|d7}n|jdkr{|d8}|��|dkrz	||fSqM|��qNd|fS)	NFr�>r�r�r�Tr�RPARENr)r�r��_TYPE_QUALIFIERr�r>r^r�)rr�rCr�Znested_paren�depthrrrr�/sF
�
�





��z"CParser._scan_declarator_name_infocCs|��dvS)N>r��LBRACKETr�rLrrr�"_starts_direct_abstract_declaratorRr[z*CParser._starts_direct_abstract_declaratorcCs|��}|duo|jtvSrJ)r>r^�_ASSIGNMENT_OPSr�rrr�_is_assignment_opUszCParser._is_assignment_opcCsb|��}|�d�}|durdS|��s|�|�dS|��}|�d�dur,|�|�dS|||fS)abParse and return a parenthesized type name if present.

        Returns (typ, mark, lparen_tok) when the next tokens look like
        '(' type_name ')', where typ is the parsed type name, mark is the
        token-stream position before parsing, and lparen_tok is the LPAREN
        token. Returns None if no parenthesized type name is present.
        r�Nr�)r�r�r�r��_parse_type_name)rr��
lparen_tokrmrrr�_try_parse_paren_type_nameYs




z"CParser._try_parse_paren_type_namecCs$|��durt�g�St�|���SrJ)r>r
�FileAST�_parse_translation_unitrLrrrr=ts
z(CParser._parse_translation_unit_or_emptycCs.g}|��dur|�|���|��dus|SrJ)r>�extend�_parse_external_declaration)r�extrrrr�z�
�zCParser._parse_translation_unitcCs�|��}|dur
gS|jdkr|��gS|jdvr|��gS|�d�r&gS|jdkr/|��S|�|�sf|��}d}|��dkrG|�	d|j
�tgggtj
dg|j
d�ggd	�}|j||||��d
�}|gS|jdd�\}}}|��\}}	|d
kr�|�||�}
|�d�|
S|��}|��dks�|��r�d}|��r�|��}|��dkr�|�	d|j
�|ds�tj
dg|d�g|d<|j||||��d
�}|gSt|ddd�}|�d�r�|��|d<|j|d�}
|j||
dd�}
|�d�|
S)N�PPHASH��PPPRAGMA�_PRAGMA�SEMI�_STATIC_ASSERT�LBRACEzInvalid function definitionr$rd)rvryrwr^rx)r{r\r�r�T��
allow_no_typer�r^r��EQUALSr�)�firstr�)r>r^�_parse_pp_directive�_parse_pppragma_directiver��_parse_static_assertr�r�r�r?rIr4r
rkr��_parse_compound_statement�_parse_declaration_specifiersr��_parse_decl_body_with_specr��_parse_declaration_list�_parse_initializer�_parse_init_declarator_listr�)rrCr\r�r{�func�saw_type�
spec_coordr��_r}Z	decl_dictrrrr��s|





	���
�

z#CParser._parse_external_declarationcC�|��}|�d�|S�Nr�)�_parse_decl_bodyr��rr}rrr�_parse_declaration��
zCParser._parse_declarationcCs|jdd�\}}}|�||�S)NTr�)r�r�)rr{r�r�rrrr��szCParser._parse_decl_bodyr�cCs�d}|r
|��r|��}n|jdd�r|jdd�}|durd|d}tjtjtjf}t|�dkrTt|d|�rTtjd|d|d|d|d	|ddd|dj	d
�	g}|S|j
|tdddd�gdd�}|S|j
||dd�}|S)
NT�r�r^rrrvryrwrxr�r�r�)r�r�r
r�r�r�rNr_r�rIr�r4)rr{r�r}�tyZs_u_or_errrr��sD�����
��z"CParser._parse_decl_body_with_speccCs&g}|��r|�|���|��s|SrJ)r�r�r�r�rrrr�s
�zCParser._parse_declaration_listr�cCs�d}d}d}	|��}|dur�n|jdkr+|dur|�|�}|j||��ddd�}q|jdkrN|�d�d	krN|dur@|�|�}|j||��d
dd�}d}q|jtvri|dur\|�|�}|j||��j	ddd�}q|jt
vr�|durw|�|�}|j||��j	ddd�}q|jtvr�|dur�|�|�}|j||��j	d
dd�}q|jtvr�|dur�|�|�}|��}|j|t
j|j	g|�|�d�d
dd�}d}q|jdkr�|r�n`|dur�|�|�}|��}|j|t
j|j	g|�|�d�d
dd�}d}q|jdv�r|du�r|�|�}|j||��d
dd�}d}q|jdk�r.|du�r |�|�}|j||��d
dd�}d}q	|du�r<|�d|jj�|�sH|�sH|�d|�|||fS)a�Parse declaration-specifier sequence.

        allow_no_type:
            If True, allow a missing type specifier without error.

        Returns:
            (spec, saw_type, first_coord) where spec is a dict with
            qual/storage/type/function/alignment entries, saw_type is True
            if a type specifier was consumed, and first_coord is the coord
            of the first specifier token (used for diagnostics).
        NFT�_ALIGNASry�rK�_ATOMICr�r�r^rvrwrxrdr���STRUCT�UNION�ENUMr�rc)r>r^rAr|�_parse_alignment_specifierr��_parse_atomic_specifierr�r�r@�_STORAGE_CLASS�_FUNCTION_SPEC�_TYPE_SPEC_SIMPLEr
rk� _parse_struct_or_union_specifier�_parse_enum_specifierr?r3r9)rr�r{r��first_coordrCrrrr�s�

�
�

�

�

�

�

�

�

�

z%CParser._parse_declaration_specifierscCsVd}d}d}d}	|��}|durn�|jdkr.|dur |�|�}|j||��ddd�}d}q|jdkrQ|�d�dkrQ|durC|�|�}|j||��d	dd�}d}q|jtvrl|dur_|�|�}|j||��j	d
dd�}q|jt
vr�|durz|�|�}|��}|j|tj|j	g|�|�d�d	dd�}d}q|jdkr�|r�n\|dur�|�|�}|��}|j|tj|j	g|�|�d�d	dd�}d}q|jd
vr�|dur�|�|�}|j||�
�d	dd�}d}q|jdkr�|dur�|�|�}|j||��d	dd�}d}q	|du�r|�d|jj�|�s|�s|�d|�|�d�du�rg|d<|�d�du�r)g|d<|S)NFTr�ryr�r�r�r�r^rvrdr�r�r�zInvalid specifier listrcrwrx)r>r^rAr|rr�rr�r�r@rr
rkrrr?r3r9rT)rr{r�Z
saw_alignmentrrCrrr�_parse_specifier_qualifier_list�s�

�
�

�

�

�

�

�
z'CParser._parse_specifier_qualifier_listcCs0g}|��tvr|�|��j�|��tvs|SrJ)r�r�rKr�r@)rrjrrr�_parse_type_qualifier_list�s
�z"CParser._parse_type_qualifier_listcCsd|�d�}|�d�|��r |��}|�d�t�||�|��S|��}|�d�t�||�|��S)Nr�r�r�)r�r�r�r
ZAlignasrA�_parse_constant_expression)rrCrm�exprrrrrs



z"CParser._parse_alignment_specifiercCs6|�d�|�d�|��}|�d�|j�d�|S)Nr�r�r�Z_Atomic)r�r�rjrK)rrmrrrrs


zCParser._parse_atomic_specifierr�cCsF|dur|gn|j|d�g}|�d�r!|�|j|d��|�d�s|S)Nr��COMMA)�_parse_init_declaratorr�rK)rr�r�r}rrrr�s��

�z#CParser._parse_init_declarator_listcCs8|r|��n|��}d}|�d�r|��}t||dd�S)Nr�r�)r��_parse_declaratorr�r�r4)rr�r\r�rrrr
's

zCParser._parse_init_declaratorcCs|��}|�|j�}|��dvrM|��}|��dkrB|��|�d�r.||jg|�|�d�S|��}|�d�||j||�|�d�S||jd|�|�d�S|��dkry|��}|�d�rf|dg|�|�d�S|��}|�d�|d||�|�d�S|�d|�|��dS)N>r�r�r��RBRACE)rQr}rIz Invalid struct/union declaration)	r�r�r@r�r�rA�_parse_struct_declaration_listr�r?)rrC�klass�name_tokr}Z	brace_tokrrrr3s4
�
��

z(CParser._parse_struct_or_union_specifiercCs<g}|��dvr|��}|durq|�|�|��dvs|S�N>rN)r��_parse_struct_declarationr�)rr}�itemsrrrrTs
�z&CParser._parse_struct_declaration_listcCs
|��dkr|��dS|��dvr|��gS|��}d|�dg�vs%J�d}|��s1|��dkr5|��}|durE|�d�|j||d�St	|d�dkrs|dd	}t
|tj�r\|}nt�
|�}|�d�|j|t|ddd
�gd�S|�d�|j|tdddd
�gd�S)Nr�r�r�rw�COLON�r{r}r^rrr�)r�r�r�rrTr��_parse_struct_declarator_listr�r�rNr_r
�Noderkr4)rr{r}�nodeZ	decl_typerrrr`s4



�
�z!CParser._parse_struct_declarationcCs0|��g}|�d�r|�|���|�d�s
|S�Nr)�_parse_struct_declaratorr�rKr�rrrr�s



�z%CParser._parse_struct_declarator_listcCs\|�d�r|��}t�dddd�d|d�S|��}|�d�r(|��}|d|d�S|ddd�S)Nrr�)r�r
r
r`r)rr�r\rrrr�s
�
z CParser._parse_struct_declaratorcCs�|�d�}|��dvr8|��}|��dkr-|��|��}|�d�t�|j||�|��St�|jd|�|��S|�d�|��}|�d�t�d||�|��S)Nr�>r�r�r�r)r�r�r��_parse_enumerator_listr
r�r@rA)rrCrZenumsrrrr�s



zCParser._parse_enum_specifiercCsV|��}t�|g|j�}|�d�r)|��dkr	|S|��}|j�|�|�d�s|S)Nrr)�_parse_enumeratorr
ZEnumeratorListrIr�r�ZenumeratorsrK)r�enumZ	enum_listrrrr�s
�
�zCParser._parse_enumerator_listcCsL|�d�}|�d�r|��}nd}t�|j||�|��}|�|j|j	�|S)Nr�r�)
r�r�r
r
Z
Enumeratorr@rArWrQrI)rrr@rrrrr�s


zCParser._parse_enumeratorcCs"|jddd�\}}|dusJ�|S)NF�r�r�)r�)rr\r�rrrr�s

�zCParser._parse_declaratorcC�|jddd�S)NrgT�rs�allow_paren��_parse_declarator_kindrLrrrr���zCParser._parse_id_declaratorcCr!)N�typeidTr"r$rLrrrr��r&z CParser._parse_typeid_declaratorcCr!)Nr'Fr"r$rLrrrr��r&z(CParser._parse_typeid_noparen_declaratorr#cCs>d}|��dkr|��}|j||d�}|dur|�||�S|S)Nr��r#)r��_parse_pointer�_parse_direct_declaratorra)rrsr#�ptrZdirectrrrr%�szCParser._parse_declarator_kindcCsl|r|�d�r|j|dd�}|�d�n|dkr|�d�}n|�d�}tj|jddd|�|�d�}|�|�S)	Nr�Tr(r�rgr�r�r�)r�r%r�r
r`r@rA�_parse_decl_suffixes)rrsr#r\rrrrr*�s
�
z CParser._parse_direct_declaratorcCsL	|��dkr|�||�|��}q|��dkr#|�|�}|�||�}q	|S)zAParse a chain of array/function suffixes and attach them to decl.Tr�r�)r�ra�_parse_array_decl�_parse_function_decl)rr\r�rrrr,�s
zCParser._parse_decl_suffixes�	base_declcCs|jd|jd�S�N��	base_typerI)�_parse_array_decl_commonrI)rr/rrrr-	r�zCParser._parse_array_declr2csf|�d�}�dur|�|����fdd�}|�d�r1dg|��p!g}|��}|�d�|||�S|��tvr�|��p<g}|�d�rU|dg}|��}|�d�|||�S|�d�}|rp|�d�t�|j	|�|��}|||�Sd}|�
�rz|��}|�d�|||�S|�d�}|r�|�d�t�|j	|�|��}||g�Sd}|�
�r�|��}|�d�||g�S)	a9Parse an array declarator suffix and return an ArrayDecl node.

        base_type:
            Base declarator node to attach (None for direct-declarator parsing,
            TypeDecl for abstract declarators).

        coord:
            Coordinate to use for the ArrayDecl. If None, uses the '[' token.
        r�Ncstj�||�d�S)N)r^�dim�	dim_qualsrI)r
Z	ArrayDecl)r4r5r1rr�make_array_decls�z9CParser._parse_array_decl_common.<locals>.make_array_decl�STATICZstatic�RBRACKETr�)r�rAr�r	�_parse_assignment_expressionr�r�r
r�r@r�)rr2rIZ
lbrack_tokr6r5r4�	times_tokrr1rr3sH


















z CParser._parse_array_decl_commoncCs�|�d�|�d�r
d}n|��r|��n|��}|�d�tj|d|jd�}|��dkrQ|j	durQ|j	j
D]}t|tj�rA|St
|dd�}|rP|�||j�q6|S)Nr�r���argsr^rIr�rQ)r�r�r��_parse_parameter_type_list�_parse_identifier_list_optr
rlrIr�r<�paramsr_�
EllipsisParam�getattrrW)rr/r<r��paramrQrrrr.Fs(


��

��zCParser._parse_function_declcCsng}|�d�}|r |��pg}|�||�|�f�|�d�}|s	|s$dSd}|D]\}}tj|||d�}q(|S)Nr�)rjr^rI)r�r	rKrAr
ZPtrDecl)rZstarsr:rjr+rIrrrr)`s

�zCParser._parse_pointercCsN|��}|��dkr%|�d�dkr%|��|��}|j�t�|�|���|S�Nrr��ELLIPSIS)�_parse_parameter_listr�r�r?rKr
r@rA)rr?Zell_tokrrrr=qsz"CParser._parse_parameter_type_listcCsh|��}t�|g|j�}|��dkr2|�d�dkr2|��|j�|���|��dkr2|�d�dks|SrC)�_parse_parameter_declarationr
�	ParamListrIr�r�r?rK�rr�r?rrrrEzs�zCParser._parse_parameter_listcCs�|jdd�\}}}|dstjdg|d�g|d<|��r=|jddd�\}}|r6|j|t|ddd�gd�d	S|�|||�S|��}|�|||�S)
NTr�r^r$rdr r�rr)	r�r
rkr�r�r�r4�_build_parameter_declarationr�)rr{r�r�r\Zis_namedrrrrF�s 
���z$CParser._parse_parameter_declarationr�c
Cs�t|d�dkr.t|ddj�dkr.|�|ddjd�r.|j|t|ddd�gd�dStjd|dd|p>t�dddd�|d	�}|�||d�S)
Nr^rrRrr�rr'rv�rQrjr�r^rI)	rNrerYr�r4r
�Typenamer`ro)rr{r\r�rrrrI�s"����z$CParser._build_parameter_declarationcC�|��dkrdS|��S�Nr�)r��_parse_identifier_listrLrrrr>��z"CParser._parse_identifier_list_optcCs@|��}t�|g|j�}|�d�r|j�|���|�d�s|Sr)�_parse_identifierr
rGrIr�r?rKrHrrrrN�s

�zCParser._parse_identifier_listc
Cs�|��}|��}d}|dur|j}n|dr|ddj}tjd|ddd�d|p1t�dddd�|d�}ttj|�||d��S)Nr^rr'rvrJ)rr�rIr
rKr`rro)rr{r\rIrbrrrr��s�zCParser._parse_type_namecCsb|��dkr'|��}|��r|��}nt�dddd�}|dus!J�|�||�S|��r/|��SdS)Nr�)r�r)r��!_parse_direct_abstract_declaratorr
r`ra)rr+r\rrrr��s
z&CParser._parse_abstract_declarator_optcCs�|�d�}|r<|��s|��dkr,|��}|�d�tj|t�dddd�|�|�d�}n#|�	�}|�d�|dus;J�n|��dkrG|�
�}n|�d|jj
�|�|�S)Nr�r�r;r�zInvalid abstract declarator)r�r�r��_parse_parameter_type_list_optr�r
rlr`rAr��_parse_abstract_array_baser?r3r9r,)rr�r?r\rrrrQ�s"

�


z)CParser._parse_direct_abstract_declaratorcCrLrM)r�r=rLrrrrR�rOz&CParser._parse_parameter_type_list_optcCs|jt�dddd�dd�Sr0)r3r
r`rLrrrrSs�z"CParser._parse_abstract_array_basecCs0|��}|dkrndkrnn|��Sdkr(|�d�dkr(|��Sdkr1|��Sdkr7ndkr<nn|��Sd	krJnd
krOndkrTnn|��Sdkrbnd
krgndkrlndkrqnn|��Sdkrndkr�nn|��Sdkr�|��S	|��S)N�CASE�DEFAULTr�r�rr��IF�SWITCH�WHILE�DO�FOR�GOTO�BREAK�CONTINUE�RETURNr�r�r�)	r��_parse_labeled_statementr��_parse_selection_statement�_parse_iteration_statement�_parse_jump_statementr�r��_parse_expression_statementr�rrr�_parse_statement
s(
(2zCParser._parse_statementcCs>|��dvr|��}|��}tj||g|djd�S|��S)Nr�r��block_itemsrI)r��_parse_pppragma_directive_listrdr
�CompoundrI)r�pragmas�stmtrrr�_parse_pragmacomp_or_statement$s
z&CParser._parse_pragmacomp_or_statementcCs|��r|��S|��SrJ)r�r�rdrLrrr�_parse_block_item,szCParser._parse_block_itemcCsTg}|��dvr(|��}t|t�r|dgkrq|�|�n|�|�|��dvs|Sr)r�rlr_�listr�rK)rr�itemrrr�_parse_block_item_list2s


�zCParser._parse_block_item_listcCsN|�d�}|�d�rtjd|�|�d�S|��}|�d�tj||�|�d�S)Nr�rre)r�r�r
rhrAro)r�
lbrace_tokrfrrrr�?s



�z!CParser._parse_compound_statementcCs|��}|dkr/|��}|�d�|��r|��}nt�|�|��}t�|j	||�|��Sdkr]|��}|�
�}|�d�|��rJ|��}nt�|�|��}t�||g|�|��Sdkr�|��}|�d�|��rr|��}nt�|�|��}t�|g|�|��S	|�
d|jj�dS)Nr�rrTrUzInvalid labeled statement)r�r�r�r�rkr
�EmptyStatementrAZLabelr@r
ZCaseZDefaultr?r3r9)rr�rrjZcase_tokrZdef_tokrrrr_Ls4







z CParser._parse_labeled_statementcCs�|��}|jdkr<|�d�|��}|�d�|��}|�d�r1|��}t�||||�|��St�||d|�|��Sdkr]|�d�|��}|�d�|��}t	t�
|||�|���S	|�d|�|��dS)NrVr�r��ELSErWzInvalid selection statement)r�r^r��_parse_expressionrkr�r
ZIfrArZSwitchr?)rrC�condZ	then_stmtZ	else_stmtrrjrrrr`ms&





z"CParser._parse_selection_statementc	Cs�|��}|jdkr'|�d�|��}|�d�|��}t�|||�|��SdkrR|��}|�d�|�d�|��}|�d�|�d�t�|||�|��Sdkr�|�d�|�	�r�|�
�}t�||�|��}|��}|�d�|��}|�d�|��}t�
|||||�|��S|��}|�d�|��}|�d�|��}|�d�|��}t�
|||||�|��S	|�d|�|��dS)NrXr�r�rYr�rZzInvalid iteration statement)r�r^r�rsrkr
ZWhilerAZDoWhiler�r�ZDeclList�_parse_expression_optZForr?)rrCrtrjr}r�Z	next_exprrrrra�sJ













z"CParser._parse_iteration_statementcCs�|��}|jdkr|�d�}|�d�t�|j|�|��Sdkr1|�d�t�|�|��SdkrC|�d�t�|�|��Sdkrf|�	d�rTt�
d|�|��S|��}|�d�t�
||�|��S	|�d|�|��dS)Nr[r�r�r\r]r^zInvalid jump statement)
r�r^r�r
ZGotor@rAZBreak�Continuer�ZReturnrsr?)rrCrrrrrrb�s(








zCParser._parse_jump_statementcCs.|��}|�d�}|durt�|�|��S|Sr�)rur�r
rqrA)rrZsemi_tokrrrrc�s

z#CParser._parse_expression_statementcCs|��r|��SdSrJ)r�rsrLrrrru�szCParser._parse_expression_optcCsR|��}|�d�s|S||��g}|�d�r"|�|���|�d�st�||j�Sr�r9r�rKr
�ExprListrI�rrZexprsrrrrs�s


�zCParser._parse_expressioncCsp|��dkr|�d�dkr|��|��}|�d�|S|��}|��r6|��j}|��}t�	||||j
�S|S)Nr�r�r�r�)r�r�r�r��_parse_conditional_expressionr�r@r9r
Z
AssignmentrI)r�compr�op�rhsrrrr9�s

z$CParser._parse_assignment_expressioncCsB|��}|�d�r|��}|�d�|��}t�||||j�S|S)NZCONDOPr)�_parse_binary_expressionr�rsr�rzr
Z	TernaryOprI)rrZiftrueZiffalserrrrz�s

z%CParser._parse_conditional_expressionr�min_prec�lhsc	Cs�|dur|��}	|��}|dus|jtvr	|St|j}||kr%	|S|j}|��|��}	|��}|dus>|jtvr?nt|j}||krO|�||�}nnq1t�||||j	�}q	rJ)
�_parse_cast_expressionr>r^�_BINARY_PRECEDENCEr@r�r~r
ZBinaryOprI)	rrr�rCZprecr|r}Znext_tokZ	next_precrrrr~�s2
��
�
�z CParser._parse_binary_expressioncCs\|��}|dur*|\}}}|��dkr|�|�|��S|��}t�|||�|��S|��S)Nr�)r�r�r�r�r
ZCastrA�_parse_unary_expression)r�resultrmr�r�rrrrr�s

�zCParser._parse_cast_expressioncCs|��}|dvr|��}|��}t�|j||j�S|dvr.|��}|��}t�|j||j�S|dkr]|��}|��}|durN|\}}}t�|j||�	|��S|��}t�|j||�	|��S|dkr~|��}|�
d�|��}|�
d�t�|j||�	|��S|��S)N��
MINUSMINUS�PLUSPLUS>�LNOT�AND�NOT�PLUS�MINUSr��SIZEOF�_ALIGNOFr�r�)
r�r�r�r
�UnaryOpr@rIr�r�rAr�r��_parse_postfix_expression)rr�rCrr�rmr�rrrr�4s0


zCParser._parse_unary_expressionc
Csj|��}|dur+|\}}}|�d�r&|��}|�d�|�d�t�||�S|�|�|��}	|�d�rG|��}|�d�t�	|||j
�}q/|�d�rk|��dkrY|��d}n	|�
�}|�d�t�|||j
�}q/|��d	vr�|��}	|��}
|
jd
vr�|�d|�|
��t�|
j|�|
��}t�||	j||j
�}q/|��dvr�|��}t�d
|j||j
�}q/	|S)Nr�rrTr�r8r�r�>�PERIODZARROW>r�r�zInvalid struct referencer��p)r�r��_parse_initializer_listr�r
ZCompoundLiteralr��_parse_primary_expressionrs�ArrayRefrIr�r��_parse_argument_expression_list�FuncCallr^r?rAr�r@�	StructRefr�)
rr�rmr�r�r�r�subr<Zop_tokr�fieldrCrrrr�TsP










�z!CParser._parse_postfix_expressioncCs�|��}|dkr|��S|tvs|tvs|tvr|��S|tvr$|��S|tvr,|�	�S|dkr?|�
�|��}|�d�|S|dkru|�
�}|�d�|�
�}|�d�|��}|�d�|�|�}t�t�|j|�t�||g|�|�S|�d|jj�dS)Nr�r�r��OFFSETOFrzInvalid expression)r�rP�
_INT_CONST�_FLOAT_CONST�_CHAR_CONST�_parse_constant�_STRING_LITERAL�_parse_unified_string_literal�
_WSTR_LITERAL�_parse_unified_wstring_literalr�rsr�r��!_parse_offsetof_member_designatorrAr
r�r�r@rxr?r3r9)rr�rZoff_tokrmZ
designatorrIrrrr��s<




�z!CParser._parse_primary_expressioncCsd|��}	|�d�r|��}t�|d||j�}q|�d�r/|��}|�d�t�|||j�}q	|S)NTr��.r�r8)�_parse_identifier_or_typeidr�r
r�rIrsr�r�)rrr�rrrrr��s


z)CParser._parse_offsetof_member_designatorcCs>|��}|g}|�d�r|�|���|�d�st�||j�Srrwryrrrr��s

�z'CParser._parse_argument_expression_listcCs|��SrJ)rzrLrrrr
�sz"CParser._parse_constant_expressioncCs|�d�}t�|j|�|��S)Nr�)r�r
r�r@rAr�rrrrP�s
zCParser._parse_identifiercCs8|��}|jdvr|�d|�|��t�|j|�|��S)N>r�r�zExpected identifier)r�r^r?rAr
r�r@r�rrrr��s
z#CParser._parse_identifier_or_typeidcCs|��}|jtvrMd}d}|jdd�D]}|dvr|d7}q|dvr'|d7}q|dkr0td��|dkr8td��d	|d
|}t�|d|j|�|��S|jtvrs|jdd
vr\d}n|jddvrfd}nd}t�||j|�|��S|jt	vr�t�d|j|�|��S|�
d|�|��dS)Nr���)�l�Lr)�u�Uz.Constant cannot have more than one u/U suffix.r�z.Constant cannot have more than two l/L suffix.z	unsigned zlong r$rR)�f�F�floatzlong doubleZdouble�charzInvalid constant)r�r^r�r@�
ValueErrorr
�ConstantrAr�r�r?)rrCZu_countZl_count�ch�prefixr�rrrr��s4

�

zCParser._parse_constantcCsb|�d�}t�d|j|�|��}|��dkr/|��}|jdd�|jdd�|_|��dks|S)N�STRING_LITERAL�stringrRr)r�r
r�r@rAr�r��rrCrZtok2rrrr��s
�z%CParser._parse_unified_string_literalcCs�|��}|jtvr|�d|�|��t�d|j|�|��}|��tvr>|��}|j�	�dd�|jdd�|_|��tvs#|S)NzInvalid string literalr�rRr�)
r�r^r�r?rAr
r�r@r��rstripr�rrrr��s
"�z&CParser._parse_unified_wstring_literalcCsR|�d�}|r%|�d�rt�g|�|��S|��}|�d�|�d�|S|��S)Nr�rr)r�r
�InitListrAr�r�r9)rrpZ	init_listrrrr�s



zCParser._parse_initializercCsL|��g}|�d�r|��dkrn|�|���|�d�s
t�||dj�S)Nrrr)�_parse_initializer_itemr�r�rKr
r�rI)rrrrrr�s


�zCParser._parse_initializer_listcCs8d}|��dvr|��}|��}|durt�||�S|S�N>r�r�)r��_parse_designationr�r
ZNamedInitializer)rZdesignationr�rrrr�%szCParser._parse_initializer_itemcCr�)Nr�)�_parse_designator_listr��rZdesignatorsrrrr�/r�zCParser._parse_designationcC�.g}|��dvr|�|���|��dvs|Sr�)r�rK�_parse_designatorr�rrrr�5r�zCParser._parse_designator_listcCsF|�d�r|��}|�d�|S|�d�r|��S|�d|jj�dS)Nr�r8r�zInvalid designator)r�r
r�r�r?r3r9)rrrrrr�=s


zCParser._parse_designatorcCs |�d�}|�d|�|��dS)Nr�zDirectives not supported yet)r�r?rAr�rrrr�Js
zCParser._parse_pp_directivecCs�|��dkr'|��}|��dkr|��}t�|j|�|��St�d|�|��S|��dkrH|��}|�d�}|��}|�d�t�||�|��S|�d|j	j
�dS)Nr�ZPPPRAGMASTRr'r�r�r�zInvalid pragma)r�r�r
ZPragmar@rAr�r�r?r3r9)rrCZstr_tokZlparen�literalrrrr�Ps

z!CParser._parse_pppragma_directivecCr�)Nr�)r�rKr�)rrirrrrgbr�z&CParser._parse_pppragma_directive_listcCsR|�d�}|�d�|��}d}|�d�r|��}|�d�t�|||�|��gS)Nr�r�rr�)r�r
r�r�r
ZStaticAssertrA)rrCrtrHrrrr�is



zCParser._parse_static_assert)r'FrJ)rN)F�r)FF)rrqr�)rr~)T)rN)�rrr r!r�boolr^r"r8r
r�rDr$rrrFrr?rMrPrVrWrYr/r0r1r2rrrar�r�rKrror|r�r�r�rr>r�r�r�r�r�r�rAr�r�r�r�r	r�r�r�r�r�r�r=r�r�r�r�r�r�r�rr	rrr�r
rrrrrrrrrr�r�r�r%r*r,r-r3r.r)rGr=rErFrIr>rNr�r�rQrRrSrdrkrlror�r_r`rarbrcrursr9rzr~r�r�r�r�r�r�r
rPr�r�r�r�r�r�r�r�r�r�r�r�rgr�rrrrr&2s�
��������	
�����
�	
*,��
�-�����
�����
�g����
�
���
�#
�V��
�*��
�{c
���
�!"
���
����
�:	
���
�

!*���
�" 2% 	
	

r&>ZRSHIFTEQUALZ
TIMESEQUALZANDEQUAL�	PLUSEQUALZXOREQUALZOREQUALZ
MINUSEQUALr�ZMODEQUALZDIVEQUALZLSHIFTEQUALZLORZLAND�ORr�ZXOR�r��ZEQ�ZNEZGT�ZGEZLTZLEZRSHIFT�ZLSHIFTr��r�r��	ZDIVIDEZMOD>ZTYPEDEFZ
_THREAD_LOCALZREGISTERr7ZAUTOZEXTERNZINLINEZ	_NORETURN>ZVOLATILEZCONSTZRESTRICTr�>ZDOUBLEZFLOATZSHORTZSIGNEDZCHARZINTZVOIDZLONGZ__INT128ZUNSIGNEDZ_BOOLZ_COMPLEX>r�r�r�r�r�r�>
r�r�r�r�r�r�r�r�r�r�r�r�r�>Z
INT_CONST_BINZ
INT_CONST_OCTZ
INT_CONST_HEXZ
INT_CONST_DECZINT_CONST_CHARZFLOAT_CONSTZHEX_FLOAT_CONST>Z
U32CHAR_CONSTZ
U16CHAR_CONSTZU8CHAR_CONSTZWCHAR_CONSTZ
CHAR_CONSTr�>ZWSTRING_LITERALZU16STRING_LITERALZU8STRING_LITERALZU32STRING_LITERAL>r]r�r�rUr�rZrWr\r^rTrYr�r�r[rVrXc@s~eZdZdZdeddfdd�Zddedeefd	d
�Z	deefdd�Z
defd
d�Zdeddfdd�Zdeddfdd�Z
dS)r6z�Wraps a lexer to provide convenient, buffered access to the underlying
    token stream. The lexer is expected to be initialized with the input
    string already.
    r)rNcCs||_g|_d|_dS)Nr)�_lexer�_buffer�_index)rr)rrrr8	s
z_TokenStream.__init__rr�cCs*|dkrdS|�|�|j|j|dS)z�Peek at the k-th next token in the stream, without consuming it.

        Examples:
            k=1 returns the immediate next token.
            k=2 returns the token after that.
        rNr��_fillr�r�r�rrrr�
	s
z_TokenStream.peekcCs(|�d�|j|j}|jd7_|S)z%Consume a single token and return it.rr�r�rrrr�	s
z_TokenStream.nextcCs|jSrJ�r�rLrrrr�"	sz_TokenStream.markr�cCs
||_dSrJr�r�rrrr�%	r�z_TokenStream.reset�ncCsRt|j�|j|kr'|j��}|j�|�|durdSt|j�|j|ks
dSdSrJ)rNr�r�r�r�rK)rr�rCrrrr�(	s
�z_TokenStream._fillr�)rrr r!rr8r$rrr�r�r�r�r�rrrrr6�sr6c@sJeZdZUeeed<eeed<eeed<eeed<eeed<dS)rqrvrwr^rxryN)rrr rrr#rrrrrq6	s
rqruc@s8eZdZUeejed<eejed<eejed<dS)r~r\r�r�N)rrr rr
rr#rrrrr~A	s
r~N)+Zdataclassesr�typingrrrrrrr	r
rr'r
Zc_lexerrrZast_transformsrrr�	Exceptionr%r&r�r�rrr�rr�Z_EXPR_STARTr�r�r�r�r�r�r�r6rqrtr~rrrr�<module>s�,R��������	�
���
�����������������	7