Table 1: A (somewhat simplified) grammar for C++ object and function declarations

simple-declaration =
    decl-specifier-seq concrete-declarator-list .

concrete-declarator-list =
    concrete-declarator { "," concrete-declarator } .

concrete-declarator =
    declarator.

declarator =
    direct-declarator |
    ptr-operator declarator .

direct-declarator =
    [ declarator-id | "(" declarator ")" ]
        { array-suffix | function-suffix } .

declarator-id =
    identifier .

array-suffix =
    "[" [ constant-expression ] "]" .

constant-expression =
    constant-name | integer-literal .

constant-name =
    name .

function-suffix =
    "(" [ parameter-list ] ")" cv-qualifier-seq .

parameter-list =
    parameter-declaration { "," parameter-declaration } .

parameter-declaration =
    decl-specifier-seq declarator .

ptr-operator =
    "&" | [ class-name "::" ] "*" cv-qualifier-seq .

class-name =
    name .

cv-qualifier-seq =
    { cv-qualifier } .

decl-specifier-seq =
    decl-specifier { decl-specifier } .

decl-specifier =
    type-specifier .

type-specifier =
    cv-qualifier | simple-type-specifier .

simple-type-specifier =
    type-keyword | type-name .

type-name =
    name .