
Ѯh*"                @   s   d  d l  m Z d  d l m Z d  d l m Z d  d l m Z m Z m	 Z	 m
 Z
 d  d l m Z m Z e
 Gd d   d e   Z d S)	   )yacc)c_ast)CLexer)	PLYParser
ParseErrorparameterizedtemplate)fix_switch_casesfix_atomic_specifiersc               @   s  e  Z d  Z d e d d d d d d d  Z d d 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" d#  Z d d$ d%  Z d& d'   Z d( d)   Z d}Z d= d>   Z d? d@   Z dA dB   Z dC dD   Z dE dF   Z dG dH   Z dI dJ   Z dK dL   Z dM dN   Z dO dP   Z  dQ dR   Z! dS dT   Z" dU dV   Z# dW dX   Z$ dY dZ   Z% d[ d\   Z& d] d^   Z' d_ d`   Z( da db   Z) dc dd   Z* de df   Z+ dg dh   Z, di dj   Z- dk dl   Z. dm dn   Z/ do dp   Z0 dq dr   Z1 ds dt   Z2 du dv   Z3 dw dx   Z4 dy dz   Z5 d{ d|   Z6 d} d~   Z7 d d   Z8 d d   Z9 d d   Z: d d   Z; d d   Z< d d   Z= d d   Z> d d   Z? d d   Z@ d d   ZA d d   ZB d d   ZC d d   ZD d d   ZE d d   ZF d d   ZG d d   ZH d d   ZI d d   ZJ d d   ZK d d   ZL d d   ZM d d   ZN d d   ZO d d   ZP d d   ZQ d d   ZR d d   ZS d d   ZT d d   ZU d d   ZV d d   ZW eX d~dd d d    ZY eX ddd d d    ZZ eX ddd d d    Z[ eX dd d d    Z\ eX ddd d d    Z] eX ddd d d    Z^ eX ddd d d    Z_ eX ddd d d    Z` d d   Za d d   Zb d d   Zc d d   Zd d d   Ze d d   Zf d d   Zg d d   Zh d d   Zi d d   Zj d d   Zk d d   Zl d d   Zm d d   Zn d d   Zo d d   Zp d d   Zq d d   Zr d d   Zs d d   Zt d d   Zu d d   Zv d d  Zw dd  Zx dd  Zy dd  Zz 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\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S(  CParserTzpycparser.lextabzpycparser.yacctabF c       
      C   s   | d |  j  d |  j d |  j d |  j  |  _ |  j j d | d | d |  |  j j |  _ d d	 d
 d d d d d d d d d d d g } x | D] }	 |  j |	  q Wt j d |  d d d | d | d | d |  |  _	 t
   g |  _ d |  _ d S)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_funcZon_lbrace_funcZon_rbrace_funcZtype_lookup_funcoptimizelextabZ	outputdirZabstract_declaratorZassignment_expressionZdeclaration_listZdeclaration_specifiers_no_typeZdesignationZ
expressionZidentifier_listZinit_declarator_listZid_init_declarator_listZinitializer_listZparameter_type_listZblock_item_listZtype_qualifier_listZstruct_declarator_listmodulestartZtranslation_unit_or_emptydebugZ	tabmoduleN)_lex_error_func_lex_on_lbrace_func_lex_on_rbrace_func_lex_type_lookup_funcclexZbuildtokensZ_create_opt_ruler   cparserdict_scope_stack_last_yielded_token)
selflex_optimizelexerr   yacc_optimizeyacctab
yacc_debugZtaboutputdirZrules_with_optZrule r"   ../pycparser/c_parser.py__init__   sF    :					
zCParser.__init__c             C   sS   | |  j  _ |  j  j   t   g |  _ d |  _ |  j j d | d |  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inputr   r   )r   filenameZreset_linenor   r   r   r   parse)r   textr&   r   r"   r"   r#   r'      s    		zCParser.parsec             C   s   |  j  j t    d  S)N)r   appendr   )r   r"   r"   r#   _push_scope   s    zCParser._push_scopec             C   s,   t  |  j  d k s t  |  j j   d  S)Nr   )lenr   AssertionErrorpop)r   r"   r"   r#   
_pop_scope   s    zCParser._pop_scopec             C   sB   |  j  d j | d  s- |  j d | |  d |  j  d | <d S)zC Add a new typedef name (ie a TYPEID) to the current scope
        r   Tz;Typedef %r previously declared as non-typedef in this scopeNr/   )r   get_parse_error)r   namecoordr"   r"   r#   _add_typedef_name   s
    zCParser._add_typedef_namec             C   sB   |  j  d j | d  r- |  j d | |  d |  j  d | <d S)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/   r/   )r   r0   r1   )r   r2   r3   r"   r"   r#   _add_identifier   s
    zCParser._add_identifierc             C   s=   x6 t  |  j  D]% } | j |  } | d k	 r | Sq Wd S)z8 Is *name* a typedef-name in the current scope?
        NF)reversedr   r0   )r   r2   ZscopeZin_scoper"   r"   r#   _is_type_in_scope   s
     zCParser._is_type_in_scopec             C   s    |  j  | |  j | |   d  S)N)r1   _coord)r   msglinecolumnr"   r"   r#   r      s    zCParser._lex_error_funcc             C   s   |  j    d  S)N)r*   )r   r"   r"   r#   r      s    zCParser._lex_on_lbrace_funcc             C   s   |  j    d  S)N)r.   )r   r"   r"   r#   r      s    zCParser._lex_on_rbrace_funcc             C   s   |  j  |  } | S)z Looks up types that were previously defined with
            typedef.
            Passed to the lexer for recognizing identifiers that
            are types.
        )r7   )r   r2   Zis_typer"   r"   r#   r      s    zCParser._lex_type_lookup_funcc             C   s
   |  j  j S)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.
        )r   Z
last_token)r   r"   r"   r#   _get_yacc_lookahead_token   s    z!CParser._get_yacc_lookahead_tokenc             C   s   | } | } x | j  r$ | j  } q Wt | t j  rD | | _  | S| } x" t | j  t j  sn | j  } qM W| j  | _  | | _  | Sd S)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    		zCParser._type_modify_declc             C   s!  | } x t  | t j  s' | j } q	 W| j | _ | j d d  | _ xU | D]M } t  | t j  sQ t |  d k r |  j	 d | j
  qQ | | _ | SqQ W| s t  | j t j  s |  j	 d | j
  t j d g d | j
 | _ n, t j d d   | D d | d	 j
 | _ | S)
z- Fixes a declaration. Modifies decl.
        Nr   z Invalid multiple types specifiedzMissing type in declarationintr3   c             S   s&   g  |  ] } | j  D] } |  q q Sr"   )names).0idr2   r"   r"   r#   
<listcomp>S  s   	 z/CParser._fix_decl_name_type.<locals>.<listcomp>    )r>   r   r?   r=   declnamer2   qualsIdentifierTyper+   r1   r3   FuncDecl)r   r@   typenamer=   Ztnr"   r"   r#   _fix_decl_name_type+  s.    		zCParser._fix_decl_name_typec             C   s_   | p* t  d g  d g  d g  d g  d g   } | rG | | j |  n | | j 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	alignmentrH   )r   r)   insert)r   ZdeclspecZnewspecZkindr)   specr"   r"   r#   _add_declaration_specifierW  s
    -z"CParser._add_declaration_specifierc             C   sH  d | d k } g  } | d j  d  d k	 r2 n| d d d k r:t | d  d k  s t | d d j  d	 k s |  j | d d j d  r d
 } x+ | d D] } t | d  r | j } Pq W|  j d |  t j d | d d j d d d d d d | d d | d d j  | d d <| d d =n t	 | d d t j
 t j t j t j f  s| d d } x t	 | t j  s| j } qzW| j d k r| d d j d | _ | d d =xv| D]n}	 |	 d d k	 st  | r4t j d d d | d d | d d |	 d d |	 d j  }
 no t j d d d | d d | d d | d d | d d |	 d d |	 j  d  d |	 j  d  d |	 d j  	}
 t	 |
 j t j
 t j t j t j f  r|
 } n |  j |
 | d  } | r'| r|  j | j | j  n |  j | j | j  t |  } | 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.
        typedefrP   rH   bitsizeNr@   r=      r   ?r3   zInvalid declarationrI   rJ   alignrR   r2   rO   funcspecrQ   initr/   r/   r/   r/   r/   r/   r/   )r0   r+   rD   r7   hasattrr3   r1   r   r?   r>   EnumStructUnionrK   r=   rI   r,   ZTypedefDeclrN   r4   r2   r5   r
   r)   )r   rT   declstypedef_namespaceZ
