<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
]                 @   s   d dl Z d dlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZ G dd	 d	eZed
kr|d dlZd dlZd dlZdS )    N)yacc   )c_ast)CLexer)	PLYParserCoord
ParseError)fix_switch_casesc               @   sD  e Zd ZdCddZdDd	d
Zdd Zdd Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ ZdEd%d&Zd'd( Zd)d* ZdPZd>d? Zd@dA ZdBdC ZdDdE ZdFdG ZdHdI ZdJdK ZdLdM ZdNdO ZdPdQ ZdRdS Z dTdU Z!dVdW Z"dXdY Z#dZd[ Z$d\d] Z%d^d_ Z&d`da Z'dbdc Z(ddde Z)dfdg Z*dhdi Z+djdk Z,dldm Z-dndo Z.dpdq Z/drds Z0dtdu Z1dvdw Z2dxdy Z3dzd{ Z4d|d} Z5d~d Z6dd Z7dd Z8dd Z9dd Z:dd Z;dd Z<dd Z=dd Z>dd Z?dd Z@dd ZAdd ZBdd ZCdd ZDdd ZEdd ZFdd ZGdd ZHdd ZIdd ZJdd ZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWddÄ ZXddń ZYddǄ ZZddɄ Z[dd˄ Z\dd̈́ Z]ddτ Z^ddф Z_ddӄ Z`ddՄ Zaddׄ Zbddل Zcddۄ Zddd݄ Zedd߄ Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zldd Zmdd Zndd Zodd Zpdd Zqdd Zrdd Zsdd Ztdd Zudd Zvd d Zwdd Zxdd Zydd Zzdd	 Z{d
d Z|dd Z}dd Z~dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<d= Zd>d? Zd@dA ZdBS (Q  CParserTpycparser.lextabpycparser.yacctabF c       	      C   s   t | j| j| j| jd| _| jj|||d | jj| _ddddddd	d
ddddddg}x|D ]}| j| q\W t	j	| d||||d| _
t g| _d| _dS )a   Create a new CParser.

            Some arguments for controlling the debug/optimization
            level of the parser are provided. The defaults are
            tuned for release/performance mode.
            The simple rules for using them are:
            *) When tweaking CParser/CLexer, set these to False
            *) When releasing a stable parser, set to True

            lex_optimize:
                Set to False when you're modifying the lexer.
                Otherwise, changes in the lexer won't be used, if
                some lextab.py file exists.
                When releasing with a stable lexer, set to True
                to save the re-generation of the lexer table on
                each run.

            lextab:
                Points to the lex table that's used for optimized
                mode. Only if you're modifying the lexer and want
                some tests to avoid re-generating the table, make
                this point to a local lex table file (that's been
                earlier generated with lex_optimize=True)

            yacc_optimize:
                Set to False when you're modifying the parser.
                Otherwise, changes in the parser won't be used, if
                some parsetab.py file exists.
                When releasing with a stable parser, set to True
                to save the re-generation of the parser table on
                each run.

            yacctab:
                Points to the yacc table that's used for optimized
                mode. Only if you're modifying the parser, make
                this point to a local yacc table file

            yacc_debug:
                Generate a parser.out file that explains how yacc
                built the parsing table from the grammar.

            taboutputdir:
                Set this parameter to control the location of generated
                lextab and yacctab files.
        )Z
error_funcZon_lbrace_funcZon_rbrace_funcZtype_lookup_func)optimizelextab	outputdirZabstract_declaratorZassignment_expressionZdeclaration_listZdeclaration_specifiersZdesignationZ
expressionZidentifier_listZinit_declarator_listZinitializer_listZparameter_type_listZspecifier_qualifier_listZblock_item_listZtype_qualifier_listZstruct_declarator_listZtranslation_unit_or_empty)modulestartdebugr   Z	tabmoduler   N)r   _lex_error_func_lex_on_lbrace_func_lex_on_rbrace_func_lex_type_lookup_funcclexZbuildtokensZ_create_opt_ruler   cparserdict_scope_stack_last_yielded_token)	selfZlex_optimizer   Zyacc_optimizeZyacctabZ
yacc_debugZtaboutputdirZrules_with_optZrule r   /usr/lib/python3.6/c_parser.py__init__   sF    5




zCParser.__init__r   c             C   s6   || j _| j j  t g| _d| _| jj|| j |dS )a&   Parses C code and returns an AST.

            text:
                A string containing the C source code

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

            debuglevel:
                Debug level to yacc
        N)inputZlexerr   )r   filenameZreset_linenor   r   r   r   parse)r   textr#   Z
debuglevelr   r   r    r$   ~   s    

zCParser.parsec             C   s   | j jt  d S )N)r   appendr   )r   r   r   r    _push_scope   s    zCParser._push_scopec             C   s   | j j  d S )N)r   pop)r   r   r   r    
_pop_scope   s    zCParser._pop_scopec             C   s4   | j d j|ds"| jd| | d| j d |< dS )zC Add a new typedef name (ie a TYPEID) to the current scope
        r   Tz;Typedef %r previously declared as non-typedef in this scopeNr*   )r   get_parse_error)r   namecoordr   r   r    _add_typedef_name   s
    
zCParser._add_typedef_namec             C   s4   | j d j|dr"| jd| | d| j d |< dS )ze Add a new object, function, or enum member name (ie an ID) to the
            current scope
        r   Fz;Non-typedef %r previously declared as typedef in this scopeNr*   r*   )r   r+   r,   )r   r-   r.   r   r   r    _add_identifier   s
    
zCParser._add_identifierc             C   s.   x(t | jD ]}|j|}|dk	r|S qW dS )z8 Is *name* a typedef-name in the current scope?
        NF)reversedr   r+   )r   r-   ZscopeZin_scoper   r   r    _is_type_in_scope   s
    
 zCParser._is_type_in_scopec             C   s   | j || j|| d S )N)r,   _coord)r   msglinecolumnr   r   r    r      s    zCParser._lex_error_funcc             C   s   | j   d S )N)r'   )r   r   r   r    r      s    zCParser._lex_on_lbrace_funcc             C   s   | j   d S )N)r)   )r   r   r   r    r      s    zCParser._lex_on_rbrace_funcc             C   s   | j |}|S )z Looks up types that were previously defined with
            typedef.
            Passed to the lexer for recognizing identifiers that
            are types.
        )r2   )r   r-   Zis_typer   r   r    r      s    
zCParser._lex_type_lookup_funcc             C   s   | j jS )z We need access to yacc's lookahead token in certain cases.
            This is the last token yacc requested from the lexer, so we
            ask the lexer.
        )r   Z
last_token)r   r   r   r    _get_yacc_lookahead_token   s    z!CParser._get_yacc_lookahead_tokenc             C   sd   |}|}x|j r|j }q
W t|tjr0||_ |S |}xt|j tjsL|j }q6W |j |_ ||_ |S dS )z Tacks a type modifier on a declarator, and returns
            the modified declarator.

            Note: the declarator and modifier may be modified
        N)type
isinstancer   TypeDecl)r   declmodifierZmodifier_headZmodifier_tailZ	decl_tailr   r   r    _type_modify_decl   s    

zCParser._type_modify_declc             C   s   |}xt |tjs|j}qW |j|_|j|_x>|D ]6}t |tjs2t|dkr^| j	d|j
 q2||_|S q2W |st |jtjs| j	d|j
 tjdg|j
d|_n tjdd |D |d j
d|_|S )	z- Fixes a declaration. Modifies decl.
        r   z Invalid multiple types specifiedzMissing type in declarationint)r.   c             S   s   g | ]}|j D ]}|qqS r   )names).0idr-   r   r   r    
<listcomp>U  s    z/CParser._fix_decl_name_type.<locals>.<listcomp>r   )r9   r   r:   r8   declnamer-   qualsIdentifierTypelenr,   r.   FuncDecl)r   r;   typenamer8   Ztnr   r   r    _fix_decl_name_type,  s.    


zCParser._fix_decl_name_typec             C   s(   |pt g g g g d}|| 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

            This method is given a declaration specifier, and a
            new specifier of a given kind.
            Returns the declaration specifier, with the new
            specifier incorporated.
        )qualstorager8   functionr   )r   insert)r   ZdeclspecZnewspecZkindspecr   r   r    _add_declaration_specifierY  s    z"CParser._add_declaration_specifierc             C   s@  d|d k}g }|d j ddk	r&n4|d d dkrt|d dk svt|d d jd	ksv| j|d d jd  rd
}x"|d D ]}t|dr|j}P qW | jd| tj|d d jd dd|d d jd|d d< |d d= nrt	|d d tj
tjtjfsZ|d d }xt	|tjs.|j}qW |jdkrZ|d d jd |_|d d= x|D ]}	|rtjd|d |d |	d |	d jd}
n<tjd|d |d |d |	d |	j d|	j d|	d jd}
t	|
jtj
tjtjfr|
}n| j|
|d }|r,|r| j|j|j n| j|j|j |j| q`W |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.
        ZtypedefrK   r   bitsizeNr;   r8      r   ?r.   zInvalid declaration)rC   r8   rD   r.   rJ   )r-   rD   rK   r8   r.   rL   init)r-   rD   rK   funcspecr8   rS   rP   r.   r*   r*   r*   r*   r*   r*   r*   )r+   rF   r?   r2   hasattrr.   r,   r   r:   r9   StructUnionrE   r8   rC   ZTypedefDeclrI   r/   r-   r0   r&   )r   rN   declstypedef_namespaceZ
