/* Rules list
primary_expression
postfix_expression
argument_expression_list
unary_expression
unary_operator
cast_expression
multiplicative_expression
additive_expression
shift_expression
relational_expression
equality_expression
and_expression
exclusive_or_expression
inclusive_or_expression
logical_and_expression
logical_or_expression
conditional_expression
assignment_expression
assignment_operator
expression
constant_expression
declaration
declaration_specifiers
init_declarator_list
init_declarator
storage_class_specifier
type_specifier
struct_or_union_specifier
struct_or_union
struct_declaration_list
struct_declaration
specifier_qualifier_list
struct_declarator_list
struct_declarator
enum_specifier
enumerator_list
enumerator
type_qualifier
declarator
direct_declarator
pointer
type_qualifier_list
parameter_type_list
parameter_list
identifier_list
type_name
abstract_declarator
direct_abstract_declarator
initializer
initializer_list
statement
labeled_statement
compound_statement
declaration_list
statement_list
expression_statement
selection_statement
iteration_statement
jump_statement
translation_unit
external_declaration
function_definition
*/
/* Rules alphabetized
abstract_declarator
additive_expression
and_expression
argument_expression_list
assignment_expression
assignment_operator
cast_expression
compound_statement
conditional_expression
constant_expression
declaration
declaration_list
declaration_specifiers
declarator
direct_abstract_declarator
direct_declarator
enum_specifier
enumerator
enumerator_list
equality_expression
exclusive_or_expression
expression
expression_statement
external_declaration
function_definition
identifier_list
inclusive_or_expression
init_declarator
init_declarator_list
initializer
initializer_list
iteration_statement
jump_statement
labeled_statement
logical_and_expression
logical_or_expression
multiplicative_expression
parameter_list
parameter_type_list
pointer
postfix_expression
primary_expression
relational_expression
selection_statement
shift_expression
specifier_qualifier_list
statement
statement_list
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
unary_expression
unary_operator
*/

%start translation_unit


%token IDENTIFIER in primary_expression · postfix_expression · struct_or_union_specifier · enum_specifier · enumerator · direct_declarator · identifier_list · labeled_statement · jump_statement ·
%token CONSTANT in primary_expression ·
%token STRING_LITERAL in primary_expression ·
%token SIZEOF in unary_expression ·
%token TYPE_NAME in type_specifier ·
%token TYPEDEF in storage_class_specifier ·
%token EXTERN in storage_class_specifier ·
%token STATIC in storage_class_specifier ·
%token AUTO in storage_class_specifier ·
%token REGISTER in storage_class_specifier ·
%token CHAR in type_specifier ·
%token SHORT in type_specifier ·
%token INT in type_specifier ·
%token LONG in type_specifier ·
%token SIGNED in type_specifier ·
%token UNSIGNED in type_specifier ·
%token FLOAT in type_specifier ·
%token DOUBLE in type_specifier ·
%token CONST in type_qualifier ·
%token VOLATILE in type_qualifier ·
%token VOID in type_specifier ·
%token STRUCT in struct_or_union ·
%token UNION in struct_or_union ·
%token ENUM in enum_specifier ·
%token CASE in labeled_statement ·
%token DEFAULT in labeled_statement ·
%token IF in selection_statement ·
%token ELSE in selection_statement ·
%token SWITCH in selection_statement ·
%token WHILE in iteration_statement ·
%token DO in iteration_statement ·
%token FOR in iteration_statement ·
%token GOTO in jump_statement ·
%token CONTINUE in jump_statement ·
%token BREAK in jump_statement ·
%token RETURN in jump_statement ·

%%

primary_expression: in postfix_expression ·
· IDENTIFIER ·
| CONSTANT ·
| STRING_LITERAL ·
| '(' · expression · ')' ·
;

postfix_expression: in postfix_expression · unary_expression ·
· primary_expression ·
| postfix_expression · '[' · expression · ']' ·
| postfix_expression · '(' · ')' ·
| postfix_expression · '(' · argument_expression_list · ')' ·
| postfix_expression · '.' · IDENTIFIER ·
| postfix_expression · '->' · IDENTIFIER ·
| postfix_expression · '++' ·
| postfix_expression · '--' ·
;

argument_expression_list: in postfix_expression · argument_expression_list ·
· assignment_expression ·
| argument_expression_list · ',' · assignment_expression ·
;

unary_expression: in unary_expression · cast_expression · assignment_expression ·
· postfix_expression ·
| '++' · unary_expression ·
| '--' · unary_expression ·
| unary_operator · cast_expression ·
| SIZEOF · unary_expression ·
| SIZEOF · '(' · type_name · ')' ·
;

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

cast_expression: in unary_expression · cast_expression · multiplicative_expression ·
· unary_expression ·
| '(' · type_name · ')' · cast_expression ·
;

multiplicative_expression: in multiplicative_expression · additive_expression ·
· cast_expression ·
| multiplicative_expression · '*' · cast_expression ·
| multiplicative_expression · '/' · cast_expression ·
| multiplicative_expression · '%' · cast_expression ·
;

additive_expression: in additive_expression · shift_expression ·
· multiplicative_expression ·
| additive_expression · '+' · multiplicative_expression ·
| additive_expression · '-' · multiplicative_expression ·
;

shift_expression: in shift_expression · relational_expression ·
· additive_expression ·
| shift_expression · '<<' · additive_expression ·
| shift_expression · '>>' · additive_expression ·
;

