
    Mh*"                    ~    d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	m
Z
 d dlmZmZ e
 G d de                      ZdS )	   )yacc)c_ast)CLexer)	PLYParser
ParseErrorparameterizedtemplate)fix_switch_casesfix_atomic_specifiersc                   R   e Zd ZdedddddfdZddZd Zd	 Zd
 Zd Z	d Z
d Zd Zd Zd Zd Zd Zd ZddZddZd Zd ZdZd Zd Zd Zd Zd Zd Zd Zd  Zd! Zd" Z d# Z!d$ Z"d% Z#d& Z$d' Z%d( Z&d) Z'd* Z(d+ Z)d, Z*d- Z+d. Z,d/ Z-d0 Z.d1 Z/d2 Z0d3 Z1d4 Z2d5 Z3d6 Z4d7 Z5d8 Z6d9 Z7d: Z8d; Z9d< Z:d= Z;d> Z<d? Z=d@ Z>dA Z?dB Z@dC ZAdD ZBdE ZCdF ZDdG ZEdH ZFdI ZGdJ ZHdK ZIdL ZJdM ZKdN ZLdO ZMdP ZNdQ ZOdR ZPdS ZQdT ZRdU ZSdV ZTdW ZUdX ZVdY ZW eXdZd[d\          d]             ZY eXdZd[d\          d^             ZZ eXdZd[d\          d_             Z[ eXdZd[          d`             Z\ eXdZd[d\          da             Z] eXdZd[d\          db             Z^ eXdZd[d\          dc             Z_ eXdZd[d\          dd             Z`de Zadf Zbdg Zcdh Zddi Zedj Zfdk Zgdl Zhdm Zidn Zjdo Zkdp Zldq Zmdr Znds Zodt Zpdu Zqdv Zrdw Zsdx Ztdy Zudz Zvd{ Zwd| Zxd} Zyd~ Zzd Z{d Z|d Z}d Z~d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )CParserTzpycparser.lextabzpycparser.yacctabF c                 b    || j         | j        | j        | j                  | _        | j                            |||           | j        j        | _        g d}|D ]}	|                     |	           t          j        | 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rules
             R/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/pycparser/c_parser.py__init__zCParser.__init__   s    t E+33!7	9 9 9	 		!" 	 	$ 	$ 	$ i&
 
 
" # 	( 	(D!!$''''y-""$ $ $  "VVH $(       c                     || j         _        | j                                          t                      g| _        d| _        | j                            || j         |          S )a    Parses C code and returns an AST.

            text:
                A string containing the C source code

            filename:
                Name of the file being parsed (for meaningful
                error messages)

            debug:
                Debug flag to YACC
        N)inputr8   r(   )r.   filenamereset_linenor3   r4   r5   r2   parse)r6   textrD   r(   s       r?   rF   zCParser.parse   sb     &		   !VVH#' |!!i "   	rA   c                 R    | j                             t                                 d S N)r4   appendr3   r6   s    r?   _push_scopezCParser._push_scope   s#      (((((rA   c                 l    t          | j                  dk    sJ | j                                         d S )Nr   )lenr4   poprK   s    r?   
_pop_scopezCParser._pop_scope   s9    4$%%))))rA   c                     | j         d                             |d          s|                     d|z  |           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r4   get_parse_errorr6   namecoords      r?   _add_typedef_namezCParser._add_typedef_name   sf      $((t44 	/ "&'(-/ / / '+"d###rA   c                     | j         d                             |d          r|                     d|z  |           d| j         d         |<   dS )ze Add a new object, function, or enum member name (ie an ID) to the
            current scope
        rR   Fz;Non-typedef %r previously declared as typedef in this scopeNrS   rV   s      r?   _add_identifierzCParser._add_identifier   sf     R $$T511 	/ "&'(-/ / / ',"d###rA   c                 j    t          | j                  D ]}|                    |          }||c S dS )z8 Is *name* a typedef-name in the current scope?
        NF)reversedr4   rT   )r6   rW   scopein_scopes       r?   _is_type_in_scopezCParser._is_type_in_scope   sE     d/00 	5 	5E yyH#H___#urA   c                 Z    |                      ||                     ||                     d S rI   )rU   _coord)r6   msglinecolumns       r?   r*   zCParser._lex_error_func   s,    #t{{48899999rA   c                 .    |                                   d S rI   )rL   rK   s    r?   r+   zCParser._lex_on_lbrace_func   s    rA   c                 .    |                                   d S rI   )rP   rK   s    r?   r,   zCParser._lex_on_rbrace_func   s    rA   c                 0    |                      |          }|S )z Looks up types that were previously defined with
            typedef.
            Passed to the lexer for recognizing identifiers that
            are types.
        )r`   )r6   rW   is_types      r?   r-   zCParser._lex_type_lookup_func   s     ((..rA   c                     | 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_tokenrK   s    r?   _get_yacc_lookahead_tokenz!CParser._get_yacc_lookahead_token   s    
 y##rA   c                 2   |}|}|j         r|j         }|j         t          |t          j                  r	||_         |S |}t          |j         t          j                  s&|j         }t          |j         t          j                  &|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)r6   declmodifiermodifier_headmodifier_tail	decl_tails         r?   _type_modify_declzCParser._type_modify_decl   s     !    	/).M   	/ dEN++ 	!%MO
 I @@ +%N	 !@@ + "+M*INKrA   c                    |}t          |t          j                  s!|j        }t          |t          j                  !|j        |_        |j        dd         |_        |D ]V}t          |t          j                  s:t          |          dk    r| 	                    d|j
                   K||_        |c S W|s\t          |j        t          j                  s| 	                    d|j
                   t          j        dg|j
                  |_        n0t          j        d |D             |d         j
                  |_        |S )	z- Fixes a declaration. Modifies decl.
        Nr   z Invalid multiple types specifiedzMissing type in declarationintrX   c                 &    g | ]}|j         D ]}|S  )names).0idrW   s      r?   
<listcomp>z/CParser._fix_decl_name_type.<locals>.<listcomp>S  s'    >>>"RX>>T>>>>rA       )ro   r   rp   rn   declnamerW   qualsIdentifierTyperN   rU   rX   FuncDecl)r6   rq   typenamern   tns        r?   _fix_decl_name_typezCParser._fix_decl_name_type+  ss   
 T5>22 	9D T5>22 	 M	Z]
  	  	 Bb%"677  x==1$$%%:BHF F F F !#DIKKK   	) di88 C!!5tzC C C,G*& & &DII ,>>>>>qk') ) )DI rA   c                     |pt          g g g g g           }|r||                             |           n||                             d|           |S )a   Declaration specifiers are represented by a dictionary
            with the entries:
            * qual: a list of type qualifiers
            * storage: a list of storage type qualifiers
            * type: a list of type specifiers
            * function: a list of function specifiers
            * alignment: a list of alignment specifiers

            This method is given a declaration specifier, and a
            new specifier of a given kind.
            If `append` is True, the new specifier is added to the end of
            the specifiers list, otherwise it's added at the beginning.
            Returns the declaration specifier, with the new
            specifier incorporated.
        )qualstoragern   function	alignmentr   )r3   rJ   insert)r6   declspecnewspeckindrJ   specs         r?   _add_declaration_specifierz"CParser._add_declaration_specifierW  sd      X4R"rUWXXX 	*Jg&&&&Ja)))rA   c                    d|d         v }g }|d                              d          n|d         d         t          |d                   dk     sPt          |d         d	         j                  d
k    s,|                     |d         d	         j        d                   s<d}|d         D ]}t	          |d          r	|j        } n|                     d|           t          j        |d         d	         j        d         dd|d         |d         d	         j                  |d         d<   |d         d	= nt          |d         d         t          j
        t          j        t          j        t          j        f          sw|d         d         }t          |t          j                  s!|j        }t          |t          j                  !|j        '|d         d	         j        d         |_        |d         d	= |D ]{}	|	d         J |r7t          j        d|d         |d         |	d         |	d         j                  }
nlt          j        d|d         |d         |d         |d         |	d         |	                     d          |	                     d          |	d         j        	  	        }
t          |
j        t          j
        t          j        t          j        t          j        f          r|
}n|                     |
|d                   }|rC|r!|                     |j        |j                   n |                     |j        |j                   t-          |          }|                    |           }|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   bitsizeNrq   rn      rR   r   ?rX   zInvalid declarationr   r   rn   r   alignrX   r   )rW   r   r   rn   rX   r   init	rW   r   r   r   funcspecrn   r   r   rX   )rT   rN   r|   r`   hasattrrX   rU   r   rp   ro   EnumStructUnionr   rn   r   TypedefDeclr   rY   rW   r[   r   rJ   )r6   r   declstypedef_namespace
is_typedefdeclarationsrX   tdecls_0_tailrq   declaration
fixed_decls               r?   _build_declarationszCParser._build_declarationsp  s    $y/1
 8<<	"". 1Xf%4<  1$$DL,<,B(C(Cq(H(H..tF|B/?/Ea/HII )If  Aq'**  ! !!"7???  %~fb)/2;'6l2&, .  .  .E!HV VR   E!HV,
EL%+u7K/M N N 	% 8F+L u~>> 1+0 !u~>> 1$,(,VR(8(>q(A%L$ %	, %	,D<+++ .#mv, Ofv,,. . . $jv,{+ O!*-f&)) HHY//v,,	. 	. 	. +*Jek(-* + + Q )

!55k4<PP
 ! L L**:?J<LMMMM((*:JKKK.z::J
++++rA   c                     d|d         v r|                      d|j                   |                     |t          |d          gd          d         }t	          j        ||||j        	          S )
z' Builds a function definition.
        r   r   zInvalid typedefNrq   r   Tr   r   r   r   )rq   param_declsbodyrX   )rU   rX   r   r3   r   FuncDef)r6   r   rq   r   r   r   s         r?   _build_function_definitionz"CParser._build_function_definition  s     Y''/<<<..T---." / $ $ %&'
 }#*	   	rA   c                 >    |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   )r6   tokens     r?   _select_struct_union_classz"CParser._select_struct_union_class  s     H<;rA   )
)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                     |d         t          j        g           |d<   dS t          j        |d                   |d<   dS )zh translation_unit_or_empty   : translation_unit
                                        | empty
        r   Nr   )r   FileASTr6   ps     r?   p_translation_unit_or_emptyz#CParser.p_translation_unit_or_empty  s?     Q4<=$$AaDDD=1&&AaDDDrA   c                     |d         |d<   dS )z4 translation_unit    : external_declaration
        r   r   Nr{   r   s     r?   p_translation_unit_1zCParser.p_translation_unit_1       t!rA   c                 ^    |d                              |d                    |d         |d<   dS )zE translation_unit    : translation_unit external_declaration
        r   r   r   N)extendr   s     r?   p_translation_unit_2zCParser.p_translation_unit_2  s/     	
