
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
U
    Ó—_ó  ã                   @   s€   d dl Z d dlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZ G dd	„ d	eƒZed
kr|d dlZd dlZd dlZdS )é    N)Úyaccé   )Úc_ast)ÚCLexer)Ú	PLYParserÚCoordÚ
ParseError)Úfix_switch_casesc                   @   s  e Zd Z�d1dd„Z�d2d	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�d3d%d&„Zd'd(„ Zd)d*„ Zd+Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Zd>d?„ Zd@dA„ Z dBdC„ Z!dDdE„ Z"dFdG„ Z#dHdI„ Z$dJdK„ Z%dLdM„ Z&dNdO„ Z'dPdQ„ Z(dRdS„ Z)dTdU„ Z*dVdW„ Z+dXdY„ Z,dZd[„ Z-d\d]„ Z.d^d_„ Z/d`da„ Z0dbdc„ Z1ddde„ Z2dfdg„ Z3dhdi„ Z4djdk„ Z5dldm„ Z6dndo„ Z7dpdq„ Z8drds„ Z9dtdu„ Z:dvdw„ Z;dxdy„ Z<dzd{„ 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­„ ZVd®d¯„ ZWd°d±„ ZXd²d³„ ZYd´dµ„ ZZd¶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í„ Zvdîdï„ Zwdðdñ„ Zxdòdó„ Zydôdõ„ Zzdö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’�d&�d'„ Z“�d(�d)„ Z”�d*�d+„ Z•�d,�d-„ Z–�d.�d/„ Z—�d0S (4  ÚCParserTúpycparser.lextabúpycparser.yacctabFÚ c           	      C   s–   t | 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}|D ]}|  |¡ qZt	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.

            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_specifiersZdesignationZ
expressionZidentifier_listZinit_declarator_listZinitializer_listZparameter_type_listZspecifier_qualifier_listZblock_item_listZtype_qualifier_listZstruct_declarator_listZtranslation_unit_or_empty)ÚmoduleÚstartÚdebugr   Z	tabmoduler   N)r   Ú_lex_error_funcÚ_lex_on_lbrace_funcÚ_lex_on_rbrace_funcÚ_lex_type_lookup_funcÚclexZbuildZtokensZ_create_opt_ruler   ÚcparserÚdictÚ_scope_stackÚ_last_yielded_token)	ÚselfÚlex_optimizer   Úyacc_optimizeÚyacctabÚ
yacc_debugZtaboutputdirZrules_with_optZrule© r"   ú../pycparser/c_parser.pyÚ__init__   sN    5üý
òú
zCParser.__init__r   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)

            debuglevel:
                Debug level to yacc
        N)ÚinputZlexerr   )r   ÚfilenameZreset_linenor   r   r   r   Úparse)r   Útextr&   Z
debuglevelr"   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Úpopr+   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
        r1   Fz;Non-typedef %r previously declared as typedef in this scopeNr2   r5   r"   r"   r#   Ú_add_identifier¦   s    ÿþzCParser._add_identifierc                 C   s.   t | jƒD ]}| |¡}|dk	r
|  S q
dS )z8 Is *name* a typedef-name in the current scope?
        NF)Úreversedr   r3   )r   r6   ZscopeZin_scoper"   r"   r#   Ú_is_type_in_scope°   s
    
 
zCParser._is_type_in_scopec                 C   s   |   ||  ||¡¡ d S r)   )r4   Ú_coord)r   ÚmsgÚlineÚcolumnr"   r"   r#   r   º   s    zCParser._lex_error_funcc                 C   s   |   ¡  d S r)   )r,   r+   r"   r"   r#   r   ½   s    zCParser._lex_on_lbrace_funcc                 C   s   |   ¡  d S r)   )r0   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.
        )r;   )r   r6   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_tokenr+   r"   r"   r#   Ú_get_yacc_lookahead_tokenÌ   s    z!CParser._get_yacc_lookahead_tokenc                 C   s\   |}|}|j r|j }qt|tjƒr,||_ |S |}t|j tjƒsF|j }q0|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Â   |}t |tjƒs|j}q|j|_|j|_|D ]:}t |tjƒs,t|ƒdkrX|  	d|j
¡ q,||_|  S q,|sžt |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.
        r   z Invalid multiple types specifiedzMissing type in declarationÚint©r7   c                 S   s   g | ]}|j D ]}|‘qqS r"   )Únames)Ú.0Úidr6   r"   r"   r#   Ú
<listcomp>U  s       z/CParser._fix_decl_name_type.<locals>.<listcomp>r   )rB   r   rC   rA   Údeclnamer6   ÚqualsÚIdentifierTyper-   r4   r7   ÚFuncDecl)r   rD   ÚtypenamerA   Ztnr"   r"   r#   Ú_fix_decl_name_type,  s:     ÿ
 ÿþ
þzCParser._fix_decl_name_typec                 C   s(   |pt g g g g d�}||  d|¡ |S )aõ   Declaration specifiers are represented by a dictionary
            with the entries:
            * qual: a list of type qualifiers
            * storage: a list of storage type qualifiers
            * type: a list of type specifiers
            * function: a list of function specifiers

            This method is given a declaration specifier, and a
            new specifier of a given kind.
            Returns the declaration specifier, with the new
            specifier incorporated.
        ©ÚqualÚstoragerA   Úfunctionr   )r   Úinsert)r   ZdeclspecZnewspecZkindÚspecr"   r"   r#   Ú_add_declaration_specifierY  s    z"CParser._add_declaration_specifierc                 C   sF  d|d k}g }|d   d¡dk	r&�n,|d d dkrät|d ƒdk stt|d d	 jƒd
kst|  |d d	 jd ¡s¦d}|d D ]}t|dƒr€|j} qšq€|  d|¡ tj|d d	 jd dd|d d	 jd�|d d< |d d	= nnt	|d d tj
tjtjfƒ�sR|d d }t	|tjƒ�s(|j}�q|jdk�rR|d d	 jd |_|d d	= |D ]ê}	|	d dk	�slt‚|�rštjd|d |d |	d |	d jd�}
n<tjd|d |d |d |	d |	  d¡|	  d¡|	d jd�}
t	|
jtj
tjtjfƒ�rö|
}n|  |
|d ¡}|�r4|�r$|  |j|j¡ n|  |j|j¡ | |¡ �qV|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.
        ÚtypedefrU   r   ÚbitsizeNrD   rA   é   r1   r   ú?r7   zInvalid declaration©rM   rA   rN   r7   rT   )r6   rN   rU   rA   r7   rV   Úinit©r6   rN   rU   ZfuncspecrA   r_   r[   r7   )r3   r-   rI   r;   Úhasattrr7   r4   r   rC   rB   ÚStructÚUnionrO   rA   rM   r.   ZTypedefÚDeclrR   r8   r6   r9   r*   )r   rX   ÚdeclsÚtypedef_namespaceZ
is_typedefZdeclarationsr7   ÚtZdecls_0_tailrD   ÚdeclarationZ
fixed_declr"   r"   r#   Ú_build_declarationsj  sz    &ÿ
üÿ

ûø
ÿzCParser._build_declarationsc                 C   sB   d|d kst ‚| j|t|dd�gdd�d }tj||||jd�S )	z' Builds a function definition.
        rZ   rU   N©rD   r_   T©rX   re   rf   r   )rD   Úparam_declsÚbodyr7   )r.   ri   r   r   ZFuncDefr7   )r   rX   rD   rl   rm   rh   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.
        ZstructN)r   rb   rc   )r   Ztokenr"   r"   r#   Ú_select_struct_union_classÓ  s    z"CParser._select_struct_union_class)
)ÚleftZLOR)rp   ZLAND)rp   ÚOR)rp   ZXOR)rp   ZAND)rp   ZEQZNE)rp   ZGTZGEZLTZLE)rp   ZRSHIFTZLSHIFT)rp   ZPLUSZMINUS)rp   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   Nr   )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   r   Nr"   rr   r"   r"   r#   Úp_translation_unit_1ý  s    zCParser.p_translation_unit_1c                 C   s.   |d dk	r|d   |d ¡ |d |d< dS )zE translation_unit    : translation_unit external_declaration
        r\   Nr   r   )Úextendrr   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   r   Nr"   rr   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   r   Nr"   rr   r"   r"   r#   Úp_external_declaration_2  s    z CParser.p_external_declaration_2c                 C   s   |d |d< dS )z0 external_declaration    : pp_directive
        r   r   Nr"   rr   r"   r"   r#   Úp_external_declaration_3  s    z CParser.p_external_declaration_3c                 C   s   d|d< dS )z( external_declaration    : SEMI
        Nr   r"   rr   r"   r"   r#   Úp_external_declaration_4  s    z CParser.p_external_declaration_4c                 C   s   |   d|  | d¡¡¡ dS )z  pp_directive  : PPHASH
        zDirectives not supported yetr   N)r4   r<   Úlinenorr   r"   r"   r#   Úp_pp_directive$  s    ÿzCParser.p_pp_directivec              
   C   sP   t g g tjdg|  | d¡¡d�gg d�}| j||d |d |d d�|d< d	S )
zR function_definition : declarator declaration_list_opt compound_statement
        rG   r   rH   rS   r\   é   ©rX   rD   rl   rm   r   N)r   r   rO   r<   r|   rn   ©r   rs   rX   r"   r"   r#   Úp_function_definition_1-  s    ÿûüzCParser.p_function_definition_1c                 C   s.   |d }| j ||d |d |d d�|d< dS )zi function_definition : declaration_specifiers declarator declaration_list_opt compound_statement
        r   r\   r~   é   r   r   N)rn   r€   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
        r   r   Nr"   rr   r"   r"   r#   Úp_statementI  s    zCParser.p_statementc              
   C   s¶   |d }|d dkr–|d }t jt jt jf}t|ƒdkrzt|d |ƒrzt j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 )zE decl_body : declaration_specifiers init_declarator_list_opt
        r   r\   NrA   r   rT   rU   rV   r`   rj   Trk   )
