B
    *d                @   sd   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
G d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fddZ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d/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Z d?d@ Z!dAdB Z"dCdD Z#dEdF Z$dGdH Z%dIdJ Z&dKdL Z'dMdN Z(dOdP Z)dQdR Z*dSdT Z+dUdV Z,dWdX Z-dYdZ Z.d[d\ Z/d]d^ Z0d_d` Z1dadb Z2dcdd Z3dedf Z4dgdh Z5didj Z6dkdl Z7dmdn Z8dodp Z9dqdr Z:dsdt Z;dudv Z<dwdx Z=dydz Z>d{d| Z?d}d~ Z@dd ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVeWddddd ZXeWddddd ZYeWddddd ZZeWdddd Z[eWddddd Z\eWddddd Z]eWddddd Z^eWddddd Z_dd Z`dd ZaddÄ Zbddń ZcddǄ ZdddɄ Zedd˄ Zfdd̈́ Zgddτ Zhddф Ziddӄ ZjddՄ Zkddׄ Zlddل Zmddۄ Zndd݄ Zodd߄ Zpdd Zqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd Zxdd Zydd Zzdd Z{dd Z|dd Z}dd Z~dd Zdd Zd d Zdd Zdd Zdd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Zd@dA ZdBdC ZdDdE ZdFdG ZdHdI ZdJdK ZdLdM ZdNdO ZdPdQ ZdRdS ZdTdU ZdVdW ZdXdY ZdZd[ Zd\S (`  CParserTzpycparser.lextabzpycparser.yacctabF c       
      C   s   || j | j| j| jd| _| jj|||d | jj| _ddddddd	d
ddddddg}x|D ]}	| |	 q\W tj| 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lextab	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_listZtranslation_unit_or_empty)modulestartdebugr   Z	tabmoduler   N)_lex_error_func_lex_on_lbrace_func_lex_on_rbrace_func_lex_type_lookup_funcclexbuildtokensZ_create_opt_ruler   cparserdict_scope_stack_last_yielded_token)
selfZlex_optimizelexerr   Zyacc_optimizeZyacctabZ
yacc_debugZtaboutputdirZrules_with_optrule r!   _/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/pycparser/c_parser.py__init__   sF    :




zCParser.__init__c             C   s6   || j _| j   t g| _d| _| jj|| 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 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  d S )Nr   )lenr   AssertionErrorpop)r   r!   r!   r"   
_pop_scope   s    zCParser._pop_scopec             C   s4   | j d |ds"| d| | d| j d |< dS )zC Add a new typedef name (ie a TYPEID) to the current scope
        Tz;Typedef %r previously declared as non-typedef in this scopeN)r   get_parse_error)r   namecoordr!   r!   r"   _add_typedef_name   s
    
zCParser._add_typedef_namec             C   s4   | j d |dr"| 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 scopeN)r   r/   r0   )r   r1   r2   r!   r!   r"   _add_identifier   s
    
zCParser._add_identifierc             C   s.   x(t | jD ]}||}|dk	r|S qW dS )z8 Is *name* a typedef-name in the current scope?
        NF)reversedr   r/   )r   r1   scopeZin_scoper!   r!   r"   _is_type_in_scope   s
    
 zCParser._is_type_in_scopec             C   s   |  || || d S )N)r0   _coord)r   msglinecolumnr!   r!   r"   r      s    zCParser._lex_error_funcc             C   s   |    d S )N)r)   )r   r!   r!   r"   r      s    zCParser._lex_on_lbrace_funcc             C   s   |    d S )N)r-   )r   r!   r!   r"   r      s    zCParser._lex_on_rbrace_funcc             C   s   |  |}|S )z Looks up types that were previously defined with
            typedef.
            Passed to the lexer for recognizing identifiers that
            are types.
        )r7   )r   r1   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   sd   |}|}x|j r|j }q
W t|tjr0||_ |S |}xt|j tjsL|j }q6W |j |_ ||_ |S d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 |_x>|D ]6}t |tjs:t|dkrf| 	d|j
 q:||_|S q:W |st |jtjs| 	d|j
 tjdg|j
d|_n tjdd |D |d	 j
d|_|S )
z- Fixes a declaration. Modifies decl.
        Nr   z Invalid multiple types specifiedzMissing type in declarationint)r2   c             S   s   g | ]}|j D ]}|qqS r!   )names).0idr1   r!   r!   r"   
<listcomp>S  s    z/CParser._fix_decl_name_type.<locals>.<listcomp>    )r>   r   r?   r=   declnamer1   qualsIdentifierTyper*   r0   r2   FuncDecl)r   r@   typenamer=   tnr!   r!   r"   _fix_decl_name_type+  s.    