is_typedefZdeclarationsr.   tZdecls_0_tailr;   declarationZ
fixed_declr   r   r    _build_declarationsj  sl    &


zCParser._build_declarationsc             C   s2   | j |t|ddgddd }tj||||jdS )z' Builds a function definition.
        N)r;   rS   T)rN   rY   rZ   r   )r;   param_declsbodyr.   )r]   r   r   ZFuncDefr.   )r   rN   r;   r^   r_   r\   r   r   r    _build_function_definition  s    z"CParser._build_function_definitionc             C   s   |dkrt jS t jS dS )z` Given a token (either STRUCT or UNION), selects the
            appropriate AST class.
        structN)r   rV   rW   )r   tokenr   r   r    _select_struct_union_class  s    z"CParser._select_struct_union_classleftLORLANDORXORANDEQNEGTGELTLERSHIFTLSHIFTPLUSMINUSTIMESDIVIDEMODc             C   s2   |d dkrt jg |d< nt j|d |d< dS )zh translation_unit_or_empty   : translation_unit
                                        | empty
        r   Nr   )r   ZFileAST)r   pr   r   r    p_translation_unit_or_empty  s    z#CParser.p_translation_unit_or_emptyc             C   s   |d |d< dS )z4 translation_unit    : external_declaration
        r   r   Nr   )r   rw   r   r   r    p_translation_unit_1  s    zCParser.p_translation_unit_1c             C   s.   |d dk	r|d j |d  |d |d< dS )zE translation_unit    : translation_unit external_declaration
        rQ   Nr   r   )extend)r   rw   r   r   r    p_translation_unit_2  s    zCParser.p_translation_unit_2c             C   s   |d g|d< dS )z7 external_declaration    : function_definition
        r   r   Nr   )r   rw   r   r   r    p_external_declaration_1  s    z CParser.p_external_declaration_1c             C   s   |d |d< dS )z/ external_declaration    : declaration
        r   r   Nr   )r   rw   r   r   r    p_external_declaration_2  s    z CParser.p_external_declaration_2c             C   s   |d |d< dS )z0 external_declaration    : pp_directive
        r   r   Nr   )r   rw   r   r   r    p_external_declaration_3  s    z CParser.p_external_declaration_3c             C   s   d|d< dS )z( external_declaration    : SEMI
        Nr   r   )r   rw   r   r   r    p_external_declaration_4  s    z CParser.p_external_declaration_4c             C   s   | j d| j|jd dS )z  pp_directive  : PPHASH
        zDirectives not supported yetr   N)r,   r3   lineno)r   rw   r   r   r    p_pp_directive$  s    zCParser.p_pp_directivec             C   sP   t g g tjdg| j|jddgg d}| j||d |d |d d|d< d	S )
zR function_definition : declarator declaration_list_opt compound_statement
        r>   r   )r.   )rJ   rK   r8   rL   rQ      )rN   r;   r^   r_   r   N)r   r   rE   r3   r   r`   )r   rw   rN   r   r   r    p_function_definition_1-  s    zCParser.p_function_definition_1c             C   s.   |d }| j ||d |d |d d|d< dS )zi function_definition : declaration_specifiers declarator declaration_list_opt compound_statement
        r   rQ   r      )rN   r;   r^   r_   r   N)r`   )r   rw   rN   r   r   r    p_function_definition_2>  s    zCParser.p_function_definition_2c             C   s   |d |d< dS )a
   statement   : labeled_statement
                        | expression_statement
                        | compound_statement
                        | selection_statement
                        | iteration_statement
                        | jump_statement
        r   r   Nr   )r   rw   r   r   r    p_statementI  s    zCParser.p_statementc          
   C   s   |d }|d dkr|d }t jt jt jf}t|dkrzt|d |rzt jd|d |d |d |d dd|d jd	g}q| j|t	ddd
