
    Pi^                    >   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                      Z G d	 d
e          Z G 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z  ez  ez  h d-z  Zh d.Zh d/Z d0d1hZ!h d2Z"d3hZ#h d4Z$ee z  e!z  e"z  e#z  e$z  Z%h d5Z& G d6 d7          Z' G d8 d9e
          Z(ed:         Z) G 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                   N    e Zd ZU dZeed<   eed<   dZee         ed<   defdZ	dS )CoordzkCoordinates of a syntactic element. Consists of:
    - File name
    - Line number
    - Column number
    filelineNcolumnreturnc                 P    | j          d| j         }| j        r|d| j         z  }|S )N:r   r   r   )selftexts     f/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/pycparser/c_parser.py__str__zCoord.__str__'   s=    )))di)); 	&%%%%D    )
__name__
__module____qualname____doc__str__annotations__intr   r	   r    r    r   r   r      sc           III
III FHSM         r    r   c                       e Zd ZdS )
ParseErrorN)r!   r"   r#   r(   r    r   r*   r*   .   s        Dr    r*   c                      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Z	 ddededede	j
        fdZddedee         defdZdedeez  dz  defdZddZddZdedee         ddfdZdedee         ddfdZdedefd Zded!ededdfd"Zdd#Zdd$Zdedefd%Zd&ed'ede	j        fd(Zd&e	j        e	j        z  e	j         z  d)e!e         de	j        e	j        z  e	j         z  fd*Z"	 dd+ed,         d-ed.d/d0edd,f
d1Z#	 dd2d,d3e!d4         d5ede!e	j                 fd6Z$d2d,d&e	j        d7ee!e	j                          d8e	j        de	j        f
d9Z%d:edefd;Z&dd=edee'         fd>Z(dd=edee         fd?Z)de'fd@Z*dAedee'         fdBZ+dAede'fdCZ,defdDZ-dEeddfdFZ.dGe'defdHZ/ddGee'         defdIZ0ddGee'         defdJZ1defdKZ2ddLedefdMZ3de4ee         ef         fdNZ5	 ddOedPede4ee	j                 ef         fdQZ6de4ee         ef         fdRZ7defdSZ8defdTZ9dee4e	j         ee'f                  fdUZ:de	j
        fdVZ;de!e	j                 fdWZ<de!e	j                 fdXZ=de!e	j                 fdYZ>de!e	j                 fdZZ?d2d,d[ede!e	j                 fd\Z@de!e	j                 fd]ZA	 dd^ede4d,eee         f         fd_ZBdd`ZCde!e         fdaZDde	j        fdbZEde	j        fdcZF	 ddded4         dLede!d4         fdeZGddLedd4fdfZHde	j        fdgZIde!e	j                 fdhZJdee!e	j                          fdiZKde!d4         fdjZLddkZMde	j        fdlZNde	j        fdmZOde	j        fdnZPde	j        fdoZQde	j        fdpZRde	j        fdqZSde	j        fdrZTd.edsede	j        fdtZU	 dd.edsede	j        fduZVd&e	j        de	j        fdvZWdwe	j        de	j        fdxZX	 ddyee	j                 dee         de	j        fdzZYdwe	j        de	j        fd{ZZdee	j                 fd|Z[de	j\        fd}Z]de	j\        fd~Z^de	j        fdZ_d2d,d&ee	j                 dee         de	j        fdZ`dee	j                 fdZade	j        fdZbde	j         fdZcdee	j                 fdZdde	j        fdZedee	j\                 fdZfde	j        fdZgde	j        e!e	j                 z  fdZhde	j        e!e	j                 z  fdZide	j        e!e	j                 z  fdZjde!e	j                 fdZkde	j        fdZlde	j        fdZmde	j        fdZnde	j        fdZode	j        fdZpde	j        fdZqdee	j                 fdZrde	j        fdZsde	j        fdZtde	j        fdZu	 ddedee	j                 de	j        fdZvde	j        fdZwde	j        fdZxde	j        fdZyde	j        fdZzde	j        fdZ{de	j        fdZ|de	j        fdZ}de	j        fdZ~de	j        fdZde	j        fdZde	j        fdZde	j        fdZde	j        fdZde	j        fdZde	j        fdZde!e	j                 fdZde!e	j                 fdZde	j        fdZdefdZde	j        fdZde!e	j                 fdZde!e	j                 fdZdS )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                      || j         | j        | j        | j                  | _        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/   r0   r1   r2   r3   r4   s           r   __init__zCParser.__init__>   sY     "E+33!7	
 
 
	 59FF8%1$)%<%<r    r   filenamedebugc                 L   t                      g| _        | j                            ||           t	          | j                  | _        |                                 }|                                 }|1|                     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: )r?   r@   r>   inputrA   rB    _parse_translation_unit_or_empty_peek_parse_errorvalue
_tok_coord)r   r   rD   rE   asttoks         r   parsezCParser.parseZ   s     "VVH	h'''#DI..3355jjll?444dooc6J6JKKK
r    linenor   c                 :    t          | j        j        ||          S )Nr   )r   r>   rD   )r   rQ   r   s      r   _coordzCParser._coordv   s    $),6&IIIIr    msgcoordc                 *    t          | d|           )Nz: )r*   )r   rT   rU   s      r   rK   zCParser._parse_errory   s    E**S**+++r    c                 R    | j                             t                                 d S N)r@   appendr?   r   s    r   _push_scopezCParser._push_scope|   s#      (((((r    c                 l    t          | j                  dk    sJ | j                                         d S )Nr   )lenr@   poprZ   s    r   
_pop_scopezCParser._pop_scope   s9    4$%%))))r    namec                     | 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r@   getrK   r   r`   rU   s      r   _add_typedef_namezCParser._add_typedef_name   se     $((t44 	T4TTT   '+"d###r    c                     | 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
        rb   FzNon-typedef z- previously declared as typedef in this scopeNrc   re   s      r   _add_identifierzCParser._add_identifier   sg     R $$T511 	TtTTT   ',"d###r    c                 j    t          | j                  D ]}|                    |          }||c S dS )z.Is *name* a typedef-name in the current scope?NF)reversedr@   rd   )r   r`   scopein_scopes       r   _is_type_in_scopezCParser._is_type_in_scope   sF    d/00 	  	 E yyH# $ur    r   c                 Z    |                      ||                     ||                     d S rX   )rK   rS   )r   rT   r   r   s       r   r:   zCParser._lex_error_func   s,    #t{{48899999r    c                 .    |                                   d S rX   )r[   rZ   s    r   r;   zCParser._lex_on_lbrace_func   s    r    c                 .    |                                   d S rX   )r_   rZ   s    r   r<   zCParser._lex_on_rbrace_func   s    r    c                 ,    |                      |          S )zLooks up types that were previously defined with
        typedef.
        Passed to the lexer for recognizing identifiers that
        are types.
        )rm   )r   r`   s     r   r=   zCParser._lex_type_lookup_func   s     %%d+++r    declmodifierc                 2   |}|}|j         r|j         }|j         t          |t          j                  r	||_         |S |}t          |j         t          j                  s&|j         }t          |j         t          j                  &|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   rr   rs   modifier_headmodifier_tail	decl_tails         r   _type_modify_declzCParser._type_modify_decl   s     !    	/).M   	/ dEN++ 	!%MO
 I @@ +%N	 !@@ + "+M*INKr    typenamec                    |}t          |t          j                  s!|j        }t          |t          j                  !|j        |_        |j        dd         |_        |D ]V}t          |t          j                  s:t          |          dk    r| 	                    d|j
                   K||_        |c S W|s\t          |j        t          j                  s| 	                    d|j
                   t          j        dg|j
                  |_        n0t          j        d |D             |d         j
                  |_        |S )	z#Fixes a declaration. Modifies decl.Nr   z Invalid multiple types specifiedMissing type in declarationr'   rU   c                 &    g | ]}|j         D ]}|S r(   )names).0idr`   s      r   
