3 ]@sddlZddlmZddlmZddlmZddlmZm Z m Z ddl m Z Gdd d eZ ed kr|ddlZddlZddlZdS) N)yacc)c_ast)CLexer) PLYParserCoord ParseError)fix_switch_casesc @sDeZdZdCddZdDd d Zd d Zd dZddZddZddZ ddZ ddZ ddZ ddZ ddZdd Zd!d"Zd#d$ZdEd%d&Zd'd(Zd)d*ZdPZd>d?Zd@dAZdBdCZdDdEZdFdGZdHdIZdJdKZdLdMZdNdOZdPdQZdRdSZ dTdUZ!dVdWZ"dXdYZ#dZd[Z$d\d]Z%d^d_Z&d`daZ'dbdcZ(dddeZ)dfdgZ*dhdiZ+djdkZ,dldmZ-dndoZ.dpdqZ/drdsZ0dtduZ1dvdwZ2dxdyZ3dzd{Z4d|d}Z5d~dZ6ddZ7ddZ8ddZ9ddZ:ddZ;ddZddZ?ddZ@ddZAddZBddZCddZDddZEddZFddZGddZHddZIddZJddZKddZLddZMddZNddZOddZPddZQddZRddZSddZTddZUddZVddZWddÄZXddńZYddDŽZZddɄZ[dd˄Z\dd̈́Z]ddτZ^ddфZ_ddӄZ`ddՄZaddׄZbddلZcddۄZddd݄Zedd߄ZfddZgddZhddZiddZjddZkddZlddZmddZnddZoddZpddZqddZrddZsddZtddZuddZvddZwddZxddZyddZzdd Z{d d Z|d d Z}ddZ~ddZddZddZddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd2d3Zd4d5Zd6d7Zd8d9Zd:d;Zd<d=Zd>d?Zd@dAZdBS(QCParserTpycparser.lextabpycparser.yacctabFc Cst|j|j|j|jd|_|jj|||d|jj|_ddddddd d d d d dddg}x|D]}|j|q\Wt j |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. 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)optimizelextab outputdirZabstract_declaratorZassignment_expressionZdeclaration_listZdeclaration_specifiersZ designationZ expressionZidentifier_listZinit_declarator_listZinitializer_listZparameter_type_listZspecifier_qualifier_listZblock_item_listZtype_qualifier_listZstruct_declarator_listZtranslation_unit_or_empty)modulestartdebugrZ tabmodulerN)r_lex_error_func_lex_on_lbrace_func_lex_on_rbrace_func_lex_type_lookup_funcclexZbuildtokensZ_create_opt_rulercparserdict _scope_stack_last_yielded_token) selfZ lex_optimizerZ yacc_optimizeZyacctabZ yacc_debugZ taboutputdirZrules_with_optZruler/usr/lib/python3.6/c_parser.py__init__sF5    zCParser.__init__rcCs6||j_|jjtg|_d|_|jj||j|dS)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) debuglevel: Debug level to yacc N)inputZlexerr)rfilenameZ reset_linenorrrrparse)rtextr#Z debuglevelrrr r$~s   z CParser.parsecCs|jjtdS)N)rappendr)rrrr _push_scopeszCParser._push_scopecCs t|jdkst|jjdS)Nr)lenrAssertionErrorpop)rrrr _pop_scopeszCParser._pop_scopecCs4|jdj|ds"|jd||d|jd|<dS)zC Add a new typedef name (ie a TYPEID) to the current scope rTz;Typedef %r previously declared as non-typedef in this scopeNr,)rget _parse_error)rnamecoordrrr _add_typedef_names  zCParser._add_typedef_namecCs4|jdj|dr"|jd||d|jd|<dS)ze Add a new object, function, or enum member name (ie an ID) to the current scope rFz;Non-typedef %r previously declared as typedef in this scopeNr,r,)rr-r.)rr/r0rrr _add_identifiers  zCParser._add_identifiercCs.x(t|jD]}|j|}|dk r |Sq WdS)z8 Is *name* a typedef-name in the current scope? NF)reversedrr-)rr/ZscopeZin_scoperrr _is_type_in_scopes  zCParser._is_type_in_scopecCs|j||j||dS)N)r._coord)rmsglinecolumnrrr rszCParser._lex_error_funccCs |jdS)N)r')rrrr rszCParser._lex_on_lbrace_funccCs |jdS)N)r+)rrrr rszCParser._lex_on_rbrace_funccCs|j|}|S)z Looks up types that were previously defined with typedef. Passed to the lexer for recognizing identifiers that are types. )r4)rr/Zis_typerrr rs 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_token)rrrr _get_yacc_lookahead_tokensz!CParser._get_yacc_lookahead_tokencCsd|}|}x|jr|j}q Wt|tjr0||_|S|}xt|jtjsL|j}q6W|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 isinstancerTypeDecl)rdeclmodifierZ modifier_headZ modifier_tailZ decl_tailrrr _type_modify_decls    zCParser._type_modify_declcCs|}xt|tjs|j}qW|j|_|j|_x>|D]6}t|tjs2t|dkr^|j d|j q2||_|Sq2W|st|jtj s|j d|j tjdg|j d|_n tjdd|D|dj d|_|S) z- Fixes a declaration. Modifies decl. rz Invalid multiple types specifiedzMissing type in declarationint)r0cSsg|]}|jD]}|qqSr)names).0idr/rrr Usz/CParser._fix_decl_name_type..r) r;rr<r:declnamer/qualsIdentifierTyper(r.r0FuncDecl)rr=typenamer:Ztnrrr _fix_decl_name_type,s.       zCParser._fix_decl_name_typecCs(|ptggggd}||jd||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 This method is given a declaration specifier, and a new specifier of a given kind. Returns the declaration specifier, with the new specifier incorporated. )qualstorager:functionr)rinsert)rZdeclspecZnewspecZkindspecrrr _add_declaration_specifierYs z"CParser._add_declaration_specifierc CsRd|dk}g}|djddk r&n4|dddkrt|ddksvt|ddjd ksv|j|ddjd rd }x"|dD]}t|d r|j}PqW|jd |tj|ddjddd|ddjd |dd<|dd=nrt |ddtj tj tj fsZ|dd}xt |tjs.|j }qW|jdkrZ|ddjd|_|dd=x|D]} | ddk svt|rtjd|d|d| d| djd} n|r.|j| j| jn|j| j| j|j| q`W|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. typedefrLrbitsizeNr=r:r?r0zInvalid declaration)rEr:rFr0rK)r/rFrLr:r0rMinit)r/rFrLfuncspecr:rUrRr0r,r,r,r,r,r,r,)r-r(rAr4hasattrr0r.rr<r;StructUnionrGr:rEr)ZTypedefDeclrJr1r/r2r&) rrOdeclstypedef_namespaceZ is_typedefZ declarationsr0tZ decls_0_tailr= declarationZ fixed_declrrr _build_declarationsjsn &         zCParser._build_declarationscCsBd|dkst|j|t|ddgddd}tj||||jdS) z' Builds a function definition. rQrLN)r=rUT)rOr[r\r)r= param_declsbodyr0)r)r_rrZFuncDefr0)rrOr=r`rar^rrr _build_function_definitions  z"CParser._build_function_definitioncCs|dkrtjStjSdS)z` Given a token (either STRUCT or UNION), selects the appropriate AST class. structN)rrXrY)rtokenrrr _select_struct_union_classsz"CParser._select_struct_union_classleftLORLANDORXORANDEQNEGTGELTLERSHIFTLSHIFTPLUSMINUSTIMESDIVIDEMODcCs2|ddkrtjg|d<ntj|d|d<dS)zh translation_unit_or_empty : translation_unit | empty rNr)rZFileAST)rprrr p_translation_unit_or_emptys z#CParser.p_translation_unit_or_emptycCs|d|d<dS)z4 translation_unit : external_declaration rrNr)rryrrr p_translation_unit_1szCParser.p_translation_unit_1cCs.|ddk r|dj|d|d|d<dS)zE translation_unit : translation_unit external_declaration rSNrr)extend)rryrrr p_translation_unit_2s zCParser.p_translation_unit_2cCs|dg|d<dS)z7 external_declaration : function_definition rrNr)rryrrr p_external_declaration_1sz CParser.p_external_declaration_1cCs|d|d<dS)z/ external_declaration : declaration rrNr)rryrrr p_external_declaration_2sz CParser.p_external_declaration_2cCs|d|d<dS)z0 external_declaration : pp_directive rrNr)rryrrr p_external_declaration_3sz CParser.p_external_declaration_3cCs d|d<dS)z( external_declaration : SEMI Nrr)rryrrr p_external_declaration_4sz CParser.p_external_declaration_4cCs|jd|j|jddS)z pp_directive : PPHASH zDirectives not supported yetrN)r.r5lineno)rryrrr p_pp_directive$szCParser.p_pp_directivecCsPtggtjdg|j|jddggd}|j||d|d|dd|d<d S) zR function_definition : declarator declaration_list_opt compound_statement r@r)r0)rKrLr:rMrS)rOr=r`rarN)rrrGr5rrb)rryrOrrr p_function_definition_1-szCParser.p_function_definition_1cCs.|d}|j||d|d|dd|d<dS)zi function_definition : declaration_specifiers declarator declaration_list_opt compound_statement rrSr)rOr=r`rarN)rb)rryrOrrr 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 rrNr)rryrrr p_statementIszCParser.p_statementc Cs|d}|ddkr|d}tjtjtjf}t|dkrzt|d|rztjd|d|d|d|ddd|djd g}q|j|t ddd gd d }n|j||dd d }||d<dS) zE decl_body : declaration_specifiers init_declarator_list_opt rrSNr:rrKrLrM)r/rFrLrVr:rUrRr0)r=rUT)rOr[r\) rrXrYEnumr(r;rZr0r_r)rryrOZtyZs_u_or_er[rrr p_decl_body\s.   zCParser.p_decl_bodycCs|d|d<dS)z& declaration : decl_body SEMI rrNr)rryrrr p_declarationszCParser.p_declarationcCs,t|dkr|dn|d|d|d<dS)zj declaration_list : declaration | declaration_list declaration rSrrN)r()rryrrr p_declaration_listszCParser.p_declaration_listcCs|j|d|dd|d<dS)zM declaration_specifiers : type_qualifier declaration_specifiers_opt rSrrKrN)rP)rryrrr p_declaration_specifiers_1sz"CParser.p_declaration_specifiers_1cCs|j|d|dd|d<dS)zM declaration_specifiers : type_specifier declaration_specifiers_opt rSrr:rN)rP)rryrrr p_declaration_specifiers_2sz"CParser.p_declaration_specifiers_2cCs|j|d|dd|d<dS)zV declaration_specifiers : storage_class_specifier declaration_specifiers_opt rSrrLrN)rP)rryrrr p_declaration_specifiers_3sz"CParser.p_declaration_specifiers_3cCs|j|d|dd|d<dS)zQ declaration_specifiers : function_specifier declaration_specifiers_opt rSrrMrN)rP)rryrrr p_declaration_specifiers_4sz"CParser.p_declaration_specifiers_4cCs|d|d<dS)z storage_class_specifier : AUTO | REGISTER | STATIC | EXTERN | TYPEDEF rrNr)rryrrr p_storage_class_specifiersz!CParser.p_storage_class_specifiercCs|d|d<dS)z& function_specifier : INLINE rrNr)rryrrr p_function_specifierszCParser.p_function_specifiercCs(tj|dg|j|jdd|d<dS)a type_specifier : VOID | _BOOL | CHAR | SHORT | INT | LONG | FLOAT | DOUBLE | _COMPLEX | SIGNED | UNSIGNED r)r0rN)rrGr5r)rryrrr p_type_specifier_1s zCParser.p_type_specifier_1cCs|d|d<dS)z type_specifier : typedef_name | enum_specifier | struct_or_union_specifier rrNr)rryrrr p_type_specifier_2szCParser.p_type_specifier_2cCs|d|d<dS)zo type_qualifier : CONST | RESTRICT | VOLATILE rrNr)rryrrr p_type_qualifierszCParser.p_type_qualifiercCs0t|dkr|d|dgn|dg|d<dS)z init_declarator_list : init_declarator | init_declarator_list COMMA init_declarator rrrrN)r()rryrrr p_init_declarator_list_1sz CParser.p_init_declarator_list_1cCstd|ddg|d<dS)z6 init_declarator_list : EQUALS initializer NrS)r=rUr)r)rryrrr p_init_declarator_list_2sz CParser.p_init_declarator_list_2cCst|dddg|d<dS)z7 init_declarator_list : abstract_declarator rN)r=rUr)r)rryrrr p_init_declarator_list_3sz CParser.p_init_declarator_list_3cCs,t|dt|dkr|dndd|d<dS)zb init_declarator : declarator | declarator EQUALS initializer rrSrN)r=rUr)rr()rryrrr p_init_declaratorszCParser.p_init_declaratorcCs|j|d|dd|d<dS)zS specifier_qualifier_list : type_qualifier specifier_qualifier_list_opt rSrrKrN)rP)rryrrr p_specifier_qualifier_list_1sz$CParser.p_specifier_qualifier_list_1cCs|j|d|dd|d<dS)zS specifier_qualifier_list : type_specifier specifier_qualifier_list_opt rSrr:rN)rP)rryrrr p_specifier_qualifier_list_2 sz$CParser.p_specifier_qualifier_list_2cCs4|j|d}||dd|j|jdd|d<dS)z{ struct_or_union_specifier : struct_or_union ID | struct_or_union TYPEID rrSN)r/r[r0r)rer5r)rryklassrrr p_struct_or_union_specifier_1s z%CParser.p_struct_or_union_specifier_1cCs4|j|d}|d|d|j|jdd|d<dS)zd struct_or_union_specifier : struct_or_union brace_open struct_declaration_list brace_close rNrrS)r/r[r0r)rer5r)rryrrrr p_struct_or_union_specifier_2s z%CParser.p_struct_or_union_specifier_2cCs8|j|d}||d|d|j|jdd|d<dS)z struct_or_union_specifier : struct_or_union ID brace_open struct_declaration_list brace_close | struct_or_union TYPEID brace_open struct_declaration_list brace_close rrSr)r/r[r0rN)rer5r)rryrrrr p_struct_or_union_specifier_3&s z%CParser.p_struct_or_union_specifier_3cCs|d|d<dS)zF struct_or_union : STRUCT | UNION rrNr)rryrrr p_struct_or_union0szCParser.p_struct_or_unioncCs,t|dkr|dn|d|d|d<dS)z struct_declaration_list : struct_declaration | struct_declaration_list struct_declaration rSrrN)r()rryrrr p_struct_declaration_list8sz!CParser.p_struct_declaration_listcCs|d}d|dkst|ddk r8|j||dd}nht|ddkr|dd}t|tjrf|}n tj|}|j|t|d gd}n|j|tddd gd}||d<dS) zW struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI rrQrLrSN)rOr[r:r)r=)r=rU)r)r_r(r;rZNoderGr)rryrOr[ZnodeZ decl_typerrr p_struct_declaration_1>s$    zCParser.p_struct_declaration_1cCs(|j|dt|dddgd|d<dS)zP struct_declaration : specifier_qualifier_list abstract_declarator SEMI rrSN)r=rU)rOr[r)r_r)rryrrr p_struct_declaration_2ds zCParser.p_struct_declaration_2cCs0t|dkr|d|dgn|dg|d<dS)z struct_declarator_list : struct_declarator | struct_declarator_list COMMA struct_declarator rrrrN)r()rryrrr p_struct_declarator_listrsz CParser.p_struct_declarator_listcCs|ddd|d<dS)z( struct_declarator : declarator rN)r=rRrr)rryrrr p_struct_declarator_1{szCParser.p_struct_declarator_1cCsDt|dkr$|d|dd|d<ntjddd|dd|d<dS)z struct_declarator : declarator COLON constant_expression | COLON constant_expression rr)r=rRrNrS)r(rr<)rryrrr p_struct_declarator_2s zCParser.p_struct_declarator_2cCs&tj|dd|j|jd|d<dS)zM enum_specifier : ENUM ID | ENUM TYPEID rSNrr)rrr5r)rryrrr p_enum_specifier_1szCParser.p_enum_specifier_1cCs&tjd|d|j|jd|d<dS)zG enum_specifier : ENUM brace_open enumerator_list brace_close Nrrr)rrr5r)rryrrr p_enum_specifier_2szCParser.p_enum_specifier_2cCs*tj|d|d|j|jd|d<dS)z enum_specifier : ENUM ID brace_open enumerator_list brace_close | ENUM TYPEID brace_open enumerator_list brace_close rSrrrN)rrr5r)rryrrr p_enum_specifier_3szCParser.p_enum_specifier_3cCsht|dkr*tj|dg|dj|d<n:t|dkrD|d|d<n |djj|d|d|d<dS)z enumerator_list : enumerator | enumerator_list COMMA | enumerator_list COMMA enumerator rSrrrN)r(rZEnumeratorListr0Z enumeratorsr&)rryrrr p_enumerator_lists   zCParser.p_enumerator_listcCsjt|dkr,tj|dd|j|jd}n"tj|d|d|j|jd}|j|j|j||d<dS)zR enumerator : ID | ID EQUALS constant_expression rSrNrr)r(rZ Enumeratorr5rr2r/r0)rryZ enumeratorrrr p_enumerators  zCParser.p_enumeratorcCs|d|d<dS)z) declarator : direct_declarator rrNr)rryrrr p_declarator_1szCParser.p_declarator_1cCs|j|d|d|d<dS)z1 declarator : pointer direct_declarator rSrrN)r?)rryrrr p_declarator_2szCParser.p_declarator_2cCs:tj|ddd|j|jdd}|j||d|d<dS)z& declarator : pointer TYPEID rSN)rEr:rFr0rr)rr<r5rr?)rryr=rrr p_declarator_3s zCParser.p_declarator_3cCs*tj|ddd|j|jdd|d<dS)z" direct_declarator : ID rN)rEr:rFr0r)rr<r5r)rryrrr p_direct_declarator_1s zCParser.p_direct_declarator_1cCs|d|d<dS)z8 direct_declarator : LPAREN declarator RPAREN rSrNr)rryrrr p_direct_declarator_2szCParser.p_direct_declarator_2cCsft|dkr|dngpg}tjdt|dkr6|dn|d||djd}|j|d|d|d<dS) zu direct_declarator : direct_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET rNrr)r:dim dim_qualsr0)r=r>r)r(r ArrayDeclr0r?)rryrFarrrrr p_direct_declarator_3szCParser.p_direct_declarator_3cCs^dd|d|dgD}dd|D}tjd|d||djd }|j|d|d |d <dS) z direct_declarator : direct_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET | direct_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET cSs g|]}t|tr|n|gqSr)r;list)rBitemrrr rDsz1CParser.p_direct_declarator_4..rrcSs"g|]}|D]}|dk r |q qS)Nr)rBZsublistrKrrr rDs Nrr)r:rrr0)r=r>r)rrr0r?)rryZ listed_qualsrrrrr p_direct_declarator_4szCParser.p_direct_declarator_4cCs^tjdtj|d|j|jd|ddkr4|dng|djd}|j|d|d|d<dS)za direct_declarator : direct_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET Nrrr)r:rrr0)r=r>r)rrIDr5rr0r?)rryrrrr p_direct_declarator_5s zCParser.p_direct_declarator_5cCs|tj|dd|djd}|jjdkrb|jdk rbx.|jjD]"}t|tjrNP|j |j |jqr) rrHr0r9r:rparamsr; EllipsisParamr2r/r?)rryfuncZparamrrr p_direct_declarator_6 s   zCParser.p_direct_declarator_6cCsr|j|jd}tj|dpgd|d}t|dkrf|d}x|jdk rP|j}q>W||_|d|d<n||d<dS)zm pointer : TIMES type_qualifier_list_opt | TIMES type_qualifier_list_opt pointer rrSN)rFr:r0rr)r5rrZPtrDeclr(r:)rryr0Z nested_typeZ tail_typerrr p_pointer(s   zCParser.p_pointercCs0t|dkr|dgn|d|dg|d<dS)zs type_qualifier_list : type_qualifier | type_qualifier_list type_qualifier rSrrN)r()rryrrr p_type_qualifier_listFszCParser.p_type_qualifier_listcCs>t|dkr.|djjtj|j|jd|d|d<dS)zn parameter_type_list : parameter_list | parameter_list COMMA ELLIPSIS rSrrrN)r(rr&rrr5r)rryrrr p_parameter_type_listLs "zCParser.p_parameter_type_listcCsNt|dkr*tj|dg|dj|d<n |djj|d|d|d<dS)zz parameter_list : parameter_declaration | parameter_list COMMA parameter_declaration rSrrrN)r(r ParamListr0rr&)rryrrr p_parameter_listUs zCParser.p_parameter_listcCsX|d}|ds2tjdg|j|jddg|d<|j|t|ddgdd|d<d S) zE parameter_declaration : declaration_specifiers declarator rr:r@)r0rS)r=)rOr[rN)rrGr5rr_r)rryrOrrr p_parameter_declaration_1_sz!CParser.p_parameter_declaration_1cCs|d}|ds2tjdg|j|jddg|d<t|ddkrt|dd jdkr|j|ddjdr|j|t|dddgd d}nHtj d |d |dptj ddd|j|jdd }|d}|j ||}||d<dS)zR parameter_declaration : declaration_specifiers abstract_declarator_opt rr:r@)r0rrSN)r=rU)rOr[r rK)r/rFr:r0r,r,) rrGr5rr(rAr4r_rTypenamer<rJ)rryrOr=rIrrr p_parameter_declaration_2js"& z!CParser.p_parameter_declaration_2cCsNt|dkr*tj|dg|dj|d<n |djj|d|d|d<dS)ze identifier_list : identifier | identifier_list COMMA identifier rSrrrN)r(rrr0rr&)rryrrr p_identifier_lists zCParser.p_identifier_listcCs|d|d<dS)z- initializer : assignment_expression rrNr)rryrrr p_initializer_1szCParser.p_initializer_1cCs:|ddkr*tjg|j|jd|d<n |d|d<dS)z initializer : brace_open initializer_list_opt brace_close | brace_open initializer_list COMMA brace_close rSNrr)rInitListr5r)rryrrr p_initializer_2s zCParser.p_initializer_2cCst|dkrN|ddkr |dntj|d|d}tj|g|dj|d<nD|ddkrb|dntj|d|d}|djj||d|d<dS)z initializer_list : designation_opt initializer | initializer_list COMMA designation_opt initializer rrNrSrr)r(rZNamedInitializerrr0exprsr&)rryrUrrr p_initializer_lists  ((zCParser.p_initializer_listcCs|d|d<dS)z. designation : designator_list EQUALS rrNr)rryrrr p_designationszCParser.p_designationcCs0t|dkr|dgn|d|dg|d<dS)z_ designator_list : designator | designator_list designator rSrrN)r()rryrrr p_designator_listszCParser.p_designator_listcCs|d|d<dS)zi designator : LBRACKET constant_expression RBRACKET | PERIOD identifier rSrNr)rryrrr p_designatorszCParser.p_designatorcCsTtjd|dd|dp$tjddd|j|jdd}|j||dd|d<dS) zH type_name : specifier_qualifier_list abstract_declarator_opt r rrKrSN)r/rFr:r0r:r)rrr<r5rrJ)rryrIrrr p_type_names  zCParser.p_type_namecCs(tjddd}|j||dd|d<dS)z+ abstract_declarator : pointer Nr)r=r>r)rr<r?)rryZ dummytyperrr p_abstract_declarator_1szCParser.p_abstract_declarator_1cCs|j|d|d|d<dS)zF abstract_declarator : pointer direct_abstract_declarator rSrrN)r?)rryrrr p_abstract_declarator_2szCParser.p_abstract_declarator_2cCs|d|d<dS)z> abstract_declarator : direct_abstract_declarator rrNr)rryrrr p_abstract_declarator_3szCParser.p_abstract_declarator_3cCs|d|d<dS)zA direct_abstract_declarator : LPAREN abstract_declarator RPAREN rSrNr)rryrrr p_direct_abstract_declarator_1sz&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 Nrr)r:rrr0)r=r>r)rrr0r?)rryrrrr p_direct_abstract_declarator_2s z&CParser.p_direct_abstract_declarator_2cCs4tjtjddd|dg|j|jdd|d<dS)zS direct_abstract_declarator : LBRACKET assignment_expression_opt RBRACKET NrSr)r:rrr0r)rrr<r5r)rryrrr p_direct_abstract_declarator_3s  z&CParser.p_direct_abstract_declarator_3cCsJtjdtj|d|j|jdg|djd}|j|d|d|d<dS)zZ direct_abstract_declarator : direct_abstract_declarator LBRACKET TIMES RBRACKET Nrr)r:rrr0)r=r>r)rrrr5rr0r?)rryrrrr p_direct_abstract_declarator_4s z&CParser.p_direct_abstract_declarator_4cCsHtjtjdddtj|d|j|jdg|j|jdd|d<dS)z? direct_abstract_declarator : LBRACKET TIMES RBRACKET Nrr)r:rrr0r)rrr<rr5r)rryrrr 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 rNr)rr:r0)r=r>r)rrHr0r?)rryrrrr p_direct_abstract_declarator_6s z&CParser.p_direct_abstract_declarator_6cCs2tj|dtjddd|j|jdd|d<dS)zM direct_abstract_declarator : LPAREN parameter_type_list_opt RPAREN rSNr)rr:r0r)rrHr<r5r)rryrrr p_direct_abstract_declarator_7s z&CParser.p_direct_abstract_declarator_7cCs(t|dtr|dn|dg|d<dS)zG block_item : declaration | statement rrN)r;r)rryrrr 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 rSNrr)r()rryrrr p_block_item_list2szCParser.p_block_item_listcCs&tj|d|j|jdd|d<dS)zA compound_statement : brace_open block_item_list_opt brace_close rSr)Z block_itemsr0rN)rZCompoundr5r)rryrrr p_compound_statement_19szCParser.p_compound_statement_1cCs*tj|d|d|j|jd|d<dS)z( labeled_statement : ID COLON statement rrrN)rZLabelr5r)rryrrr p_labeled_statement_1?szCParser.p_labeled_statement_1cCs,tj|d|dg|j|jd|d<dS)z> labeled_statement : CASE constant_expression COLON statement rSrrrN)rZCaser5r)rryrrr p_labeled_statement_2CszCParser.p_labeled_statement_2cCs&tj|dg|j|jd|d<dS)z- labeled_statement : DEFAULT COLON statement rrrN)rZDefaultr5r)rryrrr p_labeled_statement_3GszCParser.p_labeled_statement_3cCs,tj|d|dd|j|jd|d<dS)z= selection_statement : IF LPAREN expression RPAREN statement rrNrr)rIfr5r)rryrrr p_selection_statement_1KszCParser.p_selection_statement_1cCs0tj|d|d|d|j|jd|d<dS)zL selection_statement : IF LPAREN expression RPAREN statement ELSE statement rrrrN)rrr5r)rryrrr p_selection_statement_2OszCParser.p_selection_statement_2cCs.ttj|d|d|j|jd|d<dS)zA selection_statement : SWITCH LPAREN expression RPAREN statement rrrrN)r rZSwitchr5r)rryrrr p_selection_statement_3SszCParser.p_selection_statement_3cCs*tj|d|d|j|jd|d<dS)z@ iteration_statement : WHILE LPAREN expression RPAREN statement rrrrN)rZWhiler5r)rryrrr p_iteration_statement_1XszCParser.p_iteration_statement_1cCs*tj|d|d|j|jd|d<dS)zH iteration_statement : DO statement WHILE LPAREN expression RPAREN SEMI rrSrrN)rZDoWhiler5r)rryrrr p_iteration_statement_2\szCParser.p_iteration_statement_2cCs6tj|d|d|d|d|j|jd|d<dS)zj iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN statement rrr rrN)rForr5r)rryrrr p_iteration_statement_3`szCParser.p_iteration_statement_3cCsJtjtj|d|j|jd|d|d|d|j|jd|d<dS)zb iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN statement rrrrN)rrZDeclListr5r)rryrrr p_iteration_statement_4dszCParser.p_iteration_statement_4cCs$tj|d|j|jd|d<dS)z jump_statement : GOTO ID SEMI rSrrN)rZGotor5r)rryrrr p_jump_statement_1iszCParser.p_jump_statement_1cCstj|j|jd|d<dS)z jump_statement : BREAK SEMI rrN)rZBreakr5r)rryrrr p_jump_statement_2mszCParser.p_jump_statement_2cCstj|j|jd|d<dS)z! jump_statement : CONTINUE SEMI rrN)rZContinuer5r)rryrrr p_jump_statement_3qszCParser.p_jump_statement_3cCs4tjt|dkr|dnd|j|jd|d<dS)z\ jump_statement : RETURN expression SEMI | RETURN SEMI rrSNrr)rZReturnr(r5r)rryrrr p_jump_statement_4uszCParser.p_jump_statement_4cCs8|ddkr(tj|j|jd|d<n |d|d<dS)z, expression_statement : expression_opt SEMI rNr)rZEmptyStatementr5r)rryrrr p_expression_statement{s zCParser.p_expression_statementcCsjt|dkr|d|d<nLt|dtjsFtj|dg|dj|d<|djj|d|d|d<dS)zn expression : assignment_expression | expression COMMA assignment_expression rSrrrN)r(r;rExprListr0rr&)rryrrr p_expressions  zCParser.p_expressioncCs(tj|dg|j|jdd|d<dS)z typedef_name : TYPEID r)r0rN)rrGr5r)rryrrr p_typedef_nameszCParser.p_typedef_namecCsDt|dkr|d|d<n&tj|d|d|d|dj|d<dS)z assignment_expression : conditional_expression | unary_expression assignment_operator assignment_expression rSrrrN)r(rZ Assignmentr0)rryrrr p_assignment_expressions zCParser.p_assignment_expressioncCs|d|d<dS)a assignment_operator : EQUALS | XOREQUAL | TIMESEQUAL | DIVEQUAL | MODEQUAL | PLUSEQUAL | MINUSEQUAL | LSHIFTEQUAL | RSHIFTEQUAL | ANDEQUAL | OREQUAL rrNr)rryrrr p_assignment_operators zCParser.p_assignment_operatorcCs|d|d<dS)z. constant_expression : conditional_expression rrNr)rryrrr p_constant_expressionszCParser.p_constant_expressioncCsDt|dkr|d|d<n&tj|d|d|d|dj|d<dS)z conditional_expression : binary_expression | binary_expression CONDOP expression COLON conditional_expression rSrrrrN)r(rZ TernaryOpr0)rryrrr p_conditional_expressions z CParser.p_conditional_expressioncCsDt|dkr|d|d<n&tj|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 rSrrrN)r(rZBinaryOpr0)rryrrr p_binary_expressions zCParser.p_binary_expressioncCs|d|d<dS)z$ cast_expression : unary_expression rrNr)rryrrr p_cast_expression_1szCParser.p_cast_expression_1cCs*tj|d|d|j|jd|d<dS)z; cast_expression : LPAREN type_name RPAREN cast_expression rSrrrN)rZCastr5r)rryrrr p_cast_expression_2szCParser.p_cast_expression_2cCs|d|d<dS)z* unary_expression : postfix_expression rrNr)rryrrr p_unary_expression_1szCParser.p_unary_expression_1cCs$tj|d|d|dj|d<dS)z unary_expression : PLUSPLUS unary_expression | MINUSMINUS unary_expression | unary_operator cast_expression rrSrN)rUnaryOpr0)rryrrr p_unary_expression_2szCParser.p_unary_expression_2cCs>tj|dt|dkr|dn|d|j|jd|d<dS)zx unary_expression : SIZEOF unary_expression | SIZEOF LPAREN type_name RPAREN rrrSrN)rrr(r5r)rryrrr p_unary_expression_3szCParser.p_unary_expression_3cCs|d|d<dS)z unary_operator : AND | TIMES | PLUS | MINUS | NOT | LNOT rrNr)rryrrr p_unary_operatorszCParser.p_unary_operatorcCs|d|d<dS)z* postfix_expression : primary_expression rrNr)rryrrr p_postfix_expression_1szCParser.p_postfix_expression_1cCs$tj|d|d|dj|d<dS)zG postfix_expression : postfix_expression LBRACKET expression RBRACKET rrrN)rZArrayRefr0)rryrrr p_postfix_expression_2szCParser.p_postfix_expression_2cCs4tj|dt|dkr|dnd|dj|d<dS)z postfix_expression : postfix_expression LPAREN argument_expression_list RPAREN | postfix_expression LPAREN RPAREN rrrNr)rFuncCallr(r0)rryrrr p_postfix_expression_3szCParser.p_postfix_expression_3cCsBtj|d|j|jd}tj|d|d||dj|d<dS)z postfix_expression : postfix_expression PERIOD ID | postfix_expression PERIOD TYPEID | postfix_expression ARROW ID | postfix_expression ARROW TYPEID rrrSrN)rrr5rZ StructRefr0)rryZfieldrrr p_postfix_expression_4 szCParser.p_postfix_expression_4cCs(tjd|d|d|dj|d<dS)z{ postfix_expression : postfix_expression PLUSPLUS | postfix_expression MINUSMINUS ryrSrrN)rrr0)rryrrr p_postfix_expression_5szCParser.p_postfix_expression_5cCstj|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 rSrrN)rZCompoundLiteral)rryrrr p_postfix_expression_6szCParser.p_postfix_expression_6cCs|d|d<dS)z" primary_expression : identifier rrNr)rryrrr p_primary_expression_1 szCParser.p_primary_expression_1cCs|d|d<dS)z primary_expression : constant rrNr)rryrrr p_primary_expression_2$szCParser.p_primary_expression_2cCs|d|d<dS)zp primary_expression : unified_string_literal | unified_wstring_literal rrNr)rryrrr p_primary_expression_3(szCParser.p_primary_expression_3cCs|d|d<dS)z0 primary_expression : LPAREN expression RPAREN rSrNr)rryrrr p_primary_expression_4.szCParser.p_primary_expression_4cCsF|j|jd}tjtj|d|tj|d|dg|||d<dS)zQ primary_expression : OFFSETOF LPAREN type_name COMMA identifier RPAREN rrrrN)r5rrrrr)rryr0rrr p_primary_expression_52szCParser.p_primary_expression_5cCsNt|dkr*tj|dg|dj|d<n |djj|d|d|d<dS)z argument_expression_list : assignment_expression | argument_expression_list COMMA assignment_expression rSrrrN)r(rrr0rr&)rryrrr p_argument_expression_list:s z"CParser.p_argument_expression_listcCs$tj|d|j|jd|d<dS)z identifier : ID rrN)rrr5r)rryrrr p_identifierDszCParser.p_identifiercCs&tjd|d|j|jd|d<dS)z constant : INT_CONST_DEC | INT_CONST_OCT | INT_CONST_HEX | INT_CONST_BIN r@rrN)rConstantr5r)rryrrr p_constant_1HszCParser.p_constant_1cCs&tjd|d|j|jd|d<dS)zM constant : FLOAT_CONST | HEX_FLOAT_CONST floatrrN)rrr5r)rryrrr p_constant_2QszCParser.p_constant_2cCs&tjd|d|j|jd|d<dS)zH constant : CHAR_CONST | WCHAR_CONST charrrN)rrr5r)rryrrr p_constant_3XszCParser.p_constant_3cCsht|dkr0tjd|d|j|jd|d<n4|djdd|ddd|d_|d|d<dS)z~ unified_string_literal : STRING_LITERAL | unified_string_literal STRING_LITERAL rSstringrrNr,)r(rrr5rvalue)rryrrr p_unified_string_literalds   (z CParser.p_unified_string_literalcCslt|dkr0tjd|d|j|jd|d<n8|djjdd|ddd|d_|d|d<dS)z unified_wstring_literal : WSTRING_LITERAL | unified_wstring_literal WSTRING_LITERAL rSrrrNr,)r(rrr5rrrstrip)rryrrr p_unified_wstring_literalos   ,z!CParser.p_unified_wstring_literalcCs|d|d<dS)z brace_open : LBRACE rrNr)rryrrr p_brace_openzszCParser.p_brace_opencCs|d|d<dS)z brace_close : RBRACE rrNr)rryrrr p_brace_closeszCParser.p_brace_closecCs d|d<dS)zempty : Nrr)rryrrr p_emptyszCParser.p_emptycCs<|r,|jd|j|j|j|jj|dn |jdddS)Nz before: %s)rr8zAt end of inputr )r.rr5rrZfind_tok_column)rryrrr p_errors zCParser.p_errorN)Tr Tr Fr )r r)Frfrgrfrhrfrirfrjrfrkrfrlrmrfrnrorprqrfrrrsrfrtrurfrvrwrx) r"r#r$r%r&r'r(r)r*r+)__name__ __module__ __qualname__r!r$r'r+r1r2r4rrrrr9r?rJrPr_rbreZ precedencerzr{r}r~rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr r r r r rrrrrrrrrrrrr r!rrrr r sF c     )7- Y      ;      &                                            r __main__)reZplyrr rZc_lexerrZ plyparserrrrZast_transformsr r r,pprintZtimesysrrrr  s,