
    xi^                       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*y=)>    )	dataclass)	AnyDictListLiteralNoReturnOptionalTuple	TypedDictcast   )c_ast)CLexer_Token)fix_switch_casesfix_atomic_specifiersc                   F    e Zd ZU dZeed<   eed<   dZee   ed<   defdZ	y)CoordzkCoordinates of a syntactic element. Consists of:
    - File name
    - Line number
    - Column number
    filelineNcolumnreturnc                 x    | j                    d| j                   }| j                  r|d| j                   z  }|S )N:r   r   r   )selftexts     ^/var/www/html/chatbot/card-advisor-bot/venv/lib/python3.12/site-packages/pycparser/c_parser.py__str__zCoord.__str__'   s;    ))Adii[);;a}%%D    )
__name__
__module____qualname____doc__str__annotations__intr   r	   r    r    r   r   r      s-     I
I FHSM  r    r   c                       e Zd Zy)
ParseErrorN)r!   r"   r#   r(   r    r   r*   r*   .   s    r    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	j8                  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	j8                     fd6Z$d2d,d&e	j8                  d7ee!e	j8                        d8e	j8                  de	j8                  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*d@edee'   fdAZ+d@ede'fdBZ,defdCZ-dDeddfdEZ.dFe'defdGZ/ddFee'   defdHZ0ddFee'   defdIZ1defdJZ2ddKedefdLZ3de4ee   ef   fdMZ5	 ddNedOede4ee	j8                     ef   fdPZ6de4ee   ef   fdQZ7defdRZ8defdSZ9dee4e	j@                  ee'f      fdTZ:de	j                  fdUZ;de!e	j8                     fdVZ<de!e	j8                     fdWZ=de!e	j8                     fdXZ>de!e	j8                     fdYZ?d2d,dZede!e	j8                     fd[Z@de!e	j8                     fd\ZA	 dd]ede4d,eee   f   fd^ZBdd_ZCde!e   fd`ZDde	j8                  fdaZEde	j8                  fdbZF	 ddced4   dKede!d4   fddZGddKedd4fdeZHde	j8                  fdfZIde!e	j8                     fdgZJdee!e	j8                        fdhZKde!d4   fdiZLddjZMde	j8                  fdkZNde	j8                  fdlZOde	j8                  fdmZPde	j8                  fdnZQde	j8                  fdoZRde	j8                  fdpZSde	j8                  fdqZTd.edrede	j8                  fdsZU	 dd.edrede	j8                  fdtZVd&e	j8                  de	j8                  fduZWdve	j8                  de	j8                  fdwZX	 ddxee	j8                     dee   de	j8                  fdyZYdve	j8                  de	j8                  fdzZZdee	j8                     fd{Z[de	j                  fd|Z]de	j                  fd}Z^de	j8                  fd~Z_d2d,d&ee	j8                     dee   de	j8                  fdZ`dee	j8                     fdZade	j8                  fdZbde	j@                  fdZcdee	j8                     fdZdde	j8                  fdZedee	j                     fdZfde	j8                  fdZgde	j8                  e!e	j8                     z  fdZhde	j8                  e!e	j8                     z  fdZide	j8                  e!e	j8                     z  fdZjde!e	j8                     fdZkde	j8                  fdZlde	j8                  fdZmde	j8                  fdZnde	j8                  fdZode	j8                  fdZpde	j8                  fdZqdee	j8                     fdZrde	j8                  fdZsde	j8                  fdZtde	j8                  fdZu	 ddedee	j8                     de	j8                  fdZvde	j8                  fdZwde	j8                  fdZxde	j8                  fdZyde	j8                  fdZzde	j8                  fdZ{de	j8                  fdZ|de	j8                  fdZ}de	j8                  fdZ~de	j8                  fdZde	j8                  fdZde	j8                  fdZde	j8                  fdZde	j8                  fdZde	j8                  fdZde	j8                  fdZde!e	j8                     fdZde!e	j8                     fdZde	j8                  fdZdefdZde	j8                  fdZde!e	j8                     fdZde!e	j8                     fdZy)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                        | _        y )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__>   sR     "++3333!77	
	 59F8%1$))%<r    r   filenamedebugc                 2   t               g| _        | j                  j                  ||       t	        | j                        | _        | j                         }| j                         }|.| j                  d|j                   | 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.
        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   sy     "VH		h'#DII.335jjl?4dooc6JK
r    linenor   c                 F    t        | j                  j                  ||      S )Nr   )r   r>   rD   )r   rQ   r   s      r   _coordzCParser._coordv   s    $)),,6&IIr    msgcoordc                 "    t        | d|       )Nz: )r*   )r   rT   rU   s      r   rK   zCParser._parse_errory   s    E7"SE*++r    c                 J    | j                   j                  t                      y N)r@   appendr?   r   s    r   _push_scopezCParser._push_scope|   s      (r    c                 l    t        | j                        dkD  sJ | j                  j                          y )Nr   )lenr@   poprZ   s    r   
_pop_scopezCParser._pop_scope   s-    4$$%)))r    namec                     | j                   d   j                  |d      s| j                  d|d|       d| j                   d   |<   y)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   sR      $((t44("ST '+"d#r    c                     | j                   d   j                  |d      r| j                  d|d|       d| j                   d   |<   y)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   sT     R $$T51th&ST ',"d#r    c                 f    t        | j                        D ]  }|j                  |      }||c S  y)z.Is *name* a typedef-name in the current scope?F)reversedr@   rd   )r   r`   scopein_scopes       r   _is_type_in_scopezCParser._is_type_in_scope   s;    d//0 	 E yyH#	  r    r   c                 H    | j                  || j                  ||             y rX   )rK   rS   )r   rT   r   r   s       r   r:   zCParser._lex_error_func   s    #t{{489r    c                 $    | j                          y rX   )r[   rZ   s    r   r;   zCParser._lex_on_lbrace_func   s    r    c                 $    | j                          y rX   )r_   rZ   s    r   r<   zCParser._lex_on_rbrace_func   s    r    c                 $    | j                  |      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                 |   |}|}|j                   r|j                   }|j                   rt        |t        j                        r	||_         |S |}t        |j                   t        j                        s1|j                   }t        |j                   t        j                        s1|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    dENN+!%MO
 I @%NN	 !@ "+M*INKr    typenamec                    |}t        |t        j                        s'|j                  }t        |t        j                        s'|j                  |_        |j                  dd |_        |D ]R  }t        |t        j                        rt        |      dkD  r| j                  d|j                         I||_        |c S  |sit        |j                  t        j                        s| j                  d|j                         t        j                  dg|j                        |_        |S t        j                  |D cg c]  }|j                  D ]  }|  c}}|d   j                        |_        |S c c}}w )z#Fixes a declaration. Modifies decl.Nr   z Invalid multiple types specifiedMissing type in declarationr'   rU   r   )rv   r   rw   ru   declnamer`   qualsIdentifierTyper]   rK   rU   FuncDeclnames)r   rr   r|   typtnidr`   s          r   _fix_decl_name_typezCParser._fix_decl_name_type   s1    S%..1((C S%..1 LL	JJqM	  	 Bb%"6"67x=1$%%&H"((S!CHK	  dii8!!"?L++UG4::FCH  ++ (>"RXX>T>>hqkFWFWCH  ?s   ?E7
declspec	_DeclSpecnewspeckind_DeclSpecKindrY   c                     |t        g g g g g       }n|}|r||   j                  |       |S ||   j                  d|       |S )z2See _DeclSpec for the specifier dictionary layout.qualstorageru   function	alignmentr   )r?   rY   insert)r   r   r   r   rY   specs         r   _add_declaration_specifierz"CParser._add_declaration_specifier(  s]     ""rRD DJg&  Ja)r    r   decls	_DeclInfotypedef_namespacec                    d|d   v }g }|d   j                  d      |d   d   t        |d         dk  sBt        |d   d	   j                        d
k7  s$| j                  |d   d	   j                  d         s8d}|d   D ]  }t	        |d      s|j
                  } n | j                  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                        s'|j"                   |d   d	   j                  d   |_        |d   d	= |D ]  }	|	d   J |r1t        j$                  d|d   |d   |	d   |	d   j
                        }
