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   úL/home/kim/smarthome/.venv/lib/python3.10/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dd‚„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-ddŽ„ZCde!e fdd„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„Zd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   Ú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   r[   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.
        )rZ   )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
        )Ú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   ra   r_   ÚdeclnamerQ   ÚqualsÚIdentifierTyperN   r?   rI   ÚFuncDecl)r   r]   rc   Ú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   rq   rs   rt   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} nq>|  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.
        Útypedefrx   r   ÚbitsizeNr]   r_   é   rR   r   ú?rI   úInvalid declarationrz   ©rj   r_   rk   ÚalignrI   rw   )rQ   rk   rx   r_   rI   ry   Úinit©	rQ   rk   r‡   rx   Zfuncspecr_   rˆ   r‚   rI   )rT   rN   rf   rZ   ÚhasattrrI   r?   r   ra   r`   ÚEnumÚStructÚUnionrl   r   r   r_   rj   ÚTypedefÚDeclrp   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   rx   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.
        Ústruct)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).)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>   ÚTIMESÚLPARENTÚID>   r»   ÚTYPEID©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>   ÚLBRACKETrº   r½   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_tokrn   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¾   ÚPPPRAGMAÚ_PRAGMAÚSEMIÚ_STATIC_ASSERTÚLBRACEzInvalid function definitionr$   re   )rw   rz   rx   r_   ry   )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   rl   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   rw   rz   rx   ry   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n|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Ïn`|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¡ |sH|sH|  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Ú_ALIGNASrz   ©rK   Ú_ATOMICrƒ   rº   r_   rw   rx   ry   re   r¼   ¾   ÚUNIONÚSTRUCTÚENUMr…   rd   )r>   r_   rA   r}   Ú_parse_alignment_specifierrž   Ú_parse_atomic_specifierrË   r¡   r@   Ú_STORAGE_CLASSÚ_FUNCTION_SPECÚ_TYPE_SPEC_SIMPLEr   rl   Ú _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næ|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œn\|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ú   rz   rû   rü   rƒ   rº   r_   rw   re   r¼   rý   r   zInvalid specifier listrd   rx   ry   )r>   r_   rA   r}   r  rž   r  rË   r¡   r@   r  r   rl   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   rk   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   rn   Ú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Ñ   rk   rK   )r   rn   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   rx   ÚCOLON©r|   r~   r_   r   r   r•   )rž   r¡   ræ   r	  rT   r¾   Ú_parse_struct_declarator_listr¥   r’   rN   r`   r   ÚNoderl   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   ra   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 )Nrh   T©rt   Ú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_declaratorrb   )r   rt   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Ê   rh   r»   r¼   r†   )r¤   r'  r¥   r   ra   r@   rA   Ú_parse_decl_suffixes)r   rt   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º   )rž   rb   Ú_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   r2  r   r   r   r0  	  r¬   zCParser._parse_array_declr5  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)r7  r8  r4  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   r5  rI   Z
lbrack_tokr9  r8  r7  Ú	times_tokr   r4  r   r6    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   rm   rI   rž   r?  Úparamsr`   ÚEllipsisParamÚgetattrrW   )r   r2  r?  rî   ÚparamrQ   r   r   r   r1  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¹   )rk   r_   rI   )r¤   r
  rK   rA   r   ZPtrDecl)r   Ústarsr=  rk   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¡   rB  rK   r   rC  rA   )r   rB  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 rG  )Ú_parse_parameter_declarationr   Ú	ParamListrI   rž   r¡   rB  rK   ©r   rä   rB  r   r   r   rI  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$   re   r"  r•   r  r   )	ré   r   rl   r¾   rÉ   r’   r4   Ú_build_parameter_declarationrÄ   )r   r|   rñ   rð   r]   Zis_namedr   r   r   rJ  „  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'   rw   ©rQ   rk   r‡   r_   rI   )	rN   rf   rZ   r’   r4   r   ÚTypenamera   rp   )r   r|   r]   rð   r   r   r   rM  —  s"   ÿÿþûz$CParser._build_parameter_declarationc                 C   ó   |   ¡ dkrd S |  ¡ S ©NrÊ   )rž   Ú_parse_identifier_listrL   r   r   r   rA  ­  ó   z"CParser._parse_identifier_list_optc                 C   s@   |   ¡ }t |g|j¡}|  d¡r|j |   ¡ ¡ |  d¡s|S r  )Ú_parse_identifierr   rK  rI   r¤   rB  rK   rL  r   r   r   rR  ³  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'   rw   rN  )r	  rÄ   rI   r   rO  ra   r   rp   )r   r|   r]   rI   rc   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   ra   rb   )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   rm   ra   rA   rÄ   Ú_parse_abstract_array_baser?   r3   r9   r/  )r   rÒ   rB  r]   r   r   r   rU  ä  s"   

