
    Yh*"                    p    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y)	   )yacc)c_ast)CLexer)	PLYParser
ParseErrorparameterizedtemplate)fix_switch_casesfix_atomic_specifiersc                      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 Zy)CParserTzpycparser.lextabzpycparser.yacctabF c                     || j                   | j                  | j                  | j                        | _        | j                  j                  |||       | j                  j                  | _        g d}|D ]  }	| j                  |	        t        j                  | d||||      | _	        t               g| _        d| _        y)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
             c/var/www/django-portfolio.reubendavern.link/venv/lib/python3.12/site-packages/pycparser/c_parser.py__init__zCParser.__init__   s    t ++3333!77	9	 			!" 	 	$ ii&&
" # 	(D!!$'	( yy-""$  "VH $(     c                     || j                   _        | j                   j                          t               g| _        d| _        | j                  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   s]     &				 !VH#' ||!!ii "  	rA   c                 J    | j                   j                  t                      y N)r4   appendr3   r6   s    r?   _push_scopezCParser._push_scope   s      (rA   c                 l    t        | j                        dkD  sJ | j                  j                          y )Nr   )lenr4   poprK   s    r?   
_pop_scopezCParser._pop_scope   s-    4$$%)))rA   c                     | j                   d   j                  |d      s| j                  d|z  |       d| j                   d   |<   y)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   sT       $((t4 "&'(-/ '+"d#rA   c                     | j                   d   j                  |d      r| j                  d|z  |       d| j                   d   |<   y)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   sT     R $$T51 "&'(-/ ',"d#rA   c                 f    t        | j                        D ]  }|j                  |      }||c S  y)z8 Is *name* a typedef-name in the current scope?
        F)reversedr4   rT   )r6   rW   scopein_scopes       r?   _is_type_in_scopezCParser._is_type_in_scope   s<     d//0 	5E yyH#H_		5
 rA   c                 H    | j                  || j                  ||             y rI   )rU   _coord)r6   msglinecolumns       r?   r*   zCParser._lex_error_func   s    #t{{489rA   c                 $    | j                          y rI   )rL   rK   s    r?   r+   zCParser._lex_on_lbrace_func   s    rA   c                 $    | j                          y rI   )rP   rK   s    r?   r,   zCParser._lex_on_rbrace_func   s    rA   c                 (    | j                  |      }|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    
 yy###rA   c                 |   |}|}|j                   r|j                   }|j                   rt        |t        j                        r	||_         |S |}t        |j                   t        j                        s1|j                   }t        |j                   t        j                        s1|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    dENN+!%MO
 I @%NN	 !@ "+M*INKrA   c                    |}t        |t        j                        s'|j                  }t        |t        j                        s'|j                  |_        |j                  dd |_        |D ]R  }t        |t        j                        rt        |      dkD  r| j                  d|j                         I||_        |c S  |sit        |j                  t        j                        s| j                  d|j                         t        j                  dg|j                        |_        |S t        j                  |D cg c]  }|j                  D ]  }|  c}}|d   j                        |_        |S c c}}w )z- Fixes a declaration. Modifies decl.
        Nr   z Invalid multiple types specifiedzMissing type in declarationintrX       )ro   r   rp   rn   declnamerW   qualsIdentifierTyperN   rU   rX   FuncDeclnames)r6   rq   typenamern   tnidrW   s          r?   _fix_decl_name_typezCParser._fix_decl_name_type+  s@   
 T5>>299D T5>>2 MM	ZZ]
  	 Bb%"6"67x=1$%%:BHHF !#DIK	   dii8!!5tzzC,,G**&DI  ,, (>"RXX>T>>qk'')DI  ?s   ?E7
c                     |xs t        g g g g g       }|r||   j                  |       |S ||   j                  d|       |S )a   Declaration specifiers are represented by a dictionary
            with the entries:
            * qual: a list of type qualifiers
            * storage: a list of storage type qualifiers
            * type: a list of type specifiers
            * function: a list of function specifiers
            * alignment: a list of alignment specifiers

            This method is given a declaration specifier, and a
            new specifier of a given kind.
            If `append` is True, the new specifier is added to the end of
            the specifiers list, otherwise it's added at the beginning.
            Returns the declaration specifier, with the new
            specifier incorporated.
        )qualstoragern   function	alignmentrz   )r3   rJ   insert)r6   declspecnewspeckindrJ   specs         r?   _add_declaration_specifierz"CParser._add_declaration_specifierW  sS      X4R"rUWXJg&  Ja)rA   c                 n   d|d   v }g }|d   j                  d      n|d   d   t        |d         dk  sBt        |d   d	   j                        d
k7  s$| j                  |d   d	   j                  d         s8d}|d   D ]  }t	        |d      s|j
                  } n | j                  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      su|d   d   }t        |t        j                        s'|j                  }t        |t        j                        s'|j                   |d   d	   j                  d   |_        |d   d	= |D ]l  }	|	d   J |r1t        j                   d|d   |d   |	d   |	d   j
                        }
nXt        j"                  d|d   |d   |d   |d   |	d   |	j                  d      |	j                  d      |	d   j
                  	      }