!AaDt!rA   c                     |d         g|d<   dS )z7 external_declaration    : function_definition
        r   r   Nr{   r   s     r?   p_external_declaration_1z CParser.p_external_declaration_1       !v!rA   c                     |d         |d<   dS )z/ external_declaration    : declaration
        r   r   Nr{   r   s     r?   p_external_declaration_2z CParser.p_external_declaration_2       t!rA   c                     |d         g|d<   dS )zi external_declaration    : pp_directive
                                    | pppragma_directive
        r   r   Nr{   r   s     r?   p_external_declaration_3z CParser.p_external_declaration_3  s     !v!rA   c                     g |d<   dS )z( external_declaration    : SEMI
        r   Nr{   r   s     r?   p_external_declaration_4z CParser.p_external_declaration_4%  s     !rA   c                     |d         |d<   dS )z1 external_declaration    : static_assert
        r   r   Nr{   r   s     r?   p_external_declaration_5z CParser.p_external_declaration_5*  r   rA   c                    t          |          dk    r6t          j        |d         d|                     |d                    g|d<   dS t          j        |d         |d         |                     |d                    g|d<   dS )z static_assert           : _STATIC_ASSERT LPAREN constant_expression COMMA unified_string_literal RPAREN
                                    | _STATIC_ASSERT LPAREN constant_expression RPAREN
              Nr   r   )rN   r   StaticAssert_token_coordr   s     r?   p_static_assert_declarationz#CParser.p_static_assert_declaration/  s}     q66Q;;&qtT43D3DQ3J3JKKLAaDDD&qtQqT43D3DQ3J3JKKLAaDDDrA   c                 Z    |                      d|                     |d                     dS )z  pp_directive  : PPHASH
        zDirectives not supported yetr   N)rU   r   r   s     r?   p_pp_directivezCParser.p_pp_directive8  s<     	8++Aq11	3 	3 	3 	3 	3rA   c                 z   t          |          dk    r4t          j        |d         |                     |d                    |d<   dS t          |          dk    r4t          j        |d         |                     |d                    |d<   dS t          j        d|                     |d                    |d<   dS )z pppragma_directive      : PPPRAGMA
                                    | PPPRAGMA PPPRAGMASTR
                                    | _PRAGMA LPAREN unified_string_literal RPAREN
        r   r   r   r   r   r   N)rN   r   Pragmar   r   s     r?   p_pppragma_directivezCParser.p_pppragma_directiveC  s    
 q66Q;;<!d&7&71&=&=>>AaDDDVVq[[<!d&7&71&=&=>>AaDDD<D$5$5a$;$;<<AaDDDrA   c                 h    t          |          dk    r	|d         gn|d         |d         gz   |d<   dS )z pppragma_directive_list : pppragma_directive
                                    | pppragma_directive_list pppragma_directive
        r   r   r   NrN   r   s     r?   p_pppragma_directive_listz!CParser.p_pppragma_directive_listO  7     Q1!vv!A$!A$-!rA   c                     t          g g g t          j        dg|                     |d                    gg           }|                     ||d         |d         |d                   |d<   d	S )
zU function_definition : id_declarator declaration_list_opt compound_statement
        rx   r   ry   r   r   r   rn   r   r   r   r   rq   r   r   r   N)r3   r   r   r   r   r6   r   r   s      r?   p_function_definition_1zCParser.p_function_definition_1W  s     &w-1->->q!-D-DF F F G   ..1!1	 /  !rA   c                 r    |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   s      r?   p_function_definition_2zCParser.p_function_definition_2i  sG     t..1!1	 /  !rA   c                     |d         |d<   dS )a_   statement   : labeled_statement
                        | expression_statement
                        | compound_statement
                        | selection_statement
                        | iteration_statement
                        | jump_statement
                        | pppragma_directive
                        | static_assert
        r   r   Nr{   r   s     r?   p_statementzCParser.p_statementx  s     t!rA   c                     t          |          dk    r?t          j        |d         |d         gz   |                     |d                    |d<   dS |d         |d<   dS )z} pragmacomp_or_statement     : pppragma_directive_list statement
                                        | statement
        r   r   r   block_itemsrX   r   N)rN   r   Compoundr   r   s     r?   p_pragmacomp_or_statementz!CParser.p_pragmacomp_or_statement  sh     q66Q;;>aD!A$K''1--/ / /AaDDD Q4AaDDDrA   c                    |d         }|d         |d         }t           j        t           j        t           j        f}t	          |          dk    r^t          |d         |          rHt          j        d|d         |d         |d         |d	         |d         dd|d         j        
	  	        g}nG|                     |t          dd          gd          }n|                     ||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   Nrn   r   r   r   r   r   r   r   Tr   )
r   r   r   r   rN   ro   r   rX   r   r3   )r6   r   r   tys_u_or_er   s         r?   p_decl_bodyzCParser.p_decl_body  s    t Q4<
 fBek5:>H2ww!||
