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 .