/* Rules list
%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 ·
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 ·
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 ·
%%