r   rb   rc   ÚEnumr-   rB   rd   r7   ri   r   )r   rs   rX   ZtyZs_u_or_ere   r"   r"   r#   Úp_decl_body\  s4    ø
ýýzCParser.p_decl_bodyc                 C   s   |d |d< dS )z& declaration : decl_body SEMI
        r   r   Nr"   rr   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
        r\   r   r   N©r-   rr   r"   r"   r#   Úp_declaration_list   s    zCParser.p_declaration_listc                 C   s   |   |d |d d¡|d< dS )zM declaration_specifiers  : type_qualifier declaration_specifiers_opt
        r\   r   rT   r   N©rY   rr   r"   r"   r#   Úp_declaration_specifiers_1¦  s    z"CParser.p_declaration_specifiers_1c                 C   s   |   |d |d d¡|d< dS )zM declaration_specifiers  : type_specifier declaration_specifiers_opt
        r\   r   rA   r   NrŠ   rr   r"   r"   r#   Úp_declaration_specifiers_2«  s    z"CParser.p_declaration_specifiers_2c                 C   s   |   |d |d d¡|d< dS )zV declaration_specifiers  : storage_class_specifier declaration_specifiers_opt
        r\   r   rU   r   NrŠ   rr   r"   r"   r#   Úp_declaration_specifiers_3°  s    z"CParser.p_declaration_specifiers_3c                 C   s   |   |d |d d¡|d< dS )zQ declaration_specifiers  : function_specifier declaration_specifiers_opt
        r\   r   rV   r   NrŠ   rr   r"   r"   r#   Úp_declaration_specifiers_4µ  s    z"CParser.p_declaration_specifiers_4c                 C   s   |d |d< dS )zß storage_class_specifier : AUTO
                                    | REGISTER
                                    | STATIC
                                    | EXTERN
                                    | TYPEDEF
        r   r   Nr"   rr   r"   r"   r#   Úp_storage_class_specifierº  s    z!CParser.p_storage_class_specifierc                 C   s   |d |d< dS )z& function_specifier  : INLINE
        r   r   Nr"   rr   r"   r"   r#   Úp_function_specifierÃ  s    zCParser.p_function_specifierc                 C   s(   t j|d g|  | d¡¡d�|d< dS )aŒ   type_specifier  : VOID
                            | _BOOL
                            | CHAR
                            | SHORT
                            | INT
                            | LONG
                            | FLOAT
                            | DOUBLE
                            | _COMPLEX
                            | SIGNED
                            | UNSIGNED
        r   rH   r   N©r   rO   r<   r|   rr   r"   r"   r#   Úp_type_specifier_1È  s    zCParser.p_type_specifier_1c                 C   s   |d |d< dS )z� type_specifier  : typedef_name
                            | enum_specifier
                            | struct_or_union_specifier
        r   r   Nr"   rr   r"   r"   r#   Úp_type_specifier_2×  s    zCParser.p_type_specifier_2c                 C   s   |d |d< dS )zo type_qualifier  : CONST
                            | RESTRICT
                            | VOLATILE
        r   r   Nr"   rr   r"   r"   r#   Úp_type_qualifierÞ  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~   r   Nrˆ   rr   r"   r"   r#   Úp_init_declarator_list_1å  s    z CParser.p_init_declarator_list_1c                 C   s   t d|d d�g|d< dS )z6 init_declarator_list    : EQUALS initializer
        Nr\   rj   r   ©r   rr   r"   r"   r#   Úp_init_declarator_list_2ð  s    z CParser.p_init_declarator_list_2c                 C   s   t |d dd�g|d< dS )z7 init_declarator_list    : abstract_declarator
        r   Nrj   r   r–   rr   r"   r"   r#   Úp_init_declarator_list_3ø  s    z CParser.p_init_declarator_list_3c                 C   s,   t |d t|ƒdkr|d ndd�|d< dS )zb init_declarator : declarator
                            | declarator EQUALS initializer
        r   r\   r~   Nrj   r   )r   r-   rr   r"   r"   r#   Úp_init_declarator   s    zCParser.p_init_declaratorc                 C   s   |   |d |d d¡|d< dS )zS specifier_qualifier_list    : type_qualifier specifier_qualifier_list_opt
        r\   r   rT   r   NrŠ   rr   r"   r"   r#   Úp_specifier_qualifier_list_1  s    z$CParser.p_specifier_qualifier_list_1c                 C   s   |   |d |d d¡|d< dS )zS specifier_qualifier_list    : type_specifier specifier_qualifier_list_opt
        r\   r   rA   r   NrŠ   rr   r"   r"   r#   Úp_specifier_qualifier_list_2  s    z$CParser.p_specifier_qualifier_list_2c                 C   s4   |   |d ¡}||d d|  | d¡¡d�|d< dS )z{ struct_or_union_specifier   : struct_or_union ID
                                        | struct_or_union TYPEID
        r   r\   N©r6   re   r7   r   ©ro   r<   r|   ©r   rs   Úklassr"   r"   r#   Úp_struct_or_union_specifier_1  s    ýz%CParser.p_struct_or_union_specifier_1c                 C   s4   |   |d ¡}|d|d |  | d¡¡d�|d< dS )zd struct_or_union_specifier : struct_or_union brace_open struct_declaration_list brace_close
        r   Nr~   r\   rœ   r   r�   rž   r"   r"   r#   Úp_struct_or_union_specifier_2  s    ýz%CParser.p_struct_or_union_specifier_2c                 C   s8   |   |d ¡}||d |d |  | d¡¡d�|d< dS )zÙ struct_or_union_specifier   : struct_or_union ID brace_open struct_declaration_list brace_close
                                        | struct_or_union TYPEID brace_open struct_declaration_list brace_close
        r   r\   r‚   rœ   r   Nr�   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   r   Nr"   rr   r"   r"   r#   Úp_struct_or_union0  s    zCParser.p_struct_or_unionc                 C   s,   t |ƒdkr|d n|d |d  |d< dS )z� struct_declaration_list     : struct_declaration
                                        | struct_declaration_list struct_declaration
        r\   r   r   Nrˆ   rr   r"   r"   r#   Úp_struct_declaration_list8  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   rZ   rU   r\   N©rX   re   rA   r   ©rD   rj   )r.   ri   r-   rB   r   ZNoderO   r   )r   rs   rX   re   ZnodeZ	decl_typer"   r"   r#   Úp_struct_declaration_1>  s*    þ