2a5( ; ;|v,{+ O!*-A Q%+	' 	' 	' 	(" 00T5556&* 1 , , ,,d"& - ( (E
 !rA   c                     |d         |d<   dS )z& declaration : decl_body SEMI
        r   r   Nr{   r   s     r?   p_declarationzCParser.p_declaration   r   rA   c                 d    t          |          dk    r|d         n|d         |d         z   |d<   dS )zj declaration_list    : declaration
                                | declaration_list declaration
        r   r   r   Nr   r   s     r?   p_declaration_listzCParser.p_declaration_list	  s3     1vv{{qtt!qt!rA   c                 R    |                      |d         |d         d          |d<   dS )z] declaration_specifiers_no_type  : type_qualifier declaration_specifiers_no_type_opt
        r   r   r   r   Nr   r   s     r?   "p_declaration_specifiers_no_type_1z*CParser.p_declaration_specifiers_no_type_1  +     ..qtQqT6BB!rA   c                 R    |                      |d         |d         d          |d<   dS )zf declaration_specifiers_no_type  : storage_class_specifier declaration_specifiers_no_type_opt
        r   r   r   r   Nr  r   s     r?   "p_declaration_specifiers_no_type_2z*CParser.p_declaration_specifiers_no_type_2  s+     ..qtQqT9EE!rA   c                 R    |                      |d         |d         d          |d<   dS )za declaration_specifiers_no_type  : function_specifier declaration_specifiers_no_type_opt
        r   r   r   r   Nr  r   s     r?   "p_declaration_specifiers_no_type_3z*CParser.p_declaration_specifiers_no_type_3  s+     ..qtQqT:FF!rA   c                 R    |                      |d         |d         d          |d<   dS )z_ declaration_specifiers_no_type  : atomic_specifier declaration_specifiers_no_type_opt
        r   r   rn   r   Nr  r   s     r?   "p_declaration_specifiers_no_type_4z*CParser.p_declaration_specifiers_no_type_4%  r
  rA   c                 R    |                      |d         |d         d          |d<   dS )zb declaration_specifiers_no_type  : alignment_specifier declaration_specifiers_no_type_opt
        r   r   r   r   Nr  r   s     r?   "p_declaration_specifiers_no_type_5z*CParser.p_declaration_specifiers_no_type_5*  +     ..qtQqT;GG!rA   c                 V    |                      |d         |d         dd          |d<   dS )zI declaration_specifiers  : declaration_specifiers type_qualifier
        r   r   r   TrJ   r   Nr  r   s     r?   p_declaration_specifiers_1z"CParser.p_declaration_specifiers_1/  0     ..qtQqT6$.OO!rA   c                 V    |                      |d         |d         dd          |d<   dS )zR declaration_specifiers  : declaration_specifiers storage_class_specifier
        r   r   r   Tr  r   Nr  r   s     r?   p_declaration_specifiers_2z"CParser.p_declaration_specifiers_24  s0     ..qtQqT9T.RR!rA   c                 V    |                      |d         |d         dd          |d<   dS )zM declaration_specifiers  : declaration_specifiers function_specifier
        r   r   r   Tr  r   Nr  r   s     r?   p_declaration_specifiers_3z"CParser.p_declaration_specifiers_39  s0     ..qtQqT:d.SS!rA   c                 V    |                      |d         |d         dd          |d<   dS )zS declaration_specifiers  : declaration_specifiers type_specifier_no_typeid
        r   r   rn   Tr  r   Nr  r   s     r?   p_declaration_specifiers_4z"CParser.p_declaration_specifiers_4>  r  rA   c                 F    |                      d|d         d          |d<   dS )z2 declaration_specifiers  : type_specifier
        Nr   rn   r   r  r   s     r?   p_declaration_specifiers_5z"CParser.p_declaration_specifiers_5C  '     ..tQqT6BB!rA   c                 V    |                      |d         |d         dd          |d<   dS )zQ declaration_specifiers  : declaration_specifiers_no_type type_specifier
        r   r   rn   Tr  r   Nr  r   s     r?   p_declaration_specifiers_6z"CParser.p_declaration_specifiers_6H  r  rA   c                 V    |                      |d         |d         dd          |d<   dS )zN declaration_specifiers  : declaration_specifiers alignment_specifier
        r   r   r   Tr  r   Nr  r   s     r?   p_declaration_specifiers_7z"CParser.p_declaration_specifiers_7M  s0     ..qtQqT;t.TT!rA   c                     |d         |d<   dS )a   storage_class_specifier : AUTO
                                    | REGISTER
                                    | STATIC
                                    | EXTERN
                                    | TYPEDEF
                                    | _THREAD_LOCAL
        r   r   Nr{   r   s     r?   p_storage_class_specifierz!CParser.p_storage_class_specifierR       t!rA   c                     |d         |d<   dS )zR function_specifier  : INLINE
                                | _NORETURN
        r   r   Nr{   r   s     r?   p_function_specifierzCParser.p_function_specifier\  r   rA   c                 n    t          j        |d         g|                     |d                    |d<   dS )a+   type_specifier_no_typeid  : VOID
                                      | _BOOL
                                      | CHAR
                                      | SHORT
                                      | INT
                                      | LONG
                                      | FLOAT
                                      | DOUBLE
                                      | _COMPLEX
                                      | SIGNED
                                      | UNSIGNED
                                      | __INT128
        r   ry   r   Nr   r   r   r   s     r?   p_type_specifier_no_typeidz"CParser.p_type_specifier_no_typeidb  s7     #QqTF$2C2CAq2I2IJJJ!rA   c                     |d         |d<   dS )z type_specifier  : typedef_name
                            | enum_specifier
                            | struct_or_union_specifier
                            | type_specifier_no_typeid
                            | atomic_specifier
        r   r   Nr{   r   s     r?   p_type_specifierzCParser.p_type_specifierr  s     t!rA   c                 T    |d         }|j                             d           ||d<   dS )z= atomic_specifier  : _ATOMIC LPAREN type_name RPAREN
        r   _Atomicr   N)r   rJ   )r6   r   typs      r?   p_atomic_specifierzCParser.p_atomic_specifier|  s0     d	###!rA   c                     |d         |d<   dS )z type_qualifier  : CONST
                            | RESTRICT
                            | VOLATILE
                            | _ATOMIC
        r   r   Nr{   r   s     r?   p_type_qualifierzCParser.p_type_qualifier  s     t!rA   c                 h    t          |          dk    r|d         |d         gz   n|d         g|d<   dS )z init_declarator_list    : init_declarator
                                    | init_declarator_list COMMA init_declarator
        r   r   r   r   Nr   r   s     r?   p_init_declarator_listzCParser.p_init_declarator_list  7     !$A!qtqtf}}!A$!rA   c                 p    t          |d         t          |          dk    r|d         nd          |d<   dS )zb init_declarator : declarator
                            | declarator EQUALS initializer
        r   r   r   Nr   r   r3   rN   r   s     r?   p_init_declaratorzCParser.p_init_declarator  8     1SVVaZZQqTTTCCC!rA   c                 h    t          |          dk    r|d         |d         gz   n|d         g|d<   dS )z id_init_declarator_list    : id_init_declarator
                                       | id_init_declarator_list COMMA init_declarator
        r   r   r   r   Nr   r   s     r?   p_id_init_declarator_listz!CParser.p_id_init_declarator_list  r7  rA   c                 p    t          |d         t          |          dk    r|d         nd          |d<   dS )zn id_init_declarator : id_declarator
                               | id_declarator EQUALS initializer
        r   r   r   Nr   r   r9  r   s     r?   p_id_init_declaratorzCParser.p_id_init_declarator  r;  rA   c                 V    |                      |d         |d         dd          |d<   dS )zY specifier_qualifier_list    : specifier_qualifier_list type_specifier_no_typeid
        r   r   rn   Tr  r   Nr  r   s     r?   p_specifier_qualifier_list_1z$CParser.p_specifier_qualifier_list_1  r  rA   c                 V    |                      |d         |d         dd          |d<   dS )zO specifier_qualifier_list    : specifier_qualifier_list type_qualifier
        r   r   r   Tr  r   Nr  r   s     r?   p_specifier_qualifier_list_2z$CParser.p_specifier_qualifier_list_2  r  rA   c                 F    |                      d|d         d          |d<   dS )z4 specifier_qualifier_list  : type_specifier
        Nr   rn   r   r  r   s     r?   p_specifier_qualifier_list_3z$CParser.p_specifier_qualifier_list_3  r   rA   c                 N    t          |d         g g |d         gg           |d<   dS )zH specifier_qualifier_list  : type_qualifier_list type_specifier
        r   r   r   r   Nr3   r   s     r?   p_specifier_qualifier_list_4z$CParser.p_specifier_qualifier_list_4  s.     1RqtfrRRR!rA   c                 B    t          g |d         gg g g           |d<   dS )z9 specifier_qualifier_list  : alignment_specifier
        r   r   r   NrG  r   s     r?   p_specifier_qualifier_list_5z$CParser.p_specifier_qualifier_list_5  s*     !vrRPPP!rA   c                 R    |                      |d         |d         d          |d<   dS )zR specifier_qualifier_list  : specifier_qualifier_list alignment_specifier
        r   r   r   r   Nr  r   s     r?   p_specifier_qualifier_list_6z$CParser.p_specifier_qualifier_list_6  r  rA   c                     |                      |d                   } ||d         d|                     |d                    |d<   dS )z{ struct_or_union_specifier   : struct_or_union ID
                                        | struct_or_union TYPEID
        r   r   NrW   r   rX   r   )r   r   r6   r   klasss      r?   p_struct_or_union_specifier_1z%CParser.p_struct_or_union_specifier_1  sV     //!55u1##Aq))+ + +!rA   c                    |                      |d                   }t          |          dk    r' |dg |                     |d                    |d<   dS  |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   rN  r   r   r   rN   r   rO  s      r?   p_struct_or_union_specifier_2z%CParser.p_struct_or_union_specifier_2  s     //!55q66Q;;5''1--/ / /AaDDD
 5d''1--/ / /AaDDDrA   c                    |                      |d                   }t          |          dk    r- ||d         g |                     |d                    |d<   dS  ||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   rN  r   r   NrS  rO  s      r?   p_struct_or_union_specifier_3z%CParser.p_struct_or_union_specifier_3  s     //!55q66Q;;5qT''1--/ / /AaDDD
 5qTd''1--/ / /AaDDDrA   c                     |d         |d<   dS )zF struct_or_union : STRUCT
                            | UNION
        r   r   Nr{   r   s     r?   p_struct_or_unionzCParser.p_struct_or_union  r   rA   c                 v    t          |          dk    r|d         pg |d<   dS |d         |d         pg z   |d<   dS )z struct_declaration_list     : struct_declaration
                                        | struct_declaration_list struct_declaration
        r   r   r   Nr   r   s     r?   p_struct_declaration_listz!CParser.p_struct_declaration_list  sF     q66Q;;Q4:2AaDDDQ41Q4:2&AaDDDrA   c                    |d         }d|d         vsJ |d         |                      ||d                   }nt          |d                   dk    rf|d         d         }t          |t          j                  r|}nt          j        |          }|                      |t          |	          g          }n'|                      |t          dd
          g          }||d<   dS )zW struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI
        r   r   r   r   Nr   r   rn   r   rq   r   )r   rN   ro   r   Noder   r3   )r6   r   r   r   node	decl_types         r?   p_struct_declaration_1zCParser.p_struct_declaration_1
  s    tY////Q4,,d -  EE f!## <?D$
