/* Rules list
translation_unit
external_declaration
function_definition
declaration_list
declaration
declaration_specifiers
specifier_qualifier_list
type_qualifier_list
type_qualifier
function_specifier
storage_class_specifier
type_specifier
typedef_name
struct_or_union_specifier
struct_or_union
struct_declaration_list
struct_declaration
struct_declarator_list
struct_declarator
enum_specifier
enumerator_list
enumerator
enumeration_constant
init_declarator_list
init_declarator
initializer_list
initializer
designation
designator_list
designator
parameter_type_list
parameter_list
parameter_declaration
identifier_list
type_name
abstract_declarator
direct_abstract_declarator
declarator
direct_declarator
pointer
statement
labeled_statement
compound_statement
block_item_list
block_item
expression_statement
selection_statement
iteration_statement
jump_statement
expression
assignment_expr
assignment_operator
constant_expr
conditional_expr
logical_OR_expr
logical_AND_expr
inclusive_OR_expr
exclusive_OR_expr
AND_expr
equality_expr
relational_expr
shift_expr
additive_expr
multiplicative_expr
cast_expr
unary_expr
unary_operator
argument_expression_list
postfix_expr
primary_expr
*/
/* Rules alphabetized
AND_expr
abstract_declarator
additive_expr
argument_expression_list
assignment_expr
assignment_operator
block_item
block_item_list
cast_expr
compound_statement
conditional_expr
constant_expr
declaration
declaration_list
declaration_specifiers
declarator
designation
designator
designator_list
direct_abstract_declarator
direct_declarator
enum_specifier
enumeration_constant
enumerator
enumerator_list
equality_expr
exclusive_OR_expr
expression
expression_statement
external_declaration
function_definition
function_specifier
identifier_list
inclusive_OR_expr
init_declarator
init_declarator_list
initializer
initializer_list
iteration_statement
jump_statement
labeled_statement
logical_AND_expr
logical_OR_expr
multiplicative_expr
parameter_declaration
parameter_list
parameter_type_list
pointer
postfix_expr
primary_expr
relational_expr
selection_statement
shift_expr
specifier_qualifier_list
statement
storage_class_specifier
struct_declaration
struct_declaration_list
struct_declarator
struct_declarator_list
struct_or_union
struct_or_union_specifier
translation_unit
type_name
type_qualifier
type_qualifier_list
type_specifier
typedef_name
unary_expr
unary_operator
*/

%start translation_unit


%token _BOOL in type_specifier ·
%token _COMPLEX in type_specifier ·
%token _IMAGINARY in type_specifier ·
%token AUTO in storage_class_specifier ·
%token BREAK in jump_statement ·
%token CASE in labeled_statement ·
%token CHAR in type_specifier ·
%token CONST in type_qualifier ·
%token CONTINUE in jump_statement ·
%token DEFAULT in labeled_statement ·
%token DO in iteration_statement ·
%token DOUBLE in type_specifier ·
%token ELSE in selection_statement ·
%token ENUM in enum_specifier ·
%token EXTERN in storage_class_specifier ·
%token FLOAT in type_specifier ·
%token FOR in iteration_statement ·
%token GOTO in jump_statement ·
%token IF in selection_statement ·
%token INLINE in function_specifier ·
%token INT in type_specifier ·
%token LONG in type_specifier ·
%token REGISTER in storage_class_specifier ·
%token RESTRICT in type_qualifier ·
%token RETURN in jump_statement ·
%token SHORT in type_specifier ·
%token SIGNED in type_specifier ·
%token SIZEOF in unary_expr ·
%token STATIC in storage_class_specifier ·
%token STRUCT in struct_or_union ·
%token SWITCH in selection_statement ·
%token TYPEDEF in storage_class_specifier ·
%token UNION in struct_or_union ·
%token UNSIGNED in type_specifier ·
%token VOID in type_specifier ·
%token VOLATILE in type_qualifier ·
%token WHILE in iteration_statement ·
%token IDENTIFIER in typedef_name · struct_or_union_specifier · enum_specifier · enumeration_constant · designator · identifier_list · direct_declarator · labeled_statement · jump_statement · postfix_expr · primary_expr ·
%token CONSTANT in primary_expr ·
%token STRING_LITERAL in primary_expr ·

%%

translation_unit: in translation_unit ·
· external_declaration ·
| translation_unit · external_declaration ·
;

external_declaration: in translation_unit ·
· function_definition ·
| declaration ·
;

function_definition: in external_declaration ·
· declaration_specifiers · declarator · declaration_list_opt · compound_statement ·
| declarator · declaration_list · compound_statement ·
| declarator · compound_statement ·
;

declaration_list: in function_definition · declaration_list ·
· declaration ·
| declaration_list · declaration ·
;

declaration: in external_declaration · declaration_list · block_item · iteration_statement ·
· declaration_specifiers · init_declarator_list_opt · ';' ·
;

declaration_specifiers: in function_definition · declaration · declaration_specifiers · parameter_declaration ·
· storage_class_specifier · declaration_specifiers_opt ·
| type_specifier · declaration_specifiers_opt ·
| type_qualifier · declaration_specifiers_opt ·
| function_specifier · declaration_specifiers_opt ·
;

