o
    Èó·iÆ^ ã                   @   sÎ  d dl mZ d dlmZmZmZmZmZmZm	Z	m
Z
mZ ddlmZ ddlmZmZ ddlmZmZ eG dd„ dƒƒZG d	d
„ d
eƒZG dd„ dƒZh d£Zi dd “dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“d d“d!d"“d#d"“d$d%“d&d%“d'd%i¥Zh d(£Zd)d*hZh d+£Zh d,£ZeeB eB eB h d-£B Zh d.£Zh d/£Z d0d1hZ!h d2£Z"d3hZ#h d4£Z$ee B e!B e"B e#B e$B Z%h d5£Z&G d6d7„ d7ƒZ'G d8d9„ d9e
ƒZ(ed: Z)G d;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@   e Zd ZU dZeed< eed< dZee ed< defdd„Z	dS )	ÚCoordzkCoordinates of a syntactic element. Consists of:
    - File name
    - Line number
    - Column number
    ÚfileÚlineNÚcolumnÚreturnc                 C   s,   | j › d| j› �}| jr|d| j› �7 }|S )Nú:©r   r   r   )ÚselfÚtext© r   úXC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\pycparser/c_parser.pyÚ__str__'   s   zCoord.__str__)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚstrÚ__annotations__Úintr   r   r   r   r   r   r   r      s   
 r   c                   @   s   e Zd ZdS )Ú
ParseErrorN)r   r   r    r   r   r   r   r%   .   s    r%   c                   @   s
  e Zd ZdZdedddddfdedee d	ed
ededededdfdd„Z	�d'dededede	j
fdd„Z�d(dedee defdd„ZdedeeB dB defdd„Z�d)dd „Z�d)d!d"„Zd#edee ddfd$d%„Zd#edee ddfd&d'„Zd#edefd(d)„Zded*ededdfd+d,„Z�d)d-d.„Z�d)d/d0„Zd#edefd1d2„Zd3ed4ede	jfd5d6„Zd3e	je	jB e	j B d7e!e de	je	jB e	j B fd8d9„Z"	�d*d:ed; d<ed=d>d?edd;f
d@dA„Z#	�d*dBd;dCe!dD dEede!e	j fdFdG„Z$dBd;d3e	jdHee!e	j  dIe	jde	jf
dJdK„Z%dLedefdMdN„Z&�d+dPedee' fdQdR„Z(�d+dPedee fdSdT„Z)de'fdUdV„Z*dWedee' fdXdY„Z+dWede'fdZd[„Z,defd\d]„Z-d^eddfd_d`„Z.dae'defdbdc„Z/�d(daee' defddde„Z0�d(daee' defdfdg„Z1defdhdi„Z2�d*djedefdkdl„Z3de4ee ef fdmdn„Z5	�d,doedpede4ee	j ef fdqdr„Z6de4ee ef fdsdt„Z7defdudv„Z8defdwdx„Z9dee4e	j ee'f  fdydz„Z:de	j
fd{d|„Z;de!e	j fd}d~„Z<de!e	j fdd€„Z=de!e	j fd�d‚„Z>de!e	j fdƒd„„Z?dBd;d…ede!e	j fd†d‡„Z@de!e	j fdˆd‰„ZA	�d*dŠede4d;eee f fd‹dŒ„ZB�d-d�dŽ„ZCde!e fd�d�„ZDde	jfd‘d’„ZEde	jfd“d”„ZF	�d.d•edD djede!dD fd–d—„ZG�d*djeddDfd˜d™„ZHde	jfdšd›„ZIde!e	j fdœd�„ZJdee!e	j  fdždŸ„ZKde!dD fd d¡„ZL�d/d¢d£„ZMde	jfd¤d¥„ZNde	jfd¦d§„ZOde	jfd¨d©„ZPde	jfdªd«„ZQde	jfd¬d­„ZRde	jfd®d¯„ZSde	jfd°d±„ZTd=ed²ede	jfd³d´„ZU	�d0d=ed²ede	jfdµd¶„ZVd3e	jde	jfd·d¸„ZWd¹e	jde	jfdºd»„ZX	�d(d¼ee	j dee de	jfd½d¾„ZYd¹e	jde	jfd¿dÀ„ZZdee	j fdÁdÂ„Z[de	j\fdÃdÄ„Z]de	j\fdÅdÆ„Z^de	jfdÇdÈ„Z_dBd;d3ee	j dÉee de	jfdÊdË„Z`dee	j fdÌdÍ„Zade	jfdÎdÏ„Zbde	j fdÐdÑ„Zcdee	j fdÒdÓ„Zdde	jfdÔdÕ„Zedee	j\ fdÖd×„Zfde	jfdØdÙ„Zgde	je!e	j B fdÚdÛ„Zhde	je!e	j B fdÜdÝ„Zide	je!e	j B fdÞdß„Zjde!e	j fdàdá„Zkde	jfdâdã„Zlde	jfdädå„Zmde	jfdædç„Znde	jfdèdé„Zode	jfdêdë„Zpde	jfdìdí„Zqdee	j fdîdï„Zrde	jfdðdñ„Zsde	jfdòdó„Ztde	jfdôdõ„Zu	�d1d÷edøee	j de	jfdùdú„Zvde	jfdûdü„Zwde	jfdýdþ„Zxde	jfdÿ�d „Zyde	jf�d�d„Zzde	jf�d�d„Z{de	jf�d�d„Z|de	jf�d�d„Z}de	jf�d	�d
„Z~de	jf�d�d„Zde	jf�d�d„Z€de	jf�d�d„Z�de	jf�d�d„Z‚de	jf�d�d„Zƒde	jf�d�d„Z„de	jf�d�d„Z…de!e	j f�d�d„Z†de!e	j f�d�d„Z‡de	jf�d�d„Zˆdef�d�d „Z‰de	jf�d!�d"„ZŠde!e	j f�d#�d$„Z‹de!e	j f�d%�d&„ZŒdS (2  ÚCParseraF  Recursive-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.
    Tzpycparser.lextabzpycparser.yacctabFÚ Úlex_optimizeÚlexerÚlextabÚyacc_optimizeÚyacctabÚ