ý


z)CParser._parse_direct_abstract_declaratorc                 C   rP  rQ  )rž   r@  rL   r   r   r   rV  û  rS  z&CParser._parse_parameter_type_list_optc                 C   s   | j t d d d d ¡d dS r3  )r6  r   ra   rL   r   r   r   rW    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_listrh  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ö   rh  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ž   rp  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  ri  )r¥   r¤   r   rl  rA   rs  )r   Ú
lbrace_tokrj  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  rX  rY  zInvalid labeled statement)rž   r¡   r¥   r·   ro  r   ÚEmptyStatementrA   ÚLabelr@   r  ZCaseZDefaultr?   r3   r9   )r   r¶   r  rn  Zcase_tokr  Zdef_tokr   r   r   rc  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 )NrZ  rº   rÊ   ÚELSEr[  zInvalid selection statement)r¡   r_   r¥   Ú_parse_expressionro  r¤   r   ÚIfrA   r   ZSwitchr?   )r   rC   ÚcondZ	then_stmtZ	else_stmtr  rn  r   r   r   rd  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 )Nr\  rº   rÊ   r]  rÞ   r^  zInvalid iteration statement)r¡   r_   r¥   rx  ro  r   ÚWhilerA   ZDoWhiler°   rö   ZDeclListÚ_parse_expression_optÚForr?   )r   rC   rz  rn  r~   rˆ   Z	next_exprr   r   r   re  †  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`  ra  rb  zInvalid jump statement)r¡   r_   r¥   r   ZGotor@   rA   ÚBreakÚContinuer¤   ÚReturnrx  r?   )r   rC   r  r  r   r   r   rf  °  s(   








zCParser._parse_jump_statementc                 C   s.   |   ¡ }|  d¡}|d u rt |  |¡¡S |S ró   )r|  r¥   r   ru  rA   )r   r  Zsemi_tokr   r   r   rg  Ç  s
   
z#CParser._parse_expression_statementc                 C   s   |   ¡ r|  ¡ S d S rJ   )r³   rx  rL   r   r   r   r|  Ò  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  Zexprsr   r   r   rx  Ø  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¤   rx  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?nt|j }||krO|  ||¡}nnq1t ||||j	¡}q	rJ   )
Ú_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   Úresultrn   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¾   Ú
MINUSMINUSÚPLUSPLUS>   r¹   ÚPLUSÚLNOTÚMINUSÚNOTÚANDÚSIZEOFÚ_ALIGNOFrº   rÊ   )rž   r¡   rŽ  r   ÚUnaryOpr@   rI   r‹  rÓ   rA   r¥   rÑ   Ú_parse_postfix_expression)r   r¶   rC   r  r  rn   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_expressionrx  ÚArrayRefrI   rž   r¡   Ú_parse_argument_expression_listÚFuncCallr_   r?   rA   r»   r@   Ú	StructRefrš  )r   r  rn   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ž   rT  Ú
_INT_CONSTÚ_FLOAT_CONSTÚ_CHAR_CONSTÚ_parse_constantÚ_STRING_LITERALÚ_parse_unified_string_literalÚ_WSTR_LITERALÚ_parse_unified_wstring_literalr¡   rx  r¥   rÑ   Ú!_parse_offsetof_member_designatorrA   r   r¢  r»   r@   r‚  r?   r3   r9   )r   r¶   r  Zoff_tokrn   Z
designatorrI   r   r   r   rŸ  †  s<   




ý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   rx  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   rT  Ê  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   rt  Z	init_listr   r   r   rì     s   



zCParser._parse_initializerc                 C   sL   |   ¡ g}|  d¡r|  ¡ dkrn| |   ¡ ¡ |  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   rm  r   r   r   rk  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   rz  rH   r   r   r   rç   i  s   



zCParser._parse_static_assert)r'   FrJ   )r   N)F©r   )FF)r   rr   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   rZ   r/   r0   r1   r2   r   r  rb   r   rŽ   rO  r   rp   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/  r0  r6  r1  r+  rK  r@  rI  rJ  rM  rA  rR  rÑ   rÄ   rU  rV  rW  rh  ro  rp  rs  rè   rc  rd  re  rf  rg  r|  rx  r<  r„  rˆ  r‹  rŽ  r›  rŸ  r¯  r¡  r  rT  r±  rª  r¬  r®  rì   rž  rÅ  rÇ  rÈ  rË  rå   ræ   rk  rç   r   r   r   r   r&   2   sè   øþýüûúùø	
÷ÿÿÿÿ
þ	
*,þý
ü-ûþýüû
úüþýü
ûgþýüû
ú
ÿÿÿ
þ#
þVÿÿ
þ*ÿÿ
þ{c
ÿÿÿ
þ!"ÿÿÿ
þÿÿÿ
þ:	
ÿÿÿ
þ!*ÿÿÿ
þ" 2% 		
r&   >   ZOREQUALZANDEQUALZDIVEQUALZMODEQUALZXOREQUALÚ	PLUSEQUALZLSHIFTEQUALZ
TIMESEQUALZRSHIFTEQUALZ
MINUSEQUALrã   ZLORZLANDÚORrƒ   ZXORé   r—  é   ZEQé   ZNEÚGTé   ZGEÚLTZLEZRSHIFTé   ZLSHIFTr“  é   r•  r¹   é	   ZDIVIDEZMOD>   r:  Z_THREAD_LOCALZAUTOZREGISTERZEXTERNZTYPEDEFZINLINEZ	_NORETURN>   ZRESTRICTrü   ZCONSTZVOLATILE>   ÚLONGZCHARÚDOUBLEÚINTZ_BOOLZSHORTZVOIDZUNSIGNEDZSIGNEDZ_COMPLEXZ__INT128ÚFLOAT>   rþ   rÿ   r¼   rü   r   rú   >   r¦  r¹   rº   r“  r”  r™  r—  r‘  r»   r•  r–  r˜  r’  >   ZINT_CONST_CHARZINT_CONST_HEXZINT_CONST_OCTZINT_CONST_DECZINT_CONST_BINZFLOAT_CONSTZHEX_FLOAT_CONST>   ZU8CHAR_CONSTZU32CHAR_CONSTZU16CHAR_CONSTZ
CHAR_CONSTZWCHAR_CONSTrÀ  >   ZU8STRING_LITERALZWSTRING_LITERALZU16STRING_LITERALZU32STRING_LITERAL>   r\  r^  rY  r]  rÝ   r`  r[  ra  rX  r_  rà   rZ  rß   rÞ   rÜ   rb  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   rá  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 )rr   rw   rx   r_   ry   rz   N)r   r   r    r   r   r#   r   r   r   r   rr   6	  s   
 rr   rv   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   rr   ru   r   r   r   r   r   Ú<module>   sÈ   ,                Rÿþýüûúùø	÷
öõôóòñðïîÿþýüÿÿþýüûÿ	7