translation_unit:

translation_unit external_decl

external_decl:

function_definition decl

function_definition:

decl_specs declarator decl_list compound_stat

decl_list:

decl_list decl_specs init_declarator_list ;

decl_specs:

storage_class_spec type_spec type_qualifier decl_specs

storage_class_spec:

auto register static extern typedef

type_spec:

void char short int long float double signed unsigned struct_or_union_spec enum_spec typedef_name

type_qualifier:

const volatile

struct_or_union_spec:

struct union id id { struct_decl_list }

struct_decl_list:

struct_decl_list spec_qualifier_list struct_declarator_list ;

init_declarator_list:

init_declarator_list , declarator = initializer

spec_qualifier_list:

type_spec type_qualifier spec_qualifier_list

struct_declarator_list:

struct_declarator_list , declarator declarator : const_exp

enum_spec:

enum id id { enumerator_list }

enumerator_list:

enumerator_list , id = const_exp

declarator:

pointer direct_declarator

direct_declarator:

id ( declarator ) direct_declarator [ const_exp ] direct_declarator ( param_type_list id_list )

pointer:

* type_qualifier_list pointer

type_qualifier_list:

type_qualifier_list type_qualifier

param_type_list:

param_list , ...

param_list:

param_decl ,

param_decl:

decl_specs declarator abstract_declarator

id_list:

id ,

initializer:

assignment_exp { initializer_list } { initializer_list , }

initializer_list:

initializer ,

type_name:

spec_qualifier_list abstract_declarator

abstract_declarator:

pointer pointer direct_abstract_declarator direct_abstract_declarator

direct_abstract_declarator:

( abstract_declarator ) direct_abstract_declarator [ const_exp ] [ ] ( param_type_list )

typedef_name:

id

stat:

labeled_stat exp_stat compound_stat selection_stat iteration_stat jump_stat

labeled_stat:

id case default : stat

exp_stat:

exp ;

compound_stat:

{ decl_list stat_list }

stat_list:

stat

selection_stat:

if ( exp ) stat else stat switch ( exp ) stat

iteration_stat:

while ( exp ) stat do stat while ( exp ) ; for ( exp ; exp ; exp ) stat

jump_stat:

goto id ; continue ; break ; return exp ;

exp:

exp , assignment_exp

assignment_exp:

conditional_exp unary_exp assignment_operator assignment_exp

assignment_operator:

= *= /= %= += -= <<= >>= &= ^= |=

conditional_exp:

logical_or_exp ? exp : conditional_exp

const_exp:

conditional_exp

logical_or_exp:

logical_and_exp logical_or_exp || logical_and_exp

logical_and_exp:

logical_and_exp && inclusive_or_exp

inclusive_or_exp:

inclusive_or_exp | exclusive_or_exp

exclusive_or_exp:

exclusive_or_exp ^ and_exp

and_exp:

and_exp & equality_exp

equality_exp:

equality_exp == != relational_exp

relational_exp:

relational_exp < > <= >= shift_expression

shift_expression:

shift_expression << >> additive_exp

additive_exp:

additive_exp + - mult_exp

mult_exp:

mult_exp % * / cast_exp

cast_exp:

unary_exp ( type_name ) cast_exp

unary_exp:

postfix_exp ++ -- unary_exp unary_operator cast_exp sizeof unary_exp ( type_name )

unary_operator:

! & * + - ~

postfix_exp:

primary_exp postfix_exp [ exp ] postfix_exp ( argument_exp_list ) postfix_exp . -> id postfix_exp ++ --

primary_exp:

id const string ( exp )

argument_exp_list:

argument_exp_list , assignment_exp

const:

int_const char_const float_const enumeration_const