o
    'òviÆ^ ã                   @   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   úQ/home/air/biblejyuku/back/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)Ú
error_funcÚon_lbrace_funcÚon_rbrace_funcÚ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: )r8   r9   r7   Úinputr:   r;   Ú _parse_translation_unit_or_emptyÚ_peekÚ_parse_errorÚvalueÚ
_tok_coord)r   r   r=   r>   ÚastÚtokr   r   r   ÚparseZ   s   
zCParser.parseÚlinenor   c                 C   s   t | jj||dS )Nr   )r   r7   r=   )r   rI   r   r   r   r   Ú_coordv   ó   zCParser._coordÚmsgÚcoordc                 C   s   t |› d|› ƒ‚)Nz: )r%   )r   rL   rM   r   r   r   rC   y   rK   zCParser._parse_errorc                 C   s   | j  tƒ ¡ d S ©N)r9   Úappendr8   ©r   r   r   r   Ú_push_scope|   rK   zCParser._push_scopec                 C   s    t | jƒdks	J ‚| j ¡  d S )Nr   )Úlenr9   ÚpoprP   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©r9   ÚgetrC   ©r   rU   rM   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
        rV   FzNon-typedef z- previously declared as typedef in this scopeNrW   rY   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)Úreversedr9   rX   )r   rU   ÚscopeÚin_scoper   r   r   Ú_is_type_in_scope—   s   
