o
    0cr                    @   sl   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
mZmZ ddlmZ eG dd	 d	eZdS )
    N   )yacc)c_ast)CLexer)	PLYParserCoord
ParseErrorparameterizedtemplate)fix_switch_casesc                   @   s  e Zd ZdedddddfddZdJd	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dKd#d$ZdKd%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_ Z0d`da Z1dbdc Z2ddde Z3dfdg Z4dhdi Z5djdk Z6dldm Z7dndo Z8dpdq Z9drds Z:dtdu Z;dvdw Z<dxdy Z=dzd{ Z>d|d} Z?d~d Z@dd ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMeNddddd ZOeNddddd ZPeNddddd ZQeNdddd ZReNddddd ZSeNddddd ZTeNddddd ZUeNddddd ZVdd ZWdd ZXdd ZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd ZaddĄ ZbddƄ ZcddȄ Zdddʄ Zedd̄ Zfdd΄ ZgddЄ Zhdd҄ ZiddԄ Zjddք Zkdd؄ Zlddڄ Zmdd܄ Znddބ Zodd Zpdd Zqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd Zxdd Zydd Zzdd Z{dd Z|dd Z}dd Z~dd Z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/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Zd=d> Zd?d@ ZdAdB ZdCdD ZdEdF ZdGdH ZdIS (L  CParserTzpycparser.lextabzpycparser.yacctabF c           
      C   s~   || j | j| j| jd| _| jj|||d | jj| _g d}|D ]}	| |	 q!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.
        )
error_funcon_lbrace_funcon_rbrace_functype_lookup_func)optimizelextab	outputdir)abstract_declaratorassignment_expressiondeclaration_listdeclaration_specifiers_no_typedesignation
expressionidentifier_listinit_declarator_listid_init_declarator_listinitializer_listparameter_type_listblock_item_listtype_qualifier_liststruct_declarator_listtranslation_unit_or_empty)modulestartdebugr   	tabmoduler   N)_lex_error_func_lex_on_lbrace_func_lex_on_rbrace_func_lex_type_lookup_funcclexbuildtokens_create_opt_ruler   cparserdict_scope_stack_last_yielded_token)
selflex_optimizelexerr   yacc_optimizeyacctab
yacc_debugtaboutputdirrules_with_optrule r=   H/var/www/html/gps/gps/lib/python3.10/site-packages/pycparser/c_parser.py__init__   s2   :


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)inputr6   r&   )r,   filenamereset_linenor1   r2   r3   r0   parse)r4   textrA   
debuglevelr=   r=   r>   rC      s   

zCParser.parsec                 C   s   | j t  d S N)r2   appendr1   r4   r=   r=   r>   _push_scope   s   zCParser._push_scopec                 C   s    t | jdks	J | j  d S )Nr   )lenr2   poprH   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r2   get_parse_errorr4   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
        rM   Fz;Non-typedef %r previously declared as typedef in this scopeNrN   rQ   r=   r=   r>   _add_identifier   s   zCParser._add_identifierc                 C   s.   t | jD ]}||}|dur|  S qdS )z8 Is *name* a typedef-name in the current scope?
        NF)reversedr2   rO   )r4   rR   scopein_scoper=   r=   r>   _is_type_in_scope   s   
zCParser._is_type_in_scopec                 C   s   |  || || d S rF   )rP   _coord)r4   msglinecolumnr=   r=   r>   r(      s   zCParser._lex_error_funcc                 C      |    d S rF   )rI   rH   r=   r=   r>   r)         zCParser._lex_on_lbrace_funcc                 C   r^   rF   )rL   rH   r=   r=   r>   r*      r_   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.
        )rY   )r4   rR   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,   
last_tokenrH   r=   r=   r>   _get_yacc_lookahead_token   s   z!CParser._get_yacc_lookahead_tokenc                 C   sh   |}|}|j r|j }|j st|tjr||_ |S |}t|j tjs+|j }t|j tjr!|j |_ ||_ |S )z Tacks a type modifier on a declarator, and returns
            the modified declarator.

            Note: the declarator and modifier may be modified
        )type
isinstancer   TypeDecl)r4   declmodifiermodifier_headmodifier_tail	decl_tailr=   r=   r>   _type_modify_decl   s   zCParser._type_modify_declc                 C   s   |}t |tjs|j}t |tjr|j|_|j|_|D ]}t |tjs8t|dkr1| 	d|j
 q||_|  S q|sUt |jtjsI| 	d|j
 tjdg|j
d|_|S 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rS   c                 S   s   g | ]
}|j D ]}|qqS r=   )names).0idrR   r=   r=   r>   
<listcomp>[  s    z/CParser._fix_decl_name_type.<locals>.<listcomp>r   )rd   r   re   rc   declnamerR   qualsIdentifierTyperJ   rP   rS   FuncDecl)r4   rf   typenamerc   tnr=   r=   r>   _fix_decl_name_type2  s<   
zCParser._fix_decl_name_typec                 C   s>   |p	t g g g g d}|r|| | |S || 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.
            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storagerc   functionr   )r1   rG   insert)r4   declspecnewspeckindrG   specr=   r=   r>   _add_declaration_specifier_  s   z"CParser._add_declaration_specifierc                 C   s>  d|d v }g }|d  ddurn|d d du rqt|d dk s9t|d d	 jd
