a ‚oeÐã@sdddlmZddlmZddlmZddlmZmZm Z m Z ddl m Z m Z e Gdd„deƒƒZdS) é)Úyacc)Úc_ast)ÚCLexer)Ú PLYParserÚ ParseErrorÚ parameterizedÚtemplate)Úfix_switch_casesÚfix_atomic_specifiersc@sŒeZdZdedddddfdd„Z�d]dd „Zd d „Zd d „Zdd„Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zd d!„Z�d^d"d#„Z�d_d$d%„Zd&d'„Zd(d)„Zd*Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Zd7d8„Zd9d:„Zd;d<„Zd=d>„Z d?d@„Z!dAdB„Z"dCdD„Z#dEdF„Z$dGdH„Z%dIdJ„Z&dKdL„Z'dMdN„Z(dOdP„Z)dQdR„Z*dSdT„Z+dUdV„Z,dWdX„Z-dYdZ„Z.d[d\„Z/d]d^„Z0d_d`„Z1dadb„Z2dcdd„Z3dedf„Z4dgdh„Z5didj„Z6dkdl„Z7dmdn„Z8dodp„Z9dqdr„Z:dsdt„Z;dudv„Zd{d|„Z?d}d~„Z@dd€„ZAd�d‚„ZBdƒd„„ZCd…d†„ZDd‡dˆ„ZEd‰dŠ„ZFd‹dŒ„ZGd�dŽ„ZHd�d�„ZId‘d’„ZJd“d”„ZKd•d–„ZLd—d˜„ZMd™dš„ZNd›dœ„ZOd�dž„ZPdŸd „ZQd¡d¢„ZRd£d¤„ZSd¥d¦„ZTd§d¨„ZUd©dª„ZVeWd«d¬d­ƒd®d¯„ƒZXeWd«d¬d­ƒd°d±„ƒZYeWd«d¬d­ƒd²d³„ƒZZeWd«d¬ƒd´dµ„ƒZ[eWd«d¬d­ƒd¶d·„ƒZ\eWd«d¬d­ƒd¸d¹„ƒZ]eWd«d¬d­ƒdºd»„ƒZ^eWd«d¬d­ƒd¼d½„ƒZ_d¾d¿„Z`dÀdÁ„ZadÂdÄZbdÄdÅ„ZcdÆdÇ„ZddÈdÉ„ZedÊdË„ZfdÌdÍ„ZgdÎdÏ„ZhdÐdÑ„ZidÒdÓ„ZjdÔdÕ„ZkdÖdׄZldØdÙ„ZmdÚdÛ„ZndÜdÝ„ZodÞdß„Zpdàdá„Zqdâdã„Zrdädå„Zsdædç„Ztdèdé„Zudêdë„Zvdìdí„Zwdîdï„Zxdðdñ„Zydòdó„Zzdôdõ„Z{död÷„Z|dødù„Z}dúdû„Z~düdý„Zdþdÿ„Z€�d�d„Z��d�d„Z‚�d�d„Zƒ�d�d„Z„�d�d „Z…�d �d „Z†�d �d „Z‡�d�d„Zˆ�d�d„Z‰�d�d„ZŠ�d�d„Z‹�d�d„ZŒ�d�d„Z��d�d„ZŽ�d�d„Z��d�d„Z��d �d!„Z‘�d"�d#„Z’�d$�d%„Z“�d&�d'„Z”�d(�d)„Z•�d*�d+„Z–�d,�d-„Z—�d.�d/„Z˜�d0�d1„Z™�d2�d3„Zš�d4�d5„Z›�d6�d7„Zœ�d8�d9„Z��d:�d;„Zž�d<�d=„ZŸ�d>�d?„Z �d@�dA„Z¡�dB�dC„Z¢�dD�dE„Z£�dF�dG„Z¤�dH�dI„Z¥�dJ�dK„Z¦�dL�dM„Z§�dN�dO„Z¨�dP�dQ„Z©�dR�dS„Zª�dT�dU„Z«�dV�dW„Z¬�dX�dY„Z­�dZ�d[„Z®�d\S(`ÚCParserTzpycparser.lextabzpycparser.yacctabFÚc Cs~||j|j|j|jd�|_|jj|||d�|jj|_gd¢}|D]} | | ¡qBtj|d||||d�|_ t ƒg|_ d|_ dS)a Create a new CParser. Some arguments for controlling the debug/optimization level of the parser are provided. The defaults are tuned for release/performance mode. The simple rules for using them are: *) When tweaking CParser/CLexer, set these to False *) When releasing a stable parser, set to True lex_optimize: Set to False when you're modifying the lexer. Otherwise, changes in the lexer won't be used, if some lextab.py file exists. When releasing with a stable lexer, set to True to save the re-generation of the lexer table on each run. lexer: Set this parameter to define the lexer to use if you're not using the default CLexer. lextab: Points to the lex table that's used for optimized mode. Only if you're modifying the lexer and want some tests to avoid re-generating the table, make this point to a local lex table file (that's been earlier generated with lex_optimize=True) yacc_optimize: Set to False when you're modifying the parser. Otherwise, changes in the parser won't be used, if some parsetab.py file exists. When releasing with a stable parser, set to True to save the re-generation of the parser table on each run. yacctab: Points to the yacc table that's used for optimized mode. Only if you're modifying the parser, make this point to a local yacc table file yacc_debug: Generate a parser.out file that explains how yacc built the parsing table from the grammar. taboutputdir: Set this parameter to control the location of generated lextab and yacctab files. )Z error_funcZon_lbrace_funcZon_rbrace_funcZtype_lookup_func)ÚoptimizeÚlextabÚ outputdir)Zabstract_declaratorZassignment_expressionZdeclaration_listZdeclaration_specifiers_no_typeZ designationZ expressionZidentifier_listZinit_declarator_listZid_init_declarator_listZinitializer_listZparameter_type_listZblock_item_listZtype_qualifier_listZstruct_declarator_listZtranslation_unit_or_empty)ÚmoduleÚstartÚdebugr Z tabmodulerN) Ú_lex_error_funcÚ_lex_on_lbrace_funcÚ_lex_on_rbrace_funcÚ_lex_type_lookup_funcÚclexÚbuildÚtokensZ_create_opt_rulerÚcparserÚdictÚ _scope_stackÚ_last_yielded_token) ÚselfZ lex_optimizeÚlexerrZ yacc_optimizeZyacctabZ yacc_debugZ taboutputdirZrules_with_optZrule©r ú3C:\Program Files\Certbot\pkgs\pycparser\c_parser.pyÚ__init__s2:üý  ú zCParser.__init__cCs6||j_|j ¡tƒg|_d|_|jj||j|d�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: Debug flag to YACC N)Úinputrr)rÚfilenameZ reset_linenorrrrÚparse)rÚtextr$rr r r!r%‚s   ýz CParser.parsecCs|j tƒ¡dS©N)rÚappendr©rr r r!Ú _push_scopešszCParser._push_scopecCs t|jƒdksJ‚|j ¡dS)Nr)ÚlenrÚpopr)r r r!Ú _pop_scope�szCParser._pop_scopecCs4|jd |d¡s"| d||¡d|jd|<dS)zC Add a new typedef name (ie a TYPEID) to the current scope éÿÿÿÿTz;Typedef %r previously declared as non-typedef in this scopeN©rÚgetÚ _parse_error©rÚnameÚcoordr r r!Ú_add_typedef_name¡sÿþzCParser._add_typedef_namecCs4|jd |d¡r"| d||¡d|jd|<dS)ze Add a new object, function, or enum member name (ie an ID) to the current scope r.Fz;Non-typedef %r previously declared as typedef in this scopeNr/r2r r r!Ú_add_identifierªsÿþzCParser._add_identifiercCs.t|jƒD]}| |¡}|dur |Sq dS)z8 Is *name* a typedef-name in the current scope? NF)Úreversedrr0)rr3ZscopeZin_scoper r r!Ú_is_type_in_scope´s zCParser._is_type_in_scopecCs| || ||¡¡dSr')r1Ú_coord)rÚmsgÚlineÚcolumnr r r!r¾szCParser._lex_error_funccCs | ¡dSr')r*r)r r r!rÁszCParser._lex_on_lbrace_funccCs | ¡dSr')r-r)r r r!rÄszCParser._lex_on_rbrace_funccCs| |¡}|S)z§ Looks up types that were previously defined with typedef. Passed to the lexer for recognizing identifiers that are types. )r8)rr3Zis_typer r r!rÇs zCParser._lex_type_lookup_funccCs|jjS)z§ We need access to yacc's lookahead token in certain cases. This is the last token yacc requested from the lexer, so we ask the lexer. )rZ last_tokenr)r r r!Ú_get_yacc_lookahead_tokenÐsz!CParser._get_yacc_lookahead_tokencCs\|}|}|jr|j}qt|tjƒr,||_|S|}t|jtjƒsF|j}q0|j|_||_|SdS)z  Tacks a type modifier on a declarator, and returns the modified declarator. Note: the declarator and modifier may be modified N)ÚtypeÚ isinstancerÚTypeDecl)rÚdeclÚmodifierZ modifier_headZ modifier_tailZ decl_tailr r r!Ú_type_modify_declùs  zCParser._type_modify_declcCsÊ|}t|tjƒs|j}q|j|_|jdd…|_|D]:}t|tjƒs4t|ƒdkr`|  d|j ¡q4||_|Sq4|s¦t|jtj ƒs�|  d|j ¡tjdg|j d�|_n tjdd„|Dƒ|d j d�|_|S) z- Fixes a declaration. Modifies decl. Nrz Invalid multiple types specifiedzMissing type in declarationÚint©r4cSsg|]}|jD]}|‘qqSr )Únames)Ú.0Úidr3r r r!Ú Sóz/CParser._fix_decl_name_type..é) r?rr@r>Údeclnamer3ÚqualsÚIdentifierTyper+r1r4ÚFuncDecl)rrAÚtypenamer>Útnr r r!Ú_fix_decl_name_type+s6   ÿ ÿþ  þzCParser._fix_decl_name_typecCs>|ptgggggd�}|r*|| |¡n|| d|¡|S)a¿ Declaration specifiers are represented by a dictionary with the entries: * qual: a list of type qualifiers * storage: a list of storage type qualifiers * type: a list of type specifiers * function: a list of function specifiers * alignment: a list of alignment specifiers This method is given a declaration specifier, and a new specifier of a given kind. If `append` is True, the new specifier is added to the end of the specifiers list, otherwise it's added at the beginning. Returns the declaration specifier, with the new specifier incorporated. )ÚqualÚstorager>ÚfunctionÚ alignmentrK)rr(Úinsert)rZdeclspecZnewspecÚkindr(Úspecr r r!Ú_add_declaration_specifierWs z"CParser._add_declaration_specifierc Csbd|dv}g}|d d¡dur&�n6|dddurêt|dƒdkstt|dd jƒd kst| |dd jd¡s¦d }|dD]}t|d ƒr€|j}qšq€| d |¡tj|dd jddd|d|dd jd�|dd<|dd =nrt |ddtj tj tj tj fƒ�s\|dd}t |tjƒ�s2|j}�q|jdu�r\|dd jd|_|dd =|D]ü} | ddu�svJ‚|�r¤tjd|d|d| d| djd�} nBtjd|d|d|d|d| d|  d¡|  d¡| djd� } t | jtj tj tj tj fƒ�r | } n| | |d¡} |�rH|�r8| | j| j¡n| | j| j¡t| ƒ} | | ¡�q`|S)zÿ Builds 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. ÚtypedefrTrKÚbitsizeNrAr>ér.rú?r4zInvalid declarationrV©rLr>rMÚalignr4rS)r3rMrTr>r4rUÚinit© r3rMr`rTZfuncspecr>rar\r4)r0r+rFr8Úhasattrr4r1rr@r?ÚEnumÚStructÚUnionrNr>rLZTypedefÚDeclrRr5r3r6r r() rrYÚdeclsÚtypedef_namespaceZ is_typedefZ declarationsr4ÚtZ decls_0_tailrAÚ declarationZ fixed_declr r r!Ú_build_declarationsps‚ &ÿ    û  ÿ    û÷  þzCParser._build_declarationscCsLd|dvr| d|j¡|j|t|dd�gdd�d}tj||||jd �S) z' Builds a function definition. r[rTzInvalid typedefN©rAraT©rYrhrirK)rAÚ param_declsÚbodyr4)r1r4rlrrZFuncDef)rrYrArorprkr r r!Ú_build_function_definitionÉs  ýýüz"CParser._build_function_definitioncCs|dkrtjStjSdS)z` Given a token (either STRUCT or UNION), selects the appropriate AST class. ÚstructN)rrerf)rÚtokenr r r!Ú_select_struct_union_classÚsz"CParser._select_struct_union_class) )ÚleftZLOR)ruZLAND)ruÚOR)ruZXOR)ruZAND)ruZEQZNE)ruZGTZGEZLTZLE)ruZRSHIFTZLSHIFT)ruÚPLUSÚMINUS)ruZTIMESZDIVIDEZMODcCs2|ddurt g¡|d<nt |d¡|d<dS)zh translation_unit_or_empty : translation_unit | empty rNrK)rZFileAST©rÚpr r r!Úp_translation_unit_or_emptyüs z#CParser.p_translation_unit_or_emptycCs|d|d<dS)z4 translation_unit : external_declaration rrKNr ryr r r!Úp_translation_unit_1szCParser.p_translation_unit_1cCs"|d |d¡|d|d<dS)zE translation_unit : translation_unit external_declaration rr]rKN)Úextendryr r r!Úp_translation_unit_2 szCParser.p_translation_unit_2cCs|dg|d<dS)z7 external_declaration : function_definition rrKNr ryr r r!Úp_external_declaration_1sz CParser.p_external_declaration_1cCs|d|d<dS)z/ external_declaration : declaration rrKNr ryr r r!Úp_external_declaration_2sz CParser.p_external_declaration_2cCs|dg|d<dS)zi external_declaration : pp_directive | pppragma_directive rrKNr ryr r r!Úp_external_declaration_3sz CParser.p_external_declaration_3cCs g|d<dS)z( external_declaration : SEMI rKNr ryr r r!Úp_external_declaration_4%sz CParser.p_external_declaration_4cCs|d|d<dS)z1 external_declaration : static_assert rrKNr ryr r r!Úp_external_declaration_5*sz CParser.p_external_declaration_5cCsVt|ƒdkr.t |dd| |d¡¡g|d<n$t |d|d| |d¡¡g|d<dS)zÈ static_assert : _STATIC_ASSERT LPAREN constant_expression COMMA unified_string_literal RPAREN | _STATIC_ASSERT LPAREN constant_expression RPAREN ééNrrK)r+rZ StaticAssertÚ _token_coordryr r r!Úp_static_assert_declaration/s "z#CParser.p_static_assert_declarationcCs| d| |d¡¡dS)z pp_directive : PPHASH zDirectives not supported yetrN)r1r†ryr r r!Úp_pp_directive8s ÿzCParser.p_pp_directivecCsFt|ƒdkr*t |d| |d¡¡|d<nt d| |d¡¡|d<dS)zg pppragma_directive : PPPRAGMA | PPPRAGMA PPPRAGMASTR r…r]rKr rN)r+rÚPragmar†ryr r r!Úp_pppragma_directive>s zCParser.p_pppragma_directivec CsNtgggtjdg| |d¡d�ggd�}|j||d|d|dd�|d<d S) zU function_definition : id_declarator declaration_list_opt compound_statement rDrrE©rSrVrTr>rUr]r…©rYrArorprKN)rrrNr†rq©rrzrYr r r!Úp_function_definition_1Is ÿúüzCParser.p_function_definition_1cCs.|d}|j||d|d|dd�|d<dS)zl function_definition : declaration_specifiers id_declarator declaration_list_opt compound_statement rr]r…érŒrKN)rqr�r r r!Úp_function_definition_2[süzCParser.p_function_definition_2cCs|d|d<dS)a_ statement : labeled_statement | expression_statement | compound_statement | selection_statement | iteration_statement | jump_statement | pppragma_directive | static_assert rrKNr ryr r r!Ú p_statementjs zCParser.p_statementcCsTt|dtjƒrDt|ƒdkrDtj|d|dg| |d¡d�|d<n |d|d<dS)zx pragmacomp_or_statement : pppragma_directive statement | statement rr…r]©Z block_itemsr4rKN)r?rr‰r+ÚCompoundr†ryr r r!Úp_pragmacomp_or_statement¡s  þ z!CParser.p_pragmacomp_or_statementc Cs¼|d}|ddurœ|d}tjtjtjf}t|ƒdkr€t|d|ƒr€tjd|d|d|d|d |ddd|djd � g}q°|j|t ddd �gd d �}n|j||dd d �}||d<dS)z˜ decl_body : declaration_specifiers init_declarator_list_opt | declaration_specifiers_no_type id_init_declarator_list_opt rr]Nr>rKrSrVrTrUrbrmTrn) rrerfrdr+r?rgr4rlr)rrzrYÚtyZs_u_or_erhr r r!Ú p_decl_bodyµs6 ÷  ýýzCParser.p_decl_bodycCs|d|d<dS)z& declaration : decl_body SEMI rrKNr ryr r r!Ú p_declarationòszCParser.p_declarationcCs,t|ƒdkr|dn|d|d|d<dS)zj declaration_list : declaration | declaration_list declaration r]rrKN©r+ryr r r!Úp_declaration_listûszCParser.p_declaration_listcCs| |d|dd¡|d<dS)z] declaration_specifiers_no_type : type_qualifier declaration_specifiers_no_type_opt r]rrSrKN©rZryr r r!Ú"p_declaration_specifiers_no_type_1sz*CParser.p_declaration_specifiers_no_type_1cCs| |d|dd¡|d<dS)zf declaration_specifiers_no_type : storage_class_specifier declaration_specifiers_no_type_opt r]rrTrKNršryr r r!Ú"p_declaration_specifiers_no_type_2 sz*CParser.p_declaration_specifiers_no_type_2cCs| |d|dd¡|d<dS)za declaration_specifiers_no_type : function_specifier declaration_specifiers_no_type_opt r]rrUrKNršryr r r!Ú"p_declaration_specifiers_no_type_3sz*CParser.p_declaration_specifiers_no_type_3cCs| |d|dd¡|d<dS)z_ declaration_specifiers_no_type : atomic_specifier declaration_specifiers_no_type_opt r]rr>rKNršryr r r!Ú"p_declaration_specifiers_no_type_4sz*CParser.p_declaration_specifiers_no_type_4cCs| |d|dd¡|d<dS)zb declaration_specifiers_no_type : alignment_specifier declaration_specifiers_no_type_opt r]rrVrKNršryr r r!Ú"p_declaration_specifiers_no_type_5sz*CParser.p_declaration_specifiers_no_type_5cCs"|j|d|dddd�|d<dS)zI declaration_specifiers : declaration_specifiers type_qualifier rr]rST©r(rKNršryr r r!Úp_declaration_specifiers_1!sz"CParser.p_declaration_specifiers_1cCs"|j|d|dddd�|d<dS)zR declaration_specifiers : declaration_specifiers storage_class_specifier rr]rTTr rKNršryr r r!Úp_declaration_specifiers_2&sz"CParser.p_declaration_specifiers_2cCs"|j|d|dddd�|d<dS)zM declaration_specifiers : declaration_specifiers function_specifier rr]rUTr rKNršryr r r!Úp_declaration_specifiers_3+sz"CParser.p_declaration_specifiers_3cCs"|j|d|dddd�|d<dS)zS declaration_specifiers : declaration_specifiers type_specifier_no_typeid rr]r>Tr rKNršryr r r!Úp_declaration_specifiers_40sz"CParser.p_declaration_specifiers_4cCs| d|dd¡|d<dS)z2 declaration_specifiers : type_specifier Nrr>rKršryr r r!Úp_declaration_specifiers_55sz"CParser.p_declaration_specifiers_5cCs"|j|d|dddd�|d<dS)zQ declaration_specifiers : declaration_specifiers_no_type type_specifier rr]r>Tr rKNršryr r r!Úp_declaration_specifiers_6:sz"CParser.p_declaration_specifiers_6cCs"|j|d|dddd�|d<dS)zN declaration_specifiers : declaration_specifiers alignment_specifier rr]rVTr rKNršryr r r!Úp_declaration_specifiers_7?sz"CParser.p_declaration_specifiers_7cCs|d|d<dS)a storage_class_specifier : AUTO | REGISTER | STATIC | EXTERN | TYPEDEF | _THREAD_LOCAL rrKNr ryr r r!Úp_storage_class_specifierDsz!CParser.p_storage_class_specifiercCs|d|d<dS)zR function_specifier : INLINE | _NORETURN rrKNr ryr r r!Úp_function_specifierNszCParser.p_function_specifiercCs$tj|dg| |d¡d�|d<dS)a+ type_specifier_no_typeid : VOID | _BOOL | CHAR | SHORT | INT | LONG | FLOAT | DOUBLE | _COMPLEX | SIGNED | UNSIGNED | __INT128 rrErKN©rrNr†ryr r r!Úp_type_specifier_no_typeidTsz"CParser.p_type_specifier_no_typeidcCs|d|d<dS)zó type_specifier : typedef_name | enum_specifier | struct_or_union_specifier | type_specifier_no_typeid | atomic_specifier rrKNr ryr r r!Úp_type_specifierdszCParser.p_type_specifiercCs |d}|j d¡||d<dS)z= atomic_specifier : _ATOMIC LPAREN type_name RPAREN r…Z_AtomicrKN)rMr()rrzÚtypr r r!Úp_atomic_specifierns zCParser.p_atomic_specifiercCs|d|d<dS)z• type_qualifier : CONST | RESTRICT | VOLATILE | _ATOMIC rrKNr ryr r r!Úp_type_qualifieruszCParser.p_type_qualifiercCs0t|ƒdkr|d|dgn|dg|d<dS)z„ init_declarator_list : init_declarator | init_declarator_list COMMA init_declarator r�rr…rKNr˜ryr r r!Úp_init_declarator_list}szCParser.p_init_declarator_listcCs,t|dt|ƒdkr|dndd�|d<dS)zb init_declarator : declarator | declarator EQUALS initializer rr]r…NrmrK©rr+ryr r r!Úp_init_declarator†szCParser.p_init_declaratorcCs0t|ƒdkr|d|dgn|dg|d<dS)z� id_init_declarator_list : id_init_declarator | id_init_declarator_list COMMA init_declarator r�rr…rKNr˜ryr r r!Úp_id_init_declarator_listŒsz!CParser.p_id_init_declarator_listcCs,t|dt|ƒdkr|dndd�|d<dS)zn id_init_declarator : id_declarator | id_declarator EQUALS initializer rr]r…NrmrKr±ryr r r!Úp_id_init_declarator’szCParser.p_id_init_declaratorcCs"|j|d|dddd�|d<dS)zY specifier_qualifier_list : specifier_qualifier_list type_specifier_no_typeid rr]r>Tr rKNršryr r r!Úp_specifier_qualifier_list_1šsz$CParser.p_specifier_qualifier_list_1cCs"|j|d|dddd�|d<dS)zO specifier_qualifier_list : specifier_qualifier_list type_qualifier rr]rSTr rKNršryr r r!Úp_specifier_qualifier_list_2Ÿsz$CParser.p_specifier_qualifier_list_2cCs| d|dd¡|d<dS)z4 specifier_qualifier_list : type_specifier Nrr>rKršryr r r!Úp_specifier_qualifier_list_3¤sz$CParser.p_specifier_qualifier_list_3cCs$t|dgg|dggd�|d<dS)zH specifier_qualifier_list : type_qualifier_list type_specifier rr]r‹rKN©rryr r r!Úp_specifier_qualifier_list_4©sz$CParser.p_specifier_qualifier_list_4cCs tg|dggggd�|d<dS)z9 specifier_qualifier_list : alignment_specifier rr‹rKNr¸ryr r r!Úp_specifier_qualifier_list_5®sz$CParser.p_specifier_qualifier_list_5cCs| |d|dd¡|d<dS)zR specifier_qualifier_list : specifier_qualifier_list alignment_specifier rr]rVrKNršryr r r!Úp_specifier_qualifier_list_6³sz$CParser.p_specifier_qualifier_list_6cCs0| |d¡}||dd| |d¡d�|d<dS)z{ struct_or_union_specifier : struct_or_union ID | struct_or_union TYPEID rr]N©r3rhr4rK)rtr†©rrzÚklassr r r!Úp_struct_or_union_specifier_1»s  ýz%CParser.p_struct_or_union_specifier_1cCsX| |d¡}t|ƒdkr6|dg| |d¡d�|d<n|d|d| |d¡d�|d<dS)z³ struct_or_union_specifier : struct_or_union brace_open struct_declaration_list brace_close | struct_or_union brace_open brace_close rr�Nr]r¼rKr…©rtr+r†r½r r r!Úp_struct_or_union_specifier_2Æs  ý  ýz%CParser.p_struct_or_union_specifier_2cCs`| |d¡}t|ƒdkr:||dg| |d¡d�|d<n"||d|d| |d¡d�|d<dS)a… struct_or_union_specifier : struct_or_union ID brace_open struct_declaration_list brace_close | struct_or_union ID brace_open brace_close | struct_or_union TYPEID brace_open struct_declaration_list brace_close | struct_or_union TYPEID brace_open brace_close rr„r]r¼rKr�NrÀr½r r r!Úp_struct_or_union_specifier_3Øs  ý  ýz%CParser.p_struct_or_union_specifier_3cCs|d|d<dS)zF struct_or_union : STRUCT | UNION rrKNr ryr r r!Úp_struct_or_unionëszCParser.p_struct_or_unioncCs:t|ƒdkr|dpg|d<n|d|dp.g|d<dS)z� struct_declaration_list : struct_declaration | struct_declaration_list struct_declaration r]rrKNr˜ryr r r!Úp_struct_declaration_listós z!CParser.p_struct_declaration_listcCs¬|d}d|dvsJ‚|ddur8|j||dd�}nht|dƒdkrˆ|dd}t|tjƒrf|}n t |¡}|j|t|d �gd�}n|j|tddd �gd�}||d<dS) zW struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI rr[rTr]N©rYrhr>rK©rArm)rlr+r?rZNoderNr)rrzrYrhZnodeZ decl_typer r r!Úp_struct_declaration_1üs* þ    þ  þzCParser.p_struct_declaration_1cCs d|d<dS)z# struct_declaration : SEMI NrKr ryr r r!Úp_struct_declaration_2"szCParser.p_struct_declaration_2cCs|dg|d<dS)z1 struct_declaration : pppragma_directive rrKNr ryr r r!Úp_struct_declaration_3'szCParser.p_struct_declaration_3cCs0t|ƒdkr|d|dgn|dg|d<dS)zŠ struct_declarator_list : struct_declarator | struct_declarator_list COMMA struct_declarator r�rr…rKNr˜ryr r r!Úp_struct_declarator_list,sz CParser.p_struct_declarator_listcCs|dddœ|d<dS)z( struct_declarator : declarator rN©rAr\rKr ryr r r!Úp_struct_declarator_15szCParser.p_struct_declarator_1cCsFt|ƒdkr$|d|ddœ|d<nt dddd¡|ddœ|d<dS)z€ struct_declarator : declarator COLON constant_expression | COLON constant_expression r…rrËrKNr])r+rr@ryr r r!Úp_struct_declarator_2:s zCParser.p_struct_declarator_2cCs"t |dd| |d¡¡|d<dS)zM enum_specifier : ENUM ID | ENUM TYPEID r]NrrK©rrdr†ryr r r!Úp_enum_specifier_1CszCParser.p_enum_specifier_1cCs"t d|d| |d¡¡|d<dS)zG enum_specifier : ENUM brace_open enumerator_list brace_close Nr…rrKrÎryr r r!Úp_enum_specifier_2IszCParser.p_enum_specifier_2cCs&t |d|d| |d¡¡|d<dS)z› enum_specifier : ENUM ID brace_open enumerator_list brace_close | ENUM TYPEID brace_open enumerator_list brace_close r]r�rrKNrÎryr r r!Úp_enum_specifier_3NszCParser.p_enum_specifier_3cCsht|ƒdkr*t |dg|dj¡|d<n:t|ƒdkrD|d|d<n |dj |d¡|d|d<dS)z™ enumerator_list : enumerator | enumerator_list COMMA | enumerator_list COMMA enumerator r]rrKr…N)r+rZEnumeratorListr4Z enumeratorsr(ryr r r!Úp_enumerator_listTs   zCParser.p_enumerator_listcCs t |d| |d¡¡|d<dS)z� alignment_specifier : _ALIGNAS LPAREN type_name RPAREN | _ALIGNAS LPAREN constant_expression RPAREN r…rrKN)rZAlignasr†ryr r r!Úp_alignment_specifieraszCParser.p_alignment_specifiercCsbt|ƒdkr(t |dd| |d¡¡}nt |d|d| |d¡¡}| |j|j¡||d<dS)zR enumerator : ID | ID EQUALS constant_expression r]rNr…rK)r+rZ Enumeratorr†r6r3r4)rrzZ enumeratorr r r!Ú p_enumeratorgs  þ  þzCParser.p_enumeratorcCs|d|d<dS)zQ declarator : id_declarator | typeid_declarator rrKNr ryr r r!Ú p_declaratorwszCParser.p_declarator)rHÚID)ZtypeidÚTYPEID)Ztypeid_noparenr×cCs|d|d<dS)z1 xxx_declarator : direct_xxx_declarator rrKNr ryr r r!Úp_xxx_declarator_1}szCParser.p_xxx_declarator_1cCs| |d|d¡|d<dS)z9 xxx_declarator : pointer direct_xxx_declarator r]rrKN©rCryr r r!Úp_xxx_declarator_2ƒszCParser.p_xxx_declarator_2c Cs(tj|dddd| |d¡d�|d<dS)z' direct_xxx_declarator : yyy rNr_rK)rr@r†ryr r r!Úp_direct_xxx_declarator_1‰s ûz!CParser.p_direct_xxx_declarator_1cCs|d|d<dS)z@ direct_xxx_declarator : LPAREN xxx_declarator RPAREN r]rKNr ryr r r!Úp_direct_xxx_declarator_2”sz!CParser.p_direct_xxx_declarator_2cCsft|ƒdkr|dngpg}tjdt|ƒdkr6|dn|d||djd�}|j|d|d�|d<dS) z} direct_xxx_declarator : direct_xxx_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET r„r…Nr�r©r>ZdimÚ dim_qualsr4©rArBrK)r+rÚ ArrayDeclr4rC)rrzrMÚarrr r r!Úp_direct_xxx_declarator_3šsüz!CParser.p_direct_xxx_declarator_3cCs^dd„|d|dfDƒ}dd„|Dƒ}tjd|d||djd �}|j|d|d �|d <dS) zÿ direct_xxx_declarator : direct_xxx_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET | direct_xxx_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET cSs g|]}t|tƒr|n|g‘qSr ©r?Úlist)rGÚitemr r r!rI±sÿz5CParser.p_direct_xxx_declarator_4..r…r�cSs"g|]}|D]}|dur |‘q qSr'r )rGZsublistrSr r r!rI³sÿNr„rrÝrßrK©rràr4rC)rrzZ listed_qualsrÞrár r r!Úp_direct_xxx_declarator_4©sÿüz!CParser.p_direct_xxx_declarator_4c CsZtjdt |d| |d¡¡|ddur0|dng|djd�}|j|d|d�|d<dS)zi direct_xxx_declarator : direct_xxx_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET Nr�r…rrÝrßrK©rràrÖr†r4rC©rrzrár r r!Úp_direct_xxx_declarator_5¿süz!CParser.p_direct_xxx_declarator_5cCsztj|dd|djd�}| ¡jdkr`|jdur`|jjD]$}t|tjƒrNq`|  |j |j¡q:|j |d|d�|d<dS)z¹ direct_xxx_declarator : direct_xxx_declarator LPAREN parameter_type_list RPAREN | direct_xxx_declarator LPAREN identifier_list_opt RPAREN r…Nr©Úargsr>r4ÚLBRACErßrK) rrOr4r=r>rìÚparamsr?Ú EllipsisParamr6r3rC)rrzÚfuncZparamr r r!Úp_direct_xxx_declarator_6Ësý  z!CParser.p_direct_xxx_declarator_6cCsj| |d¡}tj|dpgd|d�}t|ƒdkr^|d}|jdurJ|j}q8||_|d|d<n||d<dS)zm pointer : TIMES type_qualifier_list_opt | TIMES type_qualifier_list_opt pointer rr]N)rMr>r4r…rK)r†rZPtrDeclr+r>)rrzr4Z nested_typeZ tail_typer r r!Ú p_pointerès   zCParser.p_pointercCs0t|ƒdkr|dgn|d|dg|d<dS)zs type_qualifier_list : type_qualifier | type_qualifier_list type_qualifier r]rrKNr˜ryr r r!Úp_type_qualifier_listszCParser.p_type_qualifier_listcCs:t|ƒdkr*|dj t | |d¡¡¡|d|d<dS)zn parameter_type_list : parameter_list | parameter_list COMMA ELLIPSIS r]rr…rKN)r+rîr(rrïr†ryr r r!Úp_parameter_type_list s zCParser.p_parameter_type_listcCsNt|ƒdkr*t |dg|dj¡|d<n |dj |d¡|d|d<dS)zz parameter_list : parameter_declaration | parameter_list COMMA parameter_declaration r]rrKr…N©r+rZ ParamListr4rîr(ryr r r!Úp_parameter_lists zCParser.p_parameter_listcCsT|d}|ds.tjdg| |d¡d�g|d<|j|t|dd�gd�d|d<d S) zŸ parameter_declaration : declaration_specifiers id_declarator | declaration_specifiers typeid_noparen_declarator rr>rDrEr]rÆrÅrKN)rrNr†rlrr�r r r!Úp_parameter_declaration_1)s ÿ þþz!CParser.p_parameter_declaration_1c Csâ|d}|ds.tjdg| |d¡d�g|d<t|dƒdkrŽt|ddjƒdkrŽ| |ddjd¡rŽ|j|t|ddd �gd �d}nHtjd |d d|dp²t  dddd¡| |d¡d �}|d}|  ||¡}||d<dS)zR parameter_declaration : declaration_specifiers abstract_declarator_opt rr>rDrEr.rKr]NrmrÅr rS©r3rMr`r>r4) rrNr†r+rFr8rlrÚTypenamer@rR)rrzrYrArPr r r!Úp_parameter_declaration_25s0 ÿ &ÿþþ û z!CParser.p_parameter_declaration_2cCsNt|ƒdkr*t |dg|dj¡|d<n |dj |d¡|d|d<dS)ze identifier_list : identifier | identifier_list COMMA identifier r]rrKr…Nrõryr r r!Úp_identifier_listUs zCParser.p_identifier_listcCs|d|d<dS)z- initializer : assignment_expression rrKNr ryr r r!Úp_initializer_1_szCParser.p_initializer_1cCs6|ddur&t g| |d¡¡|d<n |d|d<dS)z‹ initializer : brace_open initializer_list_opt brace_close | brace_open initializer_list COMMA brace_close r]NrrK)rÚInitListr†ryr r r!Úp_initializer_2ds zCParser.p_initializer_2cCs–t|ƒdkrN|ddur |dnt |d|d¡}t |g|dj¡|d<nD|ddurb|dnt |d|d¡}|dj |¡|d|d<dS)z� initializer_list : designation_opt initializer | initializer_list COMMA designation_opt initializer r…rNr]rKr�)r+rZNamedInitializerrýr4Úexprsr()rrzrar r r!Úp_initializer_listms  ((zCParser.p_initializer_listcCs|d|d<dS)z. designation : designator_list EQUALS rrKNr ryr r r!Ú p_designationyszCParser.p_designationcCs0t|ƒdkr|dgn|d|dg|d<dS)z_ designator_list : designator | designator_list designator r]rrKNr˜ryr r r!Úp_designator_list�szCParser.p_designator_listcCs|d|d<dS)zi designator : LBRACKET constant_expression RBRACKET | PERIOD identifier r]rKNr ryr r r!Ú p_designator‡szCParser.p_designatorc Cs\tjd|dddd…d|dp0t dddd¡| |d¡d�}| ||dd¡|d<dS) zH type_name : specifier_qualifier_list abstract_declarator_opt r rrSNr]rør>rK)rrùr@r†rR)rrzrPr r r!Ú p_type_name�s ûzCParser.p_type_namecCs*t dddd¡}|j||dd�|d<dS)z+ abstract_declarator : pointer NrrßrK)rr@rC)rrzZ dummytyper r r!Úp_abstract_declarator_1™s þzCParser.p_abstract_declarator_1cCs| |d|d¡|d<dS)zF abstract_declarator : pointer direct_abstract_declarator r]rrKNrÙryr r r!Úp_abstract_declarator_2¡szCParser.p_abstract_declarator_2cCs|d|d<dS)z> abstract_declarator : direct_abstract_declarator rrKNr ryr r r!Úp_abstract_declarator_3¦szCParser.p_abstract_declarator_3cCs|d|d<dS)zA direct_abstract_declarator : LPAREN abstract_declarator RPAREN r]rKNr ryr r r!Úp_direct_abstract_declarator_1°sz&CParser.p_direct_abstract_declarator_1cCs6tjd|dg|djd�}|j|d|d�|d<dS)zn direct_abstract_declarator : direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET Nr…rrÝrßrKrærér r r!Úp_direct_abstract_declarator_2´süz&CParser.p_direct_abstract_declarator_2cCsbt|ƒdkr|dngpg}tjt dddd¡t|ƒdkrB|dn|d|| |d¡d�|d<dS)zk direct_abstract_declarator : LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET r�r]Nr…rrÝrK)r+rràr@r†)rrzrMr r r!Úp_direct_abstract_declarator_3¿s üz&CParser.p_direct_abstract_declarator_3c CsFtjdt |d| |d¡¡g|djd�}|j|d|d�|d<dS)zZ direct_abstract_declarator : direct_abstract_declarator LBRACKET TIMES RBRACKET Nr…rrÝrßrKrèrér r r!Úp_direct_abstract_declarator_4Ésüz&CParser.p_direct_abstract_declarator_4c CsBtjt dddd¡t |d| |d¡¡g| |d¡d�|d<dS)z? direct_abstract_declarator : LBRACKET TIMES RBRACKET Nr…rrÝrK)rràr@rÖr†ryr r r!Úp_direct_abstract_declarator_5Ôs  üz&CParser.p_direct_abstract_declarator_5cCs4tj|dd|djd�}|j|d|d�|d<dS)zh direct_abstract_declarator : direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN r…NrrërßrK)rrOr4rC)rrzrðr r r!Úp_direct_abstract_declarator_6Ýs ýz&CParser.p_direct_abstract_declarator_6cCs0tj|dt dddd¡| |d¡d�|d<dS)zM direct_abstract_declarator : LPAREN parameter_type_list_opt RPAREN r]NrrërK)rrOr@r†ryr r r!Úp_direct_abstract_declarator_7çs  ýz&CParser.p_direct_abstract_declarator_7cCs(t|dtƒr|dn|dg|d<dS)zG block_item : declaration | statement rrKNrãryr r r!Ú p_block_itemòszCParser.p_block_itemcCs:t|ƒdks|ddgkr"|dn|d|d|d<dS)z_ block_item_list : block_item | block_item_list block_item r]NrrKr˜ryr r r!Úp_block_item_listúszCParser.p_block_item_listcCs"tj|d| |d¡d�|d<dS)zA compound_statement : brace_open block_item_list_opt brace_close r]rr’rKN)rr“r†ryr r r!Úp_compound_statement_1s þzCParser.p_compound_statement_1cCs&t |d|d| |d¡¡|d<dS)z6 labeled_statement : ID COLON pragmacomp_or_statement rr…rKN)rZLabelr†ryr r r!Úp_labeled_statement_1szCParser.p_labeled_statement_1cCs(t |d|dg| |d¡¡|d<dS)zL labeled_statement : CASE constant_expression COLON pragmacomp_or_statement r]r�rrKN)rZCaser†ryr r r!Úp_labeled_statement_2 szCParser.p_labeled_statement_2cCs"t |dg| |d¡¡|d<dS)z; labeled_statement : DEFAULT COLON pragmacomp_or_statement r…rrKN)rZDefaultr†ryr r r!Úp_labeled_statement_3szCParser.p_labeled_statement_3c Cs(t |d|dd| |d¡¡|d<dS)zK selection_statement : IF LPAREN expression RPAREN pragmacomp_or_statement r…r„NrrK©rZIfr†ryr r r!Úp_selection_statement_1szCParser.p_selection_statement_1c Cs,t |d|d|d| |d¡¡|d<dS)zZ selection_statement : IF LPAREN expression RPAREN statement ELSE pragmacomp_or_statement r…r„érrKNrryr r r!Úp_selection_statement_2szCParser.p_selection_statement_2c Cs*tt |d|d| |d¡¡ƒ|d<dS)zO selection_statement : SWITCH LPAREN expression RPAREN pragmacomp_or_statement r…r„rrKN)r rZSwitchr†ryr r r!Úp_selection_statement_3sÿzCParser.p_selection_statement_3cCs&t |d|d| |d¡¡|d<dS)zN iteration_statement : WHILE LPAREN expression RPAREN pragmacomp_or_statement r…r„rrKN)rZWhiler†ryr r r!Úp_iteration_statement_1 szCParser.p_iteration_statement_1cCs&t |d|d| |d¡¡|d<dS)zV iteration_statement : DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMI r„r]rrKN)rZDoWhiler†ryr r r!Úp_iteration_statement_2$szCParser.p_iteration_statement_2c Cs2t |d|d|d|d| |d¡¡|d<dS)zx iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement r…r„ré rrKN)rÚForr†ryr r r!Úp_iteration_statement_3(szCParser.p_iteration_statement_3c CsBt t |d| |d¡¡|d|d|d| |d¡¡|d<dS)zp iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement r…rr�éérKN)rrZDeclListr†ryr r r!Úp_iteration_statement_4,sÿzCParser.p_iteration_statement_4cCs t |d| |d¡¡|d<dS)z jump_statement : GOTO ID SEMI r]rrKN)rZGotor†ryr r r!Úp_jump_statement_11szCParser.p_jump_statement_1cCst | |d¡¡|d<dS)z jump_statement : BREAK SEMI rrKN)rZBreakr†ryr r r!Úp_jump_statement_25szCParser.p_jump_statement_2cCst | |d¡¡|d<dS)z! jump_statement : CONTINUE SEMI rrKN)rZContinuer†ryr r r!Úp_jump_statement_39szCParser.p_jump_statement_3cCs0t t|ƒdkr|dnd| |d¡¡|d<dS)z\ jump_statement : RETURN expression SEMI | RETURN SEMI r�r]NrrK)rZReturnr+r†ryr r r!Úp_jump_statement_4=szCParser.p_jump_statement_4cCs4|ddur$t | |d¡¡|d<n |d|d<dS)z, expression_statement : expression_opt SEMI rNr]rK)rZEmptyStatementr†ryr r r!Úp_expression_statementCs zCParser.p_expression_statementcCsjt|ƒdkr|d|d<nLt|dtjƒsFt |dg|dj¡|d<|dj |d¡|d|d<dS)zn expression : assignment_expression | expression COMMA assignment_expression r]rrKr…N)r+r?rÚExprListr4rÿr(ryr r r!Ú p_expressionJs  zCParser.p_expressioncCs|d|d<dS)z: assignment_expression : LPAREN compound_statement RPAREN r]rKNr ryr r r!Ú#p_parenthesized_compound_expressionWsz+CParser.p_parenthesized_compound_expressioncCs$tj|dg| |d¡d�|d<dS)z typedef_name : TYPEID rrErKNrªryr r r!Úp_typedef_name[szCParser.p_typedef_namecCsDt|ƒdkr|d|d<n&t |d|d|d|dj¡|d<dS)z› assignment_expression : conditional_expression | unary_expression assignment_operator assignment_expression r]rrKr…N)r+rZ Assignmentr4ryr r r!Úp_assignment_expression_s zCParser.p_assignment_expressioncCs|d|d<dS)aÞ assignment_operator : EQUALS | XOREQUAL | TIMESEQUAL | DIVEQUAL | MODEQUAL | PLUSEQUAL | MINUSEQUAL | LSHIFTEQUAL | RSHIFTEQUAL | ANDEQUAL | OREQUAL rrKNr ryr r r!Úp_assignment_operatorms zCParser.p_assignment_operatorcCs|d|d<dS)z. constant_expression : conditional_expression rrKNr ryr r r!Úp_constant_expression|szCParser.p_constant_expressioncCsDt|ƒdkr|d|d<n&t |d|d|d|dj¡|d<dS)zœ conditional_expression : binary_expression | binary_expression CONDOP expression COLON conditional_expression r]rrKr…r„N)r+rZ TernaryOpr4ryr r r!Úp_conditional_expression€s z CParser.p_conditional_expressioncCsDt|ƒdkr|d|d<n&t |d|d|d|dj¡|d<dS)ak binary_expression : cast_expression | binary_expression TIMES binary_expression | binary_expression DIVIDE binary_expression | binary_expression MOD binary_expression | binary_expression PLUS binary_expression | binary_expression MINUS binary_expression | binary_expression RSHIFT binary_expression | binary_expression LSHIFT binary_expression | binary_expression LT binary_expression | binary_expression LE binary_expression | binary_expression GE binary_expression | binary_expression GT binary_expression | binary_expression EQ binary_expression | binary_expression NE binary_expression | binary_expression AND binary_expression | binary_expression OR binary_expression | binary_expression XOR binary_expression | binary_expression LAND binary_expression | binary_expression LOR binary_expression r]rrKr…N)r+rZBinaryOpr4ryr r r!Úp_binary_expression‰s zCParser.p_binary_expressioncCs|d|d<dS)z$ cast_expression : unary_expression rrKNr ryr r r!Úp_cast_expression_1£szCParser.p_cast_expression_1cCs&t |d|d| |d¡¡|d<dS)z; cast_expression : LPAREN type_name RPAREN cast_expression r]r�rrKN)rZCastr†ryr r r!Úp_cast_expression_2§szCParser.p_cast_expression_2cCs|d|d<dS)z* unary_expression : postfix_expression rrKNr ryr r r!Úp_unary_expression_1«szCParser.p_unary_expression_1cCs$t |d|d|dj¡|d<dS)z¸ unary_expression : PLUSPLUS unary_expression | MINUSMINUS unary_expression | unary_operator cast_expression rr]rKN©rÚUnaryOpr4ryr r r!Úp_unary_expression_2¯szCParser.p_unary_expression_2cCs:t |dt|ƒdkr|dn|d| |d¡¡|d<dS)z» unary_expression : SIZEOF unary_expression | SIZEOF LPAREN type_name RPAREN | _ALIGNOF LPAREN type_name RPAREN rr…r]rKN)rr4r+r†ryr r r!Úp_unary_expression_3¶s  ýzCParser.p_unary_expression_3cCs|d|d<dS)zÏ unary_operator : AND | TIMES | PLUS | MINUS | NOT | LNOT rrKNr ryr r r!Úp_unary_operatorÀszCParser.p_unary_operatorcCs|d|d<dS)z* postfix_expression : primary_expression rrKNr ryr r r!Úp_postfix_expression_1ÊszCParser.p_postfix_expression_1cCs$t |d|d|dj¡|d<dS)zG postfix_expression : postfix_expression LBRACKET expression RBRACKET rr…rKN)rÚArrayRefr4ryr r r!Úp_postfix_expression_2ÎszCParser.p_postfix_expression_2cCs4t |dt|ƒdkr|dnd|dj¡|d<dS)zœ postfix_expression : postfix_expression LPAREN argument_expression_list RPAREN | postfix_expression LPAREN RPAREN rr„r…NrK)rÚFuncCallr+r4ryr r r!Úp_postfix_expression_3ÒszCParser.p_postfix_expression_3cCs>t |d| |d¡¡}t |d|d||dj¡|d<dS)zÿ postfix_expression : postfix_expression PERIOD ID | postfix_expression PERIOD TYPEID | postfix_expression ARROW ID | postfix_expression ARROW TYPEID r…rr]rKN)rrÖr†Ú StructRefr4)rrzZfieldr r r!Úp_postfix_expression_4ØszCParser.p_postfix_expression_4cCs(t d|d|d|dj¡|d<dS)z{ postfix_expression : postfix_expression PLUSPLUS | postfix_expression MINUSMINUS rzr]rrKNr3ryr r r!Úp_postfix_expression_5ászCParser.p_postfix_expression_5cCst |d|d¡|d<dS)zÇ postfix_expression : LPAREN type_name RPAREN brace_open initializer_list brace_close | LPAREN type_name RPAREN brace_open initializer_list COMMA brace_close r]r„rKN)rZCompoundLiteralryr r r!Úp_postfix_expression_6çszCParser.p_postfix_expression_6cCs|d|d<dS)z" primary_expression : identifier rrKNr ryr r r!Úp_primary_expression_1íszCParser.p_primary_expression_1cCs|d|d<dS)z primary_expression : constant rrKNr ryr r r!Úp_primary_expression_2ñszCParser.p_primary_expression_2cCs|d|d<dS)zp primary_expression : unified_string_literal | unified_wstring_literal rrKNr ryr r r!Úp_primary_expression_3õszCParser.p_primary_expression_3cCs|d|d<dS)z0 primary_expression : LPAREN expression RPAREN r]rKNr ryr r r!Úp_primary_expression_4ûszCParser.p_primary_expression_4cCsB| |d¡}t t |d|¡t |d|dg|¡|¡|d<dS)za primary_expression : OFFSETOF LPAREN type_name COMMA offsetof_member_designator RPAREN rr…r„rKN)r†rr;rÖr')rrzr4r r r!Úp_primary_expression_5ÿs  þzCParser.p_primary_expression_5cCs�t|ƒdkr|d|d<nrt|ƒdkrNt |d|d|d|dj¡|d<n>t|ƒdkr|t |d|d|dj¡|d<ntdt|ƒƒ‚dS) zì offsetof_member_designator : identifier | offsetof_member_designator PERIOD identifier | offsetof_member_designator LBRACKET expression RBRACKET r]rrKr�r…r„z$Unexpected parsing state. len(p): %uN)r+rr=r4r9ÚNotImplementedErrorryr r r!Úp_offsetof_member_designators  ( "z$CParser.p_offsetof_member_designatorcCsNt|ƒdkr*t |dg|dj¡|d<n |dj |d¡|d|d<dS)zœ argument_expression_list : assignment_expression | argument_expression_list COMMA assignment_expression r]rrKr…N)r+rr'r4rÿr(ryr r r!Úp_argument_expression_lists z"CParser.p_argument_expression_listcCs t |d| |d¡¡|d<dS)z identifier : ID rrKN)rrÖr†ryr r r!Ú p_identifierszCParser.p_identifiercCsœd}d}|ddd…D]&}|dvr.|d7}q|dvr|d7}qd}|dkrVtdƒ‚n|d krftd ƒ‚d |d |}t |d |d| |d¡¡|d<dS)zÆ constant : INT_CONST_DEC | INT_CONST_OCT | INT_CONST_HEX | INT_CONST_BIN | INT_CONST_CHAR rKréýÿÿÿN©ÚlÚL)ÚuÚUr z.Constant cannot have more than one u/U suffix.r]z.Constant cannot have more than two l/L suffix.z unsigned zlong rD)Ú ValueErrorrÚConstantr†)rrzZuCountZlCountÚxrjÚprefixr r r!Ú p_constant_1#s    ÿzCParser.p_constant_1cCshd|d ¡vrd}n0|dddvr,d}n|dddvrBd}nd}t ||d| |d¡¡|d <d S) zM constant : FLOAT_CONST | HEX_FLOAT_CONST rRrÚfloatr.)ÚfÚFrKz long doubleZdoublerKN)ÚlowerrrQr†)rrzrjr r r!Ú p_constant_2:sÿzCParser.p_constant_2cCs"t d|d| |d¡¡|d<dS)z¿ constant : CHAR_CONST | WCHAR_CONST | U8CHAR_CONST | U16CHAR_CONST | U32CHAR_CONST ÚcharrrKN)rrQr†ryr r r!Ú p_constant_3KsÿzCParser.p_constant_3cCsdt|ƒdkr,t d|d| |d¡¡|d<n4|djdd…|ddd…|d_|d|d<dS)z~ unified_string_literal : STRING_LITERAL | unified_string_literal STRING_LITERAL r]ÚstringrrKNr.)r+rrQr†Úvalueryr r r!Úp_unified_string_literalZs  ÿ (z CParser.p_unified_string_literalcCsht|ƒdkr,t d|d| |d¡¡|d<n8|dj ¡dd…|ddd…|d_|d|d<dS)a unified_wstring_literal : WSTRING_LITERAL | U8STRING_LITERAL | U16STRING_LITERAL | U32STRING_LITERAL | unified_wstring_literal WSTRING_LITERAL | unified_wstring_literal U8STRING_LITERAL | unified_wstring_literal U16STRING_LITERAL | unified_wstring_literal U32STRING_LITERAL r]r\rrKNr.)r+rrQr†r]Úrstripryr r r!Úp_unified_wstring_literales ÿ ,z!CParser.p_unified_wstring_literalcCs"|d|d<| d| d¡¡dS)z brace_open : LBRACE rrKN©Z set_linenoÚlinenoryr r r!Ú p_brace_openvs zCParser.p_brace_opencCs"|d|d<| d| d¡¡dS)z brace_close : RBRACE rrKNraryr r r!Ú p_brace_close|s zCParser.p_brace_closecCs d|d<dS)zempty : NrKr ryr r r!Úp_empty‚szCParser.p_emptycCs@|r,| d|j|j|j|j |¡d�¡n| d|jj¡dS)Nz before: %s)rbr<zAt end of input)r1r]r9rbrZfind_tok_columnr$ryr r r!Úp_error†s ÿþzCParser.p_errorN)r F)F)F)¯Ú__name__Ú __module__Ú __qualname__rr"r%r*r-r5r6r8rrrrr=rCrRrZrlrqrtZ precedencer{r|r~rr€r�r‚rƒr‡rˆrŠrŽr�r‘r”r–r—r™r›rœr�ržrŸr¡r¢r£r¤r¥r¦r§r¨r©r«r¬r®r¯r°r²r³r´rµr¶r·r¹rºr»r¿rÁrÂrÃrÄrÇrÈrÉrÊrÌrÍrÏrÐrÑrÒrÓrÔrÕrrØrÚrÛrÜrârçrêrñròrórôrör÷rúrûrürþrrrrrrrrrr r r r r rrrrrrrrrrrrrr!r"r#r$r%r&r(r)r*r+r,r-r.r/r0r1r2r5r6r7r8r:r<r>r?r@rArBrCrDrErGrHrIrTrYr[r^r`rcrdrerfr r r r!r srø o     )2,  Y    7=       &                                                                     r N)Zplyrr rZc_lexerrZ plyparserrrrrZast_transformsr r r r r r r!Ú s