3
ãdeÐ ã               @   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�dqd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�drd"d#„Z�dsd$d%„Zd&d'„ Zd(d)„ Z�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^„ Z'd_d`„ Z(dadb„ Z)dcdd„ Z*dedf„ Z+dgdh„ Z,didj„ Z-dkdl„ Z.dmdn„ Z/dodp„ Z0dqdr„ Z1dsdt„ Z2dudv„ Z3dwdx„ Z4dydz„ Z5d{d|„ Z6d}d~„ Z7dd€„ Z8d�d‚„ Z9dƒd„„ Z:d…d†„ Z;d‡dˆ„ Z<d‰dŠ„ Z=d‹dŒ„ Z>d�dŽ„ Z?d�d�„ Z@d‘d’„ ZAd“d”„ ZBd•d–„ ZCd—d˜„ ZDd™dš„ ZEd›dœ„ ZFd�dž„ ZGdŸd „ ZHd¡d¢„ ZId£d¤„ ZJd¥d¦„ ZKd§d¨„ ZLd©dª„ ZMd«d¬„ ZNd­d®„ ZOd¯d°„ ZPd±d²„ ZQd³d´„ ZRdµd¶„ ZSd·d¸„ ZTd¹dº„ ZUd»d¼„ ZVeW�d�d€�d�ƒdÂdÃ„ ƒZXeW�d‚�dƒ�d„ƒdÄdÅ„ ƒZYeW�d…�d†�d‡ƒdÆdÇ„ ƒZZeW�dˆ�d‰ƒdÈdÉ„ ƒZ[eW�dŠ�d‹�dŒƒdÊdË„ ƒZ\eW�d��dŽ�d�ƒdÌdÍ„ ƒZ]eW�d��d‘�d’ƒdÎdÏ„ ƒZ^eW�d“�d”�d•ƒdÐdÑ„ ƒZ_dÒdÓ„ Z`dÔdÕ„ ZadÖd×„ ZbdØdÙ„ ZcdÚdÛ„ ZddÜdÝ„ ZedÞdß„ Zfdàdá„ Zgdâdã„ Zhdädå„ Zidædç„ Zjdèdé„ Zkdêdë„ Zldìdí„ Zmdîdï„ Zndðdñ„ Zodòdó„ Zpdôdõ„ Zqdöd÷„ Zrdødù„ Zsdúdû„ Ztdüdý„ Zudþdÿ„ 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®�dpS (–  Ú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 ]}	| j|	ƒ 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_optZrule© r    úI/var/www/agendate/envp3/lib/python3.6/site-packages/pycparser/c_parser.pyÚ__init__   sF    :




zCParser.__init__c             C   s6   || j _| 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 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   s4   | 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 scopeNéÿÿÿÿr-   )r   ÚgetÚ_parse_error)r   ÚnameÚcoordr    r    r!   Ú_add_typedef_name¡   s
    
zCParser._add_typedef_namec             C   s4   | 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   r.   r/   )r   r0   r1   r    r    r!   Ú_add_identifierª   s
    
zCParser._add_identifierc             C   s.   x(t | jƒD ]}|j|ƒ}|dk	r|S qW dS )z8 Is *name* a typedef-name in the current scope?
        NF)Úreversedr   r.   )r   r0   ZscopeZin_scoper    r    r!   Ú_is_type_in_scope´   s
    
 zCParser._is_type_in_scopec             C   s   | j || j||ƒƒ d S )N)r/   Ú_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.
        )r5   )r   r0   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| j	d|j