ÿzCParser._is_type_in_scoper   c                 C   s   |   ||  ||¡¡ d S rN   )rC   rJ   )r   rL   r   r   r   r   r   r3   ¡   s   zCParser._lex_error_funcc                 C   ó   |   ¡  d S rN   )rQ   rP   r   r   r   r4   ¤   ó   zCParser._lex_on_lbrace_funcc                 C   r`   rN   )rT   rP   r   r   r   r5   §   ra   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.
        )r_   )r   rU   r   r   r   r6   ª   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   rb   rc   Úmodifier_headÚmodifier_tailÚ	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$   ©rM   c                 S   s   g | ]
}|j D ]}|‘qqS r   )Únames)Ú.0ÚidrU   r   r   r   Ú
<listcomp>$  s    z/CParser._fix_decl_name_type.<locals>.<listcomp>r   )re   r   rf   rd   ÚdeclnamerU   ÚqualsÚIdentifierTyperR   rC   rM   ÚFuncDecl)r   rb   rk   ÚtypÚtnr   r   r   Ú_fix_decl_name_type   s,   ÿûýÿzCParser._fix_decl_name_typeÚdeclspecÚ	_DeclSpecÚnewspecÚkindÚ_DeclSpecKindrO   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Ústoragerd   ÚfunctionÚ	alignmentr   )r8   rO   Úinsert)r   ry   r{   r|   rO   Ú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.
        Útypedefr€   r   ÚbitsizeNrb   rd   é   rV   r   ú?rM   úInvalid declarationr‚   ©rr   rd   rs   ÚalignrM   r   )rU   rs   r€   rd   rM   r   Úinit©	rU   rs   r   r€   Úfuncspecrd   r   rŠ   rM   )rX   rR   rn   r_   ÚhasattrrM   rC   r   rf   re   ÚEnumÚStructÚUnionrt   r   r   rd   rr   ÚTypedefÚDeclrx   rZ   rU   r[   r   rO   )r   r„   r†   rˆ   Ú
is_typedefÚdeclarationsrM   ÚtÚdecls_0_tailrb   ÚdeclarationÚ
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‰   r€   zInvalid typedefN©rb   r   rŠ   T©r„   r†   rˆ   r   )rb   r    r¡   rM   )rC   rM   rŸ   r8   r   ÚFuncDef)r   r„   rb   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).)r;   Úpeek©r   r©   r   r   r   rB   Æ  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)rB   rd   )r   r©   rG   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)r;   ÚnextrC   r7   r=   ©r   rG   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)rB   rd   r¯   ©r   r°   rG   r   r   r   Ú_acceptÖ  s   zCParser._acceptc                 C   s0   |   ¡ }|j|kr|  d|j› |  |¡¡ |S )Nr?   )r¯   rd   rC   rD   rE   r±   r   r   r   Ú_expectá  s   
zCParser._expectc                 C   s
   | j  ¡ S rN   )r;   ÚmarkrP   r   r   r   Ú_markç  ó   
zCParser._markr´   c                 C   s   | j  |¡ d S rN   )r;   Úreset©r   r´   r   r   r   Ú_resetê  ó   zCParser._resetrG   c                 C   s   |   |j|j¡S rN   )rJ   rI   r   r®   r   r   r   rE   í  rº   zCParser._tok_coordc                 C   ó"   |p|   ¡ }|d u rdS |jtv S ©NF)rB   rd   Ú_DECL_STARTr®   r   r   r   Ú_starts_declarationð  ó   
zCParser._starts_declarationc                 C   r»   r¼   )rB   rd   Ú_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 rN   )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Ï   rB   rE   r7   r=   rC   Ú_parse_abstract_declarator_optÚ _parse_typeid_noparen_declaratorÚ_parse_typeid_declaratorÚ_parse_id_declarator)r   rÐ   rÑ   Ú	name_typerÎ   rG   rM   rb   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¯   rB   rd   rÍ   )r   rÎ   rG   rÄ   Únested_parenÚdepthr   r   r   rÍ   /  sF   
ÿ
ÿ





þôz"CParser._scan_declarator_name_infoc                 C   s   |   ¡ dv S )N>   rÈ   ÚLBRACKETrË   rP   r   r   r   Ú"_starts_direct_abstract_declaratorR  ra   z*CParser._starts_direct_abstract_declaratorc                 C   s   |   ¡ }|d uo|jtv S rN   )rB   rd   Ú_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_tokrv   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 rN   )rB   r   ÚFileASTÚ_parse_translation_unitrP   r   r   r   rA   t  s   
z(CParser._parse_translation_unit_or_emptyc                 C   s.   g }|   ¡ d ur| |  ¡ ¡ |   ¡ d us|S rN   )rB   Ú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$   rm   )r   r‚   r€   rd   r   )r„   rb   r    r¡   T©Úallow_no_typerÉ   rd   r¢   ÚEQUALSr   )Úfirstr£   )rB   rd   Ú_parse_pp_directiveÚ_parse_pppragma_directiver²   Ú_parse_static_assertr¾   rÕ   r¬   rC   rM   r8   r   rt   r¥   Ú_parse_compound_statementÚ_parse_declaration_specifiersrÏ   Ú_parse_decl_body_with_specr³   Ú_parse_declaration_listÚ_parse_initializerÚ_parse_init_declarator_listrŸ   )r   rG   rb   r    r„   ÚfuncÚsaw_typeÚ
spec_coordrÖ   Ú_r†   Ú	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Æ   rd   r   r   r   r‚   r€   r   r‘   r¢   r£   )rÌ   rü   r   r•   r–   r”   rR   re   r˜   rM   rŸ   r8   )r   r„   rþ   r†   ÚtyÚs_u_or_er   r   r   rù   è  sD   €÷ÿöý
üÿz"CParser._parse_decl_body_with_specc                 C   s&   g }|   ¡ r| |  ¡ ¡ |   ¡ s|S rN   )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Ú_ALIGNASr‚   ©rO   Ú_ATOMICr‹   rÈ   rd   r   r€   r   rm   rÊ   ¾   ÚUNIONÚSTRUCTÚENUMr   rl   )rB   rd   rE   r…   Ú_parse_alignment_specifierr¬   Ú_parse_atomic_specifierrÙ   r¯   rD   Ú_STORAGE_CLASSÚ_FUNCTION_SPECÚ_TYPE_SPEC_SIMPLEr   rt   Ú _parse_struct_or_union_specifierÚ_parse_enum_specifierrC   r7   r=   )r   rñ   r„   rþ   Úfirst_coordrG   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  r‚   r  r  r‹   rÈ   rd   r   rm   rÊ   r  r  zInvalid specifier listrl   r€   r   )rB   rd   rE   r…   r  r¬   r  rÙ   r¯   rD   r  r   rt   r  r  rC   r7   r=   rX   )r   r„   rþ   Úsaw_alignmentr  rG   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 rN   )r¬   rÙ   rO   r¯   rD   )r   rs   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   ÚAlignasrE   Ú_parse_constant_expression)r   rG   rv   Úexprr   r   r   r    s   



z"CParser._parse_alignment_specifierc                 C   s6   |   d¡ |   d¡ |  ¡ }|   d¡ |j d¡ |S )Nr  rÈ   rØ   Ú_Atomic)r³   rà   rs   rO   )r   rv   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²   rO   )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û   r8   )r   rÆ   rb   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)rU   r†   rM   z Invalid struct/union declaration)	r¯   r¨   rD   r¬   r²   rE   Ú_parse_struct_declaration_listr³   rC   )r   rG   ÚklassÚname_tokr†   Ú	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>   Nr$  )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‰   r€   ÚCOLON©r„   r†   rd   r   r   r¢   )r¬   r¯   rõ   r  rX   rÌ   Ú_parse_struct_declarator_listr³   rŸ   rR   re   r   ÚNodert   r8   )r   r„   r†   ÚnodeÚ	decl_typer   r   r   r*  `  s4   