ks9| |d d	 jd sRd}|d D ]}t|drK|j} nq?| d| tj|d d	 jd dd|d d	 jd|d d< |d d	= n8t	|d d tj
tjtjfs|d d }t	|tjs|j}t	|tjr|jdu r|d d	 jd |_|d d	= |D ]q}	|	d dusJ |rt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 }|r|r| |j|j n| |j|j || q|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.
        typedefr{   r   bitsizeNrf   rc      rM   r   ?rS   zInvalid declarationrr   rc   rs   rS   rz   )rR   rs   r{   rc   rS   r|   initrR   rs   r{   funcspecrc   r   r   rS   )rO   rJ   rn   rY   hasattrrS   rP   r   re   rd   StructUnionrt   rc   rr   TypedefDeclrx   rT   rR   rU   rG   )r4   r   declstypedef_namespace
is_typedefdeclarationsrS   tdecls_0_tailrf   declaration
fixed_declr=   r=   r>   _build_declarationsw  s~   &



zCParser._build_declarationsc                 C   sB   d|d vsJ | j |t|ddgddd }tj||||jdS )	z' Builds a function definition.
        r   r{   Nrf   r   Tr   r   r   r   )rf   param_declsbodyrS   )r   r1   r   FuncDefrS   )r4   r   rf   r   r   r   r=   r=   r>   _build_function_definition  s   z"CParser._build_function_definitionc                 C   s   |dkrt jS t jS )z` Given a token (either STRUCT or UNION), selects the
            appropriate AST class.
        struct)r   r   r   )r4   tokenr=   r=   r>   _select_struct_union_class  s   z"CParser._select_struct_union_class)
)leftLOR)r   LAND)r   OR)r   XOR)r   AND)r   EQNE)r   GTGELTLE)r   RSHIFTLSHIFT)r   PLUSMINUS)r   TIMESDIVIDEMODc                 C   s4   |d du rt g |d< dS t |d |d< dS )zh translation_unit_or_empty   : translation_unit
                                        | empty
        r   Nr   )r   FileASTr4   pr=   r=   r>   p_translation_unit_or_empty  s   z#CParser.p_translation_unit_or_emptyc                 C      |d |d< dS )z4 translation_unit    : external_declaration
        r   r   Nr=   r   r=   r=   r>   p_translation_unit_1
     zCParser.p_translation_unit_1c                 C   s"   |d  |d  |d |d< dS )zE translation_unit    : translation_unit external_declaration
        r   r   r   N)extendr   r=   r=   r>   p_translation_unit_2  s   zCParser.p_translation_unit_2c                 C      |d g|d< dS )z7 external_declaration    : function_definition
        r   r   Nr=   r   r=   r=   r>   p_external_declaration_1     z CParser.p_external_declaration_1c                 C   r   )z/ external_declaration    : declaration
        r   r   Nr=   r   r=   r=   r>   p_external_declaration_2!     z CParser.p_external_declaration_2c                 C   r   )zi external_declaration    : pp_directive
                                    | pppragma_directive
        r   r   Nr=   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
        r   Nr=   r   r=   r=   r>   p_external_declaration_4,     z CParser.p_external_declaration_4c                 C   s   |  d| |d dS )z  pp_directive  : PPHASH
        zDirectives not supported yetr   N)rP   _token_coordr   r=   r=   r>   p_pp_directive1  s   
zCParser.p_pp_directivec                 C   sH   t |dkrt|d | |d|d< dS td| |d|d< dS )zg pppragma_directive      : PPPRAGMA
                                    | PPPRAGMA PPPRAGMASTR
           r   r   r   r   N)rJ   r   Pragmar   r   r=   r=   r>   p_pppragma_directive7  s    zCParser.p_pppragma_directivec              	   C   sL   t g g tjdg| |ddgg d}| j||d |d |d d|d< d	S )
zU function_definition : id_declarator declaration_list_opt compound_statement
        rl   r   rm   ry   r   r   r   rf   r   r   r   N)r1   r   rt   r   r   r4   r   r   r=   r=   r>   p_function_definition_1C  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   r   r      r   r   N)r   r   r=   r=   r>   p_function_definition_2T  s   zCParser.p_function_definition_2c                 C   r   )a7   statement   : labeled_statement
                        | expression_statement
                        | compound_statement
                        | selection_statement
                        | iteration_statement
                        | jump_statement
                        | pppragma_directive
        r   r   Nr=   r   r=   r=   r>   p_statement_  s   	zCParser.p_statementc                 C   sV   t |d tjr#t|dkr#tj|d |d g| |dd|d< dS |d |d< dS )zx pragmacomp_or_statement     : pppragma_directive statement
                                        | statement
        r   r   r   block_itemsrS   r   N)rd   r   r   rJ   Compoundr   r   r=   r=   r>   p_pragmacomp_or_statement  s   
z!CParser.p_pragmacomp_or_statementc              
   C   s   |d }|d du rK|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 jd	g}n| 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   r   Nrc   r   rz   r{   r|   r   r   Tr   )