t        |
j                  t        j                  t        j                  t        j                  t        j                  f      r|
}n| j%                  |
|d         }|rO|r'| j'                  |j(                  |j
                         n&| j+                  |j(                  |j
                         t-        |      }|j/                  |       o |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   rz   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,B(Cq(H..tF|B/?/E/Ea/HIf Aq'* ! !!"7?  %~~fb)//2;'6l2&,, .E!HV VR  E!HV,

ELL%++u7K7K/M N 8F+L u~~>+00 !u~~>$$,(,VR(8(>(>q(A%L$ %	,D<+++#mmv, Ofv,,,. $jjv,{+ O!*-f&) HHY/v,,,	. +**JJekk((-* + )
!55k4<P
 !**:??J<L<LM((*:J:JK.z:J
+K%	,N rA   c                     d|d   v r| j                  d|j                         | 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   rz   )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  sz     Y'/<..T-." / $ %&'
 }}#**	 	rA   c                 L    |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                 v    |d   t        j                  g       |d<   yt        j                  |d         |d<   y)zh translation_unit_or_empty   : translation_unit
                                        | empty
        r   Nrz   )r   FileASTr6   ps     r?   p_translation_unit_or_emptyz#CParser.p_translation_unit_or_empty  s5     Q4<==$AaD==1&AaDrA   c                     |d   |d<   y)z4 translation_unit    : external_declaration
        r   rz   N r   s     r?   p_translation_unit_1zCParser.p_translation_unit_1       t!rA   c                 B    |d   j                  |d          |d   |d<   y)zE translation_unit    : translation_unit external_declaration
        r   r   rz   N)extendr   s     r?   p_translation_unit_2zCParser.p_translation_unit_2  s%     	
!AaDt!rA   c                     |d   g|d<   y)z7 external_declaration    : function_definition
        r   rz   Nr   r   s     r?   p_external_declaration_1z CParser.p_external_declaration_1       !v!rA   c                     |d   |d<   y)z/ external_declaration    : declaration
        r   rz   Nr   r   s     r?   p_external_declaration_2z CParser.p_external_declaration_2       t!rA   c                     |d   g|d<   y)zi external_declaration    : pp_directive
                                    | pppragma_directive
        r   rz   Nr   r   s     r?   p_external_declaration_3z CParser.p_external_declaration_3  s     !v!rA   c                     g |d<   y)z( external_declaration    : SEMI
        rz   Nr   r   s     r?   p_external_declaration_4z CParser.p_external_declaration_4%  s     !rA   c                     |d   |d<   y)z1 external_declaration    : static_assert
        r   rz   Nr   r   s     r?   p_external_declaration_5z CParser.p_external_declaration_5*  r   rA   c                     t        |      dk(  r/t        j                  |d   d| j                  |d            g|d<   yt        j                  |d   |d   | j                  |d            g|d<   y)z static_assert           : _STATIC_ASSERT LPAREN constant_expression COMMA unified_string_literal RPAREN
                                    | _STATIC_ASSERT LPAREN constant_expression RPAREN
              Nr   rz   )rN   r   StaticAssert_token_coordr   s     r?   p_static_assert_declarationz#CParser.p_static_assert_declaration/  sk     q6Q;&&qtT43D3DQ3JKLAaD&&qtQqT43D3DQ3JKLAaDrA   c                 H    | j                  d| j                  |d             y)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	3rA   c                 B   t        |      dk(  r-t        j                  |d   | j                  |d            |d<   yt        |      dk(  r-t        j                  |d   | j                  |d            |d<   yt        j                  d| j                  |d            |d<   y)z pppragma_directive      : PPPRAGMA
                                    | PPPRAGMA PPPRAGMASTR
                                    | _PRAGMA LPAREN unified_string_literal RPAREN
        r   r   r   rz   r   r   N)rN   r   Pragmar   r   s     r?   p_pppragma_directivezCParser.p_pppragma_directiveC  s    
 q6Q;<<!d&7&71&=>AaDVq[<<!d&7&71&=>AaD<<D$5$5a$;<AaDrA   c                 R    t        |      dk(  r
|d   g|d<   y|d   |d   gz   |d<   y)z pppragma_directive_list : pppragma_directive
                                    | pppragma_directive_list pppragma_directive
        r   r   rz   NrN   r   s     r?   p_pppragma_directive_listz!CParser.p_pppragma_directive_listO  3     Q1!v!!A$!A$-!rA   c                     t        g g g t        j                  dg| j                  |d            gg       }| j	                  ||d   |d   |d         |d<   y	)
zU function_definition : id_declarator declaration_list_opt compound_statement
        rx   r   ry   r   r   r   rn   r   r   r   r   rq   r   r   rz   N)r3   r   r}   r   r   r6   r   r   s      r?   p_function_definition_1zCParser.p_function_definition_1W  sv     &&w-1->->q!-DF G ..1!1	 / !rA   c                 P    |d   }| j                  ||d   |d   |d         |d<   y)zl function_definition : declaration_specifiers id_declarator declaration_list_opt compound_statement
        r   r   r      r   rz   N)r   r   s      r?   p_function_definition_2zCParser.p_function_definition_2i  s>     t..1!1	 / !rA   c                     |d   |d<   y)a_   statement   : labeled_statement
                        | expression_statement
                        | compound_statement
                        | selection_statement
                        | iteration_statement
                        | jump_statement
                        | pppragma_directive
                        | static_assert
        r   rz   Nr   r   s     r?   p_statementzCParser.p_statementx  s     t!rA   c                     t        |      dk(  r5t        j                  |d   |d   gz   | j                  |d            |d<   y|d   |d<   y)z} pragmacomp_or_statement     : pppragma_directive_list statement
                                        | statement
        r   r   r   block_itemsrX   rz   N)rN   r   Compoundr   r   s     r?   p_pragmacomp_or_statementz!CParser.p_pragmacomp_or_statement  sQ     q6Q;>>aD!A$K''1-/AaD Q4AaDrA   c                    |d   }|d   |d   }t         j                  t         j                  t         j                  f}t	        |      dk(  rKt        |d   |      r<t        j                  d|d   |d   |d   |d	   |d   dd|d   j                  
	      g}n8| j                  |t        dd      gd      }n| j                  ||d   d      }||d<   y)z decl_body : declaration_specifiers init_declarator_list_opt
                      | declaration_specifiers_no_type id_init_declarator_list_opt
        r   r   Nrn   rz   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ekk5::>H2w!|