is_typedefZdeclarationsr3   tZdecls_0_tailr@   declarationZ
fixed_declr"   r"   r#   _build_declarationsp  sv    3		
!	


	




		zCParser._build_declarationsc          	   C   s|   d | d k r# |  j  d | j  |  j d | d t d | d d  g d	 d
  d } t j d | d | d | d | j  S)z' Builds a function definition.
        rV   rP   zInvalid typedefrT   rb   r@   r\   Nrc   TrH   param_declsbodyr3   )r1   r3   rf   r   r   ZFuncDef)r   rT   r@   rg   rh   re   r"   r"   r#   _build_function_definition  s    		z"CParser._build_function_definitionc             C   s   | d k r t  j St  j Sd S)z` Given a token (either STRUCT or UNION), selects the
            appropriate AST class.
        ZstructN)r   r_   r`   )r   tokenr"   r"   r#   _select_struct_union_class  s    z"CParser._select_struct_union_classleftLORLANDORXORANDEQNEGTGELTLERSHIFTLSHIFTPLUSMINUSTIMESDIVIDEMODc             C   sA   | d d k r& t  j g   | d <n t  j | d  | d <d S)zh translation_unit_or_empty   : translation_unit
                                        | empty
        r   NrH   )r   ZFileAST)r   pr"   r"   r#   p_translation_unit_or_empty  s    z#CParser.p_translation_unit_or_emptyc             C   s   | d | d <d S)z4 translation_unit    : external_declaration
        r   rH   Nr"   )r   r   r"   r"   r#   p_translation_unit_1  s    zCParser.p_translation_unit_1c             C   s'   | d j  | d  | d | d <d S)zE translation_unit    : translation_unit external_declaration
        r   rX   rH   N)extend)r   r   r"   r"   r#   p_translation_unit_2  s    zCParser.p_translation_unit_2c             C   s   | d g | d <d S)z7 external_declaration    : function_definition
        r   rH   Nr"   )r   r   r"   r"   r#   p_external_declaration_1  s    z CParser.p_external_declaration_1c             C   s   | d | d <d S)z/ external_declaration    : declaration
        r   rH   Nr"   )r   r   r"   r"   r#   p_external_declaration_2  s    z CParser.p_external_declaration_2c             C   s   | d g | d <d S)zi external_declaration    : pp_directive
                                    | pppragma_directive
        r   rH   Nr"   )r   r   r"   r"   r#   p_external_declaration_3  s    z CParser.p_external_declaration_3c             C   s   g  | d <d S)z( external_declaration    : SEMI
        rH   Nr"   )r   r   r"   r"   r#   p_external_declaration_4%  s    z CParser.p_external_declaration_4c             C   s   | d | d <d S)z1 external_declaration    : static_assert
        r   rH   Nr"   )r   r   r"   r"   r#   p_external_declaration_5*  s    z CParser.p_external_declaration_5c             C   su   t  |  d k rA t j | d d |  j | d   g | d <n0 t j | d | d |  j | d   g | d <d S)z static_assert           : _STATIC_ASSERT LPAREN constant_expression COMMA unified_string_literal RPAREN
                                    | _STATIC_ASSERT LPAREN constant_expression RPAREN
              Nr   rH   )r+   r   ZStaticAssert_token_coord)r   r   r"   r"   r#   p_static_assert_declaration/  s    /z#CParser.p_static_assert_declarationc             C   s    |  j  d |  j | d   d S)z  pp_directive  : PPHASH
        zDirectives not supported yetr   N)r1   r   )r   r   r"   r"   r#   p_pp_directive8  s    	zCParser.p_pp_directivec             C   s   t  |  d k r; t j | d |  j | d   | d <n] t  |  d k rv t j | d |  j | d   | d <n" t j d |  j | d   | d <d S)z pppragma_directive      : PPPRAGMA
                                    | PPPRAGMA PPPRAGMASTR
                                    | _PRAGMA LPAREN unified_string_literal RPAREN
        r   r   rX   rH   r   r   N)r+   r   ZPragmar   )r   r   r"   r"   r#   p_pppragma_directiveC  s
    ))zCParser.p_pppragma_directivec             C   s<   t  |  d k r | d g n | d | d g | d <d S)z pppragma_directive_list : pppragma_directive
                                    | pppragma_directive_list pppragma_directive
        rX   r   rH   N)r+   )r   r   r"   r"   r#   p_pppragma_directive_listO  s    z!CParser.p_pppragma_directive_listc             C   s   t  d g  d g  d g  d t j d g d |  j | d  g d g   } |  j d	 | d
 | d d | d d | d  | d <d S)zU function_definition : id_declarator declaration_list_opt compound_statement
        rO   rR   rP   r=   rC   r3   r   rQ   rT   r@   rg   rX   rh   r   rH   N)r   r   rK   r   ri   )r   r   rT   r"   r"   r#   p_function_definition_1W  s    		

zCParser.p_function_definition_1c          
   C   sB   | d } |  j  d | d | d d | d d | d  | d	 <d
 S)zl function_definition : declaration_specifiers id_declarator declaration_list_opt compound_statement
        r   rT   r@   rX   rg   r   rh      rH   N)ri   )r   r   rT   r"   r"   r#   p_function_definition_2i  s    
	

zCParser.p_function_definition_2c             C   s   | d | d <d S)a_   statement   : labeled_statement
                        | expression_statement
                        | compound_statement
                        | selection_statement
                        | iteration_statement
                        | jump_statement
                        | pppragma_directive
                        | static_assert
        r   rH   Nr"   )r   r   r"   r"   r#   p_statementx  s    
zCParser.p_statementc             C   s^   t  |  d k rL t j d | d | d g d |  j | d   | d <n | d | d <d S)z} pragmacomp_or_statement     : pppragma_directive_list statement
                                        | statement
        r   block_itemsr   rX   r3   rH   N)r+   r   Compoundr   )r   r   r"   r"   r#   p_pragmacomp_or_statement  s
    	z!CParser.p_pragmacomp_or_statementc             C   s'  | d } | d d k r | d } t  j t  j t  j f } t |  d k r t | d |  r t  j d d d | d d	 | d
 d | d d | d d | d d d d d d | d j  	g } q|  j d | d t	 d d d d  g d d  } n" |  j d | d | d d d  } | | d <d S)z decl_body : declaration_specifiers init_declarator_list_opt
                      | declaration_specifiers_no_type id_init_declarator_list_opt
        r   rX   Nr=   rH   r2   rJ   rO   rZ   rR   rP   r[   rQ   r\   rW   r3   rT   rb   r@   rc   T)
r   r_   r`   r^   r+   r>   ra   r3   rf   r   )r   r   rT   ZtyZs_u_or_erb   r"   r"   r#   p_decl_body  s0    