specifier_qualifier_list: in specifier_qualifier_list · struct_declaration · type_name ·
· type_specifier · specifier_qualifier_list_opt ·
| type_qualifier · specifier_qualifier_list_opt ·
;

type_qualifier_list: in type_qualifier_list · pointer ·
· type_qualifier ·
| type_qualifier_list · type_qualifier ·
;

type_qualifier: in declaration_specifiers · specifier_qualifier_list · type_qualifier_list ·
· CONST ·
| RESTRICT ·
| VOLATILE ·
;

function_specifier: in declaration_specifiers ·
· INLINE ·
;

storage_class_specifier: in declaration_specifiers ·
· TYPEDEF ·
| EXTERN ·
| STATIC ·
| AUTO ·
| REGISTER ·
;

type_specifier: in declaration_specifiers · specifier_qualifier_list ·
· VOID ·
| CHAR ·
| SHORT ·
| INT ·
| LONG ·
| FLOAT ·
| DOUBLE ·
| SIGNED ·
| UNSIGNED ·
| _BOOL ·
| _COMPLEX ·
| _IMAGINARY ·
| struct_or_union_specifier ·
| enum_specifier ·
| typedef_name ·
;

typedef_name: in type_specifier ·
· IDENTIFIER ·
;

struct_or_union_specifier: in type_specifier ·
· struct_or_union · identifier_opt · '{' · struct_declaration_list · '}' ·
| struct_or_union · IDENTIFIER ·
;

struct_or_union: in struct_or_union_specifier ·
· STRUCT ·
| UNION ·
;

struct_declaration_list: in struct_or_union_specifier · struct_declaration_list ·
· struct_declaration ·
| struct_declaration_list · struct_declaration ·
;

struct_declaration: in struct_declaration_list ·
· specifier_qualifier_list · struct_declarator_list · ';' ·
;

struct_declarator_list: in struct_declaration · struct_declarator_list ·
· struct_declarator ·
| struct_declarator_list · ',' · struct_declarator ·
;

struct_declarator: in struct_declarator_list ·
· declarator ·
| declarator_opt · ':' · constant_expr ·
;

enum_specifier: in type_specifier ·
· ENUM · identifier_opt · '{' · enumerator_list · '}' ·
| ENUM · identifier_opt · '{' · enumerator_list · ',' · '}' ·
| ENUM · IDENTIFIER ·
;

enumerator_list: in enum_specifier · enumerator_list ·
· enumerator ·
| enumerator_list · ',' · enumerator ·
;

enumerator: in enumerator_list ·
· enumeration_constant ·
| enumeration_constant · '=' · constant_expression ·
;

enumeration_constant: in enumerator ·
· IDENTIFIER ·
;

init_declarator_list: in declaration · init_declarator_list ·
· init_declarator ·
| init_declarator_list · ',' · init_declarator ·
;

init_declarator: in init_declarator_list ·
· declarator ·
| declarator · '=' · initializer ·
;

initializer_list: in initializer_list · initializer · postfix_expr ·
· designation_opt · initializer ·
| initializer_list · ',' · designation_opt · initializer ·
;

initializer: in init_declarator · initializer_list ·
· assignment_expr ·
| '{' · initializer_list · '}' ·
| '{' · initializer_list · ',' · '}' ·
;

designation: in initializer_list ·
· designator_list · '=' ·
;

designator_list: in designation · designator_list ·
· designator ·
| designator_list · designator ·
;

designator: in designator_list ·
· '[' · constant_expression · ']' ·
| '.' · IDENTIFIER ·
;

parameter_type_list: in direct_abstract_declarator · direct_declarator ·
· parameter_list ·
| parameter_list · ',' · '...' ·
;

parameter_list: in parameter_type_list · parameter_list ·
· parameter_declaration ·
| parameter_list · ',' · parameter_declaration ·
;

parameter_declaration: in parameter_list ·
· declaration_specifiers · declarator ·
| declaration_specifiers · abstract_declarator_opt ·
;

identifier_list: in identifier_list · direct_declarator ·
· IDENTIFIER ·
| identifier_list · ',' · IDENTIFIER ·
;

type_name: in cast_expr · unary_expr · postfix_expr ·
· specifier_qualifier_list · abstract_declarator_opt ·
;

abstract_declarator: in parameter_declaration · type_name · direct_abstract_declarator ·
· pointer ·
| pointer_opt · direct_abstract_declarator ·
;

direct_abstract_declarator: in 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: in function_definition · struct_declarator · init_declarator · parameter_declaration · direct_declarator ·
· pointer_opt · direct_declarator ·
;

direct_declarator: in declarator · direct_declarator ·
· IDENTIFIER ·
| '(' · declarator · ')' ·
| direct_declarator · '[' · assignment_expr_opt · ']' ·
| direct_declarator · '[' · '*' · ']' ·
| direct_declarator · '(' · parameter_type_list · ')' ·
| direct_declarator · '(' · identifier_list_opt · ')' ·
;