ƒ q:||_|S q:W |sªt |jtjƒs”| j	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)r1   c             S   s   g | ]}|j D ]}|‘qqS r    )Únames)Ú.0Úidr0   r    r    r!   ú
<listcomp>S  s    z/CParser._fix_decl_name_type.<locals>.<listcomp>é    )r<   r   r=   r;   Údeclnamer0   ÚqualsÚIdentifierTyper)   r/   r1   Ú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*|| 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Ú	alignmentrF   )r   r'   Úinsert)r   ZdeclspecZnewspecÚkindr'   Úspecr    r    r!   Ú_add_declaration_specifierW  s
    z"CParser._add_declaration_specifierc             C   sp  d|d k}g }|d j dƒdk	r&�n>|d d dkrît|d ƒdk svt|d d jƒd	ksv| j|d d jd ƒ rªd
}x"|d D ]}t|dƒr„|j}P q„W | j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ƒ�sd|d d }xt	|tjƒ�s8|j}�q W |jdk�rd|d d jd |_|d d= �x|D ]ü}	|	d dk	�s‚t‚|�r°tjd|d |d |	d |	d jd�}
nBtjd|d |d |d |d |	d |	j dƒ|	j dƒ|	d jd�	}
t	|
jtj
tjtjtjfƒ�r|
}n| j|
|d ƒ}|�rT|�rD| j|j|jƒ n| j|j|jƒ t|ƒ}|j|ƒ �qlW |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.
        ÚtypedefrO   rF   ÚbitsizeNr>   r;   é   r   ú?r1   zInvalid declarationrQ   )rG   r;   rH   Úalignr1   rN   )r0   rH   rO   r;   r1   rP   Úinit)	r0   rH   rZ   rO   Úfuncspecr;   r[   rW   r1   r-   r-   r-   r-   r-   r-   r-   )r.   r)   rB   r5   Úhasattrr1   r/   r   r=   r<   ÚEnumÚStructÚUnionrI   r;   rG   r*   ZTypedefÚDeclrM   r2   r0   r3   r
   r'   )r   rT   ÚdeclsÚtypedef_namespaceZ
is_typedefZdeclarationsr1   ÚtZdecls_0_tailr>   ÚdeclarationZ
fixed_declr    r    r!   Ú_build_declarationsp  sv    &