nXt        j&                  d|d   |d   |d   |d   |	d   |	j                  d      |	j                  d      |	d   j
                  	      }
t        |
j                   t        j                  t        j                  t        j                  t        j                  f      r|
}n| j)                  |
|d         }|rO|r'| j+                  |j,                  |j
                         n&| j/                  |j,                  |j
                         t1        t        t        j&                  t        j$                  z  |            }|j3                  |        |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>  sJ    $y/1
 8<<	"*
 Qx'V%)4<+112a711$v,r2B2H2H2KLE!&\ ""1g.$%GGE!" %%&;UC $)>>!&\"-33A6{+v,r*00$a  L$  a U\\5;;8L8LM  $Cq&)9:$\5>>B#/#4#4L %\5>>B((0,0L,<,B,B1,EL)VR( *	,D<+++#mmv, Ofv,,, $jjv,{+ O!*-f&) HHY/v,,,
   U\\5;;8L8LM )
!55k4<P
 !**:??J<L<LM((*:J:JK.UZZ%--/<J 
+U*	,X r    param_declsbodyc                     d|d   v r| j                  d|j                         | 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  sy     Y'/<..Td;<" / 
 	 }}+D


 	
r    tokenc                 L    |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    kc                 8    | j                   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                 D    | j                  |      }||j                  S 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m?sxx44r    c                     | j                   j                         }|'| j                  d| j                  j                         y |S )NzAt end of input)rB   nextrK   r>   rD   r   rO   s     r   _advancezCParser._advance  s9    ll!;/1C1CDJr    
token_typec                 f    | j                         }||j                  |k(  r| j                         S y)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  s.     jjl?sxx:5==?"r    c                     | j                         }|j                  |k7  r.| j                  d|j                   | j	                  |             |S )NrG   )r   ru   rK   rL   rM   r   s      r   _expectzCParser._expect  sB    mmo88z!4dooc6JK
r    c                 6    | j                   j                         S rX   )rB   markrZ   s    r   _markzCParser._mark  s    ||  ""r    r   c                 :    | j                   j                  |       y rX   )rB   resetr   r   s     r   _resetzCParser._reset  s    4 r    rO   c                 N    | j                  |j                  |j                        S rX   )rS   rQ   r   r   s     r   rM   zCParser._tok_coord  s    {{3::szz22r    c                 T    |xs | j                         }|y|j                  t        v S NF)rJ   ru   _DECL_STARTr   s     r   _starts_declarationzCParser._starts_declaration  s)    !TZZ\;xx;&&r    c                 T    |xs | j                         }|y|j                  t        v S r   )rJ   ru   _STARTS_EXPRESSIONr   s     r   _starts_expressionzCParser._starts_expression  s*    !TZZ\;xx---r    c                 Z    | j                         }|y|t        v ry| j                         S )NFT)r   _STARTS_STATEMENTr   r   tok_types     r   _starts_statementzCParser._starts_statement  s2    ??$((&&((r    id_onlyc                 H    | j                         }|y|dv ry|r|dk(  S |dv S )NF>   TIMESLPARENTID>   r   TYPEIDr   )r   r   r   s      r   _starts_declaratorzCParser._starts_declarator  s=    ??$**t##+++r    c                 r    | j                         }| j                         \  }}| j                  |       ||fS rX   )r   _scan_declarator_name_infor   )r   r   r   	saw_parens       r   _peek_declarator_name_infoz"CParser._peek_declarator_name_info  s7    zz|"==?)D""r    allow_abstracttypeid_paren_as_abstractc                    | j                         \  }}|	|rh|dk(  rc|ra|sK| j                         }|| j                  |      n| j                  j                  }| j                  d|       | j                         }|dfS |dk(  r*|r| j                         }|dfS | j                         }|dfS | j                         }|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$h)>9!jjl03,TYYEWEW!!"6>668D; '<<>
 Tz 446 Tz ,,.DTzr    c                    d}| j                  d      rO| j                         t        v r'| j                          | j                         t        v r'| j                  d      rO| j	                         }|d |fS |j
                  dv r| j                          |j
                  |fS |j
                  dk(  rd}| j                          | j                         \  }}|rd}d}	 | j	                         }|d |fS |j
                  dk(  r|dz  }n/|j
                  dk(  r |dz  }| j                          |dk(  r	 ||fS [| j                          kd |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/  sK   	ll7#//#6 //#6 ll7# jjl;?"88''MMO88Y&&88xIMMO%)%D%D%F"Hl 	Ejjl;?*88x'QJEXX)QJEMMOz Y&&   Yr    c                 &    | j                         dv S )N>   r   LBRACKETr   rZ   s    r   "_starts_direct_abstract_declaratorz*CParser._starts_direct_abstract_declaratorR  s     $:::r    c                 R    | j                         }|d uxr |j                  t        v S rX   )rJ   ru   _ASSIGNMENT_OPSr   s     r   _is_assignment_opzCParser._is_assignment_opU  s%    jjl$>388#>>r    c                     | j                         }| j                  d      }|y| j                         s| j                  |       y| j	                         }| j                  d      | j                  |       y|||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  sz     zz|\\(+
'')KK##%<<!)KKD*$$r    c                     | j                         t        j                  g       S t        j                  | j                               S rX   )rJ   r   FileAST_parse_translation_unitrZ   s    r   rI   z(CParser._parse_translation_unit_or_emptyt  s5    ::<==$$}}T99;<<r    c                     g }| j                         0|j                  | j                                | j                         0|S rX   )rJ   extend_parse_external_declaration)r   exts     r   r  zCParser._parse_translation_unitz  s;    jjl&JJt779: jjl&
r    c           	      r   | j                         }|g S |j                  dk(  r| j                          g S |j                  dv r| j                         gS | j	                  d      rg S |j                  dk(  r| j                         S | j                  |      s| j                         }d }| j                         dk7  r| j                  d|j                         t        g g g t        j                  dg|j                        gg 	      }| j                  |||| j                         
      }|gS | j!                  d      \  }}}| j#                         \  }}	|dk7  r%| j%                  ||      }