%	




		
	zCParser.p_decl_bodyc             C   s   | d | d <d S)z& declaration : decl_body SEMI
        r   rH   Nr"   )r   r   r"   r"   r#   p_declaration   s    zCParser.p_declarationc             C   s6   t  |  d k r | d n | d | d | d <d S)zj declaration_list    : declaration
                                | declaration_list declaration
        rX   r   rH   N)r+   )r   r   r"   r"   r#   p_declaration_list	  s    zCParser.p_declaration_listc             C   s%   |  j  | d | d d  | d <d S)z] declaration_specifiers_no_type  : type_qualifier declaration_specifiers_no_type_opt
        rX   r   rO   rH   N)rU   )r   r   r"   r"   r#   "p_declaration_specifiers_no_type_1  s    z*CParser.p_declaration_specifiers_no_type_1c             C   s%   |  j  | d | d d  | d <d S)zf declaration_specifiers_no_type  : storage_class_specifier declaration_specifiers_no_type_opt
        rX   r   rP   rH   N)rU   )r   r   r"   r"   r#   "p_declaration_specifiers_no_type_2  s    z*CParser.p_declaration_specifiers_no_type_2c             C   s%   |  j  | d | d d  | d <d S)za declaration_specifiers_no_type  : function_specifier declaration_specifiers_no_type_opt
        rX   r   rQ   rH   N)rU   )r   r   r"   r"   r#   "p_declaration_specifiers_no_type_3  s    z*CParser.p_declaration_specifiers_no_type_3c             C   s%   |  j  | d | d d  | d <d S)z_ declaration_specifiers_no_type  : atomic_specifier declaration_specifiers_no_type_opt
        rX   r   r=   rH   N)rU   )r   r   r"   r"   r#   "p_declaration_specifiers_no_type_4%  s    z*CParser.p_declaration_specifiers_no_type_4c             C   s%   |  j  | d | d d  | d <d S)zb declaration_specifiers_no_type  : alignment_specifier declaration_specifiers_no_type_opt
        rX   r   rR   rH   N)rU   )r   r   r"   r"   r#   "p_declaration_specifiers_no_type_5*  s    z*CParser.p_declaration_specifiers_no_type_5c             C   s+   |  j  | d | d d d d | d <d S)zI declaration_specifiers  : declaration_specifiers type_qualifier
        r   rX   rO   r)   TrH   N)rU   )r   r   r"   r"   r#   p_declaration_specifiers_1/  s    z"CParser.p_declaration_specifiers_1c             C   s+   |  j  | d | d d d d | d <d S)zR declaration_specifiers  : declaration_specifiers storage_class_specifier
        r   rX   rP   r)   TrH   N)rU   )r   r   r"   r"   r#   p_declaration_specifiers_24  s    z"CParser.p_declaration_specifiers_2c             C   s+   |  j  | d | d d d d | d <d S)zM declaration_specifiers  : declaration_specifiers function_specifier
        r   rX   rQ   r)   TrH   N)rU   )r   r   r"   r"   r#   p_declaration_specifiers_39  s    z"CParser.p_declaration_specifiers_3c             C   s+   |  j  | d | d d d d | d <d S)zS declaration_specifiers  : declaration_specifiers type_specifier_no_typeid
        r   rX   r=   r)   TrH   N)rU   )r   r   r"   r"   r#   p_declaration_specifiers_4>  s    z"CParser.p_declaration_specifiers_4c             C   s!   |  j  d | d d  | d <d S)z2 declaration_specifiers  : type_specifier
        Nr   r=   rH   )rU   )r   r   r"   r"   r#   p_declaration_specifiers_5C  s    z"CParser.p_declaration_specifiers_5c             C   s+   |  j  | d | d d d d | d <d S)zQ declaration_specifiers  : declaration_specifiers_no_type type_specifier
        r   rX   r=   r)   TrH   N)rU   )r   r   r"   r"   r#   p_declaration_specifiers_6H  s    z"CParser.p_declaration_specifiers_6c             C   s+   |  j  | d | d d d d | d <d S)zN declaration_specifiers  : declaration_specifiers alignment_specifier
        r   rX   rR   r)   TrH   N)rU   )r   r   r"   r"   r#   p_declaration_specifiers_7M  s    z"CParser.p_declaration_specifiers_7c             C   s   | d | d <d S)a   storage_class_specifier : AUTO
                                    | REGISTER
                                    | STATIC
                                    | EXTERN
                                    | TYPEDEF
                                    | _THREAD_LOCAL
        r   rH   Nr"   )r   r   r"   r"   r#   p_storage_class_specifierR  s    z!CParser.p_storage_class_specifierc             C   s   | d | d <d S)zR function_specifier  : INLINE
                                | _NORETURN
        r   rH   Nr"   )r   r   r"   r"   r#   p_function_specifier\  s    zCParser.p_function_specifierc             C   s0   t  j | d g d |  j | d  | d <d S)a+   type_specifier_no_typeid  : VOID
                                      | _BOOL
                                      | CHAR
                                      | SHORT
                                      | INT
                                      | LONG
                                      | FLOAT
                                      | DOUBLE
                                      | _COMPLEX
                                      | SIGNED
                                      | UNSIGNED
                                      | __INT128
        r   r3   rH   N)r   rK   r   )r   r   r"   r"   r#   p_type_specifier_no_typeidb  s    z"CParser.p_type_specifier_no_typeidc             C   s   | d | d <d S)z type_specifier  : typedef_name
                            | enum_specifier
                            | struct_or_union_specifier
                            | type_specifier_no_typeid
                            | atomic_specifier
        r   rH   Nr"   )r   r   r"   r"   r#   p_type_specifierr  s    zCParser.p_type_specifierc             C   s(   | d } | j  j d  | | d <d S)z= atomic_specifier  : _ATOMIC LPAREN type_name RPAREN
        r   Z_AtomicrH   N)rJ   r)   )r   r   typr"   r"   r#   p_atomic_specifier|  s    
zCParser.p_atomic_specifierc             C   s   | d | d <d S)z type_qualifier  : CONST
                            | RESTRICT
                            | VOLATILE
                            | _ATOMIC
        r   rH   Nr"   )r   r   r"   r"   r#   p_type_qualifier  s    zCParser.p_type_qualifierc             C   s<   t  |  d k r' | d | d g n
 | d g | d <d S)z init_declarator_list    : init_declarator
                                    | init_declarator_list COMMA init_declarator
        r   r   r   rH   N)r+   )r   r   r"   r"   r#   p_init_declarator_list  s    zCParser.p_init_declarator_listc             C   s=   t  d | d d t |  d k r, | d n d  | d <d S)zb init_declarator : declarator
                            | declarator EQUALS initializer
        r@   r   r\   rX   r   NrH   )r   r+   )r   r   r"   r"   r#   p_init_declarator  s    zCParser.p_init_declaratorc             C   s<   t  |  d k r' | d | d g n
 | d g | d <d S)z id_init_declarator_list    : id_init_declarator
                                       | id_init_declarator_list COMMA init_declarator
        r   r   r   rH   N)r+   )r   r   r"   r"   r#   p_id_init_declarator_list  s    z!CParser.p_id_init_declarator_listc             C   s=   t  d | d d t |  d k r, | d n d  | d <d S)zn id_init_declarator : id_declarator
                               | id_declarator EQUALS initializer
        r@   r   r\   rX   r   NrH   )r   r+   )r   r   r"   r"   r#   p_id_init_declarator  s    zCParser.p_id_init_declaratorc             C   s+   |  j  | d | d d d d | d <d S)zY specifier_qualifier_list    : specifier_qualifier_list type_specifier_no_typeid
        r   rX   r=   r)   TrH   N)rU   )r   r   r"   r"   r#   p_specifier_qualifier_list_1  s    z$CParser.p_specifier_qualifier_list_1c             C   s+   |  j  | d | d d d d | d <d S)zO specifier_qualifier_list    : specifier_qualifier_list type_qualifier
        r   rX   rO   r)   TrH   N)rU   )r   r   r"   r"   r#   p_specifier_qualifier_list_2  s    z$CParser.p_specifier_qualifier_list_2c             C   s!   |  j  d | d d  | d <d S)z4 specifier_qualifier_list  : type_specifier
        Nr   r=   rH   )rU   )r   r   r"   r"   r#   p_specifier_qualifier_list_3  s    z$CParser.p_specifier_qualifier_list_3c             C   s:   t  d | d d g  d g  d | d g d g   | d <d	 S)