ÿ
ÿz!CParser._parse_struct_declarationc                 C   s0   |   ¡ g}|  d¡r| |   ¡ ¡ |  d¡s
|S ©Nr!  )Ú_parse_struct_declaratorr²   rO   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   rf   r#  )r   rŠ   rb   r   r   r   r3  Š  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”   rD   rE   )r   rG   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   ÚEnumeratorListrM   r²   r¬   ÚenumeratorsrO   )r   ÚenumÚ	enum_listr   r   r   r4  ­  s   
þ
üzCParser._parse_enumerator_listc                 C   sL   |   d¡}|  d¡r|  ¡ }nd }t |j||  |¡¡}|  |j|j	¡ |S )NrÉ   rò   )
r³   r²   r  r   Ú
EnumeratorrD   rE   r[   rU   rM   )r   r'  rD   r9  r   r   r   r6  ¸  s   


zCParser._parse_enumeratorc                 C   s"   | j ddd\}}|d usJ ‚|S )NF©rÐ   rÑ   )r×   )r   rb   r   r   r   r   r#  Æ  s
   
ÿzCParser._parse_declaratorc                 C   ó   | j dddS )Nrp   T©r|   Úallow_paren©Ú_parse_declarator_kindrP   r   r   r   rÕ   Î  ó   zCParser._parse_id_declaratorc                 C   r=  )NÚtypeidTr>  r@  rP   r   r   r   rÔ   Ò  rB  z CParser._parse_typeid_declaratorc                 C   r=  )NrC  Fr>  r@  rP   r   r   r   rÓ   Ö  rB  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_declaratorrj   )r   r|   r?  ÚptrÚdirectr   r   r   rA  Ú  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È   TrD  rØ   rp   rÉ   rÊ   rŽ   )r²   rA  r³   r   rf   rD   rE   Ú_parse_decl_suffixes)r   r|   r?  rb   r'  r   r   r   rF  æ  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¬   rj   Ú_parse_array_declÚ_parse_function_decl)r   rb   rý   r   r   r   rI  û  s   
zCParser._parse_decl_suffixesÚ	base_declc                 C   s   | j d |jdS ©N©Ú	base_typerM   )Ú_parse_array_decl_commonrM   )r   rL  r   r   r   rJ  	  rº   zCParser._parse_array_declrO  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)rd   ÚdimÚ	dim_qualsrM   )r   Ú	ArrayDecl)rQ  rR  rN  r   r   Úmake_array_decl  s   ÿz9CParser._parse_array_decl_common.<locals>.make_array_declÚSTATICÚstaticÚRBRACKETrÇ   )r³   rE   r²   r  Ú_parse_assignment_expressionr¬   rÙ   r   rÉ   rD   rÁ   )r   rO  rM   Ú
lbrack_tokrT  rR  rQ  Ú	times_tokr   rN  r   rP    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Ø   ©Úargsrd   rM   rï   rU   )r³   r²   r¾   Ú_parse_parameter_type_listÚ_parse_identifier_list_optr   ru   rM   r¬   r\  Úparamsre   ÚEllipsisParamÚgetattrr[   )r   rL  r\  rý   ÚparamrU   r   r   r   rK  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Ç   )rs   rd   rM   )r²   r  rO   rE   r   ÚPtrDecl)r   ÚstarsrZ  rs   rG  rM   r   r   r   rE  `  s   

ýzCParser._parse_pointerc                 C   sN   |   ¡ }|  ¡ dkr%|  d¡dkr%|  ¡  |  ¡ }|j t |  |¡¡¡ |S ©Nr!  r‹   ÚELLIPSIS)Ú_parse_parameter_listr¬   r¯   r_  rO   r   r`  rE   )r   r_  Ú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   Ú	ParamListrM   r¬   r¯   r_  rO   ©r   ró   r_  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ð   rd   r$   rm   r<  r¢   r-  r   )	rø   r   rt   rÌ   r×   rŸ   r8   Ú_build_parameter_declarationrÒ   )r   r„   r   rÿ   rb   Úis_namedr   r   r   ri  „  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 )
Nrd   r   rV   r   r¢   r-  r'   r   ©rU   rs   r   rd   rM   )	rR   rn   r_   rŸ   r8   r   ÚTypenamerf   rx   )r   r„   rb   rÿ   r   r   r   rl  —  s"   ÿÿþûz$CParser._build_parameter_declarationc                 C   ó   |   ¡ dkrd S |  ¡ S ©NrØ   )r¬   Ú_parse_identifier_listrP   r   r   r   r^  ­  ó   z"CParser._parse_identifier_list_optc                 C   s@   |   ¡ }t |g|j¡}|  d¡r|j |   ¡ ¡ |  d¡s|S r2  )Ú_parse_identifierr   rj  rM   r²   r_  rO   rk  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 )Nrd   r   r'   r   rn  )r  rÒ   rM   r   ro  rf   r   rx   )r   r„   rb   rM   rk   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¬   rE  rÝ   Ú!_parse_direct_abstract_declaratorr   rf   rj   )r   rG  rb   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   ru   rf   rE   rÒ   Ú_parse_abstract_array_baserC   r7   r=   rI  )r   rá   r_  rb   r   r   r   ru  ä  s"   