zCParser._build_declarationsc             C   sL   d|d kr| j d|jƒ | j|t|dd�gdd�d }tj||||jd	�S )
z' Builds a function definition.
        rV   rO   zInvalid typedefN)r>   r[   T)rT   rb   rc   rF   )r>   Úparam_declsÚbodyr1   )r/   r1   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S t jS dS )z` Given a token (either STRUCT or UNION), selects the
            appropriate AST class.
        Ú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   s2   |d dkrt jg ƒ|d< nt j|d ƒ|d< dS )zh translation_unit_or_empty   : translation_unit
                                        | empty
        r   NrF   )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   rF   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   rF   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   rF   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   rF   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   rF   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
        rF   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   rF   Nr    )r   r€   r    r    r!   Úp_external_declaration_5*  s    z CParser.p_external_declaration_5c             C   sV   t |ƒdkr.tj|d d| j|dƒƒg|d< n$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   rF   )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)r/   rŒ   )r   r€   r    r    r!   Úp_pp_directive8  s    zCParser.p_pp_directivec             C   sF   t |ƒdkr*tj|d | j|dƒƒ|d< ntjd| j|dƒƒ|d< dS )zg pppragma_directive      : PPPRAGMA
                                    | PPPRAGMA PPPRAGMASTR
        r‹   rX   rF   r   r   N)r)   r   ÚPragmarŒ   )r   r€   r    r    r!   Úp_pppragma_directive>  s    zCParser.p_pppragma_directivec          	   C   sN   t g g g tjdg| j|dƒd�gg d�}| j||d |d |d d�|d< d	S )
zU function_definition : id_declarator declaration_list_opt compound_statement
        rA   r   )r1   )rN   rQ   rO   r;   rP   rX   r‹   )rT   r>   rg   rh   rF   N)r   r   rI   rŒ   ri   )r   r€   rT   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   rX   r‹   é   )rT   r>   rg   rh   rF   N)ri   )r   r€   rT   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   rF   Nr    )r   r€   r    r    r!   Úp_statementj  s    
zCParser.p_statementc             C   sT   t |d tjƒrDt|ƒdkrDtj|d |d g| j|dƒd�|d< n|d |d< dS )zx pragmacomp_or_statement     : pppragma_directive statement
                                        | statement
        r   r‹   rX   )Úblock_itemsr1   rF   N)r<   r   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 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   rX   Nr;   rF   rN   rQ   rO   rP   )	r0   rH   rZ   rO   r\   r;   r[   rW   r1   )r>   r[   T)rT   rb   rc   )
r   r_   r`   r^   r)   r<   ra   r1   rf   r   )r   r€   rT   Ú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   rF   Nr    )r   r€   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
        rX   r   rF   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   rN   rF   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   rO   rF   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   rP   rF   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;   rF   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   rQ   rF   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   rN   T)r'   rF   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   rO   T)r'   rF   N)rU   )r   r€   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   rX   rP   T)r'   rF   N)rU   )r   r€   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   rX   r;   T)r'   rF   N)rU   )r   r€   r    r    r!   Úp_declaration_specifiers_40  s    z"CParser.p_declaration_specifiers_4c             C   s   | j d|d dƒ|d< dS )z2 declaration_specifiers  : type_specifier
        Nr   r;   rF   )rU   )r   r€   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   rX   r;   T)r'   rF   N)rU   )r   r€   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   rX   rQ   T)r'   rF   N)rU   )r   r€   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   rF   Nr    )r   r€   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   rF   Nr    )r   r€   r    r    r!   Úp_function_specifierN  s    zCParser.p_function_specifierc             C   s$   t j|d g| j|dƒd�|d< dS )a+   type_specifier_no_typeid  : VOID
                                      | _BOOL
                                      | CHAR
                                      | SHORT
                                      | INT
                                      | LONG
                                      | FLOAT
                                      | DOUBLE
                                      | _COMPLEX
                                      | SIGNED
                                      | UNSIGNED
                                      | __INT128
        r   )r1   rF   N)r   rI   rŒ   )r   r€   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   rF   Nr    )r   r€   r    r    r!   Úp_type_specifierd  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_AtomicrF   N)rH   r'   )r   r€   Ú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   rF   Nr    )r   r€   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‹   rF   N)r)   )r   r€   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   rX   r‹   N)r>   r[   rF   )r   r)   )r   r€   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‹   rF   N)r)   )r   r€   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   rX   r‹   N)r>   r[   rF   )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;   T)r'   rF   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   rN   T)r'   rF   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;   rF   )rU   )r   r€   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   rX   )rN   rQ   rO   r;   rP   rF   N)r   )r   r€   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   )rN   rQ   rO   r;   rP   rF   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   rQ   rF   N)rU   )r   r€   r    r    r!   Úp_specifier_qualifier_list_6³  s    z$CParser.p_specifier_qualifier_list_6c             C   s0   | j |d ƒ}||d d| j|dƒd�|d< dS )z{ struct_or_union_specifier   : struct_or_union ID
                                        | struct_or_union TYPEID
        r   rX   N)r0   rb   r1   rF   )rl   rŒ   )r   r€   Úklassr    r    r!   Úp_struct_or_union_specifier_1»  s
    z%CParser.p_struct_or_union_specifier_1c             C   sX   | j |d ƒ}t|ƒdkr6|dg | j|dƒd�|d< n|d|d | j|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’   NrX   )r0   rb   r1   rF   r‹   )rl   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r:||d g | j|dƒd�|d< n"||d |d | j|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Š   rX   )r0   rb   r1   rF   r’   N)rl   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   rF   Nr    )r   r€   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
        rX   r   rF   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	r8| j||d d�}nht|d ƒdkrˆ|d d }t|tjƒrf|}n