yacc_debugÚtaboutputdirr   Nc                 C   s4   || j | j| j| jd�| _tƒ g| _t| jƒ| _d S )N)Z
error_funcZon_lbrace_funcZon_rbrace_funcZtype_lookup_func)	Ú_lex_error_funcÚ_lex_on_lbrace_funcÚ_lex_on_rbrace_funcÚ_lex_type_lookup_funcÚclexÚdictÚ_scope_stackÚ_TokenStreamÚ_tokens)r   r(   r)   r*   r+   r,   r-   r.   r   r   r   Ú__init__>   s   
ü
zCParser.__init__r   ÚfilenameÚdebugc                 C   sZ   t ƒ g| _| j ||¡ t| jƒ| _|  ¡ }|  ¡ }|dur+|  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: )r4   r5   r3   Úinputr6   r7   Ú _parse_translation_unit_or_emptyÚ_peekÚ_parse_errorÚvalueÚ
_tok_coord)r   r   r9   r:   ÚastÚtokr   r   r   ÚparseZ   s   
zCParser.parseÚlinenor   c                 C   s   t | jj||d�S )Nr   )r   r3   r9   )r   rE   r   r   r   r   Ú_coordv   ó   zCParser._coordÚmsgÚcoordc                 C   s   t |› d|› �ƒ‚)Nz: )r%   )r   rH   rI   r   r   r   r?   y   rG   zCParser._parse_errorc                 C   s   | j  tƒ ¡ d S ©N)r5   Úappendr4   ©r   r   r   r   Ú_push_scope|   rG   zCParser._push_scopec                 C   s    t | jƒdks	J ‚| j ¡  d S )Nr   )Úlenr5   ÚpoprL   r   r   r   Ú
_pop_scope   s   zCParser._pop_scopeÚnamec                 C   s8   | j d  |d¡s|  d|›d�|¡ d| j d |< dS )z9Add a new typedef name (ie a TYPEID) to the current scopeéÿÿÿÿTzTypedef z1 previously declared as non-typedef in this scopeN©r5   Úgetr?   ©r   rQ   rI   r   r   r   Ú_add_typedef_nameƒ   s   
þzCParser._add_typedef_namec                 C   s8   | j d  |d¡r|  d|›d�|¡ d| j d |< dS )z`Add a new object, function, or enum member name (ie an ID) to the
        current scope
        rR   FzNon-typedef z- previously declared as typedef in this scopeNrS   rU   r   r   r   Ú_add_identifierŒ   s   
þzCParser._add_identifierc                 C   s.   t | jƒD ]}| |¡}|dur|  S qdS )z.Is *name* a typedef-name in the current scope?NF)Úreversedr5   rT   )r   rQ   ZscopeZin_scoper   r   r   Ú_is_type_in_scope—   s   
ÿzCParser._is_type_in_scoper   c                 C   s   |   ||  ||¡¡ d S rJ   )r?   rF   )r   rH   r   r   r   r   r   r/   ¡   s   zCParser._lex_error_funcc                 C   ó   |   ¡  d S rJ   )rM   rL   r   r   r   r0   ¤   ó   zCParser._lex_on_lbrace_funcc                 C   rZ   rJ   )rP   rL   r   r   r   r1   §   r[   zCParser._lex_on_rbrace_funcc                 C   s
   |   |¡S )zšLooks up types that were previously defined with
        typedef.
        Passed to the lexer for recognizing identifiers that
        are types.
        N)rY   )r   rQ   r   r   r   r2   ª   s   
zCParser._lex_type_lookup_funcÚdeclÚmodifierc                 C   sh   |}|}|j r|j }|j st|tjƒr||_ |S |}t|j tjƒs+|j }t|j tjƒr!|j |_ ||_ |S )z—Tacks a type modifier on a declarator, and returns
        the modified declarator.

        Note: the declarator and modifier may be modified
        N)ÚtypeÚ
isinstancer   ÚTypeDecl)r   r\   r]   Zmodifier_headZmodifier_tailZ	decl_tailr   r   r   Ú_type_modify_declÔ   s   ÿÿzCParser._type_modify_declÚtypenamec                 C   sÖ   |}t |tjƒs|j}t |tjƒr|j|_|jdd… |_|D ]}t |tjƒs<t|ƒdkr5|  	d|j
¡ q||_|  S q|sYt |jtjƒsM|  	d|j
¡ tjdg|j
d�|_|S tjdd„ |D ƒ|d	 j
d�|_|S )
z#Fixes a declaration. Modifies decl.Nr   z Invalid multiple types specifiedúMissing type in declarationr$   ©rI   c                 S   s   g | ]
}|j D ]}|‘qqS r   )Únames)Ú.0ÚidrQ   r   r   r   Ú
<listcomp>$  s    z/CParser._fix_decl_name_type.<locals>.<listcomp>r   )r_   r   r`   r^   ÚdeclnamerQ   ÚqualsÚIdentifierTyperN   r?   rI   ÚFuncDecl)r   r\   rb   ÚtypÚtnr   r   r   Ú_fix_decl_name_type   s,   ÿûýÿzCParser._fix_decl_name_typeÚdeclspecÚ	_DeclSpecÚnewspecÚkindÚ_DeclSpecKindrK   c                 C   sJ   |du rt g g g g g d�}n|}|r||  |¡ |S ||  d|¡ |S )z2See _DeclSpec for the specifier dictionary layout.N©ÚqualÚstorager^   ÚfunctionÚ	alignmentr   )r4   rK   Úinsert)r   rp   rr   rs   rK   Úspecr   r   r   Ú_add_declaration_specifier(  s   
ÿþz"CParser._add_declaration_specifierr{   ÚdeclsÚ	_DeclInfoÚtypedef_namespacec                 C   sn  d|d v }g }|d   d¡du r°|d d du rst|d ƒdk s8t|d d	 jƒd
ks8|  |d d	 jd ¡sQd}|d D ]}t|dƒrJ|j} qKq>|  d|¡ tj|d d	 jd dd|d |d d	 jd�|d d< |d d	= n=t	|d d tj
tjtjtjfƒs°tt|d d ƒ}t	|tjƒsœ|j}t	|tjƒr“|jdu r°|d d	 jd |_|d d	= |D ]‚}	|	d dus¼J ‚|rÒtjd|d |d |	d |	d jd�}
n!tjd|d |d |d |d |	d |	  d¡|	  d¡|	d jd�	}
t	|
jtj
tjtjtjfƒ�r|
}n|  |
|d ¡}|�r$|�r|  |j|j¡ n|  |j|j¡ tttjtjB |ƒƒ}| |¡ 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.
        Útypedefrw   r   ÚbitsizeNr\   r^   é   rR   r   ú?rI   úInvalid declarationry   ©ri   r^   rj   ÚalignrI   rv   )rQ   rj   rw   r^   rI   rx   Úinit©	rQ   rj   r†   rw   Zfuncspecr^   r‡   r�   rI   )rT   rN   re   rY   ÚhasattrrI   r?   r   r`   r_   ÚEnumÚStructÚUnionrk   r   r   r^   ri   ÚTypedefÚDeclro   rV   rQ   rW   r   rK   )r   r{   r}   r   Z
is_typedefZdeclarationsrI   ÚtZdecls_0_tailr\   ÚdeclarationZ
fixed_declr   r   r   Ú_build_declarations>  s�   ÿþý
þû
þÿ

û÷þÿzCParser._build_declarationsÚparam_declsÚbodyc                 C   sN   d|d v r|   d|j¡ | j|t|ddd�gdd�d }tj||||jd	�S )
zBuilds a function definition.r€   rw   zInvalid typedefN©r\   r‡   r�   T©r{   r}   r   r   )r\   r’   r“   rI   )r?   rI   r‘   r4   r   ZFuncDef)r   r{   r\   r’   r“   r�   r   r   r   Ú_build_function_definition¥  s   ýü
ÿz"CParser._build_function_definitionÚtokenc                 C   s   |dkrt jS t jS )z[Given a token (either STRUCT or UNION), selects the
        appropriate AST class.
        ÚstructN)r   r‹   rŒ   )r   r—   r   r   r   Ú_select_struct_union_classº  s   z"CParser._select_struct_union_classr   Úkc                 C   s   | j  |¡S )z:Return the k-th next token without consuming it (1-based).N)r7   Úpeek©r   rš   r   r   r   r>   Æ  s   zCParser._peekc                 C   s   |   |¡}|dur|jS dS )zDReturn the type of the k-th next token, or None if absent (1-based).N)r>   r^   )r   rš   rC   r   r   r   Ú
_peek_typeÊ  s   
zCParser._peek_typec                 C   s*   | j  ¡ }|d u r|  d| jj¡ d S |S )NzAt end of input)r7   Únextr?   r3   r9   ©r   rC   r   r   r   Ú_advanceÏ  s   
zCParser._advanceÚ
token_typec                 C   s&   |   ¡ }|dur|j|kr|  ¡ S dS )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    ©r   r¡   rC   r   r   r   Ú_acceptÖ  s   zCParser._acceptc                 C   s0   |   ¡ }|j|kr|  d|j› �|  |¡¡ |S )Nr;   )r    r^   r?   r@   rA   r¢   r   r   r   Ú_expectá  s   
zCParser._expectc                 C   s
   | j  ¡ S rJ   )r7   ÚmarkrL   r   r   r   Ú_markç  ó   
zCParser._markr¥   c                 C   s   | j  |¡ d S rJ   )r7   Úreset©r   r¥   r   r   r   Ú_resetê  ó   zCParser._resetrC   c                 C   s   |   |j|j¡S rJ   )rF   rE   r   rŸ   r   r   r   rA   í  r«   zCParser._tok_coordc                 C   ó"   |p|   ¡ }|d u rdS |jtv S ©NF)r>   r^   Ú_DECL_STARTrŸ   r   r   r   Ú_starts_declarationð  ó   
zCParser._starts_declarationc                 C   r¬   r­   )r>   r^   Ú_STARTS_EXPRESSIONrŸ   r   r   r   Ú_starts_expressionö  r°   zCParser._starts_expressionc                 C   s(   |   ¡ }|d u r
dS |tv rdS |  ¡ S )NFT)r�   Ú_STARTS_STATEMENTr²   ©r   Útok_typer   r   r   Ú_starts_statementü  s   zCParser._starts_statementÚid_onlyc                 C   s4   |   ¡ }|d u r
dS |dv rdS |r|dkS |dv S )NF>   ÚLPARENÚTIMESTÚID>   ÚTYPEIDrº   ©r�   )r   r·   rµ   r   r   r   Ú_starts_declarator  s   zCParser._starts_declaratorc                 C   s&   |   ¡ }|  ¡ \}}|  |¡ ||fS rJ   )r¦   Ú_scan_declarator_name_inforª   )r   r¥   rµ   Ú	saw_parenr   r   r   Ú_peek_declarator_name_info  s   
z"CParser._peek_declarator_name_infoÚallow_abstractÚtypeid_paren_as_abstractc                 C   s¢   |   ¡ \}}|d u s|r3|dkr3|r3|s+|  ¡ }|d ur!|  |¡n| jj}|  d|¡ |  ¡ }|dfS |dkrI|rA|  ¡ }|dfS |  ¡ }|dfS |  	¡ }|dfS )Nr»   zInvalid declaratorFT)
rÀ   r>   rA   r3   r9   r?   Ú_parse_abstract_declarator_optÚ _parse_typeid_noparen_declaratorÚ_parse_typeid_declaratorÚ_parse_id_declarator)r   rÁ   rÂ   Ú	name_typer¿   rC   rI   r\   r   r   r   Ú_parse_any_declarator  s,   ÿÿÿýÿzCParser._parse_any_declaratorc                 C   s  d}|   d¡r|  ¡ tv r|  ¡  |  ¡ tv s|   d¡s|  ¡ }|d u r(d |fS |jdv r6|  ¡  |j|fS |jdkr€d}|  ¡  |  ¡ \}}|rKd}d}	 |  ¡ }|d u rZd |fS |jdkrd|d7 }n|jdkr{|d8 }|  ¡  |dkrz	 ||fS qM|  ¡  qNd |fS )	NFr¹   >   r»   rº   r¸   Tr   ÚRPARENr   )r£   r�   Ú_TYPE_QUALIFIERr    r>   r^   r¾   )r   r¿   rC   rµ   Znested_parenÚdepthr   r   r   r¾   /  sF   
ÿ
ÿ





þôz"CParser._scan_declarator_name_infoc                 C   s   |   ¡ dv S )N>   r¸   ÚLBRACKETr¼   rL   r   r   r   Ú"_starts_direct_abstract_declaratorR  r[   z*CParser._starts_direct_abstract_declaratorc                 C   s   |   ¡ }|d uo|jtv S rJ   )r>   r^   Ú_ASSIGNMENT_OPSrŸ   r   r   r   Ú_is_assignment_opU  s   zCParser._is_assignment_opc                 C   sb   |   ¡ }|  d¡}|du rdS |  ¡ s|  |¡ dS |  ¡ }|  d¡du r,|  |¡ dS |||fS )ab  Parse 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)r   r¥   Ú
lparen_tokrm   r   r   r   Ú_try_parse_paren_type_nameY  s   




z"CParser._try_parse_paren_type_namec                 C   s$   |   ¡ d u rt g ¡S t |  ¡ ¡S rJ   )r>   r   ÚFileASTÚ_parse_translation_unitrL   r   r   r   r=   t  s   
z(CParser._parse_translation_unit_or_emptyc                 C   s.   g }|   ¡ d ur| |  ¡ ¡ |   ¡ d us|S rJ   )r>   ÚextendÚ_parse_external_declaration)r   Úextr   r   r   rÔ   z  ó
   ÿzCParser._parse_translation_unitc                 C   sÞ  |   ¡ }|d u r
g S |jdkr|  ¡  g S |jdv r|  ¡ gS |  d¡r&g S |jdkr/|  ¡ S |  |¡sf|  ¡ }d }|  ¡ dkrG|  	d|j
¡ tg g g tjdg|j
d�gg d	�}| j||||  ¡ d
�}|gS | jdd�\}}}|  ¡ \}}	|dkr†|  ||¡}
|  d¡ |
S |  ¡ }|  ¡ dks”|  ¡ rÈd }|  ¡ rž|  ¡ }|  ¡ dkr«|  	d|j
¡ |d sºtjdg|d�g|d< | j||||  ¡ d
�}|gS t|d d d�}|  d¡rÚ|  ¡ |d< | j|d�}
| j||
dd�}
|  d¡ |
S )NÚPPHASH¾   Ú_PRAGMAÚPPPRAGMAÚSEMIÚ_STATIC_ASSERTÚLBRACEzInvalid function definitionr$   rd   )rv   ry   rw   r^   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?   rI   r4   r   rk   r–   Ú_parse_compound_statementÚ_parse_declaration_specifiersrÀ   Ú_parse_decl_body_with_specr¤   Ú_parse_declaration_listÚ_parse_initializerÚ_parse_init_declarator_listr‘   )r   rC   r\   r’   r{   ÚfuncÚsaw_typeÚ
spec_coordrÇ   Ú_r}   Z	decl_dictr   r   r   rÖ   †  s|   





	ûüÿ
ü

z#CParser._parse_external_declarationc                 C   ó   |   ¡ }|  d¡ |S ©NrÝ   )Ú_parse_decl_bodyr¤   ©r   r}   r   r   r   Ú_parse_declarationÜ  ó   
zCParser._parse_declarationc                 C   s   | j dd�\}}}|  ||¡S )NTrà   )rè   ré   )r   r{   rî   rð   r   r   r   ró   â  s   zCParser._parse_decl_bodyrî   c                 C   sÜ   d }|r|   ¡ r|  ¡ }n| j dd�r| jdd�}|d u rd|d }tjtjtjf}t|ƒdkrTt|d |ƒrTtjd |d |d |d |d	 |d d d |d j	d
�	g}|S | j
|td d d d�gdd�}|S | j
||dd�}|S )NT©r·   r^   r   r   rv   ry   rw   rx   rˆ   r”   r•   )r½   rì   r   r‹   rŒ   rŠ   rN   r_   rŽ   rI   r‘   r4   )r   r{   rî   r}   ÚtyZs_u_or_er   r   r   ré   è  sD   €÷ÿöý
üÿz"CParser._parse_decl_body_with_specc                 C   s&   g }|   ¡ r| |  ¡ ¡ |   ¡ s|S rJ   )r¯   rÕ   rõ   rô   r   r   r   rê     s
   ÿzCParser._parse_declaration_listrá   c                 C   sœ  d}d}d}	 |   ¡ }|du r�q0|jdkr+|du r|  |¡}| j||  ¡ ddd�}q|jdkrN|  d¡d	krN|du r@|  |¡}| j||  ¡ d
dd�}d}q|jtv ri|du r\|  |¡}| j||  ¡ j	ddd�}q|jt
v r„|du rw|  |¡}| j||  ¡ j	ddd�}q|jtv rŸ|du r’|  |¡}| j||  ¡ j	ddd�}q|jtv rÇ|du r­|  |¡}|  ¡ }| j|tj|j	g|  |¡d�d
dd�}d}q|jdkró|rÐ�q0|du rÙ|  |¡}|  ¡ }| j|tj|j	g|  |¡d�d
dd�}d}q|jdv �r|du �r|  |¡}| j||  ¡ d
dd�}d}q|jdk�r/|du �r!|  |¡}| j||  ¡ d
dd�}d}q	 |du �r=|  d| jj¡ |�sI|�sI|  d|¡ |||fS )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^   rv   rw   rx   rd   r»   ¾   ÚUNIONÚSTRUCTÚENUMr„   rc   )r>   r^   rA   r|   Ú_parse_alignment_specifierr�   Ú_parse_atomic_specifierrÊ   r    r@   Ú_STORAGE_CLASSÚ_FUNCTION_SPECÚ_TYPE_SPEC_SIMPLEr   rk   Ú _parse_struct_or_union_specifierÚ_parse_enum_specifierr?   r3   r9   )r   rá   r{   rî   Úfirst_coordrC   r   r   r   rè     s¶   

ÿ
ÿ

ÿ

ÿ

ÿ

ü

ü

ÿ

ÿ

z%CParser._parse_declaration_specifiersc                 C   sV  d }d}d}d }	 |   ¡ }|d u rqø|jdkr.|d u r |  |¡}| j||  ¡ ddd�}d}q|jdkrQ|  d¡dkrQ|d u rC|  |¡}| j||  ¡ d	dd�}d}q|jtv rl|d u r_|  |¡}| j||  ¡ j	d
dd�}q|jt
v r”|d u rz|  |¡}|  ¡ }| j|tj|j	g|  |¡d�d	dd�}d}q|jdkr¿|rœqø|d u r¥|  |¡}|  ¡ }| j|tj|j	g|  |¡d�d	dd�}d}q|jdv rÛ|d u rÍ|  |¡}| j||  ¡ d	dd�}d}q|jdkr÷|d u ré|  |¡}| j||  ¡ d	dd�}d}q	 |d u �r|  d| jj¡ |�s|�s|  d|¡ | d¡d u �rg |d< | d¡d u �r)g |d< |S )NFTrù   ry   rú   rû   r‚   r¸   r^   rv   rd   r»   rü   rÿ   zInvalid specifier listrc   rw   rx   )r>   r^   rA   r|   r   r�   r  rÊ   r    r@   r  r   rk   r  r  r?   r3   r9   rT   )r   r{   rî   Zsaw_alignmentr  rC   r   r   r   Ú_parse_specifier_qualifier_list˜  s¦   

ÿ
ÿ

ÿ

ü

ü

ÿ

ÿ
z'CParser._parse_specifier_qualifier_listc                 C   s0   g }|   ¡ tv r| |  ¡ j¡ |   ¡ tv s|S rJ   )r�   rÊ   rK   r    r@   )r   rj   r   r   r   Ú_parse_type_qualifier_listû  s
   ÿz"CParser._parse_type_qualifier_listc                 C   sd   |   d¡}|   d¡ |  ¡ r |  ¡ }|   d¡ t ||  |¡¡S |  ¡ }|   d¡ t ||  |¡¡S )Nrù   r¸   rÉ   )r¤   r¯   rÐ   r   ZAlignasrA   Ú_parse_constant_expression)r   rC   rm   Úexprr   r   r   r     s   



z"CParser._parse_alignment_specifierc                 C   s6   |   d¡ |   d¡ |  ¡ }|   d¡ |j d¡ |S )Nrû   r¸   rÉ   Z_Atomic)r¤   rÐ   rj   rK   )r   rm   r   r   r   r    s   


zCParser._parse_atomic_specifierrã   c                 C   sF   |d ur|gn| j |d�g}|  d¡r!| | j |d�¡ |  d¡s|S )Nr÷   ÚCOMMA)Ú_parse_init_declaratorr£   rK   )r   rã   r·   r}   r   r   r   rì     s   ÿý

ÿz#CParser._parse_init_declarator_listc                 C   s8   |r|   ¡ n|  ¡ }d }|  d¡r|  ¡ }t||d d�S )Nrâ   r”   )rÆ   Ú_parse_declaratorr£   rë   r4   )r   r·   r\   r‡   r   r   r   r  '  s
   
zCParser._parse_init_declaratorc                 C   s  |   ¡ }|  |j¡}|  ¡ dv rM|   ¡ }|  ¡ dkrB|   ¡  |  d¡r.||jg |  |¡d�S |  ¡ }|  d¡ ||j||  |¡d�S ||jd |  |¡d�S |  ¡ dkry|   ¡ }|  d¡rf|d g |  |¡d�S |  ¡ }|  d¡ |d ||  |¡d�S |  d|  |¡¡ d S )N>   r»   rº   rß   ÚRBRACE)rQ   r}   rI   z Invalid struct/union declaration)	r    r™   r@   r�   r£   rA   Ú_parse_struct_declaration_listr¤   r?   )r   rC   ÚklassÚname_tokr}   Z	brace_tokr   r   r   r  3  s4   
ÿ
ÿÿ

z(CParser._parse_struct_or_union_specifierc                 C   s<   g }|   ¡ dvr|  ¡ }|d u rq| |¡ |   ¡ dvs|S ©N>   r  N)r�   Ú_parse_struct_declarationrÕ   )r   r}   Úitemsr   r   r   r  T  s   
üz&CParser._parse_struct_declaration_listc                 C   s
  |   ¡ dkr|  ¡  d S |   ¡ dv r|  ¡ gS |  ¡ }d| dg ¡vs%J ‚d }|  ¡ s1|   ¡ dkr5|  ¡ }|d urE|  d¡ | j||d�S t	|d ƒdkrs|d d	 }t
|tjƒr\|}nt |¡}|  d¡ | j|t|d d d
�gd�S |  d¡ | j|td d d d
�gd�S )NrÝ   rÚ   r€   rw   ÚCOLON©r{   r}   r^   r   r   r”   )r�   r    rå   r  rT   r½   Ú_parse_struct_declarator_listr¤   r‘   rN   r_   r   ÚNoderk   r4   )r   r{   r}   ÚnodeZ	decl_typer   r   r   r  `  s4   