| j'                  d       |
S | j                         }| j                         dk(  s| j                         rd }| j                         r| j)                         }| j                         dk7  r| j                  d|j                         |d   st        j                  dg|      g|d<   | j                  |||| j                         
      }|gS t        |d d       }| j	                  d      r| j+                         |d<   | j-                  |      }
| j/                  ||
d      }
| j'                  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   jjl;I88x$$&I88..22455<<I88'',,..'', ,,.DK H,!!"?L"**E7$**EFD 22'335	 3 D 6M &*%G%G &H &
"h
 668	133D(CELL L((*??(D,D,D,FK'')"::< H,!!"?L< % 4 4eWJ OPV22'335	 3 D 6M!%4dD!I	<<! $ 7 7 9If00y0A((d%SW(XVr    c                 H    | j                         }| j                  d       |S Nr  )_parse_decl_bodyr   r   r   s     r   _parse_declarationzCParser._parse_declaration  s!    %%'Vr    c                 R    | j                  d      \  }}}| j                  ||      S )NTr  )r  r  )r   r   r!  r#  s       r   r'  zCParser._parse_decl_body  s/     >>T>Rh..tX>>r    r!  c                 &   d }|r!| j                         r5| j                         }n$| j                  d      r| j                  d      }||d   }t        j                  t        j                  t        j
                  f}t        |      dk(  rLt        |d   |      r=t        j                  d |d   |d   |d   |d	   |d   d d |d   j                  
	      g}|S | j                  |t        d d d       gd      }|S | j                  ||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  s3    &&(88:&&t&4888F=fBekk5::>H2w!|
2a5( ;JJ!"6l";/ $Y!%j!1U! $ ekk
0  00TdCD&* 1  	 ,,$ - E r    c                     g }| j                         r0|j                  | j                                | j                         r0|S rX   )r   r	  r)  r(  s     r   r  zCParser._parse_declaration_list  s;    &&(LL0023 &&(r    r  c           	         d}d}d}	 | j                         }|n*|j                  dk(  r7|| j                  |      }| j                  || j	                         dd      }[|j                  dk(  rM| j                  d      d	k(  r9|| j                  |      }| j                  || j                         d
d      }d}|j                  t        v rB|| j                  |      }| j                  || j                         j                  dd      }|j                  t        v rB|| j                  |      }| j                  || j                         j                  dd      }_|j                  t        v rB|| j                  |      }| j                  || j                         j                  dd      }|j                  t        v rk|| j                  |      }| j                         }| j                  |t        j                  |j                  g| j                  |            d
d      }d}0|j                  dk(  rn|rn|| j                  |      }| j                         }| j                  |t        j                  |j                  g| j                  |            d
d      }d}|j                  dv r:|| j                  |      }| j                  || j                         d
d      }d}|j                  dk(  r:|| j                  |      }| j                  || j!                         d
d      }d}>	 |&| j#                  d| j$                  j&                         |s|s| j#                  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{xx:%&"&//#"6K66$99;[QU 7  xx9$);x)G&"&//#"6K66$668& 7   xx?*&"&//#"6K66$--/// 7  xx>)&"&//#"6K66$--///4 7  xx>)&"&//#"6K66$--///D 7  xx,,&"&//#"6Kmmo66((#))DOOC<PQ	 7   xx8#&"&//#"6Kmmo66((#))DOOC<PQ	 7   xx..&"&//#"6K66$??A6RV 7   xx6!&"&//#"6K66$446t 7   <3TYY5G5GH;[IX{**r    c           	         d }d}d}d }	 | j                         }|n|j                  dk(  r9|| j                  |      }| j                  || j	                         dd      }d}]|j                  dk(  rM| j                  d      dk(  r9|| j                  |      }| j                  || j                         d	d      }d}|j                  t        v rB|| j                  |      }| j                  || j                         j                  d
d      }|j                  t        v rk|| j                  |      }| j                         }| j                  |t        j                  |j                  g| j                  |            d	d      }d}|j                  dk(  rn|rn|| j                  |      }| j                         }| j                  |t        j                  |j                  g| j                  |            d	d      }d}|j                  dv r:|| j                  |      }| j                  || j                         d	d      }d}O|j                  dk(  r:|| j                  |      }| j                  || j                         d	d      }d}	 |&| j                  d| j                   j"                         |s|s| j                  d|       |j%                  d      g |d<   |j%                  d      g |d<   |S )NFTr1  r   r2  r3  r   r   ru   r   r   r   >   r4  r5  r6  zInvalid specifier listr~   r   r   )rJ   ru   rM   r   r7  r   r8  r   r   rL   r;  r   r   r<  r=  rK   r>   rD   rd   )r   r   r!  saw_alignmentr>  rO   s         r   _parse_specifier_qualifier_listz'CParser._parse_specifier_qualifier_list  s,   **,C{xx:%&"&//#"6K66$99;[QU 7  !%xx9$);x)G&"&//#"6K66$668& 7   xx?*&"&//#"6K66$--/// 7  xx,,&"&//#"6Kmmo66((#))DOOC<PQ	 7   xx8#&"&//#"6Kmmo66((#))DOOC<PQ	 7   xx..&"&//#"6K66$??A6RV 7   xx6!&"&//#"6K66$446t 7   <6		8J8JK;[I88I& DO88J'!Dr    c                     g }| j                         t        v r@|j                  | j                         j                         | j                         t        v r@|S rX   )r   r   rY   r   rL   )r   r   s     r   _parse_type_qualifier_listz"CParser._parse_type_qualifier_list  sD    oo?2LL../ oo?2r    c                 ~   | j                  d      }| j                  d       | j                         rF| j                         }| j                  d       t        j                  || j                  |            S | j                         }| j                  d       t        j                  || j                  |            S )Nr1  r   r   )r   r   r  r   AlignasrM   _parse_constant_expression)r   rO   r   exprs       r   r7  z"CParser._parse_alignment_specifier  s    ll:&X##%'')CLL"==dooc&:;;..0X}}T4??3#788r    c                     | j                  d       | j                  d       | j                         }| j                  d       |j                  j                  d       |S )Nr3  r   r   _Atomic)r   r  r   rY   )r   r   s     r   r8  zCParser._parse_atomic_specifier  sK    YX##%X		#
r    r  c                     ||gn| j                  |      g}| j                  d      r3|j                  | j                  |             | j                  d      r3|S )Nr,  COMMA)_parse_init_declaratorr   rY   )r   r  r   r   s       r   r  z#CParser._parse_init_declarator_list  se    
   G--g->? 	 ll7#LL44W4EF ll7#r    c                     |r| j                         n| j                         }d }| j                  d      r| j                         }t	        ||d       S )Nr  r   )r   _parse_declaratorr   r  r?   )r   r   rr   r   s       r   rL  zCParser._parse_init_declarator'  sK    .5t((*4;Q;Q;S<<!**,DD$77r    c                 t   | j                         }| j                  |j                        }| j                         dv r| j                         }| j                         dk(  r| j                          | j	                  d      r$ ||j                  g | j                  |            S | j                         }| j                  d        ||j                  || j                  |            S  ||j                  d | j                  |            S | j                         dk(  rv| j                         }| j	                  d      r |d g | j                  |            S | j                         }| j                  d        |d || j                  |            S | j                  d| j                  |             y )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   r<  z(CParser._parse_struct_or_union_specifier3  sm   mmo//		:?? 00}}H H,<<) %^^2T__X=V  ;;=X&!uDOOH<U  ^^4tx7P  ??(I||H%$b	8RSS779ELL"d%ty7QRR<dooc>RSr    c                     g }| j                         dvr7| j                         }|%|j                  |       | j                         dvr7|S N>   NrP  )r   _parse_struct_declarationr	  )r   r   itemss      r   rQ  z&CParser._parse_struct_declaration_listT  sR    oo'77224E}LL	 oo'77
 r    c                    | j                         dk(  r| j                          y | j                         dv r| j                         gS | j                         }d|j	                  dg       vsJ d }| j                         s| j                         dk(  r| j                         }|$| j                  d       | j                  ||      S t        |d         dk(  rk|d   d	   }t        |t        j                        r|}nt        j                  |      }| j                  d       | j                  |t        |d d 
      g      S | j                  d       | j                  |t        d d d 
      g      S )Nr  >   r  r  r   r   COLONr   r   ru   r   r   r   )r   r   r  rA  rd   r   _parse_struct_declarator_listr   r   r]   rv   r   Noder   r?   )r   r   r   node	decl_types        r   rW  z!CParser._parse_struct_declaration`  sh   ??&MMO?? 7722455335B 7777""$(9W(D668ELL ++U+CCtF|!<?D$

+ 	!006	LL ++$ID$"O!P ,   	V''d4FG ( 
 	
r    c                     | j                         g}| j                  d      r1|j                  | j                                | j                  d      r1|S NrK  )_parse_struct_declaratorr   rY   r(  s     r   r\  z%CParser._parse_struct_declarator_list  sG    ..01ll7#LL6689 ll7#r    c                     | j                  d      r,| j                         }t        j                  d d d d       d |dS | j	                         }| j                  d      r| j                         }|d |dS |d d dS )NrZ  r   )r   rF  r   rw   rN  )r   r   rr   s      r   rb  z CParser._parse_struct_declarator  s    << 557GtT4>"  %%'<< 557G $7CCdt<<r    c                 `   | j                  d      }| j                         dv r| j                         }| j                         dk(  ra| j                          | j                         }| j                  d       t	        j
                  |j                  || j                  |            S t	        j
                  |j                  d | j                  |            S | j                  d       | j                         }| j                  d       t	        j
                  d || j                  |            S )Nr6  >   r   r   r  rP  )r   r   r   _parse_enumerator_listr   r   rL   rM   )r   rO   rS  enumss       r   r=  zCParser._parse_enum_specifier  s    ll6"?? 00}}H H,335X&zz(..%9MNN::hnndDOOC4HIIX++-Xzz$ts';<<r    c                 0   | j                         }t        j                  |g|j                        }| j	                  d      rS| j                         dk(  r	 |S | j                         }|j                  j                  |       | j	                  d      rS|S )NrK  rP  )_parse_enumeratorr   EnumeratorListrU   r   r   enumeratorsrY   )r   enum	enum_lists      r   re  zCParser._parse_enumerator_list  s    %%'(($<	ll7# H,  ))+D!!((.	 ll7#
 r    c                    | j                  d      }| j                  d      r| j                         }nd }t        j                  |j
                  || j                  |            }| j                  |j                  |j                         |S )Nr   r  )