2a5( ;v,{+ O!*-A Q%++	' 	(" 00T56&* 1 , ,,d"& - (E
 !rA   c                     |d   |d<   y)z& declaration : decl_body SEMI
        r   rz   Nr   r   s     r?   p_declarationzCParser.p_declaration   r   rA   c                 N    t        |      dk(  r	|d   |d<   y|d   |d   z   |d<   y)zj declaration_list    : declaration
                                | declaration_list declaration
        r   r   rz   Nr   r   s     r?   p_declaration_listzCParser.p_declaration_list	  s/     1v{qt!!qt!rA   c                 <    | j                  |d   |d   d      |d<   y)z] declaration_specifiers_no_type  : type_qualifier declaration_specifiers_no_type_opt
        r   r   r   rz   Nr   r   s     r?   "p_declaration_specifiers_no_type_1z*CParser.p_declaration_specifiers_no_type_1  $     ..qtQqT6B!rA   c                 <    | j                  |d   |d   d      |d<   y)zf declaration_specifiers_no_type  : storage_class_specifier declaration_specifiers_no_type_opt
        r   r   r   rz   Nr  r   s     r?   "p_declaration_specifiers_no_type_2z*CParser.p_declaration_specifiers_no_type_2  s$     ..qtQqT9E!rA   c                 <    | j                  |d   |d   d      |d<   y)za declaration_specifiers_no_type  : function_specifier declaration_specifiers_no_type_opt
        r   r   r   rz   Nr  r   s     r?   "p_declaration_specifiers_no_type_3z*CParser.p_declaration_specifiers_no_type_3  s$     ..qtQqT:F!rA   c                 <    | j                  |d   |d   d      |d<   y)z_ declaration_specifiers_no_type  : atomic_specifier declaration_specifiers_no_type_opt
        r   r   rn   rz   Nr  r   s     r?   "p_declaration_specifiers_no_type_4z*CParser.p_declaration_specifiers_no_type_4%  r  rA   c                 <    | j                  |d   |d   d      |d<   y)zb declaration_specifiers_no_type  : alignment_specifier declaration_specifiers_no_type_opt
        r   r   r   rz   Nr  r   s     r?   "p_declaration_specifiers_no_type_5z*CParser.p_declaration_specifiers_no_type_5*  $     ..qtQqT;G!rA   c                 @    | j                  |d   |d   dd      |d<   y)zI declaration_specifiers  : declaration_specifiers type_qualifier
        r   r   r   TrJ   rz   Nr  r   s     r?   p_declaration_specifiers_1z"CParser.p_declaration_specifiers_1/  )     ..qtQqT6$.O!rA   c                 @    | j                  |d   |d   dd      |d<   y)zR declaration_specifiers  : declaration_specifiers storage_class_specifier
        r   r   r   Tr  rz   Nr  r   s     r?   p_declaration_specifiers_2z"CParser.p_declaration_specifiers_24  s)     ..qtQqT9T.R!rA   c                 @    | j                  |d   |d   dd      |d<   y)zM declaration_specifiers  : declaration_specifiers function_specifier
        r   r   r   Tr  rz   Nr  r   s     r?   p_declaration_specifiers_3z"CParser.p_declaration_specifiers_39  s)     ..qtQqT:d.S!rA   c                 @    | j                  |d   |d   dd      |d<   y)zS declaration_specifiers  : declaration_specifiers type_specifier_no_typeid
        r   r   rn   Tr  rz   Nr  r   s     r?   p_declaration_specifiers_4z"CParser.p_declaration_specifiers_4>  r  rA   c                 6    | j                  d|d   d      |d<   y)z2 declaration_specifiers  : type_specifier
        Nr   rn   rz   r  r   s     r?   p_declaration_specifiers_5z"CParser.p_declaration_specifiers_5C        ..tQqT6B!rA   c                 @    | j                  |d   |d   dd      |d<   y)zQ declaration_specifiers  : declaration_specifiers_no_type type_specifier
        r   r   rn   Tr  rz   Nr  r   s     r?   p_declaration_specifiers_6z"CParser.p_declaration_specifiers_6H  r  rA   c                 @    | j                  |d   |d   dd      |d<   y)zN declaration_specifiers  : declaration_specifiers alignment_specifier
        r   r   r   Tr  rz   Nr  r   s     r?   p_declaration_specifiers_7z"CParser.p_declaration_specifiers_7M  s)     ..qtQqT;t.T!rA   c                     |d   |d<   y)a   storage_class_specifier : AUTO
                                    | REGISTER
                                    | STATIC
                                    | EXTERN
                                    | TYPEDEF
                                    | _THREAD_LOCAL
        r   rz   Nr   r   s     r?   p_storage_class_specifierz!CParser.p_storage_class_specifierR       t!rA   c                     |d   |d<   y)zR function_specifier  : INLINE
                                | _NORETURN
        r   rz   Nr   r   s     r?   p_function_specifierzCParser.p_function_specifier\  r   rA   c                 `    t        j                  |d   g| j                  |d            |d<   y)a+   type_specifier_no_typeid  : VOID
                                      | _BOOL
                                      | CHAR
                                      | SHORT
                                      | INT
                                      | LONG
                                      | FLOAT
                                      | DOUBLE
                                      | _COMPLEX
                                      | SIGNED
                                      | UNSIGNED
                                      | __INT128
        r   ry   rz   Nr   r}   r   r   s     r?   p_type_specifier_no_typeidz"CParser.p_type_specifier_no_typeidb  s-     ##QqTF$2C2CAq2IJ!rA   c                     |d   |d<   y)z type_specifier  : typedef_name
                            | enum_specifier
                            | struct_or_union_specifier
                            | type_specifier_no_typeid
                            | atomic_specifier
        r   rz   Nr   r   s     r?   p_type_specifierzCParser.p_type_specifierr  s     t!rA   c                 N    |d   }|j                   j                  d       ||d<   y)z= atomic_specifier  : _ATOMIC LPAREN type_name RPAREN
        r   _Atomicrz   N)r|   rJ   )r6   r   typs      r?   p_atomic_specifierzCParser.p_atomic_specifier|  s(     d		#!rA   c                     |d   |d<   y)z type_qualifier  : CONST
                            | RESTRICT
                            | VOLATILE
                            | _ATOMIC
        r   rz   Nr   r   s     r?   p_type_qualifierzCParser.p_type_qualifier  s     t!rA   c                 R    t        |      dk(  r|d   |d   gz   |d<   y|d   g|d<   y)z init_declarator_list    : init_declarator
                                    | init_declarator_list COMMA init_declarator
        r   r   r   rz   Nr   r   s     r?   p_init_declarator_listzCParser.p_init_declarator_list  3     !$A!qtqtf}!!A$!rA   c                 P    t        |d   t        |      dkD  r|d   nd      |d<   y)zb init_declarator : declarator
                            | declarator EQUALS initializer
        r   r   r   Nr   rz   r3   rN   r   s     r?   p_init_declaratorzCParser.p_init_declarator  (     1SVaZQqTTC!rA   c                 R    t        |      dk(  r|d   |d   gz   |d<   y|d   g|d<   y)z id_init_declarator_list    : id_init_declarator
                                       | id_init_declarator_list COMMA init_declarator
        r   r   r   rz   Nr   r   s     r?   p_id_init_declarator_listz!CParser.p_id_init_declarator_list  r4  rA   c                 P    t        |d   t        |      dkD  r|d   nd      |d<   y)zn id_init_declarator : id_declarator
                               | id_declarator EQUALS initializer
        r   r   r   Nr   rz   r6  r   s     r?   p_id_init_declaratorzCParser.p_id_init_declarator  r8  rA   c                 @    | j                  |d   |d   dd      |d<   y)zY specifier_qualifier_list    : specifier_qualifier_list type_specifier_no_typeid
        r   r   rn   Tr  rz   Nr  r   s     r?   p_specifier_qualifier_list_1z$CParser.p_specifier_qualifier_list_1  r  rA   c                 @    | j                  |d   |d   dd      |d<   y)zO specifier_qualifier_list    : specifier_qualifier_list type_qualifier
        r   r   r   Tr  rz   Nr  r   s     r?   p_specifier_qualifier_list_2z$CParser.p_specifier_qualifier_list_2  r  rA   c                 6    | j                  d|d   d      |d<   y)z4 specifier_qualifier_list  : type_specifier
        Nr   rn   rz   r  r   s     r?   p_specifier_qualifier_list_3z$CParser.p_specifier_qualifier_list_3  r  rA   c                 8    t        |d   g g |d   gg       |d<   y)zH specifier_qualifier_list  : type_qualifier_list type_specifier
        r   r   r   rz   Nr3   r   s     r?   p_specifier_qualifier_list_4z$CParser.p_specifier_qualifier_list_4  s$     1RqtfrR!rA   c                 2    t        g |d   gg g g       |d<   y)z9 specifier_qualifier_list  : alignment_specifier
        r   r   rz   NrD  r   s     r?   p_specifier_qualifier_list_5z$CParser.p_specifier_qualifier_list_5  s      !vrRP!rA   c                 <    | j                  |d   |d   d      |d<   y)zR specifier_qualifier_list  : specifier_qualifier_list alignment_specifier
        r   r   r   rz   Nr  r   s     r?   p_specifier_qualifier_list_6z$CParser.p_specifier_qualifier_list_6  r  rA   c                 n    | j                  |d         } ||d   d| j                  |d            |d<   y)z{ struct_or_union_specifier   : struct_or_union ID
                                        | struct_or_union TYPEID
        r   r   NrW   r   rX   rz   )r   r   r6   r   klasss      r?   p_struct_or_union_specifier_1z%CParser.p_struct_or_union_specifier_1  s@     //!51##Aq)+!rA   c                     | j                  |d         }t        |      dk(  r |dg | j                  |d            |d<   y |d|d   | j                  |d            |d<   y)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   rK  rz   r   r   rN   r   rL  s      r?   p_struct_or_union_specifier_2z%CParser.p_struct_or_union_specifier_2  sq     //!5q6Q;''1-/AaD
 d''1-/AaDrA   c                     | j                  |d         }t        |      dk(  r" ||d   g | j                  |d            |d<   y ||d   |d   | j                  |d            |d<   y)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   rK  rz   r   NrP  rL  s      r?   p_struct_or_union_specifier_3z%CParser.p_struct_or_union_specifier_3  sy     //!5q6Q;qT''1-/AaD
 qTd''1-/AaDrA   c                     |d   |d<   y)zF struct_or_union : STRUCT
                            | UNION
        r   rz   Nr   r   s     r?   p_struct_or_unionzCParser.p_struct_or_union  r   rA   c                 ^    t        |      dk(  r|d   xs g |d<   y|d   |d   xs g z   |d<   y)z struct_declaration_list     : struct_declaration
                                        | struct_declaration_list struct_declaration
        r   r   rz   Nr   r   s     r?   p_struct_declaration_listz!CParser.p_struct_declaration_list  s:     q6Q;Q4:2AaDQ41Q4:2&AaDrA   c                 t   |d   }d|d   vsJ |d   | j                  ||d         }nt        |d         dk(  rY|d   d   }t        |t        j                        r|}nt        j
                  |      }| j                  |t        |	      g      }n| j                  |t        dd
      g      }||d<   y)zW struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI
        r   r   r   r   Nr   r   rn   rz   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 - E f!# <?D$

+ 	!006	,,+, - .E ,,D12 - 4E !rA   c                     d|d<   y)z# struct_declaration : SEMI
        Nrz   r   r   s     r?   p_struct_declaration_2zCParser.p_struct_declaration_20  s     !rA   c                     |d   g|d<   y)z1 struct_declaration : pppragma_directive
        r   rz   Nr   r   s     r?   p_struct_declaration_3zCParser.p_struct_declaration_35  r   rA   c                 R    t        |      dk(  r|d   |d   gz   |d<   y|d   g|d<   y)z struct_declarator_list  : struct_declarator
                                    | struct_declarator_list COMMA struct_declarator
        r   r   r   rz   Nr   r   s     r?   p_struct_declarator_listz CParser.p_struct_declarator_list:  r4  rA   c                     |d   dd|d<   y)z( struct_declarator : declarator
        r   Nrq   r   rz   r   r   s     r?   p_struct_declarator_1zCParser.p_struct_declarator_1C  s     !.!rA   c                     t        |      dkD  r|d   |d   d|d<   yt        j                  dddd      |d   d|d<   y)z struct_declarator   : declarator COLON constant_expression
                                | COLON constant_expression
        r   r   rf  rz   Nr   )rN   r   rp   r   s     r?   p_struct_declarator_2zCParser.p_struct_declarator_2H  sG     q6A:aDQqT2AaD!NN4tTBqQRtTAaDrA   c                 ^    t        j                  |d   d| j                  |d            |d<   y)zM enum_specifier  : ENUM ID
                            | ENUM TYPEID
        r   Nr   rz   r   r   r   r   s     r?   p_enum_specifier_1zCParser.p_enum_specifier_1Q  s+     zz!A$d&7&71&=>!rA   c                 ^    t        j                  d|d   | j                  |d            |d<   y)zG enum_specifier  : ENUM brace_open enumerator_list brace_close
        Nr   r   rz   rk  r   s     r?   p_enum_specifier_2zCParser.p_enum_specifier_2W  s+     zz$!d&7&71&=>!rA   c                 d    t        j                  |d   |d   | j                  |d            |d<   y)z enum_specifier  : ENUM ID brace_open enumerator_list brace_close
                            | ENUM TYPEID brace_open enumerator_list brace_close
        r   r   r   rz   Nrk  r   s     r?   p_enum_specifier_3zCParser.p_enum_specifier_3\  s/     zz!A$!d&7&71&=>!rA   c                     t        |      dk(  r+t        j                  |d   g|d   j                        |d<   yt        |      dk(  r	|d   |d<   y|d   j                  j                  |d          |d   |d<   y)z enumerator_list : enumerator
                            | enumerator_list COMMA
                            | enumerator_list COMMA enumerator
        r   r   rz   r   N)rN   r   EnumeratorListrX   enumeratorsrJ   r   s     r?   p_enumerator_listzCParser.p_enumerator_listb  st    
 q6Q;''1!

;AaDVq[Q4AaDaD##AaD)Q4AaDrA   c                 \    t        j                  |d   | j                  |d            |d<   y)z alignment_specifier  : _ALIGNAS LPAREN type_name RPAREN
                                 | _ALIGNAS LPAREN constant_expression RPAREN
        r   r   rz   N)r   Alignasr   r   s     r?   p_alignment_specifierzCParser.p_alignment_specifiero  s)     }}QqT4#4#4Q#:;!rA   c                 &   t        |      dk(  r+t        j                  |d   d| j                  |d            }n-t        j                  |d   |d   | j                  |d            }| j	                  |j
                  |j                         ||d<   y)zR enumerator  : ID
                        | ID EQUALS constant_expression
        r   r   Nr   rz   )rN   r   
Enumeratorr   r[   rW   rX   )r6   r   
enumerators      r?   p_enumeratorzCParser.p_enumeratoru  s     q6Q;))!d))!Q/1J ))!ad))!Q/1J 	Z__j.>.>?!rA   c                     |d   |d<   y)zQ declarator  : id_declarator
                        | typeid_declarator
        r   rz   Nr   r   s     r?   p_declaratorzCParser.p_declarator  r   rA   )r   ID)typeidTYPEID)typeid_noparenr  c                     |d   |d<   y)z1 xxx_declarator  : direct_xxx_declarator
        r   rz   Nr   r   s     r?   p_xxx_declarator_1zCParser.p_xxx_declarator_1  r   rA   c                 :    | j                  |d   |d         |d<   y)z9 xxx_declarator  : pointer direct_xxx_declarator
        r   r   rz   Nrv   r   s     r?   p_xxx_declarator_2zCParser.p_xxx_declarator_2  s"     %%adAaD1!rA   c           
      d    t        j                  |d   ddd| j                  |d            |d<   y)z' direct_xxx_declarator   : yyy
        r   Nr   rz   )r   rp   r   r   s     r?   p_direct_xxx_declarator_1z!CParser.p_direct_xxx_declarator_1  s6     ~~qT##Aq)+!rA   c                     |d   |d<   y)z@ direct_xxx_declarator   : LPAREN xxx_declarator RPAREN
        r   rz   Nr   r   s     r?   p_direct_xxx_declarator_2z!CParser.p_direct_xxx_declarator_2  r   rA   c                     t        |      dkD  r|d   ng xs g }t        j                  dt        |      dkD  r|d   n|d   ||d   j                        }| j	                  |d   |      |d<   y)	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   rz   )rN   r   	ArrayDeclrX   rv   )r6   r   r|   arrs       r?   p_direct_xxx_declarator_3z!CParser.p_direct_xxx_declarator_3  su     Q!12 ooA
!!A$**	 %%1Q4#%>!rA   c                 &   |d   |d   fD cg c]  }t        |t              r|n|g }}|D cg c]  }|D ]  }||  }}}t        j                  d|d   ||d   j                        }| j                  |d   |      |d<   yc c}w c c}}w )	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
        r   r   Nr   r   r  r  rz   )ro   listr   r  rX   rv   )r6   r   itemlisted_qualssublistr   r  r  s           r?   p_direct_xxx_declarator_4z!CParser.p_direct_xxx_declarator_4  s     1ad% !+4 6TFB % %)5 !g' !$  !T !	 !oo!A$**	 %%1Q4#%>!%!s
   BBc           
          t        j                  dt        j                  |d   | j                  |d            |d   |d   ng |d   j                        }| j                  |d   |      |d<   y)zi direct_xxx_declarator   : direct_xxx_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET
        Nr   r   r   r  r  rz   r   r  r~  r   rX   rv   r6   r   r  s      r?   p_direct_xxx_declarator_5z!CParser.p_direct_xxx_declarator_5  sp     oo1t00A67d.adBA$**	 %%1Q4#%>!rA   c                    t        j                  |d   d|d   j                        }| j                         j                  dk(  ri|j
                  ]|j
                  j                  D ]D  }t        |t         j                        r n(| j                  |j                  |j                         F | j                  |d   |      |d<   y)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  rz   )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$**  ))+00H<yy$!YY-- BE!%)<)<=u((U[[AB %%1Q4$%?!rA   c                     | j                  |d      }t        j                  |d   xs g d|      }t        |      dkD  r:|d   }|j                  |j                  }|j                  ||_        |d   |d<   y||d<   y)zm pointer : TIMES type_qualifier_list_opt
                    | TIMES type_qualifier_list_opt pointer
        r   r   N)r|   rn   rX   r   rz   )r   r   PtrDeclrN   rn   )r6   r   rX   nested_type	tail_types        r?   	p_pointerzCParser.p_pointer  s     !!!Q'  mm!A$*"4uMq6A:!I..,%NN	 ..,(INQ4AaDAaDrA   c                 R    t        |      dk(  r
|d   g|d<   y|d   |d   gz   |d<   y)zs type_qualifier_list : type_qualifier
                                | type_qualifier_list type_qualifier
        r   r   rz   Nr   r   s     r?   p_type_qualifier_listzCParser.p_type_qualifier_list  r   rA   c                     t        |      dkD  rA|d   j                  j                  t        j                  | j                  |d                   |d   |d<   y)zn parameter_type_list : parameter_list
                                | parameter_list COMMA ELLIPSIS
        r   r   r   rz   N)rN   r  rJ   r   r  r   r   s     r?   p_parameter_type_listzCParser.p_parameter_type_list  sJ     q6A:aDKKu2243D3DQ3JKLt!rA   c                     t        |      dk(  r+t        j                  |d   g|d   j                        |d<   y|d   j                  j                  |d          |d   |d<   y)zz parameter_list  : parameter_declaration
                            | parameter_list COMMA parameter_declaration
        r   r   rz   r   NrN   r   	ParamListrX   r  rJ   r   s     r?   p_parameter_listzCParser.p_parameter_list#  X     q6Q;??AaD61Q4::6AaDaDKKqt$Q4AaDrA   c                     |d   }|d   s,t        j                  dg| j                  |d            g|d<   | j                  |t	        |d         g      d   |d<   y	)
z parameter_declaration   : declaration_specifiers id_declarator
                                    | declaration_specifiers typeid_noparen_declarator
        r   rn   rx   ry   r   rZ  rY  rz   N)r   r}   r   r   r3   r   s      r?   p_parameter_declaration_1z!CParser.p_parameter_declaration_17  ss     tF|!00%''1-/ 0DL''QqT?# ( %%&(!rA   c                 .   |d   }|d   s,t        j                  dg| j                  |d            g|d<   t        |d         dkD  rht        |d   d   j                        dk(  rJ| j                  |d   d   j                  d         r&| j                  |t        |d   d	      g
      d   }nat        j                  d|d   d|d   xs t        j                  dddd      | j                  |d            }|d   }| j                  ||      }||d<   y)zR parameter_declaration   : declaration_specifiers abstract_declarator_opt
        r   rn   rx   ry   rR   rz   r   Nr   rY  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  s0    tF|!00%''1-/ 0DL tF|q Sfb)9)?)?%@A%E&&tF|B'7'='=a'@A++QqT56 , 889;D >>6lqTCU^^D$dC''1-/D F|H++D(;D!rA   c                     t        |      dk(  r+t        j                  |d   g|d   j                        |d<   y|d   j                  j                  |d          |d   |d<   y)ze identifier_list : identifier
                            | identifier_list COMMA identifier
        r   r   rz   r   Nr  r   s     r?   p_identifier_listzCParser.p_identifier_listc  r  rA   c                     |d   |d<   y)z- initializer : assignment_expression
        r   rz   Nr   r   s     r?   p_initializer_1zCParser.p_initializer_1m  r   rA   c                 r    |d   *t        j                  g | j                  |d            |d<   y|d   |d<   y)z initializer : brace_open initializer_list_opt brace_close
                        | brace_open initializer_list COMMA brace_close
        r   Nr   rz   )r   InitListr   r   s     r?   p_initializer_2zCParser.p_initializer_2r  s;     Q4<>>"d&7&71&=>AaDQ4AaDrA   c                 T   t        |      dk(  rN|d   |d   nt        j                  |d   |d         }t        j                  |g|d   j                        |d<   y|d   |d   nt        j                  |d   |d         }|d   j
                  j                  |       |d   |d<   y)z initializer_list    : designation_opt initializer
                                | initializer_list COMMA designation_opt initializer
        r   r   Nr   rz   r   )rN   r   NamedInitializerr  rX   exprsrJ   )r6   r   r   s      r?   p_initializer_listzCParser.p_initializer_list{  s     q6Q;Q4<1Q4U-C-CAaD!A$-OD>>4&!A$**5AaDQ4<1Q4U-C-CAaD!A$-ODaDJJd#Q4AaDrA   c                     |d   |d<   y)z. designation : designator_list EQUALS
        r   rz   Nr   r   s     r?   p_designationzCParser.p_designation  r   rA   c                 R    t        |      dk(  r
|d   g|d<   y|d   |d   gz   |d<   y)z_ designator_list : designator
                            | designator_list designator
        r   r   rz   Nr   r   s     r?   p_designator_listzCParser.p_designator_list  r   rA   c                     |d   |d<   y)zi designator  : LBRACKET constant_expression RBRACKET
                        | PERIOD identifier
        r   rz   Nr   r   s     r?   p_designatorzCParser.p_designator  r   rA   c                     t        j                  d|d   d   dd d|d   xs t        j                  dddd      | j                  |d            }| j	                  ||d   d         |d<   y)	zH type_name   : specifier_qualifier_list abstract_declarator_opt
        r   r   r   Nr   r  rn   rz   )r   r  rp   r   r   )r6   r   r   s      r?   p_type_namezCParser.p_type_name  sr     >>A$v,q/1?dD$?##Aq)+ ''!A$v,?!rA   c                 f    t        j                  dddd      }| j                  ||d         |d<   y)z+ abstract_declarator     : pointer
        Nr   r  rz   )r   rp   rv   )r6   r   	dummytypes      r?   p_abstract_declarator_1zCParser.p_abstract_declarator_1  s;     NN4tT:	%%qT & !rA   c                 :    | j                  |d   |d         |d<   y)zF abstract_declarator     : pointer direct_abstract_declarator
        r   r   rz   Nr  r   s     r?   p_abstract_declarator_2zCParser.p_abstract_declarator_2  s"     %%adAaD1!rA   c                     |d   |d<   y)z> abstract_declarator     : direct_abstract_declarator
        r   rz   Nr   r   s     r?   p_abstract_declarator_3zCParser.p_abstract_declarator_3  r   rA   c                     |d   |d<   y)zA direct_abstract_declarator  : LPAREN abstract_declarator RPAREN r   rz   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                        }| j                  |d   |      |d<   y)zn direct_abstract_declarator  : direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET
        Nr   r   r  r  rz   )r   r  rX   rv   r  s      r?   p_direct_abstract_declarator_2z&CParser.p_direct_abstract_declarator_2  sI     oo!A$**	 %%1Q4#%>!rA   c           	          t        |      dkD  r|d   ng xs g }t        j                  t        j                  dddd      t        |      dkD  r|d   n|d   || j	                  |d            |d<   y)zk direct_abstract_declarator  : LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
        r   r   Nr   r   r  rz   )rN   r   r  rp   r   )r6   r   r|   s      r?   p_direct_abstract_declarator_3z&CParser.p_direct_abstract_declarator_3  sl     Q!12dD$7A
!!##Aq)	+!rA   c           
          t        j                  dt        j                  |d   | j                  |d            g |d   j                        }| j                  |d   |      |d<   y)zZ direct_abstract_declarator  : direct_abstract_declarator LBRACKET TIMES RBRACKET
        Nr   r   r  r  rz   r  r  s      r?   p_direct_abstract_declarator_4z&CParser.p_direct_abstract_declarator_4  sa     oo1t00A67A$**	 %%1Q4#%>!rA   c           
          t        j                  t        j                  dddd      t        j                  |d   | j	                  |d            g | j	                  |d            |d<   y)z? direct_abstract_declarator  : LBRACKET TIMES RBRACKET
        Nr   r   r  rz   )r   r  rp   r~  r   r   s     r?   p_direct_abstract_declarator_5z&CParser.p_direct_abstract_declarator_5  sZ     dD$71t00A67##Aq)	+!rA   c                     t        j                  |d   d|d   j                        }| j                  |d   |      |d<   y)zh direct_abstract_declarator  : direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN
        r   Nr   r  r  rz   )r   r~   rX   rv   )r6   r   r  s      r?   p_direct_abstract_declarator_6z&CParser.p_direct_abstract_declarator_6  sF     ~~1A$**
 %%1Q4$%?!rA   c           	          t        j                  |d   t        j                  dddd      | j                  |d            |d<   y)zM direct_abstract_declarator  : LPAREN parameter_type_list_opt RPAREN
        r   Nr   r  rz   )r   r~   rp   r   r   s     r?   p_direct_abstract_declarator_7z&CParser.p_direct_abstract_declarator_7  s?     ~~1dD$7##Aq)+!rA   c                 N    t        |d   t              r	|d   |d<   y|d   g|d<   y)zG block_item  : declaration
                        | statement
        r   rz   N)ro   r  r   s     r?   p_block_itemzCParser.p_block_item   s,     "!A$-qt!AaD6!rA   c                 `    t        |      dk(  s	|d   dgk(  r	|d   |d<   y|d   |d   z   |d<   y)z_ block_item_list : block_item
                            | block_item_list block_item
        r   Nr   rz   r   r   s     r?   p_block_item_listzCParser.p_block_item_list  s;    
 A!qtv~qt!AaD1Q4K!rA   c                 ^    t        j                  |d   | j                  |d            |d<   y)zA compound_statement : brace_open block_item_list_opt brace_close r   r   r   rz   N)r   r   r   r   s     r?   p_compound_statement_1zCParser.p_compound_statement_1  s+    ~~!##Aq)+!rA   c                 d    t        j                  |d   |d   | j                  |d            |d<   y)z6 labeled_statement : ID COLON pragmacomp_or_statement r   r   rz   N)r   Labelr   r   s     r?   p_labeled_statement_1zCParser.p_labeled_statement_1  -    {{1Q41t'8'8A'>?!rA   c                 f    t        j                  |d   |d   g| j                  |d            |d<   y)zL labeled_statement : CASE constant_expression COLON pragmacomp_or_statement r   r   r   rz   N)r   Caser   r   s     r?   p_labeled_statement_2zCParser.p_labeled_statement_2  s/    zz!A$1(9(9!Q(?@!rA   c                 ^    t        j                  |d   g| j                  |d            |d<   y)z; labeled_statement : DEFAULT COLON pragmacomp_or_statement r   r   rz   N)r   Defaultr   r   s     r?   p_labeled_statement_3zCParser.p_labeled_statement_3  s)    }}adVT%6%6q!%<=!rA   c           	      f    t        j                  |d   |d   d| j                  |d            |d<   y)zK selection_statement : IF LPAREN expression RPAREN pragmacomp_or_statement r   r   Nr   rz   r   Ifr   r   s     r?   p_selection_statement_1zCParser.p_selection_statement_1!  s/    xx!adD$*;*;Aq*AB!rA   c           	      l    t        j                  |d   |d   |d   | j                  |d            |d<   y)zZ selection_statement : IF LPAREN expression RPAREN statement ELSE pragmacomp_or_statement r   r      r   rz   Nr  r   s     r?   p_selection_statement_2zCParser.p_selection_statement_2%  s3    xx!adAaD$*;*;Aq*AB!rA   c           
      v    t        t        j                  |d   |d   | j                  |d                  |d<   y)zO selection_statement : SWITCH LPAREN expression RPAREN pragmacomp_or_statement r   r   r   rz   N)r
   r   Switchr   r   s     r?   p_selection_statement_3zCParser.p_selection_statement_3)  s6    QqT1Q4):):1a)@AC!rA   c                 d    t        j                  |d   |d   | j                  |d            |d<   y)zN iteration_statement : WHILE LPAREN expression RPAREN pragmacomp_or_statement r   r   r   rz   N)r   Whiler   r   s     r?   p_iteration_statement_1zCParser.p_iteration_statement_1.  r  rA   c                 d    t        j                  |d   |d   | j                  |d            |d<   y)zV iteration_statement : DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMI r   r   r   rz   N)r   DoWhiler   r   s     r?   p_iteration_statement_2zCParser.p_iteration_statement_22  s-    }}QqT1Q4):):1a)@A!rA   c           
      t    t        j                  |d   |d   |d   |d   | j                  |d            |d<   y)zx iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement r   r   r  	   r   rz   N)r   Forr   r   s     r?   p_iteration_statement_3zCParser.p_iteration_statement_36  s9    yy1qtQqT1Q41B1B1a1HI!rA   c           
          t        j                  t        j                  |d   | j                  |d            |d   |d   |d   | j                  |d            |d<   y)zp iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement r   r   r         rz   N)r   r  DeclListr   r   s     r?   p_iteration_statement_4zCParser.p_iteration_statement_4:  sU    yy!d.?.?1.EF1qtQqT4+<+<Q+BD!rA   c                 \    t        j                  |d   | j                  |d            |d<   y)z  jump_statement  : GOTO ID SEMI r   r   rz   N)r   Gotor   r   s     r?   p_jump_statement_1zCParser.p_jump_statement_1?  s'    zz!A$ 1 1!Q 78!rA   c                 T    t        j                  | j                  |d            |d<   y)z jump_statement  : BREAK SEMI r   rz   N)r   Breakr   r   s     r?   p_jump_statement_2zCParser.p_jump_statement_2C  s!    {{4,,Q23!rA   c                 T    t        j                  | j                  |d            |d<   y)z! jump_statement  : CONTINUE SEMI r   rz   N)r   Continuer   r   s     r?   p_jump_statement_3zCParser.p_jump_statement_3G  s!    ~~d//156!rA   c                 |    t        j                  t        |      dk(  r|d   nd| j                  |d            |d<   y)z\ jump_statement  : RETURN expression SEMI
                            | RETURN SEMI
        r   r   Nr   rz   )r   ReturnrN   r   r   s     r?   p_jump_statement_4zCParser.p_jump_statement_4K  s6     ||CFaKAaDT4;L;LQPQ;RS!rA   c                 p    |d   )t        j                  | j                  |d            |d<   y|d   |d<   y)z, expression_statement : expression_opt SEMI r   Nr   rz   )r   EmptyStatementr   r   s     r?   p_expression_statementzCParser.p_expression_statementQ  s9    Q4<''(9(9!Q(?@AaDQ4AaDrA   c                    t        |      dk(  r	|d   |d<   yt        |d   t        j                        s*t        j                  |d   g|d   j                        |d<   |d   j
                  j                  |d          |d   |d<   y)zn expression  : assignment_expression
                        | expression COMMA assignment_expression
        r   r   rz   r   N)rN   ro   r   ExprListrX   r  rJ   r   s     r?   p_expressionzCParser.p_expressionX  sw     q6Q;Q4AaDadENN3~~qtfadjj9!aDJJad#Q4AaDrA   c                     |d   |d<   y)z: assignment_expression : LPAREN compound_statement RPAREN r   rz   Nr   r   s     r?   #p_parenthesized_compound_expressionz+CParser.p_parenthesized_compound_expressione  r  rA   c                 `    t        j                  |d   g| j                  |d            |d<   y)z typedef_name : TYPEID r   ry   rz   Nr(  r   s     r?   p_typedef_namezCParser.p_typedef_namei  s+    ##QqTF$2C2CAq2IJ!rA   c                     t        |      dk(  r	|d   |d<   yt        j                  |d   |d   |d   |d   j                        |d<   y)z assignment_expression   : conditional_expression
                                    | unary_expression assignment_operator assignment_expression
        r   r   rz   r   N)rN   r   
AssignmentrX   r   s     r?   p_assignment_expressionzCParser.p_assignment_expressionm  sJ     q6Q;Q4AaD##AaD!A$!adjjAAaDrA   c                     |d   |d<   y)a   assignment_operator : EQUALS
                                | XOREQUAL
                                | TIMESEQUAL
                                | DIVEQUAL
                                | MODEQUAL
                                | PLUSEQUAL
                                | MINUSEQUAL
                                | LSHIFTEQUAL
                                | RSHIFTEQUAL
                                | ANDEQUAL
                                | OREQUAL
        r   rz   Nr   r   s     r?   p_assignment_operatorzCParser.p_assignment_operator{  s     t!rA   c                     |d   |d<   y)z. constant_expression : conditional_expression r   rz   Nr   r   s     r?   p_constant_expressionzCParser.p_constant_expression  r  rA   c                     t        |      dk(  r	|d   |d<   yt        j                  |d   |d   |d   |d   j                        |d<   y)z conditional_expression  : binary_expression
                                    | binary_expression CONDOP expression COLON conditional_expression
        r   r   rz   r   r   N)rN   r   	TernaryOprX   r   s     r?   p_conditional_expressionz CParser.p_conditional_expression  sH     q6Q;Q4AaD??1Q41qtQqTZZ@AaDrA   c                     t        |      dk(  r	|d   |d<   yt        j                  |d   |d   |d   |d   j                        |d<   y)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   rz   r   N)rN   r   BinaryOprX   r   s     r?   p_binary_expressionzCParser.p_binary_expression  sH    * q6Q;Q4AaD>>!A$!adAaDJJ?AaDrA   c                     |d   |d<   y)z$ cast_expression : unary_expression r   rz   Nr   r   s     r?   p_cast_expression_1zCParser.p_cast_expression_1  r  rA   c                 d    t        j                  |d   |d   | j                  |d            |d<   y)z; cast_expression : LPAREN type_name RPAREN cast_expression r   r   r   rz   N)r   Castr   r   s     r?   p_cast_expression_2zCParser.p_cast_expression_2  s-    zz!A$!d&7&71&=>!rA   c                     |d   |d<   y)z* unary_expression    : postfix_expression r   rz   Nr   r   s     r?   p_unary_expression_1zCParser.p_unary_expression_1  r  rA   c                 ^    t        j                  |d   |d   |d   j                        |d<   y)z unary_expression    : PLUSPLUS unary_expression
                                | MINUSMINUS unary_expression
                                | unary_operator cast_expression
        r   r   rz   Nr   UnaryOprX   r   s     r?   p_unary_expression_2zCParser.p_unary_expression_2  s*    
 }}QqT1Q414!rA   c                     t        j                  |d   t        |      dk(  r|d   n|d   | j                  |d            |d<   y)z unary_expression    : SIZEOF unary_expression
                                | SIZEOF LPAREN type_name RPAREN
                                | _ALIGNOF LPAREN type_name RPAREN
        r   r   r   rz   N)r   r8  rN   r   r   s     r?   p_unary_expression_3zCParser.p_unary_expression_3  sD    
 }}aDFaKAaDQqTa#%!rA   c                     |d   |d<   y)z unary_operator  : AND
                            | TIMES
                            | PLUS
                            | MINUS
                            | NOT
                            | LNOT
        r   rz   Nr   r   s     r?   p_unary_operatorzCParser.p_unary_operator  r$  rA   c                     |d   |d<   y)z* postfix_expression  : primary_expression r   rz   Nr   r   s     r?   p_postfix_expression_1zCParser.p_postfix_expression_1  r  rA   c                 ^    t        j                  |d   |d   |d   j                        |d<   y)zG postfix_expression  : postfix_expression LBRACKET expression RBRACKET r   r   rz   N)r   ArrayRefrX   r   s     r?   p_postfix_expression_2zCParser.p_postfix_expression_2  s(    ~~adAaD!A$**5!rA   c                 ~    t        j                  |d   t        |      dk(  r|d   nd|d   j                        |d<   y)z postfix_expression  : postfix_expression LPAREN argument_expression_list RPAREN
                                | postfix_expression LPAREN RPAREN
        r   r   r   Nrz   )r   FuncCallrN   rX   r   s     r?   p_postfix_expression_3zCParser.p_postfix_expression_3  s6     ~~adCFaKAaDT1Q4::N!rA   c                     t        j                  |d   | j                  |d            }t        j                  |d   |d   ||d   j                        |d<   y)z postfix_expression  : postfix_expression PERIOD ID
                                | postfix_expression PERIOD TYPEID
                                | postfix_expression ARROW ID
                                | postfix_expression ARROW TYPEID
        r   r   r   rz   N)r   r~  r   	StructRefrX   )r6   r   fields      r?   p_postfix_expression_4zCParser.p_postfix_expression_4  sM     1t00A67qtQqT5!A$**=!rA   c                 d    t        j                  d|d   z   |d   |d   j                        |d<   y)z{ postfix_expression  : postfix_expression PLUSPLUS
                                | postfix_expression MINUSMINUS
        r   r   r   rz   Nr7  r   s     r?   p_postfix_expression_5zCParser.p_postfix_expression_5  s.     }}S1Q4Z1qtzz:!rA   c                 B    t        j                  |d   |d         |d<   y)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   rz   N)r   CompoundLiteralr   s     r?   p_postfix_expression_6zCParser.p_postfix_expression_6  s"     $$QqT1Q40!rA   c                     |d   |d<   y)z" primary_expression  : identifier r   rz   Nr   r   s     r?   p_primary_expression_1zCParser.p_primary_expression_1  r  rA   c                     |d   |d<   y)z  primary_expression  : constant r   rz   Nr   r   s     r?   p_primary_expression_2zCParser.p_primary_expression_2  r  rA   c                     |d   |d<   y)zp primary_expression  : unified_string_literal
                                | unified_wstring_literal
        r   rz   Nr   r   s     r?   p_primary_expression_3zCParser.p_primary_expression_3  r   rA   c                     |d   |d<   y)z0 primary_expression  : LPAREN expression RPAREN r   rz   Nr   r   s     r?   p_primary_expression_4zCParser.p_primary_expression_4	  r  rA   c                     | j                  |d      }t        j                  t        j                  |d   |      t        j                  |d   |d   g|      |      |d<   y)za primary_expression  : OFFSETOF LPAREN type_name COMMA offsetof_member_designator RPAREN
        r   r   r   rz   N)r   r   rD  r~  r  )r6   r   rX   s      r?   p_primary_expression_5zCParser.p_primary_expression_5  sV     !!!Q'~~ehhqtU3#nnadAaD\5A#%!rA   c                 V   t        |      dk(  r	|d   |d<   yt        |      dk(  r2t        j                  |d   |d   |d   |d   j                        |d<   yt        |      dk(  r.t        j                  |d   |d   |d   j                        |d<   yt        dt        |      z        )	z offsetof_member_designator : identifier
                                         | offsetof_member_designator PERIOD identifier
                                         | offsetof_member_designator LBRACKET expression RBRACKET
        r   r   rz   r   r   r   z$Unexpected parsing state. len(p): %uN)rN   r   rG  rX   rA  NotImplementedErrorr   s     r?   p_offsetof_member_designatorz$CParser.p_offsetof_member_designator  s    
 q6Q;Q4AaDVq[??1Q41qtQqTZZ@AaDVq[>>!A$!adjj9AaD%&LsSTv&UVVrA   c                     t        |      dk(  r+t        j                  |d   g|d   j                        |d<   y|d   j                  j                  |d          |d   |d<   y)z argument_expression_list    : assignment_expression
                                        | argument_expression_list COMMA assignment_expression
        r   r   rz   r   N)rN   r   r  rX   r  rJ   r   s     r?   p_argument_expression_listz"CParser.p_argument_expression_list#  sX     q6Q;>>1Q4&!A$**5AaDaDJJad#Q4AaDrA   c                 \    t        j                  |d   | j                  |d            |d<   y)z identifier  : ID r   rz   N)r   r~  r   r   s     r?   p_identifierzCParser.p_identifier-  s'    xx!d//156!rA   c                    d}d}|d   dd D ]  }|dv r|dz  }|dv s|dz  } d}|dkD  rt        d      |d	kD  rt        d
      d|z  d|z  z   }t        j                  |dz   |d   | j                  |d            |d<   y)z constant    : INT_CONST_DEC
                        | INT_CONST_OCT
                        | INT_CONST_HEX
                        | INT_CONST_BIN
                        | INT_CONST_CHAR
        rz   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bc 	AJ!j!		
 A:NOOaZNOOv%&(88~~UNAaD$"3"3Aq"9;!rA   c                     d|d   j                         v rd}n|d   d   dv rd}n|d   d   dv rd}nd}t        j                  ||d   | j                  |d            |d	<   y
)zM constant    : FLOAT_CONST
                        | HEX_FLOAT_CONST
        rk  r   floatrR   )fFrb  zlong doubledoublerz   N)lowerr   rh  r   )r6   r   r   s      r?   p_constant_2zCParser.p_constant_2H  st     !A$**,AtBx:%1bZ'!~~qtT&&q!,.!rA   c                 ^    t        j                  d|d   | j                  |d            |d<   y)z constant    : CHAR_CONST
                        | WCHAR_CONST
                        | U8CHAR_CONST
                        | U16CHAR_CONST
                        | U32CHAR_CONST
        charr   rz   N)r   rh  r   r   s     r?   p_constant_3zCParser.p_constant_3Y  s.     ~~AaD$++Aq13!rA   c                     t        |      dk(  r.t        j                  d|d   | j                  |d            |d<   y|d   j                  dd |d   dd z   |d   _        |d   |d<   y)z~ unified_string_literal  : STRING_LITERAL
                                    | unified_string_literal STRING_LITERAL
        r   stringr   rz   NrR   )rN   r   rh  r   valuer   s     r?   p_unified_string_literalz CParser.p_unified_string_literalh  sp     q6Q;>>!A$ 1 1!Q 79AaD 1CR1Q483AaDJQ4AaDrA   c                     t        |      dk(  r.t        j                  d|d   | j                  |d            |d<   y|d   j                  j                         dd |d   dd z   |d   _        |d   |d<   y)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   ry  r   rz   NrR   )rN   r   rh  r   rz  rstripr   s     r?   p_unified_wstring_literalz!CParser.p_unified_wstring_literals  sz     q6Q;>>!A$ 1 1!Q 79AaD 1**,Sb1AaDH<AaDJQ4AaDrA   c                 V    |d   |d<   |j                  d|j                  d             y)z  brace_open  :   LBRACE
        r   rz   N