tj|ƒ}| 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   rV   rO   rX   N)rT   rb   r;   rF   )r>   )r>   r[   )r*   rf   r)   r<   r   ÚNoderI   r   )r   r€   rT   rb   Ú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
        NrF   r    )r   r€   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   rF   Nr    )r   r€   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‹   rF   N)r)   )r   r€   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>   rW   rF   r    )r   r€   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jddddƒ|d dœ|d< dS )z€ struct_declarator   : declarator COLON constant_expression
                                | COLON constant_expression
        r‹   r   )r>   rW   rF   NrX   )r)   r   r=   )r   r€   r    r    r!   Úp_struct_declarator_2:  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   rF   )r   r^   rŒ   )r   r€   r    r    r!   Úp_enum_specifier_1C  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   rF   )r   r^   rŒ   )r   r€   r    r    r!   Úp_enum_specifier_2I  s    zCParser.p_enum_specifier_2c             C   s&   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   rF   N)r   r^   rŒ   )r   r€   r    r    r!   Úp_enum_specifier_3N  s    zCParser.p_enum_specifier_3c             C   sh   t |ƒdkr*tj|d g|d jƒ|d< n:t |ƒdkrD|d |d< n |d jj|d ƒ |d |d< dS )z™ enumerator_list : enumerator
                            | enumerator_list COMMA
                            | enumerator_list COMMA enumerator
        rX   r   rF   r‹   N)r)   r   ZEnumeratorListr1   Zenumeratorsr'   )r   r€   r    r    r!   Úp_enumerator_listT  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   rF   N)r   ZAlignasrŒ   )r   r€   r    r    r!   Úp_alignment_specifiera  s    zCParser.p_alignment_specifierc             C   sb   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‹   rF   )r)   r   Z
EnumeratorrŒ   r3   r0   r1   )r   r€   Z
enumeratorr    r    r!   Úp_enumeratorg  s    zCParser.p_enumeratorc             C   s   |d |d< dS )zQ declarator  : id_declarator
                        | typeid_declarator
        r   rF   Nr    )r   r€   r    r    r!   Úp_declaratorw  s    zCParser.p_declaratorrD   ÚIDÚtypeidÚTYPEIDÚtypeid_noparenc             C   s   |d |d< dS )z1 xxx_declarator  : direct_xxx_declarator
        r   rF   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   rF   N)r@   )r   r€   r    r    r!   Úp_xxx_declarator_2ƒ  s    zCParser.p_xxx_declarator_2c             C   s(   t j|d ddd| j|dƒd�|d< dS )z' direct_xxx_declarator   : yyy
        r   N)rG   r;   rH   rZ   r1   rF   )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   rF   Nr    )r   r€   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_qualsr1   )r>   r?   rF   )r)   r   Ú	ArrayDeclr1   r@   )r   r€   rH   Ú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)rC   Úitemr    r    r!   rE   ±  s   z5CParser.p_direct_xxx_declarator_4.<locals>.<listcomp>r‹   r’   c             S   s"   g | ]}|D ]}|d k	r|‘qqS )Nr    )rC   ZsublistrN   r    r    r!   rE   ³  s    
NrŠ   r   )r;   rÖ   r×   r1   )r>   r?   rF   )r   rØ   r1   r@   )r   r€   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 j|d | j|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×   r1   )r>   r?   rF   )r   rØ   rÎ   rŒ   r1   r@   )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 jd�}| jƒ jdkrb|jdk	rbx.|jjD ]"}t|t jƒrNP | j	|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;   r1   ÚLBRACE)r>   r?   rF   )r   rJ   r1   r:   r;   rß   Úparamsr<   ÚEllipsisParamr3   r0   r@   )r   r€   ÚfuncÚparamr    r    r!   Úp_direct_xxx_declarator_6Ë  s    
 z!CParser.p_direct_xxx_declarator_6c             C   sn   | j |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   rX   N)rH   r;   r1   r‹   rF   )rŒ   r   ZPtrDeclr)   r;   )r   r€   r1   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
        rX   r   rF   N)r)   )r   r€   r    r    r!   Úp_type_qualifier_list  s    zCParser.p_type_qualifier_listc             C   s:   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‹   rF   N)r)   rá   r'   r   râ   rŒ   )r   r€   r    r    r!   Úp_parameter_type_list  s    zCParser.p_parameter_type_listc             C   sN   t |ƒdkr*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   rF   r‹   N)r)   r   Ú	ParamListr1   rá   r'   )r   r€   r    r    r!   Úp_parameter_list  s    zCParser.p_parameter_listc             C   sT   |d }|d s.t jdg| j|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;   rA   )r1   rX   )r>   )rT   rb   rF   N)r   rI   rŒ   rf   r   )r   r€   rT   r    r    r!   Úp_parameter_declaration_1)  s    z!CParser.p_parameter_declaration_1c          	   C   sâ   |d }|d s.t jdg| j|dƒd�g|d< t|d ƒdkrŽt|d d jƒdkrŽ| j|d d jd ƒrŽ| j|t|d dd�gd	�d }nHt jd