r   r   rF  r   
EnumeratorrL   rM   rh   r`   rU   )r   rS  rL   rk  s       r   rh  zCParser._parse_enumerator  sm    <<%<<!335EEtx7PQTYY

3r    c                 :    | j                  dd      \  }}|J |S )NFr   r   )r   )r   rr   r#  s      r   rN  zCParser._parse_declarator  s3    ,, 5 - 
a r    c                 (    | j                  dd      S )Nr   Tr   allow_paren_parse_declarator_kindrZ   s    r   r   zCParser._parse_id_declarator  s    **$*GGr    c                 (    | j                  dd      S )NtypeidTrr  rt  rZ   s    r   r   z CParser._parse_typeid_declarator  s    **d*KKr    c                 (    | j                  dd      S )Nrw  Frr  rt  rZ   s    r   r   z(CParser._parse_typeid_noparen_declarator  s    **e*LLr    rs  c                     d }| j                         dk(  r| j                         }| j                  ||      }|| j                  ||      S |S )Nr   rs  )r   _parse_pointer_parse_direct_declaratorr{   )r   r   rs  ptrdirects        r   ru  zCParser._parse_declarator_kind  sV    ??'%%'C..t.M?))&#66r    c           	      J   |r6| j                  d      r%| j                  |d      }| j                  d       n[|dk(  r| j                  d      }n| j                  d      }t        j                  |j
                  d d d | j                  |            }| j                  |      S )	Nr   Trz  r   r   r   r   r   )r   ru  r   r   rw   rL   rM   _parse_decl_suffixes)r   r   rs  rr   rS  s        r   r|  z CParser._parse_direct_declarator  s     4<<1..t.FDLL"t|<<-<<1>>!ooh/D ((..r    c                     	 | j                         dk(  r"| j                  || j                  |            }6| j                         dk(  r$| j                  |      }| j                  ||      }m	 |S )zAParse a chain of array/function suffixes and attach them to decl.r   r   )r   r{   _parse_array_decl_parse_function_decl)r   rr   r   s      r   r  zCParser._parse_decl_suffixes  sp     J.--dD4J4J44PQ H,006--dD9r    	base_declc                 <    | j                  d |j                        S N)	base_typerU   )_parse_array_decl_commonrU   )r   r  s     r   r  zCParser._parse_array_decl	  s    ,,t9??,SSr    r  c                 6   | j                  d      }| j                  |      fd}| j                  d      rBdg| j                         xs g z   }| j	                         }| j                  d        |||      S | j                         t        v r| j                         xs g }| j                  d      r0|dgz   }| j	                         }| j                  d        |||      S | j                  d      }|rI| j                  d       t        j                  |j                  | j                  |            } |||      S d}| j                         r| j	                         }| j                  d        |||      S | j                  d      }|rI| j                  d       t        j                  |j                  | j                  |            } ||g       S d}| j                         r| j	                         }| j                  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                 6    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   rC  _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	
 <<!!
d&E&E&G&M2NI335CLL$"3	22??/779?RI||H%%
2	779Z(&sI66W-IZ(hhy	0JK&sI66C&&(779LL$"3	22LL)	LL$((9??DOOI,FGC"3++""$335CZ sB''r    c                    | j                  d       | j                  d      rd }nA| j                         r| j                         n| j	                         }| j                  d       t        j                  |d |j                        }| j                         dk(  rp|j                  d|j                  j                  D ]K  }t        |t
        j                        r |S t        |dd       }|s0| j                  ||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<<!D ++- //1446 
 LL"~~4d)//J??(yy$!YY-- @E!%)<)<=
 	 #5&$7D,,T5;;?@ r    c                    g }| j                  d      }|rJ| j                         xs g }|j                  || j                  |      f       | j                  d      }|rJ|sy d }|D ]  \  }}t	        j
                  |||      } |S )Nr   )r   ru   rU   )r   rC  rY   rM   r   PtrDecl)r   starsr  r   r}  rU   s         r   r{  zCParser._parse_pointer`  s    LL)	335;ELL%!;<=W-I 
 ! 	DLE5--e#UCC	D
