%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 compound_statement | declaration_specifiers declarator compound_statement | declarator declaration_list compound_statement | declarator compound_statement ; declaration_list: declaration | declaration_list declaration ; declaration: declaration_specifiers init_declarator_list ';' | declaration_specifiers ';' ; declaration_specifiers: storage_class_specifier declaration_specifiers | storage_class_specifier | type_specifier declaration_specifiers | type_specifier | type_qualifier declaration_specifiers | type_qualifier | function_specifier declaration_specifiers | function_specifier ; specifier_qualifier_list: type_specifier specifier_qualifier_list | type_specifier | type_qualifier specifier_qualifier_list | type_qualifier ; 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 '{' struct_declaration_list '}' | struct_or_union '{' 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 ':' constant_expr | ':' constant_expr ; enum_specifier: ENUM IDENTIFIER '{' enumerator_list '}' | ENUM '{' enumerator_list '}' | ENUM IDENTIFIER '{' enumerator_list ',' '}' | ENUM '{' 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 initializer | initializer | initializer_list ',' designation initializer | initializer_list ',' 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 | declaration_specifiers ; identifier_list: IDENTIFIER | identifier_list ',' IDENTIFIER ; type_name: specifier_qualifier_list abstract_declarator | specifier_qualifier_list ; abstract_declarator: pointer | pointer direct_abstract_declarator | direct_abstract_declarator ; direct_abstract_declarator: '(' abstract_declarator ')' | direct_abstract_declarator '[' assignment_expr ']' | direct_abstract_declarator '[' ']' | '[' assignment_expr ']' | '[' ']' | direct_abstract_declarator '[' '*' ']' | direct_abstract_declarator '(' parameter_type_list ')' | direct_abstract_declarator '(' ')' | '(' parameter_type_list ')' | '(' ')' ; declarator: pointer direct_declarator | direct_declarator ; direct_declarator: IDENTIFIER | '(' declarator ')' | direct_declarator '[' assignment_expr ']' | direct_declarator '[' ']' | direct_declarator '[' '*' ']' | direct_declarator '(' parameter_type_list ')' | direct_declarator '(' identifier_list ')' | direct_declarator '(' ')' ; pointer: '*' type_qualifier_list | '*' | '*' type_qualifier_list pointer | '*' 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 '}' | '{' '}' ; block_item_list: block_item | block_item_list block_item ; block_item: declaration | statement ; expression_statement: expression ';' | ';' ; selection_statement: IF '(' expression ')' statement | IF '(' expression ')' statement ELSE statement | SWITCH '(' expression ')' statement ; iteration_statement: WHILE '(' expression ')' statement | DO statement WHILE '(' expression ')' ';' | FOR '(' expression ';' expression ';' expression ')' statement | FOR '(' expression ';' expression ';' ')' statement | FOR '(' expression ';' ';' expression ')' statement | FOR '(' expression ';' ';' ')' statement | FOR '(' ';' expression ';' expression ')' statement | FOR '(' ';' expression ';' ')' statement | FOR '(' ';' ';' expression ')' statement | FOR '(' ';' ';' ')' statement | FOR '(' declaration ';' expression ';' expression ')' statement | FOR '(' declaration ';' expression ';' ')' statement | FOR '(' declaration ';' ';' expression ')' statement | FOR '(' declaration ';' ';' ')' statement ; jump_statement: GOTO IDENTIFIER ';' | CONTINUE ';' | BREAK ';' | RETURN expression ';' | RETURN ';' ; 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 ')' | postfix_expr '(' ')' | 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 ')' ; %%