pointer: in abstract_declarator · declarator · pointer ·
· '*' · type_qualifier_list_opt ·
| '*' · type_qualifier_list_opt · pointer ·
;

statement: in labeled_statement · block_item · selection_statement · iteration_statement ·
· labeled_statement ·
| compound_statement ·
| expression_statement ·
| selection_statement ·
| iteration_statement ·
| jump_statement ·
;

labeled_statement: in statement ·
· IDENTIFIER · ':' · statement ·
| CASE · constant_expr · ':' · statement ·
| DEFAULT · ':' · statement ·
;

compound_statement: in function_definition · statement ·
· '{' · block_item_list_opt · '}' ·
;

block_item_list: in compound_statement · block_item_list ·
· block_item ·
| block_item_list · block_item ·
;

block_item: in block_item_list ·
· declaration ·
| statement ·
;

expression_statement: in statement ·
· expression_opt · ';' ·
;

selection_statement: in statement ·
· IF · '(' · expression · ')' · statement ·
| IF · '(' · expression · ')' · statement · ELSE · statement ·
| SWITCH · '(' · expression · ')' · statement ·
;

iteration_statement: in 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: in statement ·
· GOTO · IDENTIFIER · ';' ·
| CONTINUE · ';' ·
| BREAK · ';' ·
| RETURN · expression_opt · ';' ·
;

expression: in expression_statement · selection_statement · iteration_statement · jump_statement · expression · conditional_expr · postfix_expr · primary_expr ·
· assignment_expr ·
| expression · ',' · assignment_expr ·
;

assignment_expr: in initializer · direct_abstract_declarator · direct_declarator · expression · assignment_expr · argument_expression_list ·
· conditional_expr ·
| unary_expr · assignment_operator · assignment_expr ·
;

assignment_operator: in assignment_expr ·
· '=' ·
| '*=' ·
| '/=' ·
| '%=' ·
| '+=' ·
| '-=' ·
| '<<=' ·
| '>>=' ·
| '&=' ·
| '^=' ·
| '|=' ·
;

constant_expr: in struct_declarator · labeled_statement ·
· conditional_expr ·
;

conditional_expr: in assignment_expr · constant_expr · conditional_expr ·
· logical_OR_expr ·
| logical_OR_expr · '?' · expression · ':' · conditional_expr ·
;

logical_OR_expr: in conditional_expr · logical_OR_expr ·
· logical_AND_expr ·
| logical_OR_expr · '||' · logical_AND_expr ·
;

logical_AND_expr: in logical_OR_expr · logical_AND_expr ·
· inclusive_OR_expr ·
| logical_AND_expr · '&&' · inclusive_OR_expr ·
;

inclusive_OR_expr: in logical_AND_expr · inclusive_OR_expr ·
· exclusive_OR_expr ·
| inclusive_OR_expr · '|' · exclusive_OR_expr ·
;

exclusive_OR_expr: in inclusive_OR_expr · exclusive_OR_expr ·
· AND_expr ·
| exclusive_OR_expr · '^' · AND_expr ·
;

AND_expr: in exclusive_OR_expr · AND_expr ·
· equality_expr ·
| AND_expr · '&' · equality_expr ·
;

equality_expr: in AND_expr · equality_expr ·
· relational_expr ·
| equality_expr · '==' · relational_expr ·
| equality_expr · '!=' · relational_expr ·
;

relational_expr: in equality_expr · relational_expr ·
· shift_expr ·
| relational_expr · '<' · shift_expr ·
| relational_expr · '>' · shift_expr ·
| relational_expr · '<=' · shift_expr ·
| relational_expr · '>=' · shift_expr ·
;

shift_expr: in relational_expr · shift_expr ·
· additive_expr ·
| shift_expr · '<<' · additive_expr ·
| shift_expr · '>>' · additive_expr ·
;

additive_expr: in shift_expr · additive_expr ·
· multiplicative_expr ·
| additive_expr · '+' · multiplicative_expr ·
| additive_expr · '-' · multiplicative_expr ·
;

multiplicative_expr: in additive_expr · multiplicative_expr ·
· cast_expr ·
| multiplicative_expr · '*' · cast_expr ·
| multiplicative_expr · '/' · cast_expr ·
| multiplicative_expr · '%' · cast_expr ·
;

cast_expr: in multiplicative_expr · cast_expr · unary_expr ·
· unary_expr ·
| '(' · type_name · ')' · cast_expr ·
;

unary_expr: in assignment_expr · cast_expr · unary_expr ·
· postfix_expr ·
| '++' · unary_expr ·
| '--' · unary_expr ·
| unary_operator · cast_expr ·
| SIZEOF · unary_expr ·
| SIZEOF · '(' · type_name · ')' ·
;

unary_operator: in unary_expr ·
· '&' ·
| '*' ·
| '+' ·
| '-' ·
| '~' ·
| '!' ·
;

argument_expression_list: in argument_expression_list · postfix_expr ·
· assignment_expr ·
| argument_expression_list · ',' · assignment_expr ·
;

postfix_expr: in unary_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: in postfix_expr ·
· IDENTIFIER ·
| CONSTANT ·
| STRING_LITERAL ·
| '(' · expression · ')' ·
;

%%