|d d|d p²t j	ddddƒ| j|dƒd�}|d }| j
||ƒ}||d< dS )zR parameter_declaration   : declaration_specifiers abstract_declarator_opt
        r   r;   rA   )r1   rF   rX   N)r>   r[   )rT   rb   r   rN   )r0   rH   rZ   r;   r1   r-   r-   )r   rI   rŒ   r)   rB   r5   rf   r   ÚTypenamer=   rM   )r   r€   rT   r>   rK   r    r    r!   Úp_parameter_declaration_25  s$    &z!CParser.p_parameter_declaration_2c             C   sN   t |ƒdkr*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   rF   r‹   N)r)   r   ré   r1   rá   r'   )r   r€   r    r    r!   Úp_identifier_listU  s    zCParser.p_identifier_listc             C   s   |d |d< dS )z- initializer : assignment_expression
        r   rF   Nr    )r   r€   r    r    r!   Úp_initializer_1_  s    zCParser.p_initializer_1c             C   s6   |d dkr&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   rF   )r   ÚInitListrŒ   )r   r€   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j|d |d ƒ}tj|g|d jƒ|d< nD|d dkrb|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   rF   r’   )r)   r   ZNamedInitializerrð   r1   Úexprsr'   )r   r€   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   rF   Nr    )r   r€   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
        rX   r   rF   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   rF   Nr    )r   r€   r    r    r!   Úp_designator‡  s    zCParser.p_designatorc          	   C   s\   t jd|d d dd… d|d p0t jddddƒ| j|dƒd�}| j||d d ƒ|d< dS )	zH type_name   : specifier_qualifier_list abstract_declarator_opt
        r   r   rN   NrX   )r0   rH   rZ   r;   r1   r;   rF   )r   rì   r=   rŒ   rM   )r   r€   rK   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S )z+ abstract_declarator     : pointer
        Nr   )r>   r?   rF   )r   r=   r@   )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   rF   N)r@   )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   rF   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   rF   Nr    )r   r€   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×   r1   )r>   r?   rF   )r   rØ   r1   r@   )r   r€   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jddddƒt |ƒdkrB|d n|d || j|dƒd�|d< dS )zk direct_abstract_declarator  : LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
        r’   rX   Nr‹   r   )r;   rÖ   r×   r1   rF   )r)   r   rØ   r=   rŒ   )r   r€   rH   r    r    r!   Úp_direct_abstract_declarator_3¿  s    z&CParser.p_direct_abstract_declarator_3c             C   sF   t jdt j|d | j|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×   r1   )r>   r?   rF   )r   rØ   rÎ   rŒ   r1   r@   )r   r€   rÙ   r    r    r!   Úp_direct_abstract_declarator_4É  s    z&CParser.p_direct_abstract_declarator_4c             C   sB   t jt jddddƒt j|d | j|dƒƒg | j|dƒd�|d< dS )z? direct_abstract_declarator  : LBRACKET TIMES RBRACKET
        Nr‹   r   )r;   rÖ   r×   r1   rF   )r   rØ   r=   rÎ   rŒ   )r   r€   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;   r1   )r>   r?   rF   )r   rJ   r1   r@   )r   r€   rã   r    r    r!   Úp_direct_abstract_declarator_6Ý  s
    z&CParser.p_direct_abstract_declarator_6c             C   s0   t j|d t jddddƒ| j|dƒd�|d< dS )zM direct_abstract_declarator  : LPAREN parameter_type_list_opt RPAREN
        rX   Nr   )rß   r;   r1   rF   )r   rJ   r=   rŒ   )r   r€   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   rF   N)r<   rÛ   )r   r€   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
        rX   Nr   rF   )r)   )r   r€   r    r    r!   Úp_block_item_listú  s    zCParser.p_block_item_listc             C   s"   t j|d | j|dƒd�|d< dS )zA compound_statement : brace_open block_item_list_opt brace_close rX   r   )r•   r1   rF   N)r   r–   rŒ   )r   r€   r    r    r!   Úp_compound_statement_1  s    zCParser.p_compound_statement_1c             C   s&   t j|d |d | j|dƒƒ|d< dS )z6 labeled_statement : ID COLON pragmacomp_or_statement r   r‹   rF   N)r   ZLabelrŒ   )r   r€   r    r    r!   Úp_labeled_statement_1  s    zCParser.p_labeled_statement_1c             C   s(   t j|d |d g| j|dƒƒ|d< dS )zL labeled_statement : CASE constant_expression COLON pragmacomp_or_statement rX   r’   r   rF   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   rF   N)r   ZDefaultrŒ   )r   r€   r    r    r!   Úp_labeled_statement_3  s    zCParser.p_labeled_statement_3c             C   s(   t j|d |d d| j|dƒƒ|d< dS )zK selection_statement : IF LPAREN expression RPAREN pragmacomp_or_statement r‹   rŠ   Nr   rF   )r   ÚIfrŒ   )r   r€   r    r    r!   Úp_selection_statement_1  s    zCParser.p_selection_statement_1c             C   s,   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   rF   N)r   r  rŒ   )r   r€   r    r    r!   Úp_selection_statement_2  s    zCParser.p_selection_statement_2c             C   s*   t tj|d |d | j|dƒƒƒ|d< dS )zO selection_statement : SWITCH LPAREN expression RPAREN pragmacomp_or_statement r‹   rŠ   r   rF   N)r	   r   ZSwitchrŒ   )r   r€   r    r    r!   Úp_selection_statement_3  s    zCParser.p_selection_statement_3c             C   s&   t j|d |d | j|dƒƒ|d< dS )zN iteration_statement : WHILE LPAREN expression RPAREN pragmacomp_or_statement r‹   rŠ   r   rF   N)r   ÚWhilerŒ   )r   r€   r    r    r!   Úp_iteration_statement_1   s    zCParser.p_iteration_statement_1c             C   s&   t j|d |d | j|dƒƒ|d< dS )zV iteration_statement : DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMI rŠ   rX   r   rF   N)r   ZDoWhilerŒ   )r   r€   r    r    r!   Úp_iteration_statement_2$  s    zCParser.p_iteration_statement_2c             C   s2   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   rF   N)r   ÚForrŒ   )r   r€   r    r    r!   Úp_iteration_statement_3(  s    zCParser.p_iteration_statement_3c             C   sB   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’   é   é   rF   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   rF   N)r   ZGotorŒ   )r   r€   r    r    r!   Úp_jump_statement_11  s    zCParser.p_jump_statement_1c             C   s   t j| j|dƒƒ|d< dS )z jump_statement  : BREAK SEMI r   rF   N)r   ÚBreakrŒ   )r   r€   r    r    r!   Úp_jump_statement_25  s    zCParser.p_jump_statement_2c             C   s   t j| j|dƒƒ|d< dS )z! jump_statement  : CONTINUE SEMI r   rF   N)r   ÚContinuerŒ   )r   r€   r    r    r!   Úp_jump_statement_39  s    zCParser.p_jump_statement_3c             C   s0   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   rF   )r   ÚReturnr)   rŒ   )r   r€   r    r    r!   Úp_jump_statement_4=  s    zCParser.p_jump_statement_4c             C   s4   |d dkr$t j| j|dƒƒ|d< n|d |d< dS )z, expression_statement : expression_opt SEMI r   NrX   rF   )r   ZEmptyStatementrŒ   )r   r€   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j|d g|d jƒ|d< |d jj|d ƒ |d |d< dS )zn expression  : assignment_expression
                        | expression COMMA assignment_expression
        rX   r   rF   r‹   N)r)   r<   r   ÚExprListr1   rò   r'   )r   r€   r    r    r!   Úp_expressionJ  s    zCParser.p_expressionc             C   s   |d |d< dS )z: assignment_expression : LPAREN compound_statement RPAREN rX   rF   Nr    )r   r€   r    r    r!   Ú#p_parenthesized_compound_expressionW  s    z+CParser.p_parenthesized_compound_expressionc             C   s$   t j|d g| j|dƒd�|d< dS )z typedef_name : TYPEID r   )r1   rF   N)r   rI   rŒ   )r   r€   r    r    r!   Úp_typedef_name[  s    zCParser.p_typedef_namec             C   sD   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   rF   r‹   N)r)   r   Z