gdd}n| j||d dd}||d< dS )zE decl_body : declaration_specifiers init_declarator_list_opt
        r   rQ   Nr8   r   rJ   rK   rL   )r-   rD   rK   rT   r8   rS   rP   r.   )r;   rS   T)rN   rY   rZ   )
r   rV   rW   EnumrF   r9   rX   r.   r]   r   )r   rw   rN   ZtyZs_u_or_erY   r   r   r    p_decl_body\  s.    
zCParser.p_decl_bodyc             C   s   |d |d< dS )z& declaration : decl_body SEMI
        r   r   Nr   )r   rw   r   r   r    p_declaration  s    zCParser.p_declarationc             C   s,   t |dkr|d n|d |d  |d< dS )zj declaration_list    : declaration
                                | declaration_list declaration
        rQ   r   r   N)rF   )r   rw   r   r   r    p_declaration_list  s    zCParser.p_declaration_listc             C   s   | j |d |d d|d< dS )zM declaration_specifiers  : type_qualifier declaration_specifiers_opt
        rQ   r   rJ   r   N)rO   )r   rw   r   r   r    p_declaration_specifiers_1  s    z"CParser.p_declaration_specifiers_1c             C   s   | j |d |d d|d< dS )zM declaration_specifiers  : type_specifier declaration_specifiers_opt
        rQ   r   r8   r   N)rO   )r   rw   r   r   r    p_declaration_specifiers_2  s    z"CParser.p_declaration_specifiers_2c             C   s   | j |d |d d|d< dS )zV declaration_specifiers  : storage_class_specifier declaration_specifiers_opt
        rQ   r   rK   r   N)rO   )r   rw   r   r   r    p_declaration_specifiers_3  s    z"CParser.p_declaration_specifiers_3c             C   s   | j |d |d d|d< dS )zQ declaration_specifiers  : function_specifier declaration_specifiers_opt
        rQ   r   rL   r   N)rO   )r   rw   r   r   r    p_declaration_specifiers_4  s    z"CParser.p_declaration_specifiers_4c             C   s   |d |d< dS )z storage_class_specifier : AUTO
                                    | REGISTER
                                    | STATIC
                                    | EXTERN
                                    | TYPEDEF
        r   r   Nr   )r   rw   r   r   r    p_storage_class_specifier  s    z!CParser.p_storage_class_specifierc             C   s   |d |d< dS )z& function_specifier  : INLINE
        r   r   Nr   )r   rw   r   r   r    p_function_specifier  s    zCParser.p_function_specifierc             C   s(   t j|d g| j|jdd|d< dS )a   type_specifier  : VOID
                            | _BOOL
                            | CHAR
                            | SHORT
                            | INT
                            | LONG
                            | FLOAT
                            | DOUBLE
                            | _COMPLEX
                            | SIGNED
                            | UNSIGNED
        r   )r.   r   N)r   rE   r3   r   )r   rw   r   r   r    p_type_specifier_1  s    zCParser.p_type_specifier_1c             C   s   |d |d< dS )z type_specifier  : typedef_name
                            | enum_specifier
                            | struct_or_union_specifier
        r   r   Nr   )r   rw   r   r   r    p_type_specifier_2  s    zCParser.p_type_specifier_2c             C   s   |d |d< dS )zo type_qualifier  : CONST
                            | RESTRICT
                            | VOLATILE
        r   r   Nr   )r   rw   r   r   r    p_type_qualifier  s    zCParser.p_type_qualifierc             C   s0   t |dkr|d |d g n|d g|d< dS )z init_declarator_list    : init_declarator
                                    | init_declarator_list COMMA init_declarator
        r   r   r   r   N)rF   )r   rw   r   r   r    p_init_declarator_list_1  s    z CParser.p_init_declarator_list_1c             C   s   t d|d dg|d< dS )z6 init_declarator_list    : EQUALS initializer
        NrQ   )r;   rS   r   )r   )r   rw   r   r   r    p_init_declarator_list_2  s    z CParser.p_init_declarator_list_2c             C   s   t |d ddg|d< dS )z7 init_declarator_list    : abstract_declarator
        r   N)r;   rS   r   )r   )r   rw   r   r   r    p_init_declarator_list_3  s    z CParser.p_init_declarator_list_3c             C   s,   t |d t|dkr|d ndd|d< dS )zb init_declarator : declarator
                            | declarator EQUALS initializer
        r   rQ   r   N)r;   rS   r   )r   rF   )r   rw   r   r   r    p_init_declarator   s    zCParser.p_init_declaratorc             C   s   | j |d |d d|d< dS )zS specifier_qualifier_list    : type_qualifier specifier_qualifier_list_opt
        rQ   r   rJ   r   N)rO   )r   rw   r   r   r    p_specifier_qualifier_list_1  s    z$CParser.p_specifier_qualifier_list_1c             C   s   | j |d |d d|d< dS )zS specifier_qualifier_list    : type_specifier specifier_qualifier_list_opt
        rQ   r   r8   r   N)rO   )r   rw   r   r   r    p_specifier_qualifier_list_2  s    z$CParser.p_specifier_qualifier_list_2c             C   s4   | j |d }||d d| j|jdd|d< dS )z{ struct_or_union_specifier   : struct_or_union ID
                                        | struct_or_union TYPEID
        r   rQ   N)r-   rY   r.   r   )rc   r3   r   )r   rw   klassr   r   r    p_struct_or_union_specifier_1  s
    z%CParser.p_struct_or_union_specifier_1c             C   s4   | j |d }|d|d | j|jdd|d< dS )zd struct_or_union_specifier : struct_or_union brace_open struct_declaration_list brace_close
        r   Nr   rQ   )r-   rY   r.   r   )rc   r3   r   )r   rw   r   r   r   r    p_struct_or_union_specifier_2  s
    z%CParser.p_struct_or_union_specifier_2c             C   s8   | j |d }||d |d | j|jdd|d< dS )z struct_or_union_specifier   : struct_or_union ID brace_open struct_declaration_list brace_close
                                        | struct_or_union TYPEID brace_open struct_declaration_list brace_close
        r   rQ   r   )r-   rY   r.   r   N)rc   r3   r   )r   rw   r   r   r   r    p_struct_or_union_specifier_3&  s
    z%CParser.p_struct_or_union_specifier_3c             C   s   |d |d< dS )zF struct_or_union : STRUCT
                            | UNION
        r   r   Nr   )r   rw   r   r   r    p_struct_or_union0  s    zCParser.p_struct_or_unionc             C   s,   t |dkr|d n|d |d  |d< dS )z struct_declaration_list     : struct_declaration
                                        | struct_declaration_list struct_declaration
        rQ   r   r   N)rF   )r   rw   r   r   r    p_struct_declaration_list8  s    z!CParser.p_struct_declaration_listc             C   s   |d }|d dk	r(| j ||d d}nht|d dkrx|d d }t|tjrV|}n