þ	þzCParser.p_struct_declaration_1c                 C   s(   | j |d t|d dd�gd�|d< dS )zP struct_declaration : specifier_qualifier_list abstract_declarator SEMI
        r   r\   Nrj   r¥   r   )ri   r   rr   r"   r"   r#   Úp_struct_declaration_2d  s    
þzCParser.p_struct_declaration_2c                 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~   r   Nrˆ   rr   r"   r"   r#   Úp_struct_declarator_listr  s    z CParser.p_struct_declarator_listc                 C   s   |d ddœ|d< dS )z( struct_declarator : declarator
        r   N©rD   r[   r   r"   rr   r"   r"   r#   Úp_struct_declarator_1{  s    zCParser.p_struct_declarator_1c                 C   sD   t |ƒdkr$|d |d dœ|d< nt ddd¡|d dœ|d< dS )z€ struct_declarator   : declarator COLON constant_expression
                                | COLON constant_expression
        r~   r   rª   r   Nr\   )r-   r   rC   rr   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
        r\   Nr   r   ©r   r…   r<   r|   rr   r"   r"   r#   Úp_enum_specifier_1‰  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   r   r­   rr   r"   r"   r#   Úp_enum_specifier_2�  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
        r\   r‚   r   r   Nr­   rr   r"   r"   r#   Úp_enum_specifier_3”  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
        r\   r   r   r~   N)r-   r   ZEnumeratorListr7   Zenumeratorsr*   rr   r"   r"   r#   Úp_enumerator_listš  s    zCParser.p_enumerator_listc              	   C   sj   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
        r\   r   Nr~   r   )r-   r   Z