<listcomp>z/CParser._fix_decl_name_type.<locals>.<listcomp>$  s'    >>>"RX>>T>>>>r    r   )rv   r   rw   ru   declnamer`   qualsIdentifierTyper]   rK   rU   FuncDecl)r   rr   r|   typtns        r   _fix_decl_name_typezCParser._fix_decl_name_type   sQ    S%.11 	(C S%.11 	 L	JqqqM	  	  	 Bb%"677  x==1$$%%&H"(SSSS!CHKKK   
	di88 M!!"?LLL+UG4:FFFCHH +>>>>>hqkFW  CH r    declspec	_DeclSpecnewspeckind_DeclSpecKindrY   c                     |t          g g g g g           }n|}|r||                             |           n||                             d|           |S )z2See _DeclSpec for the specifier dictionary layout.Nqualstorageru   function	alignmentr   )r?   rY   insert)r   r   r   r   rY   specs         r   _add_declaration_specifierz"CParser._add_declaration_specifier(  st     ""rR  DD D 	*Jg&&&&Ja)))r    r   decls	_DeclInfotypedef_namespacec                 \   d|d         v }g }|d                              d          |d         d         t          |d                   dk     sPt          |d         d	         j                  d
k    s,|                     |d         d	         j        d                   s<d}|d         D ]}t	          |d          r	|j        } n|                     d|           t          j        |d         d	         j        d         dd|d         |d         d	         j                  |d         d<   |d         d	= nt          |d         d         t          j
        t          j        t          j        t          j        f          st          t          |d         d                   }t          |t          j                  s!|j        }t          |t          j                  !|j        '|d         d	         j        d         |_        |d         d	= |D ]}	|	d         J |r7t          j        d|d         |d         |	d         |	d         j                  }
nlt          j        d|d         |d         |d         |d         |	d         |	                     d          |	                     d          |	d         j        	  	        }
t          |
j        t          j
        t          j        t          j        t          j        f          r|
}n|                     |
|d                   }|rC|r!|                     |j        |j                   n |                     |j        |j                   t1          t          t          j        t          j        z  |                    }|                    |           |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   bitsizeNrr   ru      rb   r   ?rU   Invalid declarationr   r   ru   r   alignrU   r   )r`   r   r   ru   rU   r   init	r`   r   r   r   funcspecru   r   r   rU   )rd   r]   r   rm   hasattrrU   rK   r   rw   rv   EnumStructUnionr   r   r   ru   r   TypedefDeclr   rf   r`   rh   r   rY   )r   r   r   r   
is_typedefdeclarationsrU   tdecls_0_tailrr   declaration
fixed_decls               r   _build_declarationszCParser._build_declarations>  s    $y/1
 8<<	""*
 Qx'V%%))4<+122a7711$v,r2B2H2KLL 8  E!&\ " ""1g.. "$%GE!E" %%&;UCCC $)>!&\"-3A6{+v,r*0$ $ $a  L$$  a U\5;8LM  	)  $Cq&)9::$\5>BB 5#/#4L %\5>BB 5(0,0L,<,B1,EL)VR( *	, *	,D<+++ #mv, Ofv,,   $jv,{+ O!*-f&)) HHY//v,,
 
 
  U\5;8LM  Q )

!55k4<PP
 ! L L**:?J<LMMMM((*:JKKK.UZ%-/<< J 
++++r    param_declsbodyc                     d|d         v r|                      d|j                   |                     |t          |dd          gd          d         }t	          j        ||||j        	          S )
zBuilds a function definition.r   r   zInvalid typedefNrr   r   r   Tr   r   r   r   )rr   r   r   rU   )rK   rU   r   r?   r   FuncDef)r   r   rr   r   r   r   s         r   _build_function_definitionz"CParser._build_function_definition  s     Y''/<<<..Td;;;<" / 
 
 	 }+D

 
 
 	
r    tokenc                 >    |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   s     r   _select_struct_union_classz"CParser._select_struct_union_class  s     H<;r    r   kc                 6    | j                             |          S )z:Return the k-th next token without consuming it (1-based).)rB   peekr   r   s     r   rJ   zCParser._peek  s    |  ###r    c                 B    |                      |          }||j        ndS )zDReturn the type of the k-th next token, or None if absent (1-based).N)rJ   ru   )r   r   rO   s      r   
_peek_typezCParser._peek_type  s!    jjmm?sxx4r    c                     | j                                         }|"|                     d| j        j                   d S |S )NzAt end of input)rB   nextrK   r>   rD   r   rO   s     r   _advancezCParser._advance  sA    l!!;/1CDDDDDJr    
token_typec                 p    |                                  }||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)rJ   ru   r   r   r   rO   s      r   _acceptzCParser._accept  s5     jjll?sx:55==??"tr    c                     |                                  }|j        |k    r1|                     d|j         |                     |                     |S )NrG   )r   ru   rK   rL   rM   r   s      r   _expectzCParser._expect  sN    mmoo8z!!444dooc6J6JKKK
r    c                 4    | j                                         S rX   )rB   markrZ   s    r   _markzCParser._mark  s    |  """r    r   c                 :    | j                             |           d S rX   )rB   resetr   r   s     r   _resetzCParser._reset  s    4     r    rO   c                 B    |                      |j        |j                  S rX   )rS   rQ   r   r   s     r   rM   zCParser._tok_coord  s    {{3:sz222r    c                 R    |p|                                  }|dS |j        t          v S NF)rJ   ru   _DECL_STARTr   s     r   _starts_declarationzCParser._starts_declaration  s+    !TZZ\\;5x;&&r    c                 R    |p|                                  }|dS |j        t          v S r   )rJ   ru   _STARTS_EXPRESSIONr   s     r   _starts_expressionzCParser._starts_expression  s,    !TZZ\\;5x---r    c                 p    |                                  }|dS |t          v rdS |                                 S )NFT)r   _STARTS_STATEMENTr   r   tok_types     r   _starts_statementzCParser._starts_statement  s?    ??$$5(((4&&(((r    id_onlyc                 V    |                                  }|dS |dv rdS |r|dk    S |dv S )NF>   TIMESLPARENTID>   r   TYPEIDr   )r   r   r   s      r   _starts_declaratorzCParser._starts_declarator  sL    ??$$5***4 	$t##+++r    c                     |                                  }|                                 \  }}|                     |           ||fS rX   )r   _scan_declarator_name_infor   )r   r   r   	saw_parens       r   _peek_declarator_name_infoz"CParser._peek_declarator_name_info  sB    zz||"==??)D""r    allow_abstracttypeid_paren_as_abstractc                    |                                  \  }}|
|ro|dk    ri|rg|sM|                                 }||                     |          n| j        j        }|                     d|           |                                 }|dfS |dk    r,|r|                                 }n)|                                 }n| 	                                }|dfS )Nr   zInvalid declaratorFT)
r   rJ   rM   r>   rD   rK   _parse_abstract_declarator_opt _parse_typeid_noparen_declarator_parse_typeid_declarator_parse_id_declarator)r   r   r   	name_typer   rO   rU   rr   s           r   _parse_any_declaratorzCParser._parse_any_declarator  s      $>>@@	9$ )2h)>)>9)>! ?jjll03,,,TYEW!!"6>>>6688D;  ' 7<<>>4466,,..DTzr    c                    d}|                      d          r_|                                 t          v r/|                                  |                                 t          v /|                      d          _|                                 }|d |fS |j        dv r|                                  |j        |fS |j        dk    rd}|                                  |                                 \  }}|rd}d}	 |                                 }|d |fS |j        dk    r|dz  }n,|j        dk    r!|dz  }|                                  |dk    rnX|                                  l||fS d |fS )	NFr   >   r   r   r   Tr   RPARENr   )r   r   _TYPE_QUALIFIERr   rJ   ru   r   )r   r   rO   r   nested_parendepths         r   r   z"CParser._scan_declarator_name_info/  s   	ll7## 	 //##66 //##66 ll7## 	  jjll;?"8'''MMOOO8Y&&8xIMMOOO%)%D%D%F%F"Hl ! 	E jjll;?*8x''QJEEX))QJEMMOOOzz  Y&&Yr    c                 .    |                                  dv S )N>   r   LBRACKETr   rZ   s    r   "_starts_direct_abstract_declaratorz*CParser._starts_direct_abstract_declaratorR  s      $:::r    c                 N    |                                  }|d uo|j        t          v S rX   )rJ   ru   _ASSIGNMENT_OPSr   s     r   _is_assignment_opzCParser._is_assignment_opU  s%    jjll$>38#>>r    c                 <   |                                  }|                     d          }|dS |                                 s|                     |           dS |                                 }|                     d          |                     |           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_tokr   s       r   _try_parse_paren_type_namez"CParser._try_parse_paren_type_nameY  s     zz||\\(++
4'')) 	KK4##%%<<!!)KK4D*$$r    c                     |                                  t          j        g           S t          j        |                                           S rX   )rJ   r   FileAST_parse_translation_unitrZ   s    r   rI   z(CParser._parse_translation_unit_or_emptyt  s<    ::<<=$$$}T99;;<<<r    c                     g }|                                  ;|                    |                                            |                                  ;|S rX   )rJ   extend_parse_external_declaration)r   exts     r   r
  zCParser._parse_translation_unitz  sH    jjll&JJt7799::: jjll&
r    c           	      <   |                                  }|g S |j        dk    r|                                  g S |j        dv r|                                 gS |                     d          rg S |j        dk    r|                                 S |                     |          s|                                 }d }|                                 dk    r| 	                    d|j
                   t          g g g t          j        dg|j
                  gg 	          }|                     ||||                                 
          }|gS |                     d          \  }}}|                                 \  }}	|dk    r-|                     ||          }
|                     d           |
S |                                 }|                                 dk    s|                                 rd }|                                 r|                                 }|                                 dk    r| 	                    d|j
                   |d         st          j        dg|          g|d<   |                     ||||                                 
          }|gS t          |d d           }|                     d          r|                                 |d<   |                     |          }
|                     ||
d          }
|                     d           |
S )NPPHASH   _PRAGMAPPPRAGMASEMI_STATIC_ASSERTLBRACEzInvalid function definitionr'   r   )r   r   r   ru   r   )r   rr   r   r   Tallow_no_typer   ru   r   EQUALSr   )firstr   )rJ   ru   _parse_pp_directive_parse_pppragma_directiver   _parse_static_assertr   r   r   rK   rU   r?   r   r   r   _parse_compound_statement_parse_declaration_specifiersr   _parse_decl_body_with_specr   _parse_declaration_list_parse_initializer_parse_init_declarator_listr   )r   rO   rr   r   r   funcsaw_type
spec_coordr   _r   	decl_dicts               r   r  z#CParser._parse_external_declaration  s\   jjll;I8x$$&&&I8...224455<< 	I8''',,...'',, 	 ,,..DK  H,,!!"?LLL"*E7$*EEEF  D 22'3355	 3  D 6M &*%G%G &H &
 &
"h
 6688	133D(CCELL   L((**??((D,D,D,F,F(K'')) ="::<<  H,,!!"?LLL< Q % 4eWJ O O OPV22'3355	 3  D 6M!%4dD!I!I!I	<<!! 	: $ 7 7 9 9If00y0AA((d%SW(XXVr    c                 X    |                                  }|                     d           |S Nr  )_parse_decl_bodyr   r   r   s     r   _parse_declarationzCParser._parse_declaration  s*    %%''Vr    c                 b    |                      d          \  }}}|                     ||          S )NTr  )r  r   )r   r   r%  r'  s       r   r+  zCParser._parse_decl_body  s5     >>T>RRh..tX>>>r    r%  c                 x   d }|r)|                                  r|                                 }n,|                      d          r|                     d          }||d         }t          j        t          j        t          j        f}t          |          dk    r^t          |d         |          rHt          j        d |d         |d         |d         |d	         |d         d d |d         j	        
	  	        g}nB| 
                    |t          d d d           gd          }n| 
                    ||d          }|S )NTr   ru   r   r   r   r   r   r   r   r   r   )r   r#  r   r   r   r   r]   rv   r   rU   r   r?   )r   r   r%  r   tys_u_or_es         r   r   z"CParser._parse_decl_body_with_spec  s`     	G&&(( ;88::&&t&44 G888FF=fBek5:>H2ww!||
2a5( ; ;|J!"6l";/ $Y!%j!1U! $ ek
 
 
 00TdCCCD&* 1   ,,$ -  E r    c                     g }|                                  r;|                    |                                            |                                  ;|S rX   )r   r  r-  r,  s     r   r!  zCParser._parse_declaration_list  sT    &&(( 	4LL0022333 &&(( 	4r    r  c           	         d}d}d}	 |                                  }|nd|j        dk    rC||                     |          }|                     ||                                 dd          }g|j        dk    r^|                     d          d	k    rE||                     |          }|                     ||                                 d