tj|}| j |t|dgd}n| j |tdddgd}||d< dS )	zW struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI
        r   rQ   N)rN   rY   r8   r   )r;   )r;   rS   )r]   rF   r9   r   ZNoderE   r   )r   rw   rN   rY   ZnodeZ	decl_typer   r   r    p_struct_declaration_1>  s"    
zCParser.p_struct_declaration_1c             C   s(   | j |d t|d ddgd|d< dS )zP struct_declaration : specifier_qualifier_list abstract_declarator SEMI
        r   rQ   N)r;   rS   )rN   rY   r   )r]   r   )r   rw   r   r   r    p_struct_declaration_2d  s    
zCParser.p_struct_declaration_2c             C   s0   t |dkr|d |d g n|d g|d< dS )z struct_declarator_list  : struct_declarator
                                    | struct_declarator_list COMMA struct_declarator
        r   r   r   r   N)rF   )r   rw   r   r   r    p_struct_declarator_listr  s    z CParser.p_struct_declarator_listc             C   s   |d dd|d< dS )z( struct_declarator : declarator
        r   N)r;   rP   r   r   )r   rw   r   r   r    p_struct_declarator_1{  s    zCParser.p_struct_declarator_1c             C   sD   t |dkr$|d |d d|d< ntjddd|d d|d< dS )z struct_declarator   : declarator COLON constant_expression
                                | COLON constant_expression
        r   r   )r;   rP   r   NrQ   )rF   r   r:   )r   rw   r   r   r    p_struct_declarator_2  s    zCParser.p_struct_declarator_2c             C   s&   t j|d d| j|jd|d< dS )zM enum_specifier  : ENUM ID
                            | ENUM TYPEID
        rQ   Nr   r   )r   r   r3   r   )r   rw   r   r   r    p_enum_specifier_1  s    zCParser.p_enum_specifier_1c             C   s&   t jd|d | j|jd|d< dS )zG enum_specifier  : ENUM brace_open enumerator_list brace_close
        Nr   r   r   )r   r   r3   r   )r   rw   r   r   r    p_enum_specifier_2  s    zCParser.p_enum_specifier_2c             C   s*   t j|d |d | j|jd|d< dS )z enum_specifier  : ENUM ID brace_open enumerator_list brace_close
                            | ENUM TYPEID brace_open enumerator_list brace_close
        rQ   r   r   r   N)r   r   r3   r   )r   rw   r   r   r    p_enum_specifier_3  s    zCParser.p_enum_specifier_3c             C   sh   t |dkr*tj|d g|d j|d< n:t |dkrD|d |d< n |d jj|d  |d |d< dS )z enumerator_list : enumerator
                            | enumerator_list COMMA
                            | enumerator_list COMMA enumerator
        rQ   r   r   r   N)rF   r   ZEnumeratorListr.   Zenumeratorsr&   )r   rw   r   r   r    p_enumerator_list  s    zCParser.p_enumerator_listc             C   sj   t |dkr,tj|d d| j|jd}n"tj|d |d | j|jd}| j|j|j ||d< dS )zR enumerator  : ID
                        | ID EQUALS constant_expression
        rQ   r   Nr   r   )rF   r   Z
Enumeratorr3   r   r0   r-   r.   )r   rw   Z
enumeratorr   r   r    p_enumerator  s    zCParser.p_enumeratorc             C   s   |d |d< dS )z) declarator  : direct_declarator
        r   r   Nr   )r   rw   r   r   r    p_declarator_1  s    zCParser.p_declarator_1c             C   s   | j |d |d |d< dS )z1 declarator  : pointer direct_declarator
        rQ   r   r   N)r=   )r   rw   r   r   r    p_declarator_2  s    zCParser.p_declarator_2c             C   s:   t j|d dd| j|jdd}| j||d |d< dS )z& declarator  : pointer TYPEID
        rQ   N)rC   r8   rD   r.   r   r   )r   r:   r3   r   r=   )r   rw   r;   r   r   r    p_declarator_3  s    zCParser.p_declarator_3c             C   s*   t j|d dd| j|jdd|d< dS )z" direct_declarator   : ID
        r   N)rC   r8   rD   r.   r   )r   r:   r3   r   )r   rw   r   r   r    p_direct_declarator_1  s
    zCParser.p_direct_declarator_1c             C   s   |d |d< dS )z8 direct_declarator   : LPAREN declarator RPAREN
        rQ   r   Nr   )r   rw   r   r   r    p_direct_declarator_2  s    zCParser.p_direct_declarator_2c             C   sf   t |dkr|d ng pg }tjdt |dkr6|d n|d ||d jd}| j|d |d|d< dS )	zu direct_declarator   : direct_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
           r   Nr   r   )r8   dim	dim_qualsr.   )r;   r<   r   )rF   r   	ArrayDeclr.   r=   )r   rw   rD   arrr   r   r    p_direct_declarator_3  s    zCParser.p_direct_declarator_3c             C   s^   dd |d |d gD }dd |D }t jd|d ||d jd	}| j|d |d
|d< dS )z direct_declarator   : direct_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET
                                | direct_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET
        c             S   s    g | ]}t |tr|n|gqS r   )r9   list)r@   itemr   r   r    rB     s   z1CParser.p_direct_declarator_4.<locals>.<listcomp>r   r   c             S   s"   g | ]}|D ]}|d k	r|qqS )Nr   )r@   ZsublistrJ   r   r   r    rB     s    