zCParser._fix_decl_name_typec             C   s>   |pt g g g g g d}|r*|| | n|| d| |S )a   Declaration specifiers are represented by a dictionary
            with the entries:
            * qual: a list of type qualifiers
            * storage: a list of storage type qualifiers
            * type: a list of type specifiers
            * function: a list of function specifiers
            * alignment: a list of alignment specifiers

            This method is given a declaration specifier, and a
            new specifier of a given kind.
            If `append` is True, the new specifier is added to the end of
            the specifiers list, otherwise it's added at the beginning.
            Returns the declaration specifier, with the new
            specifier incorporated.
        )qualstorager=   function	alignmentrH   )r   r(   insert)r   ZdeclspecZnewspeckindr(   specr!   r!   r"   _add_declaration_specifierW  s
    z"CParser._add_declaration_specifierc             C   sn  d|d k}g }|d  ddk	r&n<|d d dkrt|d dk stt|d d	 jd
kst| |d d	 jd sd}x"|d D ]}t|dr|j}P qW | d| tj|d d	 jd dd|d |d d	 jd|d d< |d d	= nvt	|d d tj
tjtjtjfsb|d d }xt	|tjs6|j}qW |jdkrb|d d	 jd |_|d d	= x|D ]}	|	d dk	st|rtjd|d |d |	d |	d jd}
nBtjd|d |d |d |d |	d |	 d|	 d|	d jd	}
t	|
jtj
tjtjtjfr|
}n| |
|d }|rR|rB| |j|j n| |j|j t|}|| qjW |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.
        typedefrQ   rH   bitsizeNr@   r=      r.   r   ?r2   zInvalid declarationrS   )rI   r=   rJ   alignr2   rP   )r1   rJ   rQ   r=   r2   rR   init)	r1   rJ   r\   rQ   funcspecr=   r]   rY   r2   )r/   r*   rD   r7   hasattrr2   r0   r   r?   r>   EnumStructUnionrK   r=   rI   r+   ZTypedefDeclrO   r3   r1   r4   r
   r(   )r   rV   declstypedef_namespaceZ
is_typedefZdeclarationsr2   tZdecls_0_tailr@   declarationZ
fixed_declr!   r!   r"   _build_declarationsp  sv    &

