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 .