%token _BOOL _COMPLEX _IMAGINARY AUTO BREAK CASE CHAR CONST CONTINUE DEFAULT DO DOUBLE ELSE ENUM EXTERN FLOAT FOR GOTO IF INLINE INT LONG REGISTER RESTRICT RETURN SHORT SIGNED SIZEOF STATIC STRUCT SWITCH TYPEDEF UNION UNSIGNED VOID VOLATILE WHILE IDENTIFIER CONSTANT STRING_LITERAL %start translation_unit %% translation_unit: external_declaration | translation_unit external_declaration ; external_declaration: function_definition | declaration ; function_definition: declaration_specifiers declarator declaration_list_opt compound_statement | declarator declaration_list compound_statement | declarator compound_statement ; declaration_list: declaration | declaration_list declaration ; declaration: declaration_specifiers init_declarator_list_opt ';' ; declaration_specifiers: storage_class_specifier declaration_specifiers_opt | type_specifier declaration_specifiers_opt | type_qualifier declaration_specifiers_opt | function_specifier declaration_specifiers_opt ; specifier_qualifier_list: type_specifier specifier_qualifier_list_opt | type_qualifier specifier_qualifier_list_opt ; type_qualifier_list: type_qualifier | type_qualifier_list type_qualifier ; type_qualifier: CONST | RESTRICT | VOLATILE ; function_specifier: INLINE ; storage_class_specifier: TYPEDEF | EXTERN | STATIC | AUTO | REGISTER ; type_specifier: VOID | CHAR | SHORT | INT | LONG | FLOAT | DOUBLE | SIGNED | UNSIGNED | _BOOL | _COMPLEX | _IMAGINARY | struct_or_union_specifier | enum_specifier | typedef_name ; typedef_name: IDENTIFIER ; struct_or_union_specifier: struct_or_union identifier_opt '{' struct_declaration_list '}' | struct_or_union IDENTIFIER ; struct_or_union: STRUCT | UNION ; struct_declaration_list: struct_declaration | struct_declaration_list struct_declaration ; struct_declaration: specifier_qualifier_list struct_declarator_list ';' ; struct_declarator_list: struct_declarator | struct_declarator_list ',' struct_declarator ; struct_declarator: declarator | declarator_opt ':' constant_expr ; enum_specifier: ENUM identifier_opt '{' enumerator_list '}' | ENUM identifier_opt '{' enumerator_list ',' '}' | ENUM IDENTIFIER ; enumerator_list: enumerator | enumerator_list ',' enumerator ; enumerator: enumeration_constant | enumeration_constant '=' constant_expression ; enumeration_constant: IDENTIFIER ; init_declarator_list: init_declarator | init_declarator_list ',' init_declarator ; init_declarator: declarator | declarator '=' initializer ; initializer_list: designation_opt initializer | initializer_list ',' designation_opt initializer ; initializer: assignment_expr | '{' initializer_list '}' | '{' initializer_list ',' '}' ; designation: designator_list '=' ; designator_list: designator | designator_list designator ; designator: '[' constant_expression ']' | '.' IDENTIFIER ; parameter_type_list: parameter_list | parameter_list ',' '...' ; parameter_list: parameter_declaration | parameter_list ',' parameter_declaration ; parameter_declaration: declaration_specifiers declarator | declaration_specifiers abstract_declarator_opt ; identifier_list: IDENTIFIER | identifier_list ',' IDENTIFIER ; type_name: specifier_qualifier_list abstract_declarator_opt ; abstract_declarator: pointer | pointer_opt direct_abstract_declarator ; direct_abstract_declarator: '(' abstract_declarator ')' | direct_abstract_declarator_opt '[' assignment_expr_opt ']' | direct_abstract_declarator '[' '*' ']' | direct_abstract_declarator_opt '(' parameter_type_list_opt ')' ; declarator: pointer_opt direct_declarator ; direct_declarator: IDENTIFIER | '(' declarator ')' | direct_declarator '[' assignment_expr_opt ']' | direct_declarator '[' '*' ']' | direct_declarator '(' parameter_type_list ')' | direct_declarator '(' identifier_list_opt ')' ; pointer: '*' type_qualifier_list_opt | '*' type_qualifier_list_opt pointer ; statement: labeled_statement | compound_statement | expression_statement | selection_statement | iteration_statement | jump_statement ; labeled_statement: IDENTIFIER ':' statement | CASE constant_expr ':' statement | DEFAULT ':' statement ; compound_statement: '{' block_item_list_opt '}' ; block_item_list: block_item | block_item_list block_item ; block_item: declaration | statement ; expression_statement: expression_opt ';' ; selection_statement: IF '(' expression ')' statement | IF '(' expression ')' statement ELSE statement | SWITCH '(' expression ')' statement ; iteration_statement: WHILE '(' expression ')' statement | DO statement WHILE '(' expression ')' ';' | FOR '(' expression_opt ';' expression_opt ';' expression_opt ')' statement | FOR '(' declaration ';' expression_opt ';' expression_opt ')' statement ; jump_statement: GOTO IDENTIFIER ';' | CONTINUE ';' | BREAK ';' | RETURN expression_opt ';' ; expression: assignment_expr | expression ',' assignment_expr ; assignment_expr: conditional_expr | unary_expr assignment_operator assignment_expr ; assignment_operator: '=' | '*=' | '/=' | '%=' | '+=' | '-=' | '<<=' | '>>=' | '&=' | '^=' | '|=' ; constant_expr: conditional_expr ; conditional_expr: logical_OR_expr | logical_OR_expr '?' expression ':' conditional_expr ; logical_OR_expr: logical_AND_expr | logical_OR_expr '||' logical_AND_expr ; logical_AND_expr: inclusive_OR_expr | logical_AND_expr '&&' inclusive_OR_expr ; inclusive_OR_expr: exclusive_OR_expr | inclusive_OR_expr '|' exclusive_OR_expr ; exclusive_OR_expr: AND_expr | exclusive_OR_expr '^' AND_expr ; AND_expr: equality_expr | AND_expr '&' equality_expr ; equality_expr: relational_expr | equality_expr '==' relational_expr | equality_expr '!=' relational_expr ; relational_expr: shift_expr | relational_expr '<' shift_expr | relational_expr '>' shift_expr | relational_expr '<=' shift_expr | relational_expr '>=' shift_expr ; shift_expr: additive_expr | shift_expr '<<' additive_expr | shift_expr '>>' additive_expr ; additive_expr: multiplicative_expr | additive_expr '+' multiplicative_expr | additive_expr '-' multiplicative_expr ; multiplicative_expr: cast_expr | multiplicative_expr '*' cast_expr | multiplicative_expr '/' cast_expr | multiplicative_expr '%' cast_expr ; cast_expr: unary_expr | '(' type_name ')' cast_expr ; unary_expr: postfix_expr | '++' unary_expr | '--' unary_expr | unary_operator cast_expr | SIZEOF unary_expr | SIZEOF '(' type_name ')' ; unary_operator: '&' | '*' | '+' | '-' | '~' | '!' ; argument_expression_list: assignment_expr | argument_expression_list ',' assignment_expr ; postfix_expr: primary_expr | postfix_expr '[' expression ']' | postfix_expr '(' argument_expression_list_opt ')' | postfix_expr '.' IDENTIFIER | postfix_expr '->' IDENTIFIER | postfix_expr '++' | postfix_expr '--' | '(' type_name ')' '{' initializer_list '}' | '(' type_name ')' '{' initializer_list ',' '}' ; primary_expr: IDENTIFIER | CONSTANT | STRING_LITERAL | '(' expression ')' ; %%