Enumeratorr<   r|   r9   r6   r7   )r   rs   Z
enumeratorr"   r"   r#   Úp_enumerator§  s     þ þzCParser.p_enumeratorc                 C   s   |d |d< dS )z) declarator  : direct_declarator
        r   r   Nr"   rr   r"   r"   r#   Úp_declarator_1·  s    zCParser.p_declarator_1c                 C   s   |   |d |d ¡|d< dS )z1 declarator  : pointer direct_declarator
        r\   r   r   N©rF   rr   r"   r"   r#   Úp_declarator_2¼  s    zCParser.p_declarator_2c              	   C   s:   t j|d dd|  | d¡¡d�}|  ||d ¡|d< dS )z& declarator  : pointer TYPEID
        r\   Nr^   r   r   )r   rC   r<   r|   rF   )r   rs   rD   r"   r"   r#   Úp_declarator_3Å  s    üzCParser.p_declarator_3c              	   C   s*   t j|d dd|  | d¡¡d�|d< dS )z" direct_declarator   : ID
        r   Nr^   r   )r   rC   r<   r|   rr   r"   r"   r#   Úp_direct_declarator_1Ð  s    üzCParser.p_direct_declarator_1c                 C   s   |d |d< dS )z8 direct_declarator   : LPAREN declarator RPAREN
        r\   r   Nr"   rr   r"   r"   r#   Úp_direct_declarator_2Ù  s    zCParser.p_direct_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 )	zu direct_declarator   : direct_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
        é   r~   Nr‚   r   ©rA   ZdimÚ	dim_qualsr7   ©rD   rE   r   )r-   r   Ú	ArrayDeclr7   rF   )r   rs   rN   Úarrr"   r"   r#   Úp_direct_declarator_3Þ  s    üzCParser.p_direct_declarator_3c                 C   s^   dd„ |d |d fD ƒ}dd„ |D ƒ}t jd|d ||d jd	�}| j|d |d