ÿ
ÿz!CParser._parse_struct_declarationc                 C   s0   |   ¡ g}|  d¡r| |   ¡ ¡ |  d¡s
|S ©Nr  )Ú_parse_struct_declaratorr£   rK   rô   r   r   r   r  ‚  s
   


ÿz%CParser._parse_struct_declarator_listc                 C   s\   |   d¡r|  ¡ }t d d d d ¡d |dœS |  ¡ }|   d¡r(|  ¡ }|d |dœS |d d dœS )Nr  r”   )r£   r
  r   r`   r  )r   r�   r\   r   r   r   r  Š  s   
ý
z CParser._parse_struct_declaratorc                 C   s    |   d¡}|  ¡ dv r8|  ¡ }|  ¡ dkr-|  ¡  |  ¡ }|   d¡ t |j||  |¡¡S t |jd |  |¡¡S |   d¡ |  ¡ }|   d¡ t d ||  |¡¡S )Nrÿ   >   r»   rº   rß   r  )r¤   r�   r    Ú_parse_enumerator_listr   rŠ   r@   rA   )r   rC   r  Úenumsr   r   r   r  œ  s   



zCParser._parse_enum_specifierc                 C   sV   |   ¡ }t |g|j¡}|  d¡r)|  ¡ dkr	 |S |   ¡ }|j |¡ |  d¡s|S )Nr  r  )Ú_parse_enumeratorr   ZEnumeratorListrI   r£   r�   ZenumeratorsrK   )r   ÚenumZ	enum_listr   r   r   r  ­  s   
þ
üzCParser._parse_enumerator_listc                 C   sL   |   d¡}|  d¡r|  ¡ }nd }t |j||  |¡¡}|  |j|j	¡ |S )Nrº   râ   )
r¤   r£   r
  r   Z
Enumeratorr@   rA   rW   rQ   rI   )r   r  r@   r   r   r   r   r  ¸  s   


zCParser._parse_enumeratorc                 C   s"   | j ddd�\}}|d usJ ‚|S )NF©rÁ   rÂ   )rÈ   )r   r\   rð   r   r   r   r  Æ  s
   
ÿzCParser._parse_declaratorc                 C   ó   | j ddd�S )Nrg   T©rs   Úallow_paren©Ú_parse_declarator_kindrL   r   r   r   rÆ   Î  ó   zCParser._parse_id_declaratorc                 C   r"  )NÚtypeidTr#  r%  rL   r   r   r   rÅ   Ò  r'  z CParser._parse_typeid_declaratorc                 C   r"  )Nr(  Fr#  r%  rL   r   r   r   rÄ   Ö  r'  z(CParser._parse_typeid_noparen_declaratorr$  c                 C   s>   d }|   ¡ dkr|  ¡ }| j||d�}|d ur|  ||¡S |S )Nr¹   ©r$  )r�   Ú_parse_pointerÚ_parse_direct_declaratorra   )r   rs   r$  ÚptrÚdirectr   r   r   r&  Ú  s   zCParser._parse_declarator_kindc                 C   sl   |r|   d¡r| j|dd�}|  d¡ n|dkr|  d¡}n|  d¡}tj|jd d d |  |¡d�}|  |¡S )	Nr¸   Tr)  rÉ   rg   rº   r»   r…   )r£   r&  r¤   r   r`   r@   rA   Ú_parse_decl_suffixes)r   rs   r$  r\   r  r   r   r   r+  æ  s   
û
z CParser._parse_direct_declaratorc                 C   sL   	 |   ¡ dkr|  ||  |¡¡}q |   ¡ dkr#|  |¡}|  ||¡}q 	 |S )zAParse a chain of array/function suffixes and attach them to decl.TrÌ   r¸   N)r�   ra   Ú_parse_array_declÚ_parse_function_decl)r   r\   rí   r   r   r   r.  û  s   
zCParser._parse_decl_suffixesÚ	base_declc                 C   s   | j d |jd�S ©N©Ú	base_typerI   )Ú_parse_array_decl_commonrI   )r   r1  r   r   r   r/  	  r«   zCParser._parse_array_declr4  c                    sf  |   d¡}ˆdu r|  |¡‰‡ ‡fdd„}|  d¡r1dg|  ¡ p!g  }|  ¡ }|   d¡ |||ƒS |  ¡ tv r„|  ¡ p<g }|  d¡rU|dg }|  ¡ }|   d¡ |||ƒS |  d¡}|rp|   d¡ t |j	|  |¡¡}|||ƒS d}|  
¡ rz|  ¡ }|   d¡ |||ƒS |  d¡}|rŸ|   d¡ t |j	|  |¡¡}||g ƒS d}|  
¡ r©|  ¡ }|   d¡ ||g ƒS )	a9  Parse 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Ì   Nc                    s   t jˆ | |ˆd�S )N)r^   ÚdimÚ	dim_qualsrI   )r   Z	ArrayDecl)r6  r7  r3  r   r   Úmake_array_decl  s   ÿz9CParser._parse_array_decl_common.<locals>.make_array_declÚSTATICZstaticÚRBRACKETr¹   )r¤   rA   r£   r	  Ú_parse_assignment_expressionr�   rÊ   r   rº   r@   r²   )r   r4  rI   Z
lbrack_tokr8  r7  r6  Ú	times_tokr   r3  r   r5    sH   


