ý


z)CParser._parse_direct_abstract_declaratorc                 C   rp  rq  )r¬   r]  rP   r   r   r   rv  û  rs  z&CParser._parse_parameter_type_list_optc                 C   s   | j t d d d d ¡d dS rM  )rP  r   rf   rP   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_itemsrM   )r¬   Ú_parse_pppragma_directive_listrˆ  r   ÚCompoundrM   )r   ÚpragmasÚstmtr   r   r   Ú_parse_pragmacomp_or_statement$  s
   z&CParser._parse_pragmacomp_or_statementc                 C   s   |   ¡ r|  ¡ S |  ¡ S rN   )r¾   r  rˆ  rP   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¬   r  re   Úlistrå   rO   )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$  r‰  )r³   r²   r   rŒ  rE   r“  )r   Ú
lbrace_tokrŠ  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Å   r  r   ÚEmptyStatementrE   ÚLabelrD   r  ÚCaseÚDefaultrC   r7   r=   )r   rÄ   r'  rŽ  Úcase_tokr  Údef_tokr   r   r   rƒ  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¯   rd   r³   Ú_parse_expressionr  r²   r   ÚIfrE   r   ÚSwitchrC   )r   rG   ÚcondÚ	then_stmtÚ	else_stmtr  rŽ  r   r   r   r„  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¯   rd   r³   rœ  r  r   ÚWhilerE   ÚDoWhiler¾   r  ÚDeclListÚ_parse_expression_optÚForrC   )r   rG   rŸ  rŽ  r†   r   Ú	next_exprr   r   r   r…  †  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¯   rd   r³   r   ÚGotorD   rE   ÚBreakÚContinuer²   ÚReturnrœ  rC   )r   rG   r'  r  r   r   r   r†  °  s(   








zCParser._parse_jump_statementc                 C   s.   |   ¡ }|  d¡}|d u rt |  |¡¡S |S r  )r¥  r³   r   r•  rE   )r   r  Úsemi_tokr   r   r   r‡  Ç  s
   
z#CParser._parse_expression_statementc                 C   s   |   ¡ r|  ¡ S d S rN   )rÁ   rœ  rP   r   r   r   r¥  Ò  s   zCParser._parse_expression_optc                 C   sR   |   ¡ }|  d¡s|S ||   ¡ g}|  d¡r"| |   ¡ ¡ |  d¡st ||j¡S r2  ©rX  r²   rO   r   ÚExprListrM   ©r   r  Úexprsr   r   r   rœ  Ø  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ß   rD   rX  r   Ú
AssignmentrM   )r   Úcompr  ÚopÚrhsr   r   r   rX  ã  s   