�|d< dS )zï direct_declarator   : direct_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET
                                | direct_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET
        c                 S   s    g | ]}t |tƒr|n|g‘qS r"   ©rB   Úlist)rJ   Úitemr"   r"   r#   rL   ó  s   ÿz1CParser.p_direct_declarator_4.<locals>.<listcomp>r~   r‚   c                 S   s"   g | ]}|D ]}|d k	r|‘qqS r)   r"   )rJ   ZsublistrT   r"   r"   r#   rL   õ  s
      ÿNr¹   r   rº   r¼   r   ©r   r½   r7   rF   )r   rs   Zlisted_qualsr»   r¾   r"   r"   r#   Úp_direct_declarator_4ì  s    ÿüzCParser.p_direct_declarator_4c              
   C   s^   t jdt  |d |  | d¡¡¡|d dkr4|d ng |d jd�}| j|d |d�|d< dS )za direct_declarator   : direct_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET
        Nr‚   r~   r   rº   r¼   r   ©r   r½   ÚIDr<   r|   r7   rF   ©r   rs   r¾   r"   r"   r#   Úp_direct_declarator_5  s    üzCParser.p_direct_declarator_5c                 C   sz   t j|d d|d jd�}|  ¡ jdkr`|jdk	r`|jjD ]$}t|t jƒrN q`|  	|j
|j¡ q:| j|d |d�|d< dS )z© direct_declarator   : direct_declarator LPAREN parameter_type_list RPAREN
                                | direct_declarator LPAREN identifier_list_opt RPAREN
        r~   Nr   ©ÚargsrA   r7   ZLBRACEr¼   r   )r   rP   r7   r@   rA   rÊ   ÚparamsrB   ÚEllipsisParamr9   r6   rF   )r   rs   ÚfuncZparamr"   r"   r#   Úp_direct_declarator_6  s    ý
 zCParser.p_direct_declarator_6c                 C   sn   |   | d¡¡}tj|d pg d|d�}t|ƒdkrb|d }|jdk	rN|j}q<||_|d |d< n||d< dS )zm pointer : TIMES type_qualifier_list_opt
                    | TIMES type_qualifier_list_opt pointer
        r   r\   N)rN   rA   r7   r~   r   )r<   r|   r   ZPtrDeclr-   rA   )r   rs   r7   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
        r\   r   r   Nrˆ   rr   r"   r"   r#   Úp_type_qualifier_listF  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
        r\   r   r~   r   N)r-   rË   r*   r   rÌ   r<   r|   rr   r"   r"   r#   Úp_parameter_type_listL  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
        r\   r   r   r~   N©r-   r   Z	ParamListr7   rË   r*   rr   r"   r"   r#   Úp_parameter_listU  s    zCParser.p_parameter_listc                 C   sX   |d }|d s2t jdg|  | d¡¡d�g|d< | j|t|d d�gd�d |d< d	S )
zE parameter_declaration   : declaration_specifiers declarator
        r   rA   rG   rH   r\   r¦   r¥   r   N)r   rO   r<   r|   ri   r   r€   r"   r"   r#   Úp_parameter_declaration_1_  s    ÿþþz!CParser.p_parameter_declaration_1c              	   C   sæ   |d }|d s2t jdg|  | d¡¡d�g|d< t|d ƒdkr’t|d d jƒdkr’|  |d d jd ¡r’| j|t|d dd	�gd