d          }d}|j        t          v rI||                     |          }|                     ||                                 j	        dd          }'|j        t          v rI||                     |          }|                     ||                                 j	        dd          }~|j        t          v rI||                     |          }|                     ||                                 j	        dd          }|j        t          v ru||                     |          }|                                 }|                     |t          j        |j	        g|                     |                    d
d          }d}X|j        dk    ry|rn||                     |          }|                                 }|                     |t          j        |j	        g|                     |                    d
d          }d}|j        dv rF||                     |          }|                     ||                                 d
d          }d}+|j        dk    rF||                     |          }|                     ||                                 d
d          }d}|	 | |                     d| j        j                   |s|s|                     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   rY   _ATOMICr   r   ru   r   r   r   r   r      UNIONSTRUCTENUMr   r~   )rJ   ru   rM   r   _parse_alignment_specifierr   _parse_atomic_specifierr   r   rL   _STORAGE_CLASS_FUNCTION_SPEC_TYPE_SPEC_SIMPLEr   r    _parse_struct_or_union_specifier_parse_enum_specifierrK   r>   rD   )r   r  r   r%  first_coordrO   s         r   r  z%CParser._parse_declaration_specifiers  s"    \	**,,C{x:%%&"&//#"6"6K66$99;;[QU 7   x9$$););x)G)G&"&//#"6"6K66$6688& 7    x?**&"&//#"6"6K66$--/// 7   x>))&"&//#"6"6K66$--///4 7   x>))&"&//#"6"6K66$--///D 7   x,,,&"&//#"6"6Kmmoo66(#)DOOC<P<PQQQ	 7    x8## &"&//#"6"6Kmmoo66(#)DOOC<P<PQQQ	 7    x...&"&//#"6"6K66$??AA6RV 7    x6!!&"&//#"6"6K66$4466t 7    <3TY5GHHH 	J 	J;[IIIX{**r    c           	         d }d}d}d }	 |                                  }|n|j        dk    rE||                     |          }|                     ||                                 dd          }d}i|j        dk    r^|                     d          dk    rE||                     |          }|                     ||                                 d	d          }d}|j        t          v rI||                     |          }|                     ||                                 j	        d
d          })|j        t          v ru||                     |          }|                                 }|                     |t          j        |j	        g|                     |                    d	d          }d}|j        dk    ry|rn||                     |          }|                                 }|                     |t          j        |j	        g|                     |                    d	d          }d}0|j        dv rF||                     |          }|                     ||                                 d	d          }d}|j        dk    rF||                     |          }|                     ||                                 d	d          }d}	 | |                     d| j        j                   |s|s|                     d|           |                    d          g |d<   |                    d          g |d<   |S )NFTr5  r   r6  r7  r   r   ru   r   r   r   r8  r;  zInvalid specifier listr~   r   r   )rJ   ru   rM   r   r<  r   r=  r   r   rL   r@  r   r   rA  rB  rK   r>   rD   rd   )r   r   r%  saw_alignmentrC  rO   s         r   _parse_specifier_qualifier_listz'CParser._parse_specifier_qualifier_list  s   M	**,,C{x:%%&"&//#"6"6K66$99;;[QU 7   !%x9$$););x)G)G&"&//#"6"6K66$6688& 7    x?**&"&//#"6"6K66$--/// 7   x,,,&"&//#"6"6Kmmoo66(#)DOOC<P<PQQQ	 7    x8## &"&//#"6"6Kmmoo66(#)DOOC<P<PQQQ	 7    x...&"&//#"6"6K66$??AA6RV 7    x6!!&"&//#"6"6K66$4466t 7    <6	8JKKK 	J 	J;[III88I& DO88J'!Dr    c                     g }|                                  t          v rG|                    |                                 j                   |                                  t          v G|S rX   )r   r   rY   r   rL   )r   r   s     r   _parse_type_qualifier_listz"CParser._parse_type_qualifier_list  sU    oo?22LL./// oo?22r    c                    |                      d          }|                      d           |                                 rQ|                                 }|                      d           t          j        ||                     |                    S |                                 }|                      d           t          j        ||                     |                    S )Nr5  r   r   )r   r   r  r   AlignasrM   _parse_constant_expression)r   rO   r   exprs       r   r<  z"CParser._parse_alignment_specifier  s    ll:&&X##%% 	<''))CLL"""=dooc&:&:;;;..00X}T4??3#7#7888r    c                     |                      d           |                      d           |                                 }|                      d           |j                            d           |S )Nr7  r   r   _Atomic)r   r  r   rY   )r   r   s     r   r=  zCParser._parse_atomic_specifier  sd    YX##%%X	###
r    r  c                     ||gn|                      |          g}|                     d          r>|                    |                      |                     |                     d          >|S )Nr0  COMMA)_parse_init_declaratorr   rY   )r   r  r   r   s       r   r#  z#CParser._parse_init_declarator_list  s    
   GG--g->>? 	 ll7## 	GLL44W4EEFFF ll7## 	Gr    c                     |r|                                  n|                                 }d }|                     d          r|                                 }t	          ||d           S )Nr  r   )r   _parse_declaratorr   r"  r?   )r   r   rr   r   s       r   rQ  zCParser._parse_init_declarator'  sh    .5St((***4;Q;Q;S;S<<!! 	-**,,DD$7777r    c                    |                                  }|                     |j                  }|                                 dv r|                                  }|                                 dk    r|                                   |                     d          r& ||j        g |                     |                    S |                                 }|                     d            ||j        ||                     |                    S  ||j        d |                     |                    S |                                 dk    r|                                  }|                     d          r! |d g |                     |                    S |                                 }|                     d            |d ||                     |                    S |                     d|                     |                     d S )N>   r   r   r  RBRACE)r`   r   rU   z Invalid struct/union declaration)	r   r   rL   r   r   rM   _parse_struct_declaration_listr   rK   )r   rO   klassname_tokr   	brace_toks         r   rA  z(CParser._parse_struct_or_union_specifier3  s   mmoo//	::?? 000}}H  H,,<<))  5%^2T__X=V=V    ;;==X&&&u!uDOOH<U<U    5^4tx7P7P    ??((I||H%% Tu$b	8R8RSSSS7799ELL"""5d%ty7Q7QRRRR<dooc>R>RSSSSSr    c                     g }|                                  dvrB|                                 }|-|                    |           |                                  dvB|S N>   NrU  )r   _parse_struct_declarationr  )r   r   itemss      r   rV  z&CParser._parse_struct_declaration_listT  sg    oo'7772244E}LL	 oo'777
 r    c                    |                                  dk    r|                                  d S |                                  dv r|                                 gS |                                 }d|                    dg           vsJ d }|                                 s|                                  dk    r|                                 }|,|                     d           |                     ||          S t          |d                   dk    r||d         d	         }t          |t          j                  r|}nt          j        |          }|                     d           |                     |t          |d d 
          g          S |                     d           |                     |t          d d d 
          g          S )Nr  r  r   r   COLONr   r   ru   r   r   r   )r   r   r  rF  rd   r   _parse_struct_declarator_listr   r   r]   rv   r   Noder   r?   )r   r   r   node	decl_types        r   r\  z!CParser._parse_struct_declaration`  s   ??&&MMOOO4?? 7772244553355B 7 77777""$$ 	9(9(9W(D(D6688ELL   ++U+CCCtF|!!<?D$
++ 7 		!066	LL   ++$ID$"O"O"O!P ,    	V''d4FFFG ( 
 
 	
r    c                     |                                  g}|                     d          r<|                    |                                             |                     d          <|S NrP  )_parse_struct_declaratorr   rY   r,  s     r   ra  z%CParser._parse_struct_declarator_list  sc    ..001ll7## 	:LL6688999 ll7## 	:r    c                    |                      d          r/|                                 }t          j        d d d d           d |dS |                                 }|                      d          r|                                 }|d |dS |d d dS )Nr_  r   )r   rK  r   rw   rS  )r   r   rr   s      r   rg  z CParser._parse_struct_declarator  s    <<   	5577GtT4>>"   %%''<<   	D5577G $7CCCdt<<<r    c                    |                      d          }|                                 dv r|                                 }|                                 dk    rk|                                  |                                 }|                      d           t	          j        |j        ||                     |                    S t	          j        |j        d |                     |                    S |                      d           |                                 }|                      d           t	          j        d ||                     |                    S )Nr;  >   r   r   r  rU  )r   r   r   _parse_enumerator_listr   r   rL   rM   )r   rO   rX  enumss       r   rB  zCParser._parse_enum_specifier  s   ll6""?? 000}}H  H,,3355X&&&z(.%9M9MNNN:hndDOOC4H4HIIIX++--Xz$ts';';<<<r    c                 F   |                                  }t          j        |g|j                  }|                     d          r\|                                 dk    rnC|                                  }|j                            |           |                     d          \|S )NrP  rU  )_parse_enumeratorr   EnumeratorListrU   r   r   enumeratorsrY   )r   enum	enum_lists      r   rj  zCParser._parse_enumerator_list  s    %%''($<<	ll7## 	/  H,,))++D!((...	 ll7## 	/
 r    c                 $   |                      d          }|                     d          r|                                 }nd }t          j        |j        ||                     |                    }|                     |j        |j	                   |S )Nr   r  )
r   r   rK  r   
EnumeratorrL   rM   rh   r`   rU   )r   rX  rL   rp  s       r   rm  zCParser._parse_enumerator  s    <<%%<<!! 	3355EEEtx7P7PQQTY
333r    c                 B    |                      dd          \  }}|J |S )NFr   r   )r   )r   rr   r'  s      r   rS  zCParser._parse_declarator  s8    ,, 5 - 
 