zH specifier_qualifier_list  : type_qualifier_list type_specifier
        rO   r   rR   rP   r=   rX   rQ   rH   N)r   )r   r   r"   r"   r#   p_specifier_qualifier_list_4  s    z$CParser.p_specifier_qualifier_list_4c             C   s6   t  d g  d | d g d g  d g  d g   | d <d S)	z9 specifier_qualifier_list  : alignment_specifier
        rO   rR   r   rP   r=   rQ   rH   N)r   )r   r   r"   r"   r#   p_specifier_qualifier_list_5  s    z$CParser.p_specifier_qualifier_list_5c             C   s%   |  j  | d | d d  | d <d S)zR specifier_qualifier_list  : specifier_qualifier_list alignment_specifier
        r   rX   rR   rH   N)rU   )r   r   r"   r"   r#   p_specifier_qualifier_list_6  s    z$CParser.p_specifier_qualifier_list_6c          	   C   sF   |  j  | d  } | d | d d d d |  j | d   | d <d S)z{ struct_or_union_specifier   : struct_or_union ID
                                        | struct_or_union TYPEID
        r   r2   rX   rb   Nr3   rH   )rk   r   )r   r   klassr"   r"   r#   p_struct_or_union_specifier_1  s
    
z%CParser.p_struct_or_union_specifier_1c          	   C   s   |  j  | d  } t |  d k rS | d d d g  d |  j | d   | d <n/ | d d d | d	 d |  j | d   | d <d S)
z struct_or_union_specifier : struct_or_union brace_open struct_declaration_list brace_close
                                      | struct_or_union brace_open brace_close
        r   r   r2   Nrb   r3   rX   rH   r   )rk   r+   r   )r   r   r   r"   r"   r#   p_struct_or_union_specifier_2  s    
z%CParser.p_struct_or_union_specifier_2c          	   C   s   |  j  | d  } t |  d k rW | d | d d g  d |  j | d   | d <n3 | d | d d | d d |  j | d   | d <d	 S)
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
        r   r   r2   rX   rb   r3   rH   r   N)rk   r+   r   )r   r   r   r"   r"   r#   p_struct_or_union_specifier_3  s    


z%CParser.p_struct_or_union_specifier_3c             C   s   | d | d <d S)zF struct_or_union : STRUCT
                            | UNION
        r   rH   Nr"   )r   r   r"   r"   r#   p_struct_or_union  s    zCParser.p_struct_or_unionc             C   sI   t  |  d k r) | d p g  | d <n | d | d p= g  | d <d S)z struct_declaration_list     : struct_declaration
                                        | struct_declaration_list struct_declaration
        rX   r   rH   N)r+   )r   r   r"   r"   r#   p_struct_declaration_list  s    z!CParser.p_struct_declaration_listc          	   C   s   | d } d | d k s  t   | d d k	 rO |  j d | d | d  } n t | d  d k r | d d	 } t | t j  r | } n t j |  } |  j d | d t d
 |  g  } n* |  j d | d t d
 d d d  g  } | | d	 <d S)zW struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI
        r   rV   rP   rX   NrT   rb   r=   rH   r@   r\   )r,   rf   r+   r>   r   ZNoderK   r   )r   r   rT   rb   ZnodeZ	decl_typer"   r"   r#   p_struct_declaration_1
  s$    
				zCParser.p_struct_declaration_1c             C   s   d | d <d S)z# struct_declaration : SEMI
        NrH   r"   )r   r   r"   r"   r#   p_struct_declaration_20  s    zCParser.p_struct_declaration_2c             C   s   | d g | d <d S)z1 struct_declaration : pppragma_directive
        r   rH   Nr"   )r   r   r"   r"   r#   p_struct_declaration_35  s    zCParser.p_struct_declaration_3c             C   s<   t  |  d k r' | d | d g n
 | d g | d <d S)z struct_declarator_list  : struct_declarator
                                    | struct_declarator_list COMMA struct_declarator
        r   r   r   rH   N)r+   )r   r   r"   r"   r#   p_struct_declarator_list:  s    z CParser.p_struct_declarator_listc             C   s   d | d d d i | d <d S)z( struct_declarator : declarator
        r@   r   rW   NrH   r"   )r   r   r"   r"   r#   p_struct_declarator_1C  s    zCParser.p_struct_declarator_1c             C   sc   t  |  d k r3 d | d d | d i | d <n, d t j d d d d  d | d i | d <d S)z struct_declarator   : declarator COLON constant_expression
                                | COLON constant_expression
        r   r@   r   rW   rH   NrX   )r+   r   r?   )r   r   r"   r"   r#   p_struct_declarator_2H  s    !zCParser.p_struct_declarator_2c             C   s-   t  j | d d |  j | d   | d <d S)zM enum_specifier  : ENUM ID
                            | ENUM TYPEID
        rX   Nr   rH   )r   r^   r   )r   r   r"   r"   r#   p_enum_specifier_1Q  s    zCParser.p_enum_specifier_1c             C   s-   t  j d | d |  j | d   | d <d S)zG enum_specifier  : ENUM brace_open enumerator_list brace_close
        Nr   r   rH   )r   r^   r   )r   r   r"   r"   r#   p_enum_specifier_2W  s    zCParser.p_enum_specifier_2c             C   s1   t  j | d | d |  j | d   | d <d S)z enum_specifier  : ENUM ID brace_open enumerator_list brace_close
                            | ENUM TYPEID brace_open enumerator_list brace_close
        rX   r   r   rH   N)r   r^   r   )r   r   r"   r"   r#   p_enum_specifier_3\  s    zCParser.p_enum_specifier_3c             C   s   t  |  d k r9 t j | d g | d j  | d <nI t  |  d k r\ | d | d <n& | d j j | d  | d | d <d S)z enumerator_list : enumerator
                            | enumerator_list COMMA
                            | enumerator_list COMMA enumerator
        rX   r   rH   r   N)r+   r   ZEnumeratorListr3   Zenumeratorsr)   )r   r   r"   r"   r#   p_enumerator_listb  s    'zCParser.p_enumerator_listc             C   s*   t  j | d |  j | d   | d <d S)z alignment_specifier  : _ALIGNAS LPAREN type_name RPAREN
                                 | _ALIGNAS LPAREN constant_expression RPAREN
        r   r   rH   N)r   ZAlignasr   )r   r   r"   r"   r#   p_alignment_specifiero  s    zCParser.p_alignment_specifierc             C   s   t  |  d k r: t j | d d |  j | d   } n) t j | d | d |  j | d   } |  j | j | j  | | d <d S)zR enumerator  : ID
                        | ID EQUALS constant_expression
        rX   r   Nr   rH   )r+   r   Z
