U _@sddlZddlmZddlmZddlmZddlmZm Z m Z ddl m Z Gdd d eZ ed kr|ddlZddlZddlZdS) N)yacc)c_ast)CLexer) PLYParserCoord ParseError)fix_switch_casesc@seZdZd1ddZd2d d Zd d Zd dZddZddZddZ ddZ ddZ ddZ ddZ ddZdd Zd!d"Zd#d$Zd3d%d&Zd'd(Zd)d*Zd+Zd,d-Zd.d/Zd0d1Zd2d3Zd4d5Zd6d7Zd8d9Zd:d;Zdd?Zd@dAZ dBdCZ!dDdEZ"dFdGZ#dHdIZ$dJdKZ%dLdMZ&dNdOZ'dPdQZ(dRdSZ)dTdUZ*dVdWZ+dXdYZ,dZd[Z-d\d]Z.d^d_Z/d`daZ0dbdcZ1dddeZ2dfdgZ3dhdiZ4djdkZ5dldmZ6dndoZ7dpdqZ8drdsZ9dtduZ:dvdwZ;dxdyZd~dZ?ddZ@ddZAddZBddZCddZDddZEddZFddZGddZHddZIddZJddZKddZLddZMddZNddZOddZPddZQddZRddZSddZTddZUddZVddZWddZXddZYddZZddZ[ddZ\ddZ]ddZ^ddZ_ddZ`ddÄZaddńZbddDŽZcddɄZddd˄Zedd̈́ZfddτZgddфZhddӄZiddՄZjddׄZkddلZlddۄZmdd݄Zndd߄ZoddZpddZqddZrddZsddZtddZuddZvddZwddZxddZyddZzddZ{ddZ|ddZ}ddZ~ddZddZddZddZddZdd Zd d Zd d ZddZddZddZddZddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0S(4CParserTpycparser.lextabpycparser.yacctabFc Cst|j|j|j|jd|_|jj|||d|jj|_ddddddd d d d d dddg}|D]}||qZt 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 /c_parser.py__init__sN5   zCParser.__init__rcCs6||j_|jtg|_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|jtdSN)rappendrrrrr _push_scopeszCParser._push_scopecCs t|jdkst|jdS)Nr)lenrAssertionErrorpopr(rrr _pop_scopeszCParser._pop_scopecCs4|jd|ds"|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 scopeNrget _parse_errorrnamecoordrrr _add_typedef_nameszCParser._add_typedef_namecCs4|jd|dr"|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/r2rrr _add_identifierszCParser._add_identifiercCs.t|jD]}||}|dk r |Sq dS)z8 Is *name* a typedef-name in the current scope? NF)reversedrr0)rr3ZscopeZin_scoperrr _is_type_in_scopes   zCParser._is_type_in_scopecCs|||||dSr&)r1_coord)rmsglinecolumnrrr rszCParser._lex_error_funccCs |dSr&)r)r(rrr rszCParser._lex_on_lbrace_funccCs |dSr&)r-r(rrr rszCParser._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_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_tokenr(rrr _get_yacc_lookahead_tokensz!CParser._get_yacc_lookahead_tokencCs\|}|}|jr|j}qt|tjr,||_|S|}t|jtjsF|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 isinstancerTypeDecl)rdeclmodifierZ modifier_headZ modifier_tailZ decl_tailrrr _type_modify_decls  zCParser._type_modify_declcCs|}t|tjs|j}q|j|_|j|_|D]:}t|tjs,t|dkrX| d|j q,||_|Sq,|st|jtj s| d|j tjdg|j d|_n tjdd|D|dj d|_|S) z- Fixes a declaration. Modifies decl. rz Invalid multiple types specifiedzMissing type in declarationintr4cSsg|]}|jD]}|qqSr)names).0idr3rrr Usz/CParser._fix_decl_name_type..r) r?rr@r>declnamer3qualsIdentifierTyper*r1r4FuncDecl)rrAtypenamer>Ztnrrr _fix_decl_name_type,s:      zCParser._fix_decl_name_typecCs(|ptggggd}||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 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 CsFd|dk}g}|dddk r&n,|dddkrt|ddkstt|dd jd kst||dd jdsd }|dD]}t|d r|j}qq|d |tj|dd jddd|dd jd|dd<|dd =nnt |ddtj tj tj fsR|dd}t |tjs(|j }q|jdkrR|dd jd|_|dd =|D]} | ddk slt|rtjd|d|d| d| djd} nr.r?r4zInvalid declarationrJr>rKr4rQ)r3rKrRr>r4rSinitr3rKrRZfuncspecr>r\rXr4)r0r*rFr8hasattrr4r1rr@r?StructUnionrLr>rJr+ZTypedefDeclrOr5r3r6r') rrUdeclstypedef_namespaceZ is_typedefZ declarationsr4tZ decls_0_tailrA declarationZ fixed_declrrr _build_declarationsjsz &           zCParser._build_declarationscCsBd|dkst|j|t|ddgddd}tj||||jdS) z' Builds a function definition. rWrRNrAr\TrUrbrcr)rA param_declsbodyr4)r+rfrrZFuncDefr4)rrUrArirjrerrr _build_function_definitions z"CParser._build_function_definitioncCs|dkrtjStjSdS)z` Given a token (either STRUCT or UNION), selects the appropriate AST class. structN)rr_r`)rtokenrrr _select_struct_union_classsz"CParser._select_struct_union_class) )leftZLOR)roZLAND)roOR)roZXOR)roZAND)roZEQZNE)roZGTZGEZLTZLE)roZRSHIFTZLSHIFT)roPLUSMINUS)roZTIMESZDIVIDEZMODcCs2|ddkrtg|d<nt|d|d<dS)zh translation_unit_or_empty : translation_unit | empty rNr)rZFileASTrprrr p_translation_unit_or_emptys z#CParser.p_translation_unit_or_emptycCs|d|d<dS)z4 translation_unit : external_declaration rrNrrsrrr p_translation_unit_1szCParser.p_translation_unit_1cCs.|ddk r|d|d|d|d<dS)zE translation_unit : translation_unit external_declaration rYNrr)extendrsrrr p_translation_unit_2s zCParser.p_translation_unit_2cCs|dg|d<dS)z7 external_declaration : function_definition rrNrrsrrr p_external_declaration_1sz CParser.p_external_declaration_1cCs|d|d<dS)z/ external_declaration : declaration rrNrrsrrr p_external_declaration_2sz CParser.p_external_declaration_2cCs|d|d<dS)z0 external_declaration : pp_directive rrNrrsrrr p_external_declaration_3sz CParser.p_external_declaration_3cCs d|d<dS)z( external_declaration : SEMI Nrrrsrrr p_external_declaration_4sz CParser.p_external_declaration_4cCs|d||ddS)z pp_directive : PPHASH zDirectives not supported yetrN)r1r9linenorsrrr p_pp_directive$szCParser.p_pp_directivec CsPtggtjdg||ddggd}|j||d|d|dd|d<d S) zR function_definition : declarator declaration_list_opt compound_statement rDrrErPrYrUrArirjrN)rrrLr9r}rkrrtrUrrr 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 rrYrrrN)rkrrrr p_function_definition_2>szCParser.p_function_definition_2cCs|d|d<dS)a  statement : labeled_statement | expression_statement | compound_statement | selection_statement | iteration_statement | jump_statement rrNrrsrrr 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 rrYNr>rrQrRrSr]rgTrh) rr_r`Enumr*r?rar4rfr)rrtrUZtyZs_u_or_erbrrr p_decl_body\s4   zCParser.p_decl_bodycCs|d|d<dS)z& declaration : decl_body SEMI rrNrrsrrr p_declarationszCParser.p_declarationcCs,t|dkr|dn|d|d|d<dS)zj declaration_list : declaration | declaration_list declaration rYrrNr*rsrrr p_declaration_listszCParser.p_declaration_listcCs||d|dd|d<dS)zM declaration_specifiers : type_qualifier declaration_specifiers_opt rYrrQrNrVrsrrr p_declaration_specifiers_1sz"CParser.p_declaration_specifiers_1cCs||d|dd|d<dS)zM declaration_specifiers : type_specifier declaration_specifiers_opt rYrr>rNrrsrrr p_declaration_specifiers_2sz"CParser.p_declaration_specifiers_2cCs||d|dd|d<dS)zV declaration_specifiers : storage_class_specifier declaration_specifiers_opt rYrrRrNrrsrrr p_declaration_specifiers_3sz"CParser.p_declaration_specifiers_3cCs||d|dd|d<dS)zQ declaration_specifiers : function_specifier declaration_specifiers_opt rYrrSrNrrsrrr p_declaration_specifiers_4sz"CParser.p_declaration_specifiers_4cCs|d|d<dS)z storage_class_specifier : AUTO | REGISTER | STATIC | EXTERN | TYPEDEF rrNrrsrrr p_storage_class_specifiersz!CParser.p_storage_class_specifiercCs|d|d<dS)z& function_specifier : INLINE rrNrrsrrr p_function_specifierszCParser.p_function_specifiercCs(tj|dg||dd|d<dS)a type_specifier : VOID | _BOOL | CHAR | SHORT | INT | LONG | FLOAT | DOUBLE | _COMPLEX | SIGNED | UNSIGNED rrErNrrLr9r}rsrrr p_type_specifier_1s zCParser.p_type_specifier_1cCs|d|d<dS)z type_specifier : typedef_name | enum_specifier | struct_or_union_specifier rrNrrsrrr p_type_specifier_2szCParser.p_type_specifier_2cCs|d|d<dS)zo type_qualifier : CONST | RESTRICT | VOLATILE rrNrrsrrr p_type_qualifierszCParser.p_type_qualifiercCs0t|dkr|d|dgn|dg|d<dS)z init_declarator_list : init_declarator | init_declarator_list COMMA init_declarator rrrrNrrsrrr p_init_declarator_list_1sz CParser.p_init_declarator_list_1cCstd|ddg|d<dS)z6 init_declarator_list : EQUALS initializer NrYrgrrrsrrr p_init_declarator_list_2sz CParser.p_init_declarator_list_2cCst|dddg|d<dS)z7 init_declarator_list : abstract_declarator rNrgrrrsrrr p_init_declarator_list_3sz CParser.p_init_declarator_list_3cCs,t|dt|dkr|dndd|d<dS)zb init_declarator : declarator | declarator EQUALS initializer rrYrNrgr)rr*rsrrr p_init_declaratorszCParser.p_init_declaratorcCs||d|dd|d<dS)zS specifier_qualifier_list : type_qualifier specifier_qualifier_list_opt rYrrQrNrrsrrr p_specifier_qualifier_list_1sz$CParser.p_specifier_qualifier_list_1cCs||d|dd|d<dS)zS specifier_qualifier_list : type_specifier specifier_qualifier_list_opt rYrr>rNrrsrrr p_specifier_qualifier_list_2 sz$CParser.p_specifier_qualifier_list_2cCs4||d}||dd||dd|d<dS)z{ struct_or_union_specifier : struct_or_union ID | struct_or_union TYPEID rrYNr3rbr4rrnr9r}rrtklassrrr p_struct_or_union_specifier_1s z%CParser.p_struct_or_union_specifier_1cCs4||d}|d|d||dd|d<dS)zd struct_or_union_specifier : struct_or_union brace_open struct_declaration_list brace_close rNrrYrrrrrrr p_struct_or_union_specifier_2s z%CParser.p_struct_or_union_specifier_2cCs8||d}||d|d||dd|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 rrYrrrNrrrrr p_struct_or_union_specifier_3&s z%CParser.p_struct_or_union_specifier_3cCs|d|d<dS)zF struct_or_union : STRUCT | UNION rrNrrsrrr 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 rYrrNrrsrrr p_struct_declaration_list8sz!CParser.p_struct_declaration_listcCs|d}d|dkst|ddk r8|j||dd}nht|ddkr|dd}t|tjrf|}n t|}|j|t|d gd}n|j|tddd gd}||d<dS) zW struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI rrWrRrYNrUrbr>rrArg)r+rfr*r?rZNoderLr)rrtrUrbZnodeZ 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 rrYNrgrr)rfrrsrrr 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 rrrrNrrsrrr p_struct_declarator_listrsz CParser.p_struct_declarator_listcCs|ddd|d<dS)z( struct_declarator : declarator rNrArXrrrsrrr p_struct_declarator_1{szCParser.p_struct_declarator_1cCsDt|dkr$|d|dd|d<ntddd|dd|d<dS)z struct_declarator : declarator COLON constant_expression | COLON constant_expression rrrrNrY)r*rr@rsrrr p_struct_declarator_2s zCParser.p_struct_declarator_2c Cs&t|dd||d|d<dS)zM enum_specifier : ENUM ID | ENUM TYPEID rYNrrrrr9r}rsrrr p_enum_specifier_1szCParser.p_enum_specifier_1c Cs&td|d||d|d<dS)zG enum_specifier : ENUM brace_open enumerator_list brace_close Nrrrrrsrrr p_enum_specifier_2szCParser.p_enum_specifier_2c Cs*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 rYrrrNrrsrrr p_enum_specifier_3szCParser.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 rYrrrN)r*rZEnumeratorListr4Z enumeratorsr'rsrrr p_enumerator_lists   zCParser.p_enumerator_listc Csjt|dkr,t|dd||d}n"t|d|d||d}||j|j||d<dS)zR enumerator : ID | ID EQUALS constant_expression rYrNrr)r*rZ Enumeratorr9r}r6r3r4)rrtZ enumeratorrrr p_enumerators zCParser.p_enumeratorcCs|d|d<dS)z) declarator : direct_declarator rrNrrsrrr p_declarator_1szCParser.p_declarator_1cCs||d|d|d<dS)z1 declarator : pointer direct_declarator rYrrNrCrsrrr p_declarator_2szCParser.p_declarator_2c Cs:tj|ddd||dd}|||d|d<dS)z& declarator : pointer TYPEID rYNr[rr)rr@r9r}rC)rrtrArrr p_declarator_3szCParser.p_declarator_3c Cs*tj|ddd||dd|d<dS)z" direct_declarator : ID rNr[r)rr@r9r}rsrrr p_direct_declarator_1s zCParser.p_direct_declarator_1cCs|d|d<dS)z8 direct_declarator : LPAREN declarator RPAREN rYrNrrsrrr 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 rNrrr>Zdim dim_qualsr4rArBr)r*r ArrayDeclr4rC)rrtrKarrrrr p_direct_declarator_3szCParser.p_direct_declarator_3cCs^dd|d|dfD}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|gqSrr?list)rGitemrrr rIsz1CParser.p_direct_declarator_4..rrcSs"g|]}|D]}|dk r |q qSr&r)rGZsublistrQrrr rIs Nrrrrrrrr4rC)rrtZ listed_qualsrrrrr p_direct_declarator_4szCParser.p_direct_declarator_4c Cs^tjdt|d||d|ddkr4|dng|djd}|j|d|d|d<dS)za direct_declarator : direct_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET NrrrrrrrrIDr9r}r4rCrrtrrrr p_direct_declarator_5szCParser.p_direct_declarator_5cCsztj|dd|djd}|jdkr`|jdk r`|jjD]$}t|tjrNq`| |j |jq:|j |d|d|d<dS)z direct_declarator : direct_declarator LPAREN parameter_type_list RPAREN | direct_declarator LPAREN identifier_list_opt RPAREN rNrargsr>r4LBRACErr) rrMr4r=r>rparamsr? EllipsisParamr6r3rC)rrtfuncZparamrrr p_direct_declarator_6 s   zCParser.p_direct_declarator_6cCsn||d}tj|dpgd|d}t|dkrb|d}|jdk rN|j}q<||_|d|d<n||d<dS)zm pointer : TIMES type_qualifier_list_opt | TIMES type_qualifier_list_opt pointer rrYN)rKr>r4rr)r9r}rZPtrDeclr*r>)rrtr4Z 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 rYrrNrrsrrr p_type_qualifier_listFszCParser.p_type_qualifier_listc Cs>t|dkr.|djt||d|d|d<dS)zn parameter_type_list : parameter_list | parameter_list COMMA ELLIPSIS rYrrrN)r*rr'rrr9r}rsrrr p_parameter_type_listLs "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 rYrrrNr*rZ ParamListr4rr'rsrrr p_parameter_listUs zCParser.p_parameter_listcCsX|d}|ds2tjdg||ddg|d<|j|t|ddgdd|d<d S) zE parameter_declaration : declaration_specifiers declarator rr>rDrErYrrrN)rrLr9r}rfrrrrr p_parameter_declaration_1_s z!CParser.p_parameter_declaration_1c Cs|d}|ds2tjdg||ddg|d<t|ddkrt|ddjdkr||ddjdr|j|t|ddd gd d}nHtj d |d |dpt ddd||dd }|d}| ||}||d<dS)zR parameter_declaration : declaration_specifiers abstract_declarator_opt rr>rDrEr.rrYNrgrr rQr3rKr>r4) rrLr9r}r*rFr8rfrTypenamer@rO)rrtrUrArNrrr p_parameter_declaration_2js. & 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 rYrrrNrrsrrr p_identifier_lists zCParser.p_identifier_listcCs|d|d<dS)z- initializer : assignment_expression rrNrrsrrr p_initializer_1szCParser.p_initializer_1cCs:|ddkr*tg||d|d<n |d|d<dS)z initializer : brace_open initializer_list_opt brace_close | brace_open initializer_list COMMA brace_close rYNrr)rInitListr9r}rsrrr p_initializer_2s zCParser.p_initializer_2cCst|dkrN|ddkr |dnt|d|d}t|g|dj|d<nD|ddkrb|dnt|d|d}|dj||d|d<dS)z initializer_list : designation_opt initializer | initializer_list COMMA designation_opt initializer rrNrYrr)r*rZNamedInitializerrr4exprsr')rrtr\rrr p_initializer_lists  ((zCParser.p_initializer_listcCs|d|d<dS)z. designation : designator_list EQUALS rrNrrsrrr p_designationszCParser.p_designationcCs0t|dkr|dgn|d|dg|d<dS)z_ designator_list : designator | designator_list designator rYrrNrrsrrr p_designator_listszCParser.p_designator_listcCs|d|d<dS)zi designator : LBRACKET constant_expression RBRACKET | PERIOD identifier rYrNrrsrrr p_designatorszCParser.p_designatorc CsTtjd|dd|dp$tddd||dd}|||dd|d<dS) zH type_name : specifier_qualifier_list abstract_declarator_opt r rrQrYNrr>r)rrr@r9r}rO)rrtrNrrr p_type_names  zCParser.p_type_namecCs(tddd}|j||dd|d<dS)z+ abstract_declarator : pointer Nrrr)rr@rC)rrtZ dummytyperrr p_abstract_declarator_1s zCParser.p_abstract_declarator_1cCs||d|d|d<dS)zF abstract_declarator : pointer direct_abstract_declarator rYrrNrrsrrr p_abstract_declarator_2szCParser.p_abstract_declarator_2cCs|d|d<dS)z> abstract_declarator : direct_abstract_declarator rrNrrsrrr p_abstract_declarator_3szCParser.p_abstract_declarator_3cCs|d|d<dS)zA direct_abstract_declarator : LPAREN abstract_declarator RPAREN rYrNrrsrrr 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 Nrrrrrrrrrr p_direct_abstract_declarator_2sz&CParser.p_direct_abstract_declarator_2c Cs4tjtddd|dg||dd|d<dS)zS direct_abstract_declarator : LBRACKET assignment_expression_opt RBRACKET NrYrrr)rrr@r9r}rsrrr p_direct_abstract_declarator_3s  z&CParser.p_direct_abstract_declarator_3c CsJtjdt|d||dg|djd}|j|d|d|d<dS)zZ direct_abstract_declarator : direct_abstract_declarator LBRACKET TIMES RBRACKET Nrrrrrrrrrr p_direct_abstract_declarator_4sz&CParser.p_direct_abstract_declarator_4c CsHtjtdddt|d||dg||dd|d<dS)z? direct_abstract_declarator : LBRACKET TIMES RBRACKET Nrrrr)rrr@rr9r}rsrrr 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 rNrrrr)rrMr4rC)rrtrrrr p_direct_abstract_declarator_6s z&CParser.p_direct_abstract_declarator_6cCs2tj|dtddd||dd|d<dS)zM direct_abstract_declarator : LPAREN parameter_type_list_opt RPAREN rYNrrr)rrMr@r9r}rsrrr p_direct_abstract_declarator_7s  z&CParser.p_direct_abstract_declarator_7cCs(t|dtr|dn|dg|d<dS)zG block_item : declaration | statement rrNrrsrrr 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 rYNrrrrsrrr p_block_item_list2szCParser.p_block_item_listcCs&tj|d||dd|d<dS)zA compound_statement : brace_open block_item_list_opt brace_close rYr)Z block_itemsr4rN)rZCompoundr9r}rsrrr p_compound_statement_19szCParser.p_compound_statement_1c Cs*t|d|d||d|d<dS)z( labeled_statement : ID COLON statement rrrN)rZLabelr9r}rsrrr p_labeled_statement_1?szCParser.p_labeled_statement_1c Cs,t|d|dg||d|d<dS)z> labeled_statement : CASE constant_expression COLON statement rYrrrN)rZCaser9r}rsrrr p_labeled_statement_2CszCParser.p_labeled_statement_2cCs&t|dg||d|d<dS)z- labeled_statement : DEFAULT COLON statement rrrN)rZDefaultr9r}rsrrr p_labeled_statement_3GszCParser.p_labeled_statement_3c Cs,t|d|dd||d|d<dS)z= selection_statement : IF LPAREN expression RPAREN statement rrNrrrZIfr9r}rsrrr p_selection_statement_1KszCParser.p_selection_statement_1c Cs0t|d|d|d||d|d<dS)zL selection_statement : IF LPAREN expression RPAREN statement ELSE statement rrrrNrrsrrr p_selection_statement_2OszCParser.p_selection_statement_2c Cs.tt|d|d||d|d<dS)zA selection_statement : SWITCH LPAREN expression RPAREN statement rrrrN)r rZSwitchr9r}rsrrr p_selection_statement_3Ss zCParser.p_selection_statement_3c Cs*t|d|d||d|d<dS)z@ iteration_statement : WHILE LPAREN expression RPAREN statement rrrrN)rZWhiler9r}rsrrr p_iteration_statement_1XszCParser.p_iteration_statement_1c Cs*t|d|d||d|d<dS)zH iteration_statement : DO statement WHILE LPAREN expression RPAREN SEMI rrYrrN)rZDoWhiler9r}rsrrr p_iteration_statement_2\szCParser.p_iteration_statement_2c Cs6t|d|d|d|d||d|d<dS)zj iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN statement rrr rrN)rForr9r}rsrrr p_iteration_statement_3`szCParser.p_iteration_statement_3c CsJtt|d||d|d|d|d||d|d<dS)zb iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN statement rrrrN)rrZDeclListr9r}rsrrr p_iteration_statement_4ds zCParser.p_iteration_statement_4cCs$t|d||d|d<dS)z jump_statement : GOTO ID SEMI rYrrN)rZGotor9r}rsrrr p_jump_statement_1iszCParser.p_jump_statement_1cCst||d|d<dS)z jump_statement : BREAK SEMI rrN)rZBreakr9r}rsrrr p_jump_statement_2mszCParser.p_jump_statement_2cCst||d|d<dS)z! jump_statement : CONTINUE SEMI rrN)rZContinuer9r}rsrrr p_jump_statement_3qszCParser.p_jump_statement_3cCs4tt|dkr|dnd||d|d<dS)z\ jump_statement : RETURN expression SEMI | RETURN SEMI rrYNrr)rZReturnr*r9r}rsrrr p_jump_statement_4uszCParser.p_jump_statement_4cCs8|ddkr(t||d|d<n |d|d<dS)z, expression_statement : expression_opt SEMI rNr)rZEmptyStatementr9r}rsrrr p_expression_statement{s zCParser.p_expression_statementcCsjt|dkr|d|d<nLt|dtjsFt|dg|dj|d<|dj|d|d|d<dS)zn expression : assignment_expression | expression COMMA assignment_expression rYrrrN)r*r?rExprListr4rr'rsrrr p_expressions  zCParser.p_expressioncCs(tj|dg||dd|d<dS)z typedef_name : TYPEID rrErNrrsrrr p_typedef_nameszCParser.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 rYrrrN)r*rZ Assignmentr4rsrrr p_assignment_expressions zCParser.p_assignment_expressioncCs|d|d<dS)a assignment_operator : EQUALS | XOREQUAL | TIMESEQUAL | DIVEQUAL | MODEQUAL | PLUSEQUAL | MINUSEQUAL | LSHIFTEQUAL | RSHIFTEQUAL | ANDEQUAL | OREQUAL rrNrrsrrr p_assignment_operators zCParser.p_assignment_operatorcCs|d|d<dS)z. constant_expression : conditional_expression rrNrrsrrr p_constant_expressionszCParser.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 rYrrrrN)r*rZ TernaryOpr4rsrrr p_conditional_expressions 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 rYrrrN)r*rZBinaryOpr4rsrrr p_binary_expressions zCParser.p_binary_expressioncCs|d|d<dS)z$ cast_expression : unary_expression rrNrrsrrr p_cast_expression_1szCParser.p_cast_expression_1c Cs*t|d|d||d|d<dS)z; cast_expression : LPAREN type_name RPAREN cast_expression rYrrrN)rZCastr9r}rsrrr p_cast_expression_2szCParser.p_cast_expression_2cCs|d|d<dS)z* unary_expression : postfix_expression rrNrrsrrr p_unary_expression_1szCParser.p_unary_expression_1cCs$t|d|d|dj|d<dS)z unary_expression : PLUSPLUS unary_expression | MINUSMINUS unary_expression | unary_operator cast_expression rrYrNrUnaryOpr4rsrrr p_unary_expression_2szCParser.p_unary_expression_2c Cs>t|dt|dkr|dn|d||d|d<dS)zx unary_expression : SIZEOF unary_expression | SIZEOF LPAREN type_name RPAREN rrrYrN)rrr*r9r}rsrrr p_unary_expression_3s zCParser.p_unary_expression_3cCs|d|d<dS)z unary_operator : AND | TIMES | PLUS | MINUS | NOT | LNOT rrNrrsrrr p_unary_operatorszCParser.p_unary_operatorcCs|d|d<dS)z* postfix_expression : primary_expression rrNrrsrrr p_postfix_expression_1szCParser.p_postfix_expression_1cCs$t|d|d|dj|d<dS)zG postfix_expression : postfix_expression LBRACKET expression RBRACKET rrrN)rZArrayRefr4rsrrr p_postfix_expression_2szCParser.p_postfix_expression_2cCs4t|dt|dkr|dnd|dj|d<dS)z postfix_expression : postfix_expression LPAREN argument_expression_list RPAREN | postfix_expression LPAREN RPAREN rrrNr)rFuncCallr*r4rsrrr p_postfix_expression_3szCParser.p_postfix_expression_3cCsBt|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 rrrYrN)rrr9r}Z StructRefr4)rrtZfieldrrr p_postfix_expression_4 szCParser.p_postfix_expression_4cCs(td|d|d|dj|d<dS)z{ postfix_expression : postfix_expression PLUSPLUS | postfix_expression MINUSMINUS rtrYrrNrrsrrr p_postfix_expression_5szCParser.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 rYrrN)rZCompoundLiteralrsrrr p_postfix_expression_6szCParser.p_postfix_expression_6cCs|d|d<dS)z" primary_expression : identifier rrNrrsrrr p_primary_expression_1 szCParser.p_primary_expression_1cCs|d|d<dS)z primary_expression : constant rrNrrsrrr p_primary_expression_2$szCParser.p_primary_expression_2cCs|d|d<dS)zp primary_expression : unified_string_literal | unified_wstring_literal rrNrrsrrr p_primary_expression_3(szCParser.p_primary_expression_3cCs|d|d<dS)z0 primary_expression : LPAREN expression RPAREN rYrNrrsrrr p_primary_expression_4.szCParser.p_primary_expression_4cCsF||d}tt|d|t|d|dg|||d<dS)zQ primary_expression : OFFSETOF LPAREN type_name COMMA identifier RPAREN rrrrN)r9r}rrrr)rrtr4rrr p_primary_expression_52s zCParser.p_primary_expression_5cCsNt|dkr*t|dg|dj|d<n |dj|d|d|d<dS)z argument_expression_list : assignment_expression | argument_expression_list COMMA assignment_expression rYrrrN)r*rrr4rr'rsrrr p_argument_expression_list:s z"CParser.p_argument_expression_listcCs$t|d||d|d<dS)z identifier : ID rrN)rrr9r}rsrrr p_identifierDszCParser.p_identifierc Cs&td|d||d|d<dS)z constant : INT_CONST_DEC | INT_CONST_OCT | INT_CONST_HEX | INT_CONST_BIN rDrrNrConstantr9r}rsrrr p_constant_1Hs zCParser.p_constant_1c Cs&td|d||d|d<dS)zM constant : FLOAT_CONST | HEX_FLOAT_CONST floatrrNr$rsrrr p_constant_2Qs zCParser.p_constant_2c Cs&td|d||d|d<dS)zH constant : CHAR_CONST | WCHAR_CONST charrrNr$rsrrr p_constant_3Xs zCParser.p_constant_3c Csht|dkr0td|d||d|d<n4|djdd|ddd|d_|d|d<dS)z~ unified_string_literal : STRING_LITERAL | unified_string_literal STRING_LITERAL rYstringrrNr.)r*rr%r9r}valuersrrr p_unified_string_literalds  (z CParser.p_unified_string_literalc Cslt|dkr0td|d||d|d<n8|djdd|ddd|d_|d|d<dS)z unified_wstring_literal : WSTRING_LITERAL | unified_wstring_literal WSTRING_LITERAL rYr+rrNr.)r*rr%r9r}r,rstriprsrrr p_unified_wstring_literalos  ,z!CParser.p_unified_wstring_literalcCs|d|d<dS)z brace_open : LBRACE rrNrrsrrr p_brace_openzszCParser.p_brace_opencCs|d|d<dS)z brace_close : RBRACE rrNrrsrrr p_brace_closeszCParser.p_brace_closecCs d|d<dS)zempty : Nrrrsrrr p_emptyszCParser.p_emptycCs<|r,|d|j|j|j|j|dn |dddS)Nz before: %s)r}r<zAt end of inputr )r1r,r9r}rZfind_tok_columnrsrrr p_errors zCParser.p_errorN)Tr Tr Fr )r r)F)__name__ __module__ __qualname__r!r$r)r-r5r6r8rrrrr=rCrOrVrfrkrnZ precedencerurvrxryrzr{r|r~rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr r r r r rrrrrrrrrrrrrrrr r!r"r#r&r(r*r-r/r0r1r2r3rrrr r s6 j     )7- Y     ;      &                                     r __main__)reZplyrr rZc_lexerrZ plyparserrrrZast_transformsr r r4Zpprinttimesysrrrr  s,