a r    c                 0    |                      dd          S )Nr   Tr   allow_paren_parse_declarator_kindrZ   s    r   r   zCParser._parse_id_declarator  s    **$*GGGr    c                 0    |                      dd          S )NtypeidTrw  ry  rZ   s    r   r   z CParser._parse_typeid_declarator  s    **d*KKKr    c                 0    |                      dd          S )Nr|  Frw  ry  rZ   s    r   r   z(CParser._parse_typeid_noparen_declarator  s    **e*LLLr    rx  c                     d }|                                  dk    r|                                 }|                     ||          }||                     ||          S |S )Nr   rx  )r   _parse_pointer_parse_direct_declaratorr{   )r   r   rx  ptrdirects        r   rz  zCParser._parse_declarator_kind  se    ??''%%''C..t.MM?))&#666r    c           	      x   |rB|                      d          r-|                     |d          }|                     d           nb|dk    r|                     d          }n|                     d          }t          j        |j        d d d |                     |                    }|                     |          S )	Nr   Tr  r   r   r   r   r   )r   rz  r   r   rw   rL   rM   _parse_decl_suffixes)r   r   rx  rr   rX  s        r   r  z CParser._parse_direct_declarator  s      	4<<11 	..t.FFDLL""""t||<<--<<11>!ooh//  D ((...r    c                    	 |                                  dk    r*|                     ||                     |                    }C|                                  dk    r,|                     |          }|                     ||          }	 |S )zAParse a chain of array/function suffixes and attach them to decl.Tr   r   )r   r{   _parse_array_decl_parse_function_decl)r   rr   r$  s      r   r  zCParser._parse_decl_suffixes  s    	  J..--dD4J4J44P4PQQ  H,,0066--dD99r    	base_declc                 :    |                      d |j                  S N)	base_typerU   )_parse_array_decl_commonrU   )r   r  s     r   r  zCParser._parse_array_decl	  s    ,,t9?,SSSr    r  c                    |                      d          }|                     |          fd}|                     d          rOdg|                                 pg z   }|                                 }|                      d            |||          S |                                 t          v r|                                 pg }|                     d          r;|dgz   }|                                 }|                      d            |||          S |                     d          }|rN|                      d           t          j        |j	        |                     |                    } |||          S d}| 
                                r|                                 }|                      d            |||          S |                     d          }|rN|                      d           t          j        |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                 4    t          j        | |          S )N)ru   dim	dim_qualsrU   )r   	ArrayDecl)r  r  r  rU   s     r   make_array_declz9CParser._parse_array_decl_common.<locals>.make_array_decl  s%    ?C9E   r    STATICstaticRBRACKETr   )r   rM   r   rH  _parse_assignment_expressionr   r   r   r   rL   r   )r   r  rU   
