translation-unit: │├──╭──────────────────────────╮──┤│ │ │ ╰── external-declaration ──╯ external-declaration: │├──╮── function-definition ──╭──┤│ │ │ ╰────── declaration ──────╯ function-definition: ╭──────────>───────────╮ │ │ │├── declaration-specifiers ── declarator ──╯── declaration-list ──╰── compound-statement ──┤│ declaration: ╭────────────>─────────────╮ │ │ │├──╮── declaration-specifiers ──╯── init-declarator-list ──╰── ";" ──╭──┤│ │ │ ╰─────────────────── static-assert-declaration ───────────────────╯ │ │ ╰────────────────────────────── ";" ──────────────────────────────╯ declaration-specifiers: │├──╭── declaration-specifier ──╮──┤│ │ │ ╰─────────────<─────────────╯ declaration-specifier: │├──╮── storage-class-specifier ──╭──┤│ │ │ ╰────── type-specifier ───────╯ │ │ ╰────── type-qualifier ───────╯ │ │ ╰──── function-specifier ─────╯ │ │ ╰──── alignment-specifier ────╯ declarator: ╭──────>──────╮ │ │ │├──╯── pointer ──╰── direct-declarator ──┤│ declaration-list: │├──╭── declaration ──╮──┤│ │ │ ╰────────<────────╯ compound-statement: │├── "{" ──╭──────────────────────────────╮── "}" ──┤│ │ │ ╰── declaration-or-statement ──╯ declaration-or-statement: │├──╮── declaration ──╭──┤│ │ │ ╰─── statement ───╯ init-declarator-list: │├──╭── init-declarator ──╮──┤│ │ │ ╰──────── "," ────────╯ init-declarator: ╭───────────>────────────╮ │ │ │├── declarator ──╯── "=" ── initializer ──╰──┤│ static-assert-declaration: │├── "_Static_assert" ── "(" ── constant-expression ── "," ── string-literal ── ")" ── ";" ──┤│ storage-class-specifier: │├──╮───── "typedef" ─────╭──┤│ │ │ ╰───── "extern" ──────╯ │ │ ╰───── "static" ──────╯ │ │ ╰── "_Thread_local" ──╯ │ │ ╰────── "auto" ───────╯ │ │ ╰──── "register" ─────╯ type-specifier: │├──╮─────────── "void" ────────────╭──┤│ │ │ ╰─────────── "char" ────────────╯ │ │ ╰─────────── "short" ───────────╯ │ │ ╰──────────── "int" ────────────╯ │ │ ╰─────────── "long" ────────────╯ │ │ ╰─────────── "float" ───────────╯ │ │ ╰────────── "double" ───────────╯ │ │ ╰────────── "signed" ───────────╯ │ │ ╰───────── "unsigned" ──────────╯ │ │ ╰─────────── "_Bool" ───────────╯ │ │ ╰───────── "_Complex" ──────────╯ │ │ ╰──────── "_Imaginary" ─────────╯ │ │ ╰──── atomic-type-specifier ────╯ │ │ ╰── struct-or-union-specifier ──╯ │ │ ╰─────── enum-specifier ────────╯ │ │ ╰──────── typedef-name ─────────╯ typedef-name: │├── identifier ──┤│ type-qualifier: │├──╮─── "const" ────╭──┤│ │ │ ╰── "restrict" ──╯ │ │ ╰── "volatile" ──╯ │ │ ╰── "_Atomic" ───╯ function-specifier: │├──╮─── "inline" ────╭──┤│ │ │ ╰── "_Noreturn" ──╯ alignment-specifier: │├──╮─────── "_Alignas" ── "(" ── type-name ── ")" ───────╭──┤│ │ │ ╰── "_Alignas" ── "(" ── constant-expression ── ")" ──╯ pointer: ╭────────────>────────────╮ ╭──────>──────╮ │ │ │ │ │├── "*" ──╯── type-qualifier-list ──╰──╯── pointer ──╰──┤│ direct-declarator: │├──╮───────────────────────────────────────────── identifier ──────────────────────────────────────────────╭──┤│ │ │ ╰────────────────────────────────────── "(" ── declarator ── ")" ───────────────────────────────────────╯ │ │ │ ╭────>────╮ │ │ │ │ │ ╰──────────────────────────── direct-declarator ── "[" ──╯── "*" ──╰── "]" ─────────────────────────────╯ │ │ │ ╭────────────>────────────╮ │ │ │ │ │ ╰── direct-declarator ── "[" ── "static" ──╯── type-qualifier-list ──╰── assignment-expression ── "]" ──╯ │ │ │ ╭────>────╮ │ │ │ │ │ ╰───────────────── direct-declarator ── "[" ── type-qualifier-list ──╯── "*" ──╰── "]" ─────────────────╯ │ │ │ ╭──────>───────╮ │ │ │ │ │ ╰── direct-declarator ── "[" ── type-qualifier-list ──╯── "static" ──╰── assignment-expression ── "]" ──╯ │ │ ╰────────────────────── direct-declarator ── "[" ── assignment-expression ── "]" ───────────────────────╯ │ │ ╰─────────────────────── direct-declarator ── "(" ── parameter-type-list ── ")" ────────────────────────╯ │ │ ╰───────────────────────── direct-declarator ── "(" ── identifier-list ── ")" ──────────────────────────╯ │ │ ╰─────────────────────────────────── direct-declarator ── "(" ── ")" ───────────────────────────────────╯ identifier-list: │├──╭── identifier ──╮──┤│ │ │ ╰───── "," ──────╯ initializer-list: │├──╭── designative-initializer ──╮──┤│ │ │ ╰──────────── "," ────────────╯ designative-initializer: ╭────────>────────╮ │ │ │├──╯── designation ──╰── initializer ──┤│ initializer: ╭────>────╮ │ │ │├──╮── "{" ── initializer-list ──╯── "," ──╰── "}" ──╭──┤│ │ │ ╰───────────── assignment-expression ─────────────╯ constant-expression: │├── conditional-expression ──┤│ atomic-type-specifier: │├── "_Atomic" ── "(" ── type-name ── ")" ──┤│ struct-or-union-specifier: │├──╮──────────── struct-or-union ── "{" ── struct-declaration-list ── "}" ────────────╭──┤│ │ │ │ ╭─────────────────────>─────────────────────╮ │ │ │ │ │ ╰── struct-or-union ── identifier ──╯── "{" ── struct-declaration-list ── "}" ──╰──╯ struct-or-union: │├──╮── "struct" ──╭──┤│ │ │ ╰── "union" ───╯ struct-declaration-list: │├──╭── struct-declaration ──╮──┤│ │ │ ╰───────────<────────────╯ struct-declaration: │├──╮─────────────── specifier-qualifier-list ── ";" ───────────────╭──┤│ │ │ ╰── specifier-qualifier-list ── struct-declarator-list ── ";" ──╯ │ │ ╰────────────────── static-assert-declaration ──────────────────╯ enum-specifier: ╭────>────╮ │ │ │├──╮──────────── "enum" ── "{" ── enumerator-list ──╯── "," ──╰── "}" ────────────╭──┤│ │ │ │ ╭───────────────────────>────────────────────────╮ │ │ │ │ │ │ │ ╭────>────╮ │ │ │ │ │ │ │ │ ╰── "enum" ── identifier ──╯── "{" ── enumerator-list ──╯── "," ──╰── "}" ──╰──╯ enumerator-list: │├──╭── enumerator ──╮──┤│ │ │ ╰───── "," ──────╯ enumerator: ╭───────────────>────────────────╮ │ │ │├── enumeration-constant ──╯── "=" ── constant-expression ──╰──┤│ enumeration-constant: │├── identifier ──┤│ type-name: ╭────────────>────────────╮ │ │ │├── specifier-qualifier-list ──╯── abstract-declarator ──╰──┤│ specifier-qualifier-list: │├──╭── specifier-qualifier ──╮──┤│ │ │ ╰────────────<────────────╯ specifier-qualifier: │├──╮── type-specifier ──╭──┤│ │ │ ╰── type-qualifier ──╯ abstract-declarator: ╭───────────────>────────────────╮ │ │ │├──╮── pointer ──╯── direct-abstract-declarator ──╰──╭──┤│ │ │ ╰────────── direct-abstract-declarator ───────────╯ direct-abstract-declarator: │├──╮───────────────────────────────────────── "(" ── abstract-declarator ── ")" ──────────────────────────────────────────╭──┤│ │ │ ╰───────────────────────────────────────── "(" ── parameter-type-list ── ")" ──────────────────────────────────────────╯ │ │ ╰───────────────────────────────────────────────────── "(" ── ")" ─────────────────────────────────────────────────────╯ │ │ │ ╭────>────╮ │ │ │ │ │ ╰────────────────────────────────────────────── "[" ──╯── "*" ──╰── "]" ───────────────────────────────────────────────╯ │ │ │ ╭────────────>────────────╮ │ │ │ │ │ ╰──────────────────── "[" ── "static" ──╯── type-qualifier-list ──╰── assignment-expression ── "]" ────────────────────╯ │ │ │ ╭──────────────────────>──────────────────────╮ │ │ │ │ │ │ │ ╭──────>───────╮ │ │ │ │ │ │ │ │ ╰───────────────── "[" ── type-qualifier-list ──╯──╯── "static" ──╰── assignment-expression ──╰── "]" ─────────────────╯ │ │ ╰──────────────────────────────────────── "[" ── assignment-expression ── "]" ─────────────────────────────────────────╯ │ │ │ ╭────>────╮ │ │ │ │ │ ╰─────────────────────────────── direct-abstract-declarator ── "[" ──╯── "*" ──╰── "]" ────────────────────────────────╯ │ │ │ ╭────────────>────────────╮ │ │ │ │ │ ╰───── direct-abstract-declarator ── "[" ── "static" ──╯── type-qualifier-list ──╰── assignment-expression ── "]" ─────╯ │ │ │ ╭──────────────────────>──────────────────────╮ │ │ │ │ │ │ │ ╭──────>───────╮ │ │ │ │ │ │ │ │ ╰── direct-abstract-declarator ── "[" ── type-qualifier-list ──╯──╯── "static" ──╰── assignment-expression ──╰── "]" ──╯ │ │ ╰───────────────────────── direct-abstract-declarator ── "[" ── assignment-expression ── "]" ──────────────────────────╯ │ │ ╰────────────────────────── direct-abstract-declarator ── "(" ── parameter-type-list ── ")" ───────────────────────────╯ │ │ ╰────────────────────────────────────── direct-abstract-declarator ── "(" ── ")" ──────────────────────────────────────╯ struct-declarator-list: │├──╭── struct-declarator ──╮──┤│ │ │ ╰───────── "," ─────────╯ type-qualifier-list: │├──╭── type-qualifier ──╮──┤│ │ │ ╰─────────<──────────╯ parameter-type-list: ╭────────>─────────╮ │ │ │├── parameter-list ──╯── "," ── "..." ──╰──┤│ struct-declarator: │├──╮──────────── ":" ── constant-expression ────────────╭──┤│ │ │ │ ╭───────────────>────────────────╮ │ │ │ │ │ ╰── declarator ──╯── ":" ── constant-expression ──╰──╯ assignment-operator: │├──╮─── "=" ───╭──┤│ │ │ ╰── "*=" ───╯ │ │ ╰── "/=" ───╯ │ │ ╰── "%=" ───╯ │ │ ╰── "+=" ───╯ │ │ ╰── "-=" ───╯ │ │ ╰── "<<=" ──╯ │ │ ╰── ">>=" ──╯ │ │ ╰── "&=" ───╯ │ │ ╰── "^=" ───╯ │ │ ╰── "|=" ───╯ parameter-list: │├──╭── parameter-declaration ──╮──┤│ │ │ ╰─────────── "," ───────────╯ parameter-declaration: ╭────────────>────────────╮ │ │ │├── declaration-specifiers ──┼────── declarator ───────┼──┤│ │ │ ╰── abstract-declarator ──╯ expression: │├──╭── assignment-expression ──╮──┤│ │ │ ╰─────────── "," ───────────╯ assignment-expression: │├──╮─────────────────────── conditional-expression ───────────────────────╭──┤│ │ │ ╰── unary-expression ── assignment-operator ── assignment-expression ──╯ conditional-expression: ╭───────────────────────────>────────────────────────────╮ │ │ │├── logical-or-expression ──╯── "?" ── expression ── ":" ── conditional-expression ──╰──┤│ logical-or-expression: │├──╭── logical-and-expression ──╮──┤│ │ │ ╰─────────── "||" ───────────╯ logical-and-expression: │├──╭── inclusive-or-expression ──╮──┤│ │ │ ╰─────────── "&&" ────────────╯ inclusive-or-expression: │├──╭── exclusive-or-expression ──╮──┤│ │ │ ╰──────────── "|" ────────────╯ exclusive-or-expression: │├──╭── and-expression ──╮──┤│ │ │ ╰─────── "^" ────────╯ and-expression: │├──╭── equality-expression ──╮──┤│ │ │ ╰────────── "&" ──────────╯ equality-expression: │├──╭── relational-expression ──╮──┤│ │ │ ╰───────╮── "==" ──╭────────╯ │ │ ╰── "!=" ──╯ relational-expression: │├──╭── shift-expression ──╮──┤│ │ │ ╰─────╮── "<" ───╭─────╯ │ │ ╰── ">" ───╯ │ │ ╰── "<=" ──╯ │ │ ╰── ">=" ──╯ shift-expression: │├──╭── additive-expression ──╮──┤│ │ │ ╰──────╮── "<<" ──╭───────╯ │ │ ╰── ">>" ──╯ additive-expression: │├──╭── multiplicative-expression ──╮──┤│ │ │ ╰──────────╮── "+" ──╭──────────╯ │ │ ╰── "-" ──╯ multiplicative-expression: │├──╭── cast-expression ──╮──┤│ │ │ ╰─────╮── "%" ──╭─────╯ │ │ ╰── "*" ──╯ │ │ ╰── "/" ──╯ cast-expression: │├──╮─────────────── unary-expression ───────────────╭──┤│ │ │ ╰── "(" ── type-name ── ")" ── cast-expression ──╯ unary-expression: │├──╮─────────── postfix-expression ────────────╭──┤│ │ │ ╰─────╮── "++" ──╭── unary-expression ──────╯ │ │ │ │ │ ╰── "--" ──╯ │ │ │ ╰──── unary-operator ── cast-expression ────╯ │ │ ╰────── "sizeof" ── unary-expression ───────╯ │ │ ╰─── "sizeof" ── "(" ── type-name ── ")" ───╯ │ │ ╰── "_Alignof" ── "(" ── type-name ── ")" ──╯ postfix-expression: │├──╮──────────────────────────── primary-expression ────────────────────────────╭──┤│ │ │ ╰────────────── postfix-expression ── "[" ── expression ── "]" ──────────────╯ │ │ │ ╭──────────────>───────────────╮ │ │ │ │ │ ╰──── postfix-expression ── "(" ──╯── argument-expression-list ──╰── ")" ────╯ │ │ ╰────────────── postfix-expression ──╮── "." ───╭── identifier ──────────────╯ │ │ │ │ │ ╰── "->" ──╯ │ │ │ ╰───────────────────── postfix-expression ──╮── "++" ──╭─────────────────────╯ │ │ │ │ │ ╰── "--" ──╯ │ │ │ │ ╭────>────╮ │ │ │ │ │ ╰── "(" ── type-name ── ")" ── "{" ── initializer-list ──╯── "," ──╰── "}" ──╯ unary-operator: │├──╮── "!" ──╭──┤│ │ │ ╰── "&" ──╯ │ │ ╰── "*" ──╯ │ │ ╰── "+" ──╯ │ │ ╰── "-" ──╯ │ │ ╰── "~" ──╯ primary-expression: │├──╮───────── identifier ─────────╭──┤│ │ │ ╰────────── constant ──────────╯ │ │ ╰─────────── string ───────────╯ │ │ ╰── "(" ── expression ── ")" ──╯ │ │ ╰───── generic-selection ──────╯ argument-expression-list: │├──╭── assignment-expression ──╮──┤│ │ │ ╰─────────── "," ───────────╯ constant: │├──╮──── integer-constant ────╭──┤│ │ │ ╰─── character-constant ───╯ │ │ ╰─── floating-constant ────╯ │ │ ╰── enumeration-constant ──╯ string: │├──╮── string-literal ──╭──┤│ │ │ ╰──── "__func__" ────╯ generic-selection: │├── "_Generic" ── "(" ── assignment-expression ── "," ── generic-assoc-list ── ")" ──┤│ generic-assoc-list: │├──╭── generic-association ──╮──┤│ │ │ ╰────────── "," ──────────╯ generic-association: │├──╮── type-name ── ":" ── assignment-expression ──╭──┤│ │ │ ╰── "default" ── ":" ── assignment-expression ──╯ designation: │├── designator-list ── "=" ──┤│ designator-list: │├──╭── designator ──╮──┤│ │ │ ╰───────<────────╯ designator: │├──╮── "[" ── constant-expression ── "]" ──╭──┤│ │ │ ╰────────── "." ── identifier ──────────╯ statement: │├──╮─── labeled-statement ────╭──┤│ │ │ ╰─── compound-statement ───╯ │ │ ╰── expression-statement ──╯ │ │ ╰── selection-statement ───╯ │ │ ╰── iteration-statement ───╯ │ │ ╰───── jump-statement ─────╯ labeled-statement: │├──╮─────────── identifier ── ":" ── statement ────────────╭──┤│ │ │ ╰── "case" ── constant-expression ── ":" ── statement ──╯ │ │ ╰──────────── "default" ── ":" ── statement ────────────╯ expression-statement: ╭───────>────────╮ │ │ │├──╯── expression ──╰── ";" ──┤│ selection-statement: │├──╮── "if" ── "(" ── expression ── ")" ── statement ── "else" ── statement ──╭──┤│ │ │ ╰───────────── "if" ── "(" ── expression ── ")" ── statement ──────────────╯ │ │ ╰─────────── "switch" ── "(" ── expression ── ")" ── statement ────────────╯ iteration-statement: │├──╮─────────────────────────────── "while" ── "(" ── expression ── ")" ── statement ───────────────────────────────╭──┤│ │ │ ╰─────────────────────── "do" ── statement ── "while" ── "(" ── expression ── ")" ── ";" ────────────────────────╯ │ │ │ ╭───────>────────╮ ╭───────>────────╮ ╭───────>────────╮ │ │ │ │ │ │ │ │ │ ╰── "for" ── "(" ──╯── expression ──╰── ";" ──╯── expression ──╰── ";" ──╯── expression ──╰── ")" ── statement ──╯ │ │ │ ╭───────>────────╮ ╭───────>────────╮ │ │ │ │ │ │ │ ╰──────── "for" ── "(" ── declaration ──╯── expression ──╰── ";" ──╯── expression ──╰── ")" ── statement ────────╯ jump-statement: │├──╮────── "goto" ── identifier ── ";" ──────╭──┤│ │ │ ╰─────────── "continue" ── ";" ───────────╯ │ │ ╰──────────── "break" ── ";" ─────────────╯ │ │ │ ╭───────>────────╮ │ │ │ │ │ ╰── "return" ──╯── expression ──╰── ";" ──╯