++ 7 		!066	,,+++, - . .EE ,,D1112 - 4 4E !rA   c                     d|d<   dS )z# struct_declaration : SEMI
        Nr   r{   r   s     r?   p_struct_declaration_2zCParser.p_struct_declaration_20  s     !rA   c                     |d         g|d<   dS )z1 struct_declaration : pppragma_directive
        r   r   Nr{   r   s     r?   p_struct_declaration_3zCParser.p_struct_declaration_35  r   rA   c                 h    t          |          dk    r|d         |d         gz   n|d         g|d<   dS )z struct_declarator_list  : struct_declarator
                                    | struct_declarator_list COMMA struct_declarator
        r   r   r   r   Nr   r   s     r?   p_struct_declarator_listz CParser.p_struct_declarator_list:  r7  rA   c                 "    |d         dd|d<   dS )z( struct_declarator : declarator
        r   Nrq   r   r   r{   r   s     r?   p_struct_declarator_1zCParser.p_struct_declarator_1C  s     !..!rA   c                     t          |          dk    r|d         |d         d|d<   dS t          j        dddd          |d         d|d<   dS )z struct_declarator   : declarator COLON constant_expression
                                | COLON constant_expression
        r   r   ri  r   Nr   )rN   r   rp   r   s     r?   p_struct_declarator_2zCParser.p_struct_declarator_2H  sZ     q66A::aDQqT22AaDDD!N4tTBBqQRtTTAaDDDrA   c                 l    t          j        |d         d|                     |d                    |d<   dS )zM enum_specifier  : ENUM ID
                            | ENUM TYPEID
        r   Nr   r   r   r   r   r   s     r?   p_enum_specifier_1zCParser.p_enum_specifier_1Q  s3     z!A$d&7&71&=&=>>!rA   c                 l    t          j        d|d         |                     |d                    |d<   dS )zG enum_specifier  : ENUM brace_open enumerator_list brace_close
        Nr   r   r   rn  r   s     r?   p_enum_specifier_2zCParser.p_enum_specifier_2W  s3     z$!d&7&71&=&=>>!rA   c                 x    t          j        |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   Nrn  r   s     r?   p_enum_specifier_3zCParser.p_enum_specifier_3\  s7     z!A$!d&7&71&=&=>>!rA   c                 &   t          |          dk    r,t          j        |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)rN   r   EnumeratorListrX   enumeratorsrJ   r   s     r?   p_enumerator_listzCParser.p_enumerator_listb  s    
 q66Q;;'1!
;;AaDDDVVq[[Q4AaDDDaD##AaD)))Q4AaDDDrA   c                 j    t          j        |d         |                     |d                    |d<   dS )z alignment_specifier  : _ALIGNAS LPAREN type_name RPAREN
                                 | _ALIGNAS LPAREN constant_expression RPAREN
        r   r   r   N)r   Alignasr   r   s     r?   p_alignment_specifierzCParser.p_alignment_specifiero  s1     }QqT4#4#4Q#:#:;;!rA   c                 D   t          |          dk    r1t          j        |d         d|                     |d                    }n6t          j        |d         |d         |                     |d                    }|                     |j        |j                   ||d<   dS )zR enumerator  : ID
                        | ID EQUALS constant_expression
        r   r   Nr   r   )rN   r   
Enumeratorr   r[   rW   rX   )r6   r   
enumerators      r?   p_enumeratorzCParser.p_enumeratoru  s     q66Q;;)!d))!Q//1 1JJ )!ad))!Q//1 1J 	Z_j.>???!rA   c                     |d         |d<   dS )zQ declarator  : id_declarator
                        | typeid_declarator
        r   r   Nr{   r   s     r?   p_declaratorzCParser.p_declarator  r   rA   )r~   ID)typeidTYPEID)typeid_noparenr  c                     |d         |d<   dS )z1 xxx_declarator  : direct_xxx_declarator
        r   r   Nr{   r   s     r?   p_xxx_declarator_1zCParser.p_xxx_declarator_1  r   rA   c                 P    |                      |d         |d                   |d<   dS )z9 xxx_declarator  : pointer direct_xxx_declarator
        r   r   r   Nrv   r   s     r?   p_xxx_declarator_2zCParser.p_xxx_declarator_2  s)     %%adAaD11!rA   c           
      r    t          j        |d         ddd|                     |d                    |d<   dS )z' direct_xxx_declarator   : yyy
        r   Nr   r   )r   rp   r   r   s     r?   p_direct_xxx_declarator_1z!CParser.p_direct_xxx_declarator_1  sE     ~qT##Aq))+ + +!rA   c                     |d         |d<   dS )z@ direct_xxx_declarator   : LPAREN xxx_declarator RPAREN
        r   r   Nr{   r   s     r?   p_direct_xxx_declarator_2z!CParser.p_direct_xxx_declarator_2  r   rA   c                    t          |          dk    r|d         ng pg }t          j        dt          |          dk    r|d         n|d         ||d         j                  }|                     |d         |          |d<   dS )	z} direct_xxx_declarator   : direct_xxx_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
        r   r   Nr   r   rn   dim	dim_qualsrX   rq   rr   r   )rN   r   	ArrayDeclrX   rv   )r6   r   r   arrs       r?   p_direct_xxx_declarator_3z!CParser.p_direct_xxx_declarator_3  s     Q!12 oA