r   r   r   EnumrJ   rd   r   rS   r   r1   )r4   r   r   tys_u_or_er   r=   r=   r>   p_decl_body  s4   
zCParser.p_decl_bodyc                 C   r   )z& declaration : decl_body SEMI
        r   r   Nr=   r   r=   r=   r>   p_declaration  r   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rJ   r   r=   r=   r>   p_declaration_list     ,zCParser.p_declaration_listc                 C      |  |d |d d|d< dS )z] declaration_specifiers_no_type  : type_qualifier declaration_specifiers_no_type_opt
        r   r   rz   r   Nr   r   r=   r=   r>   "p_declaration_specifiers_no_type_1     z*CParser.p_declaration_specifiers_no_type_1c                 C   r   )zf declaration_specifiers_no_type  : storage_class_specifier declaration_specifiers_no_type_opt
        r   r   r{   r   Nr   r   r=   r=   r>   "p_declaration_specifiers_no_type_2  r   z*CParser.p_declaration_specifiers_no_type_2c                 C   r   )za declaration_specifiers_no_type  : function_specifier declaration_specifiers_no_type_opt
        r   r   r|   r   Nr   r   r=   r=   r>   "p_declaration_specifiers_no_type_3  r   z*CParser.p_declaration_specifiers_no_type_3c                 C   "   | j |d |d ddd|d< dS )zI declaration_specifiers  : declaration_specifiers type_qualifier
        r   r   rz   TrG   r   Nr   r   r=   r=   r>   p_declaration_specifiers_1     "z"CParser.p_declaration_specifiers_1c                 C   r   )zR declaration_specifiers  : declaration_specifiers storage_class_specifier
        r   r   r{   Tr   r   Nr   r   r=   r=   r>   p_declaration_specifiers_2  r   z"CParser.p_declaration_specifiers_2c                 C   r   )zM declaration_specifiers  : declaration_specifiers function_specifier
        r   r   r|   Tr   r   Nr   r   r=   r=   r>   p_declaration_specifiers_3  r   z"CParser.p_declaration_specifiers_3c                 C   r   )zS declaration_specifiers  : declaration_specifiers type_specifier_no_typeid
        r   r   rc   Tr   r   Nr   r   r=   r=   r>   p_declaration_specifiers_4  r   z"CParser.p_declaration_specifiers_4c                 C      |  d|d d|d< dS )z2 declaration_specifiers  : type_specifier
        Nr   rc   r   r   r   r=   r=   r>   p_declaration_specifiers_5     z"CParser.p_declaration_specifiers_5c                 C   r   )zQ declaration_specifiers  : declaration_specifiers_no_type type_specifier
        r   r   rc   Tr   r   Nr   r   r=   r=   r>   p_declaration_specifiers_6!  r   z"CParser.p_declaration_specifiers_6c                 C   r   )z storage_class_specifier : AUTO
                                    | REGISTER
                                    | STATIC
                                    | EXTERN
                                    | TYPEDEF
        r   r   Nr=   r   r=   r=   r>   p_storage_class_specifier'  s   z!CParser.p_storage_class_specifierc                 C   r   )z& function_specifier  : INLINE
        r   r   Nr=   r   r=   r=   r>   p_function_specifier0  r   zCParser.p_function_specifierc                 C   $   t j|d g| |dd|d< dS )a+   type_specifier_no_typeid  : VOID
                                      | _BOOL
                                      | CHAR
                                      | SHORT
                                      | INT
                                      | LONG
                                      | FLOAT
                                      | DOUBLE
                                      | _COMPLEX
                                      | SIGNED
                                      | UNSIGNED
                                      | __INT128
        r   rm   r   Nr   rt   r   r   r=   r=   r>   p_type_specifier_no_typeid5  s   $z"CParser.p_type_specifier_no_typeidc                 C   r   )z type_specifier  : typedef_name
                            | enum_specifier
                            | struct_or_union_specifier
                            | type_specifier_no_typeid
        r   r   Nr=   r   r=   r=   r>   p_type_specifierE  s   zCParser.p_type_specifierc                 C   r   )zo type_qualifier  : CONST
                            | RESTRICT
                            | VOLATILE
        r   r   Nr=   r   r=   r=   r>   p_type_qualifierM  r   zCParser.p_type_qualifierc                 C   0   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   r   r=   r=   r>   p_init_declarator_listT     0zCParser.p_init_declarator_listc                 C   ,   t |d t|dkr|d ndd|d< dS )zb init_declarator : declarator
                            | declarator EQUALS initializer
        r   r   r   Nr   r   r1   rJ   r   r=   r=   r>   p_init_declarator]  r   zCParser.p_init_declaratorc                 C   r   )z id_init_declarator_list    : id_init_declarator
                                       | id_init_declarator_list COMMA init_declarator
        r   r   r   r   Nr   r   r=   r=   r>   p_id_init_declarator_listc  r   z!CParser.p_id_init_declarator_listc                 C   r   )zn id_init_declarator : id_declarator
                               | id_declarator EQUALS initializer
        r   r   r   Nr   r   r   r   r=   r=   r>   p_id_init_declaratori  r   zCParser.p_id_init_declaratorc                 C   r   )zY specifier_qualifier_list    : specifier_qualifier_list type_specifier_no_typeid
        r   r   rc   Tr   r   Nr   r   r=   r=   r>   p_specifier_qualifier_list_1q  r   z$CParser.p_specifier_qualifier_list_1c                 C   r   )zO specifier_qualifier_list    : specifier_qualifier_list type_qualifier
        r   r   rz   Tr   r   Nr   r   r=   r=   r>   p_specifier_qualifier_list_2v  r   z$CParser.p_specifier_qualifier_list_2c                 C   r   )z4 specifier_qualifier_list  : type_specifier
        Nr   rc   r   r   r   r=   r=   r>   p_specifier_qualifier_list_3{  r   z$CParser.p_specifier_qualifier_list_3c                 C   s2   t |d g g g d}| j||d ddd|d< dS )	zH specifier_qualifier_list  : type_qualifier_list type_specifier
        r   ry   r   rc   Tr   r   N)r1   r   r   r=   r=   r>   p_specifier_qualifier_list_4  s   z$CParser.p_specifier_qualifier_list_4c                 C   s0   |  |d }||d d| |dd|d< dS )z{ struct_or_union_specifier   : struct_or_union ID
                                        | struct_or_union TYPEID
        r   r   NrR   r   rS   r   )r   r   r4   r   klassr=   r=   r>   p_struct_or_union_specifier_1  s   