relational_expression: in relational_expression · equality_expression ·
· shift_expression ·
| relational_expression · '<' · shift_expression ·
| relational_expression · '>' · shift_expression ·
| relational_expression · '<=' · shift_expression ·
| relational_expression · '>=' · shift_expression ·
;

equality_expression: in equality_expression · and_expression ·
· relational_expression ·
| equality_expression · '==' · relational_expression ·
| equality_expression · '!=' · relational_expression ·
;

and_expression: in and_expression · exclusive_or_expression ·
· equality_expression ·
| and_expression · '&' · equality_expression ·
;

exclusive_or_expression: in exclusive_or_expression · inclusive_or_expression ·
· and_expression ·
| exclusive_or_expression · '^' · and_expression ·
;

inclusive_or_expression: in inclusive_or_expression · logical_and_expression ·
· exclusive_or_expression ·
| inclusive_or_expression · '|' · exclusive_or_expression ·
;

logical_and_expression: in logical_and_expression · logical_or_expression ·
· inclusive_or_expression ·
| logical_and_expression · '&&' · inclusive_or_expression ·
;

logical_or_expression: in logical_or_expression · conditional_expression ·
· logical_and_expression ·
| logical_or_expression · '||' · logical_and_expression ·
;

conditional_expression: in conditional_expression · assignment_expression · constant_expression ·
· logical_or_expression ·
| logical_or_expression · '?' · expression · ':' · conditional_expression ·
;

assignment_expression: in argument_expression_list · assignment_expression · expression · initializer ·
· conditional_expression ·
| unary_expression · assignment_operator · assignment_expression ·
;

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

expression: in primary_expression · postfix_expression · conditional_expression · expression · expression_statement · selection_statement · iteration_statement · jump_statement ·
· assignment_expression ·
| expression · ',' · assignment_expression ·
;

constant_expression: in struct_declarator · enumerator · direct_declarator · direct_abstract_declarator · labeled_statement ·
· conditional_expression ·
;

declaration: in declaration_list · external_declaration ·
· declaration_specifiers · ';' ·
| declaration_specifiers · init_declarator_list · ';' ·
;

declaration_specifiers: in declaration · declaration_specifiers · parameter_list · function_definition ·
· storage_class_specifier ·
| storage_class_specifier · declaration_specifiers ·
| type_specifier ·
| type_specifier · declaration_specifiers ·
| type_qualifier ·
| type_qualifier · declaration_specifiers ·
;

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

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

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 ·
| struct_or_union_specifier ·
| enum_specifier ·
| TYPE_NAME ·
;

struct_or_union_specifier: in type_specifier ·
· struct_or_union · IDENTIFIER · '{' · struct_declaration_list · '}' ·
| struct_or_union · '{' · 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 · ';' ·
;

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

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

struct_declarator: in struct_declarator_list ·
· declarator ·
| ':' · constant_expression ·
| declarator · ':' · constant_expression ·
;

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

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

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

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

declarator: in init_declarator · struct_declarator · direct_declarator · parameter_list · function_definition ·
· pointer · direct_declarator ·
| direct_declarator ·
;

direct_declarator: in declarator · direct_declarator ·
· IDENTIFIER ·
| '(' · declarator · ')' ·
| direct_declarator · '[' · constant_expression · ']' ·
| direct_declarator · '[' · ']' ·
| direct_declarator · '(' · parameter_type_list · ')' ·
| direct_declarator · '(' · identifier_list · ')' ·
| direct_declarator · '(' · ')' ·
;

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

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

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

parameter_list: in parameter_type_list · parameter_list ·
· parameter_declaration ·
| parameter_list · ',' · parameter_declaration · parameter_declaration · : · declaration_specifiers · declarator ·
| declaration_specifiers · abstract_declarator ·
| declaration_specifiers ·
;

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

type_name: in unary_expression · cast_expression ·
· specifier_qualifier_list ·
| specifier_qualifier_list · abstract_declarator ·
;

abstract_declarator: in parameter_list · type_name · direct_abstract_declarator ·
· pointer ·
| direct_abstract_declarator ·
| pointer · direct_abstract_declarator ·
;

direct_abstract_declarator: in abstract_declarator · direct_abstract_declarator ·
· '(' · abstract_declarator · ')' ·
| '[' · ']' ·
| '[' · constant_expression · ']' ·
| direct_abstract_declarator · '[' · ']' ·
| direct_abstract_declarator · '[' · constant_expression · ']' ·
| '(' · ')' ·
| '(' · parameter_type_list · ')' ·
| direct_abstract_declarator · '(' · ')' ·
| direct_abstract_declarator · '(' · parameter_type_list · ')' ·
;

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

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

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

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

compound_statement: in statement · function_definition ·
· '{' · '}' ·
| '{' · statement_list · '}' ·
| '{' · declaration_list · '}' ·
| '{' · declaration_list · statement_list · '}' ·
;

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

statement_list: in compound_statement · statement_list ·
· statement ·
| statement_list · statement ·
;

expression_statement: in statement · iteration_statement ·
· ';' ·
| expression · ';' ·
;

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_statement · expression_statement · ')' · statement ·
| FOR · '(' · expression_statement · expression_statement · expression · ')' · statement ·
;

jump_statement: in statement ·
· GOTO · IDENTIFIER · ';' ·
| CONTINUE · ';' ·
| BREAK · ';' ·
| RETURN · ';' ·
| RETURN · expression · ';' ·
;

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 · compound_statement ·
| declaration_specifiers · declarator · compound_statement ·
| declarator · declaration_list · compound_statement ·
| declarator · compound_statement ·
;

%%