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