
     
zi^                       S SK Jr  S SKJrJrJrJrJrJrJ	r	J
r
Jr  SSKJr  SSKJrJr  SSKJrJr  \ " S S5      5       r " S	 S
\5      r " S S5      r1 Skr0 SS _SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_S S_S!S"_S#S"_S$S%_S&S%_S'S%0Er1 S(krS)S*1r1 S+kr1 S,kr\\-  \-  \-  1 S-k-  r1 S.kr1 S/kr S0S11r!1 S2kr"S31r#1 S4kr$\\ -  \!-  \"-  \#-  \$-  r%1 S5kr& " S6 S75      r' " S8 S9\
5      r(\S:   r) " S; S<\
5      r*g=)>    )	dataclass)	AnyDictListLiteralNoReturnOptionalTuple	TypedDictcast   )c_ast)CLexer_Token)fix_switch_casesfix_atomic_specifiersc                   P    \ rS rSr% Sr\\S'   \\S'   Sr\	\   \S'   S\4S jr
S	rg)
Coord   z[Coordinates of a syntactic element. Consists of:
- File name
- Line number
- Column number
filelineNcolumnreturnc                     U R                    SU R                   3nU R                  (       a  USU R                   3-  nU$ )N:r   r   r   )selftexts     E/var/www/html/venv/lib/python3.13/site-packages/pycparser/c_parser.py__str__Coord.__str__'   s;    ))Adii[);;a}%%D     )__name__
__module____qualname____firstlineno____doc__str__annotations__intr   r	   r    __static_attributes__r#   r"   r   r   r      s-     I
I FHSM  r"   r   c                       \ rS rSrSrg)
ParseError.   r#   N)r$   r%   r&   r'   r,   r#   r"   r   r.   r.   .   s    r"   r.   c                   "   \ rS rSrSrS\SSSSS4S\S	\\   S
\S\S\S\S\SS4S jjr	 SS\S\S\S\
R                  4S jjrSS\S\\   S\4S jjrS\S\\-  S-  S\4S jrSS jrSS jrS\S\\   SS4S jrS\S\\   SS4S  jrS\S\4S! jrS\S"\S\SS4S# jrSS$ jrSS% jrS\S\4S& jrS'\S(\S\
R:                  4S) jrS'\
R>                  \
R@                  -  \
RB                  -  S*\"\   S\
R>                  \
R@                  -  \
RB                  -  4S+ jr# SS,\S-   S.\S/S0S1\SS-4
S2 jjr$ SS3S-S4\"S5   S6\S\"\
R:                     4S7 jjr%S3S-S'\
R:                  S8\\"\
R:                        S9\
R:                  S\
R:                  4
S: jr&S;\S\4S< jr'SS=\S\\(   4S> jjr)SS=\S\\   4S? jjr*S\(4S@ jr+SA\S\\(   4SB jr,SA\S\(4SC jr-S\4SD jr.SE\SS4SF jr/SG\(S\4SH jr0SSG\\(   S\4SI jjr1SSG\\(   S\4SJ jjr2S\4SK jr3SSL\S\4SM jjr4S\5\\   \4   4SN jr6 SSO\SP\S\5\\
R:                     \4   4SQ jjr7S\5\\   \4   4SR jr8S\4SS jr9S\4ST jr:S\\5\
RB                  \\(4      4SU jr;S\
R                  4SV jr<S\"\
R:                     4SW jr=S\"\
R:                     4SX jr>S\"\
R:                     4SY jr?S\"\
R:                     4SZ jr@S3S-S[\S\"\
R:                     4S\ jrAS\"\
R:                     4S] jrB SS^\S\5S-\\\   4   4S_ jjrCSS` jrDS\"\   4Sa jrES\
R:                  4Sb jrFS\
R:                  4Sc jrG SSd\S5   SL\S\"S5   4Se jjrHSSL\SS54Sf jjrIS\
R:                  4Sg jrJS\"\
R:                     4Sh jrKS\\"\
R:                        4Si jrLS\"S5   4Sj jrMSSk jrNS\
R:                  4Sl jrOS\
R:                  4Sm jrPS\
R:                  4Sn jrQS\
R:                  4So jrRS\
R:                  4Sp jrSS\
R:                  4Sq jrTS\
R:                  4Sr jrUS/\Ss\S\
R:                  4St jrV SS/\Ss\S\
R:                  4Su jjrWS'\
R:                  S\
R:                  4Sv jrXSw\
R:                  S\
R:                  4Sx jrY SSy\\
R:                     S\\   S\
R:                  4Sz jjrZSw\
R:                  S\
R:                  4S{ jr[S\\
R:                     4S| jr\S\
R                  4S} jr^S\
R                  4S~ jr_S\
R:                  4S jr`S3S-S'\\
R:                     S\\   S\
R:                  4S jraS\\
R:                     4S jrbS\
R:                  4S jrcS\
RB                  4S jrdS\\
R:                     4S jreS\
R:                  4S jrfS\\
R                     4S jrgS\
R:                  4S jrhS\
R:                  \"\
R:                     -  4S jriS\
R:                  \"\
R:                     -  4S jrjS\
R:                  \"\
R:                     -  4S jrkS\"\
R:                     4S jrlS\
R:                  4S jrmS\
R:                  4S jrnS\
R:                  4S jroS\
R:                  4S jrpS\
R:                  4S jrqS\
R:                  4S jrrS\\
R:                     4S jrsS\
R:                  4S jrtS\
R:                  4S jruS\
R:                  4S jrv SS\S\\
R:                     S\
R:                  4S jjrwS\
R:                  4S jrxS\
R:                  4S jryS\
R:                  4S jrzS\
R:                  4S jr{S\
R:                  4S jr|S\
R:                  4S jr}S\
R:                  4S jr~S\
R:                  4S jrS\
R:                  4S jrS\
R:                  4S jrS\
R:                  4S jrS\
R:                  4S jrS\
R:                  4S jrS\
R:                  4S jrS\
R:                  4S jrS\"\
R:                     4S jrS\"\
R:                     4S jrS\
R:                  4S jrS\4S jrS\
R:                  4S jrS\"\
R:                     4S jrS\"\
R:                     4S jrSrg)CParser2   a*  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                     U" U R                   U R                  U R                  U R                  S9U l        [        5       /U l        [        U R                  5      U l        g )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   r4   r5   r6   r7   r8   r9   r:   s           r   __init__CParser.__init__>   sR     "++3333!77	
	 59F8%1$))%<r"   r   filenamedebugc                 2   [        5       /U l        U R                  R                  X5        [	        U R                  5      U l        U R                  5       nU R                  5       nUb.  U R                  SUR                   3U R                  U5      5        U$ )zParses 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: )rE   rF   rD   inputrG   rH    _parse_translation_unit_or_empty_peek_parse_errorvalue
_tok_coord)r   r   rK   rL   asttoks         r   parseCParser.parseZ   sw     "VH		'#DII.335jjl?4dooc6JK
r"   linenor   c                 >    [        U R                  R                  XS9$ )Nr   )r   rD   rK   )r   rY   r   s      r   _coordCParser._coordv   s    $)),,6IIr"   msgcoordc                 "    [        U SU 35      e)Nz: )r.   )r   r]   r^   s      r   rR   CParser._parse_errory   s    E7"SE*++r"   c                 J    U R                   R                  [        5       5        g N)rF   appendrE   r   s    r   _push_scopeCParser._push_scope|   s      (r"   c                 n    [        U R                  5      S:  d   eU R                  R                  5         g )Nr   )lenrF   poprd   s    r   
_pop_scopeCParser._pop_scope   s-    4$$%)))r"   namec                     U R                   S   R                  US5      (       d  U R                  SU< S3U5        SU R                   S   U'   g)z9Add a new typedef name (ie a TYPEID) to the current scopeTzTypedef z1 previously declared as non-typedef in this scopeNrF   getrR   r   rl   r^   s      r   _add_typedef_nameCParser._add_typedef_name   sU      $((t444("ST '+"d#r"   c                     U R                   S   R                  US5      (       a  U R                  SU< S3U5        SU R                   S   U'   g)zPAdd a new object, function, or enum member name (ie an ID) to the
current scope
rn   FzNon-typedef z- previously declared as typedef in this scopeNro   rq   s      r   _add_identifierCParser._add_identifier   sW     R $$T511th&ST ',"d#r"   c                 l    [        U R                  5       H  nUR                  U5      nUc  M  Us  $    g)z.Is *name* a typedef-name in the current scope?F)reversedrF   rp   )r   rl   scopein_scopes       r   _is_type_in_scopeCParser._is_type_in_scope   s6    d//0E yyH# 1 r"   r   c                 D    U R                  XR                  X#5      5        g rb   )rR   r[   )r   r]   r   r   s       r   r@   CParser._lex_error_func   s    #{{489r"   c                 $    U R                  5         g rb   )re   rd   s    r   rA   CParser._lex_on_lbrace_func   s    r"   c                 $    U R                  5         g rb   )rj   rd   s    r   rB   CParser._lex_on_rbrace_func   s    r"   c                 $    U R                  U5      $ )zzLooks up types that were previously defined with
typedef.
Passed to the lexer for recognizing identifiers that
are types.
)r{   )r   rl   s     r   rC   CParser._lex_type_lookup_func   s     %%d++r"   declmodifierc                    UnUnUR                   (       a  UR                   nUR                   (       a  M  [        U[        R                  5      (       a  Xl         U$ Un[        UR                   [        R                  5      (       d7  UR                   n[        UR                   [        R                  5      (       d  M7  UR                   Ul         X5l         U$ )zTacks a type modifier on a declarator, and returns
the modified declarator.

Note: the declarator and modifier may be modified
)type
isinstancer   TypeDecl)r   r   r   modifier_headmodifier_tail	decl_tails         r   _type_modify_declCParser._type_modify_decl   s     !    )..M     dENN++!%O
 I @@%NN	 !@@ "+M*NKr"   typenamec                 4   Un[        U[        R                  5      (       d-  UR                  n[        U[        R                  5      (       d  M-  UR                  Ul        UR                  SS Ul        U HY  n[        U[        R                  5      (       a  M$  [        U5      S:  a  U R                  SUR                  5        MQ  XCl        Us  $    U(       dl  [        UR                  [        R                  5      (       d  U R                  SUR                  5        [        R                  " S/UR                  S9Ul        U$ [        R                  " U VVs/ s H  oUR                    H  ofPM     M     snnUS   R                  S9Ul        U$ s  snnf )z#Fixes a declaration. Modifies decl.Nr   z Invalid multiple types specifiedMissing type in declarationr+   r^   r   )r   r   r   r   declnamerl   qualsIdentifierTyperh   rR   r^   FuncDeclnames)r   r   r   typtnidrl   s          r   _fix_decl_name_typeCParser._fix_decl_name_type   s4    S%..11((C S%..11 LL	JJqM	 Bb%"6"677x=1$%%&H"((S!HK  dii88!!"?L++UG4::FCH  ++ (>"XXTX>hqkFWFWCH  ?s   F
declspec	_DeclSpecnewspeckind_DeclSpecKindrc   c                     Uc  [        / / / / / S9nOUnU(       a  XS   R                  U5        U$ XS   R                  SU5        U$ )z2See _DeclSpec for the specifier dictionary layout.qualstorager   function	alignmentr   )rE   rc   insert)r   r   r   r   rc   specs         r   _add_declaration_specifier"CParser._add_declaration_specifier(  sY     ""rRD DJg&  Ja)r"   r   decls	_DeclInfotypedef_namespacec                 >   SUS   ;   n/ nUS   R                  S5      Gc  US   S   c  [        US   5      S:  dH  [        US   S	   R                  5      S
:w  d)  U R                  US   S	   R                  S   5      (       d?  SnUS    H"  n[	        US5      (       d  M  UR
                  n  O   U R                  SU5        [        R                  " US   S	   R                  S   SSUS   US   S	   R
                  S9US   S'   US   S		 O[        US   S   [        R                  [        R                  [        R                  [        R                  45      (       d  [        [        US   S   5      n[        U[        R                  5      (       d-  UR                   n[        U[        R                  5      (       d  M-  UR"                  c   US   S	   R                  S   Ul        US   S		 U GH  n	U	S   c   eU(       a/  [        R$                  " SUS   US   U	S   U	S   R
                  S9n
OV[        R&                  " SUS   US   US   US   U	S   U	R                  S5      U	R                  S5      U	S   R
                  S9	n
[        U
R                   [        R                  [        R                  [        R                  [        R                  45      (       a  U
nOU R)                  XS   5      nU(       aT  U(       a'  U R+                  UR,                  UR
                  5        O&U R/                  UR,                  UR
                  5        [1        [        [        R&                  [        R$                  -  U5      5      nUR3                  U5        GM     U$ )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   bitsizeNr   r      rn   r   ?r^   Invalid declarationr   r   r   r   alignr^   r   )rl   r   r   r   r^   r   init	rl   r   r   r   funcspecr   r   r   r^   )rp   rh   r   r{   hasattrr^   rR   r   r   r   EnumStructUnionr   r   r   r   r   TypedefDeclr   rr   rl   ru   r   rc   )r   r   r   r   
is_typedefdeclarationsr^   tdecls_0_tailr   declaration
fixed_decls               r   _build_declarationsCParser._build_declarations>  sT    $y/1
 8<<	"*
 Qx'V%)4<+112a711$v,r2B2H2H2KL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B#/#4#4L %\5>>B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5k<P
 !**:??J<L<LM((*:J:JK.UZZ%--/<J 
+U X r"   param_declsbodyc           	          SUS   ;   a  U R                  SUR                  5        U R                  U[        USSS9/SS9S   n[        R
                  " XSXBR                  S	9$ )
zBuilds a function definition.r   r   zInvalid typedefNr   r   r   Tr   r   r   r   )r   r   r   r^   )rR   r^   r   rE   r   FuncDef)r   r   r   r   r   r   s         r   _build_function_definition"CParser._build_function_definition  su     Y'/<..Td;<" / 
 	 }}D


 	
r"   tokenc                 N    US:X  a  [         R                  $ [         R                  $ )zKGiven a token (either STRUCT or UNION), selects the
appropriate AST class.
struct)r   r   r   )r   r   s     r   _select_struct_union_class"CParser._select_struct_union_class  s      H<<;;r"   kc                 8    U R                   R                  U5      $ )z:Return the k-th next token without consuming it (1-based).)rH   peekr   r   s     r   rQ   CParser._peek  s    ||  ##r"   c                 F    U R                  U5      nUb  UR                  $ S$ )zDReturn the type of the k-th next token, or None if absent (1-based).N)rQ   r   )r   r   rV   s      r   
_peek_typeCParser._peek_type  s"    jjm?sxx44r"   c                     U R                   R                  5       nUc'  U R                  SU R                  R                  5        g U$ )NzAt end of input)rH   nextrR   rD   rK   r   rV   s     r   _advanceCParser._advance  s9    ll!;/1C1CDJr"   
token_typec                 j    U R                  5       nUb   UR                  U:X  a  U R                  5       $ g)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)rQ   r   r   r   r   rV   s      r   _acceptCParser._accept  s.     jjl?sxx:5==?"r"   c                     U R                  5       nUR                  U:w  a.  U R                  SUR                   3U R	                  U5      5        U$ )NrN   )r   r   rR   rS   rT   r   s      r   _expectCParser._expect  sB    mmo88z!4dooc6JK
r"   c                 6    U R                   R                  5       $ rb   )rH   markrd   s    r   _markCParser._mark  s    ||  ""r"   r   c                 :    U R                   R                  U5        g rb   )rH   resetr   r   s     r   _resetCParser._reset  s    4 r"   rV   c                 N    U R                  UR                  UR                  5      $ rb   )r[   rY   r   r   s     r   rT   CParser._tok_coord  s    {{3::szz22r"   c                 b    U=(       d    U R                  5       nUc  gUR                  [        ;   $ NF)rQ   r   _DECL_STARTr   s     r   _starts_declarationCParser._starts_declaration  s)    !TZZ\;xx;&&r"   c                 b    U=(       d    U R                  5       nUc  gUR                  [        ;   $ r   )rQ   r   _STARTS_EXPRESSIONr   s     r   _starts_expressionCParser._starts_expression  s*    !TZZ\;xx---r"   c                 `    U R                  5       nUc  gU[        ;   a  gU R                  5       $ )NFT)r   _STARTS_STATEMENTr   r   tok_types     r   _starts_statementCParser._starts_statement  s2    ??$((&&((r"   id_onlyc                 Z    U R                  5       nUc  gUS;   a  gU(       a  US:H  $ US;   $ )NF>   TIMESLPARENTID>   r	  TYPEIDr   )r   r  r  s      r   _starts_declaratorCParser._starts_declarator  s=    ??$**t##+++r"   c                 n    U R                  5       nU R                  5       u  p#U R                  U5        X#4$ rb   )r   _scan_declarator_name_infor   )r   r   r  	saw_parens       r   _peek_declarator_name_info"CParser._peek_declarator_name_info  s3    zz|"==?D""r"   allow_abstracttypeid_paren_as_abstractc                    U R                  5       u  p4Ub  U(       at  US:X  an  U(       ag  U(       dL  U R                  5       nUb  U R                  U5      OU R                  R                  nU R                  SU5        U R                  5       nUS4$ US:X  a0  U(       a  U R                  5       nUS4$ U R                  5       n US4$ U R                  5       nUS4$ )Nr
  zInvalid declaratorFT)
r  rQ   rT   rD   rK   rR   _parse_abstract_declarator_opt _parse_typeid_noparen_declarator_parse_typeid_declarator_parse_id_declarator)r   r  r  	name_typer  rV   r^   r   s           r   _parse_any_declaratorCParser._parse_any_declarator  s      $>>@	$h)>9!jjl03,TYYEWEW!!"6>668D; '<<>
 Tz 446 Tz ,,.DTzr"   c                    SnU R                  S5      (       aZ  U R                  5       [        ;   a*  U R                  5         U R                  5       [        ;   a  M*  U R                  S5      (       a  MZ  U R	                  5       nUc  S U4$ UR
                  S;   a  U R                  5         UR
                  U4$ UR
                  S:X  a  SnU R                  5         U R                  5       u  p4U(       a  SnSn U R	                  5       nUc  S U4$ UR
                  S:X  a  US-  nO1UR
                  S:X  a!  US-  nU R                  5         US:X  a   X14$ M_  U R                  5         Mp  S U4$ )	NFr  >   r	  r
  r  Tr   RPARENr   )r   r   _TYPE_QUALIFIERr   rQ   r   r  )r   r  rV   r  nested_parendepths         r   r  "CParser._scan_declarator_name_info/  sM   	ll7##//#6 //#6 ll7## jjl;?"88''MMO88Y&&88xIMMO%)%D%D%F"H 	Ejjl;?*88x'QJEXX)QJEMMOz &&   Yr"   c                 (    U R                  5       S;   $ )N>   r  LBRACKETr  rd   s    r   "_starts_direct_abstract_declarator*CParser._starts_direct_abstract_declaratorR  s     $:::r"   c                 ^    U R                  5       nUS L=(       a    UR                  [        ;   $ rb   )rQ   r   _ASSIGNMENT_OPSr   s     r   _is_assignment_opCParser._is_assignment_opU  s%    jjl$>388#>>r"   c                 
   U R                  5       nU R                  S5      nUc  gU R                  5       (       d  U R                  U5        gU R	                  5       nU R                  S5      c  U R                  U5        gX1U4$ )a:  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_name"CParser._try_parse_paren_type_nameY  s{     zz|\\(+
''))KK##%<<!)KK*$$r"   c                     U R                  5       c  [        R                  " / 5      $ [        R                  " U R                  5       5      $ rb   )rQ   r   FileAST_parse_translation_unitrd   s    r   rP   (CParser._parse_translation_unit_or_emptyt  s5    ::<==$$}}T99;<<r"   c                     / nU R                  5       b2  UR                  U R                  5       5        U R                  5       b  M2  U$ rb   )rQ   extend_parse_external_declaration)r   exts     r   r2  CParser._parse_translation_unitz  s;    jjl&JJt779: jjl&
r"   c           
         U R                  5       nUc  / $ UR                  S:X  a  U R                  5         / $ UR                  S;   a  U R                  5       /$ U R	                  S5      (       a  / $ UR                  S:X  a  U R                  5       $ U R                  U5      (       d  U R                  5       nS nU R                  5       S:w  a  U R                  SUR                  5        [        / / / [        R                  " S/UR                  S9// S	9nU R                  UUUU R                  5       S
9nU/$ U R!                  SS9u  pFnU R#                  5       u  pUS:w  a$  U R%                  XF5      n
U R'                  S5        U
$ U R                  5       nU R                  5       S:X  d  U R                  5       (       a  S nU R                  5       (       a  U R)                  5       nU R                  5       S:w  a  U R                  SUR                  5        US   (       d  [        R                  " S/US9/US'   U R                  UUUU R                  5       S
9nU/$ [        US S S9nU R	                  S5      (       a  U R+                  5       US'   U R-                  US9n
U R/                  XJSS9n
U R'                  S5        U
$ )NPPHASH   _PRAGMAPPPRAGMASEMI_STATIC_ASSERTLBRACEzInvalid function definitionr+   r   )r   r   r   r   r   )r   r   r   r   Tallow_no_typer	  r   r   EQUALSr   )firstr   )rQ   r   _parse_pp_directive_parse_pppragma_directiver   _parse_static_assertr   r  r   rR   r^   rE   r   r   r   _parse_compound_statement_parse_declaration_specifiersr  _parse_decl_body_with_specr   _parse_declaration_list_parse_initializer_parse_init_declarator_listr   )r   rV   r   r   r   funcsaw_type
spec_coordr  _r   	decl_dicts               r   r6  #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 &
"
 668	33DCELL L((*??(D,D,D,F,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((dSW(XVr"   c                 H    U R                  5       nU R                  S5        U$ Nr>  )_parse_decl_bodyr   r   r   s     r   _parse_declarationCParser._parse_declaration  s!    %%'Vr"   c                 H    U R                  SS9u  pnU R                  X5      $ )NTrA  )rI  rJ  )r   r   rO  rQ  s       r   rV  CParser._parse_decl_body  s+     >>T>R..t>>r"   rO  c                 0   S nU(       a&  U R                  5       (       a  U R                  5       nO#U R                  SS9(       a  U R                  SS9nUc  US   n[        R                  [        R                  [        R
                  4n[        U5      S:X  aO  [        US   U5      (       a;  [        R                  " S US   US   US   US	   US   S S US   R                  S
9	/nU$ U R                  U[        S S S S9/SS9n U$ U R                  XSS9nU$ )NTr  r   r   r   r   r   r   r   r   r   r   )r  rM  r   r   r   r   rh   r   r   r^   r   rE   )r   r   rO  r   tys_u_or_es         r   rJ  "CParser._parse_decl_body_with_spec  s8    &&((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                     / nU R                  5       (       a6  UR                  U R                  5       5        U R                  5       (       a  M6  U$ rb   )r   r5  rX  rW  s     r   rK  CParser._parse_declaration_list  sA    &&((LL0023 &&((r"   rB  c           	      (   SnSnSn U R                  5       nUc  GO*UR                  S:X  a5  Uc  U R                  U5      nU R                  X R	                  5       SSS9nM[  UR                  S:X  aL  U R                  S5      S	:X  a7  Uc  U R                  U5      nU R                  X R                  5       S
SS9nSnM  UR                  [        ;   a@  Uc  U R                  U5      nU R                  X R                  5       R                  SSS9nGM  UR                  [        ;   a@  Uc  U R                  U5      nU R                  X R                  5       R                  SSS9nGM_  UR                  [        ;   a@  Uc  U R                  U5      nU R                  X R                  5       R                  SSS9nGM  UR                  [        ;   ah  Uc  U R                  U5      nU R                  5       nU R                  U[        R                  " UR                  /U R                  U5      S9S
SS9nSnGM/  UR                  S:X  ap  U(       a  OUc  U R                  U5      nU R                  5       nU R                  U[        R                  " UR                  /U R                  U5      S9S
SS9nSnGM  UR                  S;   a8  Uc  U R                  U5      nU R                  X R                  5       S
SS9nSnGM  UR                  S:X  a8  Uc  U R                  U5      nU R                  X R!                  5       S
SS9nSnGM?   Uc&  U R#                  SU R$                  R&                  5        U(       d  U(       d  U R#                  SU5        X#U4$ )av  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   rc   _ATOMICr   r  r   r   r   r   r   r
     UNIONSTRUCTENUMr   r   )rQ   r   rT   r   _parse_alignment_specifierr   _parse_atomic_specifierr  r   rS   _STORAGE_CLASS_FUNCTION_SPEC_TYPE_SPEC_SIMPLEr   r    _parse_struct_or_union_specifier_parse_enum_specifierrR   rD   rK   )r   rB  r   rO  first_coordrV   s         r   rI  %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{**r"   c           	      8   S nSnSnS n U R                  5       nUc  GOUR                  S:X  a7  Uc  U R                  U5      nU R                  XR	                  5       SSS9nSnM]  UR                  S:X  aL  U R                  S5      S:X  a7  Uc  U R                  U5      nU R                  XR                  5       S	SS9nSnM  UR                  [        ;   a@  Uc  U R                  U5      nU R                  XR                  5       R                  S
SS9nGM  UR                  [        ;   ah  Uc  U R                  U5      nU R                  5       nU R                  U[        R                  " UR                  /U R                  U5      S9S	SS9nSnGM  UR                  S:X  ap  U(       a  OUc  U R                  U5      nU R                  5       nU R                  U[        R                  " UR                  /U R                  U5      S9S	SS9nSnGM	  UR                  S;   a8  Uc  U R                  U5      nU R                  XR                  5       S	SS9nSnGMQ  UR                  S:X  a8  Uc  U R                  U5      nU R                  XR                  5       S	SS9nSnGM   Uc&  U R                  SU R                   R"                  5        U(       d  U(       d  U R                  SU5        UR%                  S5      c  / US'   UR%                  S5      c  / US'   U$ )NFTrd  r   re  rf  r   r  r   r   r   r
  rg  rj  zInvalid specifier listr   r   r   )rQ   r   rT   r   rk  r   rl  r  r   rS   ro  r   r   rp  rq  rR   rD   rK   rp   )r   r   rO  saw_alignmentrr  rV   s         r   _parse_specifier_qualifier_list'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                     / nU R                  5       [        ;   aC  UR                  U R                  5       R                  5        U R                  5       [        ;   a  MC  U$ rb   )r   r  rc   r   rS   )r   r   s     r   _parse_type_qualifier_list"CParser._parse_type_qualifier_list  sD    oo?2LL../ oo?2r"   c                    U R                  S5      nU R                  S5        U R                  5       (       aF  U R                  5       nU R                  S5        [        R                  " X R                  U5      5      $ U R                  5       nU R                  S5        [        R                  " X0R                  U5      5      $ )Nrd  r  r  )r   r   r,  r   AlignasrT   _parse_constant_expression)r   rV   r   exprs       r   rk  "CParser._parse_alignment_specifier  s    ll:&X##%%'')CLL"==ooc&:;;..0X}}T??3#788r"   c                     U R                  S5        U R                  S5        U R                  5       nU R                  S5        UR                  R                  S5        U$ )Nrf  r  r  _Atomic)r   r,  r   rc   )r   r   s     r   rl  CParser._parse_atomic_specifier  sK    YX##%X		#
r"   rD  c                     Ub  U/OU R                  US9/nU R                  S5      (       a6  UR                  U R                  US95        U R                  S5      (       a  M6  U$ )Nr]  COMMA)_parse_init_declaratorr   rc   )r   rD  r  r   s       r   rM  #CParser._parse_init_declarator_list  sk    
   G--g->? 	 ll7##LL44W4EF ll7##r"   c                     U(       a  U R                  5       OU R                  5       nS nU R                  S5      (       a  U R                  5       n[	        X#S S9$ )NrC  r   )r  _parse_declaratorr   rL  rE   )r   r  r   r   s       r   r  CParser._parse_init_declarator'  sL    .5t((*4;Q;Q;S<<!!**,D$77r"   c                 n   U R                  5       nU R                  UR                  5      nU R                  5       S;   a  U R                  5       nU R                  5       S:X  a  U R                  5         U R	                  S5      (       a!  U" UR                  / U R                  U5      S9$ U R                  5       nU R                  S5        U" UR                  X@R                  U5      S9$ U" UR                  S U R                  U5      S9$ U R                  5       S:X  at  U R                  5       nU R	                  S5      (       a  U" S / U R                  U5      S9$ U R                  5       nU R                  S5        U" S X@R                  U5      S9$ U R                  SU R                  U5      5        g )N>   r	  r
  r@  RBRACE)rl   r   r^   z Invalid struct/union declaration)	r   r   rS   r   r   rT   _parse_struct_declaration_listr   rR   )r   rV   klassname_tokr   	brace_toks         r   rp  (CParser._parse_struct_or_union_specifier3  so   mmo//		:?? 00}}H H,<<)) %^^2T__X=V  ;;=X&!uOOH<U  ^^4tx7P  ??(I||H%%$b	8RSS779ELL"d%y7QRR<dooc>RSr"   c                     / nU R                  5       S;  a<  U R                  5       nUc  M)  UR                  U5        U R                  5       S;  a  M<  U$ N>   Nr  )r   _parse_struct_declarationr5  )r   r   itemss      r   r  &CParser._parse_struct_declaration_listT  sR    oo'77224E}LL	 oo'77
 r"   c           	         U R                  5       S:X  a  U R                  5         g U R                  5       S;   a  U R                  5       /$ U R                  5       nSUR	                  S/ 5      ;  d   eS nU R                  5       (       d  U R                  5       S:X  a  U R                  5       nUb   U R                  S5        U R                  XS9$ [        US   5      S:X  ak  US   S	   n[        U[        R                  5      (       a  UnO[        R                  " U5      nU R                  S5        U R                  U[        US S S
9/S9$ U R                  S5        U R                  U[        S S S S
9/S9$ )Nr>  r;  r   r   COLONr   r   r   r   r   r   )r   r   rF  rv  rp   r  _parse_struct_declarator_listr   r   rh   r   r   Noder   rE   )r   r   r   node	decl_types        r   r  !CParser._parse_struct_declaration`  sl   ??&MMO?? 7722455335B 7777""$$(9W(D668ELL +++CCtF|!<?D$

++ 	!006	LL ++$ID$"O!P ,   	V''d4FG ( 
 	
r"   c                     U R                  5       /nU R                  S5      (       a7  UR                  U R                  5       5        U R                  S5      (       a  M7  U$ Nr  )_parse_struct_declaratorr   rc   rW  s     r   r  %CParser._parse_struct_declarator_list  sM    ..01ll7##LL6689 ll7##r"   c                    U R                  S5      (       a-  U R                  5       n[        R                  " S S S S 5      S US.$ U R	                  5       nU R                  S5      (       a  U R                  5       nUS US.$ US S S.$ )Nr  r   )r   r}  r   r   r  )r   r   r   s      r   r   CParser._parse_struct_declarator  s    <<  557GtT4>"  %%'<<  557G $7CCdt<<r"   c                 h   U R                  S5      nU R                  5       S;   a  U R                  5       nU R                  5       S:X  aa  U R                  5         U R                  5       nU R                  S5        [        R
                  " UR                  X0R                  U5      5      $ [        R
                  " UR                  S U R                  U5      5      $ U R                  S5        U R                  5       nU R                  S5        [        R
                  " S X0R                  U5      5      $ )Nrj  >   r	  r
  r@  r  )r   r   r   _parse_enumerator_listr   r   rS   rT   )r   rV   r  enumss       r   rq  CParser._parse_enum_specifier  s    ll6"?? 00}}H H,335X&zz(..%9MNN::hnndDOOC4HIIX++-Xzz$s';<<r"   c                 J   U R                  5       n[        R                  " U/UR                  5      nU R	                  S5      (       aZ  U R                  5       S:X  a   U$ U R                  5       nUR                  R                  U5        U R	                  S5      (       a  MZ  U$ )Nr  r  )_parse_enumeratorr   EnumeratorListr^   r   r   enumeratorsrc   )r   enum	enum_lists      r   r  CParser._parse_enumerator_list  s    %%'(($<	ll7## H,  ))+D!!((.	 ll7##
 r"   c                 &   U R                  S5      nU R                  S5      (       a  U R                  5       nOS n[        R                  " UR
                  X R                  U5      5      nU R                  UR                  UR                  5        U$ )Nr	  rC  )
r   r   r}  r   
EnumeratorrS   rT   ru   rl   r^   )r   r  rS   r  s       r   r  CParser._parse_enumerator  sn    <<%<<!!335EEx7PQTYY

3r"   c                 4    U R                  SSS9u  pUc   eU$ )NFr  r  )r  )r   r   rQ  s      r   r  CParser._parse_declarator  s1    ,, 5 - 
 r"   c                 "    U R                  SSS9$ )Nr   Tr   allow_paren_parse_declarator_kindrd   s    r   r  CParser._parse_id_declarator  s    **$*GGr"   c                 "    U R                  SSS9$ )NtypeidTr  r  rd   s    r   r   CParser._parse_typeid_declarator  s    **d*KKr"   c                 "    U R                  SSS9$ )Nr  Fr  r  rd   s    r   r  (CParser._parse_typeid_noparen_declarator  s    **e*LLr"   r  c                     S nU R                  5       S:X  a  U R                  5       nU R                  XS9nUb  U R                  XC5      $ U$ )Nr  r  )r   _parse_pointer_parse_direct_declaratorr   )r   r   r  ptrdirects        r   r  CParser._parse_declarator_kind  sR    ??'%%'C..t.M?))&66r"   c           	      V   U(       a8  U R                  S5      (       a"  U R                  USS9nU R                  S5        OZUS:X  a  U R                  S5      nOU R                  S5      n[        R                  " UR
                  S S S U R                  U5      S9nU R                  U5      $ )	Nr  Tr  r  r   r	  r
  r   )r   r  r   r   r   rS   rT   _parse_decl_suffixes)r   r   r  r   r  s        r   r   CParser._parse_direct_declarator  s     4<<11..t.FDLL"t|<<-<<1>>!ooh/D ((..r"   c                      U R                  5       S:X  a"  U R                  XR                  U5      5      nM7  U R                  5       S:X  a$  U R                  U5      nU R                  X5      nMo   U$ )zAParse a chain of array/function suffixes and attach them to decl.r$  r  )r   r   _parse_array_decl_parse_function_decl)r   r   rN  s      r   r  CParser._parse_decl_suffixes  sl     J.--d4J4J44PQ H,006--d9r"   	base_declc                 6    U R                  S UR                  S9$ N)	base_typer^   )_parse_array_decl_commonr^   )r   r  s     r   r  CParser._parse_array_decl	  s    ,,t9??,SSr"   r  c                   ^^ U R                  S5      nTc  U R                  U5      mUU4S jnU R                  S5      (       aF  S/U R                  5       =(       d    / -   nU R	                  5       nU R                  S5        U" Xe5      $ U R                  5       [        ;   a  U R                  5       =(       d    / nU R                  S5      (       a/  US/-   nU R	                  5       nU R                  S5        U" Xe5      $ U R                  S5      nU(       aI  U R                  S5        [        R                  " UR                  U R                  U5      5      nU" Xe5      $ SnU R                  5       (       a  U R	                  5       nU R                  S5        U" Xe5      $ U R                  S5      nU(       aJ  U R                  S5        [        R                  " UR                  U R                  U5      5      nU" U/ 5      $ SnU R                  5       (       a  U R	                  5       nU R                  S5        U" U/ 5      $ )a	  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                 0   > [         R                  " TXTS9$ )N)r   dim	dim_qualsr^   )r   	ArrayDecl)r  r  r  r^   s     r   make_array_decl9CParser._parse_array_decl_common.<locals>.make_array_decl  s    ??CE r"   STATICstaticRBRACKETr  )r   rT   r   ry  _parse_assignment_expressionr   r  r   r	  rS   r   )r   r  r^   
lbrack_tokr  r  r  	times_toks    ``     r   r   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(&s66W-IZ(hhy	0JK&s66C&&((779LL$"322LL)	LL$((9??DOOI,FGC"3++""$$335CZ sB''r"   c                 H   U R                  S5        U R                  S5      (       a  S nOFU R                  5       (       a  U R                  5       OU R	                  5       nU R                  S5        [
        R                  " US UR                  S9nU R                  5       S:X  a}  UR                  bp  UR                  R                   HV  n[        U[
        R                  5      (       a    U$ [        USS 5      nU(       d  M;  U R                  XTR                  5        MX     U$ )Nr  r  argsr   r^   r@  rl   )r   r   r   _parse_parameter_type_list_parse_identifier_list_optr   r   r^   r   r  paramsr   EllipsisParamgetattrru   )r   r  r  rN  paramrl   s         r   r  CParser._parse_function_declF  s    X<<!!D ++-- //1446 
 LL"~~4d)//J??(yy$!YY--E!%)<)<==
 	 #5&$7Dt,,T;;? . r"   c                 6   / nU R                  S5      nU(       aT  U R                  5       =(       d    / nUR                  X0R                  U5      45        U R                  S5      nU(       a  MT  U(       d  g S nU H  u  p5[        R
                  " X4US9nM     U$ )Nr  )r   r   r^   )r   ry  rc   rT   r   PtrDecl)r   starsr  r   r  r^   s         r   r  CParser._parse_pointer`  s    LL)	335;ELL%!;<=W-I i
 !LE--eUCC "
r"   c                 4   U R                  5       nU R                  5       S:X  as  U R                  S5      S:X  a^  U R                  5         U R                  5       nUR                  R	                  [
        R                  " U R                  U5      5      5        U$ Nr  r   ELLIPSIS)_parse_parameter_listr   r   r  rc   r   r  rT   )r   r  ell_toks      r   r  "CParser._parse_parameter_type_listq  sn    ++-??'DOOA,>*,LMMOmmoGMM  !4!4T__W5M!NOr"   c                    U R                  5       n[        R                  " U/UR                  5      nU R	                  5       S:X  ay  U R	                  S5      S:w  ad  U R                  5         UR                  R                  U R                  5       5        U R	                  5       S:X  a  U R	                  S5      S:w  a  Md  U$ r  )_parse_parameter_declarationr   	ParamListr^   r   r   r  rc   r   rD  r  s      r   r  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           	      l   U R                  SS9u  pnUS   (       d  [        R                  " S/US9/US'   U R                  5       (       aH  U R	                  SSS9u  pEU(       a  U R                  U[        US S S9/S9S	   $ U R                  XU5      $ U R                  5       nU R                  XU5      $ )
NTrA  r   r+   r   r  r   r  r   )	rI  r   r   r  r  r   rE   _build_parameter_declarationr  )r   r   rQ  rP  r   is_nameds         r   r  $CParser._parse_parameter_declaration  s    "@@t@TF|!00%
KLDL""$$!77#d 8 ND //d4&N%O 0   44TLL22400ZHHr"   rP  c                    [        US   5      S:  ae  [        US   S   R                  5      S:X  aF  U R                  US   S   R                  S   5      (       a  U R                  U[	        US S S9/S9S   $ [
        R                  " SUS   S U=(       d    [
        R                  " S S S S 5      US	9nU R                  X!S   5      $ )
Nr   r   rn   r   r   r  r3   r   rl   r   r   r   r^   )	rh   r   r{   r   rE   r   Typenamer   r   )r   r   r   rP  s       r   r  $CParser._build_parameter_declaration  s     V!DL$**+q0&&tF|B'7'='=a'@AA++$DtT"J!K ,   ~~v,?dD$?
 ''6l;;r"   c                 L    U R                  5       S:X  a  g U R                  5       $ Nr  )r   _parse_identifier_listrd   s    r   r  "CParser._parse_identifier_list_opt  s#    ??(**,,r"   c                    U R                  5       n[        R                  " U/UR                  5      nU R	                  S5      (       aA  UR
                  R                  U R                  5       5        U R	                  S5      (       a  MA  U$ r  )_parse_identifierr   r  r^   r   r  rc   r  s      r   r  CParser._parse_identifier_list  sf    &&(%%++6ll7##MM  !7!7!9: ll7##r"   c                 r   U R                  5       nU R                  5       nS nUb  UR                  nOUS   (       a  US   S   R                  n[        R                  " SUS   S S  S U=(       d    [        R
                  " S S S S 5      US9n[        [        R                  U R                  XAS   5      5      $ )Nr   r   r3   r   r   )rv  r  r^   r   r  r   r   r   )r   r   r   r^   r   s        r   r,  CParser._parse_type_name  s    335224JJE&\LO))E>>v,q/?dD$?
 ENND$<$<XF|$TUUr"   c                 @   U R                  5       S:X  ae  U R                  5       nU R                  5       (       a  U R                  5       nO[        R
                  " S S S S 5      nUc   eU R                  X!5      $ U R                  5       (       a  U R                  5       $ g )Nr  )r   r  r%  !_parse_direct_abstract_declaratorr   r   r   )r   r  r   s      r   r  &CParser._parse_abstract_declarator_opt  s    ??'%%'C6688==?~~dD$=?"?))$44224499;;r"   c           	      F   U R                  S5      nU(       a  U R                  5       (       d  U R                  5       S:X  a^  U R                  5       nU R	                  S5        [
        R                  " U[
        R                  " S S S S 5      U R                  U5      S9nOrU R                  5       nU R	                  S5        Uc   eOKU R                  5       S:X  a  U R                  5       nO&U R                  SU R                  R                  5        U R                  W5      $ )Nr  r  r  r$  zInvalid abstract declarator)r   r   r   _parse_parameter_type_list_optr   r   r   r   rT   r  _parse_abstract_array_baserR   rD   rK   r  )r   r-  r  r   s       r   r  )CParser._parse_direct_abstract_declarator  s    \\(+
''))T__->(-J<<>X&~~dD$?//*5 ::<X&'''__*,224D;TYY=O=OP((..r"   c                 L    U R                  5       S:X  a  g U R                  5       $ r  )r   r  rd   s    r   r  &CParser._parse_parameter_type_list_opt  s#    ??(..00r"   c                 P    U R                  [        R                  " S S S S 5      S S9$ r  )r  r   r   rd   s    r   r  "CParser._parse_abstract_array_base  s.    ,,nnT4t<D - 
 	
r"   c                 ~   U R                  5       nU==S:X  a  O	=S:X  a  O  O    U R                  5       $ =S:X  a&  U R                  S5      S:X  a    U R                  5       $ =S:X  a    U R                  5       $ ==S:X  a  O	=S:X  a  O  O    U R                  5       $ ==S	:X  a  O=S
:X  a  O	=S:X  a  O  O    U R	                  5       $ ==S:X  a  O=S:X  a  O=S:X  a  O	=S:X  a  O  O    U R                  5       $ ==S:X  a  O	=S:X  a  O  O    U R                  5       $ S:X  a  U R                  5       $  U R                  5       $ )NCASEDEFAULTr	  r   r  r@  IFSWITCHWHILEDOFORGOTOBREAKCONTINUERETURNr=  r<  r?  )	r   _parse_labeled_statementrH  _parse_selection_statement_parse_iteration_statement_parse_jump_statementrF  rG  _parse_expression_statementr  s     r   _parse_statement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                     U R                  5       S;   aE  U R                  5       nU R                  5       n[        R                  " X/-   US   R
                  S9$ U R                  5       $ )Nr;  r   block_itemsr^   )r   _parse_pppragma_directive_listr(  r   Compoundr^   )r   pragmasstmts      r   _parse_pragmacomp_or_statement&CParser._parse_pragmacomp_or_statement$  s]    ?? 7799;G((*D>>g.>gajFVFVWW$$&&r"   c                 l    U R                  5       (       a  U R                  5       $ U R                  5       $ rb   )r   rX  r(  rd   s    r   _parse_block_itemCParser._parse_block_item,  s/    ##%%**,,$$&&r"   c                     / nU R                  5       S;  ag  U R                  5       n[        U[        5      (       a  US /:X  a  MB  UR	                  U5        OUR                  U5        U R                  5       S;  a  Mg  U$ r  )r   r4  r   listr5  rc   )r   r  items      r   _parse_block_item_listCParser._parse_block_item_list2  so    oo'77))+D$%%D6>T"T" oo'77 r"   c                     U R                  S5      nU R                  S5      (       a$  [        R                  " S U R	                  U5      S9$ U R                  5       nU R                  S5        [        R                  " X R	                  U5      S9$ )Nr@  r  r+  )r   r   r   r.  rT   r9  )r   
lbrace_tokr,  s      r   rH  !CParser._parse_compound_statement?  sp    \\(+
<<!!>>d$//*:UVV113X~~#??:+F
 	
r"   c                 >   U R                  5       nU=S:X  a    U R                  5       nU R                  S5        U R                  5       (       a  U R	                  5       nO%[
        R                  " U R                  U5      5      n[
        R                  " UR                  X0R                  U5      5      $ =S:X  a    U R                  5       nU R                  5       nU R                  S5        U R                  5       (       a  U R	                  5       nO%[
        R                  " U R                  U5      5      n[
        R                  " XS/U R                  U5      5      $ S:X  a  U R                  5       nU R                  S5        U R                  5       (       a  U R	                  5       nO%[
        R                  " U R                  U5      5      n[
        R                  " U/U R                  U5      5      $  U R                  SU R                  R                  5        g )Nr	  r  r  r  zInvalid labeled statement)r   r   r   r  r1  r   EmptyStatementrT   LabelrS   r}  CaseDefaultrR   rD   rK   )r   r  r  r0  case_tokr~  def_toks          r   r#   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           	         U R                  5       nUR                  =S:X  a    U R                  S5        U R                  5       nU R                  S5        U R	                  5       nU R                  S5      (       a6  U R	                  5       n[        R                  " X#X@R                  U5      5      $ [        R                  " X#S U R                  U5      5      $ S:X  aq  U R                  S5        U R                  5       nU R                  S5        U R	                  5       n[        [        R                  " XVU R                  U5      5      5      $  U R                  SU R                  U5      5        g )Nr  r  r  ELSEr  zInvalid selection statement)r   r   r   _parse_expressionr1  r   r   IfrT   r   SwitchrR   )r   rV   cond	then_stmt	else_stmtr~  r0  s          r   r$  "CParser._parse_selection_statementm  s   mmohhX&--/X& ??A	<<'' $ C C EI 88DYPS@TUUxxts7KLLX&--/X&::<'TQTAU(VWW!!"?QTAUVr"   c           	      f   U R                  5       nUR                  =S:X  ai    U R                  S5        U R                  5       nU R                  S5        U R	                  5       n[
        R                  " X#U R                  U5      5      $ =S:X  a    U R	                  5       nU R                  S5        U R                  S5        U R                  5       nU R                  S5        U R                  S5        [
        R                  " X#U R                  U5      5      $ S:X  Gan  U R                  S5        U R                  5       (       a  U R                  5       n[
        R                  " X@R                  U5      5      nU R                  5       nU R                  S5        U R                  5       nU R                  S5        U R	                  5       n[
        R                  " XRXcU R                  U5      5      $ U R                  5       nU R                  S5        U R                  5       nU R                  S5        U R                  5       nU R                  S5        U R	                  5       n[
        R                  " XRXcU R                  U5      5      $  U R                  SU R                  U5      5        g )Nr  r  r  r  r>  r  zInvalid iteration statement)r   r   r   rH  r1  r   WhilerT   DoWhiler   rX  DeclList_parse_expression_optForrR   )r   rV   rK  r0  r   r   	next_exprs          r   r%  "CParser._parse_iteration_statement  s   mmohhX&--/X&::<{{4ts/CDD::<W%X&--/X&V$}}T1EFFX&++-- 335E >>%1EFD557DLL( $ : : <ILL*>>@D 99T$//RUBVWW113V$113V$ 668	X&::<yyYdooc>RSS!!"?QTAUVr"   c                 2   U R                  5       nUR                  =S:X  aS    U R                  S5      nU R                  S5        [        R                  " UR
                  U R                  U5      5      $ =S:X  a7    U R                  S5        [        R                  " U R                  U5      5      $ =S:X  a7    U R                  S5        [        R                  " U R                  U5      5      $ S:X  a  U R                  S5      (       a&  [        R                  " S U R                  U5      5      $ U R                  5       nU R                  S5        [        R                  " X0R                  U5      5      $  U R                  SU R                  U5      5        g )Nr  r	  r>  r   r!  r"  zInvalid jump statement)r   r   r   r   GotorS   rT   BreakContinuer   ReturnrH  rR   )r   rV   r  r~  s       r   r&  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                     U R                  5       nU R                  S5      nUc%  [        R                  " U R	                  U5      5      $ U$ rU  )rS  r   r   r?  rT   )r   r~  semi_toks      r   r'  #CParser._parse_expression_statement  sB    ))+<<'<''(ABBr"   c                 N    U R                  5       (       a  U R                  5       $ g rb   )r   rH  rd   s    r   rS  CParser._parse_expression_opt  s#    ""$$))++r"   c                 N   U R                  5       nU R                  S5      (       d  U$ XR                  5       /nU R                  S5      (       a7  UR                  U R                  5       5        U R                  S5      (       a  M7  [        R                  " X!R
                  5      $ r  r  r   rc   r   ExprListr^   r   r~  exprss      r   rH  CParser._parse_expression  s}    002||G$$K88:;ll7##LL::<= ll7##~~eZZ00r"   c                    U R                  5       S:X  aH  U R                  S5      S:X  a3  U R                  5         U R                  5       nU R                  S5        U$ U R	                  5       nU R                  5       (       aK  U R                  5       R                  nU R                  5       n[        R                  " X2XBR                  5      $ U$ )Nr  r   r@  r  )r   r   rH  r   _parse_conditional_expressionr)  rS   r  r   
Assignmentr^   )r   compr~  oprhss        r   r  $CParser._parse_assignment_expression  s    ??(T__Q-?8-KMMO113DLL"K113!!##&&B335C##Bc::>>r"   c                     U R                  5       nU R                  S5      (       aR  U R                  5       nU R                  S5        U R	                  5       n[
        R                  " XX1R                  5      $ U$ )NCONDOPr  )_parse_binary_expressionr   rH  r   ri  r   	TernaryOpr^   )r   r~  iftrueiffalses       r   ri  %CParser._parse_conditional_expression  sa    ,,.<<!!++-FLL!88:G??4**EEr"   min_preclhsc                    Uc  U R                  5       n U R                  5       nUb  UR                  [        ;  a   U$ [        UR                     nXA:  a   U$ UR                  nU R                  5         U R                  5       n U R                  5       nUb  UR                  [        ;  a  O-[        UR                     nX:  a  U R                  X5      nOOMU  [        R                  " XRXbR                  5      nM  rb   )
_parse_cast_expressionrQ   r   _BINARY_PRECEDENCErS   r   rq  r   BinaryOpr^   )	r   rv  rw  rV   precrl  rm  next_tok	next_precs	            r   rq   CParser._parse_binary_expression  s     ;--/C**,C{chh.@@* 
) &chh/D$ 
! BMMO--/C::<#x}}<N'N.x}}=	#77	GC  ..#yy9C- r"   c                 (   U R                  5       nUbp  Uu  p#nU R                  5       S:X  a!  U R                  U5        U R                  5       $ U R                  5       n[        R
                  " X%U R                  U5      5      $ U R                  5       $ )Nr@  )r.  r   r   ry  r   CastrT   _parse_unary_expression)r   resultr   r   r-  r~  s         r   ry  CParser._parse_cast_expression  s    002$*!Cz H, D! ++-- 224zz#T__Z-HII++--r"   c                    U R                  5       nUS;   aK  U R                  5       nU R                  5       n[        R                  " UR
                  X3R                  5      $ US;   aK  U R                  5       nU R                  5       n[        R                  " UR
                  X3R                  5      $ US:X  a  U R                  5       nU R                  5       nUb6  Uu  n  n[        R                  " UR
                  XPR                  U5      5      $ U R                  5       n[        R                  " UR
                  X0R                  U5      5      $ US:X  ar  U R                  5       nU R                  S5        U R                  5       nU R                  S5        [        R                  " UR
                  XPR                  U5      5      $ U R                  5       $ )N   PLUSPLUS
MINUSMINUS>   ANDNOTLNOTPLUSMINUSr  SIZEOF_ALIGNOFr  r  )r   r   r  r   UnaryOprS   r^   ry  r.  rT   r   r,  _parse_postfix_expression)r   r  rV   r~  r  r   rQ  s          r   r  CParser._parse_unary_expression4  sf   ??$11--/C//1D==D**==GG--/C..0D==D**==x--/C446F!"	Q}}SYY__S5IJJ//1D==D//#2FGGz!--/CLL"'')CLL"==C1EFF--//r"   c                    U R                  5       nUbt  Uu  p#nU R                  S5      (       aH  U R                  5       nU R                  S5        U R                  S5        [        R
                  " X%5      $ U R                  U5        U R                  5       n U R                  S5      (       aD  U R                  5       nU R                  S5        [        R                  " XgUR                  5      nM[  U R                  S5      (       ak  U R                  5       S:X  a  U R                  5         S nO!U R                  5       nU R                  S5        [        R                  " XhUR                  5      nM  U R                  5       S;   a  U R                  5       n	U R                  5       n
U
R                  S	;  a!  U R!                  S
U R#                  U
5      5        [        R$                  " U
R&                  U R#                  U
5      5      n[        R(                  " XiR&                  XR                  5      nGM  U R                  5       S;   aA  U R                  5       n[        R*                  " SUR&                  -   XfR                  5      nGM   U$ )Nr@  r  r  r$  r  r  r  >   ARROWPERIOD>   r	  r
  zInvalid struct referencer  p)r.  r   _parse_initializer_listr   r   CompoundLiteralr   _parse_primary_expressionrH  ArrayRefr^   r   r   _parse_argument_expression_listFuncCallr   rR   rT   r	  rS   	StructRefr  )r   r  r   r   rQ  r   r~  subr  op_tokr  fieldrV   s                r   r  !CParser._parse_postfix_expressionT  s   002!LCq ||H%%335W%X&,,S77D!--/||J'',,.Z(~~d<||H%%??$0MMOD??ADLL*~~d$**= $77==?==(88%%2DOOH4M 1JKt\\5**M $>>mmo}}S399_dJJGr"   c                 `   U R                  5       nUS:X  a  U R                  5       $ U[        ;   d  U[        ;   d
  U[        ;   a  U R                  5       $ U[        ;   a  U R                  5       $ U[        ;   a  U R                  5       $ US:X  a3  U R                  5         U R                  5       nU R                  S5        U$ US:X  a  U R                  5       nU R                  S5        U R                  5       nU R                  S5        U R                  5       nU R                  S5        U R                  U5      n[         R"                  " [         R$                  " UR&                  U5      [         R(                  " XE/U5      U5      $ U R+                  SU R,                  R.                  5        g )Nr	  r  r  OFFSETOFr  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   rH  r   r,  !_parse_offsetof_member_designatorrT   r   r  r	  rS   rd  rR   rD   rK   )r   r  r~  off_tokr   
designatorr^   s          r   r  !CParser._parse_primary_expression  s_   ??$t))++
"<';&''))&5577}$6688xMMO))+DLL"Kz!mmoGLL"'')CLL!??AJLL"OOG,E>>.0%8  	.		0B0BCr"   c                 r   U R                  5       n U R                  S5      (       a4  U R                  5       n[        R                  " USX!R                  5      nMK  U R                  S5      (       aD  U R                  5       nU R                  S5        [        R                  " XUR                  5      nM   U$ )Nr  .r$  r  )_parse_identifier_or_typeidr   r   r  r^   rH  r   r  )r   r  r  r~  s       r   r  )CParser._parse_offsetof_member_designator  s    //1||H%%88:tS%D||J''--/Z(~~d$**=r"   c                    U R                  5       nU/nU R                  S5      (       a7  UR                  U R                  5       5        U R                  S5      (       a  M7  [        R                  " X!R
                  5      $ r  rc  re  s      r   r  'CParser._parse_argument_expression_list  s_    002ll7##LL::<= ll7##~~eZZ00r"   c                 "    U R                  5       $ rb   )ri  rd   s    r   r}  "CParser._parse_constant_expression  s    1133r"   c                     U R                  S5      n[        R                  " UR                  U R	                  U5      5      $ )Nr	  )r   r   r	  rS   rT   r   s     r   r  CParser._parse_identifier  s.    ll4 xx		4??3#788r"   c                     U R                  5       nUR                  S;  a!  U R                  SU R                  U5      5        [        R
                  " UR                  U R                  U5      5      $ )N>   r	  r
  zExpected identifier)r   r   rR   rT   r   r	  rS   r   s     r   r  #CParser._parse_identifier_or_typeid  sR    mmo88++3T__S5IJxx		4??3#788r"   c                 &   U R                  5       nUR                  [        ;   a  SnSnUR                  SS   H  nUS;   a  US-  nM  US;   d  M  US-  nM     US:  a  [	        S5      eUS:  a  [	        S5      eS	U-  S
U-  -   n[
        R                  " US-   UR                  U R                  U5      5      $ UR                  [        ;   a^  UR                  S   S;   a  SnOUR                  S   S;   a  SnOSn[
        R                  " XaR                  U R                  U5      5      $ UR                  [        ;   a1  [
        R                  " SUR                  U R                  U5      5      $ U R                  SU R                  U5      5        g )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+   rn   )fFfloatzlong doubledoublecharzInvalid constant)r   r   r  rS   
ValueErrorr   ConstantrT   r  r  rR   )r   rV   u_countl_countchprefixr   s          r   r  CParser._parse_constant  sX   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*,!>>!YY0DEE88{">>&#))T__S5IJJ,dooc.BCr"   c                 F   U R                  S5      n[        R                  " SUR                  U R	                  U5      5      nU R                  5       S:X  aJ  U R                  5       nUR                  S S UR                  SS  -   Ul        U R                  5       S:X  a  MJ  U$ )NSTRING_LITERALstringrn   r   )r   r   r  rS   rT   r   r   r   rV   r  tok2s       r   r  %CParser._parse_unified_string_literal  s    ll+,~~h		4??33GHoo#33==?DCR4::ab>9DJ oo#33 r"   c                    U R                  5       nUR                  [        ;  a!  U R                  SU R	                  U5      5        [
        R                  " SUR                  U R	                  U5      5      nU R                  5       [        ;   a\  U R                  5       nUR                  R                  5       S S UR                  SS  -   Ul        U R                  5       [        ;   a  M\  U$ )NzInvalid string literalr  rn   r   )
r   r   r  rR   rT   r   r  rS   r   rstripr  s       r   r  &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                 2   U R                  S5      nU(       ap  U R                  S5      (       a&  [        R                  " / U R                  U5      5      $ U R	                  5       nU R                  S5        U R                  S5        U$ U R                  5       $ )Nr@  r  r  )r   r   InitListrT   r  r   r  )r   r<  	init_lists      r   rL  CParser._parse_initializer  sw    \\(+
||H%%~~b$//**EFF446ILL!LL"0022r"   c                 .   U R                  5       /nU R                  S5      (       aL  U R                  5       S:X  a  O7UR                  U R                  5       5        U R                  S5      (       a  ML  [        R
                  " XS   R                  5      $ )Nr  r  r   )_parse_initializer_itemr   r   rc   r   r  r^   )r   r  s     r   r  CParser._parse_initializer_list  ss    --/0ll7## H,LL5578 ll7## ~~e1X^^44r"   c                     S nU R                  5       S;   a  U R                  5       nU R                  5       nUb  [        R                  " X5      $ U$ N>   r  r$  )r   _parse_designationrL  r   NamedInitializer)r   designationr   s      r   r  CParser._parse_initializer_item%  sO    ?? 66113K&&("))+<<r"   c                 H    U R                  5       nU R                  S5        U$ )NrC  )_parse_designator_listr   r   designatorss     r   r  CParser._parse_designation/  s"    113Xr"   c                     / nU R                  5       S;   a5  UR                  U R                  5       5        U R                  5       S;   a  M5  U$ r  )r   rc   _parse_designatorr  s     r   r  CParser._parse_designator_list5  sF    oo#99t5578 oo#99r"   c                    U R                  S5      (       a#  U R                  5       nU R                  S5        U$ U R                  S5      (       a  U R                  5       $ U R	                  SU R
                  R                  5        g )Nr$  r  r  zInvalid designator)r   r}  r   r  rR   rD   rK   )r   r~  s     r   r  CParser._parse_designator=  si    <<
##224DLL$K<<!!3355.		0B0BCr"   c                 h    U R                  S5      nU R                  SU R                  U5      5        g )Nr:  zDirectives not supported yet)r   rR   rT   r   s     r   rE  CParser._parse_pp_directiveJ  s*    ll8$8$//#:NOr"   c                    U R                  5       S:X  a  U R                  5       nU R                  5       S:X  a@  U R                  5       n[        R                  " UR                  U R                  U5      5      $ [        R                  " SU R                  U5      5      $ U R                  5       S:X  ag  U R                  5       nU R                  S5      nU R                  5       nU R                  S5        [        R                  " X@R                  U5      5      $ U R                  SU R                  R                  5        g )Nr=  PPPRAGMASTRr3   r<  r  r  zInvalid pragma)r   r   r   PragmarS   rT   r   r  rR   rD   rK   )r   rV   str_toklparenliterals        r   rF  !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                     / nU R                  5       S;   a5  UR                  U R                  5       5        U R                  5       S;   a  M5  U$ )Nr;  )r   rc   rF  )r   r/  s     r   r-  &CParser._parse_pppragma_directive_listb  sC    oo#::NN499;< oo#::r"   c                 &   U R                  S5      nU R                  S5        U R                  5       nS nU R                  S5      (       a  U R                  5       nU R                  S5        [        R
                  " X#U R                  U5      5      /$ )Nr?  r  r  r  )r   r}  r   r  r   StaticAssertrT   )r   rV   rK  r]   s       r   rG  CParser._parse_static_asserti  sx    ll+,X..0<<  446CX""4dooc.BCDDr"   )rF   rH   rD   )r3   Frb   )r   N)Fr   )FF)r   r   r   )r   r   )T)r   N)r$   r%   r&   r'   r(   r   boolr   r)   rI   r   r1  rW   r+   r	   r   r[   r   rR   re   rj   rr   ru   r{   r@   rA   rB   rC   r   r  r   r   r   r  r   r   r   r   r   r   r   rQ   r   r   r   r   r   r   rT   r   r   r  r  r
   r  r  r  r%  r)  r.  rP   r2  r6  rX  rV  rJ  rK  rI  rv  ry  rk  rl  rM  r  rp  r  r  r  r  rq  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(  r1  r4  r9  rH  r#  r$  r%  r&  r'  rS  rH  r  ri  rq  ry  r  r  r  r  r  r}  r  r  r  r  r  rL  r  r  r  r  r  rE  rF  r-  rG  r,   r#   r"   r   r1   r1   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"   r1   >   rC  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>   CONSTrf  RESTRICTVOLATILE>   INTCHARLONGVOIDFLOATSHORT_BOOLDOUBLESIGNEDUNSIGNED_COMPLEX__INT128>   rj  rh  ri  r
  rf  rd  >   r	  r  r  r  r  r  r  r  r  r  r  r  r  >   INT_CONST_BININT_CONST_DECINT_CONST_HEXINT_CONST_OCTINT_CONST_CHARFLOAT_CONSTHEX_FLOAT_CONST>   
CHAR_CONSTWCHAR_CONSTU8CHAR_CONSTU16CHAR_CONSTU32CHAR_CONSTr  >   WSTRING_LITERALU8STRING_LITERALU16STRING_LITERALU32STRING_LITERAL>   r  r  r  r  r  r>  r   r  r@  r"  r  r  r<  r!  r=  r?  c                       \ rS rSrSrS\SS4S jrSS\S\\	   4S jjr
S\\	   4S	 jrS\4S
 jrS\SS4S jrS\SS4S jrSrg)rG   i  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.
r5   r   Nc                 ,    Xl         / U l        SU l        g )Nr   )_lexer_buffer_index)r   r5   s     r   rI   _TokenStream.__init__	  s    /1r"   r   c                 p    US::  a  gU R                  U5        U R                  U R                  U-   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   _fillrF  rG  r   s     r   r   _TokenStream.peek
	  s5     6

1||DKK!Oa/00r"   c                     U R                  S5        U R                  U R                     nU =R                  S-  sl        U$ )z%Consume a single token and return it.r   rJ  r   s     r   r   _TokenStream.next	  s2    

1ll4;;'q
r"   c                     U R                   $ rb   rG  rd   s    r   r   _TokenStream.mark"	  s    {{r"   r   c                     Xl         g rb   rP  r   s     r   r   _TokenStream.reset%	  s    r"   nc                    [        U R                  5      U R                  U-   :  ab  U R                  R	                  5       nU R                  R                  U5        Uc  g [        U R                  5      U R                  U-   :  a  Ma  g g rb   )rh   rF  rG  rE  r   rc   )r   rT  rV   s      r   rK  _TokenStream._fill(	  sb    $,,$++/1++##%CLL${	 $,,$++/1r"   )rF  rG  rE  r  )r$   r%   r&   r'   r(   r   rI   r+   r	   r   r   r   r   r   rK  r,   r#   r"   r   rG   rG     su    
f  

1c 
1(6"2 
1hv& c # $ s t r"   rG   c                   f    \ rS rSr% \\   \S'   \\   \S'   \\   \S'   \\   \S'   \\   \S'   Srg)	r   i6	  r   r   r   r   r   r#   N)r$   r%   r&   r'   r   r   r*   r,   r#   r"   r   r   r   6	  s2    
s)O#Y
s)O3iCyr"   r   r   c                       \ rS rSr% \\R                     \S'   \\R                     \S'   \\R                     \S'   Srg)r   iA	  r   r   r   r#   N)	r$   r%   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   r3   r   c_lexerr   r   ast_transformsr   r   r   	Exceptionr.   r1   r(  rz  rm  rn  r  ro  r   _EXPR_STARTr  r  r  r  r  r   r   rG   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"   