z CParser._parse_array_decl_commonc                 C   s¦   |   d¡ |  d¡rd }n|  ¡ r|  ¡ n|  ¡ }|   d¡ tj|d |jd�}|  ¡ dkrQ|j	d urQ|j	j
D ]}t|tjƒrA |S t|dd ƒ}|rP|  ||j¡ q6|S )Nr¸   rÉ   ©Úargsr^   rI   rß   rQ   )r¤   r£   r¯   Ú_parse_parameter_type_listÚ_parse_identifier_list_optr   rl   rI   r�   r>  Úparamsr_   ÚEllipsisParamÚgetattrrW   )r   r1  r>  rí   ÚparamrQ   r   r   r   r0  F  s(   


ÿý

ü€zCParser._parse_function_declc                 C   sn   g }|   d¡}|r |  ¡ pg }| ||  |¡f¡ |   d¡}|s	|s$d S d }|D ]\}}tj|||d�}q(|S )Nr¹   )rj   r^   rI   )r£   r	  rK   rA   r   ZPtrDecl)r   Zstarsr<  rj   r,  rI   r   r   r   r*  `  s   

ýzCParser._parse_pointerc                 C   sN   |   ¡ }|  ¡ dkr%|  d¡dkr%|  ¡  |  ¡ }|j t |  |¡¡¡ |S ©Nr  r‚   ÚELLIPSIS)Ú_parse_parameter_listr�   r    rA  rK   r   rB  rA   )r   rA  Zell_tokr   r   r   r?  q  s   z"CParser._parse_parameter_type_listc                 C   sh   |   ¡ }t |g|j¡}|  ¡ dkr2|  d¡dkr2|  ¡  |j |   ¡ ¡ |  ¡ dkr2|  d¡dks|S rE  )Ú_parse_parameter_declarationr   Ú	ParamListrI   r�   r    rA  rK   ©r   rã   rA  r   r   r   rG  z  s   þzCParser._parse_parameter_listc                 C   s�   | j dd�\}}}|d stjdg|d�g|d< |  ¡ r=| jddd�\}}|r6| j|t|d d d�gd�d	 S |  |||¡S |  ¡ }|  |||¡S )
NTrà   r^   r$   rd   r!  r”   r  r   )	rè   r   rk   r½   rÈ   r‘   r4   Ú_build_parameter_declarationrÃ   )r   r{   rð   rï   r\   Zis_namedr   r   r   rH  „  s    
ÿÿþz$CParser._parse_parameter_declarationrï   c              
   C   s”   t |d ƒdkr.t |d d jƒdkr.|  |d d jd ¡r.| j|t|d d d�gd�d S tjd|d d |p>t d d d d ¡|d	�}|  ||d ¡S )
Nr^   r   rR   r   r”   r  r'   rv   ©rQ   rj   r†   r^   rI   )	rN   re   rY   r‘   r4   r   ÚTypenamer`   ro   )r   r{   r\   rï   r   r   r   rK  —  s&   ÿþýÿþûz$CParser._build_parameter_declarationc                 C   ó   |   ¡ dkrd S |  ¡ S ©NrÉ   )r�   Ú_parse_identifier_listrL   r   r   r   r@  ­  ó   z"CParser._parse_identifier_list_optc                 C   s@   |   ¡ }t |g|j¡}|  d¡r|j |   ¡ ¡ |  d¡s|S r  )Ú_parse_identifierr   rI  rI   r£   rA  rK   rJ  r   r   r   rP  ³  s   