z%CParser.p_struct_or_union_specifier_1c                 C   sZ   |  |d }t|dkr|dg | |dd|d< dS |d|d | |dd|d< dS )z struct_or_union_specifier : struct_or_union brace_open struct_declaration_list brace_close
                                      | struct_or_union brace_open brace_close
        r   r   Nr   r  r   r   r   rJ   r   r  r=   r=   r>   p_struct_or_union_specifier_2  s   

z%CParser.p_struct_or_union_specifier_2c                 C   sb   |  |d }t|dkr||d g | |dd|d< dS ||d |d | |dd|d< dS )a   struct_or_union_specifier   : struct_or_union ID brace_open struct_declaration_list brace_close
                                        | struct_or_union ID brace_open brace_close
                                        | struct_or_union TYPEID brace_open struct_declaration_list brace_close
                                        | struct_or_union TYPEID brace_open brace_close
        r      r   r  r   r   Nr  r  r=   r=   r>   p_struct_or_union_specifier_3  s   

z%CParser.p_struct_or_union_specifier_3c                 C   r   )zF struct_or_union : STRUCT
                            | UNION
        r   r   Nr=   r   r=   r=   r>   p_struct_or_union     zCParser.p_struct_or_unionc                 C   s<   t |dkr|d pg |d< dS |d |d pg  |d< dS )z struct_declaration_list     : struct_declaration
                                        | struct_declaration_list struct_declaration
        r   r   r   Nr   r   r=   r=   r>   p_struct_declaration_list  s   z!CParser.p_struct_declaration_listc                 C   s   |d }d|d vsJ |d dur| j ||d d}n4t|d dkrD|d d }t|tjr3|}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   r   r{   r   Nr   r   rc   r   rf   r   )r   rJ   rd   r   Nodert   r1   )r4   r   r   r   node	decl_typer=   r=   r>   p_struct_declaration_1  s*   

	zCParser.p_struct_declaration_1c                 C      d|d< dS )z# struct_declaration : SEMI
        Nr   r=   r   r=   r=   r>   p_struct_declaration_2  r   zCParser.p_struct_declaration_2c                 C   r   )z1 struct_declaration : pppragma_directive
        r   r   Nr=   r   r=   r=   r>   p_struct_declaration_3  r   zCParser.p_struct_declaration_3c                 C   r   )z struct_declarator_list  : struct_declarator
                                    | struct_declarator_list COMMA struct_declarator
        r   r   r   r   Nr   r   r=   r=   r>   p_struct_declarator_list  r   z CParser.p_struct_declarator_listc                 C   s   |d dd|d< dS )z( struct_declarator : declarator
        r   Nrf   r   r   r=   r   r=   r=   r>   p_struct_declarator_1  s   zCParser.p_struct_declarator_1c                 C   sF   t |dkr|d |d d|d< dS tddd|d d|d< dS )z struct_declarator   : declarator COLON constant_expression
                                | COLON constant_expression
        r   r   r  r   Nr   )rJ   r   re   r   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   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  r   r=   r=   r>   p_enum_specifier_2  r   zCParser.p_enum_specifier_2c                 C   &   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  r   r=   r=   r>   p_enum_specifier_3  s   &zCParser.p_enum_specifier_3c                 C   sl   t |dkrt|d g|d j|d< dS t |dkr$|d |d< dS |d j|d  |d |d< dS )z enumerator_list : enumerator
                            | enumerator_list COMMA
                            | enumerator_list COMMA enumerator
        r   r   r   r   N)rJ   r   EnumeratorListrS   enumeratorsrG   r   r=   r=   r>   p_enumerator_list"  s    zCParser.p_enumerator_listc                 C   sb   t |dkrt|d d| |d}nt|d |d | |d}| |j|j ||d< dS )zR enumerator  : ID
                        | ID EQUALS constant_expression
        r   r   Nr   r   )rJ   r   
Enumeratorr   rU   rR   rS   )r4   r   
enumeratorr=   r=   r>   p_enumerator/  s   

zCParser.p_enumeratorc                 C   r   )zQ declarator  : id_declarator
                        | typeid_declarator
        r   r   Nr=   r   r=   r=   r>   p_declarator?  r
  zCParser.p_declarator)rp   ID)typeidTYPEID)typeid_noparenr'  c                 C   r   )z1 xxx_declarator  : direct_xxx_declarator
        r   r   Nr=   r   r=   r=   r>   p_xxx_declarator_1E  r
  zCParser.p_xxx_declarator_1c                 C      |  |d |d |d< dS )z9 xxx_declarator  : pointer direct_xxx_declarator
        r   r   r   Nrk   r   r=   r=   r>   p_xxx_declarator_2K     zCParser.p_xxx_declarator_2c                 C   s&   t j|d dd| |dd|d< dS )z' direct_xxx_declarator   : yyy
        r   Nr   r   )r   re   r   r   r=   r=   r>   p_direct_xxx_declarator_1Q  s   