Enumeratorr   r5   r2   r3   )r   r   Z
enumeratorr"   r"   r#   p_enumeratoru  s    
zCParser.p_enumeratorc             C   s   | d | d <d S)zQ declarator  : id_declarator
                        | typeid_declarator
        r   rH   Nr"   )r   r   r"   r"   r#   p_declarator  s    zCParser.p_declaratorrF   IDtypeidTYPEIDtypeid_noparenc             C   s   | d | d <d S)z1 xxx_declarator  : direct_xxx_declarator
        r   rH   Nr"   )r   r   r"   r"   r#   p_xxx_declarator_1  s    zCParser.p_xxx_declarator_1c             C   s"   |  j  | d | d  | d <d S)z9 xxx_declarator  : pointer direct_xxx_declarator
        rX   r   rH   N)rB   )r   r   r"   r"   r#   p_xxx_declarator_2  s    zCParser.p_xxx_declarator_2c             C   sB   t  j d | d d d d d d d d |  j | d   | d <d S)	z' direct_xxx_declarator   : yyy
        rI   r   r=   NrJ   rZ   r3   rH   )r   r?   r   )r   r   r"   r"   r#   p_direct_xxx_declarator_1  s    	
z!CParser.p_direct_xxx_declarator_1c             C   s   | d | d <d S)z@ direct_xxx_declarator   : LPAREN xxx_declarator RPAREN
        rX   rH   Nr"   )r   r   r"   r"   r#   p_direct_xxx_declarator_2  s    z!CParser.p_direct_xxx_declarator_2c          
   C   s   t  |  d k r | d n g  p% g  } t j d d d t  |  d k rS | d n | d d | d | d	 j  } |  j d
 | d	 d |  | d <d S)z} direct_xxx_declarator   : direct_xxx_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
        r   r   r=   Ndimr   	dim_qualsr3   r   r@   rA   rH   )r+   r   	ArrayDeclr3   rB   )r   r   rJ   arrr"   r"   r#   p_direct_xxx_declarator_3  s    (	&z!CParser.p_direct_xxx_declarator_3c          
   C   s   d d   | d | d g D } d d   | D } t  j d d d | d	 d
 | d | d j  } |  j d | d d |  | d <d S)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
        c             S   s.   g  |  ]$ } t  | t  r! | n | g  q Sr"   )r>   list)rE   itemr"   r"   r#   rG     s   	z5CParser.p_direct_xxx_declarator_4.<locals>.<listcomp>r   r   c             S   s/   g  |  ]% } | D] } | d  k	 r |  q q S)Nr"   )rE   ZsublistrO   r"   r"   r#   rG     s   	 r=   Nr   r   r   r3   r   r@   rA   rH   )r   r   r3   rB   )r   r   Zlisted_qualsr   r   r"   r"   r#   p_direct_xxx_declarator_4  s    		
z!CParser.p_direct_xxx_declarator_4c          
   C   s   t  j d d d t  j | d |  j | d   d | d d k	 rK | d n g  d | d j  } |  j d	 | d d
 |  | d <d S)zi direct_xxx_declarator   : direct_xxx_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET
        r=   Nr   r   r   r   r3   r   r@   rA   rH   )r   r   r   r   r3   rB   )r   r   r   r"   r"   r#   p_direct_xxx_declarator_5  s    	" z!CParser.p_direct_xxx_declarator_5c             C   s   t  j d | d d d d | d j  } |  j   j d k r | j d k	 r x= | j j D]/ } t | t  j  rs P|  j	 | j
 | j  qZ W|  j d | d d	 |  | d
 <d S)z direct_xxx_declarator   : direct_xxx_declarator LPAREN parameter_type_list RPAREN
                                    | direct_xxx_declarator LPAREN identifier_list_opt RPAREN
        argsr   r=   Nr3   r   LBRACEr@   rA   rH   )r   rL   r3   r<   r=   r   paramsr>   EllipsisParamr5   r2   rB   )r   r   funcZparamr"   r"   r#   p_direct_xxx_declarator_6  s    	
 z!CParser.p_direct_xxx_declarator_6c             C   s   |  j  | d  } t j d | d p( g  d d d |  } t |  d k r | d } x | j d k	 rt | j } qY W| | _ | d | d <n
 | | d <d S)	zm pointer : TIMES type_qualifier_list_opt
                    | TIMES type_qualifier_list_opt pointer
        r   rJ   rX   r=   Nr3   r   rH   )r   r   ZPtrDeclr+   r=   )r   r   r3   Znested_typeZ	tail_typer"   r"   r#   	p_pointer  s    (
	zCParser.p_pointerc             C   s<   t  |  d k r | d g n | d | d g | d <d S)zs type_qualifier_list : type_qualifier
                                | type_qualifier_list type_qualifier
        rX   r   rH   N)r+   )r   r   r"   r"   r#   p_type_qualifier_list  s    zCParser.p_type_qualifier_listc             C   sM   t  |  d k r; | d j j t j |  j | d    | d | d <d S)zn parameter_type_list : parameter_list
                                | parameter_list COMMA ELLIPSIS
        rX   r   r   rH   N)r+   r   r)   r   r   r   )r   r   r"   r"   r#   p_parameter_type_list  s    )zCParser.p_parameter_type_listc             C   sc   t  |  d k r9 t j | d g | d j  | d <n& | d j j | d  | d | d <d S)zz parameter_list  : parameter_declaration
                            | parameter_list COMMA parameter_declaration
        rX   r   rH   r   N)r+   r   	ParamListr3   r   r)   )r   r   r"   r"   r#   p_parameter_list#  s    'zCParser.p_parameter_listc             C   ss   | d } | d s? t  j d g d |  j | d  g | d <|  j d | d t d | d  g  d	 | d	 <d
 S)z parameter_declaration   : declaration_specifiers id_declarator
                                    | declaration_specifiers typeid_noparen_declarator
        r   r=   rC   r3   rT   rb   r@   rX   rH   N)r   rK   r   rf   r   )r   r   rT   r"   r"   r#   p_parameter_declaration_17  s    

	z!CParser.p_parameter_declaration_1c             C   sE  | d } | d s? t  j d g d |  j | d  g | d <t | d  d k r t | d d j  d k r |  j | d d j d  r |  j d | d t d | d	 d
 d  g  d } nr t  j d d d | d d d d | d	 pt  j	 d d d d  d |  j | d	   } | d } |  j
 | |  } | | d <d S)zR parameter_declaration   : declaration_specifiers abstract_declarator_opt
        r   r=   rC   r3   rH   rT   rb   r@   rX   r\   Nr2   r   rJ   rO   rZ   r/   r/   )r   rK   r   r+   rD   r7   rf   r   Typenamer?   rN   )r   r   rT   r@   rM   r"   r"   r#   p_parameter_declaration_2C  s$    