ÿzCParser._parse_identifier_listc              
   C   s‚   |   ¡ }|  ¡ }d }|d ur|j}n|d r|d d j}tjd|d d d … d |p1t d d d d ¡|d�}ttj|  ||d ¡ƒS )Nr^   r   r'   rv   rL  )r  rÃ   rI   r   rM  r`   r   ro   )r   r{   r\   rI   rb   r   r   r   rÐ   ¾  s   ûzCParser._parse_type_namec                 C   sb   |   ¡ dkr'|  ¡ }|  ¡ r|  ¡ }nt d d d d ¡}|d us!J ‚|  ||¡S |  ¡ r/|  ¡ S d S )Nr¹   )r�   r*  rÍ   Ú!_parse_direct_abstract_declaratorr   r`   ra   )r   r,  r\   r   r   r   rÃ   Ò  s   
z&CParser._parse_abstract_declarator_optc                 C   s¨   |   d¡}|r<|  ¡ s|  ¡ dkr,|  ¡ }|  d¡ tj|t d d d d ¡|  |¡d�}n#|  	¡ }|  d¡ |d us;J ‚n|  ¡ dkrG|  
¡ }n|  d| jj¡ |  |¡S )Nr¸   rÉ   r=  rÌ   zInvalid abstract declarator)r£   r¯   r�   Ú_parse_parameter_type_list_optr¤   r   rl   r`   rA   rÃ   Ú_parse_abstract_array_baser?   r3   r9   r.  )r   rÑ   rA  r\   r   r   r   rS  ä  s"   