!!A$*	   %%1Q4#%>>!rA   c                     d |d         |d         fD             }d |D             }t          j        d|d         ||d         j                  }|                     |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                 B    g | ]}t          |t                    r|n|gS r{   ro   list)r}   items     r?   r   z5CParser.p_direct_xxx_declarator_4.<locals>.<listcomp>  s=     % % % !+4 6 6BTF % % %rA   r   r   c                      g | ]}|D ]}||S rI   r{   )r}   sublistr   s      r?   r   z5CParser.p_direct_xxx_declarator_4.<locals>.<listcomp>  s8     ! ! !g' ! !$ rA   Nr   r   r  r  r   r   r  rX   rv   )r6   r   listed_qualsr  r  s        r?   p_direct_xxx_declarator_4z!CParser.p_direct_xxx_declarator_4  s    % %1ad% % %! ! ! ! !	o!A$*	   %%1Q4#%>>!rA   c           
         t          j        dt          j        |d         |                     |d                    |d         |d         ng |d         j                  }|                     |d         |          |d<   dS )zi direct_xxx_declarator   : direct_xxx_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET
        Nr   r   r   r  r  r   r   r  r  r   rX   rv   r6   r   r  s      r?   p_direct_xxx_declarator_5z!CParser.p_direct_xxx_declarator_5  s     o1t00A6677d.addBA$*	   %%1Q4#%>>!rA   c                 t   t          j        |d         d|d         j                  }|                                 j        dk    rR|j        K|j        j        D ]>}t          |t           j                  r n!| 	                    |j
        |j                   ?|                     |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   argsrn   rX   LBRACEr  r   )r   r   rX   rl   rn   r  paramsro   EllipsisParamr[   rW   rv   )r6   r   funcparams       r?   p_direct_xxx_declarator_6z!CParser.p_direct_xxx_declarator_6  s    
 ~1A$*    ))++0H<<y$!Y- B BE!%)<==Duu((U[AAAA%%1Q4$%??!rA   c                    |                      |d          }t          j        |d         pg d|          }t          |          dk    r1|d         }|j        |j        }|j        ||_        |d         |d<   dS ||d<   dS )zm pointer : TIMES type_qualifier_list_opt
                    | TIMES type_qualifier_list_opt pointer
        r   r   N)r   rn   rX   r   r   )r   r   PtrDeclrN   rn   )r6   r   rX   nested_type	tail_types        r?   	p_pointerzCParser.p_pointer  s     !!!Q''  m!A$*"4uMMMq66A::!I.,%N	 .,(INQ4AaDDDAaDDDrA   c                 h    t          |          dk    r	|d         gn|d         |d         gz   |d<   dS )zs type_qualifier_list : type_qualifier
                                | type_qualifier_list type_qualifier
        r   r   r   Nr   r   s     r?   p_type_qualifier_listzCParser.p_type_qualifier_list  r   rA   c                     t          |          dk    rF|d         j                            t          j        |                     |d                               |d         |d<   dS )zn parameter_type_list : parameter_list
                                | parameter_list COMMA ELLIPSIS
        r   r   r   r   N)rN   r  rJ   r   r  r   r   s     r?   p_parameter_type_listzCParser.p_parameter_type_list  sY     q66A::aDKu243D3DQ3J3JKKLLLt!rA   c                     t          |          dk    r,t          j        |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rN   r   	ParamListrX   r  rJ   r   s     r?   p_parameter_listzCParser.p_parameter_list#  g     q66Q;;?AaD61Q4:66AaDDDaDKqt$$$Q4AaDDDrA   c                     |d         }|d         s/t          j        dg|                     |d                    g|d<   |                     |t	          |d                   g          d         |d<   d	S )