Nr   r   )r8   r   r   r.   )r;   r<   r   )r   r   r.   r=   )r   rw   Zlisted_qualsr   r   r   r   r    p_direct_declarator_4  s    zCParser.p_direct_declarator_4c             C   s^   t jdt j|d | j|jd|d dkr4|d ng |d jd}| j|d |d|d< dS )za direct_declarator   : direct_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET
        Nr   r   r   )r8   r   r   r.   )r;   r<   r   )r   r   IDr3   r   r.   r=   )r   rw   r   r   r   r    p_direct_declarator_5  s    zCParser.p_direct_declarator_5c             C   s|   t j|d d|d jd}| j jdkrb|jdk	rbx.|jjD ]"}t|t jrNP | j	|j
|j q<W | j|d |d|d< dS )z direct_declarator   : direct_declarator LPAREN parameter_type_list RPAREN
                                | direct_declarator LPAREN identifier_list_opt RPAREN
        r   Nr   )argsr8   r.   LBRACE)r;   r<   r   )r   rG   r.   r7   r8   r   paramsr9   EllipsisParamr0   r-   r=   )r   rw   funcZparamr   r   r    p_direct_declarator_6  s    
 zCParser.p_direct_declarator_6c             C   sr   | j |jd}tj|d pg d|d}t|dkrf|d }x|jdk	rP|j}q>W ||_|d |d< n||d< dS )zm pointer : TIMES type_qualifier_list_opt
                    | TIMES type_qualifier_list_opt pointer
        r   rQ   N)rD   r8   r.   r   r   )r3   r   r   ZPtrDeclrF   r8   )r   rw   r.   Znested_typeZ	tail_typer   r   r    	p_pointer(  s    
zCParser.p_pointerc             C   s0   t |dkr|d gn|d |d g |d< dS )zs type_qualifier_list : type_qualifier
                                | type_qualifier_list type_qualifier
        rQ   r   r   N)rF   )r   rw   r   r   r    p_type_qualifier_listF  s    zCParser.p_type_qualifier_listc             C   s>   t |dkr.|d jjtj| j|jd |d |d< dS )zn parameter_type_list : parameter_list
                                | parameter_list COMMA ELLIPSIS
        rQ   r   r   r   N)rF   r   r&   r   r   r3   r   )r   rw   r   r   r    p_parameter_type_listL  s    "zCParser.p_parameter_type_listc             C   sN   t |dkr*tj|d g|d j|d< n |d jj|d  |d |d< dS )zz parameter_list  : parameter_declaration
                            | parameter_list COMMA parameter_declaration
        rQ   r   r   r   N)rF   r   	ParamListr.   r   r&   )r   rw   r   r   r    p_parameter_listU  s    zCParser.p_parameter_listc             C   sX   |d }|d s2t jdg| j|jddg|d< | j|t|d dgdd |d< d	S )
zE parameter_declaration   : declaration_specifiers declarator
        r   r8   r>   )r.   rQ   )r;   )rN   rY   r   N)r   rE   r3   r   r]   r   )r   rw   rN   r   r   r    p_parameter_declaration_1_  s    z!CParser.p_parameter_declaration_1c             C   s   |d }|d s2t jdg| j|jddg|d< t|d dkrt|d d jdkr| j|d d jd r| j|t|d ddgd	d }nHt j	d
|d |d pt j
ddd| j|jdd}|d }| j||}||d< dS )zR parameter_declaration   : declaration_specifiers abstract_declarator_opt
        r   r8   r>   )r.   r   rQ   N)r;   rS   )rN   rY   r   rJ   )r-   rD   r8   r.   r*   r*   )r   rE   r3   r   rF   r?   r2   r]   r   Typenamer:   rI   )r   rw   rN   r;   rH   r   r   r    p_parameter_declaration_2j  s"    &z!CParser.p_parameter_declaration_2c             C   sN   t |dkr*tj|d g|d j|d< n |d jj|d  |d |d< dS )ze identifier_list : identifier
                            | identifier_list COMMA identifier
        rQ   r   r   r   N)rF   r   r   r.   r   r&   )r   rw   r   r   r    p_identifier_list  s    zCParser.p_identifier_listc             C   s   |d |d< dS )z- initializer : assignment_expression
        r   r   Nr   )r   rw   r   r   r    p_initializer_1  s    zCParser.p_initializer_1c             C   s:   |d dkr*t jg | j|jd|d< n|d |d< dS )z initializer : brace_open initializer_list_opt brace_close
                        | brace_open initializer_list COMMA brace_close
        rQ   Nr   r   )r   InitListr3   r   )r   rw   r   r   r    p_initializer_2  s    zCParser.p_initializer_2c             C   s   t |dkrN|d dkr |d ntj|d |d }tj|g|d j|d< nD|d dkrb|d ntj|d |d }|d jj| |d |d< dS )z initializer_list    : designation_opt initializer
                                | initializer_list COMMA designation_opt initializer
        r   r   NrQ   r   r   )rF   r   ZNamedInitializerr   r.   exprsr&   )r   rw   rS   r   r   r    p_initializer_list  s    ((zCParser.p_initializer_listc             C   s   |d |d< dS )z. designation : designator_list EQUALS
        r   r   Nr   )r   rw   r   r   r    p_designation  s    zCParser.p_designationc             C   s0   t |dkr|d gn|d |d g |d< dS )z_ designator_list : designator
                            | designator_list designator
        rQ   r   r   N)rF   )r   rw   r   r   r    p_designator_list  s    zCParser.p_designator_listc             C   s   |d |d< dS )zi designator  : LBRACKET constant_expression RBRACKET
                        | PERIOD identifier
        rQ   r   Nr   )r   rw   r   r   r    p_designator  s    zCParser.p_designatorc             C   sT   t jd|d d |d p$t jddd| j|jdd}| j||d d |d< dS )	zH type_name   : specifier_qualifier_list abstract_declarator_opt
        r   r   rJ   rQ   N)r-   rD   r8   r.   r8   r   )r   r   r:   r3   r   rI   )r   rw   rH   r   r   r    p_type_name  s    	