zCParser._build_declarationsc             C   sL   d|d kr|  d|j | j|t|ddgddd }tj||||jd	S )
z' Builds a function definition.
        rX   rQ   zInvalid typedefN)r@   r]   T)rV   rd   re   rH   )r@   param_declsbodyr2   )r0   r2   rh   r   r   ZFuncDef)r   rV   r@   ri   rj   rg   r!   r!   r"   _build_function_definition  s    z"CParser._build_function_definitionc             C   s   |dkrt jS t jS dS )z` Given a token (either STRUCT or UNION), selects the
            appropriate AST class.
        structN)r   ra   rb   )r   tokenr!   r!   r"   _select_struct_union_class  s    z"CParser._select_struct_union_class)
)leftZLOR)ro   ZLAND)ro   OR)ro   ZXOR)ro   AND)ro   ZEQZNE)ro   GTZGELTZLE)ro   ZRSHIFTZLSHIFT)ro   PLUSMINUS)ro   ZTIMESZDIVIDEZMODc             C   s2   |d dkrt g |d< nt |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   rv   r!   r!   r"   p_translation_unit_1  s    zCParser.p_translation_unit_1c             C   s"   |d  |d  |d |d< dS )zE translation_unit    : translation_unit external_declaration
        r   rZ   rH   N)extend)r   rv   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   rv   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   rv   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   rv   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   rv   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   rv   r!   r!   r"   p_external_declaration_5*  s    z CParser.p_external_declaration_5c             C   sV   t |dkr.t|d d| |dg|d< n$t|d |d | |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   rv   r!   r!   r"   p_static_assert_declaration/  s    "z#CParser.p_static_assert_declarationc             C   s   |  d| |d dS )z  pp_directive  : PPHASH
        zDirectives not supported yetr   N)r0   r   )r   rv   r!   r!   r"   p_pp_directive8  s    zCParser.p_pp_directivec             C   sF   t |dkr*t|d | |d|d< ntd| |d|d< dS )zg pppragma_directive      : PPPRAGMA
                                    | PPPRAGMA PPPRAGMASTR
        r   rZ   rH   r   r   N)r*   r   Pragmar   )r   rv   r!   r!   r"   p_pppragma_directive>  s    zCParser.p_pppragma_directivec          
   C   sN   t g g g tjdg| |ddgg d}| j||d |d |d d|d< d	S )
zU function_definition : id_declarator declaration_list_opt compound_statement
        rC   r   )r2   )rP   rS   rQ   r=   rR   rZ   r   )rV   r@   ri   rj   rH   N)r   r   rK   r   rk   )r   rv   rV   r!   r!   r"   p_function_definition_1I  s    zCParser.p_function_definition_1c             C   s.   |d }| j ||d |d |d d|d< dS )zl function_definition : declaration_specifiers id_declarator declaration_list_opt compound_statement
        r   rZ   r      )rV   r@   ri   rj   rH   N)rk   )r   rv   rV   r!   r!   r"   p_function_definition_2[  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   rv   r!   r!   r"   p_statementj  s    
zCParser.p_statementc             C   sT   t |d tjrDt|dkrDtj|d |d g| |dd|d< n|d |d< dS )zx pragmacomp_or_statement     : pppragma_directive statement
                                        | statement
        r   r   rZ   )block_itemsr2   rH   N)r>   r   r   r*   Compoundr   )r   rv   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rt|d |rt jd|d |d |d |d	 |d dd|d jd
	g}q| j|t	dddgdd}n| j||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   rZ   Nr=   rH   rP   rS   rQ   rR   )	r1   rJ   r\   rQ   r^   r=   r]   rY   r2   )r@   r]   T)rV   rd   re   )
r   ra   rb   r`   r*   r>   rc   r2   rh   r   )r   rv   rV   tyZs_u_or_erd   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   rv   r!   r!   r"   p_declaration  s    zCParser.p_declarationc             C   s,   t |dkr|d n|d |d  |d< dS )zj declaration_list    : declaration
                                | declaration_list declaration
        rZ   r   rH   N)r*   )r   rv   r!   r!   r"   p_declaration_list  s    zCParser.p_declaration_listc             C   s   |  |d |d d|d< dS )z] declaration_specifiers_no_type  : type_qualifier declaration_specifiers_no_type_opt
        rZ   r   rP   rH   N)rW   )r   rv   r!   r!   r"   "p_declaration_specifiers_no_type_1  s    z*CParser.p_declaration_specifiers_no_type_1c             C   s   |  |d |d d|d< dS )zf declaration_specifiers_no_type  : storage_class_specifier declaration_specifiers_no_type_opt
        rZ   r   rQ   rH   N)rW   )r   rv   r!   r!   r"   "p_declaration_specifiers_no_type_2  s    z*CParser.p_declaration_specifiers_no_type_2c             C   s   |  |d |d d|d< dS )za declaration_specifiers_no_type  : function_specifier declaration_specifiers_no_type_opt
        rZ   r   rR   rH   N)rW   )r   rv   r!   r!   r"   "p_declaration_specifiers_no_type_3  s    z*CParser.p_declaration_specifiers_no_type_3c             C   s   |  |d |d d|d< dS )z_ declaration_specifiers_no_type  : atomic_specifier declaration_specifiers_no_type_opt
        rZ   r   r=   rH   N)rW   )r   rv   r!   r!   r"   "p_declaration_specifiers_no_type_4  s    z*CParser.p_declaration_specifiers_no_type_4c             C   s   |  |d |d d|d< dS )zb declaration_specifiers_no_type  : alignment_specifier declaration_specifiers_no_type_opt
        rZ   r   rS   rH   N)rW   )r   rv   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   rZ   rP   T)r(   rH   N)rW   )r   rv   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   rZ   rQ   T)r(   rH   N)rW   )r   rv   r!   r!   r"   p_declaration_specifiers_2&  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   rZ   rR   T)r(   rH   N)rW   )r   rv   r!   r!   r"   p_declaration_specifiers_3+  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   rZ   r=   T)r(   rH   N)rW   )r   rv   r!   r!   r"   p_declaration_specifiers_40  s    z"CParser.p_declaration_specifiers_4c             C   s   |  d|d d|d< dS )z2 declaration_specifiers  : type_specifier
        Nr   r=   rH   )rW   )r   rv   r!   r!   r"   p_declaration_specifiers_55  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   rZ   r=   T)r(   rH   N)rW   )r   rv   r!   r!   r"   p_declaration_specifiers_6:  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   rZ   rS   T)r(   rH   N)rW   )r   rv   r!   r!   r"   p_declaration_specifiers_7?  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   rv   r!   r!   r"   p_storage_class_specifierD  s    z!CParser.p_storage_class_specifierc             C   s   |d |d< dS )zR function_specifier  : INLINE
                                | _NORETURN
        r   rH   Nr!   )r   rv   r!   r!   r"   p_function_specifierN  s    zCParser.p_function_specifierc             C   s$   t j|d g| |dd|d< dS )a+   type_specifier_no_typeid  : VOID
                                      | _BOOL
                                      | CHAR
                                      | SHORT
                                      | INT
                                      | LONG
                                      | FLOAT
                                      | DOUBLE
                                      | _COMPLEX
                                      | SIGNED
                                      | UNSIGNED
                                      | __INT128
        r   )r2   rH   N)r   rK   r   )r   rv   r!   r!   r"   p_type_specifier_no_typeidT  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   rv   r!   r!   r"   p_type_specifierd  s    zCParser.p_type_specifierc             C   s    |d }|j d ||d< dS )z= atomic_specifier  : _ATOMIC LPAREN type_name RPAREN
        r   Z_AtomicrH   N)rJ   r(   )r   rv   typr!   r!   r"   p_atomic_specifiern  s    zCParser.p_atomic_specifierc             C   s   |d |d< dS )z type_qualifier  : CONST
                            | RESTRICT
                            | VOLATILE
                            | _ATOMIC
        r   rH   Nr!   )r   rv   r!   r!   r"   p_type_qualifieru  s    zCParser.p_type_qualifierc             C   s0   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   rv   r!   r!   r"   p_init_declarator_list}  s    zCParser.p_init_declarator_listc             C   s,   t |d t|dkr|d ndd|d< dS )zb init_declarator : declarator
                            | declarator EQUALS initializer
        r   rZ   r   N)r@   r]   rH   )r   r*   )r   rv   r!   r!   r"   p_init_declarator  s    zCParser.p_init_declaratorc             C   s0   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   rv   r!   r!   r"   p_id_init_declarator_list  s    z!CParser.p_id_init_declarator_listc             C   s,   t |d t|dkr|d ndd|d< dS )zn id_init_declarator : id_declarator
                               | id_declarator EQUALS initializer
        r   rZ   r   N)r@   r]   rH   )r   r*   )r   rv   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   rZ   r=   T)r(   rH   N)rW   )r   rv   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   rZ   rP   T)r(   rH   N)rW   )r   rv   r!   r!   r"   p_specifier_qualifier_list_2  s    z$CParser.p_specifier_qualifier_list_2c             C   s   |  d|d d|d< dS )z4 specifier_qualifier_list  : type_specifier
        Nr   r=   rH   )rW   )r   rv   r!   r!   r"   p_specifier_qualifier_list_3  s    z$CParser.p_specifier_qualifier_list_3c             C   s$   t |d g g |d gg d|d< dS )zH specifier_qualifier_list  : type_qualifier_list type_specifier
        r   rZ   )rP   rS   rQ   r=   rR   rH   N)r   )r   rv   r!   r!   r"   p_specifier_qualifier_list_4  s    z$CParser.p_specifier_qualifier_list_4c             C   s    t g |d gg g g d|d< dS )z9 specifier_qualifier_list  : alignment_specifier
        r   )rP   rS   rQ   r=   rR   rH   N)r   )r   rv   r!   r!   r"   p_specifier_qualifier_list_5  s    z$CParser.p_specifier_qualifier_list_5c             C   s   |  |d |d d|d< dS )zR specifier_qualifier_list  : specifier_qualifier_list alignment_specifier
        r   rZ   rS   rH   N)rW   )r   rv   r!   r!   r"   p_specifier_qualifier_list_6  s    z$CParser.p_specifier_qualifier_list_6c             C   s0   |  |d }||d d| |dd|d< dS )z{ struct_or_union_specifier   : struct_or_union ID
                                        | struct_or_union TYPEID
        r   rZ   N)r1   rd   r2   rH   )rn   r   )r   rv   klassr!   r!   r"   p_struct_or_union_specifier_1  s
    z%CParser.p_struct_or_union_specifier_1c             C   sX   |  |d }t|dkr6|dg | |dd|d< n|d|d | |d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   NrZ   )r1   rd   r2   rH   r   )rn   r*   r   )r   rv   r   r!   r!   r"   p_struct_or_union_specifier_2  s    z%CParser.p_struct_or_union_specifier_2c             C   s`   |  |d }t|dkr:||d g | |dd|d< n"||d |d | |d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   rZ   )r1   rd   r2   rH   r   N)rn   r*   r   )r   rv   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   rv   r!   r!   r"   p_struct_or_union  s    zCParser.p_struct_or_unionc             C   s:   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
        rZ   r   rH   N)r*   )r   rv   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	r8| j||d d}nht|d dkr|d d }t|tjrf|}n