lbrack_tokr  r  r  	times_toks    ``     r   r  z CParser._parse_array_decl_common  s    \\*--
=OOJ//E	 	 	 	 	 	
 <<!! 	3!
d&E&E&G&G&M2NI3355CLL$$$"?3	222??//7799?RI||H%% 7%
2	7799Z(((&sI666W--I 7Z(((hy	0J0JKK&sI666C&&(( :7799LL$$$"?3	222LL))	 	,LL$$$(9?DOOI,F,FGGC"?3+++""$$ 	63355CZ   sB'''r    c                 *   |                      d           |                     d          rd }nQ|                                 r|                                 n|                                 }|                      d           t          j        |d |j                  }|                                 dk    r`|j	        Y|j	        j
        D ]L}t          |t
          j                  r n/t          |dd           }|r|                     ||j                   M|S )Nr   r   argsru   rU   r  r`   )r   r   r   _parse_parameter_type_list_parse_identifier_list_optr   r   rU   r   r  paramsrv   EllipsisParamgetattrrh   )r   r  r  r$  paramr`   s         r   r  zCParser._parse_function_declF  s   X<<!! 	#DD ++--7//1114466 
 LL"""~4d)/JJJ??((y$!Y- @ @E!%)<== "5&$77D @,,T5;???r    c                 0   g }|                      d          }|rW|                                 pg }|                    ||                     |          f           |                      d          }|W|sd S d }|D ]\  }}t	          j        |||          }|S )Nr   )r   ru   rU   )r   rH  rY   rM   r   PtrDecl)r   starsr  r   r  rU   s         r   r  zCParser._parse_pointer`  s    LL))	 	.3355;ELL%!;!;<===W--I  	.
  	4! 	D 	DLE5-e#UCCCCC
r    c                 ^   |                                  }|                                 dk    r|                     d          dk    rg|                                  |                                 }|j                            t          j        |                     |                               |S NrP  r   ELLIPSIS)_parse_parameter_listr   r   r  rY   r   r  rM   )r   r  ell_toks      r   r  z"CParser._parse_parameter_type_listq  s    ++--??''DOOA,>,>*,L,LMMOOOmmooGM  !4T__W5M5M!N!NOOOr    c                    |                                  }t          j        |g|j                  }|                                 dk    r|                     d          dk    rq|                                  |j                            |                                             |                                 dk    r|                     d          dk    q|S r  )_parse_parameter_declarationr   	ParamListrU   r   r   r  rY   r   r  r  s      r   r  zCParser._parse_parameter_listz  s    1133%%+66oo7**tq/A/AZ/O/OMMOOOM  !B!B!D!DEEE oo7**tq/A/AZ/O/O r    c                    |                      d          \  }}}|d         st          j        dg|          g|d<   |                                 ra|                     dd          \  }}|r.|                     |t          |d d           g          d	         S |                     |||          S |                                 }|                     |||          S )
NTr  ru   r'   r   ru  r   r`  r   )	r  r   r   r   r   r   r?   _build_parameter_declarationr   )r   r   r'  r&  rr   is_nameds         r   r  z$CParser._parse_parameter_declaration  s   "@@t@TTaF| 	M!0%
KKKLDL""$$ 	M!77#d 8  ND(  //d4&N&N&N%O 0    44T4LLL224400tZHHHr    r&  c                    t          |d                   dk    r~t          |d         d         j                  dk    rZ|                     |d         d         j        d                   r.|                     |t	          |d d           g          d         S t          j        d|d         d |pt          j        d d d d           |	          }|                     ||d                   S )
Nru   r   rb   r   r   r`  r-   r   r`   r   r   ru   rU   )	r]   r   rm   r   r?   r   Typenamerw   r   )r   r   rr   r&  s       r   r  z$CParser._build_parameter_declaration  s     V!!DL$*++q00&&tF|B'7'=a'@AA 1 ++$DtT"J"J"J!K ,    ~v,?dD$??
 
 
 ''d6l;;;r    c                 ^    |                                  dk    rd S |                                 S Nr   )r   _parse_identifier_listrZ   s    r   r  z"CParser._parse_identifier_list_opt  s.    ??((4**,,,r    c                    |                                  }t          j        |g|j                  }|                     d          rA|j                            |                                             |                     d          A|S rf  )_parse_identifierr   r  rU   r   r  rY   r  s      r   r  zCParser._parse_identifier_list  sy    &&((%%+66ll7## 	;M  !7!7!9!9::: ll7## 	;r    c                    |                                  }|                                 }d }||j        }n|d         r|d         d         j        }t          j        d|d         d d          d |pt          j        d d d d           |          }t          t          j        |                     ||d                             S )Nru   r   r-   r   r  )rF  r   rU   r   r  rw   r   r   )r   r   rr   rU   r|   s        r   r  zCParser._parse_type_name  s    33552244JEE&\ 	*LO)E>v,qqq/?dD$??
 
 
 END$<$<XtF|$T$TUUUr    c                 b   |                                  dk    rn|                                 }|                                 r|                                 }nt	          j        d d d d           }|J |                     ||          S |                                 r|                                 S d S )Nr   )r   r  r   !_parse_direct_abstract_declaratorr   rw   r{   )r   r  rr   s      r   r   z&CParser._parse_abstract_declarator_opt  s    ??''%%''C6688 >==??~dD$==???))$4442244 	<99;;;tr    c           	      z   |                      d          }|r|                                 s|                                 dk    ri|                                 }|                     d           t          j        |t          j        d d d d           |                     |                    }n{| 	                                }|                     d           |J nM|                                 dk    r| 
                                }n |                     d| j        j                   |                     |          S )Nr   r   r  r   zInvalid abstract declarator)r   r   r   _parse_parameter_type_list_optr   r   r   rw   rM   r   _parse_abstract_array_baserK   r>   rD   r  )r   r  r  rr   s       r   r  z)CParser._parse_direct_abstract_declarator  s0   \\(++
 	Q'')) (T__->->(-J-J<<>>X&&&~dD$??//*55   ::<<X&&&''''__*,,2244DD;TY=OPPP((...r    c                 ^    |                                  dk    rd S |                                 S r  )r   r  rZ   s    r   r  z&CParser._parse_parameter_type_list_opt  s.    ??((4..000r    c                 Z    |                      t          j        d d d d           d           S r  )r  r   rw   rZ   s    r   r  z"CParser._parse_abstract_array_base  s4    ,,nT4t<<D - 
 
 	
r    c                    |                                  }|xxdk    rn	xdk    rn n  |                                 S xdk    r.|                      d          dk    r |                                 S xdk    r |                                 S xxdk    rn	xdk    rn n  |                                 S xxd	k    rnxd
k    rn	xdk    rn n  |                                 S xxdk    rnxdk    rnxdk    rn	xdk    rn n  |                                 S xxdk    rn	x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   s     r   _parse_statementzCParser._parse_statement  s   ??$$#)))))))))44666++w6664466655777 66888'44444%%%%%%%%%668889'''''JJJJJ11333'iiiiiiiii55777!!!0022277999r    c                     |                                  dv rM|                                 }|                                 }t          j        ||gz   |d         j                  S |                                 S )Nr  r   block_itemsrU   )r   _parse_pppragma_directive_listr  r   CompoundrU   )r   pragmasstmts      r   _parse_pragmacomp_or_statementz&CParser._parse_pragmacomp_or_statement$  so    ?? 77799;;G((**D>g.>gajFVWWWW$$&&&r    c                 z    |                                  r|                                 S |                                 S rX   )r   r-  r  rZ   s    r   _parse_block_itemzCParser._parse_block_item,  s:    ##%% 	-**,,,$$&&&r    c                    g }|                                  dvrr|                                 }t          |t                    r|d gk    rG|                    |           n|                    |           |                                  dvr|S r[  )r   r  rv   listr  rY   )r   r]  items      r   _parse_block_item_listzCParser._parse_block_item_list2  s    oo'777))++D$%% #D6>>T""""T""" oo'777 r    c                 L   |                      d          }|                     d          r)t          j        d |                     |                    S |                                 }|                      d           t          j        ||                     |                    S )Nr  rU  r  )r   r   r   r  rM   r  )r   
lbrace_tokr  s      r   r  z!CParser._parse_compound_statement?  s    \\(++
<<!! 	W>d$//*:U:UVVVV1133X~#4??:+F+F
 
 
 	
r    c                    |                                  }|xdk    r |                                 }|                     d           |                                 r|                                 }n't          j        |                     |                    }t          j        |j	        ||                     |                    S xdk    r |                                 }| 
                                }|                     d           |                                 r|                                 }n't          j        |                     |                    }t          j        ||g|                     |                    S dk    r|                                 }|                     d           |                                 r|                                 }n't          j        |                     |                    }t          j        |g|                     |                    S 	 |                     d| j        j                   d S )Nr   r_  r  r  zInvalid labeled statement)r   r   r   r   r  r   EmptyStatementrM   LabelrL   rK  CaseDefaultrK   r>   rD   )r   r   rX  r  case_tokrL  def_toks          r   r  z CParser._parse_labeled_statementL  s   ??$$==??W%%%))++ K>>@@DD /0I0IJJD{8>49R9RSSS==??6688W%%%))++ K>>@@DD /0I0IJJDz$0I0IJJJ--//W%%%))++ J>>@@DD /0H0HIID}dVT__W-E-EFFF!!"=ty?QRRRRRr    c           	      T   |                                  }|j        xdk    r |                     d           |                                 }|                     d           |                                 }|                     d          r>|                                 }t          j        ||||                     |                    S t          j        ||d |                     |                    S dk    r|                     d           |                                 }|                     d           |                                 }t          t          j
        |||                     |                              S 	 |                     d|                     |                     d S )Nr  r   r   ELSEr  zInvalid selection statement)r   ru   r   _parse_expressionr  r   r   IfrM   r   SwitchrK   )r   rO   cond	then_stmt	else_stmtrL  r  s          r   r  z"CParser._parse_selection_statementm  ss   mmoohX&&&--//X&&& ??AA	<<'' V $ C C E EI 8D)YPS@T@TUUUxits7K7KLLLX&&&--//X&&&::<<'T4QTAUAU(V(VWWW!!"?QTAUAUVVVVVr    c           	      V   |                                  }|j        xdk    r| |                     d           |                                 }|                     d           |                                 }t          j        |||                     |                    S xdk    r |                                 }|                     d           |                     d           |                                 }|                     d           |                     d           t          j        |||                     |                    S dk    r|                     d           | 	                                r| 
                                }t          j        ||                     |                    }|                                 }|                     d           |                                 }|                     d           |                                 }t          j        |||||                     |                    S |                                 }|                     d           |                                 }|                     d           |                                 }|                     d           |                                 }t          j        |||||                     |                    S 	 |                     d|                     |                     d S )Nr  r   r   r  r  r  zInvalid iteration statement)r   ru   r   r  r  r   WhilerM   DoWhiler   r-  DeclList_parse_expression_optForrK   )r   rO   r  r  r   r   	next_exprs          r   r  z"CParser._parse_iteration_statement  s   mmoohX&&&--//X&&&::<<{4ts/C/CDDD::<<W%%%X&&&--//X&&&V$$$}T41E1EFFFX&&&++-- X 3355E >%1E1EFFD5577DLL((( $ : : < <ILL***>>@@D 9T4D$//RUBVBVWWW1133V$$$1133V$$$ 6688	X&&&::<<ytYdooc>R>RSSS!!"?QTAUAUVVVVVr    c                 |   |                                  }|j        xdk    rX |                     d          }|                     d           t          j        |j        |                     |                    S xdk    r= |                     d           t          j        |                     |                    S xdk    r= |                     d           t          j        |                     |                    S dk    r| 	                    d          r(t          j
        d |                     |                    S |                                 }|                     d           t          j
        ||                     |                    S 	 |                     d|                     |                     d S )Nr  r   r  r  r  r  zInvalid jump statement)r   ru   r   r   GotorL   rM   BreakContinuer   Returnr  rK   )r   rO   rX  rL  s       r   r  zCParser._parse_jump_statement  s{   mmooh<<--V$$$z(.$//#2F2FGGGV$$${4??3#7#7888V$$$~dooc&:&:;;;<<'' D <dooc.B.BCCC--//V$$$|D$//#*>*>???!!":DOOC<P<PQQQQQr    c                     |                                  }|                     d          }|'t          j        |                     |                    S |S r*  )r  r   r   r  rM   )r   rL  semi_toks      r   r  z#CParser._parse_expression_statement  sK    ))++<<''<'(A(ABBBr    c                 V    |                                  r|                                 S d S rX   )r   r  rZ   s    r   r  zCParser._parse_expression_opt  s-    ""$$ 	,))+++tr    c                 Z   |                                  }|                     d          s|S ||                                  g}|                     d          r<|                    |                                             |                     d          <t          j        ||j                  S rf  r  r   rY   r   ExprListrU   r   rL  exprss      r   r  zCParser._parse_expression  s    0022||G$$ 	Kt88::;ll7## 	>LL::<<=== ll7## 	>~eTZ000r    c                    |                                  dk    rX|                      d          dk    r?|                                  |                                 }|                     d           |S |                                 }|                                 rI|                                 j        }|                                 }t          j	        ||||j
                  S |S )Nr   r   r  r   )r   r   r  r   _parse_conditional_expressionr  rL   r  r   