set_linenolinenor   s     r?   p_brace_openzCParser.p_brace_open  '     t!	Q$rA   c                 V    |d   |d<   |j                  d|j                  d             y)z  brace_close :   RBRACE
        r   rz   Nr  r   s     r?   p_brace_closezCParser.p_brace_close  r  rA   c                     d|d<   y)zempty : Nrz   r   r   s     r?   p_emptyzCParser.p_empty  s    !rA   c           	          |rT| j                  d|j                  z  | j                  |j                  | j                  j                  |                   y | j                  d| j                  j                         y )Nz
before: %s)r  re   zAt end of input)rU   rz  rb   r  r.   find_tok_columnrD   r   s     r?   p_errorzCParser.p_error  si     qww&188#'99#<#<Q#?  AB
 /1C1C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+  r/  r1  r3  r7  r:  r<  r>  r@  rB  rE  rG  rI  rN  rQ  rS  rU  rW  r^  r`  rb  rd  rg  ri  rl  rn  rp  rt  rw  r{  r}  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r!  r$  r&  r(  r+  r.  r0  r3  r5  r9  r;  r=  r?  rB  rE  rI  rK  rN  rP  rR  rT  rV  rX  r[  r]  r_  rm  rt  rw  r{  r~  r  r  r  r  r   rA   r?   r   r      s~    %'m(^0) +,:$R!d*X2Wr"J('



M3
=8$	
n	(,z4C
F
GC
H
P
S
T
P
C
P
U
K 8D8DP
P
C
S
Q
H	+/$/&'$L

8/
U??
?<  <!57ST U
 <!57ST2 U2
 <!57ST+ U+ <!56 7
 <!57ST? U? <!57ST? U?* <!57ST	? U	? <!57ST@ U@8<8(
(@

8
@2
	?+	?+@+:H+@A>CCC
@BJD
947TKBA@4?5%6O>;1%W7;.."3	"%%
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 C 
LEi LE 
LErA   