z$CParser._parse_assignment_expressionc                 C   sB   |   ¡ }|  d¡r|  ¡ }|  d¡ |  ¡ }t ||||j¡S |S )NÚCONDOPr,  )Ú_parse_binary_expressionr²   rœ  r³   r±  r   Ú	TernaryOprM   )r   r  ÚiftrueÚ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	rN   )
Ú_parse_cast_expressionrB   rd   Ú_BINARY_PRECEDENCErD   r¯   r·  r   ÚBinaryOprM   )	r   r»  r¼  rG   Úprecr´  rµ  Únext_tokÚ	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   ÚCastrE   Ú_parse_unary_expression)r   Úresultrv   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>   ÚANDÚNOTÚLNOTÚPLUSÚMINUSrÇ   ÚSIZEOFÚ_ALIGNOFrÈ   rØ   )r¬   r¯   rÄ  r   ÚUnaryOprD   rM   r½  râ   rE   r³   rà   Ú_parse_postfix_expression)r   rÄ   rG   r  rÅ  rv   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Ü   rW  rÈ   rØ   >   ÚARROWÚPERIOD>   rÉ   rÊ   zInvalid struct referencerÆ  Úp)râ   r²   Ú_parse_initializer_listr³   r   ÚCompoundLiteralr¹   Ú_parse_primary_expressionrœ  ÚArrayRefrM   r¬   r¯   Ú_parse_argument_expression_listÚFuncCallrd   rC   rE   rÉ   rD   Ú	StructRefrÐ  )r   rÅ  rv   r´   r   r   r  Úsubr\  Úop_tokr'  ÚfieldrG   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¯   rœ  r³   rà   Ú!_parse_offsetof_member_designatorrE   r   rÚ  rÉ   rD   r®  rC   r7   r=   )r   rÄ   r  Úoff_tokrv   Ú
designatorrM   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Ü   rW  )Ú_parse_identifier_or_typeidr²   r   rÛ  rM   rœ  r³   rØ  )r   r0  rÞ  r  r   r   r   rè  «  s   


z)CParser._parse_offsetof_member_designatorc                 C   s>   |   ¡ }|g}|  d¡r| |   ¡ ¡ |  d¡st ||j¡S r2  r­  r¯  r   r   r   rÙ  »  s   

ÿz'CParser._parse_argument_expression_listc                 C   s   |   ¡ S rN   )r±  rP   r   r   r   r  Ã  s   z"CParser._parse_constant_expressionc                 C   s   |   d¡}t |j|  |¡¡S )NrÉ   )r³   r   rÉ   rD   rE   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¯   rd   rC   rE   r   rÉ   rD   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$   rV   )ÚfÚFÚfloatzlong doubleÚdoubleÚcharzInvalid constant)r¯   rd   rà  rD   Ú
ValueErrorr   ÚConstantrE   rá  râ  rC   )r   rG   Úu_countÚ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ÚstringrV   r   )r³   r   rø  rD   rE   r¬   r¯   ©r   rG   r0  Ú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þ  rV   r‹   )
r¯   rd   ræ  rC   rE   r   rø  rD   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   ÚInitListrE   rÕ  r³   rX  )r   r”  Ú	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¬   rO   r   r  rM   )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   ÚNamedInitializer)r   Údesignationr   r   r   r   r  %  s   zCParser._parse_initializer_itemc                 C   r  )Nrò   )Ú_parse_designator_listr³   ©r   Údesignatorsr   r   r   r  /  r  zCParser._parse_designationc                 C   ó.   g }|   ¡ dv r| |  ¡ ¡ |   ¡ dv s|S r  )r¬   rO   Ú_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Ü   rW  rÓ  zInvalid designator)r²   r  r³   rì  rC   r7   r=   )r   r  r   r   r   r  =  s   


zCParser._parse_designatorc                 C   s    |   d¡}|  d|  |¡¡ d S )Nré   zDirectives not supported yet)r³   rC   rE   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ì   ÚPPPRAGMASTRr'   rë   rÈ   rØ   zInvalid pragma)r¬   r¯   r   ÚPragmarD   rE   r³   rå  rC   r7   r=   )r   rG   Ústr_tokÚlparenÚliteralr   r   r   rõ   P  s   

z!CParser._parse_pppragma_directivec                 C   r  )Nrê   )r¬   rO   rõ   )r   r  r   r   r   r‹  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   ÚStaticAssertrE   )r   rG   rŸ  rL   r   r   r   rö   i  s   



