Table 1: A simplified grammar for the syntax of C++ object and function declarations


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

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

decl-specifier =
    type-specifier .

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

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

type-name
    = name .

declarator-list =
    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 =
    name | integer-literal .

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

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

class-name =
    name .

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