�d }nHt j	d|d |d p²t  
ddd¡|  | d¡¡d�}|d }|  ||¡}||d< dS )zR parameter_declaration   : declaration_specifiers abstract_declarator_opt
        r   rA   rG   rH   r1   r   r\   Nrj   r¥   r   rT   ©r6   rN   rA   r7   )r   rO   r<   r|   r-   rI   r;   ri   r   ÚTypenamerC   rR   )r   rs   rX   rD   rQ   r"   r"   r#   Úp_parameter_declaration_2j  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
        r\   r   r   r~   NrÒ   rr   r"   r"   r#   Úp_identifier_list‰  s    zCParser.p_identifier_listc                 C   s   |d |d< dS )z- initializer : assignment_expression
        r   r   Nr"   rr   r"   r"   r#   Úp_initializer_1“  s    zCParser.p_initializer_1c                 C   s:   |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
        r\   Nr   r   )r   ÚInitListr<   r|   rr   r"   r"   r#   Úp_initializer_2˜  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   Nr\   r   r‚   )r-   r   ZNamedInitializerrÚ   r7   Úexprsr*   )r   rs   r_   r"   r"   r#   Úp_initializer_list¡  s    ((zCParser.p_initializer_listc                 C   s   |d |d< dS )z. designation : designator_list EQUALS
        r   r   Nr"   rr   r"   r"   r#   Úp_designation­  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
        r\   r   r   Nrˆ   rr   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
        r\   r   Nr"   rr   r"   r"   r#   Úp_designator»  s    zCParser.p_designatorc              	   C   sT   t jd|d d |d p$t  ddd¡|  | d¡¡d�}|  ||d d ¡|d< dS )	zH type_name   : specifier_qualifier_list abstract_declarator_opt
        r   r   rT   r\   NrÕ   rA   r   )r   rÖ   rC   r<   r|   rR   )r   rs   rQ   r"   r"   r#   Úp_type_nameÁ  s    	