zCParser._parse_static_assert)r'   FrN   )r   N)F©r   )FF)r   rz   r¼   )r   r‡   )T)r   N)r   r   r    r!   r   Úboolrd   r"   r<   r   rã   rH   r$   r   r   rJ   r   rC   rQ   rT   rZ   r[   r_   r3   r4   r5   r6   r   r/  rj   r˜   r—   ro  r   rx   r…   rŸ   r¥   r¨   r   rB   r¬   r¯   r²   r³   rµ   r¹   rE   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.  r3  r  r4  r6  r#  rÕ   rÔ   rÓ   rA  rF  rI  rJ  rP  rK  rE  rj  r]  rg  ri  rl  r^  rr  rà   rÒ   ru  rv  rw  rˆ  r  r  r“  r÷   rƒ  r„  r…  r†  r‡  r¥  rœ  rX  r±  r·  r½  rÄ  rÑ  r×  rè  rÙ  r  rt  rì  rã  rå  rç  rû   rÕ  r  r  r	  r  rô   rõ   r‹  rö   r   r   r   r   r&   2   sè   øþýüûúùø	
÷ÿÿÿÿ
þ	
*,þý
ü-ûþýüû
úüþýü
ûgþýüû
ú
ÿÿÿ
þ#
þVÿÿ
þ*ÿÿ
þ{c
ÿÿÿ
þ!"ÿÿÿ
þÿÿÿ
þ:	
ÿÿÿ
þ!*ÿÿÿ
þ" 2% 		
r&   >   rò   ÚOREQUALÚANDEQUALÚDIVEQUALÚMODEQUALÚXOREQUALÚ	PLUSEQUALÚ
MINUSEQUALÚ
TIMESEQUALÚLSHIFTEQUALÚRSHIFTEQUALÚLORÚLANDÚORr‹   ÚXORé   rÉ  é   ÚEQé   ÚNEÚGTé   ÚGEÚLTÚLEÚRSHIFTé   ÚLSHIFTrÌ  é   rÍ  rÇ   é	   ÚDIVIDEÚMOD>   ÚAUTOÚEXTERNrU  ÚTYPEDEFÚREGISTERÚ_THREAD_LOCALÚINLINEÚ	_NORETURN>   ÚCONSTr  ÚRESTRICTÚVOLATILE>   ÚINTÚCHARÚLONGÚVOIDÚFLOATÚSHORTÚ_BOOLÚDOUBLEÚSIGNEDÚUNSIGNEDÚ_COMPLEXÚ__INT128>   r  r  r  rÊ   r  r  >   rÉ   rÉ  rÊ  rË  rÌ  rÍ  rÇ   rÈ   rÎ  rß  rÇ  rÏ  rÈ  >   ÚINT_CONST_BINÚINT_CONST_DECÚINT_CONST_HEXÚINT_CONST_OCTÚINT_CONST_CHARÚFLOAT_CONSTÚHEX_FLOAT_CONST>   Ú
CHAR_CONSTÚWCHAR_CONSTÚU8CHAR_CONSTÚU16CHAR_CONSTÚU32CHAR_CONSTrý  >   ÚWSTRING_LITERALÚU8STRING_LITERALÚU16STRING_LITERALÚU32STRING_LITERAL>   r}  rz  r~  rx  r  rí   r€  r|  rï   r‚  r{  ry  rë   r  rì   rî   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 )r:   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   r<   	  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 rN   ©r]  rP   r   r   r   r´   "	  s   z_TokenStream.markr´   c                 C   s
   || _ d S rN   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 rN   )rR   r\  r]  r[  r¦   rO   )r   ra  rG   r   r   r   r_  (	  s   
üz_TokenStream._fillr  )r   r   r    r!   r   r<   r$   r   r   rª   r­   r´   r·   r_  r   r   r   r   r:   ÿ  s    r:   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 )rz   r   r€   rd   r   r‚   N)r   r   r    r   r   r#   r   r   r   r   rz   6	  s   
 rz   r~   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‡   rb   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   Úc_lexerr   r   Úast_transformsr   r   r   Ú	Exceptionr%   r&   rÞ   r¾  r  r  rÙ   r  r½   Ú_EXPR_STARTrà  rá  râ  rä  ræ  rÀ   rÂ   r:   rz   r}   r‡   r   r   r   r   Ú<module>   sÈ   ,                Rÿþýüûúùø	÷
öõôóòñðïîÿþýüÿÿþýüûÿ	7