3	&	
"
z!CParser.p_parameter_declaration_2c             C   sc   t  |  d k r9 t j | d g | d j  | d <n& | d j j | d  | d | d <d S)ze identifier_list : identifier
                            | identifier_list COMMA identifier
        rX   r   rH   r   N)r+   r   r   r3   r   r)   )r   r   r"   r"   r#   p_identifier_listc  s    'zCParser.p_identifier_listc             C   s   | d | d <d S)z- initializer : assignment_expression
        r   rH   Nr"   )r   r   r"   r"   r#   p_initializer_1m  s    zCParser.p_initializer_1c             C   sG   | d d k r5 t  j g  |  j | d   | d <n | d | d <d S)z initializer : brace_open initializer_list_opt brace_close
                        | brace_open initializer_list COMMA brace_close
        rX   Nr   rH   )r   InitListr   )r   r   r"   r"   r#   p_initializer_2r  s    %zCParser.p_initializer_2c             C   s   t  |  d k ri | d d k r, | d n t j | d | d  } t j | g | d j  | d <nV | d d k r | d n t j | d | d  } | d j j |  | d | d <d S)z initializer_list    : designation_opt initializer
                                | initializer_list COMMA designation_opt initializer
        r   r   NrX   rH   r   )r+   r   ZNamedInitializerr   r3   exprsr)   )r   r   r\   r"   r"   r#   p_initializer_list{  s    4#4zCParser.p_initializer_listc             C   s   | d | d <d S)z. designation : designator_list EQUALS
        r   rH   Nr"   )r   r   r"   r"   r#   p_designation  s    zCParser.p_designationc             C   s<   t  |  d k r | d g n | d | d g | d <d S)z_ designator_list : designator
                            | designator_list designator
        rX   r   rH   N)r+   )r   r   r"   r"   r#   p_designator_list  s    zCParser.p_designator_listc             C   s   | d | d <d S)zi designator  : LBRACKET constant_expression RBRACKET
                        | PERIOD identifier
        rX   rH   Nr"   )r   r   r"   r"   r#   p_designator  s    zCParser.p_designatorc             C   s   t  j d d d | d d d d  d d d | d	 pL t  j d d d d  d
 |  j | d	   } |  j | | d d  | d <d S)zH type_name   : specifier_qualifier_list abstract_declarator_opt
        r2   r   rJ   r   rO   NrZ   r=   rX   r3   rH   )r   r   r?   r   rN   )r   r   rM   r"   r"   r#   p_type_name  s    	"zCParser.p_type_namec             C   s<   t  j d d d d  } |  j d | d | d  | d <d S)z+ abstract_declarator     : pointer
        Nr@   rA   r   rH   )r   r?   rB   )r   r   Z	dummytyper"   r"   r#   p_abstract_declarator_1  s    	zCParser.p_abstract_declarator_1c             C   s"   |  j  | d | d  | d <d S)zF abstract_declarator     : pointer direct_abstract_declarator
        rX   r   rH   N)rB   )r   r   r"   r"   r#   p_abstract_declarator_2  s    zCParser.p_abstract_declarator_2c             C   s   | d | d <d S)z> abstract_declarator     : direct_abstract_declarator
        r   rH   Nr"   )r   r   r"   r"   r#   p_abstract_declarator_3  s    zCParser.p_abstract_declarator_3c             C   s   | d | d <d S)zA direct_abstract_declarator  : LPAREN abstract_declarator RPAREN rX   rH   Nr"   )r   r   r"   r"   r#   p_direct_abstract_declarator_1  s    z&CParser.p_direct_abstract_declarator_1c          
   C   sS   t  j d d d | d d g  d | d j  } |  j d | d d	 |  | d
 <d S)zn direct_abstract_declarator  : direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET
        r=   Nr   r   r   r3   r   r@   rA   rH   )r   r   r3   rB   )r   r   r   r"   r"   r#   p_direct_abstract_declarator_2  s    	
z&CParser.p_direct_abstract_declarator_2c             C   s   t  |  d k r | d n g  p% g  } t j d t j d d d d  d t  |  d k re | d n | d d | d |  j | d	   | d
 <d S)zk direct_abstract_declarator  : LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
        r   rX   r=   Nr   r   r   r3   r   rH   )r+   r   r   r?   r   )r   r   rJ   r"   r"   r#   p_direct_abstract_declarator_3  s    (	&z&CParser.p_direct_abstract_declarator_3c          
   C   sk   t  j d d d t  j | d |  j | d   d g  d | d j  } |  j d | d d	 |  | d
 <d S)zZ direct_abstract_declarator  : direct_abstract_declarator LBRACKET TIMES RBRACKET
        r=   Nr   r   r   r3   r   r@   rA   rH   )r   r   r   r   r3   rB   )r   r   r   r"   r"   r#   p_direct_abstract_declarator_4  s    	"z&CParser.p_direct_abstract_declarator_4c             C   sf   t  j d t  j d d d d  d t  j | d |  j | d   d g  d |  j | d   | d <d S)	z? direct_abstract_declarator  : LBRACKET TIMES RBRACKET
        r=   Nr   r   r   r3   r   rH   )r   r   r?   r   r   )r   r   r"   r"   r#   p_direct_abstract_declarator_5  s
    	"z&CParser.p_direct_abstract_declarator_5c             C   sM   t  j d | d d d d | d j  } |  j d | d d |  | d	 <d S)
zh direct_abstract_declarator  : direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN
        r   r   r=   Nr3   r   r@   rA   rH   )r   rL   r3   rB   )r   r   r   r"   r"   r#   p_direct_abstract_declarator_6  s
    	
z&CParser.p_direct_abstract_declarator_6c          	   C   sH   t  j d | d d t  j d d d d  d |  j | d   | d <d S)zM direct_abstract_declarator  : LPAREN parameter_type_list_opt RPAREN
        r   rX   r=   Nr3   r   rH   )r   rL   r?   r   )r   r   r"   r"   r#   p_direct_abstract_declarator_7  s    	
z&CParser.p_direct_abstract_declarator_7c             C   s2   t  | d t  r | d n
 | d g | d <d S)zG block_item  : declaration
                        | statement
        r   rH   N)r>   r   )r   r   r"   r"   r#   p_block_item   s    zCParser.p_block_itemc             C   sI   t  |  d k s% | d d g k r/ | d n | d | d | d <d S)z_ block_item_list : block_item
                            | block_item_list block_item
        rX   Nr   rH   )r+   )r   r   r"   r"   r#   p_block_item_list  s    zCParser.p_block_item_listc             C   s0   t  j d | d d |  j | d   | d <d S)zA compound_statement : brace_open block_item_list_opt brace_close r   rX   r3   r   rH   N)r   r   r   )r   r   r"   r"   r#   p_compound_statement_1  s    	