r    c                 .   | j                         }| j                         dk(  rq| j                  d      dk(  r]| j                          | j                         }|j                  j	                  t        j                  | j                  |                   |S NrK  r   ELLIPSIS)_parse_parameter_listr   r   r  rY   r   r  rM   )r   r  ell_toks      r   r  z"CParser._parse_parameter_type_listq  sn    ++-??'DOOA,>*,LMMOmmoGMM  !4!4T__W5M!NOr    c                 x   | j                         }t        j                  |g|j                        }| j	                         dk(  ru| j	                  d      dk7  ra| j                          |j                  j                  | j                                | j	                         dk(  r| j	                  d      dk7  ra|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%%++6oo7*tq/AZ/OMMOMM  !B!B!DE oo7*tq/AZ/O r    c                 r   | j                  d      \  }}}|d   st        j                  dg|      g|d<   | j                         rN| j	                  dd      \  }}|r#| j                  |t        |d d       g      d	   S | j                  |||      S | j                         }| j                  |||      S )
NTr  ru   r'   r   rp  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aF|!00%
KLDL""$!77#d 8 ND( //d4&N%O 0   44T4LL22400tZHHr    r"  c                    t        |d         dkD  ret        |d   d   j                        dk(  rG| j                  |d   d   j                  d         r#| j                  |t	        |d d       g      d   S t        j                  d|d   d |xs t        j                  d d d d       |	      }| j                  ||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&&tF|B'7'='=a'@A++$DtT"J!K ,   ~~v,?dD$?
 ''d6l;;r    c                 J    | j                         dk(  ry | j                         S Nr   )r   _parse_identifier_listrZ   s    r   r  z"CParser._parse_identifier_list_opt  s#    ??(**,,r    c                     | j                         }t        j                  |g|j                        }| j	                  d      r;|j
                  j                  | j                                | j	                  d      r;|S ra  )_parse_identifierr   r  rU   r   r  rY   r  s      r   r  zCParser._parse_identifier_list  s`    &&(%%++6ll7#MM  !7!7!9: ll7#r    c                 `   | j                         }| j                         }d }||j                  }n|d   r|d   d   j                  }t        j                  d|d   d d  d |xs t        j
                  d d d d       |      }t        t        j                  | j                  ||d               S )Nru   r   r-   r   r  )rA  r   rU   r   r  rw   r   r   )r   r   rr   rU   r|   s        r   r  zCParser._parse_type_name  s    335224JJE&\LO))E>>v,q/?dD$?
 ENND$<$<XtF|$TUUr    c                 (   | j                         dk(  r_| j                         }| j                         r| j                         }nt	        j
                  d d d d       }|J | j                  ||      S | j                         r| j                         S y )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==?~~dD$=?"?))$4422499;;r    c           	      ,   | j                  d      }|r| j                         s| j                         dk(  r_| j                         }| j	                  d       t        j                  |t        j                  d d d d       | j                  |            }no| j                         }| j	                  d       |LJ | j                         dk(  r| j                         }n&| j                  d| j                  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  s    \\(+