Assignmentr1   )r   r€   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   rF   Nr    )r   r€   r    r    r!   Úp_assignment_operatorm  s    zCParser.p_assignment_operatorc             C   s   |d |d< dS )z. constant_expression : conditional_expression r   rF   Nr    )r   r€   r    r    r!   Úp_constant_expression|  s    zCParser.p_constant_expressionc             C   sD   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   rF   r‹   rŠ   N)r)   r   Z	TernaryOpr1   )r   r€   r    r    r!   Úp_conditional_expression€  s    z CParser.p_conditional_expressionc             C   sD   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   rF   r‹   N)r)   r   ZBinaryOpr1   )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   rF   Nr    )r   r€   r    r    r!   Úp_cast_expression_1£  s    zCParser.p_cast_expression_1c             C   s&   t j|d |d | j|dƒƒ|d< dS )z; cast_expression : LPAREN type_name RPAREN cast_expression rX   r’   r   rF   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   rF   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   rF   N)r   ÚUnaryOpr1   )r   r€   r    r    r!   Úp_unary_expression_2¯  s    zCParser.p_unary_expression_2c             C   s:   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   rF   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   rF   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   rF   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‹   rF   N)r   ÚArrayRefr1   )r   r€   r    r    r!   Úp_postfix_expression_2Î  s    zCParser.p_postfix_expression_2c             C   s4   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‹   NrF   )r   ÚFuncCallr)   r1   )r   r€   r    r    r!   Úp_postfix_expression_3Ò  s    zCParser.p_postfix_expression_3c             C   s>   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   rF   N)r   rÎ   rŒ   Ú	StructRefr1   )r   r€   Úfieldr    r    r!   Úp_postfix_expression_4Ø  s    zCParser.p_postfix_expression_4c             C   s(   t jd|d  |d |d jƒ|d< dS )z{ postfix_expression  : postfix_expression PLUSPLUS
                                | postfix_expression MINUSMINUS
        r€   rX   r   rF   N)r   r*  r1   )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Š   rF   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   rF   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   rF   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   rF   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   rF   Nr    )r   r€   r    r    r!   Úp_primary_expression_4û  s    zCParser.p_primary_expression_4c             C   sB   | 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Š   rF   N)rŒ   r   r1  rÎ   r  )r   r€   r1   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j|d |d |d |d jƒ|d< n>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   rF   r’   r‹   rŠ   z$Unexpected parsing state. len(p): %uN)r)   r   r3  r1   r/  ÚNotImplementedError)r   r€   r    r    r!   Úp_offsetof_member_designator  s    ("z$CParser.p_offsetof_member_designatorc             C   sN   t |ƒdkr*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   rF   r‹   N)r)   r   r  r1   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   rF   N)r   rÎ   rŒ   )r   r€   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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
        rF   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 rA   éýÿÿÿ)rA  rB  )rC  rD  )Ú