AssignmentrU   )r   comprL  oprhss        r   r  z$CParser._parse_assignment_expression  s    ??((T__Q-?-?8-K-KMMOOO1133DLL"""K1133!!## 	?&B3355C#Bc4:>>>r    c                 
   |                                  }|                     d          rY|                                 }|                     d           |                                 }t          j        ||||j                  S |S )NCONDOPr_  )_parse_binary_expressionr   r  r   r  r   	TernaryOprU   )r   rL  iftrueiffalses       r   r  z%CParser._parse_conditional_expression  sy    ,,..<<!! 	F++--FLL!!!88::G?4$*EEEr    r   min_preclhsc                    ||                                  }	 |                                 }||j        t          vrnt          |j                 }||k     rn|j        }|                                  |                                  }	 |                                 }||j        t          vrn1t          |j                 }||k    r|                     ||          }nnVt          j        ||||j	                  }|S rX   )
_parse_cast_expressionrJ   ru   _BINARY_PRECEDENCErL   r   r  r   BinaryOprU   )	r   r  r  rO   precr  r  next_tok	next_precs	            r   r  z CParser._parse_binary_expression  s    ;--//C	:**,,C{ch.@@@%ch/DhBMMOOO--//C::<<#x}<N'N'N.x}=	t##77	3GGCC .S#sy99C-	:0 
r    c                 8   |                                  }|q|\  }}}|                                 dk    r|                     |           n=|                                 }t	          j        |||                     |                    S |                                 S )Nr  )r  r   r   r  r   CastrM   _parse_unary_expression)r   resultr   r   r  rL  s         r   r  zCParser._parse_cast_expression  s    0022$*!Cz  H,, D!!!!2244z#tT__Z-H-HIII++---r    c                    |                                  }|dv rH|                                 }|                                 }t          j        |j        ||j                  S |dv rH|                                 }|                                 }t          j        |j        ||j                  S |dk    r|                                 }|                                 }|4|\  }}}t          j        |j        || 	                    |                    S |                                 }t          j        |j        || 	                    |                    S |dk    r|                                 }| 
                    d           |                                 }| 
                    d           t          j        |j        || 	                    |                    S |                                 S )N   PLUSPLUS
MINUSMINUS>   ANDNOTLNOTPLUSMINUSr   SIZEOF_ALIGNOFr   r   )r   r   r  r   UnaryOprL   rU   r  r  rM   r   r  _parse_postfix_expression)r   r   rO   rL  r  r   r'  s          r   r  zCParser._parse_unary_expression4  s   ??$$111--//C//11D=D$*===GGG--//C..00D=D$*===x--//C4466F!"	Q}SYT__S5I5IJJJ//11D=D$//#2F2FGGGz!!--//CLL"""''))CLL"""=C1E1EFFF--///r    c                 H   |                                  }||\  }}}|                     d          rS|                                 }|                     d           |                     d           t	          j        ||          S |                     |           |                                 }	 |                     d          rE|                                 }|                     d           t	          j	        |||j
                  }[|                     d          rt|                                 dk    r|                                  d }n)|                                 }|                     d           t	          j        |||j
                  }|                                 d	v r|                                 }	|                                 }
|
j        d
vr)|                     d|                     |
                     t	          j        |
j        |                     |
                    }t	          j        ||	j        ||j
                  }|                                 dv r9|                                 }t	          j        d|j        z   ||j
                  }	 |S )Nr  rP  rU  Tr   r  r   r   >   ARROWPERIOD>   r   r   zInvalid struct referencer!  p)r  r   _parse_initializer_listr   r   CompoundLiteralr   _parse_primary_expressionr  ArrayRefrU   r   r   _parse_argument_expression_listFuncCallru   rK   rM   r   rL   	StructRefr+  )r   r  r   r   r'  r   rL  subr  op_tokrX  fieldrO   s                r   r,  z!CParser._parse_postfix_expressionT  s^   0022!LCq ||H%% "3355W%%%X&&&,S$777D!!!--//	||J'' ,,..Z(((~dC<<||H%% ??$$00MMOOODD??AADLL***~dD$*==  $777==??=(888%%2DOOH4M4M   1J1JKKtV\5$*MM  $>>>mmoo}S39_dDJGGr    c                    |                                  }|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    r| 
                                }|                     d           |                                 }|                     d           |                                 }|                     d           |                     |          }t!          j        t!          j        |j        |          t!          j        ||g|          |          S |                     d| j        j                   d S )Nr   r   r   OFFSETOFrP  zInvalid expression)r   r  
_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_designatorrM   r   r6  r   rL   r  rK   r>   rD   )r   r   rL  off_tokr   
designatorrU   s          r   r3  z!CParser._parse_primary_expression  s   ??$$t))+++
""<'';&&'')))&&55777}$$66888xMMOOO))++DLL"""Kz!!mmooGLL"""''))CLL!!!??AAJLL"""OOG,,E>..Z0%88   	.	0BCCCCCr    c                 r   |                                  }	 |                     d          r1|                                  }t          j        |d||j                  }G|                     d          rE|                                 }|                     d           t          j        |||j                  }	 |S )NTr/  .r   r  )_parse_identifier_or_typeidr   r   r7  rU   r  r   r4  )r   rc  r:  rL  s       r   rE  z)CParser._parse_offsetof_member_designator  s    //11
	||H%% 88::tS%DD||J'' --//Z(((~dD$*==r    c                    |                                  }|g}|                     d          r<|                    |                                             |                     d          <t          j        ||j                  S rf  r  r  s      r   r5  z'CParser._parse_argument_expression_list  sv    0022ll7## 	>LL::<<=== ll7## 	>~eTZ000r    c                 *    |                                  S rX   )r  rZ   s    r   rK  z"CParser._parse_constant_expression  s    11333r    c                     |                      d          }t          j        |j        |                     |                    S )Nr   )r   r   r   rL   rM   r   s     r   r  zCParser._parse_identifier  s3    ll4  x	4??3#7#7888r    c                     |                                  }|j        dvr)|                     d|                     |                     t	          j        |j        |                     |                    S )N>   r   r   zExpected identifier)r   ru   rK   rM   r   r   rL   r   s     r   rJ  z#CParser._parse_identifier_or_typeid  s`    mmoo8+++3T__S5I5IJJJx	4??3#7#7888r    c                    |                                  }|j        t          v rd}d}|j        dd          D ]}|dv r|dz  }|dv r|dz  }|dk    rt	          d          |dk    rt	          d          d	|z  d