z!CParser.p_direct_xxx_declarator_1c                 C   r   )z@ direct_xxx_declarator   : LPAREN xxx_declarator RPAREN
        r   r   Nr=   r   r=   r=   r>   p_direct_xxx_declarator_2[  r
  z!CParser.p_direct_xxx_declarator_2c                 C   sf   t |dkr
|d ng pg }tjdt |dkr|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   rc   dim	dim_qualsrS   rf   rg   r   )rJ   r   	ArrayDeclrS   rk   )r4   r   rs   arrr=   r=   r>   p_direct_xxx_declarator_3a  s   z!CParser.p_direct_xxx_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_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=   rd   list)ro   itemr=   r=   r>   rq   x  s    z5CParser.p_direct_xxx_declarator_4.<locals>.<listcomp>r   r   c                 S   s"   g | ]}|D ]}|d ur|qqS rF   r=   )ro   sublistrz   r=   r=   r>   rq   z  s    Nr  r   r0  r3  r   r   r4  rS   rk   )r4   r   listed_qualsr2  r5  r=   r=   r>   p_direct_xxx_declarator_4p  s   z!CParser.p_direct_xxx_declarator_4c              	   C   sZ   t jdt |d | |d|d dkr|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   r0  r3  r   r   r4  r%  r   rS   rk   r4   r   r5  r=   r=   r>   p_direct_xxx_declarator_5  s   z!CParser.p_direct_xxx_declarator_5c                 C   sz   t j|d d|d jd}|  jdkr0|jdur0|jjD ]}t|t jr' n	| 	|j
|j q| 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   argsrc   rS   LBRACEr3  r   )r   ru   rS   rb   rc   rB  paramsrd   EllipsisParamrU   rR   rk   )r4   r   funcparamr=   r=   r>   p_direct_xxx_declarator_6  s   
z!CParser.p_direct_xxx_declarator_6c                 C   st   |  |d}tj|d pg d|d}t|dkr4|d }|jdur)|j}|jdus!||_|d |d< dS ||d< dS )zm pointer : TIMES type_qualifier_list_opt
                    | TIMES type_qualifier_list_opt pointer
        r   r   N)rs   rc   rS   r   r   )r   r   PtrDeclrJ   rc   )r4   r   rS   nested_type	tail_typer=   r=   r>   	p_pointer  s   

zCParser.p_pointerc                 C   0   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   r   r=   r=   r>   p_type_qualifier_list  r   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)rJ   rD  rG   r   rE  r   r   r=   r=   r>   p_parameter_type_list  s   zCParser.p_parameter_type_listc                 C   P   t |dkrt|d g|d j|d< dS |d j|d  |d |d< dS )zz parameter_list  : parameter_declaration
                            | parameter_list COMMA parameter_declaration
        r   r   r   r   NrJ   r   	ParamListrS   rD  rG   r   r=   r=   r>   p_parameter_list      zCParser.p_parameter_listc                 C   sT   |d }|d st jdg| |ddg|d< | j|t|d dgdd |d< d	S )
z parameter_declaration   : declaration_specifiers id_declarator
                                    | declaration_specifiers typeid_noparen_declarator
        r   rc   rl   rm   r   r  r  r   N)r   rt   r   r   r1   r   r=   r=   r>   p_parameter_declaration_1  s   
z!CParser.p_parameter_declaration_1c                 C   s   |d }|d st jdg| |ddg|d< t|d dkrGt|d d jdkrG| |d d jd rG| j|t|d dd	gd
d }n"t jd|d |d pWt 	ddd| |dd}|d }| 
||}||d< dS )zR parameter_declaration   : declaration_specifiers abstract_declarator_opt
        r   rc   rl   rm   rM   r   r   Nr   r  r   rz   rR   rs   rc   rS   )r   rt   r   rJ   rn   rY   r   r1   Typenamere   rx   )r4   r   r   rf   rv   r=   r=   r>   p_parameter_declaration_2  s.   
&
z!CParser.p_parameter_declaration_2c                 C   rP  )ze identifier_list : identifier
                            | identifier_list COMMA identifier
        r   r   r   r   NrQ  r   r=   r=   r>   p_identifier_list  rT  zCParser.p_identifier_listc                 C   r   )z- initializer : assignment_expression
        r   r   Nr=   r   r=   r=   r>   p_initializer_1%  r   zCParser.p_initializer_1c                 C   s8   |d du rt g | |d|d< dS |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   r=   r=   r>   p_initializer_2*  s   zCParser.p_initializer_2c                 C   s   t |dkr(|d du r|d n	t|d |d }t|g|d j|d< dS |d du r2|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   )rJ   r   NamedInitializerr[  rS   exprsrG   )r4   r   r   r=   r=   r>   p_initializer_list3  s   ((zCParser.p_initializer_listc                 C   r   )z. designation : designator_list EQUALS
        r   r   Nr=   r   r=   r=   r>   p_designation?  r   zCParser.p_designationc                 C   rM  )z_ designator_list : designator
                            | designator_list designator
        r   r   r   Nr   r   r=   r=   r>   p_designator_listG  r   zCParser.p_designator_listc                 C   r   )zi designator  : LBRACKET constant_expression RBRACKET
                        | PERIOD identifier
        r   r   Nr=   r   r=   r=   r>   p_designatorM  r
  zCParser.p_designatorc                 C   sP   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   rz   r   NrV  rc   r   )r   rW  re   r   rx   )r4   r   rv   r=   r=   r>   p_type_nameS  s   