ý


z)CParser._parse_direct_abstract_declaratorc                 C   rN  rO  )r�   r?  rL   r   r   r   rT  û  rQ  z&CParser._parse_parameter_type_list_optc                 C   s   | j t d d d d ¡d d�S r2  )r5  r   r`   rL   r   r   r   rU    s   ÿz"CParser._parse_abstract_array_basec                 C   s0  |   ¡ }|  dkrn dkrn n  |  ¡ S  dkr(|   d¡dkr( |  ¡ S  dkr1 |  ¡ S   dkr7n dkr<n n  |  ¡ S   d	krJn d
krOn dkrTn n  |  ¡ S   dkrbn dkrgn dkrln dkrqn n  |  ¡ S   dkrn dkr„n n  |  ¡ S dkr“|  ¡ S 	 |  ¡ S )NÚCASEÚDEFAULTrº   r‚   r  rß   Ú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´   r   r   r   Ú_parse_statement  s(   
(2zCParser._parse_statementc                 C   s>   |   ¡ dv r|  ¡ }|  ¡ }tj||g |d jd�S |  ¡ S )NrÚ   r   ©Úblock_itemsrI   )r�   Ú_parse_pppragma_directive_listrf  r   ÚCompoundrI   )r   ÚpragmasÚstmtr   r   r   Ú_parse_pragmacomp_or_statement$  s
   z&CParser._parse_pragmacomp_or_statementc                 C   s   |   ¡ r|  ¡ S |  ¡ S rJ   )r¯   rõ   rf  rL   r   r   r   Ú_parse_block_item,  s   zCParser._parse_block_itemc                 C   sT   g }|   ¡ dvr(|  ¡ }t|tƒr|d gkrq| |¡ n| |¡ |   ¡ dvs|S r  )r�   rn  r_   ÚlistrÕ   rK   )r   r  Úitemr   r   r   Ú_parse_block_item_list2  s   


ùzCParser._parse_block_item_listc                 C   sN   |   d¡}|  d¡rtjd |  |¡d�S |  ¡ }|   d¡ tj||  |¡d�S )Nrß   r  rg  )r¤   r£   r   rj  rA   rq  )r   Ú
lbrace_tokrh  r   r   r   rç   ?  s   



ÿz!CParser._parse_compound_statementc                 C   s  |   ¡ }| dkr/ |  ¡ }|  d¡ |  ¡ r|  ¡ }nt |  |¡¡}t |j	||  |¡¡S  dkr] |  ¡ }|  
¡ }|  d¡ |  ¡ rJ|  ¡ }nt |  |¡¡}t ||g|  |¡¡S dkr„|  ¡ }|  d¡ |  ¡ rr|  ¡ }nt |  |¡¡}t |g|  |¡¡S 	 |  d| jj¡ d S )Nrº   r  rV  rW  zInvalid labeled statement)r�   r    r¤   r¶   rm  r   ÚEmptyStatementrA   ZLabelr@   r
  ZCaseZDefaultr?   r3   r9   )r   rµ   r  rl  Zcase_tokr  Zdef_tokr   r   r   ra  L  s4   







z CParser._parse_labeled_statementc                 C   sÒ   |   ¡ }|j dkr< |  d¡ |  ¡ }|  d¡ |  ¡ }|  d¡r1|  ¡ }t ||||  |¡¡S t ||d |  |¡¡S dkr]|  d¡ |  ¡ }|  d¡ |  ¡ }t	t 
|||  |¡¡ƒS 	 |  d|  |¡¡ d S )NrX  r¸   rÉ   ÚELSErY  zInvalid selection statement)r    r^   r¤   Ú_parse_expressionrm  r£   r   ÚIfrA   r   ZSwitchr?   )r   rC   ÚcondZ	then_stmtZ	else_stmtr  rl  r   r   r   rb  m  s&   





z"CParser._parse_selection_statementc              	   C   sˆ  |   ¡ }|j dkr' |  d¡ |  ¡ }|  d¡ |  ¡ }t |||  |¡¡S  dkrR |  ¡ }|  d¡ |  d¡ |  ¡ }|  d¡ |  d¡ t |||  |¡¡S dkr¸|  d¡ |  	¡ r�|  
¡ }t ||  |¡¡}|  ¡ }|  d¡ |  ¡ }|  d¡ |  ¡ }t |||||  |¡¡S |  ¡ }|  d¡ |  ¡ }|  d¡ |  ¡ }|  d¡ |  ¡ }t |||||  |¡¡S 	 |  d|  |¡¡ d S )NrZ  r¸   rÉ   r[  rÝ   r\  zInvalid iteration statement)r    r^   r¤   ru  rm  r   ÚWhilerA   ZDoWhiler¯   rõ   ZDeclListÚ_parse_expression_optÚForr?   )r   rC   rw  rl  r}   r‡   Z	next_exprr   r   r   rc  †  sJ   













z"CParser._parse_iteration_statementc                 C   sä   |   ¡ }|j dkr |  d¡}|  d¡ t |j|  |¡¡S  dkr1 |  d¡ t |  |¡¡S  dkrC |  d¡ t |  |¡¡S dkrf|  	d¡rTt 
d |  |¡¡S |  ¡ }|  d¡ t 
||  |¡¡S 	 |  d|  |¡¡ d S )Nr]  rº   rÝ   r^  r_  r`  zInvalid jump statement)r    r^   r¤   r   ZGotor@   rA   ÚBreakÚContinuer£   ÚReturnru  r?   )r   rC   r  r  r   r   r   rd  °  s(   








zCParser._parse_jump_statementc                 C   s.   |   ¡ }|  d¡}|d u rt |  |¡¡S |S rò   )ry  r¤   r   rs  rA   )r   r  Zsemi_tokr   r   r   re  Ç  s
   
z#CParser._parse_expression_statementc                 C   s   |   ¡ r|  ¡ S d S rJ   )r²   ru  rL   r   r   r   ry  Ò  s   zCParser._parse_expression_optc                 C   sR   |   ¡ }|  d¡s|S ||   ¡ g}|  d¡r"| |   ¡ ¡ |  d¡st ||j¡S r  ©r;  r£   rK   r   ÚExprListrI   ©r   r  Úexprsr   r   r   ru  Ø  s   


ÿzCParser._parse_expressionc                 C   sp   |   ¡ dkr|   d¡dkr|  ¡  |  ¡ }|  d¡ |S |  ¡ }|  ¡ r6|  ¡ j}|  ¡ }t 	||||j
¡S |S )Nr¸   r‚   rß   rÉ   )r�   r    rç   r¤   Ú_parse_conditional_expressionrÏ   r@   r;  r   Z
AssignmentrI   )r   Úcompr  ÚopÚrhsr   r   r   r;  ã  s   

z$CParser._parse_assignment_expressionc                 C   sB   |   ¡ }|  d¡r|  ¡ }|  d¡ |  ¡ }t ||||j¡S |S )NZCONDOPr  )Ú_parse_binary_expressionr£   ru  r¤   r‚  r   Z	TernaryOprI   )r   r  ZiftrueZiffalser   r   r   r‚  ó  s   