üzCParser.p_type_namec                 C   s(   t  ddd¡}| j||d d�|d< dS )z+ abstract_declarator     : pointer
        Nr   r¼   r   )r   rC   rF   )r   rs   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
        r\   r   r   Nr´   rr   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   r   Nr"   rr   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 r\   r   Nr"   rr   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   rÃ   rÇ   r"   r"   r#   Úp_direct_abstract_declarator_2í  s    üz&CParser.p_direct_abstract_declarator_2c              	   C   s4   t jt  ddd¡|d g |  | d¡¡d�|d< dS )zS direct_abstract_declarator  : LBRACKET assignment_expression_opt RBRACKET
        Nr\   r   rº   r   )r   r½   rC   r<   r|   rr   r"   r"   r#   Úp_direct_abstract_declarator_3ø  s    üz&CParser.p_direct_abstract_declarator_3c              
   C   sJ   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   rÅ   rÇ   r"   r"   r#   Úp_direct_abstract_declarator_4  s    üz&CParser.p_direct_abstract_declarator_4c              
   C   sH   t jt  ddd¡t  |d |  | d¡¡¡g |  | d¡¡d�|d< dS )z? direct_abstract_declarator  : LBRACKET TIMES RBRACKET
        Nr~   r   rº   r   )r   r½   rC   rÆ   r<   r|   rr   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¼   r   )r   rP   r7   rF   )r   rs   rÍ   r"   r"   r#   Úp_direct_abstract_declarator_6  s    ýz&CParser.p_direct_abstract_declarator_6c                 C   s2   t j|d t  ddd¡|  | d¡¡d�|d< dS )zM direct_abstract_declarator  : LPAREN parameter_type_list_opt RPAREN
        r\   Nr   rÉ   r   )r   rP   rC   r<   r|   rr   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   r   NrÀ   rr   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
        r\   Nr   r   rˆ   rr   r"   r"   r#   Úp_block_item_list2  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 r\   r   )Zblock_itemsr7   r   N)r   ZCompoundr<   r|   rr   r"   r"   r#   Úp_compound_statement_19  s    þzCParser.p_compound_statement_1c              	   C   s*   t  |d |d |  | d¡¡¡|d< dS )z( labeled_statement : ID COLON statement r   r~   r   N)r   ZLabelr<   r|   rr   r"   r"   r#   Úp_labeled_statement_1?  s    zCParser.p_labeled_statement_1c              	   C   s,   t  |d |d g|  | d¡¡¡|d< dS )z> labeled_statement : CASE constant_expression COLON statement r\   r‚   r   r   N)r   ZCaser<   r|   rr   r"   r"   r#   Úp_labeled_statement_2C  s    zCParser.p_labeled_statement_2c                 C   s&   t  |d g|  | d¡¡¡|d< dS )z- labeled_statement : DEFAULT COLON statement r~   r   r   N)r   ZDefaultr<   r|   rr   r"   r"   r#   Úp_labeled_statement_3G  s    zCParser.p_labeled_statement_3c              
   C   s,   t  |d |d d|  | d¡¡¡|d< dS )z= selection_statement : IF LPAREN expression RPAREN statement r~   r¹   Nr   r   ©r   ZIfr<   r|   rr   r"   r"   r#   Úp_selection_statement_1K  s    zCParser.p_selection_statement_1c              
   C   s0   t  |d |d |d |  | d¡¡¡|d< dS )zL selection_statement : IF LPAREN expression RPAREN statement ELSE statement r~   r¹   é   r   r   Nrò   rr   r"   r"   r#   Úp_selection_statement_2O  s    zCParser.p_selection_statement_2c              
   C   s.   t t |d |d |  | d¡¡¡ƒ|d< dS )zA selection_statement : SWITCH LPAREN expression RPAREN statement r~   r¹   r   r   N)r	   r   ZSwitchr<   r|   rr   r"   r"   r#   Úp_selection_statement_3S  s     ÿzCParser.p_selection_statement_3c              	   C   s*   t  |d |d |  | d¡¡¡|d< dS )z@ iteration_statement : WHILE LPAREN expression RPAREN statement r~   r¹   r   r   N)r   ZWhiler<   r|   rr   r"   r"   r#   Úp_iteration_statement_1X  s    zCParser.p_iteration_statement_1c              	   C   s*   t  |d |d |  | d¡¡¡|d< dS )zH iteration_statement : DO statement WHILE LPAREN expression RPAREN SEMI r¹   r\   r   r   N)r   ZDoWhiler<   r|   rr   r"   r"   r#   Úp_iteration_statement_2\  s    zCParser.p_iteration_statement_2c                 C   s6   t  |d |d |d |d |  | d¡¡¡|d< dS )zj iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN statement r~   r¹   rô   é	   r   r   N)r   ÚForr<   r|   rr   r"   r"   r#   Úp_iteration_statement_3`  s    zCParser.p_iteration_statement_3c                 C   sJ   t  t  |d |  | d¡¡¡|d |d |d |  | d¡¡¡|d< dS )zb iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN statement r~   r   r‚   é   é   r   N)r   rú   ZDeclListr<   r|   rr   r"   r"   r#   Úp_iteration_statement_4d  s       ÿzCParser.p_iteration_statement_4c                 C   s$   t  |d |  | d¡¡¡|d< dS )z  jump_statement  : GOTO ID SEMI r\   r   r   N)r   ZGotor<   r|   rr   r"   r"   r#   Úp_jump_statement_1i  s    zCParser.p_jump_statement_1c                 C   s   t  |  | d¡¡¡|d< dS )z jump_statement  : BREAK SEMI r   r   N)r   ZBreakr<   r|   rr   r"   r"   r#   Úp_jump_statement_2m  s    zCParser.p_jump_statement_2c                 C   s   t  |  | d¡¡¡|d< dS )z! jump_statement  : CONTINUE SEMI r   r   N)r   ZContinuer<   r|   rr   r"   r"   r#   Úp_jump_statement_3q  s    zCParser.p_jump_statement_3c                 C   s4   t  t|ƒdkr|d nd|  | d¡¡¡|d< dS )z\ jump_statement  : RETURN expression SEMI
                            | RETURN SEMI
        r‚   r\   Nr   r   )r   ZReturnr-   r<   r|   rr   r"   r"   r#   Úp_jump_statement_4u  s    zCParser.p_jump_statement_4c                 C   s8   |d dkr(t  |  | d¡¡¡|d< n|d |d< dS )z, expression_statement : expression_opt SEMI r   Nr   )r   ZEmptyStatementr<   r|   rr   r"   r"   r#   Úp_expression_statement{  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
        r\   r   r   r~   N)r-   rB   r   ÚExprListr7   rÜ   r*   rr   r"   r"   r#   Úp_expression‚  s    zCParser.p_expressionc                 C   s(   t j|d g|  | d¡¡d�|d< dS )z typedef_name : TYPEID r   rH   r   Nr‘   rr   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
        r\   r   r   r~   N)r-   r   Z