'')T__->(-J<<>X&~~dD$?//*5 ::<X&'''__*,224D;TYY=O=OP((..r    c                 J    | j                         dk(  ry | j                         S r  )r   r  rZ   s    r   r  z&CParser._parse_parameter_type_list_opt  s#    ??(..00r    c                 T    | j                  t        j                  d d d d       d       S r  )r  r   rw   rZ   s    r   r  z"CParser._parse_abstract_array_base  s.    ,,nnT4t<D - 
 	
r    c                 \   | j                         }|xxdk(  rnxdk(  rn n  | j                         S xdk(  r%| j                  d      dk(  r | j                         S xdk(  r | j                         S xxdk(  rnxdk(  rn n  | j                         S xxd	k(  rnxd
k(  rnxdk(  rn n  | j	                         S xxdk(  rnxdk(  rnxdk(  rnxdk(  rn n  | j                         S xxdk(  rnxdk(  rn n  | j                         S dk(  r| j                         S 	 | j                         S )NCASEDEFAULTr   r   rZ  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+w644665577 6688'4%'66889'J91133'i'5577!00227799r    c                     | j                         dv rH| j                         }| j                         }t        j                  ||gz   |d   j
                        S | j                         S )N>   r  r  r   block_itemsrU   )r   _parse_pppragma_directive_listr  r   CompoundrU   )r   pragmasstmts      r   _parse_pragmacomp_or_statementz&CParser._parse_pragmacomp_or_statement$  s_    ?? 7799;G((*D>>g.>gajFVFVWW$$&&r    c                 b    | j                         r| j                         S | j                         S rX   )r   r)  r  rZ   s    r   _parse_block_itemzCParser._parse_block_item,  s,    ##%**,,$$&&r    c                     g }| j                         dvr]| j                         }t        |t              r|d gk(  r9|j	                  |       n|j                  |       | j                         dvr]|S rV  )r   r  rv   listr	  rY   )r   rX  items      r   _parse_block_item_listzCParser._parse_block_item_list2  sl    oo'77))+D$%D6>T"T" oo'77 r    c                     | j                  d      }| j                  d      r&t        j                  d | j	                  |            S | j                         }| j                  d       t        j                  || j	                  |            S )Nr  rP  r  )r   r   r   r  rM   r  )r   
lbrace_tokr  s      r   r  z!CParser._parse_compound_statement?  so    \\(+
<<!>>d$//*:UVV113X~~#4??:+F
 	
r    c                    | j                         }|xdk(  r | j                         }| j                  d       | j                         r| j	                         }n$t        j                  | j                  |            }t        j                  |j                  || j                  |            S xdk(  r | j                         }| j                         }| j                  d       | j                         r| j	                         }n$t        j                  | j                  |            }t        j                  ||g| j                  |            S dk(  r| j                         }| j                  d       | j                         r| j	                         }n$t        j                  | j                  |            }t        j                  |g| j                  |            S 	 | j                  d| j                  j                         y )Nr   rZ  r  r  zInvalid labeled statement)r   r   r   r   r  r   EmptyStatementrM   LabelrL   rF  CaseDefaultrK   r>   rD   )r   r   rS  r  case_tokrG  def_toks          r   r  z CParser._parse_labeled_statementL  s~   ??$==?W%))+>>@D //0IJD{{8>>49RSS==?668W%))+>>@D //0IJDzz$0IJJ--/W%))+>>@D //0HID}}dVT__W-EFF!!"=tyy?Q?QRr    c           	         | j                         }|j                  xdk(  r | j                  d       | j                         }| j                  d       | j	                         }| j                  d      r7| j	                         }t        j                  |||| j                  |            S t        j                  ||d | j                  |            S dk(  rq| j                  d       | j                         }| j                  d       | j	                         }t        t        j                  ||| j                  |                  S 	 | j                  d| j                  |             y )Nr  r   r   ELSEr  zInvalid selection statement)r   ru   r   _parse_expressionr  r   r   IfrM   r   SwitchrK   )r   rO   cond	then_stmt	else_stmtrG  r  s          r   r  z"CParser._parse_selection_statementm  s   mmohhX&--/X& ??A	<<' $ C C EI 88D)YPS@TUUxxits7KLLX&--/X&::<'T4QTAU(VWW!!"?QTAUVr    c           	      Z   | j                         }|j                  xdk(  ri | j                  d       | j                         }| j                  d       | j	                         }t        j                  ||| j                  |            S xdk(  r | j	                         }| j                  d       | j                  d       | j                         }| j                  d       | j                  d       t        j                  ||| j                  |            S dk(  rk| j                  d       | j                         r| j                         }t        j                  || j                  |            }| j                         }| j                  d       | j                         }| j                  d       | j	                         }t        j                  ||||| j                  |            S | j                         }| j                  d       | j                         }| j                  d       | j                         }| j                  d       | j	                         }t        j                  ||||| j                  |            S 	 | j                  d| j                  |             y )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   mmohhX&--/X&::<{{4ts/CDD::<W%X&--/X&V$}}T41EFFX&++- 335E >>%1EFD557DLL( $ : : <ILL*>>@D 99T4D$//RUBVWW113V$113V$ 668	X&::<yytYdooc>RSS!!"?QTAUVr    c                    | j                         }|j                  xdk(  rR | j                  d      }| j                  d       t        j                  |j
                  | j                  |            S xdk(  r6 | j                  d       t        j                  | j                  |            S xdk(  r6 | j                  d       t        j                  | j                  |            S dk(  r|| j                  d      r%t        j                  d | j                  |            S | j                         }| j                  d       t        j                  || j                  |            S 	 | j                  d| j                  |             y )Nr  r   r  r  r  r  zInvalid jump statement)r   ru   r   r   GotorL   rM   BreakContinuer   Returnr  rK   )r   rO   rS  rG  s       r   r  zCParser._parse_jump_statement  s   mmohh<<-V$zz(..$//#2FGGV${{4??3#788V$~~dooc&:;;<<' <<dooc.BCC--/V$||D$//#*>??!!":DOOC<PQr    c                     | j                         }| j                  d      }|$t        j                  | j	                  |            S |S r&  )r  r   r   r  rM   )r   rG  semi_toks      r   r  z#CParser._parse_expression_statement  sB    ))+<<'<''(ABBr    c                 D    | j                         r| j                         S y rX   )r   r  rZ   s    r   r  zCParser._parse_expression_opt  s     ""$))++r    c                 0   | j                         }| j                  d      s|S || j                         g}| j                  d      r1|j                  | j                                | j                  d      r1t        j                  ||j
                        S ra  r  r   rY   r   ExprListrU   r   rG  exprss      r   r  zCParser._parse_expression  sx    002||G$Kt88:;ll7#LL::<= ll7#~~eTZZ00r    c                    | j                         dk(  rG| j                  d      dk(  r3| j                          | j                         }| j                  d       |S | j	                         }| j                         rL| j                         j                  }| j                         }t        j                  ||||j                        S |S )Nr   r   r  r   )r   r   r  r   _parse_conditional_expressionr   rL   r  r   
AssignmentrU   )r   comprG  oprhss        r   r  z$CParser._parse_assignment_expression  s    ??(T__Q-?8-KMMO113DLL"K113!!#&&B335C##Bc4::>>r    c                     | j                         }| j                  d      rS| j                         }| j                  d       | j	                         }t        j                  ||||j                        S |S )NCONDOPrZ  )_parse_binary_expressionr   r  r   r  r   	TernaryOprU   )r   rG  iftrueiffalses       r   r  z%CParser._parse_conditional_expression  sb    ,,.<<!++-FLL!88:G??4$**EEr    min_preclhsc                    || j                         }	 | j                         }||j                  t        vr	 |S t        |j                     }||k  r	 |S |j                  }| j                          | j                         }	 | j                         }||j                  t        vrn-t        |j                     }||kD  r| j                  ||      }nnRt        j                  ||||j                        }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{chh.@@* 
) &chh/Dh$ 
! BMMO--/C::<#x}}<N'N.x}}=	t#77	3GC  ..S#syy9C- r    c                 &   | j                         }|p|\  }}}| j                         dk(  r!| j                  |       | j                         S | j                         }t	        j
                  ||| j                  |            S | j                         S )Nr  )r  r   r   r  r   CastrM   _parse_unary_expression)r   resultr   r   r  rG  s         r   r  zCParser._parse_cast_expression  s    002$*!Cz H, D! ++-- 224zz#tT__Z-HII++--r    c                    | j                         }|dv rK| j                         }| j                         }t        j                  |j
                  ||j                        S |dv rK| j                         }| j                         }t        j                  |j
                  ||j                        S |dk(  r| j                         }| j                         }|6|\  }}}t        j                  |j
                  || j                  |            S | j                         }t        j                  |j
                  || j                  |            S |dk(  rr| j                         }| j                  d       | j                         }| j                  d       t        j                  |j
                  || j                  |            S | j                         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   rG  r  r   r#  s          r   r  zCParser._parse_unary_expression4  sp   ??$11--/C//1D==D$**==GG--/C..0D==D$**==x--/C446F!"	Q}}SYYT__S5IJJ//1D==D$//#2FGGz!--/CLL"'')CLL"==C1EFF--//r    c                    | j                         }|p|\  }}}| j                  d      rH| j                         }| j                  d       | j                  d       t	        j
                  ||      S | j                  |       | j                         }	 | j                  d      rC| j                         }| j                  d       t	        j                  |||j                        }U| j                  d      ri| j                         dk(  r| j                          d }n!| j                         }| j                  d       t	        j                  |||j                        }| j                         dv r| j                         }	| j                         }