zCParser.p_compound_statement_1c             C   s1   t  j | d | d |  j | d   | d <d S)z6 labeled_statement : ID COLON pragmacomp_or_statement r   r   rH   N)r   ZLabelr   )r   r   r"   r"   r#   p_labeled_statement_1  s    zCParser.p_labeled_statement_1c             C   s4   t  j | d | d g |  j | d   | d <d S)zL labeled_statement : CASE constant_expression COLON pragmacomp_or_statement rX   r   r   rH   N)r   ZCaser   )r   r   r"   r"   r#   p_labeled_statement_2  s    zCParser.p_labeled_statement_2c             C   s-   t  j | d g |  j | d   | d <d S)z; labeled_statement : DEFAULT COLON pragmacomp_or_statement r   r   rH   N)r   ZDefaultr   )r   r   r"   r"   r#   p_labeled_statement_3  s    zCParser.p_labeled_statement_3c             C   s4   t  j | d | d d |  j | d   | d <d S)zK selection_statement : IF LPAREN expression RPAREN pragmacomp_or_statement r   r   Nr   rH   )r   Ifr   )r   r   r"   r"   r#   p_selection_statement_1!  s    zCParser.p_selection_statement_1c             C   s8   t  j | d | d | d |  j | d   | d <d S)zZ selection_statement : IF LPAREN expression RPAREN statement ELSE pragmacomp_or_statement r   r      r   rH   N)r   r  r   )r   r   r"   r"   r#   p_selection_statement_2%  s    zCParser.p_selection_statement_2c             C   s7   t  t j | d | d |  j | d    | d <d S)zO selection_statement : SWITCH LPAREN expression RPAREN pragmacomp_or_statement r   r   r   rH   N)r	   r   ZSwitchr   )r   r   r"   r"   r#   p_selection_statement_3)  s    zCParser.p_selection_statement_3c             C   s1   t  j | d | d |  j | d   | d <d S)zN iteration_statement : WHILE LPAREN expression RPAREN pragmacomp_or_statement r   r   r   rH   N)r   ZWhiler   )r   r   r"   r"   r#   p_iteration_statement_1.  s    zCParser.p_iteration_statement_1c             C   s1   t  j | d | d |  j | d   | d <d S)zV iteration_statement : DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMI r   rX   r   rH   N)r   ZDoWhiler   )r   r   r"   r"   r#   p_iteration_statement_22  s    zCParser.p_iteration_statement_2c             C   s?   t  j | d | d | d | d |  j | d   | d <d S)zx iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement r   r   r  	   r   rH   N)r   Forr   )r   r   r"   r"   r#   p_iteration_statement_36  s    zCParser.p_iteration_statement_3c             C   sW   t  j t  j | d |  j | d   | d | d | d |  j | d   | d <d S)zp iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement r   r   r         rH   N)r   r  ZDeclListr   )r   r   r"   r"   r#   p_iteration_statement_4:  s    %zCParser.p_iteration_statement_4c             C   s*   t  j | d |  j | d   | d <d S)z  jump_statement  : GOTO ID SEMI rX   r   rH   N)r   ZGotor   )r   r   r"   r"   r#   p_jump_statement_1?  s    zCParser.p_jump_statement_1c             C   s#   t  j |  j | d   | d <d S)z jump_statement  : BREAK SEMI r   rH   N)r   ZBreakr   )r   r   r"   r"   r#   p_jump_statement_2C  s    zCParser.p_jump_statement_2c             C   s#   t  j |  j | d   | d <d S)z! jump_statement  : CONTINUE SEMI r   rH   N)r   ZContinuer   )r   r   r"   r"   r#   p_jump_statement_3G  s    zCParser.p_jump_statement_3c             C   sB   t  j t |  d k r" | d n d |  j | d   | d <d S)z\ jump_statement  : RETURN expression SEMI
                            | RETURN SEMI
        r   rX   Nr   rH   )r   ZReturnr+   r   )r   r   r"   r"   r#   p_jump_statement_4K  s    zCParser.p_jump_statement_4c             C   sD   | d d k r2 t  j |  j | d   | d <n | d | d <d S)z, expression_statement : expression_opt SEMI r   NrX   rH   )r   ZEmptyStatementr   )r   r   r"   r"   r#   p_expression_statementQ  s    "zCParser.p_expression_statementc             C   s   t  |  d k r# | d | d <n` t | d t j  s] t j | d g | d j  | d <| d j j | d  | d | d <d S)zn expression  : assignment_expression
                        | expression COMMA assignment_expression
        rX   r   rH   r   N)r+   r>   r   ExprListr3   r   r)   )r   r   r"   r"   r#   p_expressionX  s    $zCParser.p_expressionc             C   s   | d | d <d S)z: assignment_expression : LPAREN compound_statement RPAREN rX   rH   Nr"   )r   r   r"   r"   r#   #p_parenthesized_compound_expressione  s    z+CParser.p_parenthesized_compound_expressionc             C   s0   t  j | d g d |  j | d  | d <d S)z typedef_name : TYPEID r   r3   rH   N)r   rK   r   )r   r   r"   r"   r#   p_typedef_namei  s    zCParser.p_typedef_namec             C   sV   t  |  d k r# | d | d <n/ t j | d | d | d | d j  | d <d S)z assignment_expression   : conditional_expression
                                    | unary_expression assignment_operator assignment_expression
        rX   r   rH   r   N)r+   r   Z
Assignmentr3   )r   r   r"   r"   r#   p_assignment_expressionm  s    zCParser.p_assignment_expressionc             C   s   | d | d <d S)a   assignment_operator : EQUALS
                                | XOREQUAL
                                | TIMESEQUAL
                                | DIVEQUAL
                                | MODEQUAL
                                | PLUSEQUAL
                                | MINUSEQUAL
                                | LSHIFTEQUAL
                                | RSHIFTEQUAL
                                | ANDEQUAL
                                | OREQUAL
        r   rH   Nr"   )r   r   r"   r"   r#   p_assignment_operator{  s    zCParser.p_assignment_operatorc             C   s   | d | d <d S)z. constant_expression : conditional_expression r   rH   Nr"   )r   r   r"   r"   r#   p_constant_expression  s    zCParser.p_constant_expressionc             C   sV   t  |  d k r# | d | d <n/ t j | d | d | d | d j  | d <d S)z conditional_expression  : binary_expression
                                    | binary_expression CONDOP expression COLON conditional_expression
        rX   r   rH   r   r   N)r+   r   Z	TernaryOpr3   )r   r   r"   r"   r#   p_conditional_expression  s    z CParser.p_conditional_expressionc             C   sV   t  |  d k r# | d | d <n/ t j | d | d | d | d j  | d <d S)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
        rX   r   rH   r   N)r+   r   ZBinaryOpr3   )r   r   r"   r"   r#   p_binary_expression  s    zCParser.p_binary_expressionc             C   s   | d | d <d S)z$ cast_expression : unary_expression r   rH   Nr"   )r   r   r"   r"   r#   p_cast_expression_1  s    zCParser.p_cast_expression_1c             C   s1   t  j | d | d |  j | d   | d <d S)z; cast_expression : LPAREN type_name RPAREN cast_expression rX   r   r   rH   N)r   ZCastr   )r   r   r"   r"   r#   p_cast_expression_2  s    zCParser.p_cast_expression_2c             C   s   | d | d <d S)z* unary_expression    : postfix_expression r   rH   Nr"   )r   r   r"   r"   r#   p_unary_expression_1  s    zCParser.p_unary_expression_1c             C   s,   t  j | d | d | d j  | d <d S)z unary_expression    : PLUSPLUS unary_expression
                                | MINUSMINUS unary_expression
                                | unary_operator cast_expression
        r   rX   rH   N)r   UnaryOpr3   )r   r   r"   r"   r#   p_unary_expression_2  s    zCParser.p_unary_expression_2c             C   sM   t  j | d t |  d k r) | d n | d |  j | d   | d <d S)z unary_expression    : SIZEOF unary_expression
                                | SIZEOF LPAREN type_name RPAREN
                                | _ALIGNOF LPAREN type_name RPAREN
        r   r   rX   rH   N)r   r!  r+   r   )r   r   r"   r"   r#   p_unary_expression_3  s    #zCParser.p_unary_expression_3c             C   s   | d | d <d S)z unary_operator  : AND
                            | TIMES
                            | PLUS
                            | MINUS
                            | NOT
                            | LNOT
        r   rH   Nr"   )r   r   r"   r"   r#   p_unary_operator  s    zCParser.p_unary_operatorc             C   s   | d | d <d S)z* postfix_expression  : primary_expression r   rH   Nr"   )r   r   r"   r"   r#   p_postfix_expression_1  s    zCParser.p_postfix_expression_1c             C   s,   t  j | d | d | d j  | d <d S)zG postfix_expression  : postfix_expression LBRACKET expression RBRACKET r   r   rH   N)r   ArrayRefr3   )r   r   r"   r"   r#   p_postfix_expression_2  s    zCParser.p_postfix_expression_2c             C   sD   t  j | d t |  d k r) | d n d | d j  | d <d S)z postfix_expression  : postfix_expression LPAREN argument_expression_list RPAREN
                                | postfix_expression LPAREN RPAREN
        r   r   r   NrH   )r   FuncCallr+   r3   )r   r   r"   r"   r#   p_postfix_expression_3  s    zCParser.p_postfix_expression_3c             C   sQ   t  j | d |  j | d   } t  j | d | d | | d j  | d <d S)z postfix_expression  : postfix_expression PERIOD ID
                                | postfix_expression PERIOD TYPEID
                                | postfix_expression ARROW ID
                                | postfix_expression ARROW TYPEID
        r   r   rX   rH   N)r   r   r   	StructRefr3   )r   r   Zfieldr"   r"   r#   p_postfix_expression_4  s    "zCParser.p_postfix_expression_4c             C   s0   t  j d | d | d | d j  | d <d S)z{ postfix_expression  : postfix_expression PLUSPLUS
                                | postfix_expression MINUSMINUS
        r   rX   r   rH   N)r   r!  r3   )r   r   r"   r"   r#   p_postfix_expression_5  s    zCParser.p_postfix_expression_5c             C   s"   t  j | d | d  | d <d S)z postfix_expression  : LPAREN type_name RPAREN brace_open initializer_list brace_close
                                | LPAREN type_name RPAREN brace_open initializer_list COMMA brace_close
        rX   r   rH   N)r   ZCompoundLiteral)r   r   r"   r"   r#   p_postfix_expression_6  s    zCParser.p_postfix_expression_6c             C   s   | d | d <d S)z" primary_expression  : identifier r   rH   Nr"   )r   r   r"   r"   r#   p_primary_expression_1  s    zCParser.p_primary_expression_1c             C   s   | d | d <d S)z  primary_expression  : constant r   rH   Nr"   )r   r   r"   r"   r#   p_primary_expression_2  s    zCParser.p_primary_expression_2c             C   s   | d | d <d S)zp primary_expression  : unified_string_literal
                                | unified_wstring_literal
        r   rH   Nr"   )r   r   r"   r"   r#   p_primary_expression_3  s    zCParser.p_primary_expression_3c             C   s   | d | d <d S)z0 primary_expression  : LPAREN expression RPAREN rX   rH   Nr"   )r   r   r"   r"   r#   p_primary_expression_4	  s    zCParser.p_primary_expression_4c             C   sY   |  j  | d  } t j t j | d |  t j | d | d g |  |  | d <d S)za primary_expression  : OFFSETOF LPAREN type_name COMMA offsetof_member_designator RPAREN
        r   r   r   rH   N)r   r   r(  r   r  )r   r   r3   r"   r"   r#   p_primary_expression_5  s    zCParser.p_primary_expression_5c             C   s   t  |  d k r# | d | d <n t  |  d k rg t j | d | d | d | d j  | d <nS t  |  d k r t j | d | d | d j  | d <n t d t  |    d S)	z offsetof_member_designator : identifier
                                         | offsetof_member_designator PERIOD identifier
                                         | offsetof_member_designator LBRACKET expression RBRACKET
        rX   r   rH   r   r   r   z$Unexpected parsing state. len(p): %uN)r+   r   r*  r3   r&  NotImplementedError)r   r   r"   r"   r#   p_offsetof_member_designator  s    2+z$CParser.p_offsetof_member_designatorc             C   sc   t  |  d k r9 t j | d g | d j  | d <n& | d j j | d  | d | d <d S)z argument_expression_list    : assignment_expression
                                        | argument_expression_list COMMA assignment_expression
        rX   r   rH   r   N)r+   r   r  r3   r   r)   )r   r   r"   r"   r#   p_argument_expression_list#  s    'z"CParser.p_argument_expression_listc             C   s*   t  j | d |  j | d   | d <d S)z identifier  : ID r   rH   N)r   r   r   )r   r   r"   r"   r#   p_identifier-  s    zCParser.p_identifierc             C   s   d } d } xK | d d d  D]5 } | d k r@ | d 7} q! | d k r! | d 7} q! Wd	 } | d k r{ t  d
   n | d k r t  d   d | d | } t j | d | d |  j | d   | d <d S)z constant    : INT_CONST_DEC
                        | INT_CONST_OCT
                        | INT_CONST_HEX
                        | INT_CONST_BIN
                        | INT_CONST_CHAR
        rH   r   r   NlLuUr   z.Constant cannot have more than one u/U suffix.rX   z.Constant cannot have more than two l/L suffix.z	unsigned zlong rC   )r7  r8  )r9  r:  )
