|i^>ddlmZddlmZmZmZmZmZmZm Z m Z m Z ddl m Z ddlmZmZddlmZmZeGddZGd d eZGd d Zhd Ziddddddddddddddddddddddddd dd!d"d#d"d$d%d&d%d'd%iZhd(Zd)d*hZhd+Zhd,Zeezezezhd-zZhd.Zhd/Z d0d1hZ!hd2Z"d3hZ#hd4Z$ee ze!ze"ze#ze$zZ%hd5Z&Gd6d7Z'Gd8d9e Z(ed:Z)Gd;d) dataclass) AnyDictListLiteralNoReturnOptionalTuple TypedDictcast)c_ast)CLexer_Token)fix_switch_casesfix_atomic_specifierscNeZdZUdZeed<eed<dZeeed<defdZ dS)CoordzkCoordinates of a syntactic element. Consists of: - File name - Line number - Column number filelineNcolumnreturncP|jd|j}|jr |d|jz }|S)N:rrr)selftexts @C:\PYTHON\_runtimes\venv\Lib\site-packages\pycparser/c_parser.py__str__z Coord.__str__'s=)))di)) ; & % %% %D ) __name__ __module__ __qualname____doc__str__annotations__intrr rr rrrsc III III FHSM   r rceZdZdS) ParseErrorN)r!r"r#r(r rr*r*.sDr r*c eZdZdZdedddddfdedeed ed ed ed ed eddfdZ ddededede j fdZ dde de e defdZdedeezdzdefdZddZddZdede eddfdZdede eddfdZdedefd Zded!e de ddfd"Zdd#Zdd$Zdedefd%Zd&ed'ede jfd(Zd&e je jze j zd)e!ede je jze j zfd*Z" dd+e d,d-ed.d/d0edd,f d1Z# dd2d,d3e!d4d5ede!e jfd6Z$d2d,d&e jd7e e!e jd8e jde jf d9Z%d:edefd;Z&dd=e de e'fd>Z(dd=e de efd?Z)de'fd@Z*dAede e'fdBZ+dAede'fdCZ,de fdDZ-dEe ddfdFZ.dGe'defdHZ/ddGe e'defdIZ0ddGe e'defdJZ1defdKZ2ddLedefdMZ3de4e eeffdNZ5 ddOedPede4e e jeffdQZ6de4e eeffdRZ7defdSZ8defdTZ9de e4e j e e'ffdUZ:de j fdVZ;de!e jfdWZde!e jfdZZ?d2d,d[ede!e jfd\Z@de!e jfd]ZA dd^ede4d,ee effd_ZBdd`ZCde!efdaZDde jfdbZEde jfdcZF ddde d4dLede!d4fdeZGddLedd4fdfZHde jfdgZIde!e jfdhZJde e!e jfdiZKde!d4fdjZLddkZMde jfdlZNde jfdmZOde jfdnZPde jfdoZQde jfdpZRde jfdqZSde jfdrZTd.edsede jfdtZU dd.edsede jfduZVd&e jde jfdvZWdwe jde jfdxZX ddye e jde ede jfdzZYdwe jde jfd{ZZde e jfd|Z[de j\fd}Z]de j\fd~Z^de jfdZ_d2d,d&e e jde ede jfdZ`de e jfdZade jfdZbde j fdZcde e jfdZdde jfdZede e j\fdZfde jfdZgde je!e jzfdZhde je!e jzfdZide je!e jzfdZjde!e jfdZkde jfdZlde jfdZmde jfdZnde jfdZode jfdZpde jfdZqde e jfdZrde jfdZsde jfdZtde jfdZu dde de e jde jfdZvde jfdZwde jfdZxde jfdZyde jfdZzde jfdZ{de jfdZ|de jfdZ}de jfdZ~de jfdZde jfdZde jfdZde jfdZde jfdZde jfdZde jfdZde!e jfdZde!e jfdZde jfdZdefdZde jfdZde!e jfdZde!e jfdZdS)CParseraFRecursive-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. Tzpycparser.lextabzpycparser.yacctabF lex_optimizelexerlextab yacc_optimizeyacctab yacc_debug taboutputdirrNc||j|j|j|j|_t g|_t|j|_dS)N) error_funcon_lbrace_funcon_rbrace_functype_lookup_func) _lex_error_func_lex_on_lbrace_func_lex_on_rbrace_func_lex_type_lookup_funcclexdict _scope_stack _TokenStream_tokens)rr.r/r0r1r2r3r4s r__init__zCParser.__init__>sY"E+33!7     59FF8%1$)%<%< r rfilenamedebugcLtg|_|j||t |j|_|}|}|1|d|j | ||S)a-Parses C code and returns an AST. text: A string containing the C source code filename: Name of the file being parsed (for meaningful error messages) debug: Deprecated debug flag (unused); for backwards compatibility. Nbefore: ) r?r@r>inputrArB _parse_translation_unit_or_empty_peek _parse_errorvalue _tok_coord)rrrDrEasttoks rparsez CParser.parseZs"VVH h'''#DI.. 3355jjll ?   444dooc6J6J K K K r linenorc:t|jj||S)Nr)rr>rD)rrQrs r_coordzCParser._coordvs$),6&IIIIr msgcoordc*t|d|)Nz: )r*)rrTrUs rrKzCParser._parse_errorysE**S**+++r cR|jtdSN)r@appendr?rs r _push_scopezCParser._push_scope|s#   (((((r clt|jdksJ|jdS)Nr )lenr@poprZs r _pop_scopezCParser._pop_scopes94$%%)))) r namec|jd|ds|d|d|d|jd|<dS)z9Add a new typedef name (ie a TYPEID) to the current scopeTzTypedef z1 previously declared as non-typedef in this scopeNr@getrKrr`rUs r_add_typedef_namezCParser._add_typedef_namese $((t44    T4TTT   '+"d###r c|jd|dr|d|d|d|jd|<dS)z`Add a new object, function, or enum member name (ie an ID) to the current scope rbFz Non-typedef z- previously declared as typedef in this scopeNrcres r_add_identifierzCParser._add_identifiersg  R $ $T5 1 1    TtTTT   ',"d###r cjt|jD]}||}||cSdS)z.Is *name* a typedef-name in the current scope?NF)reversedr@rd)rr`scopein_scopes r_is_type_in_scopezCParser._is_type_in_scopesFd/00  EyyH#$ur rcZ|||||dSrX)rKrS)rrTrrs rr:zCParser._lex_error_funcs, #t{{48899999r c.|dSrX)r[rZs rr;zCParser._lex_on_lbrace_funcs r c.|dSrX)r_rZs rr<zCParser._lex_on_rbrace_funcs r c,||S)zLooks up types that were previously defined with typedef. Passed to the lexer for recognizing identifiers that are types. )rm)rr`s rr=zCParser._lex_type_lookup_funcs %%d+++r declmodifierc2|}|}|jr|j}|jt|tjr ||_|S|}t|jtjs&|j}t|jtj&|j|_||_|S)zTacks a type modifier on a declarator, and returns the modified declarator. Note: the declarator and modifier may be modified )type isinstancerTypeDecl)rrrrs modifier_head modifier_tail decl_tails r_type_modify_declzCParser._type_modify_decls !    /).M  / dEN + + !%M O I @@ +%N !@@ +"+M *INKr typenamec|}t|tjs!|j}t|tj!|j|_|jdd|_|D]V}t|tjs:t|dkr| d|j K||_|cSW|s\t|jtj s| d|j tjdg|j |_n0tjd|D|dj |_|S) z#Fixes a declaration. Modifies decl.Nr z Invalid multiple types specifiedMissing type in declarationr'rUc&g|]}|jD]}|Sr()names).0idr`s r z/CParser._fix_decl_name_type..$s'>>>"RX>>T>>>>r r) rvrrwrudeclnamer`qualsIdentifierTyper]rKrUFuncDecl)rrrr|typtns r_fix_decl_name_typezCParser._fix_decl_name_typesQS%.11 (CS%.11 L JqqqM   Bb%"677 x==1$$%%&H"(SSSS!CHKKK   di88 M!!"?LLL+UG4:FFFCHH+>>>>>hqkFWCH r declspec _DeclSpecnewspeckind _DeclSpecKindrYc|tggggg}n|}|r|||n||d||S)z2See _DeclSpec for the specifier dictionary layout.Nqualstoragerufunction alignmentr)r?rYinsert)rrrrrYspecs r_add_declaration_specifierz"CParser._add_declaration_specifier(st  ""rRDDD  * J  g & & & & J  a ) ) ) r rdecls _DeclInfotypedef_namespacec \d|dv}g}|dd|ddt|ddksPt|dd jd ks,||dd jdss$y/1   8<< " " * Qx'V %%))4<+122a7711$v,r2B2H2KLL8 E!&\"""1g.."$%GE!E"%%&;UCCC$)>!&\"-3A6{+v,r*0 $$$a L$$ a U\5;8LM ) $Cq&)9:: $\5>BB5#/#4L%\5>BB5(0,0L,<,B1,EL)V R(* ,* ,D<+++ #mv, Ofv,,  $jv,{+ O!*-f&)) HHY//v,,     U\5;8LM Q) !55k4<PP ! LL**:?J|dkr tjStjS)z[Given a token (either STRUCT or UNION), selects the appropriate AST class. struct)rrr)rrs r_select_struct_union_classz"CParser._select_struct_union_classs H  < ; r r kc6|j|S)z:Return the k-th next token without consuming it (1-based).)rBpeekrrs rrJz CParser._peeks|  ###r cB||}||jndS)zDReturn the type of the k-th next token, or None if absent (1-based).N)rJru)rrrOs r _peek_typezCParser._peek_types!jjmm?sxx4r c|j}|"|d|jjdS|S)NzAt end of input)rBnextrKr>rDrrOs r_advancezCParser._advancesAl!! ;   /1C D D D D DJr token_typecp|}||j|kr|SdS)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)rJrurrrrOs r_acceptzCParser._accepts5 jjll ?sx:55==?? "tr c|}|j|kr1|d|j|||S)NrG)rrurKrLrMrs r_expectzCParser._expectsNmmoo 8z ! !   444dooc6J6J K K K r c4|jSrX)rBmarkrZs r_markz CParser._marks|  """r rc:|j|dSrX)rBresetrrs r_resetzCParser._resets 4     r rOcB||j|jSrX)rSrQrrs rrMzCParser._tok_coords{{3:sz222r cR|p|}|dS|jtvSNF)rJru _DECL_STARTrs r_starts_declarationzCParser._starts_declarations+!TZZ\\ ;5x;&&r cR|p|}|dS|jtvSr)rJru_STARTS_EXPRESSIONrs r_starts_expressionzCParser._starts_expressions,!TZZ\\ ;5x---r cp|}|dS|tvrdS|S)NFT)r_STARTS_STATEMENTrrtok_types r_starts_statementzCParser._starts_statements???$$  5 ( ( (4&&(((r id_onlycV|}|dS|dvrdS|r|dkS|dvS)NF>TIMESLPARENTID>rTYPEIDr)rrrs r_starts_declaratorzCParser._starts_declaratorsL??$$  5 * * *4  $t# #+++r c|}|\}}||||fSrX)r_scan_declarator_name_infor)rrr saw_parens r_peek_declarator_name_infoz"CParser._peek_declarator_name_infosBzz||"==??) D""r allow_abstracttypeid_paren_as_abstractc|\}}| |ro|dkri|rg|sM|}|||n |jj}|d||}|dfS|dkr,|r|}n)|}n| }|dfS)NrzInvalid declaratorFT) rrJrMr>rDrK_parse_abstract_declarator_opt _parse_typeid_noparen_declarator_parse_typeid_declarator_parse_id_declarator)rrr name_typerrOrUrrs r_parse_any_declaratorzCParser._parse_any_declarators $>>@@ 9   $ )2h)>)>9)>! ?jjll03,,,TYEW!!"6>>>6688D;   ' 7<<>>4466,,..DTzr cd}|dr_|tvr/||tv/|d_|}|d|fS|jdvr||j|fS|jdkrd}||\}}|rd}d} |}|d|fS|jdkr|dz }n,|jdkr!|dz}||dkrnX|l||fSd|fS) NFr>rrrTr RPARENr)rr_TYPE_QUALIFIERrrJrur)rrrOr nested_parendepths rrz"CParser._scan_declarator_name_info/s ll7## //##66 //##66ll7## jjll ;? " 8' ' ' MMOOO8Y& & 8x  I MMOOO%)%D%D%F%F "Hl ! E jjll;?*8x''QJEEX))QJEMMOOOzz  Y& &Yr c.|dvS)N>rLBRACKETrrZs r"_starts_direct_abstract_declaratorz*CParser._starts_direct_abstract_declaratorRs  $:::r cN|}|duo |jtvSrX)rJru_ASSIGNMENT_OPSrs r_is_assignment_opzCParser._is_assignment_opUs%jjll$>38#>>r c<|}|d}|dS|s||dS|}|d||dS|||fS)abParse 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. rNr)rrrr_parse_type_name)rr lparen_tokrs r_try_parse_paren_type_namez"CParser._try_parse_paren_type_nameYszz||\\(++  4''))  KK   4##%% << ! ! ) KK   4D*$$r c|tjgStj|SrX)rJrFileAST_parse_translation_unitrZs rrIz(CParser._parse_translation_unit_or_emptyts< ::<< =$$ $}T99;;<<>T>RRh..tX>>>r r%c xd}|r)|r|}n,|dr|d}||d}tjtjtjf}t |dkr^t|d|rHtjd|d|d|d|d |ddd|dj g}nB| |tddd gd }n| ||d }|S) NTrrur rrrrrrrr) rr#rrrrr]rvrrUrr?)rrr%rtys_u_or_es rr z"CParser._parse_decl_body_with_specs`  G&&(( ;88::&&t&44 G888FF =fB ek5:>H2ww!|| 2a5( ; ;|J!"6l";/ $Y!%j!1U! $ ek    00TdCCCD&*1 ,,$-E r cg}|r;|||;|SrX)rr r-r,s rr!zCParser._parse_declaration_listsT&&(( 4 LL0022 3 3 3&&(( 4 r rc d}d}d} |}|nd|jdkrC|||}|||dd}g|jdkr^|dd krE|||}|||d d}d}|jtvrI|||}|||j d d}'|jtvrI|||}|||j d d}~|jtvrI|||}|||j d d}|jtvru|||}|}||tj|j g||d d}d}X|jdkry|rn|||}|}||tj|j g||d d}d}|jdvrF|||}|||d d}d}+|jdkrF|||}|||d d}d}| | |d|jj|s|s|d||||fS)aParse 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_ALIGNASrrY_ATOMICrrrurrrrrUNIONSTRUCTENUMrr~)rJrurMr_parse_alignment_specifierr_parse_atomic_specifierrrrL_STORAGE_CLASS_FUNCTION_SPEC_TYPE_SPEC_SIMPLErr _parse_struct_or_union_specifier_parse_enum_specifierrKr>rD)rrrr% first_coordrOs rrz%CParser._parse_declaration_specifierss" \ **,,C{x:%%&"&//#"6"6K66$99;;[QU7x9$$););x)G)G&"&//#"6"6K66$6688&7 x?**&"&//#"6"6K66$--///7x>))&"&//#"6"6K66$--///47x>))&"&//#"6"6K66$--///D7x,,,&"&//#"6"6Kmmoo66(#)DOOCrDrd)rrr% saw_alignmentrCrOs r_parse_specifier_qualifier_listz'CParser._parse_specifier_qualifier_lists  M **,,C{x:%%&"&//#"6"6K66$99;;[QU7!% x9$$););x)G)G&"&//#"6"6K66$6688&7 x?**&"&//#"6"6K66$--///7x,,,&"&//#"6"6Kmmoo66(#)DOOC||||d>|S)Nr0COMMA)_parse_init_declaratorrrY)rrrrs rr#z#CParser._parse_init_declarator_lists  GG--g->>?  ll7## G LL44W4EE F F Fll7## G r c|r|n|}d}|dr|}t ||dS)Nrr)r_parse_declaratorrr"r?)rrrrrs rrQzCParser._parse_init_declarator'sh.5St((***4;Q;Q;S;S << ! ! -**,,DD$7777r c|}||j}|dvr|}|dkr||dr&||jg||S|}|d||j|||S||jd||S|dkr|}|dr!|dg||S|}|d|d|||S|d||dS)N>rrrRBRACE)r`rrUz Invalid struct/union declaration) rrrLrrrM_parse_struct_declaration_listrrK)rrOklassname_tokr brace_toks rrAz(CParser._parse_struct_or_union_specifier3smmoo// :: ??   0 0 0}}H  H,, <<)) 5%^2T__X=V=V;;== X&&&u!uDOOHR>RSSSSSr cg}|dvrB|}|-|||dvB|SN>NrU)r_parse_struct_declarationr )rritemss rrVz&CParser._parse_struct_declaration_listTsgoo'7772244E} LL    oo'777  r c|dkr|dS|dvr|gS|}d|dgvsJd}|s|dkr|}|,|d|||St|ddkr||dd }t|tj r|}ntj |}|d||t|dd gS|d||tddd gS) NrrrrCOLONrrrur rr)rrrrFrdr_parse_struct_declarator_listrrr]rvrNoderr?)rrrnode decl_types rr\z!CParser._parse_struct_declaration`s ??   & & MMOOO4 ??   7 7 722445 53355B 7 77777  " " $ $ 9(9(9W(D(D6688E   LL ++U+CC C tF|   ! !<?D$ ++ 7 !066 LL ++$ID$"O"O"O!P,  V''d4FFFG(   r c|g}|dr<|||d<|SNrP)_parse_struct_declaratorrrYr,s rraz%CParser._parse_struct_declarator_listsc..001ll7## : LL6688 9 9 9ll7## : r c|dr/|}tjddddd|dS|}|dr|}|d|dS|dddS)Nr_r)rrKrrwrS)rrrrs rrgz CParser._parse_struct_declarators <<  5577GtT4>>"  %%'' <<  D5577G $7CC Cdt<<rrrrU)rrr_parse_enumerator_listrrrLrM)rrOrXenumss rrBzCParser._parse_enum_specifiersll6"" ??   0 0 0}}H  H,, 3355 X&&&z(.%9M9MNNN:hndDOOC4H4HII I X++-- Xz$ts';';<<!ooh// D((...r c |dkr*||||}C|dkr,||}|||} |S)zAParse a chain of array/function suffixes and attach them to decl.Trr)rr{_parse_array_decl_parse_function_decl)rrrr$s rrzCParser._parse_decl_suffixess   J..--dD4J4J44P4PQQ  H,,0066--dD99  r base_declc:|d|jSN) base_typerU)_parse_array_decl_commonrU)rrs rrzCParser._parse_array_decl s,,t9?,SSSr rc|d}||fd}|drOdg|pgz}|}|d|||S|t vr|pg}|dr;|dgz}|}|d|||S|d}|rN|dtj|j ||}|||Sd}| r|}|d|||S|d}|rN|dtj|j ||}||gSd}| r|}|d||gS)a9Parse 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. rNc4tj||S)N)rudim dim_qualsrU)r ArrayDecl)rrrrUs rmake_array_declz9CParser._parse_array_decl_common..make_array_decls%?C9E r STATICstaticRBRACKETr) rrMrrH_parse_assignment_expressionrrrrrLr)rrrU lbrack_tokrrr times_toks `` rrz CParser._parse_array_decl_common s\\*-- =OOJ//E       << ! ! 3! d&E&E&G&G&M2NI3355C LL $ $ $"?3 22 2 ??   / /7799?RI||H%% 7% 2 7799 Z(((&sI666 W--I 7 Z(((hy 0J0JKK&sI666C&&(( :7799 LL $ $ $"?3 22 2LL))  , LL $ $ $(9?DOOI,F,FGGC"?3++ +  " " $ $ 63355C Z   sB'''r c*|d|drd}nQ|r|n|}|dt j|d|j}|dkr`|j Y|j j D]L}t|t j rn/t|dd}|r|||jM|S)NrrargsrurUrr`)rrr_parse_parameter_type_list_parse_identifier_list_optrrrUrrparamsrv EllipsisParamgetattrrh)rrrr$paramr`s rrzCParser._parse_function_declFs X << ! ! #DD++--7//1114466  LL " " "~4d)/JJJ ??   ( (y$!Y-@@E!%)<=="5&$77D@,,T5;??? r c0g}|d}|rW|pg}||||f|d}|W|sdSd}|D]\}}t j|||}|S)Nr)rrurU)rrHrYrMrPtrDecl)rstarsrrrrUs rrzCParser._parse_pointer`sLL))  .3355;E LL%!;!;< = = = W--I .  4! D DLE5-e#UCCCCC r c^|}|dkr|ddkrg||}|jt j|||SNrPrELLIPSIS)_parse_parameter_listrrrrYrrrM)rrell_toks rrz"CParser._parse_parameter_type_listqs++-- ??   ' 'DOOA,>,>*,L,L MMOOOmmooG M !4T__W5M5M!N!N O O O r c|}tj|g|j}|dkr|ddkrq||j||dkr|ddkq|Sr)_parse_parameter_declarationr ParamListrUrrrrYrrrs rrzCParser._parse_parameter_listzs1133%%+66oo7**tq/A/AZ/O/O MMOOO M !B!B!D!D E E Eoo7**tq/A/AZ/O/O r c|d\}}}|dstjdg|g|d<|ra|dd\}}|r.||t |ddgd S||||S|}||||S) NTrrur'rrurr`r) rrrrrrr?_build_parameter_declarationr)rrr'r&rris_nameds rrz$CParser._parse_parameter_declarations "@@t@TTaF| M!0% KKKLDL  " " $ $ M!77#d8ND( //d4&N&N&N%O044T4LL L224400tZHHHr r&c t|ddkr~t|ddjdkrZ||ddjdr.||t |ddgdSt jd|dd|pt jdddd| }|||dS) Nrur rbrrr`r-rr`rrrurU) r]rrmrr?rTypenamerwr)rrrrr&s rrz$CParser._build_parameter_declarations V   ! !DL$*++q00&&tF|B'7'=a'@AA1++$DtT"J"J"J!K, ~v,?dD$??    ''d6l;;;r c^|dkrdS|SNr)r_parse_identifier_listrZs rrz"CParser._parse_identifier_list_opts. ??   ( (4**,,,r c|}tj|g|j}|drA|j||dA|Srf)_parse_identifierrrrUrrrYrs rrzCParser._parse_identifier_listsy&&((%%+66ll7## ; M !7!7!9!9 : : :ll7## ; r c |}|}d}||j}n|dr|ddj}tjd|dddd|ptjdddd|}t tj|||dS)Nrurr-rr)rFrrUrrrwr r)rrrrrUr|s rrzCParser._parse_type_names33552244  JEE &\ *LO)E>v,qqq/?dD$??    END$<$==??~dD$==???))$44 4  2 2 4 4 <99;; ;tr c z|d}|r|s|dkri|}|dt j|t jdddd||}n{| }|d|JnM|dkr| }n | d|j j ||S)NrrrrzInvalid abstract declarator)rrr_parse_parameter_type_list_optrrrrwrMr_parse_abstract_array_baserKr>rDr)rrrrrs rrz)CParser._parse_direct_abstract_declarators0\\(++  Q'')) (T__->->(-J-J<<>> X&&&~dD$??//*55 ::<< X&&&'''' __  * , ,2244DD   ;TY=O P P P((...r c^|dkrdS|Sr)rrrZs rrz&CParser._parse_parameter_type_list_opts. ??   ( (4..000r cZ|tjdddddSr)rrrwrZs rrz"CParser._parse_abstract_array_bases4,,nT4t<g.>gajFVWWW W$$&&&r cz|r|S|SrX)rr-rrZs r_parse_block_itemzCParser._parse_block_item,s:  # # % % -**,, ,$$&&&r cg}|dvrr|}t|tr|dgkrG||n|||dvr|Sr[)rrrvlistr rY)rr]items r_parse_block_item_listzCParser._parse_block_item_list2soo'777))++D$%% #D6>> T"""" T"""oo'777 r cL|d}|dr)tjd||S|}|dtj|||S)NrrUr)rrrrrMr)r lbrace_tokrs rrz!CParser._parse_compound_statement?s\\(++ << ! ! W>d$//*:U:UVVV V1133  X~#4??:+F+F    r c|}|xdkr|}|d|r|}n't j||}t j|j |||Sxdkr|}| }|d|r|}n't j||}t j ||g||Sdkr|}|d|r|}n't j||}t j |g||S | d|jjdS)Nrr_rrzInvalid labeled statement)rrrrrrEmptyStatementrMLabelrLrKCaseDefaultrKr>rD)rrrXrcase_tokrLdef_toks rrz CParser._parse_labeled_statementLs??$$==?? W%%%))++K>>@@DD /0I0IJJD{8>49R9RSSS==??6688 W%%%))++K>>@@DD /0I0IJJDz$0I0IJJJ--// W%%%))++J>>@@DD /0H0HIID}dVT__W-E-EFFF!!"=ty?QRRRRRr c T|}|jxdkr|d|}|d|}|dr>|}t j|||||St j||d||Sdkr|d|}|d|}tt j ||||S | d||dS)NrrrELSErzInvalid selection statement) rrur_parse_expressionrrrIfrMrSwitchrK)rrOcond then_stmt else_stmtrLrs rrz"CParser._parse_selection_statementmssmmooh X&&&--// X&&& ??AA <<''V $ C C E EI 8D)YPS@T@TUUUxits7K7KLLL X&&&--// X&&&::<<' T4QTAUAU(V(VWWW!!"?QTAUAUVVVVVr c V|}|jxdkr||d|}|d|}t j||||Sxdkr|}|d|d|}|d|dt j||||Sdkr|d| r| }t j |||}| }|d| }|d|}t j ||||||S| }|d| }|d| }|d|}t j ||||||S |d||dS)NrrrrrrzInvalid iteration statement)rrurrrrWhilerMDoWhilerr-DeclList_parse_expression_optForrK)rrOrrrr next_exprs rrz"CParser._parse_iteration_statementsmmooh X&&&--// X&&&::<<{4ts/C/CDDD::<< W%%% X&&&--// X&&& V$$$}T41E1EFFF X&&&++--X 3355E >%1E1EFFD5577DLL((( $ : : < >@@D 9T4D$//RUBVBVWWW1133 V$$$1133 V$$$ 6688  X&&&::<<ytYdooc>R>RSSS!!"?QTAUAUVVVVVr c||}|jxdkrX|d}|dtj|j||Sxdkr=|dtj||Sxdkr=|dtj||Sdkr| dr(tj d||S| }|dtj |||S | d||dS)NrrrrrrzInvalid jump statement) rrurrGotorLrMBreakContinuerReturnrrK)rrOrXrLs rrzCParser._parse_jump_statements{mmooh<<-- V$$$z(.$//#2F2FGGG V$$${4??3#7#7888 V$$$~dooc&:&:;;;<<''D <dooc.B.BCCC--// V$$$|D$//#*>*>???!!":DOOC LL::<< = = =ll7## >~eTZ000r c|dkrX|ddkr?||}|d|S|}|rI|j}|}tj ||||j S|S)Nrrrr) rrrr_parse_conditional_expressionrrLrr AssignmentrU)rcomprLoprhss rrz$CParser._parse_assignment_expressions ??   ( (T__Q-?-?8-K-K MMOOO1133D LL " " "K1133  ! ! # # ?&B3355C#Bc4:>> > r c |}|drY|}|d|}t j||||jS|S)NCONDOPr_)_parse_binary_expressionrrrrr TernaryOprU)rrLiftrueiffalses rrz%CParser._parse_conditional_expressionsy,,.. << ! ! F++--F LL ! ! !88::G?4$*EE E r rmin_preclhsc||} |}||jtvrnt|j}||krn|j}||} |}||jtvrn1t|j}||kr|||}nnVtj||||j }|SrX) _parse_cast_expressionrJru_BINARY_PRECEDENCErLrrrBinaryOprU) rrrrOprecr r next_tok next_precs rrz CParser._parse_binary_expressions ;--//C :**,,C{ch.@@@%ch/DhB MMOOO--//C ::<<#x}ANDNOTLNOTPLUSMINUSrSIZEOF_ALIGNOFrr) rrrrUnaryOprLrUrrrMrr_parse_postfix_expression)rrrOrLrrr's rrzCParser._parse_unary_expression4s??$$ 1 1 1--//C//11D=D$*== = G G G--//C..00D=D$*== = x  --//C4466F!" Q}SYT__S5I5IJJJ//11D=D$//#2F2FGG G z ! !--//C LL " " "''))C LL " " "=C1E1EFF F--///r cH|}||\}}}|drS|}|d|dt j||S|||} |drE|}|dt j |||j }[|drt| dkr| d}n)| }|dt j|||j }| d vr| } | } | jd vr)|d || t j| j|| } t j|| j| |j }| d vr9| } t jd | jz||j } |S)NrrPrUTrrrr>ARROWPERIOD>rrzInvalid struct referencer!p)rr_parse_initializer_listrrCompoundLiteralr_parse_primary_expressionrArrayRefrUrr_parse_argument_expression_listFuncCallrurKrMrrL StructRefr+) rrrrr'rrLsubrop_tokrXfieldrOs rr,z!CParser._parse_postfix_expressionTs^0022  !LCq||H%% "3355 W%%% X&&&,S$777 D!!!--// ||J'' ,,.. Z(((~dC<<||H%% ??$$00MMOOODD??AADLL***~dD$*==  $777==??=(888%%2DOOH4M4M1J1JKKtV\5$*MM  $>>>mmoo}S39_dDJGG  r c|}|dkr|S|tvs|tvs |tvr|S|t vr|S|tvr| S|dkr?| | }| d|S|dkr| }| d| }| d|}| d||}t!jt!j|j|t!j||g||S|d|jjdS)NrrrOFFSETOFrPzInvalid expression)rr _INT_CONST _FLOAT_CONST _CHAR_CONST_parse_constant_STRING_LITERAL_parse_unified_string_literal _WSTR_LITERAL_parse_unified_wstring_literalrrrr!_parse_offsetof_member_designatorrMrr6rrLrrKr>rD)rrrLoff_tokr designatorrUs rr3z!CParser._parse_primary_expressions??$$ t  ))++ +  " "<'';&&'')) )  & &5577 7 } $ $6688 8 x   MMOOO))++D LL " " "K z ! !mmooG LL " " "''))C LL ! ! !??AAJ LL " " "OOG,,E>..Z0%88  . 0BCCCCCr cr|} |dr1|}tj|d||j}G|drE|}|dtj|||j} |S)NTr/.rr)_parse_identifier_or_typeidrrr7rUrrr4)rrcr:rLs rrEz)CParser._parse_offsetof_member_designators//11 ||H%% 88::tS%DD||J'' --// Z(((~dD$*==  r c|}|g}|dr<|||d LL::<< = = =ll7## >~eTZ000r c*|SrX)rrZs rrKz"CParser._parse_constant_expressions11333r c|d}tj|j||S)Nr)rrrrLrMrs rrzCParser._parse_identifiers3ll4  x 4??3#7#7888r c|}|jdvr)|d||t j|j||S)N>rrzExpected identifier)rrurKrMrrrLrs rrJz#CParser._parse_identifier_or_typeids`mmoo 8+ + +   3T__S5I5I J J Jx 4??3#7#7888r c|}|jtvrd}d}|jddD]}|dvr|dz } |dvr|dz }|dkrt d|dkrt dd |zd |zz}t j|d z|j||S|jtvrT|jd d vrd}n|jd dvrd}nd}t j||j||S|jtvr.t jd|j||S| d||dS)Nr)lLr )uUz.Constant cannot have more than one u/U suffix.rz.Constant cannot have more than two l/L suffix.z unsigned zlong r'rb)fFfloatz long doubledoublecharzInvalid constant) rrur=rL ValueErrorrConstantrMr>r?rK)rrOu_countl_countchprefixrs rr@zCParser._parse_constantsmmoo 8z ! !GGin ! !##qLGG:%%qLG{{ !QRRR{{ !QRRR 7*Ww->>F>&5.#)T__S=Q=QRR R 8| # #y} **2*,,!>!SY0D0DEE E 8{ " ">&#)T__S5I5IJJ J ,dooc.B.BCCCCCr c\|d}tjd|j||}|dkrP|}|jdd|jddz|_|dkP|S)NSTRING_LITERALstringrbr )rrr[rLrMrrrrOrctok2s rrBz%CParser._parse_unified_string_literalsll+,,~h 4??33G3GHHoo#333==??DCRC4:abb>9DJoo#333 r c|}|jtvr)|d||t jd|j||}|tvre|}|j dd|jddz|_|tve|S)NzInvalid string literalrbrbr) rrurCrKrMrr[rLrrstriprcs rrDz&CParser._parse_unified_wstring_literalsmmoo 8= ( (   68L8L M M M~h 4??33G3GHHoo=00==??D**,,SbS1DJqrrNBDJoo=00 r cR|d}|r}|dr(tjg||S|}|d|d|S|S)NrrUrP)rrInitListrMr1rr)rr init_lists rr"zCParser._parse_initializers\\(++  ||H%% G~b$//**E*EFFF4466I LL ! ! ! LL " " " 00222r c@|g}|drU|dkrn<|||dUt j||djS)NrPrUr)_parse_initializer_itemrrrYrrhrU)rr]s rr1zCParser._parse_initializer_lists--//0ll7## 9  H,, LL5577 8 8 8ll7## 9~eU1X^444r cd}|dvr|}|}|tj||S|SN>r/r)r_parse_designationr"rNamedInitializer)r designationrs rrkzCParser._parse_initializer_item%s] ??   6 6 61133K&&((  ")+t<< < r cX|}|d|S)Nr)_parse_designator_listrr designatorss rrnzCParser._parse_designation/s+1133  Xr cg}|dvr=|||dv=|Srm)rrY_parse_designatorrss rrrzCParser._parse_designator_list5s[ oo#999   t5577 8 8 8oo#999r c|dr+|}|d|S|dr|S|d|jjdS)Nrrr/zInvalid designator)rrKrrJrKr>rD)rrLs rrvzCParser._parse_designator=s << # # 2244D LL $ $ $K << ! ! 63355 5 . 0BCCCCCr c|d}|d||dS)NrzDirectives not supported yet)rrKrMrs rrzCParser._parse_pp_directiveJs<ll8$$ 8$//#:N:NOOOOOr c|dkr|}|dkrA|}tj|j||Stjd||S|dkrz|}|d}|}|dtj|||S|d|j j dS)Nr PPPRAGMASTRr-rrrzInvalid pragma) rrrPragmarLrMrrBrKr>rD)rrOstr_toklparenliterals rrz!CParser._parse_pppragma_directivePs ??   * *--//C  M11--//|GM4??73K3KLLL<DOOC$8$899 9 ??   ) )--//C\\(++F88::G LL " " "<)@)@AA A *DI,>?????r cg}|dvr=|||dv=|S)Nr)rrYr)rrs rrz&CParser._parse_pppragma_directive_listbsXoo#::: NN499;; < < <oo#:::r cR|d}|d|}d}|dr|}|dt j||||gS)NrrrPr)rrKrrBr StaticAssertrM)rrOrrTs rrzCParser._parse_static_assertisll+,, X..00 <<  74466C X"4dooc.B.BCCDDr )r-FrX)rN)Fr )FF)rrr)rr)T)rN)r!r"r#r$rboolrur%rCrr rPr'r rrSrrKr[r_rfrhrmr:r;r<r=rrbr{rrrrrrrrrrrJrrrrrrrMrrrrr rrrrrrrIr r r-r+r r!rrFrHr<r=r#rQrArVr\rargrBrjrmrSrrrrzrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr,r3rEr5rKrrJr@rBrDr"r1rkrnrrrvrrrrr(r rr,r,2s  "$("* ===F|= =  =  === ====:,8,,,,))))    +c+(5/+d++++ ,C , ,D , , , ,cd:3:c:3:4::::,#,$,,,,TcSUZX&j5=(5>9&s)& em #en 4 &&&&Z ;'     4#( eeeK e e ej  eeeeN  j d5:./  j       *$$s$8F#3$$$$55C5 5555 & # (6*:    #& #s####!3!4!!!!3f33333''x'7'4'''' ..hv&6.$.... )4)))),,$,4,,,,#E(3-2E,F####NS"FJ x #T) *6!E(3-2E,F!!!!F;D;;;;?4????% %V34 5%%%%6=%-==== ej)9MT%*-=MMMMlD$4 ?$uz"2???? ''+/' ej ''''Tej)9%*v+v+!v+ {D(5/1 2v+v+v+v+v````FDI 9EJ 9 9 9 9DI  k* <@  k     88d8{8888T%*TTTTBUZ0@ 8D4D+E    DtK/@====$=uz====" 5:5:HejHHHHL%*LLLLM%*MMMM3Tej.2///&*/ ////*      T5:T%*TTTTIM7(7(!%*-7(6>uo7( 7(7(7(7(tejUZ4 4"EOuIejIIII&<<'/ ';B&.uz&: D . . . . .*00000@.5:....d!D5:!D!D!D!DJ 5:     111114EJ444495:9999 9UZ9999DDDDD@uz  3EJ 3 3 3 355555D$4 UZ(8D5:DDDDPXPPPP @5:@@@@$UZ0@Ed5:&6EEEEEEr r,> rOREQUALANDEQUALDIVEQUALMODEQUALXOREQUAL PLUSEQUAL MINUSEQUAL TIMESEQUAL LSHIFTEQUAL RSHIFTEQUALLORLANDORrXORr$EQNEGTGELTLERSHIFTLSHIFTr'r(r DIVIDEMOD>AUTOEXTERNrTYPEDEFREGISTER _THREAD_LOCALINLINE _NORETURN>CONSTr7RESTRICTVOLATILE> INTCHARLONGVOIDFLOATSHORT_BOOLDOUBLESIGNEDUNSIGNED_COMPLEX__INT128>r;r9r:rr7r5> rr$r%r&r'r(rrr)r<r"r*r#> INT_CONST_BIN INT_CONST_DEC INT_CONST_HEX INT_CONST_OCTINT_CONST_CHAR FLOAT_CONSTHEX_FLOAT_CONST> CHAR_CONST WCHAR_CONST U8CHAR_CONST U16CHAR_CONST U32CHAR_CONSTra>WSTRING_LITERALU8STRING_LITERALU16STRING_LITERALU32STRING_LITERAL>rrrrrrrrrrrrrrrrceZdZdZdeddfdZddedeefdZ deefd Z defd Z d eddfd Z d eddfdZ dS)rAzWraps 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/rNc0||_g|_d|_dS)Nr)_lexer_buffer_index)rr/s rrCz_TokenStream.__init__ s /1  r r rcl|dkrdS|||j|j|zdz 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. rNr _fillrrrs rrz_TokenStream.peek s9 664 1 |DK!Oa/00r ct|d|j|j}|xjdz c_|S)z%Consume a single token and return it.r rrs rrz_TokenStream.next s4 1 l4;' q  r c|jSrXrrZs rrz_TokenStream.mark" s {r rc||_dSrXrrs rrz_TokenStream.reset% s  r nct|j|j|zkrY|j}|j||dSt|j|j|zkWdSdSrX)r]rrrrrY)rrrOs rrz_TokenStream._fill( sy$,$+/11+##%%C L   $ $ ${ $,$+/111111r r)r!r"r#r$rrCr'r rrrrrrr(r rrArAs f 1 1c 1(6"2 1 1 1 1hv&c#$str rAc~eZdZUeeed<eeed<eeed<eeed<eeed<dS)rrrrurrN)r!r"r#rrr&r(r rrr6 s\ s)OOO #Y s)OOO3iCyr rrcpeZdZUeejed<eejed<eejed<dS)rrrrrN)r!r"r#r rrbr&r(r rrrA sM 5:  5:  ej !!!!!!r rN)+ dataclassesrtypingrrrrrr r r r r-rc_lexerrrast_transformsrrr Exceptionr*r,rrr>r?rr@r _EXPR_STARTr=r>r?rArCrrrArrrr(r rrs"!!!!!                      ########CCCCCCCC  $         E E E E E E E EDB   " 1 A ! 1   1   !  ! ! ! ! ! a a A Q  Q!" a#$ 1%*VUUK(>>>    CBB C   01  $$    (........n JK """"" """""r