z%CParser._parse_conditional_expressionr   Úmin_precÚlhsc           	      C   s¶   |d u r|   ¡ }	 |  ¡ }|d u s|jtvr	 |S t|j }||k r%	 |S |j}|  ¡  |   ¡ }	 |  ¡ }|d u s>|jtvr?qQt|j }||krO|  ||¡}nqQq1t ||||j	¡}q	)NT)
Ú_parse_cast_expressionr>   r^   Ú_BINARY_PRECEDENCEr@   r    r†  r   ZBinaryOprI   )	r   r‡  rˆ  rC   Úprecr„  r…  Znext_tokZ	next_precr   r   r   r†  ý  s2   
ìð
ø
êz CParser._parse_binary_expressionc                 C   s\   |   ¡ }|d ur*|\}}}|  ¡ dkr|  |¡ |  ¡ S |  ¡ }t |||  |¡¡S |  ¡ S )Nrß   )rÒ   r�   rª   r‰  r   ZCastrA   Ú_parse_unary_expression)r   Úresultrm   r¥   rÑ   r  r   r   r   r‰    s   

þzCParser._parse_cast_expressionc                 C   s  |   ¡ }|dv r|  ¡ }|  ¡ }t |j||j¡S |dv r.|  ¡ }|  ¡ }t |j||j¡S |dkr]|  ¡ }|  ¡ }|d urN|\}}}t |j||  	|¡¡S |  ¡ }t |j||  	|¡¡S |dkr~|  ¡ }|  
d¡ |  ¡ }|  
d¡ t |j||  	|¡¡S |  ¡ S )N¾   ÚPLUSPLUSÚ
MINUSMINUS>   ÚPLUSr¹   ÚLNOTÚMINUSÚANDÚNOTÚSIZEOFÚ_ALIGNOFr¸   rÉ   )r�   r    rŒ  r   ÚUnaryOpr@   rI   r‰  rÒ   rA   r¤   rÐ   Ú_parse_postfix_expression)r   rµ   rC   r  r�  rm   rð   r   r   r   rŒ  4  s0   


zCParser._parse_unary_expressionc                 C   sj  |   ¡ }|d ur+|\}}}|  d¡r&|  ¡ }|  d¡ |  d¡ t ||¡S |  |¡ |  ¡ }	 |  d¡rG|  ¡ }|  d¡ t 	|||j
¡}q/|  d¡rk|  ¡ dkrY|  ¡  d }n	|  ¡ }|  d¡ t |||j
¡}q/|  ¡ d	v rœ|  ¡ }	|  ¡ }
|
jd
vr‡|  d|  |
¡¡ t |
j|  |
¡¡}t ||	j||j
¡}q/|  ¡ dv r²|  ¡ }t d|j ||j
¡}q/	 |S )Nrß   r  r  TrÌ   r:  r¸   rÉ   >   ZARROWÚPERIOD>   r»   rº   zInvalid struct referencerŽ  Úp)rÒ   r£   Ú_parse_initializer_listr¤   r   ZCompoundLiteralrª   Ú_parse_primary_expressionru  ÚArrayRefrI   r�   r    Ú_parse_argument_expression_listÚFuncCallr^   r?   rA   rº   r@   Ú	StructRefr˜  )r   r�  rm   r¥   rð   r‡   r  Úsubr>  Zop_tokr  ÚfieldrC   r   r   r   r™  T  sP   










ÿz!CParser._parse_postfix_expressionc                 C   sþ   |   ¡ }|dkr|  ¡ S |tv s|tv s|tv r|  ¡ S |tv r$|  ¡ S |tv r,|  	¡ S |dkr?|  
¡  |  ¡ }|  d¡ |S |dkru|  
¡ }|  d¡ |  ¡ }|  d¡ |  ¡ }|  d¡ |  |¡}t t |j|¡t ||g|¡|¡S |  d| jj¡ d S )Nrº   r¸   rÉ   ÚOFFSETOFr  zInvalid expression)r�   rR  Ú
_INT_CONSTÚ_FLOAT_CONSTÚ_CHAR_CONSTÚ_parse_constantÚ_STRING_LITERALÚ_parse_unified_string_literalÚ_WSTR_LITERALÚ_parse_unified_wstring_literalr    ru  r¤   rÐ   Ú!_parse_offsetof_member_designatorrA   r   r   rº   r@   r  r?   r3   r9   )r   rµ   r  Zoff_tokrm   Z
designatorrI   r   r   r   r�  †  sB   ÿþý




ýz!CParser._parse_primary_expressionc                 C   sd   |   ¡ }	 |  d¡r|   ¡ }t |d||j¡}q|  d¡r/|  ¡ }|  d¡ t |||j¡}q	 |S )NTrš  Ú.rÌ   r:  )Ú_parse_identifier_or_typeidr£   r   r¡  rI   ru  r¤   rž  )r   r  r£  r  r   r   r   r­  «  s   


z)CParser._parse_offsetof_member_designatorc                 C   s>   |   ¡ }|g}|  d¡r| |   ¡ ¡ |  d¡st ||j¡S r  r~  r€  r   r   r   rŸ  »  s   

ÿz'CParser._parse_argument_expression_listc                 C   s   |   ¡ S rJ   )r‚  rL   r   r   r   r
  Ã  s   z"CParser._parse_constant_expressionc                 C   s   |   d¡}t |j|  |¡¡S )Nrº   )r¤   r   rº   r@   rA   rŸ   r   r   r   rR  Ê  s   
zCParser._parse_identifierc                 C   s8   |   ¡ }|jdvr|  d|  |¡¡ t |j|  |¡¡S )N>   r»   rº   zExpected identifier)r    r^   r?   rA   r   rº   r@   rŸ   r   r   r   r¯  Ï  s   
z#CParser._parse_identifier_or_typeidc                 C   s  |   ¡ }|jtv rMd}d}|jdd … D ]}|dv r|d7 }q|dv r'|d7 }q|dkr0tdƒ‚|dkr8tdƒ‚d	| d
|  }t |d |j|  |¡¡S |jtv rs|jd dv r\d}n|jd dv rfd}nd}t ||j|  |¡¡S |jt	v rƒt d|j|  |¡¡S |  
d|  |¡¡ d S )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 zlong r$   rR   )ÚfÚFÚfloatzlong doubleÚdoubleÚcharzInvalid constant)r    r^   r¥  r@   Ú
ValueErrorr   ÚConstantrA   r¦  r§  r?   )r   rC   Zu_countZl_countÚchÚprefixr�   r   r   r   r¨  Ö  s4   

€

zCParser._parse_constantc                 C   sb   |   d¡}t d|j|  |¡¡}|  ¡ dkr/|  ¡ }|jd d… |jdd …  |_|  ¡ dks|S )NÚSTRING_LITERALÚstringrR   r   )r¤   r   r»  r@   rA   r�   r    ©r   rC   r  Ztok2r   r   r   rª  ö  s   
þz%CParser._parse_unified_string_literalc                 C   s€   |   ¡ }|jtvr|  d|  |¡¡ t d|j|  |¡¡}|  ¡ tv r>|   ¡ }|j 	¡ d d… |jdd …  |_|  ¡ tv s#|S )NzInvalid string literalr¿  rR   r‚   )
r    r^   r«  r?   rA   r   r»  r@   r�   ÚrstriprÀ  r   r   r   r¬  ÿ  s   
"þz&CParser._parse_unified_wstring_literalc                 C   sR   |   d¡}|r%|   d¡rt g |  |¡¡S |  ¡ }|   d¡ |  d¡ |S |  ¡ S )Nrß   r  r  )r£   r   ÚInitListrA   rœ  r¤   r;  )r   rr  Z	init_listr   r   r   rë     s   



zCParser._parse_initializerc                 C   sL   |   ¡ g}|  d¡r|  ¡ dkrq| |   ¡ ¡ |  d¡s
t ||d j¡S )Nr  r  r   )Ú_parse_initializer_itemr£   r�   rK   r   rÂ  rI   )r   r  r   r   r   rœ    s   