ValueErrorr   Constantr   )r   r   ZuCountZlCountxrd   prefixr"   r"   r#   p_constant_11  s    zCParser.p_constant_1c             C   s   d | d j    k r d } n@ | d d d k r< d } n# | d d d k rY d } n d	 } t j | | d |  j | d   | d
 <d S)zM constant    : FLOAT_CONST
                        | HEX_FLOAT_CONST
        r>  r   floatfFr7  r8  zlong doubleZdoublerH   Nr/   )rB  rC  r/   )r7  r8  )lowerr   r=  r   )r   r   rd   r"   r"   r#   p_constant_2H  s    			zCParser.p_constant_2c             C   s-   t  j d | d |  j | d   | d <d S)z constant    : CHAR_CONST
                        | WCHAR_CONST
                        | U8CHAR_CONST
                        | U16CHAR_CONST
                        | U32CHAR_CONST
        charr   rH   N)r   r=  r   )r   r   r"   r"   r#   p_constant_3Y  s    zCParser.p_constant_3c             C   s   t  |  d k r> t j d | d |  j | d   | d <n> | d j d d  | d d d  | d _ | d | d <d S)z~ unified_string_literal  : STRING_LITERAL
                                    | unified_string_literal STRING_LITERAL
        rX   stringr   rH   Nr/   )r+   r   r=  r   value)r   r   r"   r"   r#   p_unified_string_literalh  s
    &0z CParser.p_unified_string_literalc             C   s   t  |  d k r> t j d | d |  j | d   | d <nD | d j j   d d  | d d d  | d _ | d | d <d S)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
        rX   rH  r   rH   Nr/   )r+   r   r=  r   rI  rstrip)r   r   r"   r"   r#   p_unified_wstring_literals  s
    
&6z!CParser.p_unified_wstring_literalc             C   s+   | d | d <| j  d | j d   d S)z  brace_open  :   LBRACE
        r   rH   N)
set_linenolineno)r   r   r"   r"   r#   p_brace_open  s    zCParser.p_brace_openc             C   s+   | d | d <| j  d | j d   d S)z  brace_close :   RBRACE
        r   rH   N)rM  rN  )r   r   r"   r"   r#   p_brace_close  s    zCParser.p_brace_closec             C   s   d | d <d S)zempty : NrH   r"   )r   r   r"   r"   r#   p_empty  s    zCParser.p_emptyc             C   s[   | rA |  j  d | j |  j d | j d |  j j |    n |  j  d |  j j  d  S)Nz
before: %srN  r;   zAt end of input)r1   rI  r8   rN  r   Zfind_tok_columnr&   )r   r   r"   r"   r#   p_error  s    
zCParser.p_errorNrl   rm   rl   rn   rl   ro   rl   rp   rl   rq   rl   rr   rs   rl   rt   ru   rv   rw   rl   rx   ry   rl   rz   r{   rl   r|   r}   r~   )
rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  )rF   r   )r   r   )r   r   )rF   r   )r   r   )r   r   )rF   r   )r   r   )r   r   )rF   r   )r   r   )rF   r   )r   r   )r   r   )rF   r   )r   r   )r   r   )rF   r   )r   r   )r   r   )rF   r   )r   r   )r   r   )__name__
__module____qualname__r   r$   r'   r*   r.   r4   r5   r7   r   r   r   r   r<   rB   rN   rU   rf   ri   rk   Z
precedencer   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   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  r  r  r  r  r  r  r  r   r"  r#  r$  r%  r'  r)  r+  r,  r-  r.  r/  r0  r1  r2  r4  r5  r6  r@  rE  rG  rJ  rL  rO  rP  rQ  rR  r"   r"   r"   r#   r      st  g	

	)2,Y         
	
	7=	

		&			 
	

	
	

	
r   N)Zplyr   r   r   c_lexerr   Z	plyparserr   r   r   r   Zast_transformsr	   r
   r   r"   r"   r"   r#   <module>	   s   "