ctypes | ::= | COMMA_LIST(ctype) |
ctype | ::= | [const_vol] generic_ctype * * |
| | [const_vol] void * + | |
| | (ctype (| ctype) *) | |
const_vol | ::= | const |
| | volatile | |
generic_ctype | ::= | ctype_qualif |
| | [ctype_qualif] char | |
| | [ctype_qualif] short | |
| | [ctype_qualif] int | |
| | [ctype_qualif] long | |
| | [ctype_qualif] long long | |
| | double | |
| | float | |
| | [struct| union] id [{ struct_decl_list * }] | |
ctype_qualif | ::= | unsigned |
| | signed | |
struct_decl_list | ::= | struct_decl_list_start |
struct_decl_list_start | ::= | struct_decl |
| | struct_decl struct_decl_list_start | |
| | ... [when != struct_decl]† [continue_struct_decl_list] | |
continue_struct_decl_list | ::= | struct_decl struct_decl_list_start |
| | struct_decl | |
struct_decl | ::= | ctype d_ident; |
| | fn_ctype (* d_ident) (PARAMSEQ(name_opt_decl, ε));) | |
| | [const_vol] id d_ident; | |
d_ident | ::= | id [[expr]] * |
fn_ctype | ::= | generic_ctype * * |
| | void * * | |
name_opt_decl | ::= | decl |
| | ctype | |
| | fn_ctype |
† The optional when construct ends at the end of the line.