z parameter_declaration   : declaration_specifiers id_declarator
                                    | declaration_specifiers typeid_noparen_declarator
        r   rn   rx   ry   r   r]  r\  r   N)r   r   r   r   r3   r   s      r?   p_parameter_declaration_1z!CParser.p_parameter_declaration_17  s     tF| 	0!0%''1--/ / / 0DL''QqT???# ( % %%&(!rA   c                    |d         }|d         s/t          j        dg|                     |d                    g|d<   t          |d                   dk    rt          |d         d         j                  dk    r`|                     |d         d         j        d                   r4|                     |t          |d         d	          g
          d         }nnt          j        d|d         d|d         pt          j	        dddd          |                     |d                    }|d         }| 
                    ||          }||d<   dS )zR parameter_declaration   : declaration_specifiers abstract_declarator_opt
        r   rn   rx   ry   rR   r   r   Nr   r\  r   r   rW   r   r   rn   rX   )r   r   r   rN   r|   r`   r   r3   Typenamerp   r   )r6   r   r   rq   r   s        r?   p_parameter_declaration_2z!CParser.p_parameter_declaration_2C  sn    tF| 	0!0%''1--/ / / 0DL tF|q  Sfb)9)?%@%@A%E%E&&tF|B'7'=a'@AA &F++QqT5556 , 8 889;DD >6lqTCU^D$dCC''1--/ / /D F|H++D(;;D!rA   c                     t          |          dk    r,t          j        |d         g|d         j                  |d<   dS |d         j                            |d                    |d         |d<   dS )ze identifier_list : identifier
                            | identifier_list COMMA identifier
        r   r   r   r   Nr  r   s     r?   p_identifier_listzCParser.p_identifier_listc  r  rA   c                     |d         |d<   dS )z- initializer : assignment_expression
        r   r   Nr{   r   s     r?   p_initializer_1zCParser.p_initializer_1m  r   rA   c                     |d         .t          j        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   s     r?   p_initializer_2zCParser.p_initializer_2r  sG     Q4<>"d&7&71&=&=>>AaDDDQ4AaDDDrA   c                    t          |          dk    rW|d         |d         n t          j        |d         |d                   }t          j        |g|d         j                  |d<   dS |d         |d         n t          j        |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   )rN   r   NamedInitializerr  rX   exprsrJ   )r6   r   r   s      r?   p_initializer_listzCParser.p_initializer_list{  s     q66Q;;Q4<1Q44U-CAaD!A$-O-OD>4&!A$*55AaDDDQ4<1Q44U-CAaD!A$-O-ODaDJd###Q4AaDDDrA   c                     |d         |d<   dS )z. designation : designator_list EQUALS
        r   r   Nr{   r   s     r?   p_designationzCParser.p_designation  r   rA   c                 h    t          |          dk    r	|d         gn|d         |d         gz   |d<   dS )z_ designator_list : designator
                            | designator_list designator
        r   r   r   Nr   r   s     r?   p_designator_listzCParser.p_designator_list  r   rA   c                     |d         |d<   dS )zi designator  : LBRACKET constant_expression RBRACKET
                        | PERIOD identifier
        r   r   Nr{   r   s     r?   p_designatorzCParser.p_designator  r   rA   c                    t          j        d|d         d         dd         d|d         pt          j        dddd          |                     |d                    }|                     ||d         d                   |d<   dS )	zH type_name   : specifier_qualifier_list abstract_declarator_opt
        r   r   r   Nr   r  rn   r   )r   r  rp   r   r   )r6   r   r   s      r?   p_type_namezCParser.p_type_name  s     >A$v,qqq/1?dD$??##Aq))+ + + ''!A$v,??!rA   c                 t    t          j        dddd          }|                     ||d                   |d<   dS )z+ abstract_declarator     : pointer
        Nr   r  r   )r   rp   rv   )r6   r   	dummytypes      r?   p_abstract_declarator_1zCParser.p_abstract_declarator_1  sE     N4tT::	%%qT &  !rA   c                 P    |                      |d         |d                   |d<   dS )zF abstract_declarator     : pointer direct_abstract_declarator
        r   r   r   Nr  r   s     r?   p_abstract_declarator_2zCParser.p_abstract_declarator_2  s)     %%adAaD11!rA   c                     |d         |d<   dS )z> abstract_declarator     : direct_abstract_declarator
        r   r   Nr{   r   s     r?   p_abstract_declarator_3zCParser.p_abstract_declarator_3  r   rA   c                     |d         |d<   dS )zA direct_abstract_declarator  : LPAREN abstract_declarator RPAREN r   r   Nr{   r   s     r?   p_direct_abstract_declarator_1z&CParser.p_direct_abstract_declarator_1      t!rA   c                     t          j        d|d         g |d         j                  }|                     |d         |          |d<   dS )zn direct_abstract_declarator  : direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET
        Nr   r   r  r  r   r  r  s      r?   p_direct_abstract_declarator_2z&CParser.p_direct_abstract_declarator_2  sV     o!A$*	   %%1Q4#%>>!rA   c           	         t          |          dk    r|d         ng pg }t          j        t          j        dddd          t          |          dk    r|d         n|d         ||                     |d                    |d<   dS )zk direct_abstract_declarator  : LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
        r   r   Nr   r   r  r   )rN   r   r  rp   r   )r6   r   r   s      r?   p_direct_abstract_declarator_3z&CParser.p_direct_abstract_declarator_3  s     Q!12dD$77A

!!##Aq))	+ + +!rA   c           
          t          j        dt          j        |d         |                     |d                    g |d         j                  }|                     |d         |          |d<   dS )zZ direct_abstract_declarator  : direct_abstract_declarator LBRACKET TIMES RBRACKET
        Nr   r   r  r  r   r  r  s      r?   p_direct_abstract_declarator_4z&CParser.p_direct_abstract_declarator_4  sr     o1t00A6677A$*	   %%1Q4#%>>!rA   c           
          t          j        t          j        dddd          t          j        |d         |                     |d                    g |                     |d                    |d<   dS )z? direct_abstract_declarator  : LBRACKET TIMES RBRACKET
        Nr   r   r  r   )r   r  rp   r  r   r   s     r?   p_direct_abstract_declarator_5z&CParser.p_direct_abstract_declarator_5  sn     dD$771t00A6677##Aq))	+ + +!rA   c                     t          j        |d         d|d         j                  }|                     |d         |          |d<   dS )zh direct_abstract_declarator  : direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN
        r   Nr   r  r  r   )r   r   rX   rv   )r6   r   r  s      r?   p_direct_abstract_declarator_6z&CParser.p_direct_abstract_declarator_6  sS     ~1A$*  
 %%1Q4$%??!rA   c           	          t          j        |d         t          j        dddd          |                     |d                    |d<   dS )zM direct_abstract_declarator  : LPAREN parameter_type_list_opt RPAREN
        r   Nr   r  r   )r   r   rp   r   r   s     r?   p_direct_abstract_declarator_7z&CParser.p_direct_abstract_declarator_7  sO     ~1dD$77##Aq))+ + +!rA   c                 d    t          |d         t                    r|d         n|d         g|d<   dS )zG block_item  : declaration
                        | statement
        r   r   Nr  r   s     r?   p_block_itemzCParser.p_block_item   s2     "!A$--9qttAaD6!rA   c                 ~    t          |          dk    s|d         dgk    r|d         n|d         |d         z   |d<   dS )z_ block_item_list : block_item
                            | block_item_list block_item
        r   Nr   r   r   r   s     r?   p_block_item_listzCParser.p_block_item_list  sA    
 A!qtv~~qttAaD1Q4K!rA   c                 l    t          j        |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   s     r?   p_compound_statement_1zCParser.p_compound_statement_1  s:    ~!##Aq))+ + +!rA   c                 x    t          j        |d         |d         |                     |d                    |d<   dS )z6 labeled_statement : ID COLON pragmacomp_or_statement r   r   r   N)r   Labelr   r   s     r?   p_labeled_statement_1zCParser.p_labeled_statement_1  5    {1Q41t'8'8A'>'>??!rA   c                 z    t          j        |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   s     r?   p_labeled_statement_2zCParser.p_labeled_statement_2  s7    z!A$1(9(9!Q(?(?@@!rA   c                 l    t          j        |d         g|                     |d                    |d<   dS )z; labeled_statement : DEFAULT COLON pragmacomp_or_statement r   r   r   N)r   Defaultr   r   s     r?   p_labeled_statement_3zCParser.p_labeled_statement_3  s1    }adVT%6%6q!%<%<==!rA   c           	      z    t          j        |d         |d         d|                     |d                    |d<   dS )zK selection_statement : IF LPAREN expression RPAREN pragmacomp_or_statement r   r   Nr   r   r   Ifr   r   s     r?   p_selection_statement_1zCParser.p_selection_statement_1!  s7    x!adD$*;*;Aq*A*ABB!rA   c           	          t          j        |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   s     r?   p_selection_statement_2zCParser.p_selection_statement_2%  s;    x!adAaD$*;*;Aq*A*ABB!rA   c           
          t          t          j        |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   s     r?   p_selection_statement_3zCParser.p_selection_statement_3)  sD    QqT1Q4):):1a)@)@AAC C!rA   c                 x    t          j        |d         |d         |                     |d                    |d<   dS )zN iteration_statement : WHILE LPAREN expression RPAREN pragmacomp_or_statement r   r   r   r   N)r   Whiler   r   s     r?   p_iteration_statement_1zCParser.p_iteration_statement_1.  r  rA   c                 x    t          j        |d         |d         |                     |d                    |d<   dS )zV iteration_statement : DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMI r   r   r   r   N)r   DoWhiler   r   s     r?   p_iteration_statement_2zCParser.p_iteration_statement_22  s5    }QqT1Q4):):1a)@)@AA!rA   c           
          t          j        |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   s     r?   p_iteration_statement_3zCParser.p_iteration_statement_36  sA    y1qtQqT1Q41B1B1a1H1HII!rA   c           
          t          j        t          j        |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   s     r?   p_iteration_statement_4zCParser.p_iteration_statement_4:  sd    y!d.?.?1.E.EFF1qtQqT4+<+<Q+B+BD D!rA   c                 j    t          j        |d         |                     |d                    |d<   dS )z  jump_statement  : GOTO ID SEMI r   r   r   N)r   Gotor   r   s     r?   p_jump_statement_1zCParser.p_jump_statement_1?  s/    z!A$ 1 1!Q 7 788!rA   c                 \    t          j        |                     |d                    |d<   dS )z jump_statement  : BREAK SEMI r   r   N)r   Breakr   r   s     r?   p_jump_statement_2zCParser.p_jump_statement_2C  s)    {4,,Q2233!rA   c                 \    t          j        |                     |d                    |d<   dS )z! jump_statement  : CONTINUE SEMI r   r   N)r   Continuer   r   s     r?   p_jump_statement_3zCParser.p_jump_statement_3G  s)    ~d//15566!rA   c                     t          j        t          |          dk    r|d         nd|                     |d                    |d<   dS )z\ jump_statement  : RETURN expression SEMI
                            | RETURN SEMI
        r   r   Nr   r   )r   ReturnrN   r   r   s     r?   p_jump_statement_4zCParser.p_jump_statement_4K  sD     |CFFaKKAaDDT4;L;LQPQ;R;RSS!rA   c                     |d         -t          j        |                     |d                    |d<   dS |d         |d<   dS )z, expression_statement : expression_opt SEMI r   Nr   r   )r   EmptyStatementr   r   s     r?   p_expression_statementzCParser.p_expression_statementQ  sD    Q4<'(9(9!Q(?(?@@AaDDDQ4AaDDDrA   c                 <   t          |          dk    r|d         |d<   dS t          |d         t          j                  s*t          j        |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)rN   ro   r   ExprListrX   r  rJ   r   s     r?   p_expressionzCParser.p_expressionX  s     q66Q;;Q4AaDDDadEN33 :~qtfadj99!aDJad###Q4AaDDDrA   c                     |d         |d<   dS )z: assignment_expression : LPAREN compound_statement RPAREN r   r   Nr{   r   s     r?   #p_parenthesized_compound_expressionz+CParser.p_parenthesized_compound_expressione  r  rA   c                 n    t          j        |d         g|                     |d                    |d<   dS )z typedef_name : TYPEID r   ry   r   Nr+  r   s     r?   p_typedef_namezCParser.p_typedef_namei  s5    #QqTF$2C2CAq2I2IJJJ!rA   c                     t          |          dk    r|d         |d<   dS t          j        |d         |d         |d         |d         j                  |d<   dS )z assignment_expression   : conditional_expression
                                    | unary_expression assignment_operator assignment_expression
        r   r   r   r   N)rN   r   
AssignmentrX   r   s     r?   p_assignment_expressionzCParser.p_assignment_expressionm  sT     q66Q;;Q4AaDDD#AaD!A$!adjAAAaDDDrA   c                     |d         |d<   dS )a   assignment_operator : EQUALS
                                | XOREQUAL
                                | TIMESEQUAL
                                | DIVEQUAL
                                | MODEQUAL
                                | PLUSEQUAL
                                | MINUSEQUAL
                                | LSHIFTEQUAL
                                | RSHIFTEQUAL
                                | ANDEQUAL
                                | OREQUAL
        r   r   Nr{   r   s     r?   p_assignment_operatorzCParser.p_assignment_operator{  s     t!rA   c                     |d         |d<   dS )z. constant_expression : conditional_expression r   r   Nr{   r   s     r?   p_constant_expressionzCParser.p_constant_expression  r  rA   c                     t          |          dk    r|d         |d<   dS t          j        |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)rN   r   	TernaryOprX   r   s     r?   p_conditional_expressionz CParser.p_conditional_expression  sS     q66Q;;Q4AaDDD?1Q41qtQqTZ@@AaDDDrA   c                     t          |          dk    r|d         |d<   dS t          j        |d         |d         |d         |d         j                  |d<   dS )ak   binary_expression   : cast_expression
                                | binary_expression TIMES binary_expression
                                | binary_expression DIVIDE binary_expression
                                | binary_expression MOD binary_expression
                                | binary_expression PLUS binary_expression
                                | binary_expression MINUS binary_expression
                                | binary_expression RSHIFT binary_expression
                                | binary_expression LSHIFT binary_expression
                                | binary_expression LT binary_expression
                                | binary_expression LE binary_expression
                                | binary_expression GE binary_expression
                                | binary_expression GT binary_expression
                                | binary_expression EQ binary_expression
                                | binary_expression NE binary_expression
                                | binary_expression AND binary_expression
                                | binary_expression OR binary_expression
                                | binary_expression XOR binary_expression
                                | binary_expression LAND binary_expression
                                | binary_expression LOR binary_expression
        r   r   r   r   N)rN   r   BinaryOprX   r   s     r?   p_binary_expressionzCParser.p_binary_expression  sS    * q66Q;;Q4AaDDD>!A$!adAaDJ??AaDDDrA   c                     |d         |d<   dS )z$ cast_expression : unary_expression r   r   Nr{   r   s     r?   p_cast_expression_1zCParser.p_cast_expression_1  r  rA   c                 x    t          j        |d         |d         |                     |d                    |d<   dS )z; cast_expression : LPAREN type_name RPAREN cast_expression r   r   r   r   N)r   Castr   r   s     r?   p_cast_expression_2zCParser.p_cast_expression_2  s5    z!A$!d&7&71&=&=>>!rA   c                     |d         |d<   dS )z* unary_expression    : postfix_expression r   r   Nr{   r   s     r?   p_unary_expression_1zCParser.p_unary_expression_1  r  rA   c                 f    t          j        |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   UnaryOprX   r   s     r?   p_unary_expression_2zCParser.p_unary_expression_2  s-    
 }QqT1Q4144!rA   c                     t          j        |d         t          |          dk    r|d         n|d         |                     |d                    |d<   dS )z unary_expression    : SIZEOF unary_expression
                                | SIZEOF LPAREN type_name RPAREN
                                | _ALIGNOF LPAREN type_name RPAREN
        r   r   r   r   N)r   r?  rN   r   r   s     r?   p_unary_expression_3zCParser.p_unary_expression_3  sT    
 }aDFFaKKAaDDQqTa##% %!rA   c                     |d         |d<   dS )z unary_operator  : AND
                            | TIMES
                            | PLUS
                            | MINUS
                            | NOT
                            | LNOT
        r   r   Nr{   r   s     r?   p_unary_operatorzCParser.p_unary_operator  r'  rA   c                     |d         |d<   dS )z* postfix_expression  : primary_expression r   r   Nr{   r   s     r?   p_postfix_expression_1zCParser.p_postfix_expression_1  r  rA   c                 f    t          j        |d         |d         |d         j                  |d<   dS )zG postfix_expression  : postfix_expression LBRACKET expression RBRACKET r   r   r   N)r   ArrayRefrX   r   s     r?   p_postfix_expression_2zCParser.p_postfix_expression_2  s+    ~adAaD!A$*55!rA   c                     t          j        |d         t          |          dk    r|d         nd|d         j                  |d<   dS )z postfix_expression  : postfix_expression LPAREN argument_expression_list RPAREN
                                | postfix_expression LPAREN RPAREN
        r   r   r   Nr   )r   FuncCallrN   rX   r   s     r?   p_postfix_expression_3zCParser.p_postfix_expression_3  s?     ~adCFFaKKAaDDT1Q4:NN!rA   c                     t          j        |d         |                     |d                    }t          j        |d         |d         ||d         j                  |d<   dS )z postfix_expression  : postfix_expression PERIOD ID
                                | postfix_expression PERIOD TYPEID
                                | postfix_expression ARROW ID
                                | postfix_expression ARROW TYPEID
        r   r   r   r   N)r   r  r   	StructRefrX   )r6   r   fields      r?   p_postfix_expression_4zCParser.p_postfix_expression_4  sT     1t00A6677qtQqT5!A$*==!rA   c                 l    t          j        d|d         z   |d         |d         j                  |d<   dS )z{ postfix_expression  : postfix_expression PLUSPLUS
                                | postfix_expression MINUSMINUS
        r   r   r   r   Nr>  r   s     r?   p_postfix_expression_5zCParser.p_postfix_expression_5  s1     }S1Q4Z1qtz::!rA   c                 N    t          j        |d         |d                   |d<   dS )z postfix_expression  : LPAREN type_name RPAREN brace_open initializer_list brace_close
                                | LPAREN type_name RPAREN brace_open initializer_list COMMA brace_close
        r   r   r   N)r   CompoundLiteralr   s     r?   p_postfix_expression_6zCParser.p_postfix_expression_6  s&     $QqT1Q400!rA   c                     |d         |d<   dS )z" primary_expression  : identifier r   r   Nr{   r   s     r?   p_primary_expression_1zCParser.p_primary_expression_1  r  rA   c                     |d         |d<   dS )z  primary_expression  : constant r   r   Nr{   r   s     r?   p_primary_expression_2zCParser.p_primary_expression_2  r  rA   c                     |d         |d<   dS )zp primary_expression  : unified_string_literal
                                | unified_wstring_literal
        r   r   Nr{   r   s     r?   p_primary_expression_3zCParser.p_primary_expression_3  r   rA   c                     |d         |d<   dS )z0 primary_expression  : LPAREN expression RPAREN r   r   Nr{   r   s     r?   p_primary_expression_4zCParser.p_primary_expression_4	  r  rA   c                     |                      |d          }t          j        t          j        |d         |          t          j        |d         |d         g|          |          |d<   dS )za primary_expression  : OFFSETOF LPAREN type_name COMMA offsetof_member_designator RPAREN
        r   r   r   r   N)r   r   rK  r  r#  )r6   r   rX   s      r?   p_primary_expression_5zCParser.p_primary_expression_5  sb     !!!Q''~ehqtU33#nadAaD\5AA#% %!rA   c                    t          |          dk    r|d         |d<   dS t          |          dk    r9t          j        |d         |d         |d         |d         j                  |d<   dS t          |          dk    r2t          j        |d         |d         |d         j                  |d<   dS t          dt          |          z            )	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)rN   r   rN  rX   rH  NotImplementedErrorr   s     r?   p_offsetof_member_designatorz$CParser.p_offsetof_member_designator  s    
 q66Q;;Q4AaDDDVVq[[?1Q41qtQqTZ@@AaDDDVVq[[>!A$!adj99AaDDD%&LsSTvv&UVVVrA   c                     t          |          dk    r,t          j        |d         g|d         j                  |d<   dS |d         j                            |d                    |d         |d<   dS )z argument_expression_list    : assignment_expression
                                        | argument_expression_list COMMA assignment_expression
        r   r   r   r   N)rN   r   r#  rX   r  rJ   r   s     r?   p_argument_expression_listz"CParser.p_argument_expression_list#  sg     q66Q;;>1Q4&!A$*55AaDDDaDJad###Q4AaDDDrA   c                 j    t          j        |d         |                     |d                    |d<   dS )z identifier  : ID r   r   N)r   r  r   r   s     r?   p_identifierzCParser.p_identifier-  s/    x!d//15566!rA   c                 4   d}d}|d         dd         D ]}|dv r|dz  }|dv r|dz  }d}|dk    rt          d          |d	k    rt          d
          d|z  d|z  z   }t          j        |dz   |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 rx   )
ValueErrorr   Constantr   )r6   r   uCountlCountxr   prefixs          r?   p_constant_1zCParser.p_constant_11  s     1bcc 	 	AJ!j!A::NOOOaZZNOOOv%&(88~UNAaD$"3"3Aq"9"9; ;!rA   c                     d|d                                          v rd}n(|d         d         dv rd}n|d         d         dv rd}nd}t          j        ||d         |                     |d                    |d	<   d
S )zM constant    : FLOAT_CONST
                        | HEX_FLOAT_CONST
        rr  r   floatrR   )fFri  zlong doubledoubler   N)lowerr   ro  r   )r6   r   r   s      r?   p_constant_2zCParser.p_constant_2H  s     !A$**,,AAtBx:%%1bZ''!~qtT&&q!,,. .!rA   c                 l    t          j        d|d         |                     |d                    |d<   dS )z constant    : CHAR_CONST
                        | WCHAR_CONST
                        | U8CHAR_CONST
                        | U16CHAR_CONST
                        | U32CHAR_CONST
        charr   r   N)r   ro  r   r   s     r?   p_constant_3zCParser.p_constant_3Y  s8     ~AaD$++Aq113 3!rA   c                    t          |          dk    r5t          j        d|d         |                     |d                    |d<   dS |d         j        dd         |d         dd         z   |d         _        |d         |d<   dS )z~ unified_string_literal  : STRING_LITERAL
                                    | unified_string_literal STRING_LITERAL
        r   stringr   r   NrR   )rN   r   ro  r   valuer   s     r?   p_unified_string_literalz CParser.p_unified_string_literalh  s     q66Q;;>!A$ 1 1!Q 7 79 9AaDDD 1CRC1Q483AaDJQ4AaDDDrA   c                 2   t          |          dk    r5t          j        d|d         |                     |d                    |d<   dS |d         j                                        dd         |d         dd         z   |d         _        |d         |d<   dS )a   unified_wstring_literal : WSTRING_LITERAL
                                    | U8STRING_LITERAL
                                    | U16STRING_LITERAL
                                    | U32STRING_LITERAL
                                    | unified_wstring_literal WSTRING_LITERAL
                                    | unified_wstring_literal U8STRING_LITERAL
                                    | unified_wstring_literal U16STRING_LITERAL
                                    | unified_wstring_literal U32STRING_LITERAL
        r   r  r   r   NrR   )rN   r   ro  r   r  rstripr   s     r?   p_unified_wstring_literalz!CParser.p_unified_wstring_literals  s     q66Q;;>!A$ 1 1!Q 7 79 9AaDDD 1**,,SbS1AaDH<AaDJQ4AaDDDrA   c                 n    |d         |d<   |                     d|                    d                     dS )z  brace_open  :   LBRACE
        r   r   N
set_linenolinenor   s     r?   p_brace_openzCParser.p_brace_open  5     t!	Q$$$$$rA   c                 n    |d         |d<   |                     d|                    d                     dS )z  brace_close :   RBRACE
        r   r   Nr  r   s     r?   p_brace_closezCParser.p_brace_close  r  rA   c                     d|d<   dS )zempty : Nr   r{   r   s     r?   p_emptyzCParser.p_empty  s    !rA   c           	          |rR|                      d|j        z  |                     |j        | j                            |                               d S |                      d| j        j                   d S )Nz
before: %s)r  re   zAt end of input)rU   r  rb   r  r.   find_tok_columnrD   r   s     r?   p_errorzCParser.p_error  s      	Eqw&18#'9#<#<Q#?#?  A AB B B B B
 /1CDDDDDrA   N)r   F)F)__name__
__module____qualname__r   r@   rF   rL   rP   rY   r[   r`   r*   r+   r,   r-   rl   rv   r   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.  r2  r4  r6  r:  r=  r?  rA  rC  rE  rH  rJ  rL  rQ  rT  rV  rX  rZ  ra  rc  re  rg  rj  rl  ro  rq  rs  rw  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/  r2  r5  r7  r:  r<  r@  rB  rD  rF  rI  rL  rP  rR  rU  rW  rY  r[  r]  r_  rb  rd  rf  rt  r{  r~  r  r  r  r  r  r  r{   rA   r?   r   r      s        %'m( m( m( m(^   0) ) )     + + +, , ,  : : :      $ $ $R! ! !d* * *X   2W W W Wr  "  J(' ' '      
  
    
  
M M M3 3 3
= 
= 
=8 8 8  $	 	 	
 
 
n	 	 	(, , ,z  4 4 4C C C
F F F
G G GC C C
H H H
P P P
S S S
T T T
P P P
C C C
P P P
U U U
    K K K       8 8 8D D D8 8 8D D DP P P
P P P
C C C
S S S
Q Q Q
H H H	+ 	+ 	+/ / /$/ / /&  ' ' '$ $ $L  
  
8 8 8/ / /
U U U? ? ?? ? ?
? ? ?  < < <      ]<!57STT  UT
 ]<!57STT2 2 UT2
 ]<!57STT+ + UT+ ]<!566  76
 ]<!57STT? ? UT? ]<!57STT? ? UT?* ]<!57STT	? 	? UT	? ]<!57STT@ @ UT@8  <8 8 8    (
( 
( 
(  @    
  
 
 
  8 8 8  
@ 
@ 
@  2 2 2
    	? 	? 	?+ + +	? 	? 	?+ + +@ @ @+ + +: : :H H H+ + +@ @ @A A A> > >C C CC C CC C C
@ @ @B B BJ J JD D D
9 9 94 4 47 7 7T T T      K K KB B B    A A A@ @ @4  ? ? ?  5 5 5% % %    6 6 6O O O> > >; ; ;1 1 1        % % %W W W  7 7 7; ; ;.. . ."3 3 3	 	 	  "% % %% % %  
E 
E 
E 
E 
ErA   r   N)plyr   r   r   c_lexerr   	plyparserr   r   r   r	   ast_transformsr
   r   r   r{   rA   r?   <module>r     s                      E E E E E E E E E E E E C C C C C C C C 
LE LE LE LE LEi LE LE 
LE LE LErA   