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   O/home/ubuntu/veenaModal/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ddZ?dBd;dede!e	j fddZ@de!e	j fddZA	d*dede4d;eee f fddZBd-ddZCde!e fddZDde	jfddZEde	jfddZF	d.dedD djede!dD fddZGd*djeddDfddZHde	jfddZIde!e	j fddZJdee!e	j  fddZKde!dD fddZLd/ddZMde	jfddZNde	jfddZOde	jfddZPde	jfddZQde	jfddZRde	jfddZSde	jfddZTd=edede	jfddZU	d0d=edede	jfddZVd3e	jde	jfddZWde	jde	jfddZX	d(dee	j dee de	jfddZYde	jde	jfddZZdee	j fddZ[de	j\fddĄZ]de	j\fddƄZ^de	jfddȄZ_dBd;d3ee	j dee de	jfdd˄Z`dee	j fdd̈́Zade	jfddτZbde	j fddфZcdee	j fddӄZdde	jfddՄZedee	j\ fddׄZfde	jfddلZgde	je!e	j B fddۄZhde	je!e	j B fdd݄Zide	je!e	j B fdd߄Zjde!e	j fddZkde	jfddZlde	jfddZmde	jfddZnde	jfddZode	jfddZpde	jfddZqdee	j fddZrde	jfddZsde	jfddZtde	jfddZu	d1dedee	j de	jfddZvde	jfddZwde	jfdd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Zde	jfddZde	jfddZde	jfddZde	jfddZde	jfddZde!e	j fddZde!e	j fddZde	jfddZdefdd Zde	jfd!d"Zde!e	j fd#d$Zde!e	j fd%d&Zd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 scopeTz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 )zLooks 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 )zTacks 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st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sJ |rt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 )zBuilds 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 )zConditionally 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rd}|   |  \}}|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|  rd }|  r|  }|  dkr| 	d|j
 |d st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|rn`|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|rn\|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rn 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 rt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:   zWraps 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 )zPeek 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