|
j                  d	vr!| j!                  d
| j#                  |
             t	        j$                  |
j&                  | j#                  |
            }t	        j(                  ||	j&                  ||j                        }| j                         dv r@| j                         }t	        j*                  d|j&                  z   ||j                        }	 |S )Nr  rK  rP  r   r  r   r   >   ARROWPERIOD>   r   r   zInvalid struct reference>   r  r  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   rG  subr  op_tokrS  fieldrO   s                r   r&  z!CParser._parse_postfix_expressionT  s   002!LCq ||H%335W%X&,,S$77D!--/||J',,.Z(~~dC<||H%??$0MMOD??ADLL*~~dD$**= $77==?==(88%%2DOOH4M 1JKtV\\5$**M $>>mmo}}S399_dDJJGr    c                 B   | j                         }|dk(  r| j                         S |t        v s|t        v s|t        v r| j                         S |t        v r| j                         S |t        v r| j                         S |dk(  r3| j                          | j                         }| j                  d       |S |dk(  r| j                         }| j                  d       | j                         }| j                  d       | j                         }| j                  d       | j                  |      }t!        j"                  t!        j$                  |j&                  |      t!        j(                  ||g|      |      S | j+                  d| j,                  j.                         y )Nr   r   r   OFFSETOFrK  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   r0  r   rL   r  rK   r>   rD   )r   r   rG  off_tokr   
designatorrU   s          r   r-  z!CParser._parse_primary_expression  sa   ??$t))++
"<';&''))&5577}$6688xMMO))+DLL"Kz!mmoGLL"'')CLL!??AJLL"OOG,E>>.Z0%8  	.		0B0BCr    c                 Z   | j                         }	 | j                  d      r3| j                         }t        j                  |d||j                        }E| j                  d      rC| j                         }| j                  d       t        j                  |||j                        }	 |S )Nr)  .r   r  )_parse_identifier_or_typeidr   r   r1  rU   r  r   r.  )r   r^  r4  rG  s       r   r?  z)CParser._parse_offsetof_member_designator  s    //1||H%88:tS%D||J'--/Z(~~dD$**=r    c                     | j                         }|g}| j                  d      r1|j                  | j                                | j                  d      r1t        j                  ||j
                        S ra  r  r   s      r   r/  z'CParser._parse_argument_expression_list  s[    002ll7#LL::<= ll7#~~eTZZ00r    c                 "    | j                         S rX   )r  rZ   s    r   rF  z"CParser._parse_constant_expression  s    1133r    c                     | j                  d      }t        j                  |j                  | j	                  |            S )Nr   )r   r   r   rL   rM   r   s     r   r  zCParser._parse_identifier  s.    ll4 xx		4??3#788r    c                     | j                         }|j                  dvr!| j                  d| j                  |             t	        j
                  |j                  | j                  |            S )N>   r   r   zExpected identifier)r   ru   rK   rM   r   r   rL   r   s     r   rD  z#CParser._parse_identifier_or_typeid  sR    mmo88++3T__S5IJxx		4??3#788r    c                    | j                         }|j                  t        v rd}d}|j                  dd  D ]  }|dv r|dz  }|dv s|dz  } |dkD  rt	        d      |dkD  rt	        d      d	|z  d
|z  z   }t        j                  |dz   |j                  | j                  |            S |j                  t        v rZ|j                  d   dv rd}n|j                  d   dv rd}nd}t        j                  ||j                  | j                  |            S |j                  t        v r0t        j                  d|j                  | j                  |            S | j                  d| j                  |             y )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   r7  rL   
ValueErrorr   ConstantrM   r8  r9  rK   )r   rO   u_countl_countchprefixr   s          r   r:  zCParser._parse_constant  s_   mmo88z!GGiin !#qLG:%qLG	!
 { !QRR{ !QRR 7*Ww->>F>>&5.#))T__S=QRR88|#yy}
*2*,!>>!SYY0DEE88{">>&#))T__S5IJJ,dooc.BCr    c                 >   | j                  d      }t        j                  d|j                  | j	                  |            }| j                         dk(  rH| j                         }|j                  d d |j                  dd  z   |_        | j                         dk(  rH|S )NSTRING_LITERALstringrb   r   )r   r   rU  rL   rM   r   r   r   rO   r^  tok2s       r   r<  z%CParser._parse_unified_string_literal  s    ll+,~~h		4??33GHoo#33==?DCR4::ab>9DJ oo#33 r    c                    | j                         }|j                  t        vr!| j                  d| j	                  |             t        j                  d|j                  | j	                  |            }| j                         t        v rY| j                         }|j                  j                         d d |j                  dd  z   |_        | j                         t        v rY|S )NzInvalid string literalr\  rb   r   )
r   ru   r=  rK   rM   r   rU  rL   r   rstripr]  s       r   r>  z&CParser._parse_unified_wstring_literal  s    mmo88=(68LM~~h		4??33GHoo=0==?D**,Sb1DJJqrNBDJ oo=0 r    c                    | j                  d      }|rj| j                  d      r%t        j                  g | j                  |            S | j	                         }| j                  d       | j                  d       |S | j                         S )Nr  rP  rK  )r   r   InitListrM   r+  r   r  )r   r  	init_lists      r   r  zCParser._parse_initializer  st    \\(+
||H%~~b$//**EFF446ILL!LL"0022r    c                    | j                         g}| j                  d      rE| j                         dk(  rn1|j                  | j                                | j                  d      rEt	        j
                  ||d   j                        S )NrK  rP  r   )_parse_initializer_itemr   r   rY   r   rb  rU   )r   rX  s     r   r+  zCParser._parse_initializer_list  so    --/0ll7# H,LL5578 ll7# ~~eU1X^^44r    c                     d }| j                         dv r| j                         }| j                         }|t        j                  ||      S |S N>   r)  r   )r   _parse_designationr  r   NamedInitializer)r   designationr   s      r   re  zCParser._parse_initializer_item%  sQ    ?? 66113K&&("))+t<<r    c                 H    | j                         }| j                  d       |S )Nr  )_parse_designator_listr   r   designatorss     r   rh  zCParser._parse_designation/  s"    113Xr    c                     g }| j                         dv r2|j                  | j                                | j                         dv r2|S rg  )r   rY   _parse_designatorrm  s     r   rl  zCParser._parse_designator_list5  sF    oo#99t5578 oo#99r    c                     | j                  d      r#| j                         }| j                  d       |S | j                  d      r| j                         S | j	                  d| j
                  j                         y )Nr   r  r)  zInvalid designator)r   rF  r   rD  rK   r>   rD   )r   rG  s     r   rp  zCParser._parse_designator=  sc    <<
