translation_unit: ╭──────────>───────────╮ │ │ │├──╯── translation_unit ──╰── external_decl ──┤│ external_decl: │├──╮── function_definition ──╭──┤│ │ │ ╰───────── decl ──────────╯ function_definition: ╭───────>────────╮ ╭───────>───────╮ │ │ │ │ │├──╯── decl_specs ──╰── declarator ──╯── decl_list ──╰── compound_stat ──┤│ decl_list: ╭───────>───────╮ ╭────────────>─────────────╮ │ │ │ │ │├──╯── decl_list ──╰── decl_specs ──╯── init_declarator_list ──╰── ";" ──┤│ decl_specs: ╭───────>────────╮ │ │ │├──╮── storage_class_spec ──╭──╯── decl_specs ──╰──┤│ │ │ ╰────── type_spec ───────╯ │ │ ╰──── type_qualifier ────╯ storage_class_spec: │├──╮──── "auto" ────╭──┤│ │ │ ╰── "register" ──╯ │ │ ╰─── "static" ───╯ │ │ ╰─── "extern" ───╯ │ │ ╰── "typedef" ───╯ type_spec: │├──╮───────── "void" ─────────╭──┤│ │ │ ╰───────── "char" ─────────╯ │ │ ╰──────── "short" ─────────╯ │ │ ╰───────── "int" ──────────╯ │ │ ╰───────── "long" ─────────╯ │ │ ╰──────── "float" ─────────╯ │ │ ╰──────── "double" ────────╯ │ │ ╰──────── "signed" ────────╯ │ │ ╰─────── "unsigned" ───────╯ │ │ ╰── struct_or_union_spec ──╯ │ │ ╰─────── enum_spec ────────╯ │ │ ╰────── typedef_name ──────╯ type_qualifier: │├──╮─── "const" ────╭──┤│ │ │ ╰── "volatile" ──╯ struct_or_union_spec: │├──╮── "struct" ──╭──╮────────────────────── id ──────────────────────╭──┤│ │ │ │ │ ╰── "union" ───╯ │ ╭───>────╮ │ │ │ │ │ ╰──╯── id ──╰── "{" ── struct_decl_list ── "}" ──╯ struct_decl_list: ╭──────────>───────────╮ │ │ │├──╯── struct_decl_list ──╰── spec_qualifier_list ── struct_declarator_list ── ";" ──┤│ init_declarator_list: ╭────────────────>────────────────╮ ╭───────────>────────────╮ │ │ │ │ │├──╯── init_declarator_list ── "," ──╰── declarator ──╯── "=" ── initializer ──╰──┤│ spec_qualifier_list: ╭────────────>────────────╮ │ │ │├──╮──── type_spec ─────╭──╯── spec_qualifier_list ──╰──┤│ │ │ ╰── type_qualifier ──╯ struct_declarator_list: ╭─────────────────>─────────────────╮ │ │ │├──╯── struct_declarator_list ── "," ──╰──╮─────────────── declarator ───────────────╭──┤│ │ │ │ ╭───────>────────╮ │ │ │ │ │ ╰──╯── declarator ──╰── ":" ── const_exp ──╯ enum_spec: │├── "enum" ──╮───────────────────── id ──────────────────────╭──┤│ │ │ │ ╭───>────╮ │ │ │ │ │ ╰──╯── id ──╰── "{" ── enumerator_list ── "}" ──╯ enumerator_list: ╭─────────────>──────────────╮ ╭──────────>───────────╮ │ │ │ │ │├──╯── enumerator_list ── "," ──╰── id ──╯── "=" ── const_exp ──╰──┤│ declarator: ╭──────>──────╮ │ │ │├──╯── pointer ──╰── direct_declarator ──┤│ direct_declarator: │├──╮───────────────────────────── id ─────────────────────────────╭──┤│ │ │ ╰────────────────── "(" ── declarator ── ")" ──────────────────╯ │ │ │ ╭───────>───────╮ │ │ │ │ │ ╰───── direct_declarator ── "[" ──╯── const_exp ──╰── "]" ─────╯ │ │ │ ╭──────────>──────────╮ │ │ │ │ │ ╰── direct_declarator ── "(" ──┼── param_type_list ──┼── ")" ──╯ │ │ ╰────── id_list ──────╯ pointer: ╭────────────>────────────╮ ╭──────>──────╮ │ │ │ │ │├── "*" ──╯── type_qualifier_list ──╰──╯── pointer ──╰──┤│ type_qualifier_list: ╭────────────>────────────╮ │ │ │├──╯── type_qualifier_list ──╰── type_qualifier ──┤│ param_type_list: ╭────────>─────────╮ │ │ │├── param_list ──╯── "," ── "..." ──╰──┤│ param_list: │├──╭── param_decl ──╮──┤│ │ │ ╰───── "," ──────╯ param_decl: ╭────────────>────────────╮ │ │ │├── decl_specs ──┼────── declarator ───────┼──┤│ │ │ ╰── abstract_declarator ──╯ id_list: │├──╭── id ───╮──┤│ │ │ ╰── "," ──╯ initializer: │├──╮───────────── assignment_exp ──────────────╭──┤│ │ │ ╰───── "{" ── initializer_list ── "}" ──────╯ │ │ ╰── "{" ── initializer_list ── "," ── "}" ──╯ initializer_list: │├──╭── initializer ──╮──┤│ │ │ ╰────── "," ──────╯ type_name: ╭────────────>────────────╮ │ │ │├── spec_qualifier_list ──╯── abstract_declarator ──╰──┤│ abstract_declarator: │├──╮───────────────── pointer ─────────────────╭──┤│ │ │ ╰── pointer ── direct_abstract_declarator ──╯ │ │ ╰─────── direct_abstract_declarator ────────╯ direct_abstract_declarator: │├──╮──────────────────────── "(" ── abstract_declarator ── ")" ────────────────────────╭──┤│ │ │ │ ╭───────────────>────────────────╮ │ │ │ │ │ ╰──╯── direct_abstract_declarator ──╰──╮──────── "[" ── const_exp ── "]" ────────╭──╯ │ │ ╰────────────── "[" ── "]" ───────────────╯ │ │ │ ╭──────────>──────────╮ │ │ │ │ │ ╰── "(" ──╯── param_type_list ──╰── ")" ──╯ typedef_name: │├── id ──┤│ stat: │├──╮─── labeled_stat ───╭──┤│ │ │ ╰───── exp_stat ─────╯ │ │ ╰── compound_stat ───╯ │ │ ╰── selection_stat ──╯ │ │ ╰── iteration_stat ──╯ │ │ ╰──── jump_stat ─────╯ labeled_stat: │├──╮───── id ──────╭── ":" ── stat ──┤│ │ │ ╰─── "case" ────╯ │ │ ╰── "default" ──╯ exp_stat: ╭────>────╮ │ │ │├──╯── exp ──╰── ";" ──┤│ compound_stat: ╭───────>───────╮ ╭───────>───────╮ │ │ │ │ │├── "{" ──╯── decl_list ──╰──╯── stat_list ──╰── "}" ──┤│ stat_list: │├──╭── stat ──╮──┤│ │ │ ╰────<─────╯ selection_stat: ╭─────────>──────────╮ │ │ │├──╮── "if" ── "(" ── exp ── ")" ── stat ──╯── "else" ── stat ──╰──╭──┤│ │ │ ╰──────────── "switch" ── "(" ── exp ── ")" ── stat ────────────╯ iteration_stat: │├──╮──────────────────────── "while" ── "(" ── exp ── ")" ── stat ────────────────────────╭──┤│ │ │ ╰──────────────── "do" ── stat ── "while" ── "(" ── exp ── ")" ── ";" ─────────────────╯ │ │ │ ╭────>────╮ ╭────>────╮ ╭────>────╮ │ │ │ │ │ │ │ │ │ ╰── "for" ── "(" ──╯── exp ──╰── ";" ──╯── exp ──╰── ";" ──╯── exp ──╰── ")" ── stat ──╯ jump_stat: │├──╮────── "goto" ── id ── ";" ───────╭──┤│ │ │ ╰─────── "continue" ── ";" ────────╯ │ │ ╰───────── "break" ── ";" ─────────╯ │ │ │ ╭────>────╮ │ │ │ │ │ ╰── "return" ──╯── exp ──╰── ";" ──╯ exp: ╭───────>────────╮ │ │ │├──╯── exp ── "," ──╰── assignment_exp ──┤│ assignment_exp: │├──╮─────────────────── conditional_exp ────────────────────╭──┤│ │ │ ╰── unary_exp ── assignment_operator ── assignment_exp ──╯ assignment_operator: │├──╮─── "=" ───╭──┤│ │ │ ╰── "*=" ───╯ │ │ ╰── "/=" ───╯ │ │ ╰── "%=" ───╯ │ │ ╰── "+=" ───╯ │ │ ╰── "-=" ───╯ │ │ ╰── "<<=" ──╯ │ │ ╰── ">>=" ──╯ │ │ ╰── "&=" ───╯ │ │ ╰── "^=" ───╯ │ │ ╰── "|=" ───╯ conditional_exp: ╭────────────────────>─────────────────────╮ │ │ │├── logical_or_exp ──╯── "?" ── exp ── ":" ── conditional_exp ──╰──┤│ const_exp: │├── conditional_exp ──┤│ logical_or_exp: │├──╮────────────────── logical_and_exp ──────────────────╭──┤│ │ │ │ ╭──────────────>──────────────╮ │ │ │ │ │ ╰── logical_or_exp ──╯── "||" ── logical_and_exp ──╰──╯ logical_and_exp: ╭──────────────>──────────────╮ │ │ │├──╯── logical_and_exp ── "&&" ──╰── inclusive_or_exp ──┤│ inclusive_or_exp: ╭──────────────>──────────────╮ │ │ │├──╯── inclusive_or_exp ── "|" ──╰── exclusive_or_exp ──┤│ exclusive_or_exp: ╭──────────────>──────────────╮ │ │ │├──╯── exclusive_or_exp ── "^" ──╰── and_exp ──┤│ and_exp: ╭─────────>──────────╮ │ │ │├──╯── and_exp ── "&" ──╰── equality_exp ──┤│ equality_exp: ╭───────────────>────────────────╮ │ │ │├──╯── equality_exp ──╮── "==" ──╭──╰── relational_exp ──┤│ │ │ ╰── "!=" ──╯ relational_exp: ╭────────────────>─────────────────╮ │ │ │├──╯── relational_exp ──╮── "<" ───╭──╰── shift_expression ──┤│ │ │ ╰── ">" ───╯ │ │ ╰── "<=" ──╯ │ │ ╰── ">=" ──╯ shift_expression: ╭─────────────────>──────────────────╮ │ │ │├──╯── shift_expression ──╮── "<<" ──╭──╰── additive_exp ──┤│ │ │ ╰── ">>" ──╯ additive_exp: ╭───────────────>───────────────╮ │ │ │├──╯── additive_exp ──╮── "+" ──╭──╰── mult_exp ──┤│ │ │ ╰── "-" ──╯ mult_exp: ╭─────────────>─────────────╮ │ │ │├──╯── mult_exp ──╮── "%" ──╭──╰── cast_exp ──┤│ │ │ ╰── "*" ──╯ │ │ ╰── "/" ──╯ cast_exp: │├──╮─────────────── unary_exp ───────────────╭──┤│ │ │ ╰── "(" ── type_name ── ")" ── cast_exp ──╯ unary_exp: │├──╮───────────────── postfix_exp ─────────────────╭──┤│ │ │ ╰───────────╮── "++" ──╭── unary_exp ───────────╯ │ │ │ │ │ ╰── "--" ──╯ │ │ │ ╰───────── unary_operator ── cast_exp ──────────╯ │ │ ╰── "sizeof" ──╮───────── unary_exp ─────────╭──╯ │ │ ╰── "(" ── type_name ── ")" ──╯ unary_operator: │├──╮── "!" ──╭──┤│ │ │ ╰── "&" ──╯ │ │ ╰── "*" ──╯ │ │ ╰── "+" ──╯ │ │ ╰── "-" ──╯ │ │ ╰── "~" ──╯ postfix_exp: │├──╮────────────────────── primary_exp ───────────────────────╭──┤│ │ │ ╰──────────── postfix_exp ── "[" ── exp ── "]" ────────────╯ │ │ │ ╭───────────>───────────╮ │ │ │ │ │ ╰── postfix_exp ── "(" ──╯── argument_exp_list ──╰── ")" ──╯ │ │ ╰──────────── postfix_exp ──╮── "." ───╭── id ─────────────╯ │ │ │ │ │ ╰── "->" ──╯ │ │ │ ╰─────────────── postfix_exp ──╮── "++" ──╭────────────────╯ │ │ ╰── "--" ──╯ primary_exp: │├──╮───────── id ──────────╭──┤│ │ │ ╰──────── const ────────╯ │ │ ╰─────── string ────────╯ │ │ ╰── "(" ── exp ── ")" ──╯ argument_exp_list: ╭──────────────>───────────────╮ │ │ │├──╯── argument_exp_list ── "," ──╰── assignment_exp ──┤│ const: │├──╮────── int_const ──────╭──┤│ │ │ ╰───── char_const ──────╯ │ │ ╰───── float_const ─────╯ │ │ ╰── enumeration_const ──╯