ValueErrorr   ÚConstantrŒ   )r   r€   ZuCountZlCountÚxrd   Úprefixr    r    r!   Úp_constant_1#  s    

zCParser.p_constant_1c             C   sh   d|d j ƒ krd}n0|d d dkr,d}n|d d dkrBd}nd	}tj||d | j|dƒƒ|d
< dS )zM constant    : FLOAT_CONST
                        | HEX_FLOAT_CONST
        rH  r   ÚfloatÚfÚFrA  rB  zlong doubleÚdoublerF   Nr-   )rL  rM  r-   )rA  rB  )Úlowerr   rG  rŒ   )r   r€   rd   r    r    r!   Úp_constant_2:  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   rF   N)r   rG  rŒ   )r   r€   r    r    r!   Úp_constant_3K  s    zCParser.p_constant_3c             C   sd   t |ƒdkr,tjd|d | j|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
        rX   Ústringr   rF   Nr-   )r)   r   rG  rŒ   Úvalue)r   r€   r    r    r!   Úp_unified_string_literalZ  s
    (z CParser.p_unified_string_literalc             C   sh   t |ƒdkr,tjd|d | j|dƒƒ|d< n8|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   rS  r   rF   Nr-   )r)   r   rG  rŒ   rT  Úrstrip)r   r€   r    r    r!   Úp_unified_wstring_literale  s
    