#224DLL$K<<!3355.		0B0BCr    c                 h    | j                  d      }| j                  d| j                  |             y )Nr  zDirectives not supported yet)r   rK   rM   r   s     r   r  zCParser._parse_pp_directiveJ  s*    ll8$8$//#:NOr    c                 x   | j                         dk(  r| j                         }| j                         dk(  r?| j                         }t        j                  |j                  | j                  |            S t        j                  d| j                  |            S | j                         dk(  rg| j                         }| j                  d      }| j                         }| j                  d       t        j                  || j                  |            S | j                  d| j                  j                         y )Nr  PPPRAGMASTRr-   r  r   r   zInvalid pragma)r   r   r   PragmarL   rM   r   r<  rK   r>   rD   )r   rO   str_toklparenliterals        r   r  z!CParser._parse_pppragma_directiveP  s    ??
*--/C M1--/||GMM4??73KLL<<DOOC$899??	)--/C\\(+F88:GLL"<<)@AA*DII,>,>?r    c                     g }| j                         dv r2|j                  | j                                | j                         dv r2|S )N>   r  r  )r   rY   r  )r   r  s     r   r  z&CParser._parse_pppragma_directive_listb  sC    oo#::NN499;< oo#::r    c                    | j                  d      }| j                  d       | j                         }d }| j                  d      r| j                         }| j                  d       t	        j
                  ||| j                  |            gS )Nr  r   rK  r   )r   rF  r   r<  r   StaticAssertrM   )r   rO   r  rT   s       r   r  zCParser._parse_static_asserti  sw    ll+,X..0<< 446CX""4dooc.B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   r]  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  rA  rC  r7  r8  r  rL  r<  rQ  rW  r\  rb  r=  re  rh  rN  r   r   r   ru  r|  r  r  r  r  r{  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r&  r-  r?  r/  rF  r  rD  r:  r<  r>  r  r+  re  rh  rl  rp  r  r  r  r  r(   r    r   r,   r,   2   s   	 "$("* == F|= 	=
 = = = = 
=: <A#&48	8JS J(3- J5 J, ,ECK$,> ,8 ,) +c +(5/ +d +	,C 	, 	,D 	,c d :3 :c :3 :4 :,# ,$ ,Tc S UZZ X&jj5==(5>>9& s)& 
emm	#enn	4	&Z ;'  	
  
4 #(	ee K e  	e
 
ejj	eN

 jj
 d5::./	

 jj
 

*  $s $8F#3 $5C 5 5
& 	# 	(6*: 	# & #s #!3 !4 !3f 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=%-- =ejj)9 MT%**-= MlD$4 ?$uzz"2 ?''+/'	ejj	'Tejj)9  %*v+!v+	{D(5/1	2v+v`FDI 9EJJ 9  DIk*<@	k	8d 8{ 8T%** TBUZZ0@ 
8D4D+E 
DtK/@ =$=uzz ="

 5:: 5:: Hejj HL%** LM%** M3 T ejj  .2//&*/	/* 

 T5:: T%** T IM7(!%**-7(6>uo7(	7(tejj UZZ 4 4 "EOO u Iejj I&<<'/

';<IQRW<	<,-HUZZ,@ -

 V%.. V(0D $/5:: /.10I 1
EJJ 
:%**tEJJ/?"? :.'

T%**=M0M ''5::UZZ0@#@ '
UZZ(8 

5:: 
S%** SBWEJJ W2&WEJJ &WTRuzz R.UZZ x

'; 15:: 1ejj  uzz  >B&.uzz&:	D.

 .*0 0@.5:: .d!D5:: !DJ5::  1 14EJJ 495:: 9
9UZZ 9D D@uzz 

  
3EJJ 
35 5 D$4 UZZ(8 D5:: DPX P@5:: @$UZZ0@ Ed5::&6 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>   CONSTr3  RESTRICTVOLATILE>   INTCHARLONGVOIDFLOATSHORT_BOOLDOUBLESIGNEDUNSIGNED_COMPLEX__INT128>   r6  r4  r5  r   r3  r1  >   r   r  r  r   r!  r"  r   r   r#  r6  r  r$  r  >   INT_CONST_BININT_CONST_DECINT_CONST_HEXINT_CONST_OCTINT_CONST_CHARFLOAT_CONSTHEX_FLOAT_CONST>   
CHAR_CONSTWCHAR_CONSTU8CHAR_CONSTU16CHAR_CONSTU32CHAR_CONSTr[  >   WSTRING_LITERALU8STRING_LITERALU16STRING_LITERALU32STRING_LITERAL>   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  c                   v    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y)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                 .    || _         g | _        d| _        y )Nr   )_lexer_buffer_index)r   r/   s     r   rC   z_TokenStream.__init__	  s    /1r    r   c                 n    |dk  ry| j                  |       | 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
	  s5     6

1||DKK!Oa/00r    c                     | j                  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	  s2    

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

1c 
1(6"2 
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<   y)r   r   r   ru   r   r   N)r!   r"   r#   r   r   r&   r(   r    r   r   r   6	  s2    
s)O#Y
s)O3iCyr    r   r   c                   z    e Zd ZU eej
                     ed<   eej
                     ed<   eej
                     ed<   y)r   rr   r   r   N)r!   r"   r#   r	   r   r]  r&   r(   r    r   r   r   A	  s1    
 5::

5::
ejj!!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  r9  r:  r   r;  r   _EXPR_STARTr7  r8  r9  r;  r=  r   r   rA   r   r   r   r(   r    r   <module>r     s.   "
 
 
  # C   $	 	 E  EDB"	1
A 	! 
1	
 
1 	! 	! 	! 	! 	! 	! a a A Q  Q!" a#$ 
1% * VK(>     C	C  
 01 $$   	
   (. .n	  JK"	 "r    