ýzCParser._parse_initializer_listc                 C   s8   d }|   ¡ dv r|  ¡ }|  ¡ }|d urt ||¡S |S ©N>   rÌ   rš  )r�   Ú_parse_designationrë   r   ZNamedInitializer)r   Zdesignationr‡   r   r   r   rÃ  %  s   zCParser._parse_initializer_itemc                 C   rñ   )Nrâ   )Ú_parse_designator_listr¤   ©r   Zdesignatorsr   r   r   rÅ  /  rö   zCParser._parse_designationc                 C   ó.   g }|   ¡ dv r| |  ¡ ¡ |   ¡ dv s|S rÄ  )r�   rK   Ú_parse_designatorrÇ  r   r   r   rÆ  5  rØ   zCParser._parse_designator_listc                 C   sF   |   d¡r|  ¡ }|  d¡ |S |   d¡r|  ¡ S |  d| jj¡ d S )NrÌ   r:  rš  zInvalid designator)r£   r
  r¤   r¯  r?   r3   r9   )r   r  r   r   r   rÉ  =  s   


zCParser._parse_designatorc                 C   s    |   d¡}|  d|  |¡¡ d S )NrÙ   zDirectives not supported yet)r¤   r?   rA   rŸ   r   r   r   rä   J  s   
zCParser._parse_pp_directivec                 C   s¤   |   ¡ dkr'|  ¡ }|   ¡ dkr|  ¡ }t |j|  |¡¡S t d|  |¡¡S |   ¡ dkrH|  ¡ }|  d¡}|  ¡ }|  d¡ t ||  |¡¡S |  d| j	j
¡ d S )NrÜ   ZPPPRAGMASTRr'   rÛ   r¸   rÉ   zInvalid pragma)r�   r    r   ZPragmar@   rA   r¤   rª  r?   r3   r9   )r   rC   Zstr_tokZlparenÚliteralr   r   r   rå   P  s   

z!CParser._parse_pppragma_directivec                 C   rÈ  )NrÚ   )r�   rK   rå   )r   rk  r   r   r   ri  b  rØ   z&CParser._parse_pppragma_directive_listc                 C   sR   |   d¡}|   d¡ |  ¡ }d }|  d¡r|  ¡ }|   d¡ t |||  |¡¡gS )NrÞ   r¸   r  rÉ   )r¤   r
  r£   rª  r   ZStaticAssertrA   )r   rC   rw  rH   r   r   r   ræ   i  s   



zCParser._parse_static_assert)r'   FrJ   )r   N)F©r   )FF)r   rq   r­   )r   r~   )T)r   N)�r   r   r    r!   r   Úboolr^   r"   r8   r   rÓ   rD   r$   r   r   rF   r   r?   rM   rP   rV   rW   rY   r/   r0   r1   r2   r   r  ra   rŽ   r�   rM  r   ro   r|   r‘   r–   r™   r   r>   r�   r    r£   r¤   r¦   rª   rA   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  rÆ   rÅ   rÄ   r&  r+  r.  r/  r5  r0  r*  rI  r?  rG  rH  rK  r@  rP  rÐ   rÃ   rS  rT  rU  rf  rm  rn  rq  rç   ra  rb  rc  rd  re  ry  ru  r;  r‚  r†  r‰  rŒ  r™  r�  r­  rŸ  r
  rR  r¯  r¨  rª  r¬  rë   rœ  rÃ  rÅ  rÆ  rÉ  rä   rå   ri  ræ   r   r   r   r   r&   2   sè   øþýüûúùø	
÷ÿÿÿÿ
þ	
*,þý
ü-ûþýüû
úüþýü
ûgþýüû
ú
ÿÿÿ
þ#
þVÿÿ
þ*ÿÿ
þ{c
ÿÿÿ
þ!"ÿÿÿ
þÿÿÿ
þ:	
ÿÿÿ
þ!*ÿÿÿ
þ" 2% 		
r&   >   ZDIVEQUALZANDEQUALZRSHIFTEQUALZ
TIMESEQUALZ
MINUSEQUALZMODEQUALÚ	PLUSEQUALrâ   ZXOREQUALZOREQUALZLSHIFTEQUALZLORZLANDÚORr‚   ZXORé   r”  é   ZEQé   ZNEÚGTé   ZGEÚLTZLEZRSHIFTé   ZLSHIFTr‘  é   r“  r¹   é	   ZDIVIDEZMOD>   ZREGISTERZEXTERNr9  ZTYPEDEFZ_THREAD_LOCALZAUTOZINLINEZ	_NORETURN>   ZVOLATILEZCONSTrû   ZRESTRICT>   ZSIGNEDZ_COMPLEXÚCHARÚINTZ_BOOLZVOIDÚLONGZUNSIGNEDÚSHORTÚDOUBLEÚFLOATZ__INT128>   rû   rý   r»   rù   rþ   rÿ   >   r¤  r—  r‘  r¹   r�  r“  rº   r’  r”  r�  r–  r¸   r•  >   ZINT_CONST_OCTZINT_CONST_HEXZINT_CONST_CHARZINT_CONST_DECZINT_CONST_BINZFLOAT_CONSTZHEX_FLOAT_CONST>   Z
CHAR_CONSTZU16CHAR_CONSTZU8CHAR_CONSTZU32CHAR_CONSTZWCHAR_CONSTr¾  >   ZU16STRING_LITERALZWSTRING_LITERALZU8STRING_LITERALZU32STRING_LITERAL>   rZ  r[  rÛ   rY  rß   r\  rW  r]  r_  rV  rÜ   rÝ   r^  rÞ   r`  rX  c                   @   s~   e Zd ZdZdeddfdd„Zddedee fd	d
„Z	dee fdd„Z
defdd„Zdeddfdd„Zdeddfdd„ZdS )r6   z¨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)   r   Nc                 C   s   || _ g | _d| _d S )Nr   )Ú_lexerÚ_bufferÚ_index)r   r)   r   r   r   r8   	  s   
z_TokenStream.__init__r   rš   c                 C   s*   |dkrdS |   |¡ | j| j| d  S )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.
        r   Nr   ©Ú_fillrß  rà  rœ   r   r   r   r›   
	  s   
z_TokenStream.peekc                 C   s(   |   d¡ | j| j }|  jd7  _|S )z%Consume a single token and return it.r   Nrá  rŸ   r   r   r   rž   	  s   
z_TokenStream.nextc                 C   s   | j S rJ   ©rà  rL   r   r   r   r¥   "	  s   z_TokenStream.markr¥   c                 C   s
   || _ d S rJ   rã  r©   r   r   r   r¨   %	  r§   z_TokenStream.resetÚnc                 C   sR   t | jƒ| j| k r'| j ¡ }| j |¡ |d u rd S t | jƒ| j| k s
d S d S rJ   )rN   rß  rà  rÞ  r—   rK   )r   rä  rC   r   r   r   râ  (	  s   
üz_TokenStream._fillrË  )r   r   r    r!   r   r8   r$   r   r   r›   rž   r¥   r¨   râ  r   r   r   r   r6   ÿ  s    r6   c                   @   sJ   e Zd ZU ee ed< ee ed< ee ed< ee ed< ee ed< dS )rq   rv   rw   r^   rx   ry   N)r   r   r    r   r   r#   r   r   r   r   rq   6	  s   
 rq   ru   c                   @   s8   e Zd ZU eej ed< eej ed< eej ed< dS )r~   r\   r‡   r�   N)r   r   r    r   r   r  r#   r   r   r   r   r~   A	  s   
 r~   N)+Údataclassesr   Útypingr   r   r   r   r   r   r	   r
   r   r'   r   Zc_lexerr   r   Zast_transformsr   r   r   Ú	Exceptionr%   r&   rÎ   rŠ  r  r  rÊ   r  r®   Z_EXPR_STARTr¥  r¦  r§  r©  r«  r±   r³   r6   rq   rt   r~   r   r   r   r   Ú<module>   sÈ   ,                Rÿþýüûúùø	÷
öõôóòñðïîÿþýüÿÿþýüûÿ	7