|z  z   }t          j        |dz   |j        |                     |                    S |j        t          v rT|j        d         dv rd}n|j        d         dv rd}nd}t          j        ||j        |                     |                    S |j        t          v r.t          j        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'   rb   )fFfloatzlong doubledoublecharzInvalid constant)r   ru   r=  rL   
ValueErrorr   ConstantrM   r>  r?  rK   )r   rO   u_countl_countchprefixr   s          r   r@  zCParser._parse_constant  s   mmoo8z!!GGin ! !##qLGG:%%qLG{{ !QRRR{{ !QRRR 7*Ww->>F>&5.#)T__S=Q=QRRR8|##y}
**2*,,!>!SY0D0DEEE8{"">&#)T__S5I5IJJJ,dooc.B.BCCCCCr    c                 \   |                      d          }t          j        d|j        |                     |                    }|                                 dk    rP|                                 }|j        d d         |j        dd          z   |_        |                                 dk    P|S )NSTRING_LITERALstringrb   r   )r   r   r[  rL   rM   r   r   r   rO   rc  tok2s       r   rB  z%CParser._parse_unified_string_literal  s    ll+,,~h	4??33G3GHHoo#333==??DCRC4:abb>9DJ oo#333 r    c                    |                                  }|j        t          vr)|                     d|                     |                     t          j        d|j        |                     |                    }|                                 t          v re|                                  }|j        	                                d d         |j        dd          z   |_        |                                 t          v e|S )NzInvalid string literalrb  rb   r   )
r   ru   rC  rK   rM   r   r[  rL   r   rstriprc  s       r   rD  z&CParser._parse_unified_wstring_literal  s    mmoo8=((68L8LMMM~h	4??33G3GHHoo=00==??D**,,SbS1DJqrrNBDJ oo=00 r    c                 R   |                      d          }|r}|                      d          r(t          j        g |                     |                    S |                                 }|                      d           |                     d           |S |                                 S )Nr  rU  rP  )r   r   InitListrM   r1  r   r  )r   r  	init_lists      r   r"  zCParser._parse_initializer  s    \\(++
 	||H%% G~b$//**E*EFFF4466ILL!!!LL"""00222r    c                 @   |                                  g}|                     d          rU|                                 dk    rn<|                    |                                             |                     d          Ut	          j        ||d         j                  S )NrP  rU  r   )_parse_initializer_itemr   r   rY   r   rh  rU   )r   r]  s     r   r1  zCParser._parse_initializer_list  s    --//0ll7## 	9  H,,LL5577888 ll7## 	9 ~eU1X^444r    c                     d }|                                  dv r|                                 }|                                 }|t          j        ||          S |S N>   r/  r   )r   _parse_designationr"  r   NamedInitializer)r   designationr   s      r   rk  zCParser._parse_initializer_item%  s]    ?? 6661133K&&((")+t<<<r    c                 X    |                                  }|                     d           |S )Nr  )_parse_designator_listr   r   designatorss     r   rn  zCParser._parse_designation/  s+    1133Xr    c                     g }|                                  dv r=|                    |                                            |                                  dv =|S rm  )r   rY   _parse_designatorrs  s     r   rr  zCParser._parse_designator_list5  s[    oo#999t5577888 oo#999r    c                    |                      d          r+|                                 }|                     d           |S |                      d          r|                                 S |                     d| j        j                   d S )Nr   r  r/  zInvalid designator)r   rK  r   rJ  rK   r>   rD   )r   rL  s     r   rv  zCParser._parse_designator=  s    <<