zCParser.p_type_namec                 C   s(   t ddd}| j||d d|d< dS )z+ abstract_declarator     : pointer
        Nr   r3  r   )r   re   rk   )r4   r   	dummytyper=   r=   r>   p_abstract_declarator_1^  s
   zCParser.p_abstract_declarator_1c                 C   r*  )zF abstract_declarator     : pointer direct_abstract_declarator
        r   r   r   Nr+  r   r=   r=   r>   p_abstract_declarator_2f  s   zCParser.p_abstract_declarator_2c                 C   r   )z> abstract_declarator     : direct_abstract_declarator
        r   r   Nr=   r   r=   r=   r>   p_abstract_declarator_3k  r   zCParser.p_abstract_declarator_3c                 C   r   )zA direct_abstract_declarator  : LPAREN abstract_declarator RPAREN r   r   Nr=   r   r=   r=   r>   p_direct_abstract_declarator_1u     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   r0  r3  r   r;  r?  r=   r=   r>   p_direct_abstract_declarator_2y  s   z&CParser.p_direct_abstract_declarator_2c                 C   s`   t |dkr
|d ng pg }tjtdddt |dkr |d n|d || |dd|d< dS )zk direct_abstract_declarator  : LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
        r   r   Nr   r   r0  r   )rJ   r   r4  re   r   )r4   r   rs   r=   r=   r>   p_direct_abstract_declarator_3  s   
z&CParser.p_direct_abstract_declarator_3c              	   C   sF   t jdt |d | |dg |d jd}| j|d |d|d< dS )zZ direct_abstract_declarator  : direct_abstract_declarator LBRACKET TIMES RBRACKET
        Nr   r   r0  r3  r   r>  r?  r=   r=   r>   p_direct_abstract_declarator_4  s   z&CParser.p_direct_abstract_declarator_4c              	   C   s@   t jt dddt |d | |dg | |dd|d< dS )z? direct_abstract_declarator  : LBRACKET TIMES RBRACKET
        Nr   r   r0  r   )r   r4  re   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   rA  r3  r   )r   ru   rS   rk   )r4   r   rF  r=   r=   r>   p_direct_abstract_declarator_6  s   z&CParser.p_direct_abstract_declarator_6c                 C   s.   t j|d t ddd| |dd|d< dS )zM direct_abstract_declarator  : LPAREN parameter_type_list_opt RPAREN
        r   Nr   rA  r   )r   ru   re   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   r   Nr7  r   r=   r=   r>   p_block_item     (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   r   r=   r=   r>   p_block_item_list  s   :zCParser.p_block_item_listc                 C   s"   t j|d | |dd|d< dS )zA compound_statement : brace_open block_item_list_opt brace_close r   r   r   r   N)r   r   r   r   r=   r=   r>   p_compound_statement_1  s   
zCParser.p_compound_statement_1c                 C   s&   t |d |d | |d|d< dS )z6 labeled_statement : ID COLON pragmacomp_or_statement r   r   r   N)r   Labelr   r   r=   r=   r>   p_labeled_statement_1     &zCParser.p_labeled_statement_1c                 C   s(   t |d |d g| |d|d< dS )zL labeled_statement : CASE constant_expression COLON pragmacomp_or_statement r   r   r   r   N)r   Caser   r   r=   r=   r>   p_labeled_statement_2     (zCParser.p_labeled_statement_2c                 C   s"   t |d g| |d|d< dS )z; labeled_statement : DEFAULT COLON pragmacomp_or_statement r   r   r   N)r   Defaultr   r   r=   r=   r>   p_labeled_statement_3  s   "zCParser.p_labeled_statement_3c              	   C   s(   t |d |d d| |d|d< dS )zK selection_statement : IF LPAREN expression RPAREN pragmacomp_or_statement r   r  Nr   r   r   Ifr   r   r=   r=   r>   p_selection_statement_1  ry  zCParser.p_selection_statement_1c              	   C   s,   t |d |d |d | |d|d< dS )zZ selection_statement : IF LPAREN expression RPAREN statement ELSE pragmacomp_or_statement r   r     r   r   Nr|  r   r=   r=   r>   p_selection_statement_2  s   ,zCParser.p_selection_statement_2c              	   C   s*   t t|d |d | |d|d< dS )zO selection_statement : SWITCH LPAREN expression RPAREN pragmacomp_or_statement r   r  r   r   N)r   r   Switchr   r   r=   r=   r>   p_selection_statement_3  s   zCParser.p_selection_statement_3c                 C   r  )zN iteration_statement : WHILE LPAREN expression RPAREN pragmacomp_or_statement r   r  r   r   N)r   Whiler   r   r=   r=   r>   p_iteration_statement_1  rv  zCParser.p_iteration_statement_1c                 C   r  )zV iteration_statement : DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMI r  r   r   r   N)r   DoWhiler   r   r=   r=   r>   p_iteration_statement_2  rv  zCParser.p_iteration_statement_2c              
   C   s2   t |d |d |d |d | |d|d< dS )zx iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement r   r  r  	   r   r   N)r   Forr   r   r=   r=   r>   p_iteration_statement_3  s   2zCParser.p_iteration_statement_3c              
   C   sB   t t |d | |d|d |d |d | |d|d< dS )zp iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement r   r   r         r   N)r   r  DeclListr   r   r=   r=   r>   p_iteration_statement_4  s   zCParser.p_iteration_statement_4c                 C   s    t |d | |d|d< dS )z  jump_statement  : GOTO ID SEMI r   r   r   N)r   Gotor   r   r=   r=   r>   p_jump_statement_1      zCParser.p_jump_statement_1c                 C      t | |d|d< dS )z jump_statement  : BREAK SEMI r   r   N)r   Breakr   r   r=   r=   r>   p_jump_statement_2     zCParser.p_jump_statement_2c                 C   r  )z! jump_statement  : CONTINUE SEMI r   r   N)r   Continuer   r   r=   r=   r>   p_jump_statement_3  r  zCParser.p_jump_statement_3c                 C   s0   t t|dkr|d nd| |d|d< dS )z\ jump_statement  : RETURN expression SEMI
                            | RETURN SEMI
        r   r   Nr   r   )r   ReturnrJ   r   r   r=   r=   r>   p_jump_statement_4  r   zCParser.p_jump_statement_4c                 C   s6   |d du rt | |d|d< dS |d |d< dS )z, expression_statement : expression_opt SEMI r   Nr   r   )r   EmptyStatementr   r   r=   r=   r>   p_expression_statement  s   zCParser.p_expression_statementc                 C   sl   t |dkr|d |d< dS t|d tjs$t|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)rJ   rd   r   ExprListrS   r^  rG   r   r=   r=   r>   p_expression  s   zCParser.p_expressionc                 C   r   )z typedef_name : TYPEID r   rm   r   Nr   r   r=   r=   r>   p_typedef_name     $zCParser.p_typedef_namec                 C   F   t |dkr|d |d< dS 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)rJ   r   
AssignmentrS   r   r=   r=   r>   p_assignment_expression      *zCParser.p_assignment_expressionc                 C   r   )a   assignment_operator : EQUALS
                                | XOREQUAL
                                | TIMESEQUAL
                                | DIVEQUAL
                                | MODEQUAL
                                | PLUSEQUAL
                                | MINUSEQUAL
                                | LSHIFTEQUAL
                                | RSHIFTEQUAL
                                | ANDEQUAL
                                | OREQUAL
        r   r   Nr=   r   r=   r=   r>   p_assignment_operator.  s   zCParser.p_assignment_operatorc                 C   r   )z. constant_expression : conditional_expression r   r   Nr=   r   r=   r=   r>   p_constant_expression=  ri  zCParser.p_constant_expressionc                 C   sF   t |dkr|d |d< dS 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)rJ   r   	TernaryOprS   r   r=   r=   r>   p_conditional_expressionA  r  z CParser.p_conditional_expressionc                 C   r  )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)rJ   r   BinaryOprS   r   r=   r=   r>   p_binary_expressionJ  s   *zCParser.p_binary_expressionc                 C   r   )z$ cast_expression : unary_expression r   r   Nr=   r   r=   r=   r>   p_cast_expression_1d  ri  zCParser.p_cast_expression_1c                 C   r  )z; cast_expression : LPAREN type_name RPAREN cast_expression r   r   r   r   N)r   Castr   r   r=   r=   r>   p_cast_expression_2h  rv  zCParser.p_cast_expression_2c                 C   r   )z* unary_expression    : postfix_expression r   r   Nr=   r   r=   r=   r>   p_unary_expression_1l  ri  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   UnaryOprS   r   r=   r=   r>   p_unary_expression_2p  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  rJ   r   r   r=   r=   r>   p_unary_expression_3w  s
   
zCParser.p_unary_expression_3c                 C   r   )z unary_operator  : AND
                            | TIMES
                            | PLUS
                            | MINUS
                            | NOT
                            | LNOT
        r   r   Nr=   r   r=   r=   r>   p_unary_operator  s   zCParser.p_unary_operatorc                 C   r   )z* postfix_expression  : primary_expression r   r   Nr=   r   r=   r=   r>   p_postfix_expression_1  ri  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   ArrayRefrS   r   r=   r=   r>   p_postfix_expression_2  r  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   FuncCallrJ   rS   r   r=   r=   r>   p_postfix_expression_3  s   4zCParser.p_postfix_expression_3c                 C   s>   t |d | |d}t |d |d ||d j|d< dS )z postfix_expression  : postfix_expression PERIOD ID
                                | postfix_expression PERIOD TYPEID
                                | postfix_expression ARROW ID
                                | postfix_expression ARROW TYPEID
        r   r   r   r   N)r   r%  r   	StructRefrS   )r4   r   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
        r   r   r   r   Nr  r   r=   r=   r>   p_postfix_expression_5  rq  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   CompoundLiteralr   r=   r=   r>   p_postfix_expression_6  r-  zCParser.p_postfix_expression_6c                 C   r   )z" primary_expression  : identifier r   r   Nr=   r   r=   r=   r>   p_primary_expression_1  ri  zCParser.p_primary_expression_1c                 C   r   )z  primary_expression  : constant r   r   Nr=   r   r=   r=   r>   p_primary_expression_2  ri  zCParser.p_primary_expression_2c                 C   r   )zp primary_expression  : unified_string_literal
                                | unified_wstring_literal
        r   r   Nr=   r   r=   r=   r>   p_primary_expression_3  r
  zCParser.p_primary_expression_3c                 C   r   )z0 primary_expression  : LPAREN expression RPAREN r   r   Nr=   r   r=   r=   r>   p_primary_expression_4  ri  zCParser.p_primary_expression_4c                 C   sB   |  |d}tt|d |t|d |d g|||d< dS )za primary_expression  : OFFSETOF LPAREN type_name COMMA offsetof_member_designator RPAREN
        r   r   r  r   N)r   r   r  r%  r  )r4   r   rS   r=   r=   r>   p_primary_expression_5  s
   zCParser.p_primary_expression_5c                 C   s   t |dkr|d |d< dS t |dkr)t|d |d |d |d j|d< dS t |dkrAt|d |d |d j|d< dS tdt | )	z offsetof_member_designator : identifier
                                         | offsetof_member_designator PERIOD identifier
                                         | offsetof_member_designator LBRACKET expression RBRACKET
        r   r   r   r   r   r  z$Unexpected parsing state. len(p): %uN)rJ   r   r  rS   r  NotImplementedErrorr   r=   r=   r>   p_offsetof_member_designator  s   *$z$CParser.p_offsetof_member_designatorc                 C   rP  )z argument_expression_list    : assignment_expression
                                        | argument_expression_list COMMA assignment_expression
        r   r   r   r   N)rJ   r   r  rS   r^  rG   r   r=   r=   r>   p_argument_expression_list  rT  z"CParser.p_argument_expression_listc                 C   s    t |d | |d|d< dS )z identifier  : ID r   r   N)r   r%  r   r   r=   r=   r>   p_identifier  r  zCParser.p_identifierc                 C   s   d}d}|d dd D ]}|dv r|d7 }q|dv r|d7 }qd}|dkr*t d|d	kr2t d
d| d|  }t|d |d | |d|d< dS )z constant    : INT_CONST_DEC
                        | INT_CONST_OCT
                        | INT_CONST_HEX
                        | INT_CONST_BIN
                        | INT_CONST_CHAR
        r   r   NlL)uUr   z.Constant cannot have more than one u/U suffix.r   z.Constant cannot have more than two l/L suffix.z	unsigned zlong rl   )
ValueErrorr   Constantr   )r4   r   uCountlCountxr   prefixr=   r=   r>   p_constant_1  s"   
zCParser.p_constant_1c                 C   sh   d|d   v rd}n|d d dv rd}n|d d dv r!d}nd}t||d | |d|d	< d
S )zM constant    : FLOAT_CONST
                        | HEX_FLOAT_CONST
        r  r   floatrM   )fFr  zlong doubledoubler   N)lowerr   r  r   )r4   r   r   r=   r=   r>   p_constant_2  s   zCParser.p_constant_2c                 C   s"   t d|d | |d|d< dS )zH constant    : CHAR_CONST
                        | WCHAR_CONST
        charr   r   N)r   r  r   r   r=   r=   r>   p_constant_3  s   zCParser.p_constant_3c                 C   sf   t |dkrtd|d | |d|d< dS |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   NrM   )rJ   r   r  r   valuer   r=   r=   r>   p_unified_string_literal  s   (z CParser.p_unified_string_literalc                 C   sj   t |dkrtd|d | |d|d< dS |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   NrM   )rJ   r   r  r   r  rstripr   r=   r=   r>   p_unified_wstring_literal"  s   ,z!CParser.p_unified_wstring_literalc                 C   "   |d |d< | d|d dS )z  brace_open  :   LBRACE
        r   r   N
set_linenolinenor   r=   r=   r>   p_brace_open-     zCParser.p_brace_openc                 C   r  )z  brace_close :   RBRACE
        r   r   Nr  r   r=   r=   r>   p_brace_close3  r  zCParser.p_brace_closec                 C   r  )zempty : Nr   r=   r   r=   r=   r>   p_empty9  s   zCParser.p_emptyc                 C   sB   |r|  d|j | j|j| j|d d S |  d| jj d S )Nz
before: %s)r  r]   zAt end of input)rP   r  rZ   r  r,   find_tok_columnrA   r   r=   r=   r>   p_error=  s   
zCParser.p_errorN)r   r   )F)__name__
__module____qualname__r   r?   rC   rI   rL   rT   rU   rY   r(   r)   r*   r+   rb   rk   rx   r   r   r   r   
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/  r6  r=  r@  rH  rL  rN  rO  rS  rU  rX  rY  rZ  r\  r_  r`  ra  rb  rc  re  rf  rg  rh  rj  rk  rl  rm  rn  ro  rp  rr  rs  ru  rx  r{  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r=   r=   r=   r>   r      s`   
o	

	)7-Y	5<					&		





	








	
	

	

		
	
r   )replyr   r   r   c_lexerr   	plyparserr   r   r   r	   r
   ast_transformsr   r   r=   r=   r=   r>   <module>   s   