Assignmentr7   rr   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   r   Nr"   rr   r"   r"   r#   Úp_assignment_operator¡  s    zCParser.p_assignment_operatorc                 C   s   |d |d< dS )z. constant_expression : conditional_expression r   r   Nr"   rr   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
        r\   r   r   r~   r¹   N)r-   r   Z	TernaryOpr7   rr   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
        r\   r   r   r~   N)r-   r   ZBinaryOpr7   rr   r"   r"   r#   Úp_binary_expression½  s    zCParser.p_binary_expressionc                 C   s   |d |d< dS )z$ cast_expression : unary_expression r   r   Nr"   rr   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 r\   r‚   r   r   N)r   ZCastr<   r|   rr   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   r   Nr"   rr   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   r\   r   N©r   ÚUnaryOpr7   rr   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 )zx unary_expression    : SIZEOF unary_expression
                                | SIZEOF LPAREN type_name RPAREN
        r   r~   r\   r   N)r   r  r-   r<   r|   rr   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   r   Nr"   rr   r"   r"   r#   Úp_unary_operatoró  s    zCParser.p_unary_operatorc                 C   s   |d |d< dS )z* postfix_expression  : primary_expression r   r   Nr"   rr   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~   r   N)r   ZArrayRefr7   rr   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~   Nr   )r   ÚFuncCallr-   r7   rr   r"   r"   r#   Úp_postfix_expression_3  s    zCParser.p_postfix_expression_3c                 C   sB   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   r\   r   N)r   rÆ   r<   r|   Z	StructRefr7   )r   rs   Z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
        rs   r\   r   r   Nr  rr   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
        r\   r¹   r   N)r   ZCompoundLiteralrr   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   r   Nr"   rr   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   r   Nr"   rr   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   r   Nr"   rr   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 r\   r   Nr"   rr   r"   r"   r#   Úp_primary_expression_4.  s    zCParser.p_primary_expression_4c                 C   sF   |   | d¡¡}t t |d |¡t |d |d g|¡|¡|d< dS )zQ primary_expression  : OFFSETOF LPAREN type_name COMMA identifier RPAREN
        r   r~   r¹   r   N)r<   r|   r   r  rÆ   r  )r   rs   r7   r"   r"   r#   Úp_primary_expression_52  s
    þzCParser.p_primary_expression_5c                 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
        r\   r   r   r~   N)r-   r   r  r7   rÜ   r*   rr   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   r   N)r   rÆ   r<   r|   rr   r"   r"   r#   Úp_identifierD  s    zCParser.p_identifierc              	   C   s&   t  d|d |  | d¡¡¡|d< dS )z� constant    : INT_CONST_DEC
                        | INT_CONST_OCT
                        | INT_CONST_HEX
                        | INT_CONST_BIN
        rG   r   r   N©r   ÚConstantr<   r|   rr   r"   r"   r#   Úp_constant_1H  s
      ÿzCParser.p_constant_1c              	   C   s&   t  d|d |  | d¡¡¡|d< dS )zM constant    : FLOAT_CONST
                        | HEX_FLOAT_CONST
        Úfloatr   r   Nr"  rr   r"   r"   r#   Úp_constant_2Q  s
      ÿzCParser.p_constant_2c              	   C   s&   t  d|d |  | d¡¡¡|d< dS )zH constant    : CHAR_CONST
                        | WCHAR_CONST
        Úcharr   r   Nr"  rr   r"   r"   r#   Úp_constant_3X  s
      ÿzCParser.p_constant_3c              	   C   sh   t |ƒdkr0t 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
        r\   Ústringr   r   Nr1   )r-   r   r#  r<   r|   Úvaluerr   r"   r"   r#   Úp_unified_string_literald  s      ÿ
(z CParser.p_unified_string_literalc              	   C   sl   t |ƒdkr0t d|d |  | d¡¡¡|d< n8|d j ¡ dd… |d dd…  |d _|d |d< dS )z� unified_wstring_literal : WSTRING_LITERAL
                                    | unified_wstring_literal WSTRING_LITERAL
        r\   r)  r   r   Nr1   )r-   r   r#  r<   r|   r*  Úrstriprr   r"   r"   r#   Úp_unified_wstring_literalo  s      ÿ
,z!CParser.p_unified_wstring_literalc                 C   s   |d |d< dS )z  brace_open  :   LBRACE
        r   r   Nr"   rr   r"   r"   r#   Úp_brace_openz  s    zCParser.p_brace_openc                 C   s   |d |d< dS )z  brace_close :   RBRACE
        r   r   Nr"   rr   r"   r"   r#   Úp_brace_close  s    zCParser.p_brace_closec                 C   s   d|d< dS )zempty : Nr   r"   rr   r"   r"   r#   Úp_empty„  s    zCParser.p_emptyc                 C   s<   |r,|   d|j | j|j| j |¡d�¡ n|   dd¡ d S )Nz
before: %s)r|   r?   zAt end of inputr   )r4   r*  r<   r|   r   Zfind_tok_columnrr   r"   r"   r#   Úp_errorˆ  s    
ÿþzCParser.p_errorN)Tr   Tr   Fr   )r   r   )F)˜Ú__name__Ú
__module__Ú__qualname__r$   r'   r,   r0   r8   r9   r;   r   r   r   r   r@   rF   rR   rY   ri   rn   ro   Z
precedencert   ru   rw   rx   ry   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/  r0  r1  r"   r"   r"   r#   r
      s6       ù
j	

	)7-Y		;		
	
&					

	
		
		
	
	r
   Ú__main__)ÚreZplyr   r   r   Úc_lexerr   Z	plyparserr   r   r   Zast_transformsr	   r
   r2  ÚpprintÚtimeÚsysr"   r"   r"   r#   Ú<module>	   s,                