zCParser.p_type_namec             C   s(   t jddd}| j||d d|d< dS )z+ abstract_declarator     : pointer
        Nr   )r;   r<   r   )r   r:   r=   )r   rw   Z	dummytyper   r   r    p_abstract_declarator_1  s    zCParser.p_abstract_declarator_1c             C   s   | j |d |d |d< dS )zF abstract_declarator     : pointer direct_abstract_declarator
        rQ   r   r   N)r=   )r   rw   r   r   r    p_abstract_declarator_2  s    zCParser.p_abstract_declarator_2c             C   s   |d |d< dS )z> abstract_declarator     : direct_abstract_declarator
        r   r   Nr   )r   rw   r   r   r    p_abstract_declarator_3  s    zCParser.p_abstract_declarator_3c             C   s   |d |d< dS )zA direct_abstract_declarator  : LPAREN abstract_declarator RPAREN rQ   r   Nr   )r   rw   r   r   r    p_direct_abstract_declarator_1  s    z&CParser.p_direct_abstract_declarator_1c             C   s6   t jd|d g |d jd}| j|d |d|d< dS )zn direct_abstract_declarator  : direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET
        Nr   r   )r8   r   r   r.   )r;   r<   r   )r   r   r.   r=   )r   rw   r   r   r   r    p_direct_abstract_declarator_2  s    z&CParser.p_direct_abstract_declarator_2c             C   s4   t jt jddd|d g | j|jdd|d< dS )zS direct_abstract_declarator  : LBRACKET assignment_expression_opt RBRACKET
        NrQ   r   )r8   r   r   r.   r   )r   r   r:   r3   r   )r   rw   r   r   r    p_direct_abstract_declarator_3  s
    z&CParser.p_direct_abstract_declarator_3c             C   sJ   t jdt j|d | j|jdg |d jd}| j|d |d|d< dS )zZ direct_abstract_declarator  : direct_abstract_declarator LBRACKET TIMES RBRACKET
        Nr   r   )r8   r   r   r.   )r;   r<   r   )r   r   r   r3   r   r.   r=   )r   rw   r   r   r   r    p_direct_abstract_declarator_4  s    z&CParser.p_direct_abstract_declarator_4c             C   sH   t jt jdddt j|d | j|jdg | j|jdd|d< dS )z? direct_abstract_declarator  : LBRACKET TIMES RBRACKET
        Nr   r   )r8   r   r   r.   r   )r   r   r:   r   r3   r   )r   rw   r   r   r    p_direct_abstract_declarator_5  s
    z&CParser.p_direct_abstract_declarator_5c             C   s4   t j|d d|d jd}| j|d |d|d< dS )zh direct_abstract_declarator  : direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN
        r   Nr   )r   r8   r.   )r;   r<   r   )r   rG   r.   r=   )r   rw   r   r   r   r    p_direct_abstract_declarator_6  s
    z&CParser.p_direct_abstract_declarator_6c             C   s2   t j|d t jddd| j|jdd|d< dS )zM direct_abstract_declarator  : LPAREN parameter_type_list_opt RPAREN
        rQ   Nr   )r   r8   r.   r   )r   rG   r:   r3   r   )r   rw   r   r   r    p_direct_abstract_declarator_7  s    z&CParser.p_direct_abstract_declarator_7c             C   s(   t |d tr|d n|d g|d< dS )zG block_item  : declaration
                        | statement
        r   r   N)r9   r   )r   rw   r   r   r    p_block_item*  s    zCParser.p_block_itemc             C   s:   t |dks|d dgkr"|d n|d |d  |d< dS )z_ block_item_list : block_item
                            | block_item_list block_item
        rQ   Nr   r   )rF   )r   rw   r   r   r    p_block_item_list2  s    zCParser.p_block_item_listc             C   s&   t j|d | j|jdd|d< dS )zA compound_statement : brace_open block_item_list_opt brace_close rQ   r   )Zblock_itemsr.   r   N)r   ZCompoundr3   r   )r   rw   r   r   r    p_compound_statement_19  s    zCParser.p_compound_statement_1c             C   s*   t j|d |d | j|jd|d< dS )z( labeled_statement : ID COLON statement r   r   r   N)r   ZLabelr3   r   )r   rw   r   r   r    p_labeled_statement_1?  s    zCParser.p_labeled_statement_1c             C   s,   t j|d |d g| j|jd|d< dS )z> labeled_statement : CASE constant_expression COLON statement rQ   r   r   r   N)r   ZCaser3   r   )r   rw   r   r   r    p_labeled_statement_2C  s    zCParser.p_labeled_statement_2c             C   s&   t j|d g| j|jd|d< dS )z- labeled_statement : DEFAULT COLON statement r   r   r   N)r   ZDefaultr3   r   )r   rw   r   r   r    p_labeled_statement_3G  s    zCParser.p_labeled_statement_3c             C   s,   t j|d |d d| j|jd|d< dS )z= selection_statement : IF LPAREN expression RPAREN statement r   r   Nr   r   )r   Ifr3   r   )r   rw   r   r   r    p_selection_statement_1K  s    zCParser.p_selection_statement_1c             C   s0   t j|d |d |d | j|jd|d< dS )zL selection_statement : IF LPAREN expression RPAREN statement ELSE statement r   r      r   r   N)r   r   r3   r   )r   rw   r   r   r    p_selection_statement_2O  s    zCParser.p_selection_statement_2c             C   s.   t tj|d |d | j|jd|d< dS )zA selection_statement : SWITCH LPAREN expression RPAREN statement r   r   r   r   N)r	   r   ZSwitchr3   r   )r   rw   r   r   r    p_selection_statement_3S  s    zCParser.p_selection_statement_3c             C   s*   t j|d |d | j|jd|d< dS )z@ iteration_statement : WHILE LPAREN expression RPAREN statement r   r   r   r   N)r   ZWhiler3   r   )r   rw   r   r   r    p_iteration_statement_1X  s    zCParser.p_iteration_statement_1c             C   s*   t j|d |d | j|jd|d< dS )zH iteration_statement : DO statement WHILE LPAREN expression RPAREN SEMI r   rQ   r   r   N)r   ZDoWhiler3   r   )r   rw   r   r   r    p_iteration_statement_2\  s    zCParser.p_iteration_statement_2c             C   s6   t j|d |d |d |d | j|jd|d< dS )zj iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN statement r   r   r   	   r   r   N)r   Forr3   r   )r   rw   r   r   r    p_iteration_statement_3`  s    zCParser.p_iteration_statement_3c             C   sJ   t jt j|d | j|jd|d |d |d | j|jd|d< dS )zb iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN statement r   r   r         r   N)r   r   ZDeclListr3   r   )r   rw   r   r   r    p_iteration_statement_4d  s    zCParser.p_iteration_statement_4c             C   s$   t j|d | j|jd|d< dS )z  jump_statement  : GOTO ID SEMI rQ   r   r   N)r   ZGotor3   r   )r   rw   r   r   r    p_jump_statement_1i  s    zCParser.p_jump_statement_1c             C   s   t j| j|jd|d< dS )z jump_statement  : BREAK SEMI r   r   N)r   ZBreakr3   r   )r   rw   r   r   r    p_jump_statement_2m  s    zCParser.p_jump_statement_2c             C   s   t j| j|jd|d< dS )z! jump_statement  : CONTINUE SEMI r   r   N)r   ZContinuer3   r   )r   rw   r   r   r    p_jump_statement_3q  s    zCParser.p_jump_statement_3c             C   s4   t jt|dkr|d nd| j|jd|d< dS )z\ jump_statement  : RETURN expression SEMI
                            | RETURN SEMI
        r   rQ   Nr   r   )r   ZReturnrF   r3   r   )r   rw   r   r   r    p_jump_statement_4u  s    zCParser.p_jump_statement_4c             C   s8   |d dkr(t j| j|jd|d< n|d |d< dS )z, expression_statement : expression_opt SEMI r   Nr   )r   ZEmptyStatementr3   r   )r   rw   r   r   r    p_expression_statement{  s    zCParser.p_expression_statementc             C   sj   t |dkr|d |d< nLt|d tjsFtj|d g|d j|d< |d jj|d  |d |d< dS )zn expression  : assignment_expression
                        | expression COMMA assignment_expression
        rQ   r   r   r   N)rF   r9   r   ExprListr.   r   r&   )r   rw   r   r   r    p_expression  s    zCParser.p_expressionc             C   s(   t j|d g| j|jdd|d< dS )z typedef_name : TYPEID r   )r.   r   N)r   rE   r3   r   )r   rw   r   r   r    p_typedef_name  s    zCParser.p_typedef_namec             C   sD   t |dkr|d |d< n&tj|d |d |d |d j|d< dS )z assignment_expression   : conditional_expression
                                    | unary_expression assignment_operator assignment_expression
        rQ   r   r   r   N)rF   r   Z
Assignmentr.   )r   rw   r   r   r    p_assignment_expression  s    zCParser.p_assignment_expressionc             C   s   |d |d< dS )a   assignment_operator : EQUALS
                                | XOREQUAL
                                | TIMESEQUAL
                                | DIVEQUAL
                                | MODEQUAL
                                | PLUSEQUAL
                                | MINUSEQUAL
                                | LSHIFTEQUAL
                                | RSHIFTEQUAL
                                | ANDEQUAL
                                | OREQUAL
        r   r   Nr   )r   rw   r   r   r    p_assignment_operator  s    zCParser.p_assignment_operatorc             C   s   |d |d< dS )z. constant_expression : conditional_expression r   r   Nr   )r   rw   r   r   r    p_constant_expression  s    zCParser.p_constant_expressionc             C   sD   t |dkr|d |d< n&tj|d |d |d |d j|d< dS )z conditional_expression  : binary_expression
                                    | binary_expression CONDOP expression COLON conditional_expression
        rQ   r   r   r   r   N)rF   r   Z	TernaryOpr.   )r   rw   r   r   r    p_conditional_expression  s    z CParser.p_conditional_expressionc             C   sD   t |dkr|d |d< n&tj|d |d |d |d j|d< dS )ak   binary_expression   : cast_expression
                                | binary_expression TIMES binary_expression
                                | binary_expression DIVIDE binary_expression
                                | binary_expression MOD binary_expression
                                | binary_expression PLUS binary_expression
                                | binary_expression MINUS binary_expression
                                | binary_expression RSHIFT binary_expression
                                | binary_expression LSHIFT binary_expression
                                | binary_expression LT binary_expression
                                | binary_expression LE binary_expression
                                | binary_expression GE binary_expression
                                | binary_expression GT binary_expression
                                | binary_expression EQ binary_expression
                                | binary_expression NE binary_expression
                                | binary_expression AND binary_expression
                                | binary_expression OR binary_expression
                                | binary_expression XOR binary_expression
                                | binary_expression LAND binary_expression
                                | binary_expression LOR binary_expression
        rQ   r   r   r   N)rF   r   ZBinaryOpr.   )r   rw   r   r   r    p_binary_expression  s    zCParser.p_binary_expressionc             C   s   |d |d< dS )z$ cast_expression : unary_expression r   r   Nr   )r   rw   r   r   r    p_cast_expression_1  s    zCParser.p_cast_expression_1c             C   s*   t j|d |d | j|jd|d< dS )z; cast_expression : LPAREN type_name RPAREN cast_expression rQ   r   r   r   N)r   ZCastr3   r   )r   rw   r   r   r    p_cast_expression_2  s    zCParser.p_cast_expression_2c             C   s   |d |d< dS )z* unary_expression    : postfix_expression r   r   Nr   )r   rw   r   r   r    p_unary_expression_1  s    zCParser.p_unary_expression_1c             C   s$   t j|d |d |d j|d< dS )z unary_expression    : PLUSPLUS unary_expression
                                | MINUSMINUS unary_expression
                                | unary_operator cast_expression
        r   rQ   r   N)r   UnaryOpr.   )r   rw   r   r   r    p_unary_expression_2  s    zCParser.p_unary_expression_2c             C   s>   t j|d t|dkr|d n|d | j|jd|d< dS )zx unary_expression    : SIZEOF unary_expression
                                | SIZEOF LPAREN type_name RPAREN
        r   r   rQ   r   N)r   r   rF   r3   r   )r   rw   r   r   r    p_unary_expression_3  s    zCParser.p_unary_expression_3c             C   s   |d |d< dS )z unary_operator  : AND
                            | TIMES
                            | PLUS
                            | MINUS
                            | NOT
                            | LNOT
        r   r   Nr   )r   rw   r   r   r    p_unary_operator  s    zCParser.p_unary_operatorc             C   s   |d |d< dS )z* postfix_expression  : primary_expression r   r   Nr   )r   rw   r   r   r    p_postfix_expression_1  s    zCParser.p_postfix_expression_1c             C   s$   t j|d |d |d j|d< dS )zG postfix_expression  : postfix_expression LBRACKET expression RBRACKET r   r   r   N)r   ZArrayRefr.   )r   rw   r   r   r    p_postfix_expression_2  s    zCParser.p_postfix_expression_2c             C   s4   t j|d t|dkr|d nd|d j|d< dS )z postfix_expression  : postfix_expression LPAREN argument_expression_list RPAREN
                                | postfix_expression LPAREN RPAREN
        r   r   r   Nr   )r   FuncCallrF   r.   )r   rw   r   r   r    p_postfix_expression_3  s    zCParser.p_postfix_expression_3c             C   sB   t j|d | j|jd}t j|d |d ||d j|d< dS )z postfix_expression  : postfix_expression PERIOD ID
                                | postfix_expression PERIOD TYPEID
                                | postfix_expression ARROW ID
                                | postfix_expression ARROW TYPEID
        r   r   rQ   r   N)r   r   r3   r   Z	StructRefr.   )r   rw   Zfieldr   r   r    p_postfix_expression_4  s    zCParser.p_postfix_expression_4c             C   s(   t jd|d  |d |d j|d< dS )z{ postfix_expression  : postfix_expression PLUSPLUS
                                | postfix_expression MINUSMINUS
        rw   rQ   r   r   N)r   r   r.   )r   rw   r   r   r    p_postfix_expression_5  s    zCParser.p_postfix_expression_5c             C   s   t j|d |d |d< dS )z postfix_expression  : LPAREN type_name RPAREN brace_open initializer_list brace_close
                                | LPAREN type_name RPAREN brace_open initializer_list COMMA brace_close
        rQ   r   r   N)r   ZCompoundLiteral)r   rw   r   r   r    p_postfix_expression_6  s    zCParser.p_postfix_expression_6c             C   s   |d |d< dS )z" primary_expression  : identifier r   r   Nr   )r   rw   r   r   r    p_primary_expression_1   s    zCParser.p_primary_expression_1c             C   s   |d |d< dS )z  primary_expression  : constant r   r   Nr   )r   rw   r   r   r    p_primary_expression_2$  s    zCParser.p_primary_expression_2c             C   s   |d |d< dS )zp primary_expression  : unified_string_literal
                                | unified_wstring_literal
        r   r   Nr   )r   rw   r   r   r    p_primary_expression_3(  s    zCParser.p_primary_expression_3c             C   s   |d |d< dS )z0 primary_expression  : LPAREN expression RPAREN rQ   r   Nr   )r   rw   r   r   r    p_primary_expression_4.  s    zCParser.p_primary_expression_4c             C   sF   | j |jd}tjtj|d |tj|d |d g|||d< dS )zQ primary_expression  : OFFSETOF LPAREN type_name COMMA identifier RPAREN
        r   r   r   r   N)r3   r   r   r  r   r   )r   rw   r.   r   r   r    p_primary_expression_52  s    zCParser.p_primary_expression_5c             C   sN   t |dkr*tj|d g|d j|d< n |d jj|d  |d |d< dS )z argument_expression_list    : assignment_expression
                                        | argument_expression_list COMMA assignment_expression
        rQ   r   r   r   N)rF   r   r   r.   r   r&   )r   rw   r   r   r    p_argument_expression_list:  s    z"CParser.p_argument_expression_listc             C   s$   t j|d | j|jd|d< dS )z identifier  : ID r   r   N)r   r   r3   r   )r   rw   r   r   r    p_identifierD  s    zCParser.p_identifierc             C   s&   t jd|d | j|jd|d< dS )z constant    : INT_CONST_DEC
                        | INT_CONST_OCT
                        | INT_CONST_HEX
                        | INT_CONST_BIN
        r>   r   r   N)r   Constantr3   r   )r   rw   r   r   r    p_constant_1H  s    zCParser.p_constant_1c             C   s&   t jd|d | j|jd|d< dS )zM constant    : FLOAT_CONST
                        | HEX_FLOAT_CONST
        floatr   r   N)r   r  r3   r   )r   rw   r   r   r    p_constant_2Q  s    zCParser.p_constant_2c             C   s&   t jd|d | j|jd|d< dS )zH constant    : CHAR_CONST
                        | WCHAR_CONST
        charr   r   N)r   r  r3   r   )r   rw   r   r   r    p_constant_3X  s    zCParser.p_constant_3c             C   sh   t |dkr0tjd|d | j|jd|d< n4|d jdd |d dd  |d _|d |d< dS )z~ unified_string_literal  : STRING_LITERAL
                                    | unified_string_literal STRING_LITERAL
        rQ   stringr   r   Nr*   )rF   r   r  r3   r   value)r   rw   r   r   r    p_unified_string_literald  s
     (z CParser.p_unified_string_literalc             C   sl   t |dkr0tjd|d | j|jd|d< n8|d jj dd |d dd  |d _|d |d< dS )z unified_wstring_literal : WSTRING_LITERAL
                                    | unified_wstring_literal WSTRING_LITERAL
        rQ   r  r   r   Nr*   )rF   r   r  r3   r   r  rstrip)r   rw   r   r   r    p_unified_wstring_literalo  s
     ,z!CParser.p_unified_wstring_literalc             C   s   |d |d< dS )z  brace_open  :   LBRACE
        r   r   Nr   )r   rw   r   r   r    p_brace_openz  s    zCParser.p_brace_openc             C   s   |d |d< dS )z  brace_close :   RBRACE
        r   r   Nr   )r   rw   r   r   r    p_brace_close  s    zCParser.p_brace_closec             C   s   d|d< dS )zempty : Nr   r   )r   rw   r   r   r    p_empty  s    zCParser.p_emptyc             C   s<   |r,| j d|j | j|j| jj|d n| j dd d S )Nz
before: %s)r   r6   zAt end of inputr   )r,   r  r3   r   r   Zfind_tok_column)r   rw   r   r   r    p_error  s    zCParser.p_errorN)Tr   Tr   Fr   )r   r   )Frd   re   rd   rf   rd   rg   rd   rh   rd   ri   rd   rj   rk   rd   rl   rm   rn   ro   rd   rp   rq   rd   rr   rs   rd   rt   ru   rv   )
r   r!  r"  r#  r$  r%  r&  r'  r(  r)  )__name__
__module____qualname__r!   r$   r'   r)   r/   r0   r2   r   r   r   r   r7   r=   rI   rO   r]   r`   rc   Z
precedencerx   ry   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r	  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r    r
      sF       c	

	)7-Y         		;		
	
&					

	
		
		
	
	r
   __main__)reZplyr   r   r   Zc_lexerr   Z	plyparserr   r   r   Zast_transformsr	   r
   r*  pprintZtimesysr   r   r   r    <module>	   s,                