## 	2244DLL$$$K<<!! 	633555.	0BCCCCCr    c                     |                      d          }|                     d|                     |                     d S )Nr  zDirectives not supported yet)r   rK   rM   r   s     r   r  zCParser._parse_pp_directiveJ  s<    ll8$$8$//#:N:NOOOOOr    c                    |                                  dk    r|                                 }|                                  dk    rA|                                 }t          j        |j        |                     |                    S t          j        d|                     |                    S |                                  dk    rz|                                 }|                     d          }|                                 }|                     d           t          j        ||                     |                    S |                     d| j	        j
                   d S )Nr  PPPRAGMASTRr-   r  r   r   zInvalid pragma)r   r   r   PragmarL   rM   r   rB  rK   r>   rD   )r   rO   str_toklparenliterals        r   r  z!CParser._parse_pppragma_directiveP  s   ??
**--//C  M11--//|GM4??73K3KLLL<DOOC$8$8999??	))--//C\\(++F88::GLL"""<)@)@AAA*DI,>?????r    c                     g }|                                  dv r=|                    |                                            |                                  dv =|S )Nr  )r   rY   r  )r   r  s     r   r  z&CParser._parse_pppragma_directive_listb  sX    oo#:::NN499;;<<< oo#:::r    c                 R   |                      d          }|                      d           |                                 }d }|                     d          r|                                 }|                      d           t	          j        |||                     |                    gS )Nr  r   rP  r   )r   rK  r   rB  r   StaticAssertrM   )r   rO   r  rT   s       r   r  zCParser._parse_static_asserti  s    ll+,,X..00<<   	74466CX"4dooc.B.BCCDDr    )r-   FrX   )r   N)Fr   )FF)r   r   r   )r   r   )T)r   N)r!   r"   r#   r$   r   boolru   r%   rC   r   r	  rP   r'   r	   r   rS   r   rK   r[   r_   rf   rh   rm   r:   r;   r<   r=   r   rb  r{   r   r   r  r   r   r   r   r   r   r   rJ   r   r   r   r   r   r   rM   r   r   r   r   r
   r   r   r   r   r  r  rI   r
  r  r-  r+  r   r!  r  rF  rH  r<  r=  r#  rQ  rA  rV  r\  ra  rg  rB  rj  rm  rS  r   r   r   rz  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r,  r3  rE  r5  rK  r  rJ  r@  rB  rD  r"  r1  rk  rn  rr  rv  r  r  r  r  r(   r    r   r,   r,   2   s       	 	 "$("* = == F|= 	=
 = = = = 
= = = =: <A #&48	   8J JS J(3- J5 J J J J, ,ECK$,> ,8 , , , ,) ) ) )       +c +(5/ +d + + + +	,C 	, 	,D 	, 	, 	, 	,c d    :3 :c :3 :4 : : : :      ,# ,$ , , , ,Tc S UZ    X&j5=(5>9& s)& 
em	#en	4	& & & &Z  ;'  	
  
   4 #(	e ee K e  	e
 
ej	e e e eN

 j
 d5:./	

 j
 

 
 
 
*     $ $s $8F#3 $ $ $ $5 5C 5 5 5 5 5
&    	# 	(6*: 	 	 	 	# &    #s # # # #!3 !4 ! ! ! !3f 3 3 3 3 3' 'x'7 '4 ' ' ' '. .hv&6 .$ . . . .)4 ) ) ) ), ,$ ,4 , , , ,#E(3-2E,F # # # # NS "FJ	x
#T)	*   6!E(3-2E,F ! ! ! !F;D ; ; ; ;?4 ? ? ? ?%	%V34	5% % % %6=%- = = = =ej)9    MT%*-= M M M MlD$4    ?$uz"2 ? ? ? ?''+/'	ej	' ' ' 'Tej)9     %*v+ v+!v+	{D(5/1	2v+ v+ v+ v+v` ` ` `FDI    9EJ 9 9 9 9     DI k*<@	k	   8 8d 8{ 8 8 8 8T%* T T T TBUZ0@    
8D4D+E 
 
 
 
DtK/@    = = = =$=uz = = = ="
    5:    5:    Hej H H H HL%* L L L LM%* M M M M3 T ej     .2/ //&*/	/ / / /* 
    T5: T%* T T T T IM7( 7(!%*-7(6>uo7(	7( 7( 7( 7(tej UZ    4 4    "EO    u    Iej I I I I&<<'/
';<IQRW<	< < < <,-HUZ,@ - - - -
    V%. V V V V(0D    $/5: / / / /.10I 1 1 1 1
EJ 
 
 
 
:%*tEJ/?"? : : : :.'
T%*=M0M ' ' ' ''5:UZ0@#@ ' ' ' '
UZ(8 
 
 
 

5: 
 
 
 
S%* S S S SBWEJ W W W W2&WEJ &W &W &W &WTRuz R R R R.UZ    x
';    15: 1 1 1 1ej     uz     >B &.uz&:	   D.
 . . . .*0 0 0 0 0@.5: . . . .d!D5: !D !D !D !DJ5:     1 1 1 1 14EJ 4 4 4 495: 9 9 9 9
9UZ 9 9 9 9D D D D D@uz    
     
3EJ 
3 
3 
3 
35 5 5 5 5    D$4    UZ(8    D5: D D D DPX P P P P@5: @ @ @ @$UZ0@    Ed5:&6 E E E E E Er    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EXTERNr  TYPEDEFREGISTER_THREAD_LOCALINLINE	_NORETURN>   CONSTr7  RESTRICTVOLATILE>   INTCHARLONGVOIDFLOATSHORT_BOOLDOUBLESIGNEDUNSIGNED_COMPLEX__INT128>   r;  r9  r:  r   r7  r5  >   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_CONSTra  >   WSTRING_LITERALU8STRING_LITERALU16STRING_LITERALU32STRING_LITERAL>   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  c                       e Zd ZdZdeddfdZddedee         fdZ	dee         fd	Z
defd
ZdeddfdZdeddfdZdS )rA   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                 0    || _         g | _        d| _        d S )Nr   )_lexer_buffer_index)r   r/   s     r   rC   z_TokenStream.__init__	  s    /1r    r   r   c                 l    |dk    rdS |                      |           | j        | j        |z   dz
           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   s     r   r   z_TokenStream.peek
	  s9     664

1|DK!Oa/00r    c                 t    |                      d           | j        | j                 }| xj        dz  c_        |S )z%Consume a single token and return it.r   r  r   s     r   r   z_TokenStream.next	  s4    

1l4;'q
r    c                     | j         S rX   r  rZ   s    r   r   z_TokenStream.mark"	  s
    {r    r   c                     || _         d S rX   r  r   s     r   r   z_TokenStream.reset%	  s    r    nc                     t          | j                  | j        |z   k     rY| j                                        }| j                            |           |d S t          | j                  | j        |z   k     Wd S d S rX   )r]   r  r  r  r   rY   )r   r  rO   s      r   r  z_TokenStream._fill(	  sy    $,$+/11+##%%CL$$${	 $,$+/111111r    r  )r!   r"   r#   r$   r   rC   r'   r	   r   r   r   r   r   r  r(   r    r   rA   rA     s         
f     

1 
1c 
1(6"2 
1 
1 
1 
1hv&    c    # $    s t      r    rA   c                   ~    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 )r   r   r   ru   r   r   N)r!   r"   r#   r   r   r&   r(   r    r   r   r   6	  s\         
s)OOO#Y
s)OOO3iCyr    r   r   c                   p    e Zd ZU eej                 ed<   eej                 ed<   eej                 ed<   dS )r   rr   r   r   N)r!   r"   r#   r	   r   rb  r&   r(   r    r   r   r   A	  sM         
 5:

5:
ej!!!!!!r    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?  rA  rC  r   r   rA   r   r   r   r(   r    r   <module>r     s   " ! ! ! ! !
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
       # # # # # # # # C C C C C C C C        $	 	 	 	 	 	 	 	 E  E  E  E  E  E  E  EDB  "	1
A 	! 
1	
 
1 	! 	! 	! 	! 	! 	! a a A Q  Q!" a#$ 
1%  * VUUK(>>>       CBB	C      
 01   $$     	
     (. . . . . . . .n    	    JK" " " " "	 " " " " "r    