,z!CParser.p_unified_wstring_literalc             C   s"   |d |d< |j d|jdƒƒ dS )z  brace_open  :   LBRACE
        r   rF   N)Ú
set_linenoÚlineno)r   r€   r    r    r!   Úp_brace_openv  s    zCParser.p_brace_openc             C   s"   |d |d< |j d|jdƒƒ dS )z  brace_close :   RBRACE
        r   rF   N)rX  rY  )r   r€   r    r    r!   Úp_brace_close|  s    zCParser.p_brace_closec             C   s   d|d< dS )zempty : NrF   r    )r   r€   r    r    r!   Úp_empty‚  s    zCParser.p_emptyc             C   s@   |r,| j d|j | j|j| jj|ƒd�ƒ n| j d| jjƒ d S )Nz
before: %s)rY  r9   zAt end of input)r/   rT  r6   rY  r   Zfind_tok_columnr$   )r   r€   r    r    r!   Úp_error†  s    zCParser.p_errorN)r   F)F)F©rm   rn   ©rm   ro   ©rm   rp   ©rm   rq   ©rm   rr   ©rm   rs   rt   ©rm   ru   rv   rw   rx   ©rm   ry   rz   ©rm   r{   r|   ©rm   r}   r~   r   )
r^  r_  r`  ra  rb  rc  rd  re  rf  rg  )rD   rÎ   )rÏ   rÐ   )rÑ   rÐ   )rD   rÎ   )rÏ   rÐ   )rÑ   rÐ   )rD   rÎ   )rÏ   rÐ   )rÑ   rÐ   )rD   rÎ   )rÏ   rÐ   )rD   rÎ   )rÏ   rÐ   )rÑ   rÐ   )rD   rÎ   )rÏ   rÐ   )rÑ   rÐ   )rD   rÎ   )rÏ   rÐ   )rÑ   rÐ   )rD   rÎ   )rÏ   rÐ   )rÑ   rÐ   )¯Ú__name__Ú
__module__Ú__qualname__r   r"   r%   r(   r,   r2   r3   r5   r   r   r   r   r:   r@   rM   rU   rf   ri   rl   Ú
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.  r0  r2  r5  r6  r7  r8  r9  r:  r;  r<  r>  r?  r@  rJ  rP  rR  rU  rW  rZ  r[  r\  r]  r    r    r    r!   r      sr  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   