t|}| j|t|d	gd}n| j|tddd
gd}||d< dS )zW struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI
        r   rX   rQ   rZ   N)rV   rd   r=   rH   )r@   )r@   r]   )r+   rh   r*   r>   r   NoderK   r   )r   rv   rV   rd   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   rv   r!   r!   r"   p_struct_declaration_2"  s    zCParser.p_struct_declaration_2c             C   s   |d g|d< dS )z1 struct_declaration : pppragma_directive
        r   rH   Nr!   )r   rv   r!   r!   r"   p_struct_declaration_3'  s    zCParser.p_struct_declaration_3c             C   s0   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   rv   r!   r!   r"   p_struct_declarator_list,  s    z CParser.p_struct_declarator_listc             C   s   |d dd|d< dS )z( struct_declarator : declarator
        r   N)r@   rY   rH   r!   )r   rv   r!   r!   r"   p_struct_declarator_15  s    zCParser.p_struct_declarator_1c             C   sF   t |dkr$|d |d d|d< ntdddd|d d|d< dS )z struct_declarator   : declarator COLON constant_expression
                                | COLON constant_expression
        r   r   )r@   rY   rH   NrZ   )r*   r   r?   )r   rv   r!   r!   r"   p_struct_declarator_2:  s    zCParser.p_struct_declarator_2c             C   s"   t |d d| |d|d< dS )zM enum_specifier  : ENUM ID
                            | ENUM TYPEID
        rZ   Nr   rH   )r   r`   r   )r   rv   r!   r!   r"   p_enum_specifier_1C  s    zCParser.p_enum_specifier_1c             C   s"   t d|d | |d|d< dS )zG enum_specifier  : ENUM brace_open enumerator_list brace_close
        Nr   r   rH   )r   r`   r   )r   rv   r!   r!   r"   p_enum_specifier_2I  s    zCParser.p_enum_specifier_2c             C   s&   t |d |d | |d|d< dS )z enum_specifier  : ENUM ID brace_open enumerator_list brace_close
                            | ENUM TYPEID brace_open enumerator_list brace_close
        rZ   r   r   rH   N)r   r`   r   )r   rv   r!   r!   r"   p_enum_specifier_3N  s    zCParser.p_enum_specifier_3c             C   sh   t |dkr*t|d g|d j|d< n:t |dkrD|d |d< n |d j|d  |d |d< dS )z enumerator_list : enumerator
                            | enumerator_list COMMA
                            | enumerator_list COMMA enumerator
        rZ   r   rH   r   N)r*   r   ZEnumeratorListr2   Zenumeratorsr(   )r   rv   r!   r!   r"   p_enumerator_listT  s    zCParser.p_enumerator_listc             C   s    t |d | |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   rv   r!   r!   r"   p_alignment_specifiera  s    zCParser.p_alignment_specifierc             C   sb   t |dkr(t|d d| |d}nt|d |d | |d}| |j|j ||d< dS )zR enumerator  : ID
                        | ID EQUALS constant_expression
        rZ   r   Nr   rH   )r*   r   Z
Enumeratorr   r4   r1   r2   )r   rv   Z
enumeratorr!   r!   r"   p_enumeratorg  s    zCParser.p_enumeratorc             C   s   |d |d< dS )zQ declarator  : id_declarator
                        | typeid_declarator
        r   rH   Nr!   )r   rv   r!   r!   r"   p_declaratorw  s    zCParser.p_declarator)rF   ID)ZtypeidTYPEID)Ztypeid_noparenr   c             C   s   |d |d< dS )z1 xxx_declarator  : direct_xxx_declarator
        r   rH   Nr!   )r   rv   r!   r!   r"   p_xxx_declarator_1}  s    zCParser.p_xxx_declarator_1c             C   s   |  |d |d |d< dS )z9 xxx_declarator  : pointer direct_xxx_declarator
        rZ   r   rH   N)rB   )r   rv   r!   r!   r"   p_xxx_declarator_2  s    zCParser.p_xxx_declarator_2c          	   C   s(   t j|d ddd| |dd|d< dS )z' direct_xxx_declarator   : yyy
        r   N)rI   r=   rJ   r\   r2   rH   )r   r?   r   )r   rv   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
        rZ   rH   Nr!   )r   rv   r!   r!   r"   p_direct_xxx_declarator_2  s    z!CParser.p_direct_xxx_declarator_2c             C   sf   t |dkr|d ng pg }tjdt |dkr6|d n|d ||d jd}| j|d |d|d< dS )	z} direct_xxx_declarator   : direct_xxx_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
        r   r   Nr   r   )r=   dim	dim_qualsr2   )r@   rA   rH   )r*   r   	ArrayDeclr2   rB   )r   rv   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 jd	}| j|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S r!   )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sublistrP   r!   r!   r"   rG     s    
Nr   r   )r=   r   r   r2   )r@   rA   rH   )r   r   r2   rB   )r   rv   Zlisted_qualsr   r   r!   r!   r"   p_direct_xxx_declarator_4  s    z!CParser.p_direct_xxx_declarator_4c          	   C   sZ   t jdt |d | |d|d dk	r0|d ng |d jd}| j|d |d|d< dS )zi direct_xxx_declarator   : direct_xxx_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET
        Nr   r   r   )r=   r   r   r2   )r@   rA   rH   )r   r   r   r   r2   rB   )r   rv   r   r!   r!   r"   p_direct_xxx_declarator_5  s    z!CParser.p_direct_xxx_declarator_5c             C   s|   t j|d d|d jd}|  jdkrb|jdk	rbx.|jjD ]"}t|t jrNP | 	|j
|j q<W | j|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
        r   Nr   )argsr=   r2   LBRACE)r@   rA   rH   )r   rL   r2   r<   r=   r   paramsr>   EllipsisParamr4   r1   rB   )r   rv   funcparamr!   r!   r"   p_direct_xxx_declarator_6  s    
 z!CParser.p_direct_xxx_declarator_6c             C   sn   |  |d}tj|d pg d|d}t|dkrb|d }x|jdk	rL|j}q:W ||_|d |d< n||d< dS )zm pointer : TIMES type_qualifier_list_opt
                    | TIMES type_qualifier_list_opt pointer
        r   rZ   N)rJ   r=   r2   r   rH   )r   r   ZPtrDeclr*   r=   )r   rv   r2   Znested_typeZ	tail_typer!   r!   r"   	p_pointer  s    
zCParser.p_pointerc             C   s0   t |dkr|d gn|d |d g |d< dS )zs type_qualifier_list : type_qualifier
                                | type_qualifier_list type_qualifier
        rZ   r   rH   N)r*   )r   rv   r!   r!   r"   p_type_qualifier_list  s    zCParser.p_type_qualifier_listc             C   s:   t |dkr*|d jt| |d |d |d< dS )zn parameter_type_list : parameter_list
                                | parameter_list COMMA ELLIPSIS
        rZ   r   r   rH   N)r*   r   r(   r   r   r   )r   rv   r!   r!   r"   p_parameter_type_list  s    zCParser.p_parameter_type_listc             C   sN   t |dkr*t|d g|d j|d< n |d j|d  |d |d< dS )zz parameter_list  : parameter_declaration
                            | parameter_list COMMA parameter_declaration
        rZ   r   rH   r   N)r*   r   	ParamListr2   r   r(   )r   rv   r!   r!   r"   p_parameter_list  s    zCParser.p_parameter_listc             C   sT   |d }|d s.t jdg| |ddg|d< | j|t|d dgdd |d< d	S )
z parameter_declaration   : declaration_specifiers id_declarator
                                    | declaration_specifiers typeid_noparen_declarator
        r   r=   rC   )r2   rZ   )r@   )rV   rd   rH   N)r   rK   r   rh   r   )r   rv   rV   r!   r!   r"   p_parameter_declaration_1)  s    z!CParser.p_parameter_declaration_1c          
   C   s   |d }|d s.t jdg| |ddg|d< t|d dkrt|d d jdkr| |d d jd r| j|t|d dd	gd
d }nHt jd|d d|d pt 	dddd| |dd}|d }| 
||}||d< dS )zR parameter_declaration   : declaration_specifiers abstract_declarator_opt
        r   r=   rC   )r2   r.   rH   rZ   N)r@   r]   )rV   rd   r   rP   )r1   rJ   r\   r=   r2   )r   rK   r   r*   rD   r7   rh   r   Typenamer?   rO   )r   rv   rV   r@   rM   r!   r!   r"   p_parameter_declaration_25  s$    &z!CParser.p_parameter_declaration_2c             C   sN   t |dkr*t|d g|d j|d< n |d j|d  |d |d< dS )ze identifier_list : identifier
                            | identifier_list COMMA identifier
        rZ   r   rH   r   N)r*   r   r   r2   r   r(   )r   rv   r!   r!   r"   p_identifier_listU  s    zCParser.p_identifier_listc             C   s   |d |d< dS )z- initializer : assignment_expression
        r   rH   Nr!   )r   rv   r!   r!   r"   p_initializer_1_  s    zCParser.p_initializer_1c             C   s6   |d dkr&t g | |d|d< n|d |d< dS )z initializer : brace_open initializer_list_opt brace_close
                        | brace_open initializer_list COMMA brace_close
        rZ   Nr   rH   )r   InitListr   )r   rv   r!   r!   r"   p_initializer_2d  s    zCParser.p_initializer_2c             C   s   t |dkrN|d dkr |d nt|d |d }t|g|d j|d< nD|d dkrb|d nt|d |d }|d j| |d |d< dS )z initializer_list    : designation_opt initializer
                                | initializer_list COMMA designation_opt initializer
        r   r   NrZ   rH   r   )r*   r   ZNamedInitializerr   r2   exprsr(   )r   rv   r]   r!   r!   r"   p_initializer_listm  s    ((zCParser.p_initializer_listc             C   s   |d |d< dS )z. designation : designator_list EQUALS
        r   rH   Nr!   )r   rv   r!   r!   r"   p_designationy  s    zCParser.p_designationc             C   s0   t |dkr|d gn|d |d g |d< dS )z_ designator_list : designator
                            | designator_list designator
        rZ   r   rH   N)r*   )r   rv   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
        rZ   rH   Nr!   )r   rv   r!   r!   r"   p_designator  s    zCParser.p_designatorc          
   C   s\   t jd|d d dd d|d p0t dddd| |dd}| ||d d |d< dS )	zH type_name   : specifier_qualifier_list abstract_declarator_opt
        r   r   rP   NrZ   )r1   rJ   r\   r=   r2   r=   rH   )r   r   r?   r   rO   )r   rv   rM   r!   r!   r"   p_type_name  s    zCParser.p_type_namec             C   s*   t dddd}| j||d d|d< dS )z+ abstract_declarator     : pointer
        Nr   )r@   rA   rH   )r   r?   rB   )r   rv   Z	dummytyper!   r!   r"   p_abstract_declarator_1  s    zCParser.p_abstract_declarator_1c             C   s   |  |d |d |d< dS )zF abstract_declarator     : pointer direct_abstract_declarator
        rZ   r   rH   N)rB   )r   rv   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   rv   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 rZ   rH   Nr!   )r   rv   r!   r!   r"   p_direct_abstract_declarator_1  s    z&CParser.p_direct_abstract_declarator_1c             C   s6   t jd|d g |d jd}| j|d |d|d< dS )zn direct_abstract_declarator  : direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET
        Nr   r   )r=   r   r   r2   )r@   rA   rH   )r   r   r2   rB   )r   rv   r   r!   r!   r"   p_direct_abstract_declarator_2  s    z&CParser.p_direct_abstract_declarator_2c             C   sb   t |dkr|d ng pg }tjtddddt |dkrB|d n|d || |dd|d< dS )zk direct_abstract_declarator  : LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
        r   rZ   Nr   r   )r=   r   r   r2   rH   )r*   r   r   r?   r   )r   rv   rJ   r!   r!   r"   p_direct_abstract_declarator_3  s    z&CParser.p_direct_abstract_declarator_3c          	   C   sF   t jdt |d | |dg |d jd}| j|d |d|d< dS )zZ direct_abstract_declarator  : direct_abstract_declarator LBRACKET TIMES RBRACKET
        Nr   r   )r=   r   r   r2   )r@   rA   rH   )r   r   r   r   r2   rB   )r   rv   r   r!   r!   r"   p_direct_abstract_declarator_4  s    z&CParser.p_direct_abstract_declarator_4c          	   C   sB   t jt ddddt |d | |dg | |dd|d< dS )z? direct_abstract_declarator  : LBRACKET TIMES RBRACKET
        Nr   r   )r=   r   r   r2   rH   )r   r   r?   r   r   )r   rv   r!   r!   r"   p_direct_abstract_declarator_5  s
    z&CParser.p_direct_abstract_declarator_5c             C   s4   t j|d d|d jd}| j|d |d|d< dS )zh direct_abstract_declarator  : direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN
        r   Nr   )r   r=   r2   )r@   rA   rH   )r   rL   r2   rB   )r   rv   r   r!   r!   r"   p_direct_abstract_declarator_6  s
    z&CParser.p_direct_abstract_declarator_6c             C   s0   t j|d t dddd| |dd|d< dS )zM direct_abstract_declarator  : LPAREN parameter_type_list_opt RPAREN
        rZ   Nr   )r   r=   r2   rH   )r   rL   r?   r   )r   rv   r!   r!   r"   p_direct_abstract_declarator_7  s    z&CParser.p_direct_abstract_declarator_7c             C   s(   t |d tr|d n|d g|d< dS )zG block_item  : declaration
                        | statement
        r   rH   N)r>   r   )r   rv   r!   r!   r"   p_block_item  s    zCParser.p_block_itemc             C   s:   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
        rZ   Nr   rH   )r*   )r   rv   r!   r!   r"   p_block_item_list  s    zCParser.p_block_item_listc             C   s"   t j|d | |dd|d< dS )zA compound_statement : brace_open block_item_list_opt brace_close rZ   r   )r   r2   rH   N)r   r   r   )r   rv   r!   r!   r"   p_compound_statement_1  s    zCParser.p_compound_statement_1c             C   s&   t |d |d | |d|d< dS )z6 labeled_statement : ID COLON pragmacomp_or_statement r   r   rH   N)r   Labelr   )r   rv   r!   r!   r"   p_labeled_statement_1  s    zCParser.p_labeled_statement_1c             C   s(   t |d |d g| |d|d< dS )zL labeled_statement : CASE constant_expression COLON pragmacomp_or_statement rZ   r   r   rH   N)r   ZCaser   )r   rv   r!   r!   r"   p_labeled_statement_2  s    zCParser.p_labeled_statement_2c             C   s"   t |d g| |d|d< dS )z; labeled_statement : DEFAULT COLON pragmacomp_or_statement r   r   rH   N)r   ZDefaultr   )r   rv   r!   r!   r"   p_labeled_statement_3  s    zCParser.p_labeled_statement_3c          	   C   s(   t |d |d d| |d|d< dS )zK selection_statement : IF LPAREN expression RPAREN pragmacomp_or_statement r   r   Nr   rH   )r   Ifr   )r   rv   r!   r!   r"   p_selection_statement_1  s    zCParser.p_selection_statement_1c          	   C   s,   t |d |d |d | |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   rv   r!   r!   r"   p_selection_statement_2  s    zCParser.p_selection_statement_2c          	   C   s*   t t|d |d | |d|d< dS )zO selection_statement : SWITCH LPAREN expression RPAREN pragmacomp_or_statement r   r   r   rH   N)r	   r   ZSwitchr   )r   rv   r!   r!   r"   p_selection_statement_3  s    zCParser.p_selection_statement_3c             C   s&   t |d |d | |d|d< dS )zN iteration_statement : WHILE LPAREN expression RPAREN pragmacomp_or_statement r   r   r   rH   N)r   Whiler   )r   rv   r!   r!   r"   p_iteration_statement_1   s    zCParser.p_iteration_statement_1c             C   s&   t |d |d | |d|d< dS )zV iteration_statement : DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMI r   rZ   r   rH   N)r   ZDoWhiler   )r   rv   r!   r!   r"   p_iteration_statement_2$  s    zCParser.p_iteration_statement_2c          
   C   s2   t |d |d |d |d | |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   rv   r!   r!   r"   p_iteration_statement_3(  s    zCParser.p_iteration_statement_3c          
   C   sB   t t |d | |d|d |d |d | |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   rv   r!   r!   r"   p_iteration_statement_4,  s    zCParser.p_iteration_statement_4c             C   s    t |d | |d|d< dS )z  jump_statement  : GOTO ID SEMI rZ   r   rH   N)r   ZGotor   )r   rv   r!   r!   r"   p_jump_statement_11  s    zCParser.p_jump_statement_1c             C   s   t | |d|d< dS )z jump_statement  : BREAK SEMI r   rH   N)r   Breakr   )r   rv   r!   r!   r"   p_jump_statement_25  s    zCParser.p_jump_statement_2c             C   s   t | |d|d< dS )z! jump_statement  : CONTINUE SEMI r   rH   N)r   Continuer   )r   rv   r!   r!   r"   p_jump_statement_39  s    zCParser.p_jump_statement_3c             C   s0   t t|dkr|d nd| |d|d< dS )z\ jump_statement  : RETURN expression SEMI
                            | RETURN SEMI
        r   rZ   Nr   rH   )r   Returnr*   r   )r   rv   r!   r!   r"   p_jump_statement_4=  s    zCParser.p_jump_statement_4c             C   s4   |d dkr$t | |d|d< n|d |d< dS )z, expression_statement : expression_opt SEMI r   NrZ   rH   )r   ZEmptyStatementr   )r   rv   r!   r!   r"   p_expression_statementC  s    zCParser.p_expression_statementc             C   sj   t |dkr|d |d< nLt|d tjsFt|d g|d j|d< |d j|d  |d |d< dS )zn expression  : assignment_expression
                        | expression COMMA assignment_expression
        rZ   r   rH   r   N)r*   r>   r   ExprListr2   r   r(   )r   rv   r!   r!   r"   p_expressionJ  s    zCParser.p_expressionc             C   s   |d |d< dS )z: assignment_expression : LPAREN compound_statement RPAREN rZ   rH   Nr!   )r   rv   r!   r!   r"   #p_parenthesized_compound_expressionW  s    z+CParser.p_parenthesized_compound_expressionc             C   s$   t j|d g| |dd|d< dS )z typedef_name : TYPEID r   )r2   rH   N)r   rK   r   )r   rv   r!   r!   r"   p_typedef_name[  s    zCParser.p_typedef_namec             C   sD   t |dkr|d |d< n&t|d |d |d |d j|d< dS )z assignment_expression   : conditional_expression
                                    | unary_expression assignment_operator assignment_expression
        rZ   r   rH   r   N)r*   r   Z
Assignmentr2   )r   rv   r!   r!   r"   p_assignment_expression_  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   rv   r!   r!   r"   p_assignment_operatorm  s    zCParser.p_assignment_operatorc             C   s   |d |d< dS )z. constant_expression : conditional_expression r   rH   Nr!   )r   rv   r!   r!   r"   p_constant_expression|  s    zCParser.p_constant_expressionc             C   sD   t |dkr|d |d< n&t|d |d |d |d j|d< dS )z conditional_expression  : binary_expression
                                    | binary_expression CONDOP expression COLON conditional_expression
        rZ   r   rH   r   r   N)r*   r   Z	TernaryOpr2   )r   rv   r!   r!   r"   p_conditional_expression  s    z CParser.p_conditional_expressionc             C   sD   t |dkr|d |d< n&t|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
        rZ   r   rH   r   N)r*   r   ZBinaryOpr2   )r   rv   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   rv   r!   r!   r"   p_cast_expression_1  s    zCParser.p_cast_expression_1c             C   s&   t |d |d | |d|d< dS )z; cast_expression : LPAREN type_name RPAREN cast_expression rZ   r   r   rH   N)r   ZCastr   )r   rv   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   rv   r!   r!   r"   p_unary_expression_1  s    zCParser.p_unary_expression_1c             C   s$   t |d |d |d j|d< dS )z unary_expression    : PLUSPLUS unary_expression
                                | MINUSMINUS unary_expression
                                | unary_operator cast_expression
        r   rZ   rH   N)r   UnaryOpr2   )r   rv   r!   r!   r"   p_unary_expression_2  s    zCParser.p_unary_expression_2c             C   s:   t |d t|dkr|d n|d | |d|d< dS )z unary_expression    : SIZEOF unary_expression
                                | SIZEOF LPAREN type_name RPAREN
                                | _ALIGNOF LPAREN type_name RPAREN
        r   r   rZ   rH   N)r   r  r*   r   )r   rv   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   rv   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   rv   r!   r!   r"   p_postfix_expression_1  s    zCParser.p_postfix_expression_1c             C   s$   t |d |d |d j|d< dS )zG postfix_expression  : postfix_expression LBRACKET expression RBRACKET r   r   rH   N)r   ArrayRefr2   )r   rv   r!   r!   r"   p_postfix_expression_2  s    zCParser.p_postfix_expression_2c             C   s4   t |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*   r2   )r   rv   r!   r!   r"   p_postfix_expression_3  s    zCParser.p_postfix_expression_3c             C   s>   t |d | |d}t |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   rZ   rH   N)r   r   r   	StructRefr2   )r   rv   fieldr!   r!   r"   p_postfix_expression_4  s    zCParser.p_postfix_expression_4c             C   s(   t d|d  |d |d j|d< dS )z{ postfix_expression  : postfix_expression PLUSPLUS
                                | postfix_expression MINUSMINUS
        rv   rZ   r   rH   N)r   r  r2   )r   rv   r!   r!   r"   p_postfix_expression_5  s    zCParser.p_postfix_expression_5c             C   s   t |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
        rZ   r   rH   N)r   ZCompoundLiteral)r   rv   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   rv   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   rv   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   rv   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 rZ   rH   Nr!   )r   rv   r!   r!   r"   p_primary_expression_4  s    zCParser.p_primary_expression_4c             C   sB   |  |d}tt|d |t|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   rv   r2   r!   r!   r"   p_primary_expression_5  s    zCParser.p_primary_expression_5c             C   s   t |dkr|d |d< nrt |dkrNt|d |d |d |d j|d< n>t |dkr|t|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
        rZ   r   rH   r   r   r   z$Unexpected parsing state. len(p): %uN)r*   r   r(  r2   r$  NotImplementedError)r   rv   r!   r!   r"   p_offsetof_member_designator  s    ("z$CParser.p_offsetof_member_designatorc             C   sN   t |dkr*t|d g|d j|d< n |d j|d  |d |d< dS )z argument_expression_list    : assignment_expression
                                        | argument_expression_list COMMA assignment_expression
        rZ   r   rH   r   N)r*   r   r  r2   r   r(   )r   rv   r!   r!   r"   p_argument_expression_list  s    z"CParser.p_argument_expression_listc             C   s    t |d | |d|d< dS )z identifier  : ID r   rH   N)r   r   r   )r   rv   r!   r!   r"   p_identifier  s    zCParser.p_identifierc             C   s   d}d}x:|d dd D ]&}|dkr0|d7 }q|dkr|d7 }qW d}|dkrZt dn|d	krjt d
d| d|  }t|d |d | |d|d< dS )z constant    : INT_CONST_DEC
                        | INT_CONST_OCT
                        | INT_CONST_HEX
                        | INT_CONST_BIN
                        | INT_CONST_CHAR
        rH   r   N)lL)uUr   z.Constant cannot have more than one u/U suffix.rZ   z.Constant cannot have more than two l/L suffix.z	unsigned zlong rC   )
ValueErrorr   Constantr   )r   rv   ZuCountZlCountxrf   prefixr!   r!   r"   p_constant_1#  s    

zCParser.p_constant_1c             C   sh   d|d   krd}n0|d d dkr,d}n|d d dkrBd}nd}t||d | |d|d	< d
S )zM constant    : FLOAT_CONST
                        | HEX_FLOAT_CONST
        r=  r   floatr.   )fF)r7  r8  zlong doubledoublerH   N)lowerr   r<  r   )r   rv   rf   r!   r!   r"   p_constant_2:  s    zCParser.p_constant_2c             C   s"   t d|d | |d|d< dS )z constant    : CHAR_CONST
                        | WCHAR_CONST
                        | U8CHAR_CONST
                        | U16CHAR_CONST
                        | U32CHAR_CONST
        charr   rH   N)r   r<  r   )r   rv   r!   r!   r"   p_constant_3K  s    zCParser.p_constant_3c             C   sd   t |dkr,td|d | |d|d< n4|d jdd |d dd  |d _|d |d< dS )z~ unified_string_literal  : STRING_LITERAL
                                    | unified_string_literal STRING_LITERAL
        rZ   stringr   rH   Nr.   )r*   r   r<  r   value)r   rv   r!   r!   r"   p_unified_string_literalZ  s
    (z CParser.p_unified_string_literalc             C   sh   t |dkr,td|d | |d|d< n8|d 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
        rZ   rH  r   rH   Nr.   )r*   r   r<  r   rI  rstrip)r   rv   r!   r!   r"   p_unified_wstring_literale  s
    
,z!CParser.p_unified_wstring_literalc             C   s"   |d |d< | d|d dS )z  brace_open  :   LBRACE
        r   rH   N)
set_linenolineno)r   rv   r!   r!   r"   p_brace_openv  s    zCParser.p_brace_openc             C   s"   |d |d< | d|d dS )z  brace_close :   RBRACE
        r   rH   N)rM  rN  )r   rv   r!   r!   r"   p_brace_close|  s    zCParser.p_brace_closec             C   s   d|d< dS )zempty : NrH   r!   )r   rv   r!   r!   r"   p_empty  s    zCParser.p_emptyc             C   s@   |r,|  d|j | j|j| j|d n|  d| jj d S )Nz
before: %s)rN  r;   zAt end of input)r0   rI  r8   rN  r   Zfind_tok_columnr%   )r   rv   r!   r!   r"   p_error  s    zCParser.p_errorN)r   F)F)F)__name__
__module____qualname__r   r#   r&   r)   r-   r3   r4   r7   r   r   r   r   r<   rB   rO   rW   rh   rk   rn   
precedencerw   rx   rz   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  r3  r4  r5  r?  rE  rG  rJ  rL  rO  rP  rQ  rR  r!   r!   r!   r"   r      s`  g	

	)2,Y	
	7=	

		&			 
	

	
	

	
r   N)Zplyr   r   r   Zc_lexerr   Z	plyparserr   r   r   r   Zast_transformsr	   r
   